Support theme switching pre SDK 21

This commit is contained in:
topjohnwu 2020-09-12 18:42:05 -07:00
parent 9a8a27dbb9
commit e51a3dacb9
4 changed files with 62 additions and 118 deletions

View File

@ -52,11 +52,6 @@ class SettingsViewModel(
Customization,
Theme, Language
)
if (Build.VERSION.SDK_INT < 21) {
// Pre 5.0 does not support getting colors from attributes,
// making theming a pain in the ass. Just forget about it
list.remove(Theme)
}
if (isRunningAsStub && ShortcutManagerCompat.isRequestPinShortcutSupported(context))
list.add(AddShortcut)

View File

@ -1,8 +1,16 @@
package com.topjohnwu.magisk.ui.theme
import android.os.Bundle
import android.view.ContextThemeWrapper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.topjohnwu.magisk.BR
import com.topjohnwu.magisk.R
import com.topjohnwu.magisk.arch.BaseUIFragment
import com.topjohnwu.magisk.databinding.FragmentThemeMd2Binding
import com.topjohnwu.magisk.databinding.ItemThemeBindingImpl
import org.koin.androidx.viewmodel.ext.android.viewModel
class ThemeFragment : BaseUIFragment<ThemeViewModel, FragmentThemeMd2Binding>() {
@ -10,6 +18,46 @@ class ThemeFragment : BaseUIFragment<ThemeViewModel, FragmentThemeMd2Binding>()
override val layoutRes = R.layout.fragment_theme_md2
override val viewModel by viewModel<ThemeViewModel>()
private fun <T> Array<T>.paired(): List<Pair<T, T?>> {
val iterator = iterator()
if (!iterator.hasNext()) return emptyList()
val result = mutableListOf<Pair<T, T?>>()
while (iterator.hasNext()) {
val a = iterator.next()
val b = if (iterator.hasNext()) iterator.next() else null
result.add(a to b)
}
return result
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
super.onCreateView(inflater, container, savedInstanceState)
for ((a, b) in Theme.values().paired()) {
val c = inflater.inflate(R.layout.item_theme_container, null, false)
val left = c.findViewById<FrameLayout>(R.id.left)
val right = c.findViewById<FrameLayout>(R.id.right)
for ((theme, view) in listOf(a to left, b to right)) {
theme ?: continue
val themed = ContextThemeWrapper(activity, theme.themeRes)
ItemThemeBindingImpl.inflate(LayoutInflater.from(themed), view, true).also {
it.setVariable(BR.viewModel, viewModel)
it.setVariable(BR.theme, theme)
it.lifecycleOwner = this
}
}
binding.themeContainer.addView(c)
}
return binding.root
}
override fun onStart() {
super.onStart()

View File

@ -22,9 +22,9 @@
android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/l1}">
<LinearLayout
android:id="@+id/theme_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="2"
android:orientation="vertical"
android:useDefaultMargins="true">
@ -34,118 +34,6 @@
layout="@layout/item_tappable_headline"
listener="@{viewModel}" />
<LinearLayout style="@style/W.Theme.Container">
<FrameLayout
android:id="@+id/theme_default"
style="@style/W.Theme.Left"
android:theme="@style/ThemeFoundationMD2.Piplup">
<include
layout="@layout/item_theme"
theme="@{Theme.Piplup}"
viewModel="@{viewModel}" />
</FrameLayout>
<FrameLayout
android:id="@+id/theme_amoled"
style="@style/W.Theme.Right"
android:theme="@style/ThemeFoundationMD2.Amoled">
<include
layout="@layout/item_theme"
theme="@{Theme.PiplupAmoled}"
viewModel="@{viewModel}" />
</FrameLayout>
</LinearLayout>
<LinearLayout style="@style/W.Theme.Container">
<FrameLayout
android:id="@+id/theme_rayquaza"
style="@style/W.Theme.Left"
android:theme="@style/ThemeFoundationMD2.Rayquaza">
<include
layout="@layout/item_theme"
theme="@{Theme.Rayquaza}"
viewModel="@{viewModel}" />
</FrameLayout>
<FrameLayout
android:id="@+id/theme_zapdos"
style="@style/W.Theme.Right"
android:theme="@style/ThemeFoundationMD2.Zapdos">
<include
layout="@layout/item_theme"
theme="@{Theme.Zapdos}"
viewModel="@{viewModel}" />
</FrameLayout>
</LinearLayout>
<LinearLayout style="@style/W.Theme.Container">
<FrameLayout
android:id="@+id/theme_charmeleon"
style="@style/W.Theme.Left"
android:theme="@style/ThemeFoundationMD2.Charmeleon">
<include
layout="@layout/item_theme"
theme="@{Theme.Charmeleon}"
viewModel="@{viewModel}" />
</FrameLayout>
<FrameLayout
android:id="@+id/theme_mew"
style="@style/W.Theme.Right"
android:theme="@style/ThemeFoundationMD2.Mew">
<include
layout="@layout/item_theme"
theme="@{Theme.Mew}"
viewModel="@{viewModel}" />
</FrameLayout>
</LinearLayout>
<LinearLayout style="@style/W.Theme.Container">
<FrameLayout
android:id="@+id/theme_salamence"
style="@style/W.Theme.Left"
android:theme="@style/ThemeFoundationMD2.Salamence">
<include
layout="@layout/item_theme"
theme="@{Theme.Salamence}"
viewModel="@{viewModel}" />
</FrameLayout>
<FrameLayout
android:id="@+id/theme_fraxure"
style="@style/W.Theme.Right"
android:theme="@style/ThemeFoundationMD2.Fraxure">
<include
layout="@layout/item_theme"
theme="@{Theme.Fraxure}"
viewModel="@{viewModel}" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/W.Theme.Container">
<FrameLayout
android:id="@+id/left"
style="@style/W.Theme.Left" />
<FrameLayout
android:id="@+id/right"
style="@style/W.Theme.Right" />
</LinearLayout>