InstalledApps: Minor tweak
This commit is contained in:
@@ -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)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user