Disable pre-install kiosk app support for production
Test: atest DeviceLockControllerRoboTests
Fix: 281598123
Change-Id: I2dd8224f083ccc7a62399fe72c6a0b4b8ffba477
diff --git a/DeviceLockController/src/com/android/devicelockcontroller/policy/SetupControllerImpl.java b/DeviceLockController/src/com/android/devicelockcontroller/policy/SetupControllerImpl.java
index 0c49f97..66f1df2 100644
--- a/DeviceLockController/src/com/android/devicelockcontroller/policy/SetupControllerImpl.java
+++ b/DeviceLockController/src/com/android/devicelockcontroller/policy/SetupControllerImpl.java
@@ -40,6 +40,7 @@
import static com.android.devicelockcontroller.policy.SetupController.SetupUpdatesCallbacks.FailureType.VERIFICATION_FAILED;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Build;
@@ -78,8 +79,8 @@
private static final String SETUP_URL_INSTALL_TASKS_NAME = "devicelock_setup_url_install_tasks";
private static final String SETUP_PLAY_INSTALL_TASKS_NAME =
"devicelock_setup_play_install_tasks";
- public static final String SETUP_VERIFY_PRE_INSTALLED_PACKAGE_TASK =
- "devicelock_setup_verify_pre_installed_package_task";
+ public static final String SETUP_PRE_INSTALLED_PACKAGE_TASK =
+ "devicelock_setup_pre_installed_package_task";
public static final String TAG = "SetupController";
public static final String SETUP_INSTALL_EXISTING_PACKAGE_TASK =
"devicelock_setup_install_existing_package_task";
@@ -139,7 +140,7 @@
return Futures.transformAsync(isKioskAppPreInstalled(),
isPreinstalled -> {
if (isPreinstalled) {
- return verifyPreInstalledPackage(workManager, owner);
+ return assignRoleToPreinstalledPackage(workManager, owner);
} else if (mContext.getUser().isSystem()) {
final Class<? extends ListenableWorker> playInstallTaskClass =
((DeviceLockControllerApplication) mContext.getApplicationContext())
@@ -156,19 +157,22 @@
}, MoreExecutors.directExecutor());
}
- private ListenableFuture<Boolean> isKioskAppPreInstalled() {
- return Futures.transform(SetupParametersClient.getInstance().getKioskPackage(),
- packageName -> {
- try {
- mContext.getPackageManager().getPackageInfo(
- packageName, /* flags= */ 0);
- LogUtil.i(TAG, "Creditor app is pre-installed");
- return true;
- } catch (NameNotFoundException e) {
- LogUtil.i(TAG, "Creditor app is not pre-installed");
- return false;
- }
- }, MoreExecutors.directExecutor());
+ @VisibleForTesting
+ ListenableFuture<Boolean> isKioskAppPreInstalled() {
+ return !Build.isDebuggable() ? Futures.immediateFuture(false)
+ : Futures.transform(SetupParametersClient.getInstance().getKioskPackage(),
+ packageName -> {
+ try {
+ mContext.getPackageManager().getPackageInfo(
+ packageName,
+ ApplicationInfo.FLAG_INSTALLED);
+ LogUtil.i(TAG, "Creditor app is pre-installed");
+ return true;
+ } catch (NameNotFoundException e) {
+ LogUtil.i(TAG, "Creditor app is not pre-installed");
+ return false;
+ }
+ }, MoreExecutors.directExecutor());
}
@VisibleForTesting
@@ -256,32 +260,20 @@
}
@VisibleForTesting
- ListenableFuture<Void> verifyPreInstalledPackage(WorkManager workManager,
+ ListenableFuture<Void> assignRoleToPreinstalledPackage(WorkManager workManager,
LifecycleOwner owner) {
final SetupParametersClient setupParametersClient = SetupParametersClient.getInstance();
final ListenableFuture<String> getKioskPackageTask =
setupParametersClient.getKioskPackage();
- final ListenableFuture<String> getKioskSignatureChecksumTask =
- setupParametersClient.getKioskSignatureChecksum();
- return Futures.whenAllSucceed(getKioskPackageTask, getKioskSignatureChecksumTask)
- .call(() -> {
- LogUtil.v(TAG, "Verifying pre-installed package");
- String kioskPackageName = Futures.getDone(getKioskPackageTask);
- OneTimeWorkRequest verifyInstallPackageTask =
- getVerifyInstalledPackageTask(kioskPackageName,
- Futures.getDone(getKioskSignatureChecksumTask));
+ return Futures.transform(getKioskPackageTask,
+ kioskPackage -> {
+ LogUtil.v(TAG, "assigning role to pre-installed package");
OneTimeWorkRequest addFinancedDeviceKioskRoleTask =
- getAddFinancedDeviceKioskRoleTask(kioskPackageName);
- if (!Build.isDebuggable()) {
- createAndRunTasks(workManager, owner,
- SETUP_VERIFY_PRE_INSTALLED_PACKAGE_TASK,
- verifyInstallPackageTask, addFinancedDeviceKioskRoleTask);
- } else {
- createAndRunTasks(workManager, owner,
- SETUP_VERIFY_PRE_INSTALLED_PACKAGE_TASK,
- addFinancedDeviceKioskRoleTask);
- }
+ getAddFinancedDeviceKioskRoleTask(kioskPackage);
+ createAndRunTasks(workManager, owner,
+ SETUP_PRE_INSTALLED_PACKAGE_TASK,
+ addFinancedDeviceKioskRoleTask);
return null;
}, mContext.getMainExecutor());
}
diff --git a/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/policy/SetupControllerImplTest.java b/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/policy/SetupControllerImplTest.java
index 6a1dd87..7e9972e 100644
--- a/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/policy/SetupControllerImplTest.java
+++ b/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/policy/SetupControllerImplTest.java
@@ -41,7 +41,6 @@
import static org.mockito.Mockito.when;
import static org.robolectric.annotation.LooperMode.Mode.LEGACY;
-import android.app.Application;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageInfo;
@@ -67,6 +66,7 @@
import com.android.devicelockcontroller.TestDeviceLockControllerApplication;
import com.android.devicelockcontroller.policy.DeviceStateController.DeviceEvent;
import com.android.devicelockcontroller.policy.DeviceStateController.DeviceState;
+import com.android.devicelockcontroller.shadows.ShadowBuild;
import com.android.devicelockcontroller.storage.SetupParametersClient;
import com.android.devicelockcontroller.storage.SetupParametersService;
@@ -86,7 +86,9 @@
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
import org.robolectric.annotation.LooperMode;
+import org.robolectric.shadows.ShadowPackageManager;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -96,6 +98,7 @@
@LooperMode(LEGACY)
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowBuild.class})
public final class SetupControllerImplTest {
private static final String TEST_SETUP_ACTIVITY = "packagename/.activity";
@@ -127,7 +130,7 @@
mMockPolicyController = mTestApplication.getMockPolicyController();
when(mMockPolicyController.launchActivityInLockedMode()).thenReturn(
Futures.immediateFuture(true));
- Shadows.shadowOf((Application) mTestApplication).setComponentNameAndServiceForBindService(
+ Shadows.shadowOf(mTestApplication).setComponentNameAndServiceForBindService(
new ComponentName(mTestApplication, SetupParametersService.class),
Robolectric.setupService(SetupParametersService.class).onBind(null));
mSetupParametersClient = SetupParametersClient.getInstance(
@@ -179,6 +182,60 @@
}
@Test
+ public void isKioskAppPreinstalled_nonDebuggableBuild_returnFalse() {
+ // GIVEN build is non-debuggable build and kiosk app is installed.
+ ShadowBuild.setIsDebuggable(false);
+ Bundle bundle = new Bundle();
+ bundle.putString(EXTRA_KIOSK_PACKAGE, TEST_PACKAGE_NAME);
+ createParameters(bundle);
+ ShadowPackageManager pm = Shadows.shadowOf(mTestApplication.getPackageManager());
+ PackageInfo kioskPackageInfo = new PackageInfo();
+ kioskPackageInfo.packageName = TEST_PACKAGE_NAME;
+ pm.installPackage(kioskPackageInfo);
+
+ SetupControllerImpl setupController =
+ new SetupControllerImpl(
+ mTestApplication, mMockStateController, mMockPolicyController);
+
+ assertThat(Futures.getUnchecked(setupController.isKioskAppPreInstalled())).isFalse();
+ }
+
+ @Test
+ public void isKioskAppPreinstalled_debuggableBuild_kioskPreinstalled_returnTrue() {
+ // GIVEN build is debuggable build and kiosk app is installed
+ ShadowBuild.setIsDebuggable(true);
+ Bundle bundle = new Bundle();
+ bundle.putString(EXTRA_KIOSK_PACKAGE, TEST_PACKAGE_NAME);
+ createParameters(bundle);
+ ShadowPackageManager pm = Shadows.shadowOf(mTestApplication.getPackageManager());
+ PackageInfo kioskPackageInfo = new PackageInfo();
+ kioskPackageInfo.packageName = TEST_PACKAGE_NAME;
+ pm.installPackage(kioskPackageInfo);
+
+ SetupControllerImpl setupController =
+ new SetupControllerImpl(
+ mTestApplication, mMockStateController, mMockPolicyController);
+
+
+ assertThat(Futures.getUnchecked(setupController.isKioskAppPreInstalled())).isTrue();
+ }
+
+ @Test
+ public void isKioskAppPreinstalled_debuggableBuild_kioskNotInstalled_returnFalse() {
+ // GIVEN build is debuggable build but kiosk app is not installed
+ ShadowBuild.setIsDebuggable(true);
+ Bundle bundle = new Bundle();
+ bundle.putString(EXTRA_KIOSK_PACKAGE, TEST_PACKAGE_NAME);
+ createParameters(bundle);
+
+ SetupControllerImpl setupController =
+ new SetupControllerImpl(
+ mTestApplication, mMockStateController, mMockPolicyController);
+
+ assertThat(Futures.getUnchecked(setupController.isKioskAppPreInstalled())).isFalse();
+ }
+
+ @Test
public void installKioskAppFromURL_kioskAppInstalled_allTasksSucceed()
throws StateTransitionException {
// GIVEN all parameters are valid
diff --git a/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/shadows/ShadowBuild.java b/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/shadows/ShadowBuild.java
new file mode 100644
index 0000000..b2a2449
--- /dev/null
+++ b/DeviceLockController/tests/robolectric/src/com/android/devicelockcontroller/shadows/ShadowBuild.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.devicelockcontroller.shadows;
+
+import android.os.Build;
+
+import org.robolectric.annotation.Implements;
+import org.robolectric.util.ReflectionHelpers;
+
+/**
+ * Shadow class which extends {@link org.robolectric.shadows.ShadowBuild}
+ */
+@Implements(value = Build.class)
+public class ShadowBuild extends org.robolectric.shadows.ShadowBuild {
+
+ /**
+ * Sets the value of the {@link Build#IS_DEBUGGABLE} field.
+ *
+ * It will be reset for the next test.
+ */
+ public static void setIsDebuggable(boolean isDebuggable) {
+ ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", isDebuggable);
+ }
+}