Updated developer section to be horizontally scrollable instead of vertically

In order to make room for more information
This commit is contained in:
Viktor De Pasquale 2019-10-26 12:41:34 +02:00
parent 5f4718cd13
commit df3a37b0a3
7 changed files with 175 additions and 216 deletions

View File

@ -10,7 +10,7 @@ sealed class HomeItem : ComparableRvItem<HomeItem>() {
abstract val title: Int abstract val title: Int
abstract val link: String abstract val link: String
override val layoutRes = R.layout.item_developer override val layoutRes = R.layout.item_developer_link
override fun contentSameAs(other: HomeItem) = itemSameAs(other) override fun contentSameAs(other: HomeItem) = itemSameAs(other)
override fun itemSameAs(other: HomeItem) = this == other override fun itemSameAs(other: HomeItem) = this == other
@ -20,6 +20,9 @@ sealed class HomeItem : ComparableRvItem<HomeItem>() {
return icon == other.icon && title == other.title && link == other.link return icon == other.icon && title == other.title && link == other.link
} }
override fun hashCode() =
icon.hashCode() + title.hashCode() + link.hashCode() + layoutRes.hashCode()
// region Children // region Children
sealed class PayPal : HomeItem() { sealed class PayPal : HomeItem() {
override val icon = R.drawable.ic_paypal override val icon = R.drawable.ic_paypal
@ -72,3 +75,47 @@ sealed class HomeItem : ComparableRvItem<HomeItem>() {
} }
// endregion // endregion
} }
sealed class DeveloperItem : ComparableRvItem<DeveloperItem>() {
abstract val items: List<HomeItem>
abstract val icon: Int
abstract val name: Int
override val layoutRes = R.layout.item_developer
override fun contentSameAs(other: DeveloperItem) = itemSameAs(other)
override fun itemSameAs(other: DeveloperItem) = this == other
override fun equals(other: Any?): Boolean {
if (other !is DeveloperItem) return false
return icon == other.icon && name == other.name && items == other.items
}
override fun hashCode() =
icon.hashCode() + name.hashCode() + items.hashCode() + layoutRes.hashCode()
//region Children
object Mainline : DeveloperItem() {
override val items =
listOf(HomeItem.PayPal.Mainline, HomeItem.Patreon, HomeItem.Twitter.Mainline)
override val icon = R.drawable.ic_mainline_dev
override val name = R.string.home_links_mainline
}
object App : DeveloperItem() {
override val items =
listOf(HomeItem.PayPal.App, HomeItem.Twitter.App)
override val icon = R.drawable.ic_mainline_dev
override val name = R.string.home_links_app
}
object Project : DeveloperItem() {
override val items =
listOf(HomeItem.Github, HomeItem.Xda)
override val icon = R.drawable.ic_project
override val name = R.string.home_links_project
}
//endregion
}

View File

@ -1,6 +1,9 @@
package com.topjohnwu.magisk.redesign.home package com.topjohnwu.magisk.redesign.home
import android.graphics.Insets import android.graphics.Insets
import android.os.Bundle
import android.view.View
import androidx.recyclerview.widget.LinearSnapHelper
import com.topjohnwu.magisk.R import com.topjohnwu.magisk.R
import com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding import com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding
import com.topjohnwu.magisk.redesign.compat.CompatFragment import com.topjohnwu.magisk.redesign.compat.CompatFragment
@ -17,4 +20,9 @@ class HomeFragment : CompatFragment<HomeViewModel, FragmentHomeMd2Binding>() {
super.onStart() super.onStart()
activity.title = resources.getString(R.string.section_home) activity.title = resources.getString(R.string.section_home)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
LinearSnapHelper().attachToRecyclerView(binding.homeSupportList)
}
} }

View File

@ -13,6 +13,7 @@ import com.topjohnwu.magisk.model.entity.ManagerJson
import com.topjohnwu.magisk.model.entity.UpdateInfo import com.topjohnwu.magisk.model.entity.UpdateInfo
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Magisk import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Magisk
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Manager import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Manager
import com.topjohnwu.magisk.model.entity.recycler.DeveloperItem
import com.topjohnwu.magisk.model.entity.recycler.HomeItem import com.topjohnwu.magisk.model.entity.recycler.HomeItem
import com.topjohnwu.magisk.model.events.OpenInappLinkEvent import com.topjohnwu.magisk.model.events.OpenInappLinkEvent
import com.topjohnwu.magisk.model.events.dialog.EnvFixDialog import com.topjohnwu.magisk.model.events.dialog.EnvFixDialog
@ -67,15 +68,13 @@ class HomeViewModel(
} }
} }
val itemsMainline = val items = listOf(DeveloperItem.Mainline, DeveloperItem.App, DeveloperItem.Project)
listOf(HomeItem.PayPal.Mainline, HomeItem.Patreon, HomeItem.Twitter.Mainline)
val itemsApp =
listOf(HomeItem.PayPal.App, HomeItem.Twitter.App)
val itemsProject =
listOf(HomeItem.Github, HomeItem.Xda)
val itemBinding = itemBindingOf<HomeItem> { val itemBinding = itemBindingOf<HomeItem> {
it.bindExtra(BR.viewModel, this) it.bindExtra(BR.viewModel, this)
} }
val itemDeveloperBinding = itemBindingOf<DeveloperItem> {
it.bindExtra(BR.viewModel, this)
}
private var shownDialog = false private var shownDialog = false

View File

@ -5,6 +5,8 @@
<data> <data>
<import type="com.topjohnwu.magisk.R" />
<import type="com.topjohnwu.magisk.Info" /> <import type="com.topjohnwu.magisk.Info" />
<import type="com.topjohnwu.magisk.BuildConfig" /> <import type="com.topjohnwu.magisk.BuildConfig" />
@ -29,9 +31,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clipToPadding="false" android:clipToPadding="false"
android:orientation="vertical" android:orientation="vertical">
android:paddingStart="@dimen/l1"
android:paddingEnd="@dimen/l1">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -272,186 +272,20 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_support_list"
dividerHorizontal="@{R.drawable.divider_l1}"
itemBinding="@{viewModel.itemDeveloperBinding}"
items="@{viewModel.items}"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/l2"> android:layout_marginTop="@dimen/l2"
android:clipToPadding="false"
<androidx.appcompat.widget.AppCompatImageView android:orientation="horizontal"
android:id="@+id/support_icon_mainline" android:paddingStart="@dimen/l1"
style="?styleIconNormal" android:paddingEnd="@dimen/l1"
android:padding="@dimen/l_50" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent" tools:listitem="@layout/item_developer" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_mainline_dev" />
<com.google.android.material.card.MaterialCardView
style="?styleCardNormal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/l1"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@+id/support_icon_mainline"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/l1">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="\@topjohnwu"
android:textAppearance="?appearanceTextCaptionNormal"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<androidx.recyclerview.widget.RecyclerView
itemBinding="@{viewModel.itemBinding}"
items="@{viewModel.itemsMainline}"
nestedScrollingEnabled="@{false}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:fadingEdgeLength="@dimen/l1"
android:orientation="horizontal"
android:paddingTop="@dimen/l1"
android:requiresFadingEdge="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_developer" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/l1">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/support_icon_app"
style="?styleIconNormal"
android:padding="@dimen/l_50"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_app_dev" />
<com.google.android.material.card.MaterialCardView
style="?styleCardNormal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/l1"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/support_icon_app"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/l1">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="\@diareuse"
android:textAppearance="?appearanceTextCaptionNormal"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<androidx.recyclerview.widget.RecyclerView
itemBinding="@{viewModel.itemBinding}"
items="@{viewModel.itemsApp}"
nestedScrollingEnabled="@{false}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:fadingEdgeLength="@dimen/l1"
android:orientation="horizontal"
android:paddingTop="@dimen/l1"
android:requiresFadingEdge="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:reverseLayout="true"
tools:listitem="@layout/item_developer" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/l1">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/support_icon_common"
style="?styleIconNormal"
android:padding="@dimen/l_50"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_project" />
<com.google.android.material.card.MaterialCardView
style="?styleCardNormal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/l1"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@+id/support_icon_common"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/l1">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/home_links_project"
android:textAppearance="?appearanceTextCaptionNormal"
android:textStyle="bold" />
<androidx.recyclerview.widget.RecyclerView
itemBinding="@{viewModel.itemBinding}"
items="@{viewModel.itemsProject}"
nestedScrollingEnabled="@{false}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:fadingEdgeLength="@dimen/l1"
android:orientation="horizontal"
android:paddingTop="@dimen/l1"
android:requiresFadingEdge="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_developer" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -7,7 +7,7 @@
<variable <variable
name="item" name="item"
type="com.topjohnwu.magisk.model.entity.recycler.HomeItem" /> type="com.topjohnwu.magisk.model.entity.recycler.DeveloperItem" />
<variable <variable
name="viewModel" name="viewModel"
@ -18,41 +18,62 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?selectableItemBackground" tools:layout_gravity="center|start">
android:onClick="@{() -> viewModel.onLinkPressed(item.link)}"
tools:layout_gravity="center"
android:padding="@dimen/l_50">
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/developer_link" android:id="@+id/developer_icon"
style="?styleImageNormal" style="?styleIconNormal"
app:tint="?colorOnSurface" android:padding="@dimen/l_50"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@{item.icon}" app:srcCompat="@{item.icon}"
tools:srcCompat="@drawable/ic_paypal" /> app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@drawable/ic_mainline_dev" />
<androidx.appcompat.widget.AppCompatTextView <com.google.android.material.card.MaterialCardView
android:id="@+id/developer_link_name" style="?styleCardNormal"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/l_50" android:layout_marginStart="@dimen/l1"
android:text="@{item.title}" app:layout_constrainedWidth="true"
android:textAppearance="?appearanceTextCaptionNormal" app:layout_constraintBottom_toBottomOf="parent"
android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0"
app:layout_constraintTop_toBottomOf="@+id/developer_link" app:layout_constraintStart_toEndOf="@+id/developer_icon"
tools:text="Paypal" /> app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView <LinearLayout
style="?styleImageSmall" android:layout_width="match_parent"
android:layout_height="14sp" android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@+id/developer_link_name" android:orientation="vertical"
app:layout_constraintStart_toEndOf="@+id/developer_link_name" android:padding="@dimen/l1">
app:layout_constraintTop_toTopOf="@+id/developer_link_name"
app:srcCompat="@drawable/ic_more" <androidx.appcompat.widget.AppCompatTextView
app:tint="?colorTextTransient" /> android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{item.name}"
android:textAppearance="?appearanceTextCaptionNormal"
android:textStyle="bold"
tools:text="\@topjohnwu" />
<androidx.recyclerview.widget.RecyclerView
itemBinding="@{viewModel.itemBinding}"
items="@{item.items}"
nestedScrollingEnabled="@{false}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:fadingEdgeLength="@dimen/l1"
android:orientation="horizontal"
android:paddingTop="@dimen/l_50"
android:requiresFadingEdge="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:itemCount="3"
tools:listitem="@layout/item_developer_link" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="item"
type="com.topjohnwu.magisk.model.entity.recycler.HomeItem" />
<variable
name="viewModel"
type="com.topjohnwu.magisk.redesign.home.HomeViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:onClick="@{() -> viewModel.onLinkPressed(item.link)}"
android:padding="@dimen/l_50"
tools:layout_gravity="center">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/developer_link"
style="?styleImageSmall"
app:layout_constraintEnd_toStartOf="@+id/developer_more"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@{item.icon}"
app:tint="?colorOnSurface"
tools:srcCompat="@drawable/ic_paypal" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/developer_more"
style="?styleImageSmall"
android:layout_height="14sp"
app:layout_constraintBottom_toBottomOf="@+id/developer_link"
app:layout_constraintStart_toEndOf="@+id/developer_link"
app:layout_constraintTop_toTopOf="@+id/developer_link"
app:srcCompat="@drawable/ic_more"
app:tint="?colorTextTransient" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@ -19,6 +19,8 @@
<string name="obsolete_md2">can be updated!</string> <string name="obsolete_md2">can be updated!</string>
<string name="loading_md2">is loading…</string> <string name="loading_md2">is loading…</string>
<string name="home_links_mainline">\@topjohnwu</string>
<string name="home_links_app">\@diareuse</string>
<string name="home_links_project">Project links</string> <string name="home_links_project">Project links</string>
<string name="home_item_paypal">PayPal</string> <string name="home_item_paypal">PayPal</string>
<string name="home_item_patreon">Patreon</string> <string name="home_item_patreon">Patreon</string>