diff --git a/app/src/main/java/com/aurora/extensions/View.kt b/app/src/main/java/com/aurora/extensions/View.kt index c7ca5629c..5296bfd12 100644 --- a/app/src/main/java/com/aurora/extensions/View.kt +++ b/app/src/main/java/com/aurora/extensions/View.kt @@ -21,6 +21,7 @@ package com.aurora.extensions import android.view.View import android.view.inputmethod.InputMethodManager +import android.widget.TextView import androidx.core.content.getSystemService fun View.isVisible() = visibility == View.VISIBLE @@ -51,3 +52,13 @@ fun View.hideKeyboard(): Boolean { } return false } + + +fun TextView.updateText(text: String?) { + if (text.isNullOrEmpty()) { + hide() + } else { + show() + this.text = text + } +} \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/util/PackageUtil.kt b/app/src/main/java/com/aurora/store/util/PackageUtil.kt index 631b92f3e..e3491cc3b 100644 --- a/app/src/main/java/com/aurora/store/util/PackageUtil.kt +++ b/app/src/main/java/com/aurora/store/util/PackageUtil.kt @@ -27,11 +27,13 @@ import android.content.pm.PackageManager import android.content.pm.PackageManager.PackageInfoFlags import android.content.pm.SharedLibraryInfo import android.graphics.Bitmap +import android.graphics.drawable.Drawable import android.net.Uri import android.os.Build import android.provider.Settings import android.util.Log import androidx.annotation.RequiresApi +import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.pm.PackageInfoCompat import androidx.core.graphics.drawable.toBitmap import com.aurora.extensions.isHuawei @@ -40,6 +42,7 @@ import com.aurora.extensions.isPAndAbove import com.aurora.extensions.isTAndAbove import com.aurora.extensions.isValidApp import com.aurora.store.BuildConfig +import com.aurora.store.R import java.util.Locale 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 { return if (isTAndAbove) { context.packageManager.getSharedLibraries(PackageInfoFlags.of(flags.toLong())) diff --git a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt index 33c528607..31808e92c 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt @@ -40,7 +40,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import coil3.asDrawable import coil3.load -import coil3.request.placeholder +import coil3.request.error import coil3.request.transformations import coil3.transform.CircleCropTransformation import coil3.transform.RoundedCornersTransformation @@ -55,6 +55,7 @@ import com.aurora.extensions.runOnUiThread import com.aurora.extensions.share import com.aurora.extensions.show import com.aurora.extensions.toast +import com.aurora.extensions.updateText import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.StreamBundle @@ -196,7 +197,7 @@ class AppDetailsFragment : BaseFragment() { } // Show the basic app details, while the rest of the data is being fetched - updateAppHeader(app) + updateAppHeader(app, false) // Toolbar attachToolbar(app) @@ -468,20 +469,25 @@ class AppDetailsFragment : BaseFragment() { } } - private fun updateAppHeader(app: App) { + private fun updateAppHeader(app: App, isFullApp: Boolean = true) { 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) { - placeholder(R.drawable.bg_placeholder) + error(fallbackDrawable) transformations(RoundedCornersTransformation(32F)) listener { _, result -> result.image.asDrawable(resources).let { iconDrawable = it } } } - packageName.text = app.packageName - txtLine1.text = app.displayName - txtLine2.text = app.developerName - txtLine3.text = ("${app.versionName} (${app.versionCode})") + packageName.updateText(app.packageName) + txtLine1.updateText(app.displayName) + txtLine2.updateText(app.developerName) + txtLine3.updateText(("${app.versionName} (${app.versionCode})")) txtLine2.setOnClickListener { findNavController().navigate( @@ -490,10 +496,12 @@ class AppDetailsFragment : BaseFragment() { ) } - tags.add(getString((if (app.isFree) R.string.details_free else R.string.details_paid))) - tags.add(getString((if (app.containsAds) R.string.details_contains_ads else R.string.details_no_ads))) - - txtLine4.text = tags.joinToString(separator = " • ") + // Do not show tags for web apps or unknown apps + if (isFullApp) { + tags.add(getString((if (app.isFree) R.string.details_free else R.string.details_paid))) + tags.add(getString((if (app.containsAds) R.string.details_contains_ads else R.string.details_no_ads))) + txtLine4.updateText(tags.joinToString(separator = " • ")) + } } } diff --git a/app/src/main/res/layout/layout_details_app.xml b/app/src/main/res/layout/layout_details_app.xml index 189b4a3a7..9f64b69ad 100644 --- a/app/src/main/res/layout/layout_details_app.xml +++ b/app/src/main/res/layout/layout_details_app.xml @@ -107,6 +107,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/txt_line4" + android:layout_marginTop="@dimen/margin_medium" android:divider="@drawable/divider" android:orientation="horizontal" android:showDividers="middle"> @@ -115,7 +116,6 @@ android:id="@+id/btn_secondary_action" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/margin_small" android:layout_weight="1" android:backgroundTint="?colorError" android:textColor="?colorOnError" @@ -128,7 +128,6 @@ android:id="@+id/btn_primary_action" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/margin_small" android:layout_weight="1" app:cornerRadius="@dimen/radius_small" tools:text="@string/action_install" />