Merge "Update incompatible charging string for different product" into udc-dev
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java
index e69ab98..1f25ae0 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java
@@ -33,6 +33,7 @@
 
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -473,8 +474,7 @@
             return null;
         }
 
-        final long rawStartTimestamp =
-                batteryHistoryMap.keySet().stream().min(Long::compare).orElse(0L);
+        final long rawStartTimestamp = Collections.min(batteryHistoryMap.keySet());
         // Start the async task to compute diff usage data and load labels and icons.
         new DataProcessManager(
                 context,
diff --git a/src/com/android/settings/network/MobileNetworkRepository.java b/src/com/android/settings/network/MobileNetworkRepository.java
index e483a4d..f07a3b7 100644
--- a/src/com/android/settings/network/MobileNetworkRepository.java
+++ b/src/com/android/settings/network/MobileNetworkRepository.java
@@ -179,7 +179,7 @@
     }
 
     private void addRegisterBySubId(int subId) {
-        if (!mTelephonyCallbackMap.containsKey(subId)) {
+        if (!mTelephonyCallbackMap.containsKey(subId) || !mTelephonyManagerMap.containsKey(subId)) {
             PhoneCallStateTelephonyCallback
                     telephonyCallback = new PhoneCallStateTelephonyCallback();
             mTelephonyManager.registerTelephonyCallback(mContext.getMainExecutor(),
@@ -435,8 +435,6 @@
             getUiccInfoBySubscriptionInfo(uiccSlotInfos, subInfo);
             SubscriptionInfo firstRemovableSubInfo = SubscriptionUtil.getFirstRemovableSubscription(
                     context);
-            SubscriptionInfo subscriptionOrDefault = SubscriptionUtil.getSubscriptionOrDefault(
-                    context, mSubId);
             if(DEBUG){
                 Log.d(TAG, "convert subscriptionInfo to entity for subId = " + mSubId);
             }
@@ -455,8 +453,7 @@
                     firstRemovableSubInfo == null ? false
                             : firstRemovableSubInfo.getSubscriptionId() == mSubId,
                     String.valueOf(SubscriptionUtil.getDefaultSimConfig(context, mSubId)),
-                    subscriptionOrDefault == null ? false
-                            : subscriptionOrDefault.getSubscriptionId() == mSubId,
+                    SubscriptionUtil.isDefaultSubscription(context, mSubId),
                     mSubscriptionManager.isValidSubscriptionId(mSubId),
                     mSubscriptionManager.isUsableSubscriptionId(mSubId),
                     mSubscriptionManager.isActiveSubscriptionId(mSubId),
@@ -540,11 +537,11 @@
                 SubscriptionUtil.getSelectableSubscriptionInfoList(mContext));
     }
 
-    private void insertAvailableSubInfoToEntity(List<SubscriptionInfo> availableInfoList) {
+    private void insertAvailableSubInfoToEntity(List<SubscriptionInfo> inputAvailableInfoList) {
         sExecutor.execute(() -> {
             SubscriptionInfoEntity[] availableInfoArray = mAvailableSubInfoEntityList.toArray(
                     new SubscriptionInfoEntity[0]);
-            if ((availableInfoList == null || availableInfoList.size() == 0)
+            if ((inputAvailableInfoList == null || inputAvailableInfoList.size() == 0)
                     && mAvailableSubInfoEntityList.size() != 0) {
                 if (DEBUG) {
                     Log.d(TAG, "availableSudInfoList from framework is empty, remove all subs");
@@ -554,11 +551,12 @@
                     deleteAllInfoBySubId(info.subId);
                 }
 
-            } else if (availableInfoList != null) {
-                SubscriptionInfo[] infoArray = availableInfoList.toArray(new SubscriptionInfo[0]);
+            } else if (inputAvailableInfoList != null) {
+                SubscriptionInfo[] inputAvailableInfoArray = inputAvailableInfoList.toArray(
+                        new SubscriptionInfo[0]);
                 // Remove the redundant subInfo
-                if (availableInfoList.size() <= mAvailableSubInfoEntityList.size()) {
-                    for (SubscriptionInfo subInfo : infoArray) {
+                if (inputAvailableInfoList.size() <= mAvailableSubInfoEntityList.size()) {
+                    for (SubscriptionInfo subInfo : inputAvailableInfoArray) {
                         int subId = subInfo.getSubscriptionId();
                         if (mSubscriptionInfoMap.containsKey(subId)) {
                             mSubscriptionInfoMap.remove(subId);
@@ -571,11 +569,20 @@
                                 deleteAllInfoBySubId(String.valueOf(key));
                             }
                         }
+                    } else if (inputAvailableInfoList.size() < mAvailableSubInfoEntityList.size()) {
+                        // Check the subInfo between the new list from framework and old list in
+                        // the database, if the subInfo is not existed in the new list, delete it
+                        // from the database.
+                        for (SubscriptionInfoEntity info : availableInfoArray) {
+                            if (sCacheSubscriptionInfoEntityMap.containsKey(info.subId)) {
+                                deleteAllInfoBySubId(info.subId);
+                            }
+                        }
                     }
                 }
 
                 // Insert all new available subInfo to database.
-                for (SubscriptionInfo subInfo : infoArray) {
+                for (SubscriptionInfo subInfo : inputAvailableInfoArray) {
                     if (DEBUG) {
                         Log.d(TAG, "insert subInfo to subInfoEntity, subInfo = " + subInfo);
                     }
diff --git a/src/com/android/settings/network/NetworkProviderCallsSmsController.java b/src/com/android/settings/network/NetworkProviderCallsSmsController.java
index 4ad0470..ced2b8a 100644
--- a/src/com/android/settings/network/NetworkProviderCallsSmsController.java
+++ b/src/com/android/settings/network/NetworkProviderCallsSmsController.java
@@ -101,7 +101,9 @@
             return setSummaryResId(R.string.calls_sms_no_sim);
         } else {
             final StringBuilder summary = new StringBuilder();
-            for (SubscriptionInfoEntity subInfo : list) {
+            SubscriptionInfoEntity[] entityArray = list.toArray(
+                    new SubscriptionInfoEntity[0]);
+            for (SubscriptionInfoEntity subInfo : entityArray) {
                 int subsSize = list.size();
                 int subId = Integer.parseInt(subInfo.subId);
                 final CharSequence displayName = subInfo.uniqueName;
@@ -125,7 +127,7 @@
                             .append(")");
                 }
                 // Do not add ", " for the last subscription.
-                if (!subInfo.equals(list.get(list.size() - 1))) {
+                if (list.size() > 0 && !subInfo.equals(list.get(list.size() - 1))) {
                     summary.append(", ");
                 }
 
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index 13bb519..9c4ac03 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -688,6 +688,12 @@
                         .findFirst().orElse(null);
     }
 
+    public static boolean isDefaultSubscription(Context context, int subId) {
+        SubscriptionAnnotation subInfo = getDefaultSubscriptionSelection(
+                new SelectableSubscriptions(context, true).call());
+        return subInfo != null && subInfo.getSubscriptionId() == subId;
+    }
+
     public static SubscriptionInfo getSubscriptionOrDefault(Context context, int subscriptionId) {
         return getSubscription(context, subscriptionId,
                 (subscriptionId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) ? null : (
diff --git a/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java b/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java
index 4f9e138..46ec61d 100644
--- a/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java
+++ b/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java
@@ -114,15 +114,12 @@
     @Override
     public void onActiveSubInfoChanged(List<SubscriptionInfoEntity> subInfoEntityList) {
         // TODO(b/262195754): Need the intent to enabled the feature.
-//        if (DataServiceUtils.shouldUpdateEntityList(mSubscriptionInfoEntityList,
-//                subInfoEntityList)) {
-//            mSubscriptionInfoEntityList = subInfoEntityList;
-//            mSubscriptionInfoEntityList.forEach(entity -> {
-//                if (Integer.parseInt(entity.subId) == mSubId) {
-//                    mSubscriptionInfoEntity = entity;
-//                    update();
-//                }
-//            });
-//        }
+//        mSubscriptionInfoEntityList = subInfoEntityList;
+//        mSubscriptionInfoEntityList.forEach(entity -> {
+//            if (Integer.parseInt(entity.subId) == mSubId) {
+//                mSubscriptionInfoEntity = entity;
+//                update();
+//            }
+//        });
     }
 }
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index 1ff5e17..d5b2c2e 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -23,6 +23,7 @@
 import android.os.Bundle;
 import android.os.UserManager;
 import android.provider.Settings;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
@@ -150,7 +151,7 @@
                         MobileNetworkUtils.getSearchableSubscriptionId(context));
                 Log.d(LOG_TAG, "display subId from intent: " + mSubId);
             } else {
-                Log.d(LOG_TAG, "intent is null, can not get the subId from intent.");
+                Log.d(LOG_TAG, "intent is null, can not get subId " + mSubId + " from intent.");
             }
         } else {
             mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID,
@@ -165,9 +166,7 @@
                     mMobileNetworkRepository.queryMobileNetworkInfoBySubId(
                             String.valueOf(mSubId));
         });
-        if (mSubId <= SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            return Arrays.asList();
-        }
+
         return Arrays.asList(
                 new DataUsageSummaryPreferenceController(getActivity(), getSettingsLifecycle(),
                         this, mSubId),
@@ -178,8 +177,6 @@
                 new SmsDefaultSubscriptionController(context, KEY_SMS_PREF, getSettingsLifecycle(),
                         this),
                 new MobileDataPreferenceController(context, KEY_MOBILE_DATA_PREF,
-                        getSettingsLifecycle(), this, mSubId),
-                new ConvertToEsimPreferenceController(context, KEY_CONVERT_TO_ESIM_PREF,
                         getSettingsLifecycle(), this, mSubId));
     }
 
@@ -188,8 +185,14 @@
         super.onAttach(context);
 
         if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            Log.d(LOG_TAG, "Invalid subId request " + mSubId);
-            return;
+            Log.d(LOG_TAG, "Invalid subId, get the default subscription to show.");
+            SubscriptionInfo info = SubscriptionUtil.getSubscriptionOrDefault(context, mSubId);
+            if (info == null) {
+                Log.d(LOG_TAG, "Invalid subId request " + mSubId);
+                return;
+            }
+            mSubId = info.getSubscriptionId();
+            Log.d(LOG_TAG, "Show NetworkSettings fragment for subId" + mSubId);
         }
 
         Intent intent = getIntent();
@@ -291,7 +294,11 @@
         use(ContactDiscoveryPreferenceController.class).init(getParentFragmentManager(), mSubId);
         use(NrAdvancedCallingPreferenceController.class).init(mSubId);
         use(TransferEsimPreferenceController.class).init(mSubId, mSubscriptionInfoEntity);
-        use(ConvertToEsimPreferenceController.class).init(mSubId, mSubscriptionInfoEntity);
+        final ConvertToEsimPreferenceController convertToEsimPreferenceController =
+                use(ConvertToEsimPreferenceController.class);
+        if (convertToEsimPreferenceController != null) {
+            convertToEsimPreferenceController.init(mSubId, mSubscriptionInfoEntity);
+        }
     }
 
     @Override
@@ -321,7 +328,6 @@
     }
 
     private void onSubscriptionDetailChanged() {
-
         if (mSubscriptionInfoEntity != null) {
             /**
              * Update the title when SIM stats got changed
@@ -451,7 +457,7 @@
         ContactDiscoveryDialogFragment fragment = getContactDiscoveryFragment(mSubId);
 
         if (mSubscriptionInfoEntity == null) {
-            Log.d(LOG_TAG, "Zoey, showContactDiscoveryDialog, Invalid subId request " + mSubId);
+            Log.d(LOG_TAG, "showContactDiscoveryDialog, Invalid subId request " + mSubId);
             onDestroy();
             return;
         }
@@ -488,13 +494,20 @@
         }
 
         mSubInfoEntityList = subInfoEntityList;
-        mSubInfoEntityList.forEach(entity -> {
+        SubscriptionInfoEntity[] entityArray = mSubInfoEntityList.toArray(
+                new SubscriptionInfoEntity[0]);
+        for (SubscriptionInfoEntity entity : entityArray) {
             int subId = Integer.parseInt(entity.subId);
             mSubscriptionInfoMap.put(subId, entity);
-            if (subId == mSubId) {
+            if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID && subId == mSubId) {
                 mSubscriptionInfoEntity = entity;
-                onSubscriptionDetailChanged();
+                Log.d(LOG_TAG, "Set subInfo for subId " + mSubId);
+                break;
+            } else if (entity.isDefaultSubscriptionSelection) {
+                mSubscriptionInfoEntity = entity;
+                Log.d(LOG_TAG, "Set subInfo to the default subInfo.");
             }
-        });
+        }
+        onSubscriptionDetailChanged();
     }
 }