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
92 changes: 17 additions & 75 deletions app/src/main/java/com/deadzon/app/app/DeadZonApp.kt
Original file line number Diff line number Diff line change
@@ -1,65 +1,39 @@
package com.deadzon.app.app

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.deadzon.app.core.ui.BottomActionBar
import com.deadzon.app.core.ui.DeadZonBackground
import com.deadzon.app.core.ui.DeadZonLogoMark
import com.deadzon.app.core.ui.GlassCard
import com.deadzon.app.core.ui.SectionTitle
import com.deadzon.app.feature.dashboard.DashboardScreen
import com.deadzon.app.feature.modules.ModuleCatalog
import com.deadzon.app.feature.modules.ModuleSectionScreen
import com.deadzon.app.feature.modules.ModulesScreen
import com.deadzon.app.feature.monet.MonetScreen
import com.deadzon.app.feature.monet.MonetViewModel
import com.deadzon.app.feature.settings.SettingsScreen
import com.deadzon.app.feature.tools.ToolsScreen

@Composable
fun DeadZonApp(vm: MonetViewModel = hiltViewModel()) {
val state by vm.uiState.collectAsState()

if (!state.rootGateCompleted) {
RootGateScreen(
busy = state.busy,
rootAvailable = state.rootAvailable,
message = state.lastResult,
onRefresh = vm::refreshRootStatus,
onRequest = vm::requestRootFromOnboarding
)
return
}

fun DeadZonApp() {
val navController = rememberNavController()
val tabs = listOf(Screen.Dashboard, Screen.Monet, Screen.Settings)
val tabs = listOf(Screen.Home, Screen.Modules, Screen.Tools, Screen.Settings)

DeadZonBackground {
Scaffold(
containerColor = Color.Transparent,
containerColor = androidx.compose.ui.graphics.Color.Transparent,
bottomBar = {
BottomActionBar {
Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) {
Expand All @@ -79,53 +53,21 @@ fun DeadZonApp(vm: MonetViewModel = hiltViewModel()) {
) { paddingValues ->
NavHost(
navController = navController,
startDestination = Screen.Dashboard.route,
startDestination = Screen.Home.route,
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
composable(Screen.Dashboard.route) { DashboardScreen(navController) }
composable(Screen.Monet.route) { MonetScreen() }
composable(Screen.Home.route) { DashboardScreen(navController) }
composable(Screen.Modules.route) { ModulesScreen(navController) }
composable(Screen.Tools.route) { ToolsScreen(navController) }
composable(Screen.Settings.route) { SettingsScreen() }
}
}
}
}

@Composable
private fun RootGateScreen(
busy: Boolean,
rootAvailable: Boolean,
message: String?,
onRefresh: () -> Unit,
onRequest: () -> Unit
) {
DeadZonBackground {
Column(
modifier = Modifier
.fillMaxSize()
.padding(20.dp),
verticalArrangement = Arrangement.Center
) {
GlassCard {
DeadZonLogoMark(modifier = Modifier.align(Alignment.CenterHorizontally))
Spacer(modifier = Modifier.height(8.dp))
SectionTitle(
title = "Root Access Required",
subtitle = "Dead Zon needs root to control Monet overlays internally"
)
Text(if (rootAvailable) "Root detected. Continue." else "Tap request to trigger your root manager prompt.")
message?.let { Text(it, color = Color(0xFFFFA0A0)) }
Row(horizontalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier.fillMaxWidth()) {
OutlinedButton(onClick = onRefresh, modifier = Modifier.weight(1f)) { Text("Refresh") }
Button(
onClick = onRequest,
modifier = Modifier.weight(1f),
colors = ButtonDefaults.buttonColors(containerColor = Color(0xFFB91010))
) {
if (busy) CircularProgressIndicator(strokeWidth = 2.dp, color = Color.White) else Text("Request Root")
}
}
composable(Screen.Monet.route) { MonetScreen() }
composable(Screen.AboutPhone.route) { ModuleSectionScreen(ModuleCatalog.aboutPhone) }
composable(Screen.Notifications.route) { ModuleSectionScreen(ModuleCatalog.notifications) }
composable(Screen.NotificationAnimations.route) { ModuleSectionScreen(ModuleCatalog.notificationAnimations) }
composable(Screen.Lockscreen.route) { ModuleSectionScreen(ModuleCatalog.lockscreen) }
composable(Screen.ControlCenter.route) { ModuleSectionScreen(ModuleCatalog.controlCenter) }
}
}
}
Expand Down
14 changes: 12 additions & 2 deletions app/src/main/java/com/deadzon/app/app/Screen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,22 @@ package com.deadzon.app.app

import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Dashboard
import androidx.compose.material.icons.filled.Extension
import androidx.compose.material.icons.filled.GridView
import androidx.compose.material.icons.filled.Palette
import androidx.compose.material.icons.filled.Settings
import androidx.compose.ui.graphics.vector.ImageVector

sealed class Screen(val route: String, val title: String, val icon: ImageVector) {
data object Dashboard : Screen("dashboard", "Dashboard", Icons.Default.Dashboard)
data object Monet : Screen("monet", "Monet", Icons.Default.Palette)
data object Home : Screen("home", "Home", Icons.Default.Dashboard)
data object Modules : Screen("modules", "Modules", Icons.Default.GridView)
data object Tools : Screen("tools", "Tools", Icons.Default.Extension)
data object Settings : Screen("settings", "Settings", Icons.Default.Settings)

data object Monet : Screen("monet", "Monet", Icons.Default.Palette)
data object AboutPhone : Screen("modules/about_phone", "About Phone", Icons.Default.GridView)
data object Notifications : Screen("modules/notifications", "Notifications", Icons.Default.GridView)
data object NotificationAnimations : Screen("modules/notification_animations", "Notification Animations", Icons.Default.GridView)
data object Lockscreen : Screen("modules/lockscreen", "Lockscreen", Icons.Default.GridView)
data object ControlCenter : Screen("modules/control_center", "Control Center", Icons.Default.GridView)
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ class MonetPreferences @Inject constructor(
val applyToApp = booleanPreferencesKey("apply_to_app")
val preset = stringPreferencesKey("preset")
val targets = stringPreferencesKey("targets")
val rootGateCompleted = booleanPreferencesKey("root_gate_completed")
}

val state: Flow<StoredMonetState> = context.monetDataStore.data.map { prefs ->
Expand All @@ -33,7 +32,6 @@ class MonetPreferences @Inject constructor(
presetId = prefs[Keys.preset] ?: "stock",
selectedTargets = (prefs[Keys.targets]?.split(',')?.filter { it.isNotBlank() }
?.toSet() ?: MonetOverlayRegistry.targets.map { it.preferenceKey }.toSet()),
rootGateCompleted = prefs[Keys.rootGateCompleted] ?: false
)
}

Expand All @@ -45,14 +43,12 @@ class MonetPreferences @Inject constructor(
presetId = prefs[Keys.preset] ?: "stock",
selectedTargets = (prefs[Keys.targets]?.split(',')?.filter { it.isNotBlank() }
?.toSet() ?: MonetOverlayRegistry.targets.map { it.preferenceKey }.toSet()),
rootGateCompleted = prefs[Keys.rootGateCompleted] ?: false
)
)
val next = transform(current)
prefs[Keys.monetEnabled] = next.monetEnabled
prefs[Keys.applyToApp] = next.applyToApp
prefs[Keys.preset] = next.presetId
prefs[Keys.targets] = next.selectedTargets.joinToString(",")
prefs[Keys.rootGateCompleted] = next.rootGateCompleted
}
}
}
Expand All @@ -61,8 +57,7 @@ data class StoredMonetState(
val monetEnabled: Boolean,
val applyToApp: Boolean,
val presetId: String,
val selectedTargets: Set<String>,
val rootGateCompleted: Boolean
val selectedTargets: Set<String>
)

typealias MutablePreferences = androidx.datastore.preferences.core.MutablePreferences
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,5 @@ data class MonetUiState(
val rootAvailable: Boolean = false,
val busy: Boolean = false,
val logs: List<String> = emptyList(),
val lastResult: String? = null,
val rootGateCompleted: Boolean = false
val lastResult: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AutoFixHigh
import androidx.compose.material.icons.filled.GridView
import androidx.compose.material.icons.filled.Palette
import androidx.compose.material.icons.filled.Verified
import androidx.compose.material3.Button
Expand Down Expand Up @@ -44,8 +45,8 @@ fun DashboardScreen(navController: NavController, vm: MonetViewModel = hiltViewM
Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) {
DeadZonLogoMark()
Column(verticalArrangement = Arrangement.spacedBy(6.dp), modifier = Modifier.padding(top = 8.dp)) {
Text("DEAD ZON")
Text("Premium Overlay Control", color = Color(0xFFB9A6A6))
Text("DeadZon")
Text("Unified ROM Feature Hub", color = Color(0xFFB9A6A6))
}
}
}
Expand All @@ -55,26 +56,30 @@ fun DashboardScreen(navController: NavController, vm: MonetViewModel = hiltViewM
MetricChip(Icons.Default.Verified, "Monet", if (state.monetEnabled) "Enabled" else "Disabled")
}
Column(Modifier.weight(1f)) {
MetricChip(Icons.Default.Palette, "Preset", state.selectedPresetId.uppercase())
MetricChip(Icons.Default.Palette, "Palette", state.selectedPresetId.uppercase())
}
}

MetricChip(Icons.Default.AutoFixHigh, "Selected Targets", state.selectedTargets.size.toString())
MetricChip(Icons.Default.GridView, "Modules", "About • Notifications • Lockscreen • Control Center")

Row(horizontalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier.fillMaxWidth()) {
Button(
onClick = { vm.apply(false) },
onClick = { navController.navigate(Screen.Modules.route) },
modifier = Modifier.weight(1f)
) { Text("Open Modules") }
Button(
onClick = { navController.navigate(Screen.Tools.route) },
modifier = Modifier.weight(1f),
colors = ButtonDefaults.buttonColors(containerColor = Color(0xFFB91010))
) { Text("Quick Apply") }
Button(onClick = { navController.navigate(Screen.Monet.route) }, modifier = Modifier.weight(1f)) { Text("Open Monet") }
) { Text("Open Tools") }
}

GlassCard {
SectionTitle("Future Modules", "Temporary placeholders for this visual pass")
Text("• Performance profiles")
Text("• Thermal manager")
Text("• Network tuning")
SectionTitle("What changed", "DeadZon now centralizes ROM options that were previously split across Settings.")
Text("• Home for overview")
Text("• Modules for ROM feature pages")
Text("• Tools for action-based controls like Monet")
}
}
}
Expand Down
Loading
Loading