Merge "[5G settings UI] add UI for the 5G limited VoLTE dialog" into rvc-dev
diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
index cbe0912..0471f74 100644
--- a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
+++ b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
@@ -16,7 +16,10 @@
 
 package com.android.settings.network.telephony;
 
+import android.app.AlertDialog;
+import android.app.Dialog;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.os.Looper;
 import android.os.PersistableBundle;
 import android.telephony.CarrierConfigManager;
@@ -31,6 +34,7 @@
 import androidx.preference.PreferenceScreen;
 import androidx.preference.SwitchPreference;
 
+import com.android.settings.R;
 import com.android.settings.network.ims.VolteQueryImsState;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
@@ -50,6 +54,8 @@
     @VisibleForTesting
     Preference mPreference;
     private PhoneCallStateListener mPhoneStateListener;
+    private boolean mShow5gLimitedDialog;
+    private boolean mHas5gCapability;
     @VisibleForTesting
     Integer mCallState;
     private final List<On4gLteUpdateListener> m4gLteListeners;
@@ -83,6 +89,9 @@
         if (m4gCurrentMode != MODE_ADVANCED_CALL) {
             m4gCurrentMode = show4GForLTE ? MODE_4G_CALLING : MODE_VOLTE;
         }
+
+        mShow5gLimitedDialog = carrierConfig.getBoolean(
+                CarrierConfigManager.KEY_VOLTE_5G_LIMITED_ALERT_DIALOG_BOOL);
         return this;
     }
 
@@ -142,16 +151,13 @@
         if (imsMmTelManager == null) {
             return false;
         }
-        try {
-            imsMmTelManager.setAdvancedCallingSettingEnabled(isChecked);
-        } catch (IllegalArgumentException exception) {
-            Log.w(TAG, "fail to set VoLTE=" + isChecked + ". subId=" + mSubId, exception);
-            return false;
+
+        if (isDialogNeeded() && !isChecked) {
+            show5gLimitedDialog(imsMmTelManager);
+        } else {
+            return setAdvancedCallingSettingEnabled(imsMmTelManager, isChecked);
         }
-        for (final On4gLteUpdateListener lsn : m4gLteListeners) {
-            lsn.on4gLteUpdated();
-        }
-        return true;
+        return false;
     }
 
     @Override
@@ -205,6 +211,10 @@
                 mTelephonyManager = mTelephonyManager.createForSubscriptionId(subId);
             }
             mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE);
+
+            final long supportedRadioBitmask = mTelephonyManager.getSupportedRadioAccessFamily();
+            mHas5gCapability =
+                    (supportedRadioBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_NR) > 0;
         }
 
         public void unregister() {
@@ -219,4 +229,46 @@
     public interface On4gLteUpdateListener {
         void on4gLteUpdated();
     }
+
+    private boolean isDialogNeeded() {
+        Log.d(TAG, "Has5gCapability:" + mHas5gCapability);
+        return mShow5gLimitedDialog && mHas5gCapability;
+    }
+
+    private void show5gLimitedDialog(ImsMmTelManager imsMmTelManager) {
+        Log.d(TAG, "show5gLimitedDialog");
+        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+        DialogInterface.OnClickListener networkSettingsClickListener =
+                new Dialog.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        Log.d(TAG, "onClick,isChecked:false");
+                        setAdvancedCallingSettingEnabled(imsMmTelManager, false);
+                        updateState(mPreference);
+                    }
+                };
+        builder.setTitle(R.string.volte_5G_limited_title)
+                .setMessage(R.string.volte_5G_limited_text)
+                .setNeutralButton(mContext.getResources().getString(
+                        R.string.cancel), null)
+                .setPositiveButton(mContext.getResources().getString(
+                        R.string.condition_turn_off),
+                        networkSettingsClickListener)
+                .create()
+                .show();
+    }
+
+    private boolean setAdvancedCallingSettingEnabled(ImsMmTelManager imsMmTelManager,
+            boolean isChecked) {
+        try {
+            imsMmTelManager.setAdvancedCallingSettingEnabled(isChecked);
+        } catch (IllegalArgumentException exception) {
+            Log.w(TAG, "fail to set VoLTE=" + isChecked + ". subId=" + mSubId, exception);
+            return false;
+        }
+        for (final On4gLteUpdateListener lsn : m4gLteListeners) {
+            lsn.on4gLteUpdated();
+        }
+        return true;
+    }
 }