diff --git a/Android.bp b/Android.bp index 0a58ee8ea7c..827f431d463 100644 --- a/Android.bp +++ b/Android.bp @@ -126,6 +126,7 @@ android_library { }, 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 076a2832720..b78972a0bef 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 @@ public class LinuxTerminalPreferenceController extends DeveloperOptionsPreferenc 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 60a68033c95..7f33d14e645 100644 --- a/tests/robotests/Android.bp +++ b/tests/robotests/Android.bp @@ -80,6 +80,7 @@ android_robolectric_test { 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 fffe6b10a1c..d17b49be5cb 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.PackageInfo; 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 @@ import org.robolectric.RobolectricTestRunner; /** 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 @@ -82,6 +91,15 @@ public class LinuxTerminalPreferenceControllerTest { assertThat(mController.isAvailable()).isFalse(); } + @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 class LinuxTerminalPreferenceControllerTest { 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);