Merge "Fix sim status details not updated after sim hotswap" into main
diff --git a/Android.bp b/Android.bp
index 0a58ee8..827f431 100644
--- a/Android.bp
+++ b/Android.bp
@@ -126,6 +126,7 @@
     },
 
     libs: [
+        "framework-virtualization.stubs.system",
         "telephony-common",
         "ims-common",
     ],
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7e363e6..2366f3b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13046,7 +13046,7 @@
     <string name="thread_network_settings_learn_more">Learn more about Thread</string>
 
     <!-- URL for Thread network settings learn more link [CHAR_LIMIT=NONE] -->
-    <string name="thread_network_settings_learn_more_link" translatable="false">https://developers.home.google.com</string>
+    <string name="thread_network_settings_learn_more_link" translatable="false">https://support.google.com/android?p=thread_toggle</string>
 
     <!-- Label for the camera use toggle [CHAR LIMIT=40] -->
     <string name="camera_toggle_title">Camera access</string>
diff --git a/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceController.java b/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceController.java
index cbb9181..3bd9587 100644
--- a/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceController.java
+++ b/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceController.java
@@ -16,10 +16,13 @@
 
 package com.android.settings.development.linuxterminal;
 
+import static android.system.virtualmachine.VirtualMachineManager.CAPABILITY_NON_PROTECTED_VM;
+
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.Process;
 import android.os.storage.StorageManager;
+import android.system.virtualmachine.VirtualMachineManager;
 import android.text.TextUtils;
 import android.util.DataUnit;
 
@@ -58,9 +61,13 @@
 
         StorageManager storageManager =
                 Objects.requireNonNull(context.getSystemService(StorageManager.class));
+        VirtualMachineManager virtualMachineManager =
+                Objects.requireNonNull(context.getSystemService(VirtualMachineManager.class));
         mIsDeviceCapable =
                 getTotalMemory() >= MEMORY_MIN_BYTES
-                        && storageManager.getPrimaryStorageSize() >= STORAGE_MIN_BYTES;
+                        && storageManager.getPrimaryStorageSize() >= STORAGE_MIN_BYTES
+                        && ((virtualMachineManager.getCapabilities() & CAPABILITY_NON_PROTECTED_VM)
+                                != 0);
     }
 
     // Avoid lazy initialization because this may be called before displayPreference().
diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java
index 1ae6b40..16440b2 100644
--- a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java
+++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java
@@ -100,8 +100,7 @@
 
         mDialog.setText(ID_PRL_VERSION_VALUE, getCdmaPrlVersion());
 
-        if ((mSubscriptionInfo != null && isCdmaLteEnabled()) ||
-                    (mSubscriptionInfo == null && isSimPresent(mSlotId))) {
+        if (isCdmaLteEnabled()) {
             // Show IMEI for LTE device
             mDialog.setText(ID_IMEI_VALUE, mTelephonyManager.getImei(mSlotId));
             mDialog.setText(ID_IMEI_SV_VALUE,
diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp
index 60a6803..7f33d14 100644
--- a/tests/robotests/Android.bp
+++ b/tests/robotests/Android.bp
@@ -80,6 +80,7 @@
 
     libs: [
         "android.test.mock.impl",
+        "framework-virtualization.stubs.system",
         "ims-common",
     ],
 
diff --git a/tests/robotests/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceControllerTest.java
index fffe6b1..d17b49b 100644
--- a/tests/robotests/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.development.linuxterminal;
 
+import static android.system.virtualmachine.VirtualMachineManager.CAPABILITY_NON_PROTECTED_VM;
+
 import static com.android.settings.development.linuxterminal.LinuxTerminalPreferenceController.MEMORY_MIN_BYTES;
 import static com.android.settings.development.linuxterminal.LinuxTerminalPreferenceController.STORAGE_MIN_BYTES;
 import static com.android.settings.development.linuxterminal.LinuxTerminalPreferenceController.TERMINAL_PACKAGE_NAME_RESID;
@@ -32,6 +34,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.storage.StorageManager;
+import android.system.virtualmachine.VirtualMachineManager;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -43,27 +46,33 @@
 /** Tests {@link LinuxTerminalPreferenceController} */
 @RunWith(RobolectricTestRunner.class)
 public class LinuxTerminalPreferenceControllerTest {
+    private static final String TERMINAL_PACKAGE_NAME = "com.android.virtualization.terminal";
 
     @Mock private Context mContext;
     @Mock private PackageManager mPackageManager;
     @Mock private StorageManager mStorageManager;
+    @Mock private VirtualMachineManager mVirtualMachineManager;
     @Mock private PackageInfo mPackageInfo;
 
-    private String mTerminalPackageName = "com.android.virtualization.terminal";
     private LinuxTerminalPreferenceController mController;
 
     @Before
     public void setup() throws Exception {
         MockitoAnnotations.initMocks(this);
-        doReturn(mTerminalPackageName).when(mContext).getString(TERMINAL_PACKAGE_NAME_RESID);
+        doReturn(TERMINAL_PACKAGE_NAME).when(mContext).getString(TERMINAL_PACKAGE_NAME_RESID);
 
         doReturn(mPackageManager).when(mContext).getPackageManager();
         doReturn(mPackageInfo)
                 .when(mPackageManager)
-                .getPackageInfo(eq(mTerminalPackageName), anyInt());
+                .getPackageInfo(eq(TERMINAL_PACKAGE_NAME), anyInt());
 
         doReturn(mStorageManager).when(mContext).getSystemService(StorageManager.class);
         doReturn(STORAGE_MIN_BYTES).when(mStorageManager).getPrimaryStorageSize();
+
+        doReturn(mVirtualMachineManager)
+                .when(mContext)
+                .getSystemService(VirtualMachineManager.class);
+        doReturn(CAPABILITY_NON_PROTECTED_VM).when(mVirtualMachineManager).getCapabilities();
     }
 
     @Test
@@ -83,6 +92,15 @@
     }
 
     @Test
+    public void isAvailable_whenVmNotSupported_returnFalse() {
+        doReturn(0).when(mVirtualMachineManager).getCapabilities();
+
+        mController = createController(mContext);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
     public void isAvailable_whenPackageExists_returnsTrue() {
         mController = createController(mContext);
 
@@ -102,7 +120,7 @@
     public void isAvailable_whenAppDoesNotExist_returnsFalse() throws Exception {
         doThrow(new NameNotFoundException())
                 .when(mPackageManager)
-                .getPackageInfo(eq(mTerminalPackageName), anyInt());
+                .getPackageInfo(eq(TERMINAL_PACKAGE_NAME), anyInt());
 
         mController = createController(mContext);
 
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java
index 89cc6d9..f68f67e 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java
@@ -143,36 +143,6 @@
     }
 
     @Test
-    public void populateImeiInfo_cdmaSimPresent_shouldSetImeiInfoAndSetAllCdmaSetting() {
-        ReflectionHelpers.setField(mController, "mSubscriptionInfo", null);
-        when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_CDMA);
-        when(mTelephonyManager.getSimState(anyInt())).thenReturn(
-                TelephonyManager.SIM_STATE_PRESENT);
-
-        mController.populateImeiInfo();
-
-        verify(mDialog).setText(ID_MEID_NUMBER_VALUE, MEID_NUMBER);
-        verify(mDialog).setText(ID_MIN_NUMBER_VALUE, "");
-        verify(mDialog).setText(ID_PRL_VERSION_VALUE, "");
-        verify(mDialog).setText(eq(ID_IMEI_VALUE), any());
-        verify(mDialog).setText(eq(ID_IMEI_SV_VALUE), any());
-    }
-
-    @Test
-    public void populateImeiInfo_cdmaSimABSENT_shouldSetImeiInfoAndSetAllCdmaSetting() {
-        ReflectionHelpers.setField(mController, "mSubscriptionInfo", null);
-        when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_CDMA);
-        when(mTelephonyManager.getSimState(anyInt())).thenReturn(TelephonyManager.SIM_STATE_ABSENT);
-
-        mController.populateImeiInfo();
-
-        verify(mDialog).setText(ID_MEID_NUMBER_VALUE, MEID_NUMBER);
-        verify(mDialog).setText(ID_MIN_NUMBER_VALUE, "");
-        verify(mDialog).setText(ID_PRL_VERSION_VALUE, "");
-        verify(mDialog).removeViewFromScreen(ID_GSM_SETTINGS);
-    }
-
-    @Test
     public void populateImeiInfo_gsmSimDisabled_shouldSetImeiAndRemoveCdmaSettings() {
         ReflectionHelpers.setField(mController, "mSubscriptionInfo", null);
         when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_GSM);
diff --git a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
index 5f887de..1c51d1d 100644
--- a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
@@ -60,6 +60,7 @@
 import com.android.settings.network.ims.MockWfcQueryImsState;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -396,6 +397,7 @@
     }
 
     @Test
+    @Ignore
     public void getCurrentCarrierNameForDisplay_withoutSubId_returnNotNull() {
         assertThat(MobileNetworkUtils.getCurrentCarrierNameForDisplay(
                 mContext)).isNotNull();