Improve: Fix weird behaviour on scroll

I wonder why nobody noticed but scrolling is weird in App Detail page
This commit is contained in:
LooKeR 2021-11-23 12:15:01 +05:30
parent 64a61da973
commit c6ba8d72ed
3 changed files with 100 additions and 74 deletions

View File

@ -87,7 +87,7 @@ class ProductAdapter(private val callbacks: Callbacks) :
data class Downloading(val read: Long, val total: Long?) : Status() data class Downloading(val read: Long, val total: Long?) : Status()
} }
enum class ViewType { APP_INFO, SWITCH, SECTION, EXPAND, TEXT, LINK, PERMISSIONS, RELEASE, EMPTY } enum class ViewType { APP_INFO, SCREENSHOT, SWITCH, SECTION, EXPAND, TEXT, LINK, PERMISSIONS, 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),
@ -105,7 +105,7 @@ class ProductAdapter(private val callbacks: Callbacks) :
internal enum class ExpandType { internal enum class ExpandType {
NOTHING, DESCRIPTION, CHANGES, NOTHING, DESCRIPTION, CHANGES,
LINKS, DONATES, PERMISSIONS, SCREENSHOTS, VERSIONS LINKS, DONATES, PERMISSIONS, VERSIONS
} }
private enum class TextType { DESCRIPTION, ANTI_FEATURES, CHANGES } private enum class TextType { DESCRIPTION, ANTI_FEATURES, CHANGES }
@ -131,7 +131,6 @@ class ProductAdapter(private val callbacks: Callbacks) :
val repository: Repository, val repository: Repository,
val product: Product, val product: Product,
val packageName: String, val packageName: String,
val screenshots: List<Product.Screenshot>,
) : Item() { ) : Item() {
override val descriptor: String override val descriptor: String
get() = "app_info.${product.name}" get() = "app_info.${product.name}"
@ -140,6 +139,18 @@ class ProductAdapter(private val callbacks: Callbacks) :
get() = ViewType.APP_INFO get() = ViewType.APP_INFO
} }
class ScreenshotItem(
val screenshots: List<Product.Screenshot>,
val packageName: String,
val repository: Repository,
) : Item() {
override val descriptor: String
get() = "screenshot.${screenshots.size}"
override val viewType: ViewType
get() = ViewType.SCREENSHOT
}
class SwitchItem( class SwitchItem(
val switchType: SwitchType, val switchType: SwitchType,
val packageName: String, val packageName: String,
@ -314,12 +325,6 @@ class ProductAdapter(private val callbacks: Callbacks) :
val statusLayout = itemView.findViewById<View>(R.id.status_layout)!! val statusLayout = itemView.findViewById<View>(R.id.status_layout)!!
val status = itemView.findViewById<MaterialTextView>(R.id.status)!! val status = itemView.findViewById<MaterialTextView>(R.id.status)!!
val progress = itemView.findViewById<LinearProgressIndicator>(R.id.progress)!! val progress = itemView.findViewById<LinearProgressIndicator>(R.id.progress)!!
val screenshotsSection =
itemView.findViewById<LinearLayoutCompat>(R.id.screenshots_section)!!
val screenshotsSectionIcon =
itemView.findViewById<ShapeableImageView>(R.id.screenshots_section_icon)!!
val screenshotsView = itemView.findViewById<NestedScrollView>(R.id.screenshots_view)!!
val screenshotsRecycler = itemView.findViewById<RecyclerView>(R.id.screenshots_recycler)!!
val progressIcon: Drawable val progressIcon: Drawable
val defaultIcon: Drawable val defaultIcon: Drawable
@ -346,6 +351,16 @@ class ProductAdapter(private val callbacks: Callbacks) :
val dev = itemView.findViewById<MaterialCardView>(R.id.dev_block)!! val dev = itemView.findViewById<MaterialCardView>(R.id.dev_block)!!
} }
private class ScreenShotViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val screenshotsSection =
itemView.findViewById<LinearLayoutCompat>(R.id.screenshots_section)!!
val screenshotsSectionIcon =
itemView.findViewById<ShapeableImageView>(R.id.screenshots_section_icon)!!
val screenshotsView = itemView.findViewById<NestedScrollView>(R.id.screenshots_view)!!
val screenshotsRecycler = itemView.findViewById<RecyclerView>(R.id.screenshots_recycler)!!
}
private class SwitchViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private class SwitchViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val enabled = itemView.findViewById<SwitchMaterial>(R.id.enabled)!! val enabled = itemView.findViewById<SwitchMaterial>(R.id.enabled)!!
@ -554,8 +569,12 @@ class ProductAdapter(private val callbacks: Callbacks) :
items += Item.AppInfoItem( items += Item.AppInfoItem(
productRepository.second, productRepository.second,
productRepository.first, productRepository.first,
packageName
)
items += Item.ScreenshotItem(
productRepository.first.screenshots,
packageName, packageName,
productRepository.first.screenshots productRepository.second
) )
if (installedItem != null) { if (installedItem != null) {
@ -892,6 +911,7 @@ class ProductAdapter(private val callbacks: Callbacks) :
ViewType.APP_INFO -> AppInfoViewHolder(parent.inflate(R.layout.item_app_info_x)).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.SCREENSHOT -> ScreenShotViewHolder(parent.inflate(R.layout.screenshot_scrollview))
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
@ -1074,25 +1094,6 @@ class ProductAdapter(private val callbacks: Callbacks) :
iconTint = if (action == Action.CANCEL) holder.actionTintOnCancel iconTint = if (action == Action.CANCEL) holder.actionTintOnCancel
else holder.actionTintOnNormal else holder.actionTintOnNormal
} }
if (item.screenshots.isEmpty()) {
holder.screenshotsSection.visibility = View.GONE
holder.screenshotsView.visibility = View.GONE
} else {
holder.screenshotsSection.visibility = View.VISIBLE
holder.screenshotsView.visibility = View.VISIBLE
holder.screenshotsSection.setOnClickListener {
val isExpanded = holder.screenshotsView.visibility == View.VISIBLE
holder.screenshotsSectionIcon.scaleY = if (isExpanded) -1f else 1f
holder.screenshotsView.visibility =
if (isExpanded) View.GONE else View.VISIBLE
}
holder.screenshotsRecycler.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
holder.screenshotsRecycler.adapter =
ScreenshotsAdapter { callbacks.onScreenshotClick(it) }.apply {
setScreenshots(item.repository, item.packageName, item.screenshots)
}
}
} }
if (updateAll || updateStatus) { if (updateAll || updateStatus) {
val status = status val status = status
@ -1165,6 +1166,29 @@ class ProductAdapter(private val callbacks: Callbacks) :
true true
} }
} }
ViewType.SCREENSHOT -> {
holder as ScreenShotViewHolder
item as Item.ScreenshotItem
if (item.screenshots.isEmpty()) {
holder.screenshotsSection.visibility = View.GONE
holder.screenshotsView.visibility = View.GONE
} else {
holder.screenshotsSection.visibility = View.VISIBLE
holder.screenshotsView.visibility = View.VISIBLE
holder.screenshotsSection.setOnClickListener {
val isExpanded = holder.screenshotsView.visibility == View.VISIBLE
holder.screenshotsSectionIcon.scaleY = if (isExpanded) -1f else 1f
holder.screenshotsView.visibility =
if (isExpanded) View.GONE else View.VISIBLE
}
holder.screenshotsRecycler.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
holder.screenshotsRecycler.adapter =
ScreenshotsAdapter { callbacks.onScreenshotClick(it) }.apply {
setScreenshots(item.repository, item.packageName, item.screenshots)
}
}
}
ViewType.SWITCH -> { ViewType.SWITCH -> {
holder as SwitchViewHolder holder as SwitchViewHolder
item as Item.SwitchItem item as Item.SwitchItem

View File

@ -235,54 +235,9 @@
android:layout_height="56dp" android:layout_height="56dp"
android:layout_marginHorizontal="12dp" android:layout_marginHorizontal="12dp"
app:iconGravity="textStart" app:iconGravity="textStart"
app:layout_constraintBottom_toTopOf="@id/screenshots_section"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/status_layout" app:layout_constraintTop_toBottomOf="@id/status_layout"
app:shapeAppearanceOverlay="@style/PillShapeAppearance" /> app:shapeAppearanceOverlay="@style/PillShapeAppearance" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/screenshots_section"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:orientation="horizontal"
android:padding="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/action">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:text="@string/screenshots"
android:textColor="?attr/colorAccent" />
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/screenshots_section_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scaleType="center"
android:src="@drawable/ic_arrow_down"
android:tint="?attr/colorAccent"
tools:ignore="ContentDescription" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.core.widget.NestedScrollView
android:id="@+id/screenshots_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/screenshots_section">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/screenshots_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" />
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/screenshots_section"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/selectableItemBackground"
android:orientation="horizontal"
android:padding="16dp">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:text="@string/screenshots"
android:textColor="?attr/colorAccent" />
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/screenshots_section_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scaleType="center"
android:src="@drawable/ic_arrow_down"
android:tint="?attr/colorAccent"
tools:ignore="ContentDescription" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.core.widget.NestedScrollView
android:id="@+id/screenshots_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/screenshots_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" />
</androidx.core.widget.NestedScrollView>
</androidx.appcompat.widget.LinearLayoutCompat>