Updated action cards to be more colorful

This commit is contained in:
Viktor De Pasquale 2019-11-25 16:58:57 +01:00
parent cc7e47bbb6
commit cb59cc92a3
10 changed files with 199 additions and 184 deletions

View File

@ -24,7 +24,7 @@ val redesignModule = module {
viewModel { RequestViewModel() } viewModel { RequestViewModel() }
viewModel { SafetynetViewModel(get()) } viewModel { SafetynetViewModel(get()) }
viewModel { SettingsViewModel() } viewModel { SettingsViewModel() }
viewModel { SuperuserViewModel(get(), get(), get(), get()) } viewModel { SuperuserViewModel(get(), get(), get()) }
viewModel { ThemeViewModel() } viewModel { ThemeViewModel() }
viewModel { InstallViewModel() } viewModel { InstallViewModel() }

View File

@ -0,0 +1,39 @@
package com.topjohnwu.magisk.model.entity.recycler
import com.topjohnwu.magisk.R
import com.topjohnwu.magisk.databinding.ComparableRvItem
sealed class TappableHeadlineItem : ComparableRvItem<TappableHeadlineItem>() {
abstract val title: Int
abstract val icon: Int
override val layoutRes = R.layout.item_tappable_headline
override fun itemSameAs(other: TappableHeadlineItem) =
this === other
override fun contentSameAs(other: TappableHeadlineItem) =
title == other.title && icon == other.icon
// --- listener
interface Listener {
fun onItemPressed(item: TappableHeadlineItem)
}
// --- objects
object Hide : TappableHeadlineItem() {
override val title = R.string.magisk_hide_md2
override val icon = R.drawable.ic_hide_md2
}
object Safetynet : TappableHeadlineItem() {
override val title = R.string.safetyNet
override val icon = R.drawable.ic_safetynet_md2
}
}

View File

@ -11,6 +11,7 @@ import com.topjohnwu.magisk.extensions.subscribeK
import com.topjohnwu.magisk.extensions.toggle import com.topjohnwu.magisk.extensions.toggle
import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.entity.MagiskPolicy
import com.topjohnwu.magisk.model.entity.recycler.PolicyItem import com.topjohnwu.magisk.model.entity.recycler.PolicyItem
import com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem
import com.topjohnwu.magisk.model.events.PolicyUpdateEvent import com.topjohnwu.magisk.model.events.PolicyUpdateEvent
import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.SnackbarEvent
import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.events.dialog.BiometricDialog
@ -20,26 +21,26 @@ import com.topjohnwu.magisk.redesign.compat.CompatViewModel
import com.topjohnwu.magisk.redesign.home.itemBindingOf import com.topjohnwu.magisk.redesign.home.itemBindingOf
import com.topjohnwu.magisk.utils.BiometricHelper import com.topjohnwu.magisk.utils.BiometricHelper
import com.topjohnwu.magisk.utils.DiffObservableList import com.topjohnwu.magisk.utils.DiffObservableList
import com.topjohnwu.magisk.utils.RxBus
import com.topjohnwu.magisk.utils.currentLocale import com.topjohnwu.magisk.utils.currentLocale
import io.reactivex.Single import io.reactivex.Single
class SuperuserViewModel( class SuperuserViewModel(
private val rxBus: RxBus,
private val db: PolicyDao, private val db: PolicyDao,
private val packageManager: PackageManager, private val packageManager: PackageManager,
private val resources: Resources private val resources: Resources
) : CompatViewModel() { ) : CompatViewModel(), TappableHeadlineItem.Listener {
val items = diffListOf<PolicyItem>() val items = diffListOf<ComparableRvItem<*>>()
val itemBinding = itemBindingOf<PolicyItem> { val itemBinding = itemBindingOf<ComparableRvItem<*>> {
it.bindExtra(BR.viewModel, this) it.bindExtra(BR.viewModel, this)
it.bindExtra(BR.listener, this)
} }
init { companion object {
rxBus.register<PolicyUpdateEvent>() private val menuOptions = listOf(
.subscribeK { updatePolicy(it) } TappableHeadlineItem.Hide,
.add() TappableHeadlineItem.Safetynet
)
} }
// --- // ---
@ -56,6 +57,7 @@ class SuperuserViewModel(
).compare(o1, o2) ).compare(o1, o2)
} }
.toList() .toList()
.map { menuOptions + it }
.map { it to items.calculateDiff(it) } .map { it to items.calculateDiff(it) }
.applySchedulers() .applySchedulers()
.applyViewModel(this) .applyViewModel(this)
@ -63,12 +65,19 @@ class SuperuserViewModel(
// --- // ---
fun safetynetPressed() = Navigation.safetynet().publish() @Suppress("REDUNDANT_ELSE_IN_WHEN")
fun hidePressed() = Navigation.hide().publish() override fun onItemPressed(item: TappableHeadlineItem) = when (item) {
TappableHeadlineItem.Hide -> hidePressed()
TappableHeadlineItem.Safetynet -> safetynetPressed()
else -> Unit
}
private fun safetynetPressed() = Navigation.safetynet().publish()
private fun hidePressed() = Navigation.hide().publish()
fun deletePressed(item: PolicyItem) { fun deletePressed(item: PolicyItem) {
fun updateState() = deletePolicy(item.item) fun updateState() = deletePolicy(item.item)
.subscribeK { items.removeAll { it.itemSameAs(item) } } .subscribeK { items.removeAll { it.genericItemSameAs(item) } }
.add() .add()
if (BiometricHelper.isEnabled) { if (BiometricHelper.isEnabled) {

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?colorDisabled" android:state_enabled="false" />
<item android:color="?colorSecondary" />
</selector>

View File

@ -28,7 +28,7 @@
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/settings_card_redesign" android:id="@+id/settings_card_redesign"
style="@style/WidgetFoundation.Card" style="@style/WidgetFoundation.Card.Variant.Secondary"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/l1" android:layout_marginLeft="@dimen/l1"
@ -51,7 +51,7 @@
android:gravity="start" android:gravity="start"
android:paddingStart="@dimen/l1" android:paddingStart="@dimen/l1"
android:text="Redesign" android:text="Redesign"
android:textAppearance="@style/AppearanceFoundation.Body" android:textAppearance="@style/AppearanceFoundation.Body.Secondary"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/settings_card_redesign_switch" app:layout_constraintEnd_toStartOf="@+id/settings_card_redesign_switch"
@ -75,7 +75,7 @@
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/settings_card_theme" android:id="@+id/settings_card_theme"
style="@style/WidgetFoundation.Card" style="@style/WidgetFoundation.Card.Variant.Secondary"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/l1" android:layout_marginStart="@dimen/l1"
@ -91,7 +91,7 @@
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/settings_card_theme_dark_icon" android:id="@+id/settings_card_theme_dark_icon"
style="@style/WidgetFoundation.Icon" style="@style/WidgetFoundation.Icon.Secondary"
android:background="@null" android:background="@null"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -100,7 +100,7 @@
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/settings_card_theme_dark_pointer" android:id="@+id/settings_card_theme_dark_pointer"
style="@style/WidgetFoundation.Icon" style="@style/WidgetFoundation.Icon.Secondary"
android:background="@null" android:background="@null"
android:rotation="180" android:rotation="180"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@ -116,7 +116,7 @@
android:gravity="start|center_vertical" android:gravity="start|center_vertical"
android:singleLine="true" android:singleLine="true"
android:text="@string/section_theme" android:text="@string/section_theme"
android:textAppearance="@style/AppearanceFoundation.Body" android:textAppearance="@style/AppearanceFoundation.Body.Secondary"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/settings_card_theme_dark_pointer" app:layout_constraintEnd_toStartOf="@+id/settings_card_theme_dark_pointer"

View File

@ -13,131 +13,9 @@
</data> </data>
<androidx.core.widget.NestedScrollView <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:clipToPadding="false"
android:fillViewport="true"
android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size}"
android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l2}"
tools:layout_marginTop="24dp"
tools:paddingTop="@dimen/l1">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="@dimen/l1">
<com.google.android.material.card.MaterialCardView
android:id="@+id/superuser_hide"
style="@style/WidgetFoundation.Card"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/l1"
android:layout_marginEnd="@dimen/l1"
android:onClick="@{() -> viewModel.hidePressed()}"
app:layout_constraintEnd_toStartOf="@+id/superuser_safetynet"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/superuser_hide_icon"
style="@style/WidgetFoundation.Icon"
android:background="@null"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_hide_md2" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:requiresFadingEdge="horizontal"
android:singleLine="true"
android:text="@string/magisk_hide_md2"
android:textAppearance="@style/AppearanceFoundation.Body"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/superuser_hide_icon_pointer"
app:layout_constraintStart_toEndOf="@+id/superuser_hide_icon"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/superuser_hide_icon_pointer"
style="@style/WidgetFoundation.Icon"
android:background="@null"
android:rotation="180"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_back_md2" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:id="@+id/superuser_safetynet"
style="@style/WidgetFoundation.Card"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/l1"
android:onClick="@{() -> viewModel.safetynetPressed()}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/superuser_hide"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/superuser_safetynet_icon"
style="@style/WidgetFoundation.Icon"
android:background="@null"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_safetynet_md2" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:requiresFadingEdge="horizontal"
android:singleLine="true"
android:text="@string/safetyNet"
android:textAppearance="@style/AppearanceFoundation.Body"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/superuser_safetynet_icon_pointer"
app:layout_constraintStart_toEndOf="@+id/superuser_safetynet_icon"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/superuser_safetynet_icon_pointer"
style="@style/WidgetFoundation.Icon"
android:background="@null"
android:rotation="180"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_back_md2" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<androidx.constraintlayout.widget.Barrier
android:id="@+id/superuser_top_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="superuser_hide,superuser_safetynet" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
dividerHorizontal="@{R.drawable.divider_l1}" dividerHorizontal="@{R.drawable.divider_l1}"
@ -147,16 +25,17 @@
items="@{viewModel.items}" items="@{viewModel.items}"
nestedScrollingEnabled="@{false}" nestedScrollingEnabled="@{false}"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:clipToPadding="false" android:clipToPadding="false"
android:orientation="vertical" android:orientation="vertical"
android:paddingStart="@dimen/l1" android:paddingStart="@dimen/l1"
android:paddingTop="@dimen/l1" android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}"
android:paddingBottom="@dimen/l1" android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l2}"
app:layoutManager="androidx.recyclerview.widget.StaggeredGridLayoutManager" app:layoutManager="androidx.recyclerview.widget.StaggeredGridLayoutManager"
app:layout_constraintTop_toBottomOf="@+id/superuser_top_barrier"
app:spanCount="2" app:spanCount="2"
tools:listitem="@layout/item_policy_md2" /> tools:layout_marginTop="24dp"
tools:listitem="@layout/item_policy_md2"
tools:paddingTop="@dimen/l1" />
<LinearLayout <LinearLayout
goneUnless="@{viewModel.loading &amp;&amp; viewModel.items.empty}" goneUnless="@{viewModel.loading &amp;&amp; viewModel.items.empty}"
@ -164,9 +43,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical">
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/superuser_top_barrier">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -181,8 +58,6 @@
</LinearLayout> </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </FrameLayout>
</androidx.core.widget.NestedScrollView>
</layout> </layout>

View File

@ -31,7 +31,7 @@
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/theme_card_dark" android:id="@+id/theme_card_dark"
style="@style/WidgetFoundation.Card" style="@style/WidgetFoundation.Card.Variant.Secondary"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:onClick="@{() -> viewModel.darkModePressed()}" android:onClick="@{() -> viewModel.darkModePressed()}"
@ -46,7 +46,7 @@
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/settings_card_dark_icon" android:id="@+id/settings_card_dark_icon"
style="@style/WidgetFoundation.Icon" style="@style/WidgetFoundation.Icon.Secondary"
android:background="@null" android:background="@null"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -55,7 +55,7 @@
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/settings_card_dark_pointer" android:id="@+id/settings_card_dark_pointer"
style="@style/WidgetFoundation.Icon" style="@style/WidgetFoundation.Icon.Secondary"
android:background="@null" android:background="@null"
android:rotation="180" android:rotation="180"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@ -71,7 +71,7 @@
android:gravity="start|center_vertical" android:gravity="start|center_vertical"
android:singleLine="true" android:singleLine="true"
android:text="@string/settings_dark_mode_title" android:text="@string/settings_dark_mode_title"
android:textAppearance="@style/AppearanceFoundation.Body" android:textAppearance="@style/AppearanceFoundation.Body.Secondary"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/settings_card_dark_pointer" app:layout_constraintEnd_toStartOf="@+id/settings_card_dark_pointer"

View File

@ -0,0 +1,67 @@
<?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.TappableHeadlineItem" />
<variable
name="listener"
type="com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem.Listener" />
</data>
<com.google.android.material.card.MaterialCardView
style="@style/WidgetFoundation.Card.Variant.Secondary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{() -> listener.onItemPressed(item)}"
tools:layout_gravity="center">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/tappable_icon"
style="@style/WidgetFoundation.Icon.Secondary"
android:background="@null"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@{item.icon}"
tools:srcCompat="@drawable/ic_hide_md2" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:requiresFadingEdge="horizontal"
android:singleLine="true"
android:text="@{item.title}"
android:textAppearance="@style/AppearanceFoundation.Body.Secondary"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/headline_icon_pointer"
app:layout_constraintStart_toEndOf="@+id/tappable_icon"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/magisk_hide_md2" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/headline_icon_pointer"
style="@style/WidgetFoundation.Icon.Secondary"
android:background="@null"
android:rotation="180"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_back_md2" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</layout>

View File

@ -48,6 +48,14 @@
<item name="android:textColor">?attr/colorOnSurfaceVariant</item> <item name="android:textColor">?attr/colorOnSurfaceVariant</item>
</style> </style>
<style name="AppearanceFoundation.Body.Primary">
<item name="android:textColor">?attr/colorPrimary</item>
</style>
<style name="AppearanceFoundation.Body.Secondary">
<item name="android:textColor">?attr/colorSecondary</item>
</style>
<style name="AppearanceFoundation.Body.OnPrimary"> <style name="AppearanceFoundation.Body.OnPrimary">
<item name="android:textColor">?attr/colorOnPrimary</item> <item name="android:textColor">?attr/colorOnPrimary</item>
</style> </style>

View File

@ -30,6 +30,14 @@
<item name="strokeWidth">1.5dp</item> <item name="strokeWidth">1.5dp</item>
</style> </style>
<style name="WidgetFoundation.Card.Variant.Primary">
<item name="strokeColor">?colorPrimary</item>
</style>
<style name="WidgetFoundation.Card.Variant.Secondary">
<item name="strokeColor">?colorSecondary</item>
</style>
<style name="WidgetFoundation.Card.Elevated" parent="Widget.MaterialComponents.CardView"> <style name="WidgetFoundation.Card.Elevated" parent="Widget.MaterialComponents.CardView">
<item name="cardBackgroundColor">?colorSurfaceSurfaceVariant</item> <item name="cardBackgroundColor">?colorSurfaceSurfaceVariant</item>
<item name="cardCornerRadius">@dimen/l_50</item> <item name="cardCornerRadius">@dimen/l_50</item>
@ -138,6 +146,10 @@
<item name="tint">@color/color_primary_transient</item> <item name="tint">@color/color_primary_transient</item>
</style> </style>
<style name="WidgetFoundation.Icon.Secondary">
<item name="tint">@color/color_secondary_transient</item>
</style>
<style name="WidgetFoundation.Icon.OnPrimary"> <style name="WidgetFoundation.Icon.OnPrimary">
<item name="tint">@color/color_on_primary_transient</item> <item name="tint">@color/color_on_primary_transient</item>
</style> </style>