x1ongzhu il y a 1 an
Parent
commit
3bc580bd0a

+ 1 - 1
app/build.gradle

@@ -24,7 +24,7 @@ android {
         applicationId "com.example.modifier"
         minSdk 26
         targetSdk 34
-        versionCode 119
+        versionCode 120
         versionName "1.0.1"
         archivesBaseName = "modifier-${versionCode}"
 

+ 11 - 4
app/src/main/AndroidManifest.xml

@@ -36,11 +36,19 @@
         android:theme="@style/AppTheme"
         android:usesCleartextTraffic="true"
         tools:targetApi="31">
-        <activity
-            android:name=".ui.login.LoginActivity"
+        <receiver
+            android:name=".MyReceiver"
+            android:enabled="true"
             android:exported="true">
 
-        </activity>
+            <intent-filter>
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
+            </intent-filter>
+        </receiver>
+
+        <activity
+            android:name=".ui.login.LoginActivity"
+            android:exported="true" />
 
         <activity
             android:name=".MainActivity"
@@ -72,7 +80,6 @@
         <meta-data
             android:name="com.google.mlkit.vision.DEPENDENCIES"
             android:value="barcode_ui" />
-
     </application>
 
 </manifest>

+ 19 - 24
app/src/main/java/com/example/modifier/Global.kt

@@ -633,8 +633,6 @@ object Global {
                 Files.newOutputStream(File(dest, "config.json").toPath())
             )
         }
-        val dataDir = File(dest, "data")
-        dataDir.mkdirs()
 
         val packages = mutableListOf(
             "com.google.android.apps.messaging",
@@ -642,7 +640,7 @@ object Global {
             "com.google.android.gsf",
         )
         packages.forEach {
-            File(dataDir, it).mkdirs()
+            File(dest, it).mkdirs()
         }
 
         val cmds = mutableListOf<String>()
@@ -650,13 +648,13 @@ object Global {
 
         for (pkg in packages) {
             if (!shellRun("ls /data/data/$pkg")["error"]!!.contains("No such file or directory")) {
-                cmds.add("cp -r /data/data/$pkg $dataDir/$pkg/data")
+                cmds.add("tar zcf $dest/$pkg/data.tar.gz -C /data/data $pkg ")
             }
             if (!shellRun("ls /data/user_de/0/$pkg")["error"]!!.contains("No such file or directory")) {
-                cmds.add("cp -r /data/user_de/0/$pkg $dataDir/$pkg/user_de")
+                cmds.add("tar zcf $dest/$pkg/data_de.tar.gz -C /data/user_de/0 $pkg ")
             }
             if (!shellRun("ls /sdcard/Android/data/$pkg")["error"]!!.contains("No such file or directory")) {
-                cmds.add("cp -r /sdcard/Android/data/$pkg $dataDir/$pkg/external")
+                cmds.add("tar zcf $dest/$pkg/data_ext.tar.gz -C /sdcard/Android/data $pkg ")
             }
         }
 
@@ -666,7 +664,7 @@ object Global {
         val backup = BackupItem(
             createdAt = Date().time,
             number = telephonyConfig.number,
-            code = if (telephonyConfig.areaCode == null) "" else telephonyConfig.areaCode,
+            code = telephonyConfig.areaCode,
             country = telephonyConfig.country,
             mcc = telephonyConfig.mcc,
             mnc = telephonyConfig.mnc,
@@ -691,6 +689,7 @@ object Global {
         return backup
     }
 
+    @SuppressLint("SdCardPath")
     @JvmStatic
     suspend fun restore(backup: BackupItem): Boolean {
         save(
@@ -717,28 +716,24 @@ object Global {
         val packageManager = Utils.getContext().packageManager
         for (pkg in packages) {
             val uid = packageManager.getApplicationInfo(pkg, 0).uid
-            if (File("${backup.path}/data/$pkg/data").exists()) {
-                cmds.add("rm -rf /data/data/$pkg/*")
-                cmds.add("cp -r ${backup.path}/data/$pkg/data/* /data/data/$pkg")
-                cmds.add("chown -R $uid:$uid /data/data/$pkg")
-            }
-            if (File("${backup.path}/data/$pkg/user_de").exists()) {
-                cmds.add("rm -rf /data/user_de/0/$pkg/*")
-                cmds.add("cp -r ${backup.path}/data/$pkg/user_de/* /data/user_de/0/$pkg")
-                cmds.add("chown -R $uid:$uid /data/user_de/0/$pkg")
-            }
-            if (File("${backup.path}/data/$pkg/external").exists()) {
-                if (File("${backup.path}/data/$pkg/external").listFiles()?.isNotEmpty() == true) {
-                    cmds.add("rm -rf /sdcard/Android/data/$pkg/*")
-                    cmds.add("cp -r ${backup.path}/data/$pkg/external/* /sdcard/Android/data/$pkg")
-                    cmds.add("chown -R $uid:$uid /sdcard/Android/data/$pkg")
+            for (item in listOf("data.tar.gz", "data_de.tar.gz", "data_ext.tar.gz")) {
+                val file = File("${backup.path}/$pkg/$item")
+                if (!file.exists()) {
+                    continue
+                }
+                val dest = when (item) {
+                    "data.tar.gz" -> "/data/data"
+                    "data_de.tar.gz" -> "/data/user_de/0"
+                    "data_ext.tar.gz" -> "/sdcard/Android/data"
+                    else -> ""
                 }
+                cmds.add("tar zxf ${file.path} -C $dest")
             }
         }
         cmds.addAll(packages.reversed().map { "pm unsuspend $it" })
-        cmds.addAll(listOf(CMD_MESSAGING_APP))
+        cmds.addAll(listOf("sleep 1", CMD_MESSAGING_APP))
         shellRun(*cmds.toTypedArray())
-//        delay(2000)
+        delay(5000)
 //        ModifierService.instance!!.toggleRcsSwitch(false)
 //        delay(1000)
 //        ModifierService.instance!!.toggleRcsSwitch(true)

+ 44 - 0
app/src/main/java/com/example/modifier/MyReceiver.kt

@@ -0,0 +1,44 @@
+package com.example.modifier
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.util.Log
+import android.widget.Toast
+import androidx.core.content.ContextCompat
+import com.example.modifier.data.AppDatabase
+import com.example.modifier.data.BackupItemDao
+import com.example.modifier.ui.shellRun
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import java.io.File
+
+class MyReceiver : BroadcastReceiver() {
+
+    private val TAG = "MyReceiver"
+
+    override fun onReceive(context: Context, intent: Intent) {
+        when (intent.action) {
+            "clear_backup" -> {
+                Toast.makeText(context, "Clearing backup", Toast.LENGTH_SHORT).show()
+                CoroutineScope(Dispatchers.IO).launch {
+                    clearBackup(context)
+                }
+            }
+        }
+    }
+
+    private suspend fun clearBackup(context: Context) {
+        val dao = AppDatabase.getDatabase(context).itemDao()
+        dao.getAll().forEach {
+            Log.i(TAG, "Deleting ${it.id}: ${it.path}")
+            File(it.path).deleteRecursively()
+            dao.delete(it)
+        }
+        ContextCompat.getExternalFilesDirs(context, "backup")[0].listFiles()?.forEach {
+            Log.i(TAG, "clearBackup: Deleting ${it.absolutePath}")
+            shellRun("rm -rf ${it.absolutePath}")
+        }
+    }
+}