diff --git a/docs/session-logs/2026-09-21_db-backup.md b/docs/session-logs/2026-09-21_db-backup.md index 1388061..6fc11b2 100644 --- a/docs/session-logs/2026-09-21_db-backup.md +++ b/docs/session-logs/2026-09-21_db-backup.md @@ -39,4 +39,16 @@ - Схема-совместимость: миграции в db.js идемпотентны (ALTER ... IF NOT EXISTS), старый бэкап подтянется вверх, новый в старое приложение - лишние колонки безвредны. -## На роутере всё ещё 0.1.464 (build 464). Новый бэкап-билд (465) на роутер не выкатывал. +## Проверка на теле + фиксы +- Экспорт сперва падал: `vacuum: unable to open database: /data/user/...`. Причина - я взял + корень как `app_data_dir().parent().parent()` (на Android app_data_dir САМ = корень -> ../.. + уводит в непишемый `/data/user`). ЭТО УЖЕ ЧИНИЛИ функцией `native_root()`. Исправил на + `native_root()` (как save-команды/rebuild_roads), убрал data_dir-дубли. Записано в память + `reference_android_native_root`. Подтверждено на теле: корень `/data/user/0/dev.baldav.app` + писабелен, там baldav.db + точки + командные файлы -> native_root резолвится туда. +- Экспорт + импорт (восстановление) пользователь проверил на теле - работают. +- Авто-рестарт после импорта не срабатывал: `startActivity()+exit(0)` - гонка (процесс умирает + до подъёма активити). Исправлено: relaunch через AlarmManager+PendingIntent ПОСЛЕ смерти + процесса (ProcessPhoenix-паттерн) + finishAffinity. + +## На роутере всё ещё 0.1.464 (build 464). Бэкап-билды на роутер не выкатывал. diff --git a/src-tauri/gen/android/app/src/main/java/dev/baldav/app/MainActivity.kt b/src-tauri/gen/android/app/src/main/java/dev/baldav/app/MainActivity.kt index e08170a..93b0633 100644 --- a/src-tauri/gen/android/app/src/main/java/dev/baldav/app/MainActivity.kt +++ b/src-tauri/gen/android/app/src/main/java/dev/baldav/app/MainActivity.kt @@ -557,10 +557,22 @@ class MainActivity : TauriActivity() { } cmd == "restartapp" -> { // Relaunch the process so the staged DB (pending_restore.db) is swapped in onCreate. + // startActivity()+exit() races (the new activity doesn't come up before the process + // dies — measured: app just closed, no restart). Schedule the relaunch via AlarmManager + // so it fires AFTER this process is gone (the ProcessPhoenix approach). Log.d("BalDav", "Restarting app (DB restore)") - val intent = packageManager.getLaunchIntentForPackage(packageName) - intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) - startActivity(intent) + try { + val intent = packageManager.getLaunchIntentForPackage(packageName) + if (intent != null) { + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) + val piFlags = android.app.PendingIntent.FLAG_CANCEL_CURRENT or + (if (Build.VERSION.SDK_INT >= 23) android.app.PendingIntent.FLAG_IMMUTABLE else 0) + val pi = android.app.PendingIntent.getActivity(this, 0, intent, piFlags) + val am = getSystemService(ALARM_SERVICE) as android.app.AlarmManager + am.set(android.app.AlarmManager.RTC, System.currentTimeMillis() + 300, pi) + } + } catch (e: Exception) { Log.e("BalDav", "restart schedule failed", e) } + finishAffinity() Runtime.getRuntime().exit(0) } }