Merge "Add the error dialogs" into main
diff --git a/src/com/android/settings/network/SimOnboardingActivity.kt b/src/com/android/settings/network/SimOnboardingActivity.kt
index 1b71161..98bb5d7 100644
--- a/src/com/android/settings/network/SimOnboardingActivity.kt
+++ b/src/com/android/settings/network/SimOnboardingActivity.kt
@@ -45,6 +45,7 @@
 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.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 @@
 class SimOnboardingActivity : SpaBaseDialogActivity() {
     lateinit var scope: CoroutineScope
     lateinit var showBottomSheet: MutableState<Boolean>
-    lateinit var showError: MutableState<Boolean>
+    lateinit var showError: MutableState<ErrorType>
     lateinit var showProgressDialog: MutableState<Boolean>
 
     private var switchToEuiccSubscriptionSidecar: SwitchToEuiccSubscriptionSidecar? = null
@@ -121,15 +125,14 @@
         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 @@
                 }
             }
 
-            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 @@
     @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
@@ -251,6 +252,56 @@
     }
 
     @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()
             ?.collectLatestWithLifecycle(LocalLifecycleOwner.current) {
@@ -317,13 +368,14 @@
             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 @@
                 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 @@
             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 @@
         }
         Log.i(TAG, "DSDS enabled, start to enable pSIM profile.")
         onboardingService.handleTogglePsimAction()
-        callbackListener(CALLBACK_FINISH)
+        callbackListener(CallbackType.CALLBACK_FINISH)
     }
 
     @Composable
@@ -439,7 +493,7 @@
         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 @@
         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 5387ad4..962741f 100644
--- a/src/com/android/settings/network/SimOnboardingService.kt
+++ b/src/com/android/settings/network/SimOnboardingService.kt
@@ -23,6 +23,7 @@
 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 kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
 
-
 private const val TAG = "SimOnboardingService"
 private const val INVALID = SubscriptionManager.INVALID_SUBSCRIPTION_ID
 
@@ -60,7 +60,7 @@
                 .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 @@
         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 @@
 
     fun startActivatingSim(){
         // TODO: start to activate sim
-        callback(SimOnboardingActivity.CALLBACK_FINISH)
+        callback(CallbackType.CALLBACK_FINISH)
     }
 
     suspend fun startSetupName() {
@@ -273,7 +275,7 @@
                 )
             }
             // next action is SETUP_PRIMARY_SIM
-            callback(SimOnboardingActivity.CALLBACK_SETUP_PRIMARY_SIM)
+            callback(CallbackType.CALLBACK_SETUP_PRIMARY_SIM)
         }
     }
 
@@ -302,7 +304,7 @@
             }
 
             // 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 cc17f93..838154f 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.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 @@
     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 @@
         composable(route = SimOnboardingScreen.PrimarySim.name) {
             SimOnboardingPrimarySimImpl(
                 nextAction = {
-                    onboardingService.callback(SimOnboardingActivity.CALLBACK_ONBOARDING_COMPLETE)
+                    onboardingService.callback(CallbackType.CALLBACK_ONBOARDING_COMPLETE)
                     context.getActivity()?.finish()
                 },
                 cancelAction = finishOnboarding,