diff --git a/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/CallLogsScreen.kt b/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/CallLogsScreen.kt index aa4d89ec..c7956cfe 100644 --- a/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/CallLogsScreen.kt +++ b/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/CallLogsScreen.kt @@ -266,7 +266,7 @@ fun CallLogsScreen( callModel.callNumber() }, subscriptions = callModel.subscriptions, - onSubscriptionIndexChange = callModel::onSubscriptionIndexChange + onSubscriptionChange = callModel::onSubscriptionIndexChange ) } } diff --git a/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/components/NumberInput.kt b/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/components/NumberInput.kt index edd99616..904f1275 100644 --- a/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/components/NumberInput.kt +++ b/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/components/NumberInput.kt @@ -34,15 +34,9 @@ import androidx.compose.material.icons.rounded.Voicemail import androidx.compose.material3.Icon import androidx.compose.material3.ListItem import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -59,6 +53,7 @@ import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.bnyro.contacts.R import com.bnyro.contacts.domain.model.BasicContactData +import com.bnyro.contacts.presentation.screens.sms.components.SimCardSelector val keypadNumbers: Array>> = arrayOf( arrayOf("1" to Icons.Rounded.Voicemail, "2" to "ABC", "3" to "DEF"), @@ -74,8 +69,8 @@ fun NumberInput( onDelete: () -> Unit, onClear: () -> Unit, onDial: () -> Unit, - subscriptions: List?, - onSubscriptionIndexChange: (Int) -> Unit + subscriptions: List, + onSubscriptionChange: (SubscriptionInfo) -> Unit ) { val buttonSpacing = 8.dp Column( @@ -164,22 +159,9 @@ fun NumberInput( ) } } - if (subscriptions != null && subscriptions.size >= 2) { - var currentSub by remember { mutableIntStateOf(0) } - LaunchedEffect(Unit) { - currentSub = 0 - } - Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { - OutlinedButton(onClick = { - val newSub = (currentSub + 1) % subscriptions.size - currentSub = newSub - onSubscriptionIndexChange(newSub) - }) { - Text( - text = "SIM ${subscriptions[currentSub].simSlotIndex + 1} - ${subscriptions[currentSub].displayName}" - ) - } - } + + SimCardSelector(subscriptions) { subscription -> + onSubscriptionChange(subscription) } Spacer(modifier = Modifier.height(30.dp)) diff --git a/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/model/CallModel.kt b/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/model/CallModel.kt index e18fc5b5..2a3f572e 100644 --- a/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/model/CallModel.kt +++ b/app/src/main/java/com/bnyro/contacts/presentation/screens/calllog/model/CallModel.kt @@ -10,6 +10,7 @@ import android.media.ToneGenerator import android.net.Uri import android.telecom.PhoneAccountHandle import android.telecom.TelecomManager +import android.telephony.SubscriptionInfo import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.neverEqualPolicy @@ -73,8 +74,8 @@ class CallModel(private val application: Application, savedStateHandle: SavedSta } } - fun onSubscriptionIndexChange(index: Int) { - chosenSubInfo = subscriptions[index] + fun onSubscriptionIndexChange(subscription: SubscriptionInfo) { + chosenSubInfo = subscription } fun onNumberInput(digit: String) { diff --git a/app/src/main/java/com/bnyro/contacts/presentation/screens/sms/SmsThreadScreen.kt b/app/src/main/java/com/bnyro/contacts/presentation/screens/sms/SmsThreadScreen.kt index d2b8689c..86be7d2f 100644 --- a/app/src/main/java/com/bnyro/contacts/presentation/screens/sms/SmsThreadScreen.kt +++ b/app/src/main/java/com/bnyro/contacts/presentation/screens/sms/SmsThreadScreen.kt @@ -1,10 +1,8 @@ package com.bnyro.contacts.presentation.screens.sms import android.annotation.SuppressLint -import android.os.Build import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -20,7 +18,6 @@ import androidx.compose.material.icons.filled.Send import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FilledIconButton import androidx.compose.material3.Icon -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.PlainTooltip import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -29,10 +26,8 @@ import androidx.compose.material3.TooltipDefaults import androidx.compose.material3.TopAppBar import androidx.compose.material3.rememberTooltipState import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -50,6 +45,7 @@ import com.bnyro.contacts.presentation.features.ConfirmationDialog import com.bnyro.contacts.presentation.screens.contact.SingleContactScreen import com.bnyro.contacts.presentation.screens.contacts.model.ContactsModel import com.bnyro.contacts.presentation.screens.sms.components.Messages +import com.bnyro.contacts.presentation.screens.sms.components.SimCardSelector import com.bnyro.contacts.presentation.screens.sms.model.SmsModel import com.bnyro.contacts.util.SmsUtil @@ -69,13 +65,8 @@ fun SmsThreadScreen( val allSmsList by smsModel.smsList.collectAsState() val smsList = allSmsList.filter { it.address == address } val subscriptions = remember { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { - SmsUtil.getSubscriptions(context) - } else { - null - } + SmsUtil.getSubscriptions(context) } - val contactData = remember { contactsData ?: contactsModel.getContactByNumber(address) } @@ -137,22 +128,9 @@ fun SmsThreadScreen( Messages(messages = smsList, smsModel = smsModel) Spacer(modifier = Modifier.height(10.dp)) - if (subscriptions != null && subscriptions.size >= 2) { - var currentSub by remember { mutableIntStateOf(0) } - LaunchedEffect(Unit) { - currentSub = 0 - smsModel.currentSubscription = subscriptions[currentSub] - } - Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) { - OutlinedButton(onClick = { - currentSub = (currentSub + 1) % subscriptions.size - smsModel.currentSubscription = subscriptions[currentSub] - }) { - Text( - text = "SIM ${subscriptions[currentSub].simSlotIndex + 1} - ${subscriptions[currentSub].displayName}" - ) - } - } + + SimCardSelector(subscriptions) { subscription -> + smsModel.currentSubscription = subscription } // can't respond to address short codes that don't include a number diff --git a/app/src/main/java/com/bnyro/contacts/presentation/screens/sms/components/SimCardSelector.kt b/app/src/main/java/com/bnyro/contacts/presentation/screens/sms/components/SimCardSelector.kt new file mode 100644 index 00000000..3e55230a --- /dev/null +++ b/app/src/main/java/com/bnyro/contacts/presentation/screens/sms/components/SimCardSelector.kt @@ -0,0 +1,51 @@ +package com.bnyro.contacts.presentation.screens.sms.components + +import android.telephony.SubscriptionInfo +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import com.bnyro.contacts.util.Preferences +import com.bnyro.contacts.util.rememberPreference + +@Composable +fun SimCardSelector( + subscriptions: List, + onSubscriptionIndexChange: (SubscriptionInfo) -> Unit +) { + var selectedSubscriptionId by rememberPreference(Preferences.selectedSimSubscriptionIdKey, -1) + + if (subscriptions.size >= 2) { + var currentSubscriptionIndex by remember { + mutableIntStateOf(0) + } + LaunchedEffect(Unit) { + currentSubscriptionIndex = + subscriptions.indexOfFirst { it.subscriptionId == selectedSubscriptionId } + .takeIf { it != -1 } ?: 0 + onSubscriptionIndexChange(subscriptions[currentSubscriptionIndex]) + } + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) { + OutlinedButton( + onClick = { + currentSubscriptionIndex = + (currentSubscriptionIndex + 1) % subscriptions.size + onSubscriptionIndexChange(subscriptions[currentSubscriptionIndex]) + selectedSubscriptionId = subscriptions[currentSubscriptionIndex].subscriptionId + } + ) { + Text( + text = "SIM ${subscriptions[currentSubscriptionIndex].simSlotIndex + 1} - ${subscriptions[currentSubscriptionIndex].displayName}" + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/contacts/util/Preferences.kt b/app/src/main/java/com/bnyro/contacts/util/Preferences.kt index d260960c..aefb7329 100644 --- a/app/src/main/java/com/bnyro/contacts/util/Preferences.kt +++ b/app/src/main/java/com/bnyro/contacts/util/Preferences.kt @@ -33,6 +33,7 @@ object Preferences { const val lastChosenAccount = "lastChosenAccount" const val biometricAuthKey = "biometricAuth" const val favoritesOnlyKey = "favoritesOnly" + const val selectedSimSubscriptionIdKey = "selectedSimSubscriptionId" fun init(context: Context) { preferences = context.getSharedPreferences(prefFile, Context.MODE_PRIVATE)