From a9695c40e7d977745b1a39737cd158e9f17a904e Mon Sep 17 00:00:00 2001 From: songferngwang Date: Thu, 29 Feb 2024 09:12:03 +0000 Subject: [PATCH] Add the error dialogs When system activate the sim faild, then it shows the error dialog Bug: 318310357 Bug: 298898436 Bug: 298891941 Test: manual test, verify the error dialog UI Change-Id: I90d7aa5d3f3ad36d949a505377466f8cdf63b6b4 --- .../settings/network/SimOnboardingActivity.kt | 114 ++++++++++++++---- .../settings/network/SimOnboardingService.kt | 14 ++- .../spa/network/SimOnboardingPageProvider.kt | 5 +- 3 files changed, 100 insertions(+), 33 deletions(-) diff --git a/src/com/android/settings/network/SimOnboardingActivity.kt b/src/com/android/settings/network/SimOnboardingActivity.kt index d06b4dd2eb4..e3a565a7098 100644 --- a/src/com/android/settings/network/SimOnboardingActivity.kt +++ b/src/com/android/settings/network/SimOnboardingActivity.kt @@ -45,6 +45,7 @@ import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -63,7 +64,10 @@ import com.android.settings.spa.network.SimOnboardingPageProvider.getRoute import com.android.settingslib.spa.SpaBaseDialogActivity import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle +import com.android.settingslib.spa.widget.dialog.AlertDialogButton import com.android.settingslib.spa.widget.dialog.getDialogWidth +import com.android.settingslib.spa.widget.dialog.rememberAlertDialogPresenter +import com.android.settingslib.spa.widget.editor.SettingsOutlinedTextField import com.android.settingslib.spa.widget.ui.SettingsTitle import com.android.settingslib.spaprivileged.framework.common.userManager import kotlinx.coroutines.CoroutineScope @@ -77,7 +81,7 @@ import kotlinx.coroutines.launch class SimOnboardingActivity : SpaBaseDialogActivity() { lateinit var scope: CoroutineScope lateinit var showBottomSheet: MutableState - lateinit var showError: MutableState + lateinit var showError: MutableState lateinit var showProgressDialog: MutableState private var switchToEuiccSubscriptionSidecar: SwitchToEuiccSubscriptionSidecar? = null @@ -121,15 +125,14 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { super.finish() } - var callbackListener: (Int) -> Unit = { + var callbackListener: (CallbackType) -> Unit = { Log.d(TAG, "Receive the CALLBACK: $it") when (it) { - CALLBACK_ERROR -> { + CallbackType.CALLBACK_ERROR -> { setProgressDialog(false) - showError.value = true } - CALLBACK_ONBOARDING_COMPLETE -> { + CallbackType.CALLBACK_ONBOARDING_COMPLETE -> { showBottomSheet.value = false setProgressDialog(true) scope.launch { @@ -139,19 +142,19 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { } } - CALLBACK_SETUP_NAME -> { + CallbackType.CALLBACK_SETUP_NAME -> { scope.launch { onboardingService.startSetupName() } } - CALLBACK_SETUP_PRIMARY_SIM -> { + CallbackType.CALLBACK_SETUP_PRIMARY_SIM -> { scope.launch { onboardingService.startSetupPrimarySim(this@SimOnboardingActivity) } } - CALLBACK_FINISH -> { + CallbackType.CALLBACK_FINISH -> { finish() } } @@ -174,16 +177,14 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { @Composable override fun Content() { showBottomSheet = remember { mutableStateOf(false) } - showError = remember { mutableStateOf(false) } + showError = remember { mutableStateOf(ErrorType.ERROR_NONE) } showProgressDialog = remember { mutableStateOf(false) } scope = rememberCoroutineScope() registerSidecarReceiverFlow() - if(showError.value){ - // show error - return - } + ErrorDialogImpl() + LaunchedEffect(Unit) { if (onboardingService.activeSubInfoList.isNotEmpty()) { showBottomSheet.value = true @@ -250,6 +251,56 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { } } + @Composable + fun ErrorDialogImpl(){ + // EuiccSlotSidecar showErrorDialog + val errorDialogPresenterForEuiccSlotSidecar = rememberAlertDialogPresenter( + confirmButton = AlertDialogButton( + stringResource(android.R.string.ok) + ) { + finish() + }, + title = stringResource(R.string.privileged_action_disable_fail_title), + text = { + Text(stringResource(R.string.privileged_action_disable_fail_text)) + }, + ) + + // RemovableSlotSidecar showErrorDialog + val errorDialogPresenterForRemovableSlotSidecar = rememberAlertDialogPresenter( + confirmButton = AlertDialogButton( + stringResource(android.R.string.ok) + ) { + finish() + }, + title = stringResource(R.string.sim_action_enable_sim_fail_title), + text = { + Text(stringResource(R.string.sim_action_enable_sim_fail_text)) + }, + ) + + // enableDSDS showErrorDialog + val errorDialogPresenterForMultiSimSidecar = rememberAlertDialogPresenter( + confirmButton = AlertDialogButton( + stringResource(android.R.string.ok) + ) { + finish() + }, + title = stringResource(R.string.dsds_activation_failure_title), + text = { + Text(stringResource(R.string.dsds_activation_failure_body_msg2)) + }, + ) + + // show error + when (showError.value) { + ErrorType.ERROR_EUICC_SLOT -> errorDialogPresenterForEuiccSlotSidecar.open() + ErrorType.ERROR_REMOVABLE_SLOT -> errorDialogPresenterForRemovableSlotSidecar.open() + ErrorType.ERROR_ENABLE_DSDS -> errorDialogPresenterForMultiSimSidecar.open() + else -> {} + } + } + @Composable fun registerSidecarReceiverFlow(){ switchToEuiccSubscriptionSidecar?.sidecarReceiverFlow() @@ -317,13 +368,14 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { SidecarFragment.State.SUCCESS -> { Log.i(TAG, "Successfully enable the eSIM profile.") switchToEuiccSubscriptionSidecar!!.reset() - callbackListener(CALLBACK_SETUP_NAME) + callbackListener(CallbackType.CALLBACK_SETUP_NAME) } SidecarFragment.State.ERROR -> { Log.i(TAG, "Failed to enable the eSIM profile.") switchToEuiccSubscriptionSidecar!!.reset() - callbackListener(CALLBACK_ERROR) + showError.value = ErrorType.ERROR_EUICC_SLOT + callbackListener(CallbackType.CALLBACK_ERROR) // TODO: showErrorDialog and using privileged_action_disable_fail_title and // privileged_action_disable_fail_text } @@ -336,13 +388,14 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { Log.i(TAG, "Successfully switched to removable slot.") switchToRemovableSlotSidecar!!.reset() onboardingService.handleTogglePsimAction() - callbackListener(CALLBACK_SETUP_NAME) + callbackListener(CallbackType.CALLBACK_SETUP_NAME) } SidecarFragment.State.ERROR -> { Log.e(TAG, "Failed switching to removable slot.") switchToRemovableSlotSidecar!!.reset() - callbackListener(CALLBACK_ERROR) + showError.value = ErrorType.ERROR_REMOVABLE_SLOT + callbackListener(CallbackType.CALLBACK_ERROR) // TODO: showErrorDialog and using sim_action_enable_sim_fail_title and // sim_action_enable_sim_fail_text } @@ -360,7 +413,8 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { SidecarFragment.State.ERROR -> { enableMultiSimSidecar!!.reset() Log.i(TAG, "Failed to switch to DSDS without rebooting.") - callbackListener(CALLBACK_ERROR) + showError.value = ErrorType.ERROR_ENABLE_DSDS + callbackListener(CallbackType.CALLBACK_ERROR) // TODO: showErrorDialog and using dsds_activation_failure_title and // dsds_activation_failure_body_msg2 } @@ -383,7 +437,7 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { } Log.i(TAG, "DSDS enabled, start to enable pSIM profile.") onboardingService.handleTogglePsimAction() - callbackListener(CALLBACK_FINISH) + callbackListener(CallbackType.CALLBACK_FINISH) } @Composable @@ -439,7 +493,7 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { Log.i(TAG, "setProgressState:$state") } - fun initServiceData(context: Context,targetSubId: Int, callback:(Int)->Unit) { + fun initServiceData(context: Context,targetSubId: Int, callback:(CallbackType)->Unit) { onboardingService.initData(targetSubId, context,callback) } @@ -458,10 +512,20 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { var onboardingService:SimOnboardingService = SimOnboardingService() const val TAG = "SimOnboardingActivity" const val SUB_ID = "sub_id" - const val CALLBACK_ERROR = -1 - const val CALLBACK_ONBOARDING_COMPLETE = 1 - const val CALLBACK_SETUP_NAME = 2 - const val CALLBACK_SETUP_PRIMARY_SIM = 3 - const val CALLBACK_FINISH = 4 + + enum class ErrorType(val value:Int){ + ERROR_NONE(-1), + ERROR_EUICC_SLOT(1), + ERROR_REMOVABLE_SLOT(2), + ERROR_ENABLE_DSDS(3) + } + + enum class CallbackType(val value:Int){ + CALLBACK_ERROR(-1), + CALLBACK_ONBOARDING_COMPLETE(1), + CALLBACK_SETUP_NAME(2), + CALLBACK_SETUP_PRIMARY_SIM(3), + CALLBACK_FINISH(4) + } } } \ No newline at end of file diff --git a/src/com/android/settings/network/SimOnboardingService.kt b/src/com/android/settings/network/SimOnboardingService.kt index 5387ad45d8d..962741f2cd1 100644 --- a/src/com/android/settings/network/SimOnboardingService.kt +++ b/src/com/android/settings/network/SimOnboardingService.kt @@ -23,6 +23,7 @@ import android.telephony.TelephonyManager import android.telephony.UiccCardInfo import android.telephony.UiccSlotInfo import android.util.Log +import com.android.settings.network.SimOnboardingActivity.Companion.CallbackType import com.android.settings.spa.network.setAutomaticData import com.android.settings.spa.network.setDefaultData import com.android.settings.spa.network.setDefaultSms @@ -31,7 +32,6 @@ import com.android.settingslib.utils.ThreadUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext - private const val TAG = "SimOnboardingService" private const val INVALID = SubscriptionManager.INVALID_SUBSCRIPTION_ID @@ -60,7 +60,7 @@ class SimOnboardingService { .map { it.subscriptionId } .firstOrNull() ?: SubscriptionManager.INVALID_SUBSCRIPTION_ID } - var callback: (Int) -> Unit = {} + var callback: (CallbackType) -> Unit = {} var isMultipleEnabledProfilesSupported: Boolean = false get() { @@ -135,7 +135,9 @@ class SimOnboardingService { userSelectedSubInfoList.clear() } - fun initData(inputTargetSubId:Int,context: Context, callback: (Int) -> Unit) { + fun initData(inputTargetSubId: Int, + context: Context, + callback: (CallbackType) -> Unit) { this.callback = callback targetSubId = inputTargetSubId subscriptionManager = context.getSystemService(SubscriptionManager::class.java) @@ -261,7 +263,7 @@ class SimOnboardingService { fun startActivatingSim(){ // TODO: start to activate sim - callback(SimOnboardingActivity.CALLBACK_FINISH) + callback(CallbackType.CALLBACK_FINISH) } suspend fun startSetupName() { @@ -273,7 +275,7 @@ class SimOnboardingService { ) } // next action is SETUP_PRIMARY_SIM - callback(SimOnboardingActivity.CALLBACK_SETUP_PRIMARY_SIM) + callback(CallbackType.CALLBACK_SETUP_PRIMARY_SIM) } } @@ -302,7 +304,7 @@ class SimOnboardingService { } // no next action, send finish - callback(SimOnboardingActivity.CALLBACK_FINISH) + callback(CallbackType.CALLBACK_FINISH) } } } \ No newline at end of file diff --git a/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt b/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt index cc17f93e424..838154fa336 100644 --- a/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt +++ b/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt @@ -34,6 +34,7 @@ import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import com.android.settings.R import com.android.settings.network.SimOnboardingActivity +import com.android.settings.network.SimOnboardingActivity.Companion.CallbackType import com.android.settings.network.SimOnboardingService import com.android.settingslib.spa.framework.common.SettingsEntryBuilder import com.android.settingslib.spa.framework.common.SettingsPageProvider @@ -93,7 +94,7 @@ fun PageImpl(onboardingService:SimOnboardingService,navHostController: NavHostCo val context = LocalContext.current var finishOnboarding: () -> Unit = { context.getActivity()?.finish() - onboardingService.callback(SimOnboardingActivity.CALLBACK_FINISH) + onboardingService.callback(CallbackType.CALLBACK_FINISH) } NavHost( @@ -120,7 +121,7 @@ fun PageImpl(onboardingService:SimOnboardingService,navHostController: NavHostCo composable(route = SimOnboardingScreen.PrimarySim.name) { SimOnboardingPrimarySimImpl( nextAction = { - onboardingService.callback(SimOnboardingActivity.CALLBACK_ONBOARDING_COMPLETE) + onboardingService.callback(CallbackType.CALLBACK_ONBOARDING_COMPLETE) context.getActivity()?.finish() }, cancelAction = finishOnboarding,