Skip to content

Commit 5521615

Browse files
author
Martin Styk
committed
App analysis modularization part 2
1 parent 3e77ed5 commit 5521615

54 files changed

Lines changed: 513 additions & 641 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.idea/codeStyles/Project.xml

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/java/sk/styk/martin/apkanalyzer/dependencyinjection/ApplicationModule.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@ import javax.inject.Singleton
2323
@Module
2424
class ApplicationModule {
2525

26-
@Provides
27-
@Singleton
28-
fun providePackageManager(application: Application): PackageManager = application.packageManager
29-
3026
@Provides
3127
@Singleton
3228
fun provideContentResolver(application: Application): ContentResolver = application.contentResolver

app/src/main/java/sk/styk/martin/apkanalyzer/ui/appdetail/AppDetailFragmentViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,10 @@ class AppDetailFragmentViewModel @AssistedInject constructor(
144144
try {
145145
val detail = withContext(dispatcherProvider.default()) {
146146
when (appDetailRequest) {
147-
is AppDetailRequest.InstalledPackage -> appDetailDataManager.loadForInstalledPackage(appDetailRequest.packageName)
147+
is AppDetailRequest.InstalledPackage -> appDetailDataManager.installedPackageDetails(appDetailRequest.packageName)
148148
is AppDetailRequest.ExternalPackage -> {
149149
val tempFile = fileManager.createTempFileFromUri(appDetailRequest.packageUri, ANALYZED_APK_NAME)
150-
appDetailDataManager.loadForExternalPackage(tempFile)
150+
appDetailDataManager.apkFilePackageDetails(tempFile)
151151
}
152152
}
153153
}

app/src/main/java/sk/styk/martin/apkanalyzer/ui/appdetail/page/definedpermission/AppDefinedPermissionFragmentViewModel.kt

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,40 +24,32 @@ class AppDefinedPermissionFragmentViewModel @AssistedInject constructor(
2424
@Assisted appDetailFragmentViewModel: AppDetailFragmentViewModel,
2525
val permissionAdapter: AppPermissionListAdapter,
2626
clipBoardManager: ClipBoardManager,
27-
private val dispatcherProvider: DispatcherProvider,
2827
private val packageManager: PackageManager,
2928
) : AppDetailPageFragmentViewModel(appDetailFragmentViewModel, permissionAdapter, clipBoardManager) {
3029

3130
private val showDialogEvent = SingleLiveEvent<DialogComponent>()
3231
val showDialog = SingleLiveEvent<DialogComponent>()
3332

3433
override fun onDataReceived(appDetailData: AppDetailData): Boolean {
35-
viewModelScope.launch(dispatcherProvider.main()) {
36-
val items = withContext(dispatcherProvider.default()) {
37-
appDetailData.permissionData.definesPermissionsNames.map {
38-
AppPermissionListAdapter.DecomposedPermissionData(it, AppPermissionManager.createSimpleName(it))
39-
}
40-
}
41-
permissionAdapter.items = items
34+
permissionAdapter.items = appDetailData.permissionData.definesPermissions.map {
35+
AppPermissionListAdapter.DecomposedPermissionData(it.name, it.simpleName)
4236
}
43-
return appDetailData.permissionData.definesPermissionsNames.isNotEmpty()
37+
return permissionAdapter.items.isNotEmpty()
4438
}
4539

4640
override fun onCreate(owner: LifecycleOwner) {
4741
super.onCreate(owner)
4842
permissionAdapter.showPermissionDetail.observe(owner) { it ->
4943
val description = try {
50-
packageManager.getPermissionInfo(it, PackageManager.GET_META_DATA).loadDescription(packageManager)
44+
packageManager.getPermissionInfo(it.completeName, PackageManager.GET_META_DATA).loadDescription(packageManager)
5145
} catch (e: PackageManager.NameNotFoundException) {
5246
null
5347
}?.takeIf { it.isNotBlank() }
5448
?.let { TextInfo.from(it) }
5549
?: TextInfo.from(R.string.NA)
5650

57-
openDescription
58-
5951
showDialogEvent.value = DialogComponent(
60-
title = TextInfo.from(AppPermissionManager.createSimpleName(it)),
52+
title = TextInfo.from(it.simpleName),
6153
message = description,
6254
negativeButtonText = TextInfo.from(R.string.dismiss),
6355
)

app/src/main/java/sk/styk/martin/apkanalyzer/ui/appdetail/page/usedpermission/AppPermissionListAdapter.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class AppPermissionListAdapter @Inject constructor() : DetailInfoDescriptionAdap
1515

1616
data class DecomposedPermissionData(val completeName: String, val simpleName: String)
1717

18-
private val showPermissionDetailEvent = SingleLiveEvent<String>()
19-
val showPermissionDetail: LiveData<String> = showPermissionDetailEvent
18+
private val showPermissionDetailEvent = SingleLiveEvent<DecomposedPermissionData>()
19+
val showPermissionDetail: LiveData<DecomposedPermissionData> = showPermissionDetailEvent
2020

2121
var items = emptyList<DecomposedPermissionData>()
2222
set(value) {
@@ -42,7 +42,7 @@ class AppPermissionListAdapter @Inject constructor() : DetailInfoDescriptionAdap
4242
val completeName = permission.completeName
4343

4444
fun showDetail() {
45-
showPermissionDetailEvent.value = permission.completeName
45+
showPermissionDetailEvent.value = permission
4646
}
4747

4848
fun copyName(): Boolean {

app/src/main/java/sk/styk/martin/apkanalyzer/ui/appdetail/page/usedpermission/AppUsedPermissionFragmentViewModel.kt

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,38 +24,32 @@ class AppUsedPermissionFragmentViewModel @AssistedInject constructor(
2424
@Assisted appDetailFragmentViewModel: AppDetailFragmentViewModel,
2525
private val permissionAdapter: AppPermissionListAdapter,
2626
clipBoardManager: ClipBoardManager,
27-
private val dispatcherProvider: DispatcherProvider,
2827
private val packageManager: PackageManager,
2928
) : AppDetailPageFragmentViewModel(appDetailFragmentViewModel, permissionAdapter, clipBoardManager) {
3029

3130
private val showDialogEvent = SingleLiveEvent<DialogComponent>()
3231
val showDialog: LiveData<DialogComponent> = showDialogEvent
3332

3433
override fun onDataReceived(appDetailData: AppDetailData): Boolean {
35-
viewModelScope.launch(dispatcherProvider.main()) {
36-
val items = withContext(dispatcherProvider.default()) {
37-
appDetailData.permissionData.usesPermissionsNames.map {
38-
AppPermissionListAdapter.DecomposedPermissionData(it, AppPermissionManager.createSimpleName(it))
39-
}
40-
}
41-
permissionAdapter.items = items
34+
permissionAdapter.items = appDetailData.permissionData.usesPermissions.map {
35+
AppPermissionListAdapter.DecomposedPermissionData(it.permissionData.name, it.permissionData.simpleName)
4236
}
43-
return appDetailData.permissionData.usesPermissionsNames.isNotEmpty()
37+
return permissionAdapter.items.isNotEmpty()
4438
}
4539

4640
override fun onCreate(owner: LifecycleOwner) {
4741
super.onCreate(owner)
4842
permissionAdapter.showPermissionDetail.observe(owner) { it ->
4943
val description = try {
50-
packageManager.getPermissionInfo(it, PackageManager.GET_META_DATA).loadDescription(packageManager)
44+
packageManager.getPermissionInfo(it.completeName, PackageManager.GET_META_DATA).loadDescription(packageManager)
5145
} catch (e: PackageManager.NameNotFoundException) {
5246
null
5347
}?.takeIf { it.isNotBlank() }
5448
?.let { TextInfo.from(it) }
5549
?: TextInfo.from(R.string.NA)
5650

5751
showDialogEvent.value = DialogComponent(
58-
title = TextInfo.from(AppPermissionManager.createSimpleName(it)),
52+
title = TextInfo.from(it.simpleName),
5953
message = description,
6054
negativeButtonText = TextInfo.from(R.string.dismiss),
6155
)

app/src/main/java/sk/styk/martin/apkanalyzer/ui/applist/AppListAdapter.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import android.view.View
55
import android.view.ViewGroup
66
import androidx.recyclerview.widget.DiffUtil
77
import androidx.recyclerview.widget.RecyclerView
8-
import sk.styk.martin.apkanalyzer.core.applist.model.AppListData
8+
import sk.styk.martin.apkanalyzer.core.applist.model.LazyAppListData
99
import sk.styk.martin.apkanalyzer.databinding.ListItemApplicationBinding
1010
import sk.styk.martin.apkanalyzer.util.live.SingleLiveEvent
1111
import java.lang.ref.WeakReference
@@ -15,7 +15,7 @@ class AppListAdapter @Inject constructor() : RecyclerView.Adapter<AppListAdapter
1515

1616
val appClicked = SingleLiveEvent<AppListClickData>()
1717

18-
var data = emptyList<AppListData>()
18+
var data = emptyList<LazyAppListData>()
1919
set(value) {
2020
val diffResult = DiffUtil.calculateDiff(AppDiffCallback(value, field))
2121
field = value
@@ -34,21 +34,21 @@ class AppListAdapter @Inject constructor() : RecyclerView.Adapter<AppListAdapter
3434
override fun getItemId(position: Int): Long = position.toLong()
3535

3636
inner class ViewHolder(private val binding: ListItemApplicationBinding) : RecyclerView.ViewHolder(binding.root) {
37-
fun bind(appData: AppListData) {
37+
fun bind(appData: LazyAppListData) {
3838
binding.data = appData
3939
binding.root.setOnClickListener { appClicked.value = AppListClickData(WeakReference(it), appData) }
4040
}
4141
}
4242

4343
private inner class AppDiffCallback(
44-
private val newList: List<AppListData>,
45-
private val oldList: List<AppListData>,
44+
private val newList: List<LazyAppListData>,
45+
private val oldList: List<LazyAppListData>,
4646
) : DiffUtil.Callback() {
4747
override fun getOldListSize() = oldList.size
4848
override fun getNewListSize() = newList.size
4949
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) = oldList[oldItemPosition].packageName == newList[newItemPosition].packageName
5050
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) = oldList[oldItemPosition].packageName == newList[newItemPosition].packageName
5151
}
5252

53-
data class AppListClickData(val view: WeakReference<View>, val appListData: AppListData)
53+
data class AppListClickData(val view: WeakReference<View>, val lazyAppListData: LazyAppListData)
5454
}

app/src/main/java/sk/styk/martin/apkanalyzer/ui/applist/BaseAppListFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ abstract class BaseAppListFragment<VM : BaseAppListViewModel> : Fragment() {
2929
appListClickData.view.get()?.let { addSharedElement(it, getString(R.string.transition_app_detail)) }
3030
}.replace(
3131
R.id.container,
32-
AppDetailFragment.newInstance(AppDetailRequest.InstalledPackage(appListClickData.appListData.packageName)),
32+
AppDetailFragment.newInstance(AppDetailRequest.InstalledPackage(appListClickData.lazyAppListData.packageName)),
3333
FragmentTag.AppDetailParent.tag,
3434
)
3535
.setReorderingAllowed(true)

app/src/main/java/sk/styk/martin/apkanalyzer/ui/applist/BaseAppListViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData
44
import androidx.lifecycle.MutableLiveData
55
import androidx.lifecycle.ViewModel
66
import androidx.lifecycle.distinctUntilChanged
7-
import sk.styk.martin.apkanalyzer.core.applist.model.AppListData
7+
import sk.styk.martin.apkanalyzer.core.applist.model.LazyAppListData
88

99
internal const val LOADING_STATE = 0
1010
internal const val EMPTY_STATE = 1
@@ -14,7 +14,7 @@ abstract class BaseAppListViewModel constructor(
1414
val adapter: AppListAdapter,
1515
) : ViewModel() {
1616

17-
protected open var appListData = listOf<AppListData>()
17+
protected open var lazyAppListData = listOf<LazyAppListData>()
1818
set(value) {
1919
field = value
2020
adapter.data = value

app/src/main/java/sk/styk/martin/apkanalyzer/ui/applist/main/MainAppListViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import kotlinx.coroutines.withContext
2020
import sk.styk.martin.apkanalyzer.R
2121
import sk.styk.martin.apkanalyzer.core.appanalysis.model.AppSource
2222
import sk.styk.martin.apkanalyzer.core.applist.InstalledAppsRepository
23-
import sk.styk.martin.apkanalyzer.core.applist.model.AppListData
23+
import sk.styk.martin.apkanalyzer.core.applist.model.LazyAppListData
2424
import sk.styk.martin.apkanalyzer.manager.navigationdrawer.NavigationDrawerModel
2525
import sk.styk.martin.apkanalyzer.ui.applist.AppListAdapter
2626
import sk.styk.martin.apkanalyzer.ui.applist.BaseAppListViewModel
@@ -41,7 +41,7 @@ class MainAppListViewModel @Inject constructor(
4141
adapter: AppListAdapter,
4242
) : BaseAppListViewModel(adapter), DefaultLifecycleObserver, SearchView.OnQueryTextListener, SearchView.OnCloseListener, Toolbar.OnMenuItemClickListener {
4343

44-
override var appListData = listOf<AppListData>()
44+
var appListData = listOf<LazyAppListData>()
4545
set(value) {
4646
field = value
4747
adapter.data = value
@@ -52,7 +52,7 @@ class MainAppListViewModel @Inject constructor(
5252
}
5353
}
5454

55-
private var allApps: List<AppListData> = emptyList()
55+
private var allApps: List<LazyAppListData> = emptyList()
5656

5757
private val openFilePickerEvent = SingleLiveEvent<Unit>()
5858
val openFilePicker: LiveData<Unit> = openFilePickerEvent

0 commit comments

Comments
 (0)