Hide Linux terminal if VM isn't supported
Bug: 385216798
Test: atest
Flag: Build.RELEASE_AVF_SUPPORT_CUSTOM_VM_WITH_PARAVIRTUALIZED_DEVICES
Change-Id: I06fe52cf877deb3cd9ebc61af1579931b97d7766
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/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceController.java b/src/com/android/settings/development/linuxterminal/LinuxTerminalPreferenceController.java
index 076a283..b78972a 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/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);