AppDetails: Update header layout to better show unknown apps

This commit is contained in:
Rahul Patel
2024-12-15 00:06:46 +05:30
parent c7fefb12c7
commit 5e40f0cb53
4 changed files with 49 additions and 14 deletions

View File

@@ -21,6 +21,7 @@ package com.aurora.extensions
import android.view.View import android.view.View
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.TextView
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
fun View.isVisible() = visibility == View.VISIBLE fun View.isVisible() = visibility == View.VISIBLE
@@ -51,3 +52,13 @@ fun View.hideKeyboard(): Boolean {
} }
return false return false
} }
fun TextView.updateText(text: String?) {
if (text.isNullOrEmpty()) {
hide()
} else {
show()
this.text = text
}
}

View File

@@ -27,11 +27,13 @@ import android.content.pm.PackageManager
import android.content.pm.PackageManager.PackageInfoFlags import android.content.pm.PackageManager.PackageInfoFlags
import android.content.pm.SharedLibraryInfo import android.content.pm.SharedLibraryInfo
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.provider.Settings import android.provider.Settings
import android.util.Log import android.util.Log
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import com.aurora.extensions.isHuawei import com.aurora.extensions.isHuawei
@@ -40,6 +42,7 @@ import com.aurora.extensions.isPAndAbove
import com.aurora.extensions.isTAndAbove import com.aurora.extensions.isTAndAbove
import com.aurora.extensions.isValidApp import com.aurora.extensions.isValidApp
import com.aurora.store.BuildConfig import com.aurora.store.BuildConfig
import com.aurora.store.R
import java.util.Locale import java.util.Locale
object PackageUtil { object PackageUtil {
@@ -235,6 +238,20 @@ object PackageUtil {
} }
} }
fun getIconDrawableForPackage(context: Context, packageName: String): Drawable? {
val placeholder = AppCompatResources.getDrawable(context, R.drawable.bg_placeholder)
return try {
val packageInfo = context.packageManager.getPackageInfo(packageName, 0)
val applicationInfo = packageInfo.applicationInfo ?: return placeholder
applicationInfo.loadIcon(context.packageManager)
} catch (exception: Exception) {
Log.e(TAG, "Failed to get icon for package!", exception)
placeholder
}
}
private fun getAllSharedLibraries(context: Context, flags: Int = 0): List<SharedLibraryInfo> { private fun getAllSharedLibraries(context: Context, flags: Int = 0): List<SharedLibraryInfo> {
return if (isTAndAbove) { return if (isTAndAbove) {
context.packageManager.getSharedLibraries(PackageInfoFlags.of(flags.toLong())) context.packageManager.getSharedLibraries(PackageInfoFlags.of(flags.toLong()))

View File

@@ -40,7 +40,7 @@ import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import coil3.asDrawable import coil3.asDrawable
import coil3.load import coil3.load
import coil3.request.placeholder import coil3.request.error
import coil3.request.transformations import coil3.request.transformations
import coil3.transform.CircleCropTransformation import coil3.transform.CircleCropTransformation
import coil3.transform.RoundedCornersTransformation import coil3.transform.RoundedCornersTransformation
@@ -55,6 +55,7 @@ import com.aurora.extensions.runOnUiThread
import com.aurora.extensions.share import com.aurora.extensions.share
import com.aurora.extensions.show import com.aurora.extensions.show
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.extensions.updateText
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.Review
import com.aurora.gplayapi.data.models.StreamBundle import com.aurora.gplayapi.data.models.StreamBundle
@@ -196,7 +197,7 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
} }
// Show the basic app details, while the rest of the data is being fetched // Show the basic app details, while the rest of the data is being fetched
updateAppHeader(app) updateAppHeader(app, false)
// Toolbar // Toolbar
attachToolbar(app) attachToolbar(app)
@@ -468,20 +469,25 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
} }
} }
private fun updateAppHeader(app: App) { private fun updateAppHeader(app: App, isFullApp: Boolean = true) {
binding.layoutDetailsApp.apply { binding.layoutDetailsApp.apply {
val fallbackDrawable = if (isFullApp)
ContextCompat.getDrawable(requireContext(), R.drawable.bg_placeholder)
else
PackageUtil.getIconDrawableForPackage(requireContext(), app.packageName)
imgIcon.load(app.iconArtwork.url) { imgIcon.load(app.iconArtwork.url) {
placeholder(R.drawable.bg_placeholder) error(fallbackDrawable)
transformations(RoundedCornersTransformation(32F)) transformations(RoundedCornersTransformation(32F))
listener { _, result -> listener { _, result ->
result.image.asDrawable(resources).let { iconDrawable = it } result.image.asDrawable(resources).let { iconDrawable = it }
} }
} }
packageName.text = app.packageName packageName.updateText(app.packageName)
txtLine1.text = app.displayName txtLine1.updateText(app.displayName)
txtLine2.text = app.developerName txtLine2.updateText(app.developerName)
txtLine3.text = ("${app.versionName} (${app.versionCode})") txtLine3.updateText(("${app.versionName} (${app.versionCode})"))
txtLine2.setOnClickListener { txtLine2.setOnClickListener {
findNavController().navigate( findNavController().navigate(
@@ -490,10 +496,12 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
) )
} }
tags.add(getString((if (app.isFree) R.string.details_free else R.string.details_paid))) // Do not show tags for web apps or unknown apps
tags.add(getString((if (app.containsAds) R.string.details_contains_ads else R.string.details_no_ads))) if (isFullApp) {
tags.add(getString((if (app.isFree) R.string.details_free else R.string.details_paid)))
txtLine4.text = tags.joinToString(separator = "") tags.add(getString((if (app.containsAds) R.string.details_contains_ads else R.string.details_no_ads)))
txtLine4.updateText(tags.joinToString(separator = ""))
}
} }
} }

View File

@@ -107,6 +107,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/txt_line4" android:layout_below="@id/txt_line4"
android:layout_marginTop="@dimen/margin_medium"
android:divider="@drawable/divider" android:divider="@drawable/divider"
android:orientation="horizontal" android:orientation="horizontal"
android:showDividers="middle"> android:showDividers="middle">
@@ -115,7 +116,6 @@
android:id="@+id/btn_secondary_action" android:id="@+id/btn_secondary_action"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_small"
android:layout_weight="1" android:layout_weight="1"
android:backgroundTint="?colorError" android:backgroundTint="?colorError"
android:textColor="?colorOnError" android:textColor="?colorOnError"
@@ -128,7 +128,6 @@
android:id="@+id/btn_primary_action" android:id="@+id/btn_primary_action"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_small"
android:layout_weight="1" android:layout_weight="1"
app:cornerRadius="@dimen/radius_small" app:cornerRadius="@dimen/radius_small"
tools:text="@string/action_install" /> tools:text="@string/action_install" />