From 7430932305c028088987e72c1ad8e8ac84728de9 Mon Sep 17 00:00:00 2001 From: Eric Sandness Date: Sun, 15 Mar 2020 18:10:55 +0000 Subject: [PATCH] Use ChooseLockGeneric When Started By Admin App The device management app may run before the end of device provisioning, and it may start SetNewPasswordActivity. If this happens, use ChooseLockGeneric instead of SetupChooseLockGeneric. Only use SetupChoseLockGeneric if SetNewPasswordActivity was started by Setup Wizard itself. Fixes: 151552453 Test: atest com.android.settings.password.SetNewPasswordActivityTest Test: atest com.android.settings.password.ChooseLockGenericTest Test: Manually run consumer and enterprise device setup Change-Id: I3b479ed18211d6625654f266fe692f07d0047e4f --- .../settings/password/ChooseLockGeneric.java | 7 +++- .../password/SetNewPasswordActivity.java | 2 +- .../password/ChooseLockGenericTest.java | 19 ++++++++- .../password/SetNewPasswordActivityTest.java | 3 ++ .../ShadowPersistentDataBlockManager.java | 42 +++++++++++++++++++ 5 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 6809f35e874..755d1586b8a 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -42,6 +42,7 @@ import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; +import android.service.persistentdata.PersistentDataBlockManager; import android.text.TextUtils; import android.util.EventLog; import android.util.Log; @@ -281,7 +282,11 @@ public class ChooseLockGeneric extends SettingsActivity { } protected boolean canRunBeforeDeviceProvisioned() { - return false; + PersistentDataBlockManager pdbm = (PersistentDataBlockManager) + getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); + + // Can only run during setup if factory reset protection has already been cleared + return (pdbm != null && pdbm.getDataBlockSize() == 0); } protected Class getInternalActivityClass() { diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java index 4bffbf5f995..19f2941cc7a 100644 --- a/src/com/android/settings/password/SetNewPasswordActivity.java +++ b/src/com/android/settings/password/SetNewPasswordActivity.java @@ -110,7 +110,7 @@ public class SetNewPasswordActivity extends Activity implements SetNewPasswordCo @Override public void launchChooseLock(Bundle chooseLockFingerprintExtras) { - final boolean isInSetupWizard = !WizardManagerHelper.isDeviceProvisioned(this); + final boolean isInSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent()); Intent intent = isInSetupWizard ? new Intent(this, SetupChooseLockGeneric.class) : new Intent(this, ChooseLockGeneric.class); intent.setAction(mNewPasswordAction); diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java index 1bdadb28cd0..6b3fdf421cf 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java @@ -46,6 +46,7 @@ import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment; import com.android.settings.search.SearchFeatureProvider; import com.android.settings.testutils.shadow.ShadowLockPatternUtils; +import com.android.settings.testutils.shadow.ShadowPersistentDataBlockManager; import com.android.settings.testutils.shadow.ShadowStorageManager; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.testutils.shadow.ShadowUtils; @@ -63,6 +64,7 @@ import org.robolectric.annotation.Config; @Config( shadows = { ShadowLockPatternUtils.class, + ShadowPersistentDataBlockManager.class, ShadowStorageManager.class, ShadowUserManager.class, ShadowUtils.class @@ -82,11 +84,13 @@ public class ChooseLockGenericTest { public void tearDown() { Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 1); ShadowStorageManager.reset(); + ShadowPersistentDataBlockManager.reset(); } @Test - public void onCreate_deviceNotProvisioned_shouldFinishActivity() { + public void onCreate_deviceNotProvisioned_persistentDataExists_shouldFinishActivity() { Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + ShadowPersistentDataBlockManager.setDataBlockSize(1000); initActivity(null); assertThat(mActivity.isFinishing()).isTrue(); @@ -191,7 +195,18 @@ public class ChooseLockGenericTest { } @Test - public void updatePreferencesOrFinish_callingAppIsAdmin_footerInvisible() { + public void updatePreferencesOrFinish_callingAppIsAdmin_deviceProvisioned_footerInvisible() { + initActivity(new Intent().putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true)); + + mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false); + + FooterPreference footer = mFragment.findPreference(KEY_LOCK_SETTINGS_FOOTER); + assertThat(footer.isVisible()).isFalse(); + } + + @Test + public void updatePreferencesOrFinish_callingAppIsAdmin_deviceNotProvisioned_footerInvisible() { + Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 0); initActivity(new Intent().putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true)); mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false); diff --git a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java index 04a2157aeee..b36af98df93 100644 --- a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java +++ b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java @@ -45,6 +45,8 @@ import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowPasswordUtils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import com.google.android.setupcompat.util.WizardManagerHelper; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -111,6 +113,7 @@ public class SetNewPasswordActivityTest { activity.launchChooseLock(new Bundle()); ShadowActivity shadowActivity = Shadows.shadowOf(activity); Intent intent = getLaunchChooseLockIntent(shadowActivity); + intent.putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true); assertThat(intent.getComponent()) .isEqualTo(new ComponentName(activity, SetupChooseLockGeneric.class)); diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java new file mode 100644 index 00000000000..dbbdd3d57de --- /dev/null +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2020 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.settings.testutils.shadow; + +import android.service.persistentdata.PersistentDataBlockManager; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.annotation.Resetter; + +@Implements(PersistentDataBlockManager.class) +public class ShadowPersistentDataBlockManager { + private static int sDataBlockSize = 0; + + @Resetter + public static void reset() { + sDataBlockSize = 0; + } + + @Implementation + protected int getDataBlockSize() { + return sDataBlockSize; + } + + public static void setDataBlockSize(int dataBlockSize) { + sDataBlockSize = dataBlockSize; + } +}