2023-03-09 04:13:33 +00:00
|
|
|
package com.massive
|
|
|
|
|
|
|
|
import android.app.AlarmManager
|
|
|
|
import android.app.PendingIntent
|
2023-03-27 01:29:12 +00:00
|
|
|
import android.content.*
|
|
|
|
import android.net.Uri
|
2023-03-09 04:13:33 +00:00
|
|
|
import android.os.Build
|
2023-11-13 02:15:18 +00:00
|
|
|
import android.util.Log
|
2023-03-09 04:13:33 +00:00
|
|
|
import androidx.annotation.RequiresApi
|
2023-03-27 01:29:12 +00:00
|
|
|
import androidx.documentfile.provider.DocumentFile
|
2023-11-20 21:23:11 +00:00
|
|
|
import com.facebook.react.bridge.Promise
|
2023-03-09 04:13:33 +00:00
|
|
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
|
|
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
|
|
import com.facebook.react.bridge.ReactMethod
|
2023-03-27 01:29:12 +00:00
|
|
|
import java.io.*
|
2023-03-09 04:13:33 +00:00
|
|
|
import java.util.*
|
|
|
|
|
|
|
|
class BackupModule constructor(context: ReactApplicationContext?) :
|
|
|
|
ReactContextBaseJavaModule(context) {
|
|
|
|
val context: ReactApplicationContext = reactApplicationContext
|
|
|
|
|
|
|
|
private val copyReceiver = object : BroadcastReceiver() {
|
|
|
|
@RequiresApi(Build.VERSION_CODES.O)
|
|
|
|
override fun onReceive(context: Context?, intent: Intent?) {
|
2023-11-13 02:15:18 +00:00
|
|
|
val targetDir = intent?.getStringExtra("targetDir");
|
|
|
|
Log.d("BackupModule", "onReceive $targetDir")
|
2023-03-27 01:29:12 +00:00
|
|
|
val treeUri: Uri = Uri.parse(targetDir)
|
|
|
|
val documentFile = context?.let { DocumentFile.fromTreeUri(it, treeUri) }
|
|
|
|
val file = documentFile?.createFile("application/octet-stream", "massive.db")
|
|
|
|
val output = context?.contentResolver?.openOutputStream(file!!.uri)
|
2023-03-09 04:13:33 +00:00
|
|
|
val sourceFile = File(context?.getDatabasePath("massive.db")!!.path)
|
2023-03-27 01:29:12 +00:00
|
|
|
val input = FileInputStream(sourceFile)
|
|
|
|
if (output != null) {
|
2023-03-24 04:43:28 +00:00
|
|
|
input.copyTo(output)
|
|
|
|
}
|
2023-03-27 01:29:12 +00:00
|
|
|
output?.flush()
|
|
|
|
output?.close()
|
2023-03-09 04:13:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@RequiresApi(Build.VERSION_CODES.M)
|
|
|
|
@ReactMethod
|
2023-03-27 01:29:12 +00:00
|
|
|
fun start(baseUri: String) {
|
2023-11-13 02:15:18 +00:00
|
|
|
Log.d("BackupModule", "start $baseUri")
|
2023-03-09 04:13:33 +00:00
|
|
|
val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
|
|
|
val intent = Intent(COPY_BROADCAST)
|
2023-11-13 02:15:18 +00:00
|
|
|
intent.putExtra("targetDir", baseUri)
|
2023-03-09 04:13:33 +00:00
|
|
|
val pendingIntent =
|
2023-11-13 02:15:18 +00:00
|
|
|
PendingIntent.getBroadcast(context, baseUri.hashCode(), intent, PendingIntent.FLAG_IMMUTABLE)
|
2023-03-09 04:13:33 +00:00
|
|
|
pendingIntent.send()
|
|
|
|
|
|
|
|
val calendar = Calendar.getInstance().apply {
|
|
|
|
timeInMillis = System.currentTimeMillis()
|
|
|
|
set(Calendar.HOUR_OF_DAY, 6)
|
|
|
|
set(Calendar.MINUTE, 0)
|
|
|
|
set(Calendar.SECOND, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
alarmMgr.setRepeating(
|
|
|
|
AlarmManager.RTC_WAKEUP,
|
|
|
|
calendar.timeInMillis,
|
|
|
|
AlarmManager.INTERVAL_DAY,
|
|
|
|
pendingIntent
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
@RequiresApi(Build.VERSION_CODES.M)
|
2023-11-13 02:15:18 +00:00
|
|
|
@ReactMethod(isBlockingSynchronousMethod = true)
|
2023-03-09 04:13:33 +00:00
|
|
|
fun stop() {
|
|
|
|
val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
|
|
|
val intent = Intent(COPY_BROADCAST)
|
|
|
|
val pendingIntent =
|
|
|
|
PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
|
|
|
|
alarmMgr.cancel(pendingIntent)
|
|
|
|
}
|
|
|
|
|
2023-11-20 21:23:11 +00:00
|
|
|
@ReactMethod()
|
|
|
|
fun exportToCSV(promise: Promise) {
|
|
|
|
try {
|
|
|
|
val db = DatabaseHelper(reactApplicationContext)
|
|
|
|
db.exportToCSV()
|
|
|
|
promise.resolve("Export successful!")
|
|
|
|
}
|
|
|
|
catch (e: Exception) {
|
|
|
|
promise.reject("ERROR", e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-09 04:13:33 +00:00
|
|
|
init {
|
|
|
|
reactApplicationContext.registerReceiver(copyReceiver, IntentFilter(COPY_BROADCAST))
|
|
|
|
}
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
const val COPY_BROADCAST = "copy-event"
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getName(): String {
|
|
|
|
return "BackupModule"
|
|
|
|
}
|
|
|
|
}
|