Fix automatic backups - 1.181 🚀
- The broadcast intent wasn't receiving the target directory - Add separate button for storing the backup location
This commit is contained in:
parent
d0c0a52ab4
commit
b6afbfcc17
|
@ -86,6 +86,13 @@ export default function SettingsPage() {
|
||||||
.execute();
|
.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(() => {
|
const soundString = useMemo(() => {
|
||||||
if (!settings.sound) return null;
|
if (!settings.sound) return null;
|
||||||
const split = settings.sound.split("/");
|
const split = settings.sound.split("/");
|
||||||
|
@ -108,15 +115,8 @@ export default function SettingsPage() {
|
||||||
await AppDataSource.initialize();
|
await AppDataSource.initialize();
|
||||||
await setRepo.createQueryBuilder().update().set({ image: null }).execute();
|
await setRepo.createQueryBuilder().update().set({ image: null }).execute();
|
||||||
await update("sound", null);
|
await update("sound", null);
|
||||||
const { alarm, backup } = await settingsRepo.findOne({ where: {} });
|
await update("backup", false);
|
||||||
console.log({ backup });
|
reset({ index: 0, routes: [{ name: "Settings" }] });
|
||||||
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" }] });
|
|
||||||
});
|
|
||||||
}, [reset, update]);
|
}, [reset, update]);
|
||||||
|
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
|
@ -363,6 +363,9 @@ export default function SettingsPage() {
|
||||||
await update("backup", value);
|
await update("backup", value);
|
||||||
if (value) {
|
if (value) {
|
||||||
const result = await DocumentPicker.pickDirectory();
|
const result = await DocumentPicker.pickDirectory();
|
||||||
|
setValue("backupDir", result.uri);
|
||||||
|
await update("backupDir", result.uri);
|
||||||
|
console.log(`${SettingsPage.name}.backup:`, { result });
|
||||||
toast("Backup database daily.");
|
toast("Backup database daily.");
|
||||||
NativeModules.BackupModule.start(result.uri);
|
NativeModules.BackupModule.start(result.uri);
|
||||||
} else {
|
} else {
|
||||||
|
@ -374,6 +377,25 @@ export default function SettingsPage() {
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: `Backup directory: ${backupString || "Downloads"}`,
|
||||||
|
renderItem: (name: string) => (
|
||||||
|
<Button
|
||||||
|
style={{ alignSelf: "flex-start" }}
|
||||||
|
onPress={async () => {
|
||||||
|
const result = await DocumentPicker.pickDirectory();
|
||||||
|
setValue("backupDir", result.uri);
|
||||||
|
await update("backupDir", result.uri);
|
||||||
|
toast("Changed backup directory.");
|
||||||
|
if (!settings.backup) return;
|
||||||
|
NativeModules.BackupModule.stop();
|
||||||
|
NativeModules.BackupModule.start(result.uri);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{name}
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: `Alarm sound: ${soundString || "Default"}`,
|
name: `Alarm sound: ${soundString || "Default"}`,
|
||||||
renderItem: (name: string) => (
|
renderItem: (name: string) => (
|
||||||
|
|
|
@ -85,8 +85,8 @@ android {
|
||||||
applicationId "com.massive"
|
applicationId "com.massive"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 36206
|
versionCode 36207
|
||||||
versionName "1.180"
|
versionName "1.181"
|
||||||
}
|
}
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
release {
|
release {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import android.app.PendingIntent
|
||||||
import android.content.*
|
import android.content.*
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.util.Log
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.documentfile.provider.DocumentFile
|
import androidx.documentfile.provider.DocumentFile
|
||||||
import com.facebook.react.bridge.ReactApplicationContext
|
import com.facebook.react.bridge.ReactApplicationContext
|
||||||
|
@ -16,11 +17,12 @@ import java.util.*
|
||||||
class BackupModule constructor(context: ReactApplicationContext?) :
|
class BackupModule constructor(context: ReactApplicationContext?) :
|
||||||
ReactContextBaseJavaModule(context) {
|
ReactContextBaseJavaModule(context) {
|
||||||
val context: ReactApplicationContext = reactApplicationContext
|
val context: ReactApplicationContext = reactApplicationContext
|
||||||
private var targetDir: String? = null
|
|
||||||
|
|
||||||
private val copyReceiver = object : BroadcastReceiver() {
|
private val copyReceiver = object : BroadcastReceiver() {
|
||||||
@RequiresApi(Build.VERSION_CODES.O)
|
@RequiresApi(Build.VERSION_CODES.O)
|
||||||
override fun onReceive(context: Context?, intent: Intent?) {
|
override fun onReceive(context: Context?, intent: Intent?) {
|
||||||
|
val targetDir = intent?.getStringExtra("targetDir");
|
||||||
|
Log.d("BackupModule", "onReceive $targetDir")
|
||||||
val treeUri: Uri = Uri.parse(targetDir)
|
val treeUri: Uri = Uri.parse(targetDir)
|
||||||
val documentFile = context?.let { DocumentFile.fromTreeUri(it, treeUri) }
|
val documentFile = context?.let { DocumentFile.fromTreeUri(it, treeUri) }
|
||||||
val file = documentFile?.createFile("application/octet-stream", "massive.db")
|
val file = documentFile?.createFile("application/octet-stream", "massive.db")
|
||||||
|
@ -38,11 +40,12 @@ class BackupModule constructor(context: ReactApplicationContext?) :
|
||||||
@RequiresApi(Build.VERSION_CODES.M)
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
@ReactMethod
|
@ReactMethod
|
||||||
fun start(baseUri: String) {
|
fun start(baseUri: String) {
|
||||||
targetDir = baseUri
|
Log.d("BackupModule", "start $baseUri")
|
||||||
val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
||||||
val intent = Intent(COPY_BROADCAST)
|
val intent = Intent(COPY_BROADCAST)
|
||||||
|
intent.putExtra("targetDir", baseUri)
|
||||||
val pendingIntent =
|
val pendingIntent =
|
||||||
PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
|
PendingIntent.getBroadcast(context, baseUri.hashCode(), intent, PendingIntent.FLAG_IMMUTABLE)
|
||||||
pendingIntent.send()
|
pendingIntent.send()
|
||||||
|
|
||||||
val calendar = Calendar.getInstance().apply {
|
val calendar = Calendar.getInstance().apply {
|
||||||
|
@ -61,7 +64,7 @@ class BackupModule constructor(context: ReactApplicationContext?) :
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(Build.VERSION_CODES.M)
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
@ReactMethod
|
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||||
fun stop() {
|
fun stop() {
|
||||||
val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
||||||
val intent = Intent(COPY_BROADCAST)
|
val intent = Intent(COPY_BROADCAST)
|
||||||
|
|
|
@ -34,6 +34,7 @@ import { Plan } from "./plan";
|
||||||
import Settings from "./settings";
|
import Settings from "./settings";
|
||||||
import Weight from "./weight";
|
import Weight from "./weight";
|
||||||
import { settingsStartup1699783784680 } from "./migrations/1699783784680-settings-startup";
|
import { settingsStartup1699783784680 } from "./migrations/1699783784680-settings-startup";
|
||||||
|
import { settingsBackupDir1699839054226 } from "./migrations/1699839054226-settings-backup-dir";
|
||||||
|
|
||||||
export const AppDataSource = new DataSource({
|
export const AppDataSource = new DataSource({
|
||||||
type: "react-native",
|
type: "react-native",
|
||||||
|
@ -74,5 +75,6 @@ export const AppDataSource = new DataSource({
|
||||||
exercisesFix1699613077628,
|
exercisesFix1699613077628,
|
||||||
settingsDuration1699743753975,
|
settingsDuration1699743753975,
|
||||||
settingsStartup1699783784680,
|
settingsStartup1699783784680,
|
||||||
|
settingsBackupDir1699839054226,
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
9
migrations/1699839054226-settings-backup-dir.ts
Normal file
9
migrations/1699839054226-settings-backup-dir.ts
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
|
||||||
|
export class settingsBackupDir1699839054226 implements MigrationInterface {
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query("ALTER TABLE settings ADD COLUMN backupDir TEXT");
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "massive",
|
"name": "massive",
|
||||||
"version": "1.180",
|
"version": "1.181",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "GPL-3.0-only",
|
"license": "GPL-3.0-only",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
|
@ -47,6 +47,9 @@ export default class Settings {
|
||||||
@Column("boolean")
|
@Column("boolean")
|
||||||
backup: boolean;
|
backup: boolean;
|
||||||
|
|
||||||
|
@Column("text")
|
||||||
|
backupDir: string;
|
||||||
|
|
||||||
@Column("int")
|
@Column("int")
|
||||||
duration: number;
|
duration: number;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user