Skip to content

feat: власна папка для збереження записів через SAF - #32

Open
elphamale wants to merge 1 commit into
LyoSU:mainfrom
elphamale:feat/recording-folder-picker
Open

feat: власна папка для збереження записів через SAF#32
elphamale wants to merge 1 commit into
LyoSU:mainfrom
elphamale:feat/recording-folder-picker

Conversation

@elphamale

Copy link
Copy Markdown
Contributor

Вирішує #12.

Проблема

Рядок «Папка записів» у Settings був суто інформаційним — записи завжди зберігалися у приватній папці Android/data/…, яку більшість сторонніх застосунків (файлові менеджери, бекап/синхронізація) не можуть прочитати.

Рішення

  • Рядок тепер клікабельний і відкриває стандартний Android-пікер (ACTION_OPEN_DOCUMENT_TREE), щоб користувач міг обрати будь-яку папку.
  • RecordingStorage створює нові записи в обраній SAF-папці, а якщо вона стає недоступною (відкликано дозвіл, вилучено SD-картку) — безпечно повертається до приватної папки, щоб запис не загубився.
  • Нова FolderMigrationJob пропонує перенести вже наявні записи в нову папку, по одному файлу за раз, з ізоляцією помилок — один пошкоджений/недоступний файл не зупиняє весь процес.
  • AacEncoder/WavEncoder тепер пишуть через ParcelFileDescriptor (WavEncoder — через FileChannel замість RandomAccessFile, бо в останнього немає конструктора з довільного дескриптора) — той самий код encoder-шару обслуговує і легасі-, і SAF-шлях.
  • Новий хелпер RecordingPaths централізує розрізнення легасі-шлях vs SAF content:// URI для ~9 місць читання/видалення: відтворення, waveform, шеринг, транскрипція, автоочищення, bulk-видалення, стартова звірка з диском при запуску.
  • Додано «скинути до типової папки» — вибір оборотний.

Область змін

Усе — лише в :app. Привілейований Shizuku UserService ніколи не торкається файлової системи напряму (лише передає сирі PCM-семпли через pipe назад у процес застосунку), тож змін в AIDL чи :userservice не знадобилося — userServiceVersion не змінювався.

The "Recording Folder" row in Settings was purely informational — recordings
were always locked to the app-private Android/data/... directory, which most
third-party apps (file managers, backup/sync tools) can't read.

The row is now clickable and opens the standard ACTION_OPEN_DOCUMENT_TREE
folder picker. RecordingStorage creates new recordings under the picked SAF
tree (falling back to the legacy directory if it becomes inaccessible), and
a new FolderMigrationJob offers to move existing recordings into it.

AacEncoder/WavEncoder now write through a ParcelFileDescriptor (WavEncoder
via FileChannel instead of RandomAccessFile, which has no FD constructor) so
the same encoder code serves both legacy and SAF output. A new RecordingPaths
helper centralises the legacy-path-vs-SAF-URI branch for every read/delete
site: playback, waveform, sharing, transcription, cleanup, bulk-delete, and
startup reconciliation.

Confirmed the privileged Shizuku UserService never touches the filesystem
(it only pumps PCM over a pipe), so this needed no AIDL or :userservice
changes.

Addresses LyoSU#12.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant