Skip to content

Commit 8d88524

Browse files
committed
app backup
1 parent 0ee2026 commit 8d88524

File tree

30 files changed

+574
-350
lines changed

30 files changed

+574
-350
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ dependencies {
6464
implementation 'gdut.bsx:share2:0.9.3'
6565
kapt 'com.google.dagger:dagger-compiler:2.16'
6666
implementation 'de.blox:graphview:0.5.0'
67+
implementation "com.google.android.material:material:1.12.0"
6768
implementation project(':basemoduleimport')
6869
implementation project(":commonwidget")
6970
implementation project(':ipc')

app/src/main/assets/zip.dex

-1.38 KB
Binary file not shown.

app/src/main/java/com/wrbug/developerhelper/DeveloperApplication.kt

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ class DeveloperApplication : BaseApp() {
4444
)
4545
registerIpcServer()
4646
BaseModule.init(this)
47-
releaseAssetsFile()
4847
registerLifecycle()
4948
AppStatusRegister.init(this)
5049
}
@@ -91,18 +90,4 @@ class DeveloperApplication : BaseApp() {
9190

9291
})
9392
}
94-
95-
private fun releaseAssetsFile() {
96-
doAsync {
97-
val inputStream = BaseApp.instance.assets.open("zip.dex")
98-
val file = File(BaseApp.instance.cacheDir, "zip.dex")
99-
if (file.exists().not()) {
100-
file.createNewFile()
101-
}
102-
val fileOutputStream = FileOutputStream(file)
103-
fileOutputStream.write(inputStream.readBytes())
104-
fileOutputStream.flush()
105-
fileOutputStream.close()
106-
}
107-
}
10893
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.wrbug.developerhelper.model.entity
2+
3+
data class BackupAppInfo(
4+
var backupApk: Boolean = false,
5+
var backupData: Boolean = false,
6+
var backupAndroidData: Boolean = false,
7+
var versionName: String = "",
8+
var versionCode: Int = 0,
9+
var packageName: String = ""
10+
)

app/src/main/java/com/wrbug/developerhelper/ui/activity/hierachy/AppInfoPagerAdapter.kt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,25 @@
11
package com.wrbug.developerhelper.ui.activity.hierachy
22

33
import android.content.Context
4-
import android.content.pm.ApplicationInfo
5-
import android.content.pm.PackageInfo
64
import android.view.View
75
import android.view.ViewGroup
86
import androidx.annotation.Keep
97
import androidx.recyclerview.widget.LinearLayoutManager
108
import androidx.recyclerview.widget.RecyclerView
119
import androidx.viewpager.widget.PagerAdapter
1210
import com.wrbug.developerhelper.R
13-
import com.wrbug.developerhelper.basecommon.uiThread
1411
import com.wrbug.developerhelper.commonutil.entity.ApkInfo
15-
import com.wrbug.developerhelper.commonutil.entity.TopActivityInfo
1612
import com.wrbug.developerhelper.commonutil.shell.ShellManager
1713
import com.wrbug.developerhelper.ui.decoration.SpaceItemDecoration
1814
import com.wrbug.developerhelper.ui.widget.appdatainfoview.AppDataInfoView
1915
import com.wrbug.developerhelper.ui.widget.appsettingview.AppSettingView
2016
import com.wrbug.developerhelper.ui.widget.layoutinfoview.infopage.InfoAdapter
2117
import com.wrbug.developerhelper.ui.widget.layoutinfoview.infopage.ItemInfo
22-
import com.wrbug.developerhelper.util.EnforceUtils
2318
import com.wrbug.developerhelper.commonutil.UiUtils
2419
import com.wrbug.developerhelper.commonutil.addTo
25-
import com.wrbug.developerhelper.commonutil.shell.Callback
26-
import com.wrbug.developerhelper.ipc.processshare.manager.AppXposedProcessDataManager
27-
import com.wrbug.developerhelper.ui.widget.layoutinfoview.infopage.LoadingItem
2820
import com.wrbug.developerhelper.util.format
2921
import com.wrbug.developerhelper.util.getString
3022
import io.reactivex.rxjava3.disposables.CompositeDisposable
31-
import org.jetbrains.anko.doAsync
32-
import org.jetbrains.anko.uiThread
33-
import java.lang.StringBuilder
3423
import java.util.ArrayList
3524

3625
@Keep

app/src/main/java/com/wrbug/developerhelper/ui/widget/appsettingview/AppSettingView.kt

Lines changed: 45 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import android.util.AttributeSet
88
import android.view.LayoutInflater
99
import android.widget.ScrollView
1010
import androidx.appcompat.app.AlertDialog
11+
import androidx.fragment.app.FragmentActivity
1112
import com.wrbug.developerhelper.BuildConfig
1213
import com.wrbug.developerhelper.R
1314
import com.wrbug.developerhelper.basecommon.BaseActivity
@@ -19,6 +20,7 @@ import com.wrbug.developerhelper.commonutil.toUri
1920
import com.wrbug.developerhelper.commonutil.zip
2021
import com.wrbug.developerhelper.commonwidget.util.setOnRootCheckClickListener
2122
import com.wrbug.developerhelper.commonwidget.util.visible
23+
import com.wrbug.developerhelper.databinding.DialogBackupAppSelectBinding
2224
import com.wrbug.developerhelper.databinding.ViewAppSettingBinding
2325
import com.wrbug.developerhelper.mmkv.ConfigKv
2426
import com.wrbug.developerhelper.mmkv.manager.MMKVManager
@@ -54,12 +56,13 @@ class AppSettingView : ScrollView {
5456
}
5557

5658
private fun initListener() {
57-
binding.backupApkBtn.setOnRootCheckClickListener {
58-
doBackupApk()
59-
}
60-
binding.backupApkDataDirBtn.setOnRootCheckClickListener {
61-
doBackupDataDir()
59+
binding.backupAppBtn.setOnRootCheckClickListener {
60+
showBackSelect()
61+
// doBackupApk()
6262
}
63+
// binding.backupApkDataDirBtn.setOnRootCheckClickListener {
64+
// doBackupDataDir()
65+
// }
6366
binding.restartAppBtn.setOnRootCheckClickListener {
6467
doRestartApp()
6568
}
@@ -74,6 +77,43 @@ class AppSettingView : ScrollView {
7477
}
7578
}
7679

80+
private fun showBackSelect() {
81+
val selected = booleanArrayOf(false, false, false)
82+
val binding = DialogBackupAppSelectBinding.inflate(LayoutInflater.from(context))
83+
binding.cbApk.setOnCheckedChangeListener { _, isChecked ->
84+
selected[0] = isChecked
85+
}
86+
binding.cbData.setOnCheckedChangeListener { _, isChecked ->
87+
selected[1] = isChecked
88+
}
89+
binding.cbAndroidData.setOnCheckedChangeListener { _, isChecked ->
90+
selected[2] = isChecked
91+
}
92+
AlertDialog.Builder(context)
93+
.setTitle(R.string.backup_app_file)
94+
.setView(binding.root)
95+
.setNegativeButton(R.string.cancel, null)
96+
.setPositiveButton(
97+
R.string.ok
98+
) { _, _ ->
99+
doBackup(selected)
100+
}.create().show()
101+
}
102+
103+
private fun doBackup(selected: BooleanArray) {
104+
val activity = context as? FragmentActivity ?: return
105+
if (selected.find { it } == null) {
106+
return
107+
}
108+
BackupAppDialog.show(
109+
activity.supportFragmentManager,
110+
apkInfo,
111+
selected[0],
112+
selected[1],
113+
selected[2]
114+
)
115+
}
116+
77117
private fun doUninstallApp() {
78118
apkInfo?.apply {
79119
AppManagerUtils.uninstallApp(context, applicationInfo.packageName)
@@ -124,80 +164,6 @@ class AppSettingView : ScrollView {
124164
}
125165
}
126166

127-
private fun doBackupDataDir() {
128-
if (checkRoot().not()) {
129-
return
130-
}
131-
apkInfo?.apply {
132-
val backupAppData = BackupUtils.backupAppData(applicationInfo.packageName)
133-
if (backupAppData == null) {
134-
showToast(context.getString(R.string.backup_failed))
135-
return
136-
}
137-
if (context !is BaseActivity) {
138-
showToast(context.getString(R.string.backup_success_msg))
139-
return
140-
}
141-
showShareDataNotice(backupAppData)
142-
}
143-
}
144-
145-
private fun showShareDataNotice(backupAppData: File) {
146-
showNotice(context.getString(R.string.backup_success_and_share_msg)) {
147-
(context as BaseActivity).requestPermission(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
148-
object : BaseActivity.PermissionCallback() {
149-
override fun granted() {
150-
val zipFile = File(
151-
context.externalCacheDir, "${apkInfo?.getAppName() ?: ""}-data.zip"
152-
)
153-
backupAppData.zip(zipFile)
154-
val uri = zipFile.toUri(context)
155-
if (uri == null) {
156-
showToast(context.getString(R.string.share_failed))
157-
return
158-
}
159-
activityFinish()
160-
Share2.Builder(context as Activity).setContentType(ShareContentType.FILE)
161-
.setShareFileUri(uri).setOnActivityResult(10).build().shareBySystem()
162-
}
163-
164-
})
165-
166-
}
167-
}
168-
169-
private fun doBackupApk() {
170-
if (checkRoot().not()) {
171-
return
172-
}
173-
context.requestStoragePermission {
174-
apkInfo?.apply {
175-
val uri = BackupUtils.backupApk(
176-
applicationInfo.packageName,
177-
applicationInfo.publicSourceDir,
178-
"${getAppName()}_${packageInfo.versionName}.apk"
179-
)
180-
if (uri == null) {
181-
showToast(context.getString(R.string.backup_failed))
182-
return@apply
183-
}
184-
if (context !is BaseActivity) {
185-
showToast(context.getString(R.string.backup_success_msg))
186-
return@apply
187-
}
188-
showShareApkDialog(uri)
189-
}
190-
}
191-
}
192-
193-
private fun showShareApkDialog(uri: Uri) {
194-
showNotice(context.getString(R.string.backup_success_and_share_msg)) {
195-
activityFinish()
196-
Share2.Builder(context as Activity).setContentType(ShareContentType.FILE)
197-
.setShareFileUri(uri).setOnActivityResult(10).build().shareBySystem()
198-
}
199-
}
200-
201167
private fun checkRoot(): Boolean {
202168
if (configKv.isOpenRoot().not()) {
203169
showToast(context.getString(R.string.please_open_root))

0 commit comments

Comments
 (0)