iDevice Toolkit v2.0: Device, Mirror, Media Browser e melhorias gerais#92
iDevice Toolkit v2.0: Device, Mirror, Media Browser e melhorias gerais#92fredac100 wants to merge 61 commits intoMaxiHuHe04:mainfrom
Conversation
…idades - Redesign completo do CSS com tema dark profissional - Barra de status com total de arquivos, tamanho e status de criptografia - Substituição de todos os printStackTrace/System.out por SLF4J - Utilitário FileSize para formatação legível de tamanhos (KB/MB/GB) - Aba Apps funcional com listagem, navegação e exportação por app - Drag & drop para abrir backups arrastando pastas na sidebar - Atalhos de teclado (Ctrl+O, Ctrl+F, Ctrl+Q, F5) - Busca redesenhada com filtros rápidos (Photos, Videos, WhatsApp, etc), ComboBox de domínios com autocomplete e filtro por tipo de arquivo - About dialog com versão, licença e link do repositório - Preservação de timestamps na extração de arquivos - Formatação de datas com DateTimeFormatter localizado - Export com progresso detalhado e cancelamento - Preferences redesenhada com seções organizadas e novas opções - Janela principal ampliada para 1200x700 - Info tab reorganizada em seções (Device, Backup, Security)
- Expande tela de boas-vindas para toda a janela com fundo em gradiente - Remove elementos informativos desnecessários da tela inicial (badges de contagem, mensagens de ajuda, botão Reload) - Corrige problema onde controles das tabs não funcionavam após selecionar backup - Ajusta distribuição de espaço no SplitPane da aba Files - Implementa controle de mouseTransparent para evitar bloqueio de eventos - Corrige métodos tabShown() em FilesTabController, FileSearchTabController e AppsTabController para garantir inicialização correta das views
- Controles superiores da aba Files (Filter, Sort, Files only, botões) agora começam desabilitados - São habilitados apenas quando um domínio é selecionado e arquivos são carregados no segundo painel - Melhora UX deixando claro que esses controles afetam apenas os arquivos do segundo quadro - Adiciona método setFileControlsEnabled() para gerenciar estado dos controles - Adiciona fx:id aos botões Expand all, Collapse all e Reset
- Corrige leak de PreparedStatement/ResultSet com try-with-resources - Corrige byte overflow na conversão de UID para índice - Propaga exceções SQL em vez de engoli-las silenciosamente - Adiciona deleteOnExit e sobrescrita com zeros para arquivo temporário - Troca senha de String para char[] com limpeza após uso - Documenta IV zero como requisito do formato Apple - Otimiza queries de fotos/vídeos com COLLATE NOCASE - Move I/O de banco para background threads (UI responsiva) - Troca dd-plist do JitPack para Maven Central - Substitui SimpleDateFormat por DateTimeFormatter (thread-safe) - Adiciona 36 testes unitários (JUnit 5)
- Remove allowIndeterminate(true) dos diretórios para que o clique alterne diretamente entre marcado/desmarcado - Reutiliza CheckBox e ImageView por célula com unbindBidirectional antes de rebind, eliminando bindings fantasma na reciclagem - Adiciona debounce na contagem de arquivos selecionados via Platform.runLater para evitar N recálculos durante propagação
…otos e vídeos - Adiciona MediaTabController com grid de thumbnails, preview, paginação e filtros (All/Photos/Videos) - Adiciona ThumbnailService com cache, pool de 4 threads e placeholders para HEIC/vídeos - Corrige travamento no botão Abrir (Desktop.open movido para thread daemon) - Corrige race condition na captura de selectedFile antes de Tasks assíncronas - Adiciona preferências: tema, auto-select backup, limites de busca, confirmação de delete - Adiciona Select All em domínios e arquivos, preservação de timestamps na extração - Adiciona estilos media-tile/preview com variantes light theme
- Proteção contra path traversal na extração de arquivos - Null safety em campos opcionais do BackupManifest e BackupInfo - Acesso sincronizado à conexão do banco de dados - Validação de bounds no acesso a objetos do BackupFile - Melhorias no tratamento de erros do KeyBag e BackupFilePaddingFixer
- Reorganiza toolbar: filtros à esquerda, paginação no painel da grid - Preview de imagem responsivo, expandindo com o tamanho da janela - Suporte a thumbnails de HEIC/HEIF via ImageMagick - Suporte a thumbnails de vídeo (MOV/MP4) via ffmpeg - Dialog About com tema dark/light e informações atualizadas - Dependências ffmpeg, imagemagick e libheif1 no pacote Linux
Detecta automaticamente iPhone conectado via USB usando libimobiledevice, exibindo informações do dispositivo, bateria, armazenamento e apps instalados. Inclui ações de screenshot, reiniciar, desligar, suspender e desinstalar apps, com filtros por tipo (usuário/sistema) e busca por nome/bundleId.
Usa AmountDataAvailable em vez de TotalDataAvailable para refletir o espaço realmente livre (sem contar caches purgáveis). Corrige ProgressBar iniciando em modo indeterminado definindo progress=0 no FXML.
- Implementa MirrorTabController e MirrorService para captura de tela em tempo real via pymobiledevice3 - Suporta iOS 17+ com túnel automático via tunneld (protocolo TCP) - Usa DVT instruments (DvtSecureSocketProxyService) como fallback para iOS 26+ onde o serviço screenshotr não existe - API do tunneld atualizada para pymobiledevice3 7.x (GET / em vez de /list-tunnels, /hello para health check, /start-tunnel para criação explícita de túnel) - Fluxo totalmente automático: detecta dispositivo, inicia tunneld via pkexec se necessário, solicita túnel e inicia stream - Timeout de 30s no estado CONNECTING com monitoramento do processo Python via onExit() para evitar loading infinito - ImageView vinculado ao container com preserveRatio para dimensionamento correto da tela espelhada - Estilos para dark/light theme na toolbar e badges de estado - Dependências Python adicionadas ao package-linux.sh
- Integra uxplay como servidor AirPlay para espelhamento sem fio - Usa pipeline GStreamer com tee para bifurcar vídeo: jpegenc→fdsink para frames JPEG e fakesink para satisfazer o uxplay - Implementa parsing SOI/EOI para extração de frames JPEG do pipe - Refatora MirrorService com AtomicReference para coalescing de frames - Otimiza wire protocol: 4-byte length + 4-byte width/height + JPEG - Adiciona workers paralelos de captura USB com drain-to-latest - Desabilita timeout de conexão para modo AirPlay - Atualiza README com documentação completa do projeto
… mirror
- Corrige travamento ao abrir arquivo via menu de contexto na aba Files,
executando xdg-open/open em thread separada ao invés de bloquear a
JavaFX Application Thread com Desktop.getDesktop().open()
- Remove botão Reset sem função da aba Files
- Estabiliza espelhamento via AirPlay (uxplay):
- Adiciona retry com 5 tentativas e timeout via select.select()
- Corrige processos uxplay órfãos com cleanup via SIGTERM/SIGKILL,
signal handler e atexit no Python
- Adiciona limpeza prévia ao iniciar stream para evitar falha na
primeira tentativa
- Corrige fechamento prematuro do pipe stdout pelo try-with-resources
- Desabilita botão AirPlay durante streaming ativo para evitar
desconexão acidental
|
Hey @fredac100! I noticed few things (tested on Windows):
These are all things I would further look into at some point. Depending on your vision for the project and free time, I would either cherry-pick code-quality improvements and integrate the new features one at a time, focusing especially on the Media tab for now (and giving you credit of course). Or, if you also agree with my bullet points above and are willing to further invest the time to address some of the more important ones, we could also merge the whole PR then. |
|
Hey @MaxiHuHe04! Thank you so much for the detailed and thoughtful feedback — I really appreciate it. I developed and tested everything on Linux (Ubuntu 24.04), so I haven't had a chance to test on Windows yet. I'll set up a VM to reproduce and fix the issues you found. Regarding your points:
I'll work through these adjustments and update the PR — should have everything done by tomorrow. I might struggle a bit with the Windows side of things, but I'll do my best. Thanks again for the warm welcome. I genuinely love this project and that's what motivated me to contribute in the first place. Looking forward to collaborating! |
…logs em inglês - Corrige NPE no FileSearchTabController que impedia a busca de funcionar (setItems(null) substituído por observableArrayList vazio) - Implementa busca full-text que procura em todas as colunas (fileID, domain, relativePath) - Adiciona hint contextual explicando que resultados podem casar com path/domain - Remove scrollbar horizontal inicial ajustando proporções das colunas (97%) - Adiciona separadores visíveis nos cabeçalhos da tabela para facilitar redimensionamento - Padroniza mensagens de log de português para inglês em toda a codebase - Atualiza README reposicionando como iTunes Backup Explorer
… backup locked na aba Apps Todos os textos em português do preferences.fxml foram traduzidos para inglês, mantendo o projeto padronizado em um único idioma. Também adiciona verificação de backup locked no AppsTabController.tabShown() para evitar erro de conexão com o banco quando o backup ainda não foi desbloqueado.
…ge Size no rodapé e remove menu Edit - Novo botão "Create Backup..." na tela inicial e no menu File - Janela de progresso com log em tempo real, velocidade de transferência, ETA e bytes acumulados - Consulta DeviceInfo antes do backup para estimar tamanho total e calcular ETA global - Throttle de 500ms nos updates da UI para evitar travamento da FX thread - Filtra linhas de progresso por arquivo do log (só eventos reais no TextArea) - Corrige queryFileStats() para calcular tamanho real do backup via Files.walk() - Adiciona destino do backup aos Backup Roots automaticamente após sucesso - Renomeia "Reload backup roots" para "Reload backups" no menu File - Remove menu Edit desativado (placeholder sem funcionalidade) - Adiciona método addBackupRoot() no PreferencesController - Adiciona enum BackupResult e método createBackup() no DeviceService
- Substitui sort in-place da sidebar por setAll() para evitar IllegalArgumentException de children duplicados no JavaFX - Normaliza paths na comparação de duplicatas em loadBackup() - addBackupRoot() agora verifica sobreposição de diretórios (pai/filho) além de igualdade exata
…eOpenBackup - openBackup() agora registra o diretório pai como backup root via addBackupRoot() - fileOpenBackup() delegado para openBackup(), eliminando duplicação de código - Backups abertos via Open Backup, drag & drop ou Create Backup persistem entre sessões
…s-platform Quando libimobiledevice não está disponível (Windows), o app usa pymobiledevice3 como alternativa para detectar dispositivo, obter info e criar backup. Se nenhuma ferramenta está instalada, o setup do venv Python é disparado automaticamente ao clicar em Create Backup. Centraliza lógica de venv e setup no DeviceService, com paths adaptados por SO (bin/ no Linux, Scripts/ no Windows). MirrorService refatorado para delegar ao DeviceService, eliminando duplicação.
No Windows, quando nem libimobiledevice nem Python estão disponíveis, o app baixa automaticamente o Python embeddable (~15MB) do python.org, extrai em ~/.config/itunes-backup-explorer/python-portable/, instala pip e pymobiledevice3 sem intervenção do usuário. O setup acontece na primeira vez que Create Backup é clicado, com barra de progresso. No Ubuntu o comportamento não muda (usa venv com Python do sistema).
O Python embeddable não inclui setuptools, causando falha ao compilar pacotes como hexdump durante a instalação do pymobiledevice3.
No Windows, orienta o usuário a instalar Apple Devices (Microsoft Store) ou iTunes para comunicação USB com o iPhone.
O pymobiledevice3 usa barras tqdm (ex: 15%|████|14.6/100 [03:24<19:46]) em vez do formato idevicebackup2. O parser agora reconhece ambos os formatos e atualiza percentual, velocidade e tempo restante na UI.
Log de marcos agora mostra formato humanizado: "10% completed — 5.7 GB transferred (05:23 elapsed)" em vez do confuso "[05:23] 10% - 5,7 GB / ~57,0 GB". Remove total repetitivo que não muda entre linhas. Corrige formatSize e formatSpeed para usar Locale.ROOT (ponto decimal).
…enta changelog MediaConverter: detecção em 3 níveis (bundled > portátil > PATH do sistema), download automático de ffmpeg (~85 MB) e ImageMagick (~50 MB) na primeira necessidade, com diálogo de confirmação e progresso. Reutiliza downloadFile e extractZip do DeviceService (tornados package-private). WindowController: oferece setup de media tools ao abrir backup no Windows quando ferramentas ausentes (uma vez por sessão). package-win.bat: copia binários portáteis para dentro do app-image antes de gerar o MSI, se disponíveis na máquina de build. Scripts run.bat/run.sh: detectam JAR automaticamente sem versão hardcoded, com mensagem de erro clara se compilação falhar. CHANGELOG.md: documentação completa das 38 melhorias do fork.
ffmpeg do BtbN já suporta HEIC nativamente, então o download automático agora baixa apenas ffmpeg (~85 MB). HEIC converte via ffmpeg primeiro, com fallback para ImageMagick se disponível no PATH do sistema. Aba Files: todos os controles em uma única linha (Filter, Sort, Expand, Collapse). Remove checkbox "Hide symlinks" e label de summary do domínio.
- MediaConverter: ImageMagick portátil com resolução dinâmica de versão via GitHub /releases/latest redirect, hierarquia bundled > portable > PATH - HEIC tenta ImageMagick primeiro (confiável), ffmpeg como fallback - DeviceService.downloadFile: redirect manual para cross-host HTTPS - run.bat: setlocal, auto-compile integrado, tratamento de erros - package-win.bat: inclui ImageMagick portátil no MSI - WindowController: diálogos atualizados para ambas ferramentas
ImageMagick não distribui mais builds portáteis em .zip, apenas .7z. Adiciona commons-compress para extração de 7z e corrige a URL. Aplica stylesheet e tema dark/light nos alertas e diálogo de senha.
A aba Device dependia exclusivamente do libimobiledevice para detecção, listagem de apps e desinstalação. Agora usa pymobiledevice3 como fallback quando libimobiledevice não está disponível.
- Corrige elevação de privilégio para tunnel no Windows (PowerShell Start-Process em vez de pkexec, sem --daemonize) - Corrige kill de processos uxplay no Windows (taskkill em vez de pkill) - Adapta mirror_stream.py para Windows: TCP socket em vez de pipe fd, import condicional de select, detecção de uxplay em diretórios comuns - Corrige try_auto_mount para encontrar pymobiledevice3.exe no Windows - Desativa botão AirPlay temporariamente por incompatibilidade com Smart App Control do Windows 11 (bloqueio do instalador uxplay-windows)
- Translated entire CHANGELOG.md from Portuguese to natural English - Added documentation for recent changes: - ImageMagick 7z download fix - Dialog theme consistency - Device tab pymobiledevice3 fallback - Mirror/screen mirroring Windows compatibility - Added note about AirPlay being temporarily disabled on Windows - Updated Mirror section to reflect current state (USB works, AirPlay Linux-only) - Updated optional dependencies table
- Adiciona monitoramento de diretório via Files.walk() como fallback para Linux onde idevicebackup2 não emite info de tamanho no output - Timer daemon a cada 3s calcula bytes reais no disco (só Linux) - Extrai percentual de linhas de progresso sem info de tamanho - Substitui média cumulativa por EMA (Exponential Moving Average) para velocidade de transferência em todos os paths (Linux e Windows) - Corrige transferred=0B, speed=--, ETA=calculating no Ubuntu
- Move optimize_frame para workers paralelos (processamento concorrente) - Reduz resolução (1280→960), qualidade JPEG (65→50), resampling NEAREST - Aumenta workers de 3 para 4, fila limitada a 8 frames - Atualiza README com estado atual do projeto - Atualiza CHANGELOG com otimizações de FPS e correções recentes
- Media tab: adiciona requestLayout() e listener no divider do SplitPane para recalcular colunas do FlowPane ao redimensionar a janela - mirror_stream.py: traduz todas as 40 strings PT-BR para inglês - Files tab: restaura checkbox "Hide symlinks and empty folders" com filtro funcional que exclui symlinks e diretórios vazios
- Substitui comandos Maven complexos por compile.bat/.sh e run.bat/.sh como método principal de compilação e execução - Mantém comandos Maven avançados em seção colapsável - Documenta correções recentes do PR review no CHANGELOG
|
Hey @MaxiHuHe04! I've gone through all your feedback points and addressed each one. Here's the full status: All items addressed
Note on AirPlayAirPlay wireless mirroring is temporarily disabled on Windows due to Smart App Control blocking the unsigned uxplay-windows binary. USB mirroring works perfectly on all platforms. I'm actively working on a solution for this — either a signed build or an alternative approach. How to build and run (Windows)
Optional dependencies (pymobiledevice3, ffmpeg, ImageMagick) are downloaded automatically on Windows when needed — no manual setup required. Let me know if anything else needs attention! |
- Remove seções duplicadas (Installation Quick start e Building from Source) - Adiciona accordion Advanced Maven commands junto ao quick start no topo
…backups iOS Implementação inicial da aba WhatsApp que permite explorar conversas do ChatStorage.sqlite (WhatsApp/WhatsApp Business) em backups do iPhone. Funcionalidades: - Listagem de conversas com busca e filtros (All/Private/Groups) - Exibição de mensagens com bolhas estilo chat (enviadas/recebidas) - Detecção dinâmica de schema via PRAGMA table_info para compatibilidade - Extração e exibição de thumbnails de fotos/vídeos do backup (.thumb) - Cache LRU de thumbnails extraídos em diretório temporário - Paginação de mensagens (100 por página) com load older - Export de conversas para TXT - Suporte a dark/light theme - Labels para tipos de mensagem (foto, vídeo, áudio, documento, etc.) Em progresso — funcional mas com limitações conhecidas: - Thumbnails dependem da existência de arquivos .thumb no backup - Apenas WhatsApp Business (SMB) com ChatStorage.sqlite é suportado
- Reconhece newsletters (@newsletter) como grupo no isGroup() - Unifica contagem de mensagens usando alias totalMessageCount na query SQL - Inclui grupos sem contactJid (sessionType=1) nos resultados - Carrega imagem original como fallback quando thumbnail não existe - Oculta badge de contagem quando chat tem zero mensagens
|
@MaxiHuHe04 @fredac100 I have updated dd-plist in the Maven Central Repository to v1.29, which should now properly include the required module-info. |
- Barra de progresso no Linux agora mostra progresso geral (não mais por arquivo) - Contagem de arquivos baseada em paths reais, não em mensagens de domínio - Adiciona elapsed time, milestone logging e velocidade/ETA unificados - Estimativa de tamanho do backup mais precisa, descontando binários de apps, caches e overhead de sistema via dados do com.apple.disk_usage
- Adiciona suporte a ZXMPPTHUMBPATH para busca de thumbnails - Implementa cascata de mídia: arquivo original → busca por UUID → thumbnails - Adiciona visualização em tela cheia com clique na imagem (popup/viewer) - Extrai arquivos WAL/SHM do SQLite para dados mais recentes - Amplia detecção de domínio WhatsApp e prioriza app regular sobre Business - Remove métodos não utilizados do DeviceTabController Authored: Frederico Castro <fred.ac.100@gmail.com>
- Altera cláusula WHERE para incluir todos os chats com JID (não apenas os que têm mensagens em ZWAMESSAGE), corrigindo importação parcial - Adiciona método logDatabaseStats() para diagnóstico de sessões/mensagens - Melhora fallback de contagem com verificação de ZMESSAGECOUNTER - Remove código diagnóstico temporário do controller Authored: Frederico Castro <fred.ac.100@gmail.com>
Authored: Frederico Castro <fred.ac.100@gmail.com>
- Corrige lógica WHERE na query de chats: filtro de mensagens agora usa AND (intersecção) em vez de OR, evitando sessões fantasma - Adiciona diálogo de encriptação de backup com validação de senha - Refatora fluxo de backup com retry, fallback entre ferramentas CLI e feedback de progresso detalhado (velocidade, ETA, log em tempo real) - Adiciona feedback de sucesso na exportação de chat - Adiciona botão de diagnóstico na aba WhatsApp - Padroniza idioma da UI (Diagnostico → Diagnostics) - Adiciona delay de 2s entre tentativas de retry no backup Authored: Frederico Castro <fred.ac.100@gmail.com>
|
Hi @MaxiHuHe04 , |
|
Sounds nice, thank you! I'm currently on holiday. I'll take a look at the changes and get back to you in a few days. |
|
And thank you very much @3breadt! So now we can switch to Maven Central again 😅 |
|
@fredac100 The changes look good!
|
Summary
This PR introduces major new features transforming iTunes Backup Explorer into a comprehensive iOS device management toolkit. It adds three new tabs (Device, Mirror, Media), a complete UI/UX overhaul with modern dark theme, security hardening, and extensive test coverage — across 52 files changed, 6,751 additions.
New Features
🔌 Device Tab — Live USB Communication
libimobiledevicefor USB communication📺 Mirror Tab — Real-Time Screen Mirroring
pymobiledevice3— low latency, direct connectionpymobiledevice3installation🖼️ Media Browser (replaces File Search)
📱 Apps Tab
UI/UX Improvements
Complete Visual Overhaul
Files Tab Enhancements
Information Tab Redesign
Preferences Expansion
About Dialog
Security & Quality
Security Fixes
Bug Fixes
Test Coverage
Documentation
Dependencies
Both are optional — the app works fully for backup browsing without them.
Compatibility
Screenshots
Backup Information
Backup Browser
Media Gallery
Apps
Device Info & Controls
Installed Apps
Screen Mirroring