Update: Merge Header and ReleaseInfo into AppInfo

This commit is contained in:
machiav3lli 2021-11-15 02:03:00 +01:00
parent 3ebee7a199
commit 84a993df5f
4 changed files with 255 additions and 254 deletions

View File

@ -91,7 +91,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
data class Downloading(val read: Long, val total: Long?) : Status() data class Downloading(val read: Long, val total: Long?) : Status()
} }
enum class ViewType { HEADER, RELEASE_INFO, SWITCH, SECTION, EXPAND, TEXT, LINK, PERMISSIONS, SCREENSHOT, RELEASE, EMPTY } enum class ViewType { APP_INFO, SWITCH, SECTION, EXPAND, TEXT, LINK, PERMISSIONS, SCREENSHOT, RELEASE, EMPTY }
private enum class SwitchType(val titleResId: Int) { private enum class SwitchType(val titleResId: Int) {
IGNORE_ALL_UPDATES(R.string.ignore_all_updates), IGNORE_ALL_UPDATES(R.string.ignore_all_updates),
@ -132,20 +132,12 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
abstract val descriptor: String abstract val descriptor: String
abstract val viewType: ViewType abstract val viewType: ViewType
class HeaderItem(val repository: Repository, val product: Product) : Item() { class AppInfoItem(val repository: Repository, val product: Product) : Item() {
override val descriptor: String override val descriptor: String
get() = "header" get() = "app_info.${product.name}"
override val viewType: ViewType override val viewType: ViewType
get() = ViewType.HEADER get() = ViewType.APP_INFO
}
object ReleaseInfoItem : Item() {
override val descriptor: String
get() = "release_item"
override val viewType: ViewType
get() = ViewType.RELEASE_INFO
} }
class SwitchItem( class SwitchItem(
@ -325,7 +317,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
private enum class Payload { REFRESH, STATUS } private enum class Payload { REFRESH, STATUS }
private class HeaderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private class AppInfoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val icon = itemView.findViewById<ShapeableImageView>(R.id.icon)!! val icon = itemView.findViewById<ShapeableImageView>(R.id.icon)!!
val name = itemView.findViewById<MaterialTextView>(R.id.name)!! val name = itemView.findViewById<MaterialTextView>(R.id.name)!!
val packageName = itemView.findViewById<MaterialTextView>(R.id.package_name)!! val packageName = itemView.findViewById<MaterialTextView>(R.id.package_name)!!
@ -351,9 +343,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
this.progressIcon = progressIcon this.progressIcon = progressIcon
this.defaultIcon = defaultIcon this.defaultIcon = defaultIcon
} }
}
private class ReleaseInfoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val targetBlock = itemView.findViewById<LinearLayoutCompat>(R.id.sdk_block)!! val targetBlock = itemView.findViewById<LinearLayoutCompat>(R.id.sdk_block)!!
val divider1 = itemView.findViewById<MaterialDivider>(R.id.divider1)!! val divider1 = itemView.findViewById<MaterialDivider>(R.id.divider1)!!
val targetSdk = itemView.findViewById<MaterialTextView>(R.id.sdk)!! val targetSdk = itemView.findViewById<MaterialTextView>(R.id.sdk)!!
@ -669,7 +659,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
items.clear() items.clear()
if (productRepository != null) { if (productRepository != null) {
items += Item.HeaderItem(productRepository.second, productRepository.first) items += Item.AppInfoItem(productRepository.second, productRepository.first)
if (installedItem != null) { if (installedItem != null) {
items.add( items.add(
@ -722,7 +712,6 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
return if (length >= 0) subSequence(0, length) else null return if (length >= 0) subSequence(0, length) else null
} }
items.add(Item.ReleaseInfoItem)
val screenshotItems = productRepository.first.screenshots val screenshotItems = productRepository.first.screenshots
.map { Item.ScreenshotItem(productRepository.second, packageName, it) } .map { Item.ScreenshotItem(productRepository.second, packageName, it) }
if (screenshotItems.isNotEmpty()) { if (screenshotItems.isNotEmpty()) {
@ -970,7 +959,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
val translate = this.action == null || action == null || val translate = this.action == null || action == null ||
this.action == Action.CANCEL || action == Action.CANCEL this.action == Action.CANCEL || action == Action.CANCEL
this.action = action this.action = action
val index = items.indexOfFirst { it is Item.HeaderItem } val index = items.indexOfFirst { it is Item.AppInfoItem }
if (index >= 0) { if (index >= 0) {
if (translate) { if (translate) {
notifyItemChanged(index) notifyItemChanged(index)
@ -987,7 +976,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
val translate = (this.status == null) != (status == null) val translate = (this.status == null) != (status == null)
if (this.status != status) { if (this.status != status) {
this.status = status this.status = status
val index = items.indexOfFirst { it is Item.HeaderItem } val index = items.indexOfFirst { it is Item.AppInfoItem }
if (index >= 0) { if (index >= 0) {
if (translate) { if (translate) {
notifyItemChanged(index) notifyItemChanged(index)
@ -1015,10 +1004,9 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
viewType: ViewType, viewType: ViewType,
): RecyclerView.ViewHolder { ): RecyclerView.ViewHolder {
return when (viewType) { return when (viewType) {
ViewType.HEADER -> HeaderViewHolder(parent.inflate(R.layout.product_header_item)).apply { ViewType.APP_INFO -> AppInfoViewHolder(parent.inflate(R.layout.item_app_info_x)).apply {
action.setOnClickListener { this@ProductAdapter.action?.let(callbacks::onActionClick) } action.setOnClickListener { this@ProductAdapter.action?.let(callbacks::onActionClick) }
} }
ViewType.RELEASE_INFO -> ReleaseInfoViewHolder(parent.inflate(R.layout.release_info))
ViewType.SWITCH -> SwitchViewHolder(parent.inflate(R.layout.switch_item)).apply { ViewType.SWITCH -> SwitchViewHolder(parent.inflate(R.layout.switch_item)).apply {
itemView.setOnClickListener { itemView.setOnClickListener {
val switchItem = items[adapterPosition] as Item.SwitchItem val switchItem = items[adapterPosition] as Item.SwitchItem
@ -1037,7 +1025,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
} }
ProductPreferences[switchItem.packageName] = productPreference ProductPreferences[switchItem.packageName] = productPreference
items.asSequence().mapIndexedNotNull { index, item -> items.asSequence().mapIndexedNotNull { index, item ->
if (item is Item.HeaderItem || if (item is Item.AppInfoItem ||
item is Item.SectionItem item is Item.SectionItem
) index else null ) index else null
}.forEach { notifyItemChanged(it, Payload.REFRESH) } }.forEach { notifyItemChanged(it, Payload.REFRESH) }
@ -1168,9 +1156,9 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
val context = holder.itemView.context val context = holder.itemView.context
val item = items[position] val item = items[position]
when (getItemEnumViewType(position)) { when (getItemEnumViewType(position)) {
ViewType.HEADER -> { ViewType.APP_INFO -> {
holder as HeaderViewHolder holder as AppInfoViewHolder
item as Item.HeaderItem item as Item.AppInfoItem
val updateStatus = Payload.STATUS in payloads val updateStatus = Payload.STATUS in payloads
val updateAll = !updateStatus val updateAll = !updateStatus
if (updateAll) { if (updateAll) {
@ -1241,11 +1229,6 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
}::class }::class
} }
} }
Unit
}
ViewType.RELEASE_INFO -> {
holder as ReleaseInfoViewHolder
item as Item.ReleaseInfoItem
val imageSource = product?.source?.trimAfter('/', 4).plus(".png").toUri() val imageSource = product?.source?.trimAfter('/', 4).plus(".png").toUri()
val sdk = product?.displayRelease?.targetSdkVersion val sdk = product?.displayRelease?.targetSdkVersion

View File

@ -0,0 +1,242 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="4dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/header_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="12dp"
android:layout_marginVertical="4dp"
android:background="@drawable/background_border"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@id/status_layout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="8dp">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/icon"
android:layout_width="64dp"
android:layout_height="64dp"
app:shapeAppearanceOverlay="@style/Shape.Medium"
tools:ignore="ContentDescription" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/text_margin"
android:layout_weight="1"
android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?textAppearanceBody1" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/package_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?textAppearanceBody2"
android:textColor="?android:attr/textColorSecondary" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/release_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/header_info">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/sdk_block"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/target"
android:textColor="?android:textColorPrimary"
android:textSize="14sp" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/sdk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textSize="16sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.divider.MaterialDivider
android:id="@+id/divider1"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_marginVertical="12dp" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/version_block"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/version"
android:textColor="?android:attr/textColorPrimary"
android:textSize="14sp" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textSize="16sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.divider.MaterialDivider
android:id="@+id/divider2"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_marginVertical="12dp" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/size_block"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/size"
android:textColor="?android:textColorPrimary"
android:textSize="14sp" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textSize="16sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.divider.MaterialDivider
android:id="@+id/divider3"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_marginVertical="12dp" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/dev_block"
style="?attr/materialCardViewElevatedStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="4dp"
android:layout_weight="1">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/divider3"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/dev_icon"
android:layout_width="35dp"
android:layout_height="35dp"
app:shapeAppearanceOverlay="@style/Shape.Small"
app:srcCompat="@drawable/ic_code" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/dev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</com.google.android.material.card.MaterialCardView>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/status_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingHorizontal="12dp"
android:paddingBottom="4dp"
app:layout_constraintBottom_toTopOf="@id/action"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/header_info">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:singleLine="true"
android:textColor="?android:attr/textColorSecondary"
android:textSize="12sp" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progress"
style="@style/Theme.Progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.button.MaterialButton
android:id="@+id/action"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginHorizontal="12dp"
app:iconGravity="textStart"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/status_layout"
app:shapeAppearanceOverlay="@style/PillShapeAppearance" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="12dp"
android:paddingBottom="4dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="12dp"
android:paddingBottom="8dp">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/icon"
android:layout_width="64dp"
android:layout_height="64dp"
app:shapeAppearanceOverlay="@style/Shape.Medium"
tools:ignore="ContentDescription" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/text_margin"
android:layout_weight="1"
android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?textAppearanceBody1" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/package_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?textAppearanceBody2"
android:textColor="?android:attr/textColorSecondary" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/status_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingHorizontal="12dp"
android:paddingBottom="4dp">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:singleLine="true"
android:textColor="?android:attr/textColorSecondary"
android:textSize="12sp" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progress"
style="@style/Theme.Progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.button.MaterialButton
android:id="@+id/action"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginHorizontal="12dp"
app:iconGravity="textStart"
app:shapeAppearanceOverlay="@style/PillShapeAppearance" />
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@ -1,139 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="12dp"
android:layout_marginVertical="4dp"
android:background="@drawable/background_border"
android:gravity="center"
android:orientation="horizontal">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/sdk_block"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/target"
android:textColor="?android:textColorPrimary"
android:textSize="14sp" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/sdk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textSize="16sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.divider.MaterialDivider
android:id="@+id/divider1"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_marginVertical="12dp" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/version_block"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/version"
android:textColor="?android:attr/textColorPrimary"
android:textSize="14sp" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textSize="16sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.divider.MaterialDivider
android:id="@+id/divider2"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_marginVertical="12dp" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/size_block"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/size"
android:textColor="?android:textColorPrimary"
android:textSize="14sp" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textSize="16sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.divider.MaterialDivider
android:id="@+id/divider3"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_marginVertical="12dp" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/dev_block"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="4dp"
android:layout_weight="1"
style="?attr/materialCardViewElevatedStyle">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/divider3"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/dev_icon"
android:layout_width="35dp"
android:layout_height="35dp"
app:shapeAppearanceOverlay="@style/Shape.Small"
app:srcCompat="@drawable/ic_code" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/dev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</com.google.android.material.card.MaterialCardView>
</androidx.appcompat.widget.LinearLayoutCompat>