Skip to content

Commit ab122d7

Browse files
committed
data opt
1 parent 918f51b commit ab122d7

File tree

16 files changed

+195
-265
lines changed

16 files changed

+195
-265
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ import java.io.FileOutputStream
1818
import com.wrbug.developerhelper.ipc.processshare.tcp.TcpManager
1919
import com.wrbug.developerhelper.ipcserver.IpcManager
2020
import com.wrbug.developerhelper.ui.activity.main.MainActivity
21+
import com.wrbug.developerhelper.util.AppStatusRegister
2122
import org.jetbrains.anko.doAsync
2223

23-
class DeveloperApplication: BaseApp() {
24+
class DeveloperApplication : BaseApp() {
2425
companion object {
2526

2627
private lateinit var instance: DeveloperApplication
@@ -45,6 +46,7 @@ class DeveloperApplication: BaseApp() {
4546
BaseModule.init(this)
4647
releaseAssetsFile()
4748
registerLifecycle()
49+
AppStatusRegister.init(this)
4850
}
4951

5052
private fun registerIpcServer() {
@@ -58,7 +60,7 @@ class DeveloperApplication: BaseApp() {
5860
}
5961

6062
private fun registerLifecycle() {
61-
registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
63+
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
6264
private var count = 0
6365
override fun onActivityPaused(activity: Activity) {
6466

app/src/main/java/com/wrbug/developerhelper/service/DeveloperHelperAccessibilityService.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,6 @@ class DeveloperHelperAccessibilityService : AccessibilityService() {
205205

206206
inner class DeveloperHelperAccessibilityReceiver : BroadcastReceiver() {
207207
override fun onReceive(context: Context?, data: Intent?) {
208-
showToast(getString(R.string.getting_app_info))
209208
val nodesInfo = readNode()
210209
HierarchyActivity.start(context, currentAppInfo, nodesInfo)
211210
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ class AppInfoDialog : DialogFragment() {
7474
}
7575

7676
override fun onDestroyView() {
77-
super.onDestroyView()
7877
listener?.close()
7978
disposable.dispose()
79+
super.onDestroyView()
8080
}
8181
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class AppInfoPagerAdapter(
6767
private fun initAppSettingTab(apkInfo: ApkInfo?) {
6868
tabList.add(context.getString(R.string.app_setting))
6969
val view = AppSettingView(context)
70-
view.apkInfo = apkInfo
70+
view.setApkInfo(apkInfo)
7171
viewList.add(view)
7272
}
7373

@@ -89,11 +89,11 @@ class AppInfoPagerAdapter(
8989
itemDecoration.setFirstTopPadding(UiUtils.dp2px(context, 10F))
9090
rv.addItemDecoration(itemDecoration)
9191
apkInfo?.let { it ->
92-
itemInfos.add(ItemInfo("VersionName", it.packageInfo.versionName))
93-
itemInfos.add(ItemInfo("VersionCode", it.packageInfo.versionCode))
9492
it.applicationInfo.className?.let { name ->
9593
itemInfos.add(ItemInfo("Application", name))
9694
}
95+
itemInfos.add(ItemInfo("VersionName", it.packageInfo.versionName))
96+
itemInfos.add(ItemInfo("VersionCode", it.packageInfo.versionCode))
9797
itemInfos.add(ItemInfo("uid", it.applicationInfo.uid))
9898
ShellManager.getPid(it.packageInfo.packageName).takeUnless { it.isEmpty() }?.let {
9999
itemInfos.add(ItemInfo("Pid", it))

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

Lines changed: 48 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -17,117 +17,67 @@ import com.wrbug.developerhelper.mmkv.manager.MMKVManager
1717
import android.content.Intent
1818
import android.net.Uri
1919
import androidx.appcompat.widget.AppCompatButton
20+
import com.wrbug.developerhelper.BuildConfig
2021
import com.wrbug.developerhelper.basecommon.BaseActivity
2122
import com.wrbug.developerhelper.commonutil.shell.ShellManager
2223
import com.wrbug.developerhelper.commonutil.zip
2324
import com.wrbug.developerhelper.util.BackupUtils
2425
import com.wrbug.developerhelper.commonutil.toUri
26+
import com.wrbug.developerhelper.commonwidget.util.setOnDoubleCheckClickListener
27+
import com.wrbug.developerhelper.commonwidget.util.setOnRootCheckClickListener
28+
import com.wrbug.developerhelper.commonwidget.util.visible
2529
import com.wrbug.developerhelper.databinding.ViewAppSettingBinding
2630
import gdut.bsx.share2.Share2
2731
import gdut.bsx.share2.ShareContentType
2832
import org.jetbrains.anko.doAsync
2933
import org.jetbrains.anko.uiThread
3034
import java.io.File
3135

32-
class AppSettingView: ScrollView {
36+
class AppSettingView : ScrollView {
3337

34-
var apkInfo: ApkInfo? = null
38+
private var apkInfo: ApkInfo? = null
3539
private val configKv = MMKVManager.get(ConfigKv::class.java)
36-
private var exportDexBtn: AppCompatButton? = null
3740
private lateinit var binding: ViewAppSettingBinding
3841

39-
constructor(context: Context): super(context) {
42+
constructor(context: Context) : super(context) {
4043
initView()
4144
}
4245

43-
constructor(context: Context, attrs: AttributeSet): super(context, attrs) {
46+
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
4447
initView()
4548
}
4649

50+
fun setApkInfo(apkInfo: ApkInfo?) {
51+
this.apkInfo = apkInfo
52+
if (apkInfo?.applicationInfo?.packageName == BuildConfig.APPLICATION_ID) {
53+
binding.uninstallAppBtn.visible = false
54+
}
55+
}
56+
4757
private fun initView() {
4858
binding = ViewAppSettingBinding.inflate(LayoutInflater.from(context), this, true)
49-
exportDexBtn = findViewById(R.id.exportDexBtn)
50-
if (configKv.isOpenRoot().not()) {
51-
binding.backupApkBtn.isEnabled = false
52-
binding.backupApkDataDirBtn.isEnabled = false
53-
binding.restartAppBtn.isEnabled = false
54-
binding.stopAppBtn.isEnabled = false
55-
binding.deleteAppDataBtn.isEnabled = false
56-
exportDexBtn?.isEnabled = false
57-
}
5859
initListener()
5960
}
6061

6162
private fun initListener() {
62-
binding.backupApkBtn.setOnClickListener {
63+
binding.backupApkBtn.setOnRootCheckClickListener {
6364
doBackupApk()
6465
}
65-
binding.backupApkDataDirBtn.setOnClickListener {
66+
binding.backupApkDataDirBtn.setOnRootCheckClickListener {
6667
doBackupDataDir()
6768
}
68-
binding.restartAppBtn.setOnClickListener {
69+
binding.restartAppBtn.setOnRootCheckClickListener {
6970
doRestartApp()
7071
}
71-
binding.stopAppBtn.setOnClickListener {
72+
binding.stopAppBtn.setOnRootCheckClickListener {
7273
doStopApp()
7374
}
74-
binding.deleteAppDataBtn.setOnClickListener {
75+
binding.deleteAppDataBtn.setOnRootCheckClickListener {
7576
doDeleteAppData()
7677
}
77-
binding.uninstallAppBtn.setOnClickListener {
78+
binding.uninstallAppBtn.setOnRootCheckClickListener {
7879
doUninstallApp()
7980
}
80-
81-
exportDexBtn?.setOnClickListener {
82-
doBackupDexData()
83-
}
84-
}
85-
86-
private fun doBackupDexData() {
87-
apkInfo?.apply {
88-
showToast(context.getString(R.string.packing_files))
89-
doAsync {
90-
val dir = File(context.externalCacheDir, "dex/${applicationInfo.packageName}")
91-
if (dir.exists()) {
92-
ShellManager.rmFile(dir.absolutePath)
93-
}
94-
dir.mkdirs()
95-
val dexDir = "/data/data/${applicationInfo.packageName}/dump"
96-
val lsDir = ShellManager.lsDir(dexDir)
97-
if (lsDir.isEmpty()) {
98-
uiThread {
99-
showToast(context.getString(R.string.no_dex_files))
100-
}
101-
return@doAsync
102-
}
103-
if (ShellManager.cpFile(dexDir, dir.absolutePath)) {
104-
val zipFile =
105-
File(context.externalCacheDir, "${apkInfo?.getAppName() ?: ""}-dex.zip")
106-
dir.zip(zipFile)
107-
val uri = zipFile.toUri(context)
108-
if (uri == null) {
109-
showToast(R.string.export_failed)
110-
return@doAsync
111-
}
112-
uiThread {
113-
showShareDexNotice(uri)
114-
}
115-
} else {
116-
uiThread {
117-
showToast(context.getString(R.string.export_failed))
118-
}
119-
}
120-
}
121-
}
122-
}
123-
124-
private fun showShareDexNotice(uri: Uri) {
125-
Share2.Builder(context as Activity)
126-
.setContentType(ShareContentType.FILE)
127-
.setShareFileUri(uri)
128-
.setOnActivityResult(10)
129-
.build()
130-
.shareBySystem()
13181
}
13282

13383
private fun doUninstallApp() {
@@ -142,13 +92,13 @@ class AppSettingView: ScrollView {
14292
}
14393
apkInfo?.apply {
14494
showNotice(
145-
context.getString(R.string.confirm_delete_app_data),
146-
DialogInterface.OnClickListener { _, _ ->
147-
if (AppManagerUtils.clearAppData(applicationInfo.packageName)) {
148-
activityFinish()
149-
showToast(context.getString(R.string.clear_complete))
150-
}
151-
})
95+
context.getString(R.string.confirm_delete_app_data)
96+
) { _, _ ->
97+
if (AppManagerUtils.clearAppData(applicationInfo.packageName)) {
98+
activityFinish()
99+
showToast(context.getString(R.string.clear_complete))
100+
}
101+
}
152102

153103
}
154104
}
@@ -158,13 +108,11 @@ class AppSettingView: ScrollView {
158108
return
159109
}
160110
apkInfo?.apply {
161-
showNotice(
162-
context.getString(R.string.confirm_stop_app),
163-
DialogInterface.OnClickListener { _, _ ->
164-
if (AppManagerUtils.forceStopApp(applicationInfo.packageName)) {
165-
activityFinish()
166-
}
167-
})
111+
showNotice(context.getString(R.string.confirm_stop_app)) { _, _ ->
112+
if (AppManagerUtils.forceStopApp(applicationInfo.packageName)) {
113+
activityFinish()
114+
}
115+
}
168116
}
169117
}
170118

@@ -173,8 +121,7 @@ class AppSettingView: ScrollView {
173121
return
174122
}
175123
apkInfo?.apply {
176-
showNotice(
177-
context.getString(R.string.confirm_restart_app),
124+
showNotice(context.getString(R.string.confirm_restart_app),
178125
DialogInterface.OnClickListener { _, _ ->
179126
AppManagerUtils.restartApp(context, applicationInfo.packageName)
180127
activityFinish()
@@ -202,15 +149,13 @@ class AppSettingView: ScrollView {
202149
}
203150

204151
private fun showShareDataNotice(backupAppData: File) {
205-
showNotice(
206-
context.getString(R.string.backup_success_and_share_msg),
152+
showNotice(context.getString(R.string.backup_success_and_share_msg),
207153
DialogInterface.OnClickListener { _, _ ->
208154
(context as BaseActivity).requestPermission(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
209-
object: BaseActivity.PermissionCallback() {
155+
object : BaseActivity.PermissionCallback() {
210156
override fun granted() {
211157
val zipFile = File(
212-
context.externalCacheDir,
213-
"${apkInfo?.getAppName() ?: ""}-data.zip"
158+
context.externalCacheDir, "${apkInfo?.getAppName() ?: ""}-data.zip"
214159
)
215160
backupAppData.zip(zipFile)
216161
val uri = zipFile.toUri(context)
@@ -220,11 +165,8 @@ class AppSettingView: ScrollView {
220165
}
221166
activityFinish()
222167
Share2.Builder(context as Activity)
223-
.setContentType(ShareContentType.FILE)
224-
.setShareFileUri(uri)
225-
.setOnActivityResult(10)
226-
.build()
227-
.shareBySystem()
168+
.setContentType(ShareContentType.FILE).setShareFileUri(uri)
169+
.setOnActivityResult(10).build().shareBySystem()
228170
}
229171

230172
})
@@ -260,19 +202,14 @@ class AppSettingView: ScrollView {
260202
(context as BaseActivity).requestPermission(arrayOf(
261203
Manifest.permission.READ_EXTERNAL_STORAGE,
262204
Manifest.permission.WRITE_EXTERNAL_STORAGE
263-
),
264-
object: BaseActivity.PermissionCallback() {
265-
override fun granted() {
266-
activityFinish()
267-
Share2.Builder(context as Activity)
268-
.setContentType(ShareContentType.FILE)
269-
.setShareFileUri(uri)
270-
.setOnActivityResult(10)
271-
.build()
272-
.shareBySystem()
273-
}
205+
), object : BaseActivity.PermissionCallback() {
206+
override fun granted() {
207+
activityFinish()
208+
Share2.Builder(context as Activity).setContentType(ShareContentType.FILE)
209+
.setShareFileUri(uri).setOnActivityResult(10).build().shareBySystem()
210+
}
274211

275-
})
212+
})
276213

277214
}
278215
}
@@ -292,11 +229,8 @@ class AppSettingView: ScrollView {
292229
}
293230

294231
private fun showNotice(msg: String, listener: DialogInterface.OnClickListener) {
295-
AlertDialog.Builder(context)
296-
.setTitle(R.string.notice)
297-
.setMessage(msg)
298-
.setNegativeButton(R.string.cancel, null)
299-
.setPositiveButton(R.string.ok, listener)
232+
AlertDialog.Builder(context).setTitle(R.string.notice).setMessage(msg)
233+
.setNegativeButton(R.string.cancel, null).setPositiveButton(R.string.ok, listener)
300234
.create().show()
301235
}
302236
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.wrbug.developerhelper.util
2+
3+
import android.app.Activity
4+
import android.app.Application
5+
import android.os.Bundle
6+
7+
object AppStatusRegister {
8+
private var count = 0
9+
private val backgroundMap = hashMapOf<String, () -> Unit>()
10+
fun init(application: Application) {
11+
application.registerActivityLifecycleCallbacks(object :
12+
Application.ActivityLifecycleCallbacks {
13+
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
14+
15+
}
16+
17+
override fun onActivityStarted(activity: Activity) {
18+
count++
19+
}
20+
21+
override fun onActivityResumed(activity: Activity) {
22+
}
23+
24+
override fun onActivityPaused(activity: Activity) {
25+
}
26+
27+
override fun onActivityStopped(activity: Activity) {
28+
count--
29+
backgroundCheck()
30+
}
31+
32+
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
33+
}
34+
35+
override fun onActivityDestroyed(activity: Activity) {
36+
}
37+
38+
})
39+
}
40+
41+
42+
fun registerBackgroundListener(key: String, listener: () -> Unit) {
43+
backgroundMap[key] = listener
44+
}
45+
46+
fun removeBackgroundListener(key: String) {
47+
backgroundMap.remove(key)
48+
}
49+
50+
private fun backgroundCheck() {
51+
if (count == 0) {
52+
backgroundMap.values.forEach { it() }
53+
}
54+
}
55+
56+
}

0 commit comments

Comments
 (0)