Handle EACCESS in BackupModule

This commit is contained in:
Brandon Presley 2023-03-24 17:43:28 +13:00
parent 5dd569ef72
commit d2a1c432bb
2 changed files with 42 additions and 10 deletions

View File

@ -20,6 +20,7 @@
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:requestLegacyExternalStorage="true"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<activity <activity
android:name=".TimerDone" android:name=".TimerDone"
@ -44,6 +45,7 @@
android:name=".StopAlarm" android:name=".StopAlarm"
android:exported="true" android:exported="true"
android:process=":remote" /> android:process=":remote" />
<service <service
android:name=".AlarmService" android:name=".AlarmService"
android:exported="false" /> android:exported="false" />

View File

@ -1,23 +1,27 @@
package com.massive package com.massive
import android.Manifest
import android.app.AlarmManager import android.app.AlarmManager
import android.app.PendingIntent import android.app.PendingIntent
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import android.os.Environment import android.os.Environment
import android.util.Log
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReactMethod
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.IOException
import java.util.* 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
@ -25,25 +29,51 @@ class BackupModule constructor(context: ReactApplicationContext?) :
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?) {
Log.d("BackupModule", "Backing up database...")
val sourceFile = File(context?.getDatabasePath("massive.db")!!.path) val sourceFile = File(context?.getDatabasePath("massive.db")!!.path)
val targetDir = val targetDir =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
val targetFile = File(targetDir, "massive.db") var targetFile = File(targetDir, "massive.db")
var count = 0
val input = FileInputStream(sourceFile) try {
val output = FileOutputStream(targetFile) val input = FileInputStream(sourceFile)
val output = FileOutputStream(targetFile)
input.copyTo(output) input.copyTo(output)
input.close() input.close()
output.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) @RequiresApi(Build.VERSION_CODES.M)
@ReactMethod @ReactMethod
fun start() { fun start() {
val permission: Int =
ActivityCompat.checkSelfPermission(
reactApplicationContext,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
currentActivity!!,
arrayOf<String>(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
),
1
)
}
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)
val pendingIntent = val pendingIntent =