InstalledApps: Minor tweak

This commit is contained in:
Rahul Patel
2024-12-05 19:25:16 +05:30
parent c2f6f6d9d4
commit b989030e7b
4 changed files with 52 additions and 23 deletions

View File

@@ -2,34 +2,61 @@ package com.aurora.store.data.model
import android.content.Context import android.content.Context
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Parcelable import android.os.Parcelable
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.store.data.room.update.Update import com.aurora.store.data.room.update.Update
import com.aurora.store.util.PackageUtil
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
data class MinimalApp( data class MinimalApp(
val packageName: String, val packageName: String,
val versionName: String,
val versionCode: Int, val versionCode: Int,
val displayName: String val displayName: String,
@IgnoredOnParcel
val icon: Bitmap? = null
) : Parcelable { ) : Parcelable {
companion object { companion object {
fun fromApp(app: App): MinimalApp { fun fromApp(app: App): MinimalApp {
return MinimalApp(app.packageName, app.versionCode, app.displayName) return MinimalApp(
app.packageName,
app.versionName,
app.versionCode,
app.displayName
)
}
fun toApp(minimalApp: MinimalApp): App {
return App(minimalApp.packageName).apply {
versionName = minimalApp.versionName ?: ""
versionCode = minimalApp.versionCode
displayName = minimalApp.displayName
}
} }
fun fromUpdate(update: Update): MinimalApp { fun fromUpdate(update: Update): MinimalApp {
return MinimalApp(update.packageName, update.versionCode, update.displayName) return MinimalApp(
update.packageName,
update.versionName,
update.versionCode,
update.displayName
)
} }
fun fromPackageInfo(context: Context, packageInfo: PackageInfo): MinimalApp { fun fromPackageInfo(context: Context, packageInfo: PackageInfo): MinimalApp {
return MinimalApp( return MinimalApp(
packageInfo.packageName, packageInfo.packageName,
packageInfo.versionName ?: "",
PackageInfoCompat.getLongVersionCode(packageInfo).toInt(), PackageInfoCompat.getLongVersionCode(packageInfo).toInt(),
packageInfo.applicationInfo!!.loadLabel(context.packageManager).toString() packageInfo.applicationInfo!!.loadLabel(context.packageManager).toString(),
PackageUtil.getIconForPackage(context, packageInfo.packageName)
) )
} }
} }

View File

@@ -20,9 +20,7 @@
package com.aurora.store.view.epoxy.views package com.aurora.store.view.epoxy.views
import android.content.Context import android.content.Context
import android.content.pm.PackageInfo
import android.util.AttributeSet import android.util.AttributeSet
import androidx.core.content.pm.PackageInfoCompat
import coil3.load import coil3.load
import coil3.request.placeholder import coil3.request.placeholder
import coil3.request.transformations import coil3.request.transformations
@@ -31,30 +29,29 @@ import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.model.MinimalApp
import com.aurora.store.databinding.ViewPackageBinding import com.aurora.store.databinding.ViewPackageBinding
import com.aurora.store.util.PackageUtil
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseModel::class baseModelClass = BaseModel::class
) )
class PackageInfoView @JvmOverloads constructor( class InstalledAppView @JvmOverloads constructor(
context: Context?, context: Context?,
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyleAttr: Int = 0 defStyleAttr: Int = 0
) : BaseView<ViewPackageBinding>(context, attrs, defStyleAttr) { ) : BaseView<ViewPackageBinding>(context, attrs, defStyleAttr) {
@ModelProp(options = [ModelProp.Option.IgnoreRequireHashCode]) @ModelProp(options = [ModelProp.Option.IgnoreRequireHashCode])
fun packageInfo(packageInfo: PackageInfo) { fun packageInfo(app: MinimalApp) {
val appInfo = packageInfo.applicationInfo!! binding.imgIcon.load(app.icon) {
binding.imgIcon.load(PackageUtil.getIconForPackage(context, appInfo.packageName)) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(25F)) transformations(RoundedCornersTransformation(25F))
} }
binding.txtLine1.text = appInfo.loadLabel(context.packageManager) binding.txtLine1.text = app.displayName
binding.txtLine2.text = appInfo.packageName binding.txtLine2.text = app.packageName
binding.txtLine3.text = ("${packageInfo.versionName}.${PackageInfoCompat.getLongVersionCode(packageInfo)}") binding.txtLine3.text = ("${app.versionName} (${app.versionCode})")
} }
@CallbackProp @CallbackProp

View File

@@ -19,7 +19,6 @@
package com.aurora.store.view.ui.all package com.aurora.store.view.ui.all
import android.content.pm.PackageInfo
import android.os.Bundle import android.os.Bundle
import android.text.Editable import android.text.Editable
import android.text.TextWatcher import android.text.TextWatcher
@@ -32,7 +31,7 @@ import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.data.model.MinimalApp import com.aurora.store.data.model.MinimalApp
import com.aurora.store.databinding.FragmentGenericWithSearchBinding import com.aurora.store.databinding.FragmentGenericWithSearchBinding
import com.aurora.store.view.epoxy.views.HeaderViewModel_ import com.aurora.store.view.epoxy.views.HeaderViewModel_
import com.aurora.store.view.epoxy.views.PackageInfoViewModel_ import com.aurora.store.view.epoxy.views.InstalledAppViewModel_
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.viewmodel.all.InstalledViewModel import com.aurora.store.viewmodel.all.InstalledViewModel
@@ -79,8 +78,7 @@ class AppsGamesFragment : BaseFragment<FragmentGenericWithSearchBinding>() {
updateController(viewModel.packages.value) updateController(viewModel.packages.value)
} else { } else {
val filteredPackages = viewModel.packages.value?.filter { val filteredPackages = viewModel.packages.value?.filter {
it.applicationInfo!!.loadLabel(requireContext().packageManager) it.displayName.contains(s, true) || it.packageName.contains(s, true)
.contains(s, true) || it.packageName.contains(s, true)
} }
updateController(filteredPackages) updateController(filteredPackages)
} }
@@ -98,7 +96,7 @@ class AppsGamesFragment : BaseFragment<FragmentGenericWithSearchBinding>() {
} }
} }
private fun updateController(packages: List<PackageInfo>?) { private fun updateController(packages: List<MinimalApp>?) {
binding.recycler.withModels { binding.recycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
if (packages == null) { if (packages == null) {
@@ -116,12 +114,17 @@ class AppsGamesFragment : BaseFragment<FragmentGenericWithSearchBinding>() {
) )
packages.forEach { app -> packages.forEach { app ->
add( add(
PackageInfoViewModel_() InstalledAppViewModel_()
.id(app.packageName.hashCode()) .id(app.packageName.hashCode())
.packageInfo(app) .packageInfo(app)
.click { _ -> openDetailsFragment(app.packageName) } .click { _ ->
openDetailsFragment(
app.packageName,
MinimalApp.toApp(app)
)
}
.longClick { _ -> .longClick { _ ->
openAppMenuSheet(MinimalApp.fromPackageInfo(requireContext(), app)) openAppMenuSheet(app)
false false
} }
) )

View File

@@ -24,6 +24,7 @@ import android.content.pm.PackageInfo
import android.util.Log import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.aurora.store.data.model.MinimalApp
import com.aurora.store.util.PackageUtil import com.aurora.store.util.PackageUtil
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -40,7 +41,7 @@ class InstalledViewModel @Inject constructor(
private val TAG = InstalledViewModel::class.java.simpleName private val TAG = InstalledViewModel::class.java.simpleName
private val _packages = MutableStateFlow<List<PackageInfo>?>(null) private val _packages = MutableStateFlow<List<MinimalApp>?>(null)
val packages = _packages.asStateFlow() val packages = _packages.asStateFlow()
init { init {
@@ -51,6 +52,7 @@ class InstalledViewModel @Inject constructor(
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
try { try {
_packages.value = PackageUtil.getAllValidPackages(context) _packages.value = PackageUtil.getAllValidPackages(context)
.map { MinimalApp.fromPackageInfo(context, it) }
} catch (exception: Exception) { } catch (exception: Exception) {
Log.e(TAG, "Failed to fetch apps", exception) Log.e(TAG, "Failed to fetch apps", exception)
} }