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);
+    }
+}