feat: backup/restore flow (#81)

Co-authored-by: Justin Hernandez <transphorm@gmail.com>
This commit is contained in:
Nicolas Brugneaux
2025-02-13 17:40:52 +01:00
committed by GitHub
parent dedcf82b24
commit 6a36b55cb8
38 changed files with 1060 additions and 215 deletions

View File

@@ -3,8 +3,6 @@
xmlns:tools="http://schemas.android.com/tools"
>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
@@ -18,7 +16,6 @@
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher"
android:allowBackup="false"
tools:replace="android:allowBackup, android:icon, android:roundIcon, android:name"
android:theme="@style/AppTheme"
android:supportsRtl="true">
@@ -45,3 +42,11 @@
</activity>
</application>
</manifest>
<!--
TODO: add this back to <application />
android:allowBackup="true"
android:backupInForeground="true"
android:dataExtractionRules="@xml/backup_rules"
-->

View File

@@ -0,0 +1,25 @@
package com.proofofpassportapp
import android.app.backup.BackupManager
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
class BackupModule(reactContext: ReactApplicationContext): ReactContextBaseJavaModule(reactContext) {
override fun getName() = "BackupModule"
@ReactMethod
fun backupNow(promise: Promise) {
// https://developer.android.com/identity/data/keyvaluebackup#RequestingBackup
BackupManager.dataChanged(BuildConfig.APPLICATION_ID)
promise.resolve(null)
}
@ReactMethod
fun restoreNow(promise: Promise) {
// noop
// https://developer.android.com/identity/data/keyvaluebackup#RequestingRestore
promise.resolve(null)
}
}

View File

@@ -0,0 +1,19 @@
package com.proofofpassportapp
import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager
class BackupPackage : ReactPackage {
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
return emptyList()
}
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
return listOf(
BackupModule(reactContext)
)
}
}

View File

@@ -8,10 +8,6 @@ import com.facebook.react.ReactPackage
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.soloader.SoLoader
import com.proofofpassportapp.CameraActivityPackage
import io.tradle.nfc.RNPassportReaderPackage
import com.rnfs.RNFSPackage
import com.proofofpassportapp.QRCodeScannerPackage
class MainApplication : Application(), ReactApplication {
@@ -23,6 +19,7 @@ class MainApplication : Application(), ReactApplication {
// add(MyReactNativePackage())
add(CameraActivityPackage())
add(QRCodeScannerPackage())
add(BackupPackage())
}
override fun getJSMainModuleName(): String = "index"

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
<cloud-backup>
<include domain="file" path="."
requireFlags="clientSideEncryption" />
</cloud-backup>
<device-transfer>
</device-transfer>
</data-extraction-rules>