Merge "Import translations. DO NOT MERGE ANYWHERE" into tm-qpr-dev
diff --git a/res/layout/homepage_preference.xml b/res/layout/homepage_preference.xml
index ed1a2f1..18ecdcf 100644
--- a/res/layout/homepage_preference.xml
+++ b/res/layout/homepage_preference.xml
@@ -39,8 +39,8 @@
 
         <androidx.preference.internal.PreferenceImageView
             android:id="@android:id/icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="24dp"
+            android:layout_height="24dp"
             app:maxWidth="48dp"
             app:maxHeight="48dp"/>
 
diff --git a/res/values/config.xml b/res/values/config.xml
index 93d82a8..205b9b5 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -636,4 +636,8 @@
 
     <!-- Whether to enable the app battery usage list page feature. -->
     <bool name="config_app_battery_usage_list_enabled">false</bool>
+
+    <!-- Whether sim related information is visible to the end user. -->
+    <bool name="config_show_sim_info">true</bool>
+
 </resources>
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index 9547318..9b80410 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -58,6 +58,7 @@
             android:title="@string/status_number"
             android:summary="@string/summary_placeholder"
             android:selectable="false"
+            settings:isPreferenceVisible="@bool/config_show_sim_info"
             settings:controller="com.android.settings.deviceinfo.PhoneNumberPreferenceController"
             settings:enableCopying="true"/>
     </PreferenceCategory>
@@ -99,6 +100,7 @@
             android:title="@string/sim_status_title"
             settings:keywords="@string/keywords_sim_status"
             android:summary="@string/summary_placeholder"
+            settings:isPreferenceVisible="@bool/config_show_sim_info"
             settings:enableCopying="true"/>
 
         <!-- Model & hardware -->
@@ -120,6 +122,7 @@
             android:summary="@string/summary_placeholder"
             settings:keywords="@string/keywords_imei_info"
             settings:enableCopying="true"
+            settings:isPreferenceVisible="@bool/config_show_sim_info"
             settings:controller="com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController"/>
 
         <!-- Android version -->
diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml
index 07e797a..c9c576e 100644
--- a/res/xml/network_provider_internet.xml
+++ b/res/xml/network_provider_internet.xml
@@ -37,6 +37,7 @@
         android:icon="@drawable/ic_calls_sms"
         android:order="-20"
         android:summary="@string/summary_placeholder"
+        settings:isPreferenceVisible="@bool/config_show_sim_info"
         settings:allowDividerBelow="true"
         settings:keywords="@string/calls_and_sms"
         settings:useAdminDisabledSummary="true" />
@@ -49,6 +50,7 @@
         android:order="-15"
         settings:keywords="@string/keywords_more_mobile_networks"
         settings:userRestriction="no_config_mobile_networks"
+        settings:isPreferenceVisible="@bool/config_show_sim_info"
         settings:allowDividerAbove="true"
         settings:useAdminDisabledSummary="true" />
 
@@ -66,6 +68,7 @@
         android:persistent="false"
         android:order="19"
         settings:userRestriction="no_config_mobile_networks"
+        settings:isPreferenceVisible="@bool/config_show_sim_info"
         settings:useAdminDisabledSummary="true" />
 
     <com.android.settingslib.RestrictedPreference
diff --git a/res/xml/network_provider_settings.xml b/res/xml/network_provider_settings.xml
index 92eca76..1921ece 100644
--- a/res/xml/network_provider_settings.xml
+++ b/res/xml/network_provider_settings.xml
@@ -46,6 +46,7 @@
         android:key="provider_model_mobile_network"
         android:title="@string/summary_placeholder"
         android:layout="@layout/preference_category_no_label"
+        settings:isPreferenceVisible="@bool/config_show_sim_info"
         settings:controller="com.android.settings.network.NetworkMobileProviderController"/>
 
     <com.android.settingslib.RestrictedSwitchPreference
diff --git a/res/xml/reset_dashboard_fragment.xml b/res/xml/reset_dashboard_fragment.xml
index 9497c8f..25161a5 100644
--- a/res/xml/reset_dashboard_fragment.xml
+++ b/res/xml/reset_dashboard_fragment.xml
@@ -37,6 +37,7 @@
     <Preference
         android:key="erase_euicc_data"
         android:title="@string/reset_esim_title"
+        settings:isPreferenceVisible="@bool/config_show_sim_info"
         settings:controller="com.android.settings.network.EraseEuiccDataController" />
 
     <!-- Factory reset -->
diff --git a/res/xml/security_advanced_settings.xml b/res/xml/security_advanced_settings.xml
index 6d43fe7..b36fc73 100644
--- a/res/xml/security_advanced_settings.xml
+++ b/res/xml/security_advanced_settings.xml
@@ -64,6 +64,7 @@
         android:order="50"
         android:key="sim_lock_settings"
         android:title="@string/sim_lock_settings_category"
+        settings:isPreferenceVisible="@bool/config_show_sim_info"
         settings:controller="com.android.settings.security.SimLockPreferenceController">
 
         <intent
@@ -103,6 +104,7 @@
         android:key="confirm_sim_deletion"
         android:title="@string/confirm_sim_deletion_title"
         android:summary="@string/confirm_sim_deletion_description"
+        settings:isPreferenceVisible="@bool/config_show_sim_info"
         settings:controller="com.android.settings.security.ConfirmSimDeletionPreferenceController" />
 
     <!-- work profile security section -->
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 71eb0f2..8e54e31 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -174,8 +174,9 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        if (Utils.isMonkeyRunning()) {
-            finish();
+        if (Utils.isMonkeyRunning() ||
+                !SubscriptionUtil.isSimHardwareVisible(getContext())) {
+            finishFragment();
             return;
         }
 
diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java
index 2b0f010..1434d72 100644
--- a/src/com/android/settings/MainClear.java
+++ b/src/com/android/settings/MainClear.java
@@ -64,6 +64,7 @@
 
 import com.android.settings.core.InstrumentedFragment;
 import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper;
+import com.android.settings.network.SubscriptionUtil;
 import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.password.ConfirmLockPattern;
 import com.android.settingslib.RestrictedLockUtilsInternal;
@@ -382,6 +383,14 @@
     }
 
     /**
+     * Whether to show any UI which is SIM related.
+     */
+    @VisibleForTesting
+    boolean showAnySubscriptionInfo(Context context) {
+        return (context != null) && SubscriptionUtil.isSimHardwareVisible(context);
+    }
+
+    /**
      * Whether to show strings indicating that the eUICC will be wiped.
      *
      * <p>We show the strings on any device which supports eUICC as long as the eUICC was ever
@@ -390,7 +399,7 @@
     @VisibleForTesting
     boolean showWipeEuicc() {
         Context context = getContext();
-        if (!isEuiccEnabled(context)) {
+        if (!showAnySubscriptionInfo(context) || !isEuiccEnabled(context)) {
             return false;
         }
         ContentResolver cr = context.getContentResolver();
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
index 7e58c0b..1529a23 100644
--- a/src/com/android/settings/ResetNetwork.java
+++ b/src/com/android/settings/ResetNetwork.java
@@ -239,6 +239,9 @@
     }
 
     private List<SubscriptionInfo> getActiveSubscriptionInfoList() {
+        if (!SubscriptionUtil.isSimHardwareVisible(getActivity())) {
+            return Collections.emptyList();
+        }
         SubscriptionManager mgr = getActivity().getSystemService(SubscriptionManager.class);
         if (mgr == null) {
             Log.w(TAG, "No SubscriptionManager");
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index 24fe4e1..9aa363a 100644
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -203,7 +203,7 @@
     public static String findBluetoothPackageName(Context context)
             throws NameNotFoundException {
         // this activity will always be in the package where the rest of Bluetooth lives
-        String sentinelActivity = "com.android.bluetooth.opp.BluetoothOppLauncherActivity";
+        final String sentinelActivity = "com.android.bluetooth.opp.BluetoothOppLauncherActivity";
         PackageManager packageManager = context.createContextAsUser(UserHandle.SYSTEM, 0)
                 .getPackageManager();
         String[] allPackages = packageManager.getPackagesForUid(BLUETOOTH_UID);
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 80c9ec6..f6dd0b7 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -382,10 +382,8 @@
         // Icon provided by the content provider overrides any static icon.
         if (tile.getMetaData() != null
                 && tile.getMetaData().containsKey(META_DATA_PREFERENCE_ICON_URI)) {
-            // Set a transparent color before starting to fetch the real icon, this is necessary
-            // to avoid preference padding change.
-            setPreferenceIcon(preference, tile, forceRoundedIcon, mContext.getPackageName(),
-                    Icon.createWithResource(mContext, android.R.color.transparent));
+            // Reserve the icon space to avoid preference padding change.
+            preference.setIconSpaceReserved(true);
 
             ThreadUtils.postOnBackgroundThread(() -> {
                 final Intent intent = tile.getIntent();
diff --git a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
index f1677f2..a1467c8 100644
--- a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
@@ -41,15 +41,13 @@
 
     private int mDefaultMaxConnectedAudioDevices = 0;
 
-    private final BluetoothManager mBluetoothManager;
-
     public BluetoothMaxConnectedAudioDevicesPreferenceController(Context context) {
         super(context);
 
-        mBluetoothManager = context.getSystemService(BluetoothManager.class);
+        final BluetoothManager bluetoothManager = context.getSystemService(BluetoothManager.class);
 
         mDefaultMaxConnectedAudioDevices =
-              mBluetoothManager.getAdapter().getMaxConnectedAudioDevices();
+              bluetoothManager.getAdapter().getMaxConnectedAudioDevices();
     }
 
     @Override
diff --git a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java
index 99c572d..5b247f8 100644
--- a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java
@@ -29,6 +29,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.network.SubscriptionUtil;
 import com.android.settingslib.DeviceInfoUtils;
 
 import java.util.ArrayList;
@@ -51,7 +52,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return mTelephonyManager.isVoiceCapable() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+        return SubscriptionUtil.isSimHardwareVisible(mContext) ?
+                AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
@@ -62,6 +64,9 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
+        if (!SubscriptionUtil.isSimHardwareVisible(mContext)) {
+            return;
+        }
         final Preference preference = screen.findPreference(getPreferenceKey());
         final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY);
         mPreferenceList.add(preference);
diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
index 027e8c8..d6f8a51 100644
--- a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
@@ -33,6 +33,7 @@
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.deviceinfo.PhoneNumberSummaryPreference;
+import com.android.settings.network.SubscriptionUtil;
 import com.android.settingslib.Utils;
 
 import java.util.ArrayList;
@@ -63,6 +64,9 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
+        if (!SubscriptionUtil.isSimHardwareVisible(mContext)) {
+            return;
+        }
         final Preference preference = screen.findPreference(getPreferenceKey());
         final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY);
 
@@ -118,7 +122,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return mContext.getSystemService(UserManager.class).isAdminUser()
+        return SubscriptionUtil.isSimHardwareVisible(mContext) &&
+                mContext.getSystemService(UserManager.class).isAdminUser()
                 && !Utils.isWifiOnly(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java
index 4204ec1..96f8b62 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java
@@ -29,6 +29,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.network.SubscriptionUtil;
 import com.android.settingslib.deviceinfo.AbstractSimStatusImeiInfoPreferenceController;
 
 import java.util.ArrayList;
@@ -60,8 +61,17 @@
     }
 
     @Override
+    public boolean isAvailable() {
+        return SubscriptionUtil.isSimHardwareVisible(mContext) &&
+                super.isAvailable();
+    }
+
+    @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
+        if (!SubscriptionUtil.isSimHardwareVisible(mContext)) {
+            return;
+        }
         final Preference preference = screen.findPreference(getPreferenceKey());
         if (!isAvailable() || preference == null || !preference.isVisible()) {
             return;
diff --git a/src/com/android/settings/network/EraseEuiccDataController.java b/src/com/android/settings/network/EraseEuiccDataController.java
index b1f964b..091b6d7 100644
--- a/src/com/android/settings/network/EraseEuiccDataController.java
+++ b/src/com/android/settings/network/EraseEuiccDataController.java
@@ -51,7 +51,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return mContext.getPackageManager().hasSystemFeature(
+        return SubscriptionUtil.isSimHardwareVisible(mContext) &&
+                mContext.getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_TELEPHONY_EUICC) ? AVAILABLE_UNSEARCHABLE
                 : UNSUPPORTED_ON_DEVICE;
     }
diff --git a/src/com/android/settings/network/MobileNetworkListFragment.java b/src/com/android/settings/network/MobileNetworkListFragment.java
index 7881690..ea7031a 100644
--- a/src/com/android/settings/network/MobileNetworkListFragment.java
+++ b/src/com/android/settings/network/MobileNetworkListFragment.java
@@ -60,6 +60,10 @@
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        if (!SubscriptionUtil.isSimHardwareVisible(getContext())) {
+            finish();
+            return controllers;
+        }
 
         NetworkProviderSimsCategoryController simCategoryPrefCtrl =
                 new NetworkProviderSimsCategoryController(context, KEY_PREFERENCE_CATEGORY_SIM,
@@ -88,7 +92,8 @@
 
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
-                    return context.getSystemService(UserManager.class).isAdminUser();
+                    return SubscriptionUtil.isSimHardwareVisible(context) &&
+                            context.getSystemService(UserManager.class).isAdminUser();
                 }
             };
 }
diff --git a/src/com/android/settings/network/MobileNetworkSummaryController.java b/src/com/android/settings/network/MobileNetworkSummaryController.java
index 1a85a7f..61dd079 100644
--- a/src/com/android/settings/network/MobileNetworkSummaryController.java
+++ b/src/com/android/settings/network/MobileNetworkSummaryController.java
@@ -206,7 +206,8 @@
 
     @Override
     public boolean isAvailable() {
-        return !Utils.isWifiOnly(mContext) && mUserManager.isAdminUser();
+        return SubscriptionUtil.isSimHardwareVisible(mContext) &&
+                !Utils.isWifiOnly(mContext) && mUserManager.isAdminUser();
     }
 
     @Override
diff --git a/src/com/android/settings/network/NetworkProviderCallsSmsController.java b/src/com/android/settings/network/NetworkProviderCallsSmsController.java
index c8b1c49..585c99e 100644
--- a/src/com/android/settings/network/NetworkProviderCallsSmsController.java
+++ b/src/com/android/settings/network/NetworkProviderCallsSmsController.java
@@ -190,7 +190,8 @@
 
     @Override
     public boolean isAvailable() {
-        return mUserManager.isAdminUser();
+        return SubscriptionUtil.isSimHardwareVisible(mContext) &&
+                mUserManager.isAdminUser();
     }
 
     @Override
diff --git a/src/com/android/settings/network/NetworkProviderCallsSmsFragment.java b/src/com/android/settings/network/NetworkProviderCallsSmsFragment.java
index aad9b10..b2cf74e 100644
--- a/src/com/android/settings/network/NetworkProviderCallsSmsFragment.java
+++ b/src/com/android/settings/network/NetworkProviderCallsSmsFragment.java
@@ -100,7 +100,8 @@
 
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
-                    return context.getSystemService(UserManager.class).isAdminUser();
+                    return SubscriptionUtil.isSimHardwareVisible(context) &&
+                            context.getSystemService(UserManager.class).isAdminUser();
                 }
             };
 }
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index c5295e6..19ebd36 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -342,7 +342,18 @@
         }
     }
 
+    /**
+     * Whether to show any UI which is SIM related.
+     */
+    @VisibleForTesting
+    boolean showAnySubscriptionInfo(Context context) {
+        return (context != null) && SubscriptionUtil.isSimHardwareVisible(context);
+    }
+
     private void addNetworkMobileProviderController() {
+        if (!showAnySubscriptionInfo(getContext())) {
+            return;
+        }
         if (mNetworkMobileProviderController == null) {
             mNetworkMobileProviderController = new NetworkMobileProviderController(
                     getContext(), PREF_KEY_PROVIDER_MOBILE_NETWORK);
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index 0bba86f..ccfcfb0 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -86,6 +86,14 @@
         return subscriptions;
     }
 
+    /**
+     * Check if SIM hardware is visible to the end user.
+     */
+    public static boolean isSimHardwareVisible(Context context) {
+        return context.getResources()
+            .getBoolean(R.bool.config_show_sim_info);
+    }
+
     @VisibleForTesting
     static boolean isInactiveInsertedPSim(UiccSlotInfo slotInfo) {
         if (slotInfo == null)  {
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index 94b6aaf..05e58e9 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -120,6 +120,10 @@
 
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        if (!SubscriptionUtil.isSimHardwareVisible(context)) {
+            finish();
+            return Arrays.asList();
+        }
         if (getArguments() == null) {
             Intent intent = getIntent();
             if (intent != null) {
@@ -398,7 +402,8 @@
                 /** suppress full page if user is not admin */
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
-                    return context.getSystemService(UserManager.class).isAdminUser();
+                    return SubscriptionUtil.isSimHardwareVisible(context) &&
+                            context.getSystemService(UserManager.class).isAdminUser();
                 }
             };
 
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index e769a4e..8305c4a 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -263,6 +263,9 @@
      * the user has enabled development mode.
      */
     public static boolean showEuiccSettings(Context context) {
+        if (!SubscriptionUtil.isSimHardwareVisible(context)) {
+            return false;
+        }
         long timeForAccess = SystemClock.elapsedRealtime();
         try {
             Boolean isShow = ((Future<Boolean>) ThreadUtils.postOnBackgroundThread(() -> {
diff --git a/src/com/android/settings/security/SimLockPreferenceController.java b/src/com/android/settings/security/SimLockPreferenceController.java
index 6f663c2..3057c98 100644
--- a/src/com/android/settings/security/SimLockPreferenceController.java
+++ b/src/com/android/settings/security/SimLockPreferenceController.java
@@ -28,6 +28,7 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.network.SubscriptionUtil;
 
 import java.util.List;
 
@@ -50,6 +51,10 @@
 
     @Override
     public int getAvailabilityStatus() {
+        if (!SubscriptionUtil.isSimHardwareVisible(mContext)) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+
         final List<SubscriptionInfo> subInfoList =
                 mSubscriptionManager.getActiveSubscriptionInfoList();
 
diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java
index 9c4f8f1..464ba9b 100644
--- a/src/com/android/settings/sim/SimDialogActivity.java
+++ b/src/com/android/settings/sim/SimDialogActivity.java
@@ -35,6 +35,7 @@
 import androidx.fragment.app.FragmentManager;
 
 import com.android.settings.R;
+import com.android.settings.network.SubscriptionUtil;
 import com.android.settings.network.telephony.SubscriptionActionDialogActivity;
 
 import java.util.List;
@@ -65,6 +66,11 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        if (!SubscriptionUtil.isSimHardwareVisible(this)) {
+            Log.d(TAG, "Not support on device without SIM.");
+            finish();
+            return;
+        }
         SimDialogProhibitService.supportDismiss(this);
 
         getWindow().addSystemFlags(
diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java
index 9d3f860..9b235ce 100644
--- a/src/com/android/settings/sim/SimSelectNotification.java
+++ b/src/com/android/settings/sim/SimSelectNotification.java
@@ -77,6 +77,10 @@
 
     @Override
     public void onReceive(Context context, Intent intent) {
+        if (!SubscriptionUtil.isSimHardwareVisible(context)) {
+            Log.w(TAG, "Received unexpected intent with null action.");
+            return;
+        }
         String action = intent.getAction();
 
         if (action == null) {
diff --git a/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java b/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java
index 217801e..070e65a 100644
--- a/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java
+++ b/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java
@@ -38,6 +38,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.SettingsBaseActivity;
+import com.android.settings.network.SubscriptionUtil;
 
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
@@ -48,6 +49,7 @@
 import java.util.concurrent.Executors;
 
 public class SmartForwardingActivity extends SettingsBaseActivity {
+    static final String LOG_TAG = SmartForwardingActivity.class.toString();
     final ListeningExecutorService service =
             MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
 
@@ -55,6 +57,12 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        if (!SubscriptionUtil.isSimHardwareVisible(this)) {
+            Log.d(LOG_TAG, "Not support on device without SIM.");
+            finish();
+            return;
+        }
+
         final Toolbar toolbar = findViewById(R.id.action_bar);
         toolbar.setVisibility(View.VISIBLE);
         setActionBar(toolbar);
@@ -166,4 +174,4 @@
                 .create();
         mDialog.show();
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java
index 30e9967..6db5710 100644
--- a/src/com/android/settings/tts/TextToSpeechSettings.java
+++ b/src/com/android/settings/tts/TextToSpeechSettings.java
@@ -228,7 +228,9 @@
         // them to resize, which results in the recyclerview smoothly animating them at inopportune
         // times. Disable the animation so widgets snap to their positions rather than sliding
         // around while the user is interacting with it.
-        getListView().getItemAnimator().setMoveDuration(0);
+        if (getListView().getItemAnimator() != null) {
+            getListView().getItemAnimator().setMoveDuration(0);
+        }
 
         if (mTts == null || mCurrentDefaultLocale == null) {
             return;
diff --git a/tests/robotests/src/com/android/settings/MainClearTest.java b/tests/robotests/src/com/android/settings/MainClearTest.java
index ec33fad..9795092 100644
--- a/tests/robotests/src/com/android/settings/MainClearTest.java
+++ b/tests/robotests/src/com/android/settings/MainClearTest.java
@@ -102,7 +102,10 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mMainClear = spy(new MainClear());
+        mMainClear = spy(new MainClear() {
+            @Override
+            boolean showAnySubscriptionInfo(Context context) { return true; }
+        });
         mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mShadowActivity = Shadows.shadowOf(mActivity);
         UserManager userManager = mActivity.getSystemService(UserManager.class);
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java
index 55194ad..bae629c 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceControllerTest.java
@@ -29,6 +29,7 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.os.UserManager;
 import android.telephony.TelephonyManager;
 
@@ -69,12 +70,18 @@
     private PreferenceCategory mCategory;
 
     private Context mContext;
+    private Resources mResources;
     private ImeiInfoPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
+
+        mResources = spy(mContext.getResources());
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
+
         doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
         mController = spy(new ImeiInfoPreferenceController(mContext, "imei_info"));
         mController.setHost(mFragment);
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java
index 85a6fac..4ffaf7a 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceControllerTest.java
@@ -25,6 +25,7 @@
 
 import android.content.Context;
 import android.os.UserManager;
+import android.content.res.Resources;
 import android.telephony.TelephonyManager;
 
 import androidx.fragment.app.Fragment;
@@ -64,12 +65,18 @@
     private PreferenceCategory mCategory;
 
     private Context mContext;
+    private Resources mResources;
     private SimStatusPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
+
+        mResources = spy(mContext.getResources());
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
+
         doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
         mController = spy(new SimStatusPreferenceController(mContext, mFragment));
         doReturn(true).when(mController).isAvailable();
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java
index fd2b520..2e04ea7 100644
--- a/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java
@@ -21,8 +21,10 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.os.UserManager;
 
+import com.android.settings.R;
 import com.android.settings.search.BaseSearchIndexProvider;
 
 import org.junit.Before;
@@ -38,6 +40,8 @@
     @Mock
     private Context mContext;
     @Mock
+    private Resources mResources;
+    @Mock
     private UserManager mUserManager;
 
     private MobileNetworkListFragment mFragment;
@@ -55,6 +59,9 @@
         final BaseSearchIndexProvider provider =
                 (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER;
 
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
+
         final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled",
                 ReflectionHelpers.ClassParameter.from(Context.class, mContext));
         final boolean isEnabled = (Boolean) obj;
@@ -69,6 +76,9 @@
         final BaseSearchIndexProvider provider =
                 (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER;
 
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
+
         final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled",
                 ReflectionHelpers.ClassParameter.from(Context.class, mContext));
         final boolean isEnabled = (Boolean) obj;
diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
index 3589184..b347ac0 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
@@ -147,7 +147,10 @@
 
     @Before
     public void setUp() {
-        mNetworkProviderSettings = spy(new NetworkProviderSettings());
+        mNetworkProviderSettings = spy(new NetworkProviderSettings() {
+            @Override
+            boolean showAnySubscriptionInfo(Context context) { return true; }
+        });
         doReturn(mContext).when(mNetworkProviderSettings).getContext();
         doReturn(mPreferenceManager).when(mNetworkProviderSettings).getPreferenceManager();
         doReturn(mPowerManager).when(mContext).getSystemService(PowerManager.class);
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java
index 44611ce..3e219a4 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java
@@ -29,6 +29,7 @@
 import android.app.Activity;
 import android.app.usage.NetworkStatsManager;
 import android.content.Context;
+import android.content.res.Resources;
 import android.net.NetworkPolicyManager;
 import android.os.Bundle;
 import android.os.UserManager;
@@ -37,6 +38,7 @@
 
 import androidx.fragment.app.FragmentActivity;
 
+import com.android.settings.R;
 import com.android.settings.datausage.DataUsageSummaryPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
@@ -68,12 +70,18 @@
     private FragmentActivity mActivity;
 
     private Context mContext;
+    private Resources mResources;
     private MobileNetworkSettings mFragment;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
+
+        mResources = spy(mContext.getResources());
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
+
         when(mActivity.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
         when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
         when(mContext.getSystemService(NetworkStatsManager.class)).thenReturn(mNetworkStatsManager);
diff --git a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
index ef5973c..f38cc49 100644
--- a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
@@ -22,9 +22,11 @@
 
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.os.PersistableBundle;
 import android.os.UserManager;
 import android.telephony.CarrierConfigManager;
@@ -35,6 +37,7 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
+import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 
 import org.junit.Before;
@@ -66,6 +69,7 @@
     private SimLockPreferenceController mController;
     private Preference mPreference;
     private Context mContext;
+    private Resources mResources;
 
     @Before
     public void setUp() {
@@ -76,7 +80,11 @@
         shadowApplication.setSystemService(Context.CARRIER_CONFIG_SERVICE, mCarrierManager);
         shadowApplication.setSystemService(Context.USER_SERVICE, mUserManager);
         shadowApplication.setSystemService(Context.TELEPHONY_SERVICE, mTelephonyManager);
-        mContext = RuntimeEnvironment.application;
+        mContext = spy(RuntimeEnvironment.application);
+
+        mResources = spy(mContext.getResources());
+        when(mContext.getResources()).thenReturn(mResources);
+
         mController = new SimLockPreferenceController(mContext, "key");
         mPreference = new Preference(mContext);
         mPreference.setKey(mController.getPreferenceKey());
@@ -84,7 +92,16 @@
     }
 
     @Test
+    public void isAvailable_notShowSimUi_false() {
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
     public void isAvailable_notAdmin_false() {
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
         when(mUserManager.isAdminUser()).thenReturn(false);
 
         assertThat(mController.getAvailabilityStatus())
@@ -93,6 +110,7 @@
 
     @Test
     public void isAvailable_simIccNotReady_false() {
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
         when(mUserManager.isAdminUser()).thenReturn(true);
 
         assertThat(mController.getAvailabilityStatus())
@@ -124,6 +142,7 @@
 
     @Test
     public void displayPreference_simReady_enablePreference() {
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
         mController.displayPreference(mScreen);
 
         assertThat(mPreference.isEnabled()).isFalse();
@@ -140,12 +159,14 @@
 
     @Test
     public void getPreferenceKey_whenGivenValue_returnsGivenValue() {
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
         mController = new SimLockPreferenceController(mContext, "key");
 
         assertThat(mController.getPreferenceKey()).isEqualTo("key");
     }
 
     private void setupMockIcc() {
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
         final List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
         SubscriptionInfo info = mock(SubscriptionInfo.class);
         subscriptionInfoList.add(info);
@@ -156,6 +177,7 @@
     }
 
     private void setupMockSimReady() {
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
         final List<SubscriptionInfo> subscriptionInfoList = new ArrayList<>();
         SubscriptionInfo info = mock(SubscriptionInfo.class);
         subscriptionInfoList.add(info);
diff --git a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java
index b33e94b..e1b2b4e 100644
--- a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java
+++ b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java
@@ -143,6 +143,7 @@
         when(mSubInfo.getDisplayName()).thenReturn(mFakeDisplayName);
         when(mContext.getResources()).thenReturn(mResources);
 
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
         when(mResources.getText(R.string.enable_sending_mms_notification_title))
                 .thenReturn(mFakeNotificationTitle);
         when(mResources.getText(R.string.enable_mms_notification_channel_title))
diff --git a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
index 43a32b5..63dca7e 100644
--- a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
+++ b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
@@ -25,11 +25,14 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
+import com.android.settings.R;
+
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
@@ -58,6 +61,8 @@
     private SubscriptionManager mSubMgr;
     @Mock
     private TelephonyManager mTelMgr;
+    @Mock
+    private Resources mResources;
 
 
     @Before
@@ -443,4 +448,22 @@
     public void isInactiveInsertedPSim_nullSubInfo_doesNotCrash() {
         assertThat(SubscriptionUtil.isInactiveInsertedPSim(null)).isFalse();
     }
+
+    @Test
+    public void isSimHardwareVisible_configAsInvisible_returnFalse() {
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getBoolean(R.bool.config_show_sim_info))
+                .thenReturn(false);
+
+        assertThat(SubscriptionUtil.isSimHardwareVisible(mContext)).isFalse();
+    }
+
+    @Test
+    public void isSimHardwareVisible_configAsVisible_returnTrue() {
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getBoolean(R.bool.config_show_sim_info))
+                .thenReturn(true);
+
+        assertTrue(SubscriptionUtil.isSimHardwareVisible(mContext));
+    }
 }