Skip to content

Commit e9347c6

Browse files
authored
feat: handle dual SIM (#16)
1 parent 95e9426 commit e9347c6

6 files changed

Lines changed: 246 additions & 129 deletions

File tree

app/src/main/java/dev/bluehouse/enablevolte/Components.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package dev.bluehouse.enablevolte
22

33
import androidx.compose.foundation.layout.Column
44
import androidx.compose.foundation.layout.Row
5+
import androidx.compose.foundation.layout.fillMaxWidth
56
import androidx.compose.foundation.layout.padding
67
import androidx.compose.material3.*
78
import androidx.compose.runtime.*
@@ -41,7 +42,7 @@ fun HeaderText(text: String) {
4142
}
4243

4344
@Composable
44-
fun BooleanPropertyView(label: String, toggled: Boolean, enabled: Boolean = true, onClick: ((Boolean) -> Unit)? = null) {
45+
fun BooleanPropertyView(label: String, toggled: Boolean, enabled: Boolean = true, trueLabel: String = "Yes", falseLabel: String = "No", onClick: ((Boolean) -> Unit)? = null) {
4546
if (onClick != null) {
4647
Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(top = Dp(12f), bottom = Dp(12f))) {
4748
Text(text = label, modifier = Modifier.weight(1F), fontSize = 18.sp)
@@ -50,7 +51,7 @@ fun BooleanPropertyView(label: String, toggled: Boolean, enabled: Boolean = true
5051
} else {
5152
Column(modifier = Modifier.padding(top = Dp(12f), bottom = Dp(12f))) {
5253
Text(text = label, fontSize = 18.sp, modifier = Modifier.padding(bottom = Dp(4f)))
53-
Text(text = if (toggled) { "Yes" } else { "No" }, fontSize = 14.sp, color = MaterialTheme.colorScheme.outline)
54+
Text(text = if (toggled) { trueLabel } else { falseLabel }, fontSize = 14.sp, color = MaterialTheme.colorScheme.outline)
5455
}
5556
}
5657
}
@@ -95,10 +96,18 @@ fun StringPropertyView(label: String, value: String, onUpdate: ((String) -> Unit
9596
}
9697
)
9798
}
98-
Surface(onClick = {
99-
typedText = value
100-
openTextEditDialog = true
101-
}) {
99+
}
100+
ClickablePropertyView(label = label, value = value) {
101+
typedText = value
102+
openTextEditDialog = true
103+
}
104+
}
105+
106+
@OptIn(ExperimentalMaterial3Api::class)
107+
@Composable
108+
fun ClickablePropertyView(label: String, value: String, onClick: (() -> Unit)? = null) {
109+
if (onClick != null) {
110+
Surface(onClick = onClick, modifier = Modifier.fillMaxWidth()) {
102111
Column(modifier = Modifier.padding(top = Dp(12f), bottom = Dp(12f))) {
103112
Text(text = label, modifier = Modifier.padding(bottom = Dp(4f)), fontSize = 18.sp)
104113
Text(text = value, color = MaterialTheme.colorScheme.outline, fontSize = 14f.sp)
@@ -110,5 +119,4 @@ fun StringPropertyView(label: String, value: String, onUpdate: ((String) -> Unit
110119
Text(text = value, color = MaterialTheme.colorScheme.outline, fontSize = 14f.sp)
111120
}
112121
}
113-
114122
}

app/src/main/java/dev/bluehouse/enablevolte/HomeActivity.kt

Lines changed: 71 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package dev.bluehouse.enablevolte
22

3-
import android.annotation.StringRes
3+
import android.content.pm.PackageManager
44
import android.os.Bundle
5+
import android.telephony.SubscriptionInfo
6+
import android.util.Log
57
import androidx.activity.ComponentActivity
68
import androidx.activity.compose.setContent
79
import androidx.compose.foundation.layout.*
@@ -10,11 +12,17 @@ import androidx.compose.material.icons.filled.Home
1012
import androidx.compose.material.icons.filled.Settings
1113
import androidx.compose.material3.*
1214
import androidx.compose.runtime.*
15+
import androidx.compose.runtime.saveable.rememberSaveable
1316
import androidx.compose.ui.Modifier
1417
import androidx.compose.ui.graphics.vector.ImageVector
18+
import androidx.compose.ui.platform.LocalContext
1519
import androidx.compose.ui.res.stringResource
20+
import androidx.lifecycle.Lifecycle
1621
import androidx.navigation.NavDestination.Companion.hierarchy
22+
import androidx.navigation.NavGraph
1723
import androidx.navigation.NavGraph.Companion.findStartDestination
24+
import androidx.navigation.NavGraphBuilder
25+
import androidx.navigation.Navigator
1826
import androidx.navigation.compose.NavHost
1927
import androidx.navigation.compose.composable
2028
import androidx.navigation.compose.currentBackStackEntryAsState
@@ -23,8 +31,11 @@ import dev.bluehouse.enablevolte.pages.Config
2331
import dev.bluehouse.enablevolte.pages.Home
2432
import dev.bluehouse.enablevolte.ui.theme.EnableVoLTETheme
2533
import 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

2940
class HomeActivity : ComponentActivity() {
3041
override fun onCreate(savedInstanceState: Bundle?) {
@@ -50,7 +61,51 @@ class HomeActivity : ComponentActivity() {
5061
@Composable
5162
fun 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

Comments
 (0)