AppDetails: Update header layout to better show unknown apps
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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<SharedLibraryInfo> {
|
||||
return if (isTAndAbove) {
|
||||
context.packageManager.getSharedLibraries(PackageInfoFlags.of(flags.toLong()))
|
||||
|
||||
@@ -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<FragmentDetailsBinding>() {
|
||||
}
|
||||
|
||||
// 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<FragmentDetailsBinding>() {
|
||||
}
|
||||
}
|
||||
|
||||
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<FragmentDetailsBinding>() {
|
||||
)
|
||||
}
|
||||
|
||||
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 = " • "))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user