Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 4 additions & 10 deletions app/apk-ng/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
plugins {
id("com.android.application")
kotlin("plugin.parcelize")
kotlin("plugin.compose")
kotlin("plugin.serialization")
alias(libs.plugins.compose.compiler)
}

setupMainApk()
Expand Down Expand Up @@ -38,24 +37,19 @@ dependencies {
implementation(project(":core"))
coreLibraryDesugaring(libs.jdk.libs)

implementation(libs.appcompat)
implementation(libs.material)

// Compose
implementation(platform(libs.compose.bom))
implementation(libs.compose.ui)
implementation(libs.compose.ui.tooling.preview)
debugImplementation(libs.compose.ui.tooling)
implementation(libs.compose.material.icons.extended)
implementation(libs.activity.compose)
implementation(libs.lifecycle.runtime.compose)
implementation(libs.lifecycle.viewmodel.compose)
implementation(libs.miuix)
implementation(libs.miuix.icons)
implementation(libs.miuix.navigation3.ui)
implementation(libs.compose.material3)

// Navigation3
implementation(libs.navigation3.runtime)
implementation(libs.navigationevent.compose)
implementation(libs.lifecycle.viewmodel.navigation3)

implementation(libs.navigation3.ui)
}
51 changes: 51 additions & 0 deletions app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/MagiskTheme.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.topjohnwu.magisk.ui

import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import com.topjohnwu.magisk.core.Config

object ThemeState {
var colorMode by mutableIntStateOf(Config.colorMode)
}

@Composable
fun MagiskTheme(
content: @Composable () -> Unit
) {
val isDark = isSystemInDarkTheme()
val mode = ThemeState.colorMode
val context = LocalContext.current

val isDarkTheme = when (mode) {
1 -> false
2 -> true
3 -> isDark
4 -> false
5 -> true
else -> isDark
}

val useDynamicColor = mode in listOf(3, 4, 5) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S

val colorScheme = when {
useDynamicColor && isDarkTheme -> dynamicDarkColorScheme(context)
useDynamicColor && !isDarkTheme -> dynamicLightColorScheme(context)
isDarkTheme -> darkColorScheme()
else -> lightColorScheme()
}

MaterialTheme(
colorScheme = colorScheme,
content = content
)
}
66 changes: 10 additions & 56 deletions app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,12 @@ import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.res.Resources
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.WindowManager
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
Expand All @@ -26,13 +22,13 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.content.res.use
import androidx.core.view.WindowCompat
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import com.topjohnwu.magisk.R
import com.topjohnwu.magisk.arch.VMFactory
import com.topjohnwu.magisk.core.Config
import com.topjohnwu.magisk.core.Const
Expand All @@ -41,7 +37,6 @@ import com.topjohnwu.magisk.core.base.ActivityExtension
import com.topjohnwu.magisk.core.base.SplashController
import com.topjohnwu.magisk.core.base.SplashScreenHost
import com.topjohnwu.magisk.core.isRunningAsStub
import com.topjohnwu.magisk.core.ktx.reflectField
import com.topjohnwu.magisk.core.ktx.toast
import com.topjohnwu.magisk.core.tasks.AppMigration
import com.topjohnwu.magisk.core.wrap
Expand All @@ -58,15 +53,12 @@ import com.topjohnwu.magisk.ui.navigation.Route
import com.topjohnwu.magisk.ui.navigation.rememberNavigator
import com.topjohnwu.magisk.ui.superuser.SuperuserDetailScreen
import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel
import com.topjohnwu.magisk.ui.theme.MagiskTheme
import com.topjohnwu.magisk.ui.theme.Theme
import com.topjohnwu.magisk.view.Shortcuts
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import top.yukonga.miuix.kmp.utils.MiuixPopupUtils.Companion.MiuixPopupHost
import com.topjohnwu.magisk.core.R as CoreR

class MainActivity : AppCompatActivity(), SplashScreenHost {
class MainActivity : ComponentActivity(), SplashScreenHost {

override val extension = ActivityExtension(this)
override val splashController = SplashController(this)
Expand All @@ -76,29 +68,16 @@ class MainActivity : AppCompatActivity(), SplashScreenHost {
internal val showUnsupported = MutableStateFlow<List<Pair<Int, Int>>>(emptyList())
internal val showShortcutPrompt = MutableStateFlow(false)

init {
AppCompatDelegate.setDefaultNightMode(Config.darkTheme)
}

override fun attachBaseContext(base: Context) {
super.attachBaseContext(base.wrap())
}

override fun onCreate(savedInstanceState: Bundle?) {
extension.onCreate(savedInstanceState)
if (isRunningAsStub) {
val delegate = delegate
val clz = delegate.javaClass
clz.reflectField("mActivityHandlesConfigFlagsChecked").set(delegate, true)
clz.reflectField("mActivityHandlesConfigFlags").set(delegate, 0)
}

setTheme(Theme.selected.themeRes)
splashController.preOnCreate()
theme.applyStyle(R.style.Main, true)
super.onCreate(savedInstanceState)
splashController.onCreate(savedInstanceState)

setupWindow()
}

override fun onResume() {
Expand All @@ -111,30 +90,6 @@ class MainActivity : AppCompatActivity(), SplashScreenHost {
extension.onSaveInstanceState(outState)
}

private fun setupWindow() {
obtainStyledAttributes(intArrayOf(android.R.attr.windowBackground))
.use { it.getDrawable(0) }
.also { window.setBackgroundDrawable(it) }

WindowCompat.setDecorFitsSystemWindows(window, false)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
window?.decorView?.post {
if ((window.decorView.rootWindowInsets?.systemWindowInsetBottom
?: 0) < Resources.getSystem().displayMetrics.density * 40) {
window.navigationBarColor = Color.TRANSPARENT
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
window.navigationBarDividerColor = Color.TRANSPARENT
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
window.isNavigationBarContrastEnforced = false
window.isStatusBarContrastEnforced = false
}
}
}
}
}

@SuppressLint("InlinedApi")
override fun onCreateUi(savedInstanceState: Bundle?) {
showUnsupportedMessage()
Expand Down Expand Up @@ -162,19 +117,19 @@ class MainActivity : AppCompatActivity(), SplashScreenHost {
onBack = { navigator.pop() },
entryDecorators = listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator()
rememberViewModelStoreNavEntryDecorator<Any>()
),
entryProvider = entryProvider {
entry<Route.Main> {
MainScreen(initialTab = initialTab)
}
entry<Route.DenyList> { _ ->
val vm: DenyListViewModel = androidx.lifecycle.viewmodel.compose.viewModel(factory = VMFactory)
val vm: DenyListViewModel = viewModel(factory = VMFactory)
LaunchedEffect(Unit) { vm.startLoading() }
DenyListScreen(vm, onBack = { navigator.pop() })
}
entry<Route.Flash> { key ->
val vm: FlashViewModel = androidx.lifecycle.viewmodel.compose.viewModel(factory = VMFactory)
val vm: FlashViewModel = viewModel(factory = VMFactory)
LaunchedEffect(key) {
if (vm.flashAction.isEmpty()) {
vm.flashAction = key.action
Expand All @@ -185,7 +140,7 @@ class MainActivity : AppCompatActivity(), SplashScreenHost {
FlashScreen(vm, action = key.action, onBack = { navigator.pop() })
}
entry<Route.SuperuserDetail> { key ->
val vm: SuperuserViewModel = androidx.lifecycle.viewmodel.compose.viewModel(
val vm: SuperuserViewModel = viewModel(
viewModelStoreOwner = this@MainActivity, factory = VMFactory
)
LaunchedEffect(Unit) {
Expand All @@ -196,7 +151,7 @@ class MainActivity : AppCompatActivity(), SplashScreenHost {
SuperuserDetailScreen(uid = key.uid, viewModel = vm, onBack = { navigator.pop() })
}
entry<Route.Action> { key ->
val vm: ActionViewModel = androidx.lifecycle.viewmodel.compose.viewModel(factory = VMFactory)
val vm: ActionViewModel = viewModel(factory = VMFactory)
LaunchedEffect(key) {
if (vm.actionId.isEmpty()) {
vm.actionId = key.id
Expand All @@ -210,7 +165,6 @@ class MainActivity : AppCompatActivity(), SplashScreenHost {
)
}
MainActivityDialogs(activity = this@MainActivity)
MiuixPopupHost()
}
}
}
Expand Down
24 changes: 12 additions & 12 deletions app/apk-ng/src/main/java/com/topjohnwu/magisk/ui/MainScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
Expand Down Expand Up @@ -57,17 +60,14 @@ import com.topjohnwu.magisk.ui.settings.SettingsViewModel
import com.topjohnwu.magisk.ui.superuser.SuperuserScreen
import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel
import kotlinx.coroutines.launch
import top.yukonga.miuix.kmp.basic.Icon
import top.yukonga.miuix.kmp.basic.Text
import top.yukonga.miuix.kmp.theme.MiuixTheme
import com.topjohnwu.magisk.core.R as CoreR

enum class Tab(val titleRes: Int, val iconRes: Int) {
MODULES(CoreR.string.modules, R.drawable.ic_module_outlined_md2),
SUPERUSER(CoreR.string.superuser, R.drawable.ic_superuser_outlined_md2),
HOME(CoreR.string.section_home, R.drawable.ic_home_outlined_md2),
LOG(CoreR.string.logs, R.drawable.ic_bug_outlined_md2),
SETTINGS(CoreR.string.settings, R.drawable.ic_settings_outlined_md2);
MODULES(CoreR.string.modules, R.drawable.ic_module),
SUPERUSER(CoreR.string.superuser, CoreR.drawable.ic_superuser),
HOME(CoreR.string.section_home, R.drawable.ic_home),
LOG(CoreR.string.logs, R.drawable.ic_bug),
SETTINGS(CoreR.string.settings, R.drawable.ic_settings);
}

@Composable
Expand Down Expand Up @@ -160,7 +160,7 @@ private fun FloatingNavigationBar(
.padding(bottom = navBarInset + 12.dp, start = 24.dp, end = 24.dp)
.shadow(elevation = 6.dp, shape = shape)
.clip(shape)
.background(MiuixTheme.colorScheme.surfaceContainer)
.background(MaterialTheme.colorScheme.surfaceContainer)
.fillMaxWidth()
.height(64.dp)
.padding(horizontal = 4.dp),
Expand Down Expand Up @@ -191,9 +191,9 @@ private fun FloatingNavItem(
) {
val contentColor by animateColorAsState(
targetValue = when {
!enabled -> MiuixTheme.colorScheme.disabledOnSecondaryVariant
selected -> MiuixTheme.colorScheme.primary
else -> MiuixTheme.colorScheme.onSurfaceVariantActions
!enabled -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f)
selected -> MaterialTheme.colorScheme.primary
else -> MaterialTheme.colorScheme.onSurfaceVariant
},
animationSpec = tween(200),
label = "navItemColor"
Expand Down
Loading