From 24f6024383c3b73a54eed72b5fb07aa7f998d72e Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 9 Aug 2020 06:52:02 -0700 Subject: [PATCH] More homescreen UI improvements --- .../magisk/model/entity/DeveloperItem.kt | 84 +++++++++++++ .../magisk/model/entity/recycler/HomeItems.kt | 116 ------------------ .../topjohnwu/magisk/ui/base/CompatHelpers.kt | 3 +- .../topjohnwu/magisk/ui/home/HomeViewModel.kt | 9 +- .../magisk/utils/DataBindingAdapters.kt | 4 +- app/src/main/res/layout/fragment_home_md2.xml | 32 ++--- app/src/main/res/layout/item_developer.xml | 70 ++++------- ..._developer_link.xml => item_icon_link.xml} | 6 +- 8 files changed, 134 insertions(+), 190 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/model/entity/DeveloperItem.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt rename app/src/main/res/layout/{item_developer_link.xml => item_icon_link.xml} (85%) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/DeveloperItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/DeveloperItem.kt new file mode 100644 index 000000000..3046fd7b4 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/DeveloperItem.kt @@ -0,0 +1,84 @@ +package com.topjohnwu.magisk.model.entity + +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.databinding.RvItem + +sealed class DeveloperItem { + + abstract val items: List + abstract val name: Int + + object Main : DeveloperItem() { + override val items = + listOf( + IconLink.Twitter.Main, + IconLink.Patreon, + IconLink.PayPal.Main, + IconLink.Github + ) + override val name get() = R.string.topjohnwu + } + + object App : DeveloperItem() { + override val items = + listOf( + IconLink.Twitter.App, + IconLink.PayPal.App + ) + override val name get() = R.string.diareuse + } +} + +private interface Dev { + val name: String +} + +private interface MainDev: Dev { + override val name get() = "topjohnwu" +} + +private interface AppDev: Dev { + override val name get() = "diareuse" +} + +sealed class IconLink : RvItem() { + + abstract val icon: Int + abstract val title: Int + abstract val link: String + + override val layoutRes get() = R.layout.item_icon_link + + sealed class PayPal : IconLink(), Dev { + override val icon get() = R.drawable.ic_paypal + override val title get() = R.string.paypal + override val link get() = "https://paypal.me/$name" + + object App : PayPal(), AppDev + + object Main : PayPal(), MainDev + } + + object Patreon : IconLink() { + override val icon get() = R.drawable.ic_patreon + override val title get() = R.string.patreon + override val link get() = Const.Url.PATREON_URL + } + + sealed class Twitter : IconLink(), Dev { + override val icon get() = R.drawable.ic_twitter + override val title get() = R.string.twitter + override val link get() = "https://twitter.com/$name" + + object App : Twitter(), AppDev + + object Main : Twitter(), MainDev + } + + object Github : IconLink() { + override val icon get() = R.drawable.ic_github + override val title get() = R.string.home_item_source + override val link get() = Const.Url.SOURCE_CODE_URL + } +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt deleted file mode 100644 index c52c2062c..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/HomeItems.kt +++ /dev/null @@ -1,116 +0,0 @@ -package com.topjohnwu.magisk.model.entity.recycler - -import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.core.Const -import com.topjohnwu.magisk.databinding.ComparableRvItem - -sealed class HomeItem : ComparableRvItem() { - - abstract val icon: Int - abstract val title: Int - abstract val link: String - - override val layoutRes = R.layout.item_developer_link - - override fun contentSameAs(other: HomeItem) = itemSameAs(other) - override fun itemSameAs(other: HomeItem) = this == other - - override fun equals(other: Any?): Boolean { - if (other !is HomeItem) return false - return icon == other.icon && title == other.title && link == other.link - } - - override fun hashCode() = - icon.hashCode() + title.hashCode() + link.hashCode() + layoutRes.hashCode() - - // region Children - sealed class PayPal : HomeItem() { - override val icon = R.drawable.ic_paypal - override val title = R.string.paypal - override val link = "https://paypal.me/%s" - - // region Children - object App : PayPal() { - override val link = super.link.format("diareuse") - } - - object Mainline : PayPal() { - override val link = super.link.format("topjohnwu") - } - // endregion - } - - object Patreon : HomeItem() { - override val icon = R.drawable.ic_patreon - override val title = R.string.patreon - override val link = Const.Url.PATREON_URL - } - - sealed class Twitter : HomeItem() { - override val icon = R.drawable.ic_twitter - override val title = R.string.twitter - override val link = "https://twitter.com/%s" - - // region Children - object App : Twitter() { - override val link = super.link.format("diareuse") - } - - object Mainline : Twitter() { - override val link = super.link.format("topjohnwu") - } - // endregion - } - - object Github : HomeItem() { - override val icon = R.drawable.ic_github - override val title = R.string.home_item_source - override val link = Const.Url.SOURCE_CODE_URL - } - - object Xda : HomeItem() { - override val icon = R.drawable.ic_xda - override val title = R.string.xda - override val link = Const.Url.XDA_THREAD - } - // endregion -} - -sealed class DeveloperItem : ComparableRvItem() { - - abstract val items: List - 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 name == other.name && items == other.items - } - - override fun 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 name = R.string.topjohnwu - } - - object App : DeveloperItem() { - override val items = - listOf(HomeItem.PayPal.App, HomeItem.Twitter.App) - override val name = R.string.diareuse - } - - object Project : DeveloperItem() { - override val items = - listOf(HomeItem.Github, HomeItem.Xda) - override val name = R.string.home_links_project - } - //endregion - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt index 62ed84dcd..82eca1c3c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatHelpers.kt @@ -2,6 +2,7 @@ package com.topjohnwu.magisk.ui.base import androidx.databinding.ViewDataBinding import com.topjohnwu.magisk.databinding.ComparableRvItem +import com.topjohnwu.magisk.databinding.RvItem import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.FilterableDiffObservableList import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter @@ -39,7 +40,7 @@ fun > adapterOf() = object : BindingRecyclerViewAdapter< } } -inline fun > itemBindingOf( +inline fun itemBindingOf( crossinline body: (ItemBinding<*>) -> Unit = {} ) = OnItemBind { itemBinding, _, item -> item.bind(itemBinding) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt index eed55bbde..10df546a1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt @@ -15,9 +15,8 @@ import com.topjohnwu.magisk.data.repository.MagiskRepository import com.topjohnwu.magisk.ktx.await import com.topjohnwu.magisk.ktx.packageName import com.topjohnwu.magisk.ktx.res +import com.topjohnwu.magisk.model.entity.IconLink 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.events.ActivityExecutor import com.topjohnwu.magisk.model.events.OpenInappLinkEvent import com.topjohnwu.magisk.model.events.ViewEvent @@ -77,11 +76,7 @@ class HomeViewModel( val showUninstall get() = Info.env.magiskVersionCode > 0 && stateMagisk != MagiskState.LOADING && isConnected.get() - val items = listOf(DeveloperItem.Mainline, DeveloperItem.App, DeveloperItem.Project) - val itemBinding = itemBindingOf { - it.bindExtra(BR.viewModel, this) - } - val itemDeveloperBinding = itemBindingOf { + val itemBinding = itemBindingOf { it.bindExtra(BR.viewModel, this) } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index ccb943814..fcc6d72e2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -6,11 +6,11 @@ import android.graphics.drawable.Drawable import android.view.ContextThemeWrapper import android.view.View import android.view.ViewGroup +import android.widget.ImageView import android.widget.PopupMenu import android.widget.ProgressBar import android.widget.TextView import androidx.annotation.DrawableRes -import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.Toolbar import androidx.core.view.updateLayoutParams import androidx.databinding.BindingAdapter @@ -33,7 +33,7 @@ fun setOnNavigationClickedListener(view: Toolbar, listener: View.OnClickListener } @BindingAdapter("srcCompat") -fun setImageResource(view: AppCompatImageView, @DrawableRes resId: Int) { +fun setImageResource(view: ImageView, @DrawableRes resId: Int) { view.setImageResource(resId) } diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index b8b3e0d57..af380335a 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -9,6 +9,8 @@ + + @@ -166,23 +168,21 @@ android:text="@string/home_support_content" android:textAppearance="@style/AppearanceFoundation.Caption.Variant" /> - + android:layout_marginTop="@dimen/l_50" + viewModel="@{viewModel}" + item="@{DeveloperItem.Main.INSTANCE}" /> + + diff --git a/app/src/main/res/layout/item_developer.xml b/app/src/main/res/layout/item_developer.xml index 96279abca..4940666ba 100644 --- a/app/src/main/res/layout/item_developer.xml +++ b/app/src/main/res/layout/item_developer.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.model.entity.DeveloperItem" /> - + android:orientation="vertical" + android:padding="@dimen/l1" > - + android:text="@{item.name}" + android:textAppearance="@style/AppearanceFoundation.Caption" + android:textStyle="bold" + tools:text="\@topjohnwu" /> - + - - - - - - - - - + diff --git a/app/src/main/res/layout/item_developer_link.xml b/app/src/main/res/layout/item_icon_link.xml similarity index 85% rename from app/src/main/res/layout/item_developer_link.xml rename to app/src/main/res/layout/item_icon_link.xml index 09c66dba1..67e45ef62 100644 --- a/app/src/main/res/layout/item_developer_link.xml +++ b/app/src/main/res/layout/item_icon_link.xml @@ -7,7 +7,7 @@ + type="com.topjohnwu.magisk.model.entity.IconLink" /> -