11package dev.bluehouse.enablevolte
22
3- import android.annotation.StringRes
3+ import android.content.pm.PackageManager
44import android.os.Bundle
5+ import android.telephony.SubscriptionInfo
6+ import android.util.Log
57import androidx.activity.ComponentActivity
68import androidx.activity.compose.setContent
79import androidx.compose.foundation.layout.*
@@ -10,11 +12,17 @@ import androidx.compose.material.icons.filled.Home
1012import androidx.compose.material.icons.filled.Settings
1113import androidx.compose.material3.*
1214import androidx.compose.runtime.*
15+ import androidx.compose.runtime.saveable.rememberSaveable
1316import androidx.compose.ui.Modifier
1417import androidx.compose.ui.graphics.vector.ImageVector
18+ import androidx.compose.ui.platform.LocalContext
1519import androidx.compose.ui.res.stringResource
20+ import androidx.lifecycle.Lifecycle
1621import androidx.navigation.NavDestination.Companion.hierarchy
22+ import androidx.navigation.NavGraph
1723import androidx.navigation.NavGraph.Companion.findStartDestination
24+ import androidx.navigation.NavGraphBuilder
25+ import androidx.navigation.Navigator
1826import androidx.navigation.compose.NavHost
1927import androidx.navigation.compose.composable
2028import androidx.navigation.compose.currentBackStackEntryAsState
@@ -23,8 +31,11 @@ import dev.bluehouse.enablevolte.pages.Config
2331import dev.bluehouse.enablevolte.pages.Home
2432import dev.bluehouse.enablevolte.ui.theme.EnableVoLTETheme
2533import org.lsposed.hiddenapibypass.HiddenApiBypass
34+ import rikka.shizuku.Shizuku
35+ import java.lang.IllegalStateException
2636
27- private val TAG = " HomeActivity"
37+ private const val TAG = " HomeActivity"
38+ data class Screen (val route : String , val title : String , val icon : ImageVector )
2839
2940class HomeActivity : ComponentActivity () {
3041 override fun onCreate (savedInstanceState : Bundle ? ) {
@@ -50,7 +61,51 @@ class HomeActivity : ComponentActivity() {
5061@Composable
5162fun PixelIMSApp () {
5263 val navController = rememberNavController()
64+ val carrierModer = CarrierModer (LocalContext .current)
5365
66+ var subscriptions by rememberSaveable { mutableStateOf(listOf<SubscriptionInfo >()) }
67+ var navBuilder by remember {
68+ mutableStateOf<NavGraphBuilder .() - > Unit > ({
69+ composable(" home" ) {
70+ Home (navController)
71+ }
72+ })
73+ }
74+
75+ fun generateNavBuilder (): (NavGraphBuilder .() -> Unit ) {
76+ return {
77+ composable(" home" ) {
78+ Home (navController)
79+ }
80+ for (subscription in subscriptions) {
81+ composable(" config${subscription.subscriptionId} " ) {
82+ Config (navController, subscription.subscriptionId)
83+ }
84+ }
85+ }
86+ }
87+
88+ OnLifecycleEvent { _, event ->
89+ if (event == Lifecycle .Event .ON_CREATE ) {
90+ try {
91+ if (checkShizukuPermission(0 )) {
92+ Log .d(dev.bluehouse.enablevolte.pages.TAG , " Shizuku granted" )
93+ subscriptions = carrierModer.subscriptions
94+ navBuilder = generateNavBuilder()
95+ } else {
96+ Shizuku .addRequestPermissionResultListener { _, grantResult ->
97+ if (grantResult == PackageManager .PERMISSION_GRANTED ) {
98+ Log .d(dev.bluehouse.enablevolte.pages.TAG , " Shizuku granted" )
99+ subscriptions = carrierModer.subscriptions
100+ navBuilder = generateNavBuilder()
101+ }
102+ }
103+ }
104+ } catch (_: IllegalStateException ) {
105+
106+ }
107+ }
108+ }
54109 Scaffold (
55110 topBar = {
56111 TopAppBar (
@@ -64,10 +119,21 @@ fun PixelIMSApp() {
64119 NavigationBar {
65120 val navBackStackEntry by navController.currentBackStackEntryAsState()
66121 val currentDestination = navBackStackEntry?.destination
122+ val items = arrayListOf (
123+ Screen (" home" , stringResource(R .string.home), Icons .Filled .Home )
124+ )
125+ for (subscription in subscriptions) {
126+ items.add(
127+ Screen (" config${subscription.subscriptionId} " , subscription.uniqueName, Icons .Filled .Settings )
128+ )
129+ }
130+
67131 items.forEach { screen ->
68132 NavigationBarItem (
69133 icon = { Icon (screen.icon, contentDescription = null ) },
70- label = { Text (stringResource(screen.resourceId)) },
134+ label = {
135+ Text (screen.title)
136+ },
71137 selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true ,
72138 onClick = {
73139 navController.navigate(screen.route) {
@@ -89,23 +155,6 @@ fun PixelIMSApp() {
89155 }
90156 }
91157 ) { innerPadding ->
92- NavHost (navController, startDestination = Screen .Home .route, Modifier .padding(innerPadding)) {
93- composable(Screen .Home .route) {
94- Home (navController)
95- }
96- composable(Screen .Config .route) {
97- Config (navController)
98- }
99- }
158+ NavHost (navController, startDestination = " home" , Modifier .padding(innerPadding), builder = navBuilder)
100159 }
101- }
102-
103- sealed class Screen (val route : String , @StringRes val resourceId : Int , val icon : ImageVector ) {
104- object Home : Screen(" home" , R .string.home, Icons .Filled .Home )
105- object Config : Screen(" config" , R .string.config, Icons .Filled .Settings )
106- }
107-
108- val items = listOf (
109- Screen .Home ,
110- Screen .Config ,
111- )
160+ }
0 commit comments