Skip to content

Commit 9d9f4a7

Browse files
committed
feat: refactor code
1 parent 93464c1 commit 9d9f4a7

30 files changed

+193
-165
lines changed

app/src/main/java/cn/jailedbird/smartappsearch/App.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import android.content.BroadcastReceiver
55
import android.content.Context
66
import android.content.Intent
77
import android.content.IntentFilter
8-
import cn.jailedbird.smartappsearch.config.Settings
98
import cn.jailedbird.smartappsearch.data.AppRepository
10-
import cn.jailedbird.smartappsearch.utils.AppUtils
9+
import cn.jailedbird.smartappsearch.data.entity.AppModel
10+
import cn.jailedbird.smartappsearch.settings.Settings
1111
import dagger.hilt.android.HiltAndroidApp
1212
import kotlinx.coroutines.DelicateCoroutinesApi
1313
import kotlinx.coroutines.Dispatchers
@@ -36,15 +36,15 @@ class App : Application() {
3636
@Inject
3737
lateinit var appRepository: AppRepository
3838

39+
/** Dynamic broadcast for apk install and uninstall
40+
* [StackOverflow](https://stackoverflow.com/questions/7470314/receiving-package-install-and-uninstall-events)*/
3941
private fun listenApkChange() {
40-
/** Dynamic broadcast for apk install and uninstall
41-
* [StackOverflow](https://stackoverflow.com/questions/7470314/receiving-package-install-and-uninstall-events)*/
4242
val broadcastReceiver = object : BroadcastReceiver() {
4343
override fun onReceive(context: Context?, intent: Intent?) {
4444
@OptIn(DelicateCoroutinesApi::class)
4545
GlobalScope.launch(Dispatchers.IO) {
4646
appRepository.refreshAppModelTable(
47-
AppUtils.updateMeta(this@App, appRepository.getApps())
47+
AppModel.updateMeta(this@App, appRepository.getApps())
4848
)
4949
}
5050
}

app/src/main/java/cn/jailedbird/smartappsearch/data/entity/AppModel.kt

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ import android.content.Context
55
import androidx.recyclerview.widget.DiffUtil
66
import androidx.room.Entity
77
import cn.jailedbird.smartappsearch.data.AppRepository
8-
import cn.jailedbird.smartappsearch.model.AppConfig
8+
import cn.jailedbird.smartappsearch.utils.LAUNCH_DELAY_TIME
99
import cn.jailedbird.smartappsearch.utils.finishProcess
1010
import cn.jailedbird.smartappsearch.utils.launchApk
11+
import cn.jailedbird.smartappsearch.utils.packageManagerAppList
1112
import dagger.hilt.EntryPoint
1213
import dagger.hilt.InstallIn
1314
import dagger.hilt.android.EntryPointAccessors
@@ -36,6 +37,35 @@ data class AppModel(
3637
const val PITCH_ADD_COUNT = 10
3738
const val ONE_DAY_MILS = 1000 * 60 * 60 * 24
3839
const val REDUCE_GAP = 3
40+
41+
suspend fun updateMeta(
42+
context: Context,
43+
old: List<AppModel>,
44+
withReduce: Boolean = false
45+
): List<AppModel> {
46+
return mergeMemoryWithRoom(context.packageManagerAppList(), old, withReduce)
47+
}
48+
49+
private fun mergeMemoryWithRoom(
50+
new: List<AppModel>,
51+
old: List<AppModel>,
52+
withReduce: Boolean = false
53+
): List<AppModel> {
54+
val newSet = new.toMutableSet()
55+
val mixed = mutableListOf<AppModel>()
56+
for (item in old) {
57+
if (newSet.remove(item)) {
58+
mixed.add(item)
59+
}
60+
}
61+
newSet.addAll(mixed)
62+
if (withReduce) {
63+
for (it in newSet) {
64+
it.reduce()
65+
}
66+
}
67+
return newSet.toList()
68+
}
3969
}
4070

4171
fun launch(context: Context) {
@@ -44,7 +74,7 @@ data class AppModel(
4474
GlobalScope.launch(Dispatchers.IO) {
4575
EntryPointAccessors.fromApplication<AppRepositoryEntryPoint>(context.applicationContext)
4676
.appRepository().refreshAppModel(this@AppModel)
47-
delay(AppConfig.LAUNCH_DELAY_TIME)
77+
delay(LAUNCH_DELAY_TIME)
4878
if (context is Activity) {
4979
context.finishProcess()
5080
}

app/src/main/java/cn/jailedbird/smartappsearch/dialog/AppListPopWindow.kt

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ import android.content.Context
44
import android.view.Gravity
55
import android.view.View
66
import androidx.core.widget.PopupWindowCompat
7+
import cn.jailedbird.smartappsearch.BuildConfig
78
import cn.jailedbird.smartappsearch.R
89
import cn.jailedbird.smartappsearch.data.entity.AppModel
910
import cn.jailedbird.smartappsearch.databinding.PopUpAppListBinding
1011
import cn.jailedbird.smartappsearch.utils.gotoApkSettings
11-
import cn.jailedbird.smartappsearch.utils.setDebouncedClick
12+
import cn.jailedbird.smartappsearch.utils.setDebouncingClick
13+
import cn.jailedbird.smartappsearch.utils.toast
1214
import cn.jailedbird.smartappsearch.utils.uninstallApk
15+
import java.util.*
1316

1417

1518
class AppListPopWindow(
@@ -37,12 +40,16 @@ class AppListPopWindow(
3740
private lateinit var binding: PopUpAppListBinding
3841

3942
private val listener = object : Listener {
40-
override fun showInfo(appModel: AppModel?) {
41-
context.gotoApkSettings(appModel?.appPackageName)
43+
override fun showInfo(appModel: AppModel) {
44+
context.gotoApkSettings(appModel.appPackageName)
4245
}
4346

44-
override fun unInstall(appModel: AppModel?) {
45-
context.uninstallApk(appModel?.appPackageName)
47+
override fun unInstall(appModel: AppModel) {
48+
context.uninstallApk(appModel.appPackageName)
49+
}
50+
51+
override fun showDebugInfo(appModel: AppModel) {
52+
"count is ${appModel.count} ; timestamp is ${Date(appModel.timestamp)}".toast()
4653
}
4754
}
4855

@@ -55,20 +62,36 @@ class AppListPopWindow(
5562
}
5663

5764
override fun initEvent(root: View) {
58-
binding.tvInfo.setDebouncedClick {
59-
listener.showInfo(appModel)
65+
binding.tvInfo.setDebouncingClick {
66+
appModel?.let {
67+
listener.showInfo(it)
68+
}
6069
dismiss()
6170
}
62-
binding.tvUnInstall.setDebouncedClick {
63-
listener.unInstall(appModel)
71+
72+
binding.tvUnInstall.setDebouncingClick {
73+
appModel?.let {
74+
listener.unInstall(it)
75+
}
6476
dismiss()
6577
}
78+
79+
if (BuildConfig.DEBUG) {
80+
binding.tvDebug.visibility = View.VISIBLE
81+
binding.tvDebug.setDebouncingClick {
82+
appModel?.let {
83+
listener.showDebugInfo(it)
84+
}
85+
dismiss()
86+
}
87+
}
88+
6689
}
6790

6891
interface Listener {
69-
fun showInfo(appModel: AppModel?)
70-
fun unInstall(appModel: AppModel?)
92+
fun showInfo(appModel: AppModel)
93+
fun unInstall(appModel: AppModel)
94+
fun showDebugInfo(appModel: AppModel)
7195
}
7296

73-
7497
}

app/src/main/java/cn/jailedbird/smartappsearch/dialog/AppSettingsPopWindow.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import android.view.View
66
import androidx.core.widget.PopupWindowCompat
77
import cn.jailedbird.smartappsearch.R
88
import cn.jailedbird.smartappsearch.databinding.PopUpAppSettingBinding
9-
import cn.jailedbird.smartappsearch.utils.setDebouncedClick
9+
import cn.jailedbird.smartappsearch.utils.setDebouncingClick
1010

1111
class AppSettingsPopWindow(
1212
context: Context,
@@ -41,23 +41,23 @@ class AppSettingsPopWindow(
4141
}
4242

4343
override fun initEvent(root: View) {
44-
binding.tvRefreshApp.setDebouncedClick {
44+
binding.tvRefreshApp.setDebouncingClick {
4545
listener.refreshApp()
4646
dismiss()
4747
}
48-
binding.tvRate.setDebouncedClick {
48+
binding.tvRate.setDebouncingClick {
4949
listener.rate()
5050
dismiss()
5151
}
52-
binding.tvShare.setDebouncedClick {
52+
binding.tvShare.setDebouncingClick {
5353
listener.share()
5454
dismiss()
5555
}
56-
binding.tvClearHistory.setDebouncedClick {
56+
binding.tvClearHistory.setDebouncingClick {
5757
listener.clearHistory()
5858
dismiss()
5959
}
60-
binding.tvSettings.setDebouncedClick {
60+
binding.tvSettings.setDebouncingClick {
6161
listener.settings()
6262
dismiss()
6363
}

app/src/main/java/cn/jailedbird/smartappsearch/model/AppConfig.kt

Lines changed: 0 additions & 5 deletions
This file was deleted.

app/src/main/java/cn/jailedbird/smartappsearch/config/Android.kt renamed to app/src/main/java/cn/jailedbird/smartappsearch/settings/Android.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cn.jailedbird.smartappsearch.config
1+
package cn.jailedbird.smartappsearch.settings
22

33
import android.os.Build
44

app/src/main/java/cn/jailedbird/smartappsearch/config/Settings.kt renamed to app/src/main/java/cn/jailedbird/smartappsearch/settings/Settings.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package cn.jailedbird.smartappsearch.config
1+
@file:Suppress("unused")
2+
3+
package cn.jailedbird.smartappsearch.settings
24

35
import android.content.Context
46
import android.content.SharedPreferences
@@ -11,6 +13,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow
1113
import kotlinx.coroutines.flow.asSharedFlow
1214
import kotlinx.coroutines.launch
1315
import java.net.Proxy
16+
1417
/**
1518
* Best way to implement App settings, code from [Neo Store](https://github.com/NeoApplications/Neo-Store)
1619
* */

app/src/main/java/cn/jailedbird/smartappsearch/ui/main/MainActivity.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@ import androidx.core.widget.addTextChangedListener
1616
import androidx.lifecycle.lifecycleScope
1717
import cn.jailedbird.smartappsearch.BuildConfig
1818
import cn.jailedbird.smartappsearch.adapter.AppListTwoTypeAdapter
19-
import cn.jailedbird.smartappsearch.config.Settings
2019
import cn.jailedbird.smartappsearch.databinding.ActivityMainBinding
2120
import cn.jailedbird.smartappsearch.dialog.AppSettingsPopWindow
22-
import cn.jailedbird.smartappsearch.model.AppConfig
21+
import cn.jailedbird.smartappsearch.settings.Settings
2322
import cn.jailedbird.smartappsearch.ui.setting.SettingsActivity
2423
import cn.jailedbird.smartappsearch.utils.*
2524
import dagger.hilt.android.AndroidEntryPoint
@@ -49,7 +48,7 @@ class MainActivity : AppCompatActivity() {
4948
}
5049

5150
override fun clearHistory() {
52-
"clearHistory".toast()
51+
viewModel.clearRoomHistory()
5352
}
5453

5554
override fun settings() {
@@ -74,6 +73,7 @@ class MainActivity : AppCompatActivity() {
7473
/* quickDebug()*/
7574
}
7675

76+
@Suppress("unused")
7777
private fun quickDebug() {
7878
if (BuildConfig.DEBUG) {
7979
startActivity(Intent(this, SettingsActivity::class.java))
@@ -95,7 +95,7 @@ class MainActivity : AppCompatActivity() {
9595
// Don't get first item by RecyclerView, Perhaps RecyclerView not refresh
9696
adapter.currentList[0].launch(this@MainActivity)
9797
lifecycleScope.launch(Dispatchers.IO) {
98-
delay(AppConfig.LAUNCH_DELAY_TIME)
98+
delay(LAUNCH_DELAY_TIME)
9999
finish()
100100
}
101101
}
@@ -104,7 +104,7 @@ class MainActivity : AppCompatActivity() {
104104
}
105105

106106
private fun initEvent() {
107-
binding.ivMore.setDebouncedClick {
107+
binding.ivMore.setDebouncingClick {
108108
hideKeyboard()
109109
AppSettingsPopWindow.open(this, it, listener)
110110
}

app/src/main/java/cn/jailedbird/smartappsearch/ui/main/MainViewModel.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import android.content.Context
55
import androidx.lifecycle.SavedStateHandle
66
import androidx.lifecycle.ViewModel
77
import androidx.lifecycle.viewModelScope
8-
import cn.jailedbird.smartappsearch.config.Settings
98
import cn.jailedbird.smartappsearch.data.AppRepository
109
import cn.jailedbird.smartappsearch.data.entity.AppModel
11-
import cn.jailedbird.smartappsearch.utils.AppUtils
10+
import cn.jailedbird.smartappsearch.settings.Settings
1211
import cn.jailedbird.smartappsearch.utils.EMPTY
12+
import cn.jailedbird.smartappsearch.utils.packageManagerAppList
1313
import dagger.hilt.android.lifecycle.HiltViewModel
1414
import dagger.hilt.android.qualifiers.ApplicationContext
1515
import kotlinx.coroutines.Dispatchers
@@ -67,10 +67,16 @@ class MainViewModel @Inject constructor(
6767
refreshAppDatabase()
6868
}
6969

70+
fun clearRoomHistory() {
71+
viewModelScope.launch {
72+
repository.refreshAppModelTable(context.packageManagerAppList())
73+
}
74+
}
75+
7076
fun refreshAppDatabase() {
7177
viewModelScope.launch(Dispatchers.IO) {
7278
repository.refreshAppModelTable(
73-
AppUtils.updateMeta(
79+
AppModel.updateMeta(
7480
context,
7581
apps.ifEmpty { repository.getApps() },
7682
withReduce = true

app/src/main/java/cn/jailedbird/smartappsearch/ui/setting/SettingFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import android.view.LayoutInflater
44
import android.view.ViewGroup
55
import cn.jailedbird.edgeutils.paddingTopSystemWindowInsets
66
import cn.jailedbird.smartappsearch.base.BaseVBFragment
7-
import cn.jailedbird.smartappsearch.config.Settings
87
import cn.jailedbird.smartappsearch.databinding.FragmentSettingMainBinding
8+
import cn.jailedbird.smartappsearch.settings.Settings
99
import com.google.android.material.switchmaterial.SwitchMaterial
1010

1111
class SettingFragment : BaseVBFragment<FragmentSettingMainBinding>() {

0 commit comments

Comments
 (0)