diff --git a/SettingsPage.tsx b/SettingsPage.tsx index 58e9b43..fd19f72 100644 --- a/SettingsPage.tsx +++ b/SettingsPage.tsx @@ -86,6 +86,13 @@ export default function SettingsPage() { .execute(); }, []); + const backupString = useMemo(() => { + if (!settings.backupDir) return null; + console.log(settings.backupDir); + const split = decodeURIComponent(settings.backupDir).split(":"); + return split.pop(); + }, [settings.backupDir]); + const soundString = useMemo(() => { if (!settings.sound) return null; const split = settings.sound.split("/"); @@ -108,15 +115,8 @@ export default function SettingsPage() { await AppDataSource.initialize(); await setRepo.createQueryBuilder().update().set({ image: null }).execute(); await update("sound", null); - const { alarm, backup } = await settingsRepo.findOne({ where: {} }); - console.log({ backup }); - const directory = await DocumentPicker.pickDirectory(); - if (backup) NativeModules.BackupModule.start(directory.uri); - else NativeModules.BackupModule.stop(); - NativeModules.SettingsModule.ignoringBattery((isIgnoring: boolean) => { - if (alarm && !isIgnoring) NativeModules.SettingsModule.ignoreBattery(); - reset({ index: 0, routes: [{ name: "Settings" }] }); - }); + await update("backup", false); + reset({ index: 0, routes: [{ name: "Settings" }] }); }, [reset, update]); const today = new Date(); @@ -363,6 +363,9 @@ export default function SettingsPage() { await update("backup", value); if (value) { const result = await DocumentPicker.pickDirectory(); + setValue("backupDir", result.uri); + await update("backupDir", result.uri); + console.log(`${SettingsPage.name}.backup:`, { result }); toast("Backup database daily."); NativeModules.BackupModule.start(result.uri); } else { @@ -374,6 +377,25 @@ export default function SettingsPage() { /> ), }, + { + name: `Backup directory: ${backupString || "Downloads"}`, + renderItem: (name: string) => ( + + ), + }, { name: `Alarm sound: ${soundString || "Default"}`, renderItem: (name: string) => ( diff --git a/android/app/build.gradle b/android/app/build.gradle index 04211ea..3d54745 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -85,8 +85,8 @@ android { applicationId "com.massive" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 36206 - versionName "1.180" + versionCode 36207 + versionName "1.181" } signingConfigs { release { diff --git a/android/app/src/main/java/com/massive/BackupModule.kt b/android/app/src/main/java/com/massive/BackupModule.kt index 458d187..9d87d26 100644 --- a/android/app/src/main/java/com/massive/BackupModule.kt +++ b/android/app/src/main/java/com/massive/BackupModule.kt @@ -5,6 +5,7 @@ import android.app.PendingIntent import android.content.* import android.net.Uri import android.os.Build +import android.util.Log import androidx.annotation.RequiresApi import androidx.documentfile.provider.DocumentFile import com.facebook.react.bridge.ReactApplicationContext @@ -16,11 +17,12 @@ import java.util.* class BackupModule constructor(context: ReactApplicationContext?) : ReactContextBaseJavaModule(context) { val context: ReactApplicationContext = reactApplicationContext - private var targetDir: String? = null private val copyReceiver = object : BroadcastReceiver() { @RequiresApi(Build.VERSION_CODES.O) override fun onReceive(context: Context?, intent: Intent?) { + val targetDir = intent?.getStringExtra("targetDir"); + Log.d("BackupModule", "onReceive $targetDir") val treeUri: Uri = Uri.parse(targetDir) val documentFile = context?.let { DocumentFile.fromTreeUri(it, treeUri) } val file = documentFile?.createFile("application/octet-stream", "massive.db") @@ -38,11 +40,12 @@ class BackupModule constructor(context: ReactApplicationContext?) : @RequiresApi(Build.VERSION_CODES.M) @ReactMethod fun start(baseUri: String) { - targetDir = baseUri + Log.d("BackupModule", "start $baseUri") val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager val intent = Intent(COPY_BROADCAST) + intent.putExtra("targetDir", baseUri) val pendingIntent = - PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) + PendingIntent.getBroadcast(context, baseUri.hashCode(), intent, PendingIntent.FLAG_IMMUTABLE) pendingIntent.send() val calendar = Calendar.getInstance().apply { @@ -61,7 +64,7 @@ class BackupModule constructor(context: ReactApplicationContext?) : } @RequiresApi(Build.VERSION_CODES.M) - @ReactMethod + @ReactMethod(isBlockingSynchronousMethod = true) fun stop() { val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager val intent = Intent(COPY_BROADCAST) diff --git a/data-source.ts b/data-source.ts index 68ad7bb..dd2f24f 100644 --- a/data-source.ts +++ b/data-source.ts @@ -34,6 +34,7 @@ import { Plan } from "./plan"; import Settings from "./settings"; import Weight from "./weight"; import { settingsStartup1699783784680 } from "./migrations/1699783784680-settings-startup"; +import { settingsBackupDir1699839054226 } from "./migrations/1699839054226-settings-backup-dir"; export const AppDataSource = new DataSource({ type: "react-native", @@ -74,5 +75,6 @@ export const AppDataSource = new DataSource({ exercisesFix1699613077628, settingsDuration1699743753975, settingsStartup1699783784680, + settingsBackupDir1699839054226, ], }); diff --git a/migrations/1699839054226-settings-backup-dir.ts b/migrations/1699839054226-settings-backup-dir.ts new file mode 100644 index 0000000..a861678 --- /dev/null +++ b/migrations/1699839054226-settings-backup-dir.ts @@ -0,0 +1,9 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class settingsBackupDir1699839054226 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query("ALTER TABLE settings ADD COLUMN backupDir TEXT"); + } + + public async down(queryRunner: QueryRunner): Promise {} +} diff --git a/package.json b/package.json index 8d89f31..0fb9d5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "massive", - "version": "1.180", + "version": "1.181", "private": true, "license": "GPL-3.0-only", "scripts": { diff --git a/settings.ts b/settings.ts index c80aeae..e5cc7f6 100644 --- a/settings.ts +++ b/settings.ts @@ -47,6 +47,9 @@ export default class Settings { @Column("boolean") backup: boolean; + @Column("text") + backupDir: string; + @Column("int") duration: number;