diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 846c176..0932233 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -20,6 +20,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" + android:requestLegacyExternalStorage="true" android:theme="@style/AppTheme"> + diff --git a/android/app/src/main/java/com/massive/BackupModule.kt b/android/app/src/main/java/com/massive/BackupModule.kt index 12b3b3c..1b84241 100644 --- a/android/app/src/main/java/com/massive/BackupModule.kt +++ b/android/app/src/main/java/com/massive/BackupModule.kt @@ -1,23 +1,27 @@ package com.massive +import android.Manifest import android.app.AlarmManager import android.app.PendingIntent import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.content.pm.PackageManager import android.os.Build import android.os.Environment -import android.util.Log import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import java.io.File import java.io.FileInputStream import java.io.FileOutputStream +import java.io.IOException import java.util.* + class BackupModule constructor(context: ReactApplicationContext?) : ReactContextBaseJavaModule(context) { val context: ReactApplicationContext = reactApplicationContext @@ -25,25 +29,51 @@ class BackupModule constructor(context: ReactApplicationContext?) : private val copyReceiver = object : BroadcastReceiver() { @RequiresApi(Build.VERSION_CODES.O) override fun onReceive(context: Context?, intent: Intent?) { - Log.d("BackupModule", "Backing up database...") val sourceFile = File(context?.getDatabasePath("massive.db")!!.path) - val targetDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) - val targetFile = File(targetDir, "massive.db") + var targetFile = File(targetDir, "massive.db") + var count = 0 - val input = FileInputStream(sourceFile) - val output = FileOutputStream(targetFile) - - input.copyTo(output) - input.close() - output.close() + try { + val input = FileInputStream(sourceFile) + val output = FileOutputStream(targetFile) + input.copyTo(output) + input.close() + output.close() + } catch (e: IOException) { + while (targetFile.exists()) { + count++ + targetFile = File(targetDir, "massive (${count}).db") + } + val input = FileInputStream(sourceFile) + val output = FileOutputStream(targetFile) + input.copyTo(output) + input.close() + output.close() + } } } @RequiresApi(Build.VERSION_CODES.M) @ReactMethod fun start() { + val permission: Int = + ActivityCompat.checkSelfPermission( + reactApplicationContext, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + if (permission != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions( + currentActivity!!, + arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ), + 1 + ) + } + val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager val intent = Intent(COPY_BROADCAST) val pendingIntent =