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.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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()))
|
||||||
|
|||||||
@@ -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 = " • "))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
Reference in New Issue
Block a user