mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-24 02:25:28 +00:00
Support theme switching pre SDK 21
This commit is contained in:
parent
9a8a27dbb9
commit
e51a3dacb9
@ -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)
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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>
|
||||
|
13
app/src/main/res/layout/item_theme_container.xml
Normal file
13
app/src/main/res/layout/item_theme_container.xml
Normal 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>
|
Loading…
Reference in New Issue
Block a user