diff --git a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailAdapter.kt b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailAdapter.kt index daad5916e..d61eb2584 100644 --- a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailAdapter.kt +++ b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailAdapter.kt @@ -446,6 +446,7 @@ class AppDetailAdapter(private val callbacks: Callbacks) : private class InstallButtonViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val button = itemView.findViewById(R.id.action)!! + val incompatibleText = itemView.findViewById(R.id.incompatible_text)!! val actionTintNormal = button.context.getColorFromAttr(android.R.attr.colorPrimary) val actionTintOnNormal = button.context.getColorFromAttr(MaterialR.attr.colorOnPrimary) @@ -1120,6 +1121,15 @@ class AppDetailAdapter(private val callbacks: Callbacks) : field = value } + var incompatibilityReason: CharSequence? = null + set(value) { + if (field != value) { + field = value + val index = items.indexOf(Item.InstallButtonItem) + if (index > 0) notifyItemChanged(index) + } + } + var status: Status = Status.Idle set(value) { if (field != value) { @@ -1437,6 +1447,10 @@ class AppDetailAdapter(private val callbacks: Callbacks) : ViewType.INSTALL_BUTTON -> { holder as InstallButtonViewHolder item as Item.InstallButtonItem + + holder.incompatibleText.isVisible = incompatibilityReason != null + holder.incompatibleText.text = incompatibilityReason ?: "" + val action = action holder.button.apply { isEnabled = action != null diff --git a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailFragment.kt b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailFragment.kt index 0bc804de8..14135688a 100644 --- a/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailFragment.kt +++ b/app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailFragment.kt @@ -48,6 +48,8 @@ import com.looker.droidify.utility.common.extension.isSystemApplication import com.looker.droidify.utility.common.extension.systemBarsPadding import com.looker.droidify.utility.common.extension.updateAsMutable import com.looker.droidify.utility.common.shareUrl +import com.looker.droidify.utility.extension.android.Android.name +import com.looker.droidify.utility.extension.android.Android.primaryPlatform import com.looker.droidify.utility.extension.mainActivity import com.looker.droidify.utility.extension.startUpdate import com.stfalcon.imageviewer.StfalconImageViewer @@ -249,6 +251,40 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks { val canLaunch = product != null && installed != null && installed.launcherActivities.isNotEmpty() + val incompatibilityReason = if (product != null) { + val selectedRelease = product.selectedReleases.firstOrNull() + val incompatibility = selectedRelease?.incompatibilities?.firstOrNull() + val installedItem = installed?.installedItem + + when { + incompatibility != null -> { + when (incompatibility) { + is Release.Incompatibility.MinSdk, + is Release.Incompatibility.MaxSdk -> getString( + stringRes.incompatible_with_FORMAT, + name + ) + is Release.Incompatibility.Platform -> getString( + stringRes.incompatible_with_FORMAT, + primaryPlatform ?: getString(stringRes.unknown) + ) + is Release.Incompatibility.Feature -> getString( + stringRes.requires_FORMAT, + incompatibility.feature + ) + } + } + installedItem != null && selectedRelease != null && installedItem.signature != selectedRelease.signature -> { + getString(stringRes.incompatible_signature_DESC) + } + else -> null + } + } else { + null + } + + (recyclerView?.adapter as? AppDetailAdapter)?.incompatibilityReason = incompatibilityReason + val actions = buildSet { if (canInstall) add(Action.INSTALL) if (canUpdate) add(Action.UPDATE) diff --git a/app/src/main/res/layout/install_button.xml b/app/src/main/res/layout/install_button.xml index ba392681d..791f1250a 100644 --- a/app/src/main/res/layout/install_button.xml +++ b/app/src/main/res/layout/install_button.xml @@ -1,8 +1,28 @@ - \ No newline at end of file + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingHorizontal="16dp" + android:paddingVertical="8dp"> + + + + + +