From fff37ccb31d2b058b1bb2092ac55d88d6224a23e Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Wed, 1 Aug 2018 17:24:34 -0700 Subject: [PATCH] Disable changing lock when device is not provisioned. When the device is not yet provisioned and settings is launched: - disable the entry point for changing device lock - remove the search panel from settings home page Bug: 110034419 Test: make RunSettingsRoboTests Change-Id: Ieb7eb0e8699229ec0824ccc19d7b958ac44965a2 Merged-In: Ieb7eb0e8699229ec0824ccc19d7b958ac44965a2 --- .../android/settings/SettingsActivity.java | 8 +- .../settings/password/ChooseLockGeneric.java | 9 ++ .../password/SetupChooseLockGeneric.java | 5 + .../settings/SettingsActivityTest.java | 32 ++++-- .../password/ChooseLockGenericTest.java | 97 +++++++++++++++++++ 5 files changed, 144 insertions(+), 7 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 609120df0df..06bdd0cad46 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -322,7 +322,7 @@ public class SettingsActivity extends SettingsDrawerActivity } if (mIsShowingDashboard) { - findViewById(R.id.search_bar).setVisibility(View.VISIBLE); + setSearchBarVisibility(); findViewById(R.id.action_bar).setVisibility(View.GONE); Toolbar toolbar = findViewById(R.id.search_action_bar); toolbar.setOnClickListener(this); @@ -406,6 +406,12 @@ public class SettingsActivity extends SettingsDrawerActivity } } + @VisibleForTesting + void setSearchBarVisibility() { + findViewById(R.id.search_bar).setVisibility( + Utils.isDeviceProvisioned(this) ? View.VISIBLE : View.INVISIBLE); + } + @VisibleForTesting void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) { if (!mIsShowingDashboard && initialFragmentName != null) { diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index a694603fd95..081529ed89c 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -164,6 +164,11 @@ public class ChooseLockGeneric extends SettingsActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + final Activity activity = getActivity(); + if (!Utils.isDeviceProvisioned(activity) && !canRunBeforeDeviceProvisioned()) { + activity.finish(); + return; + } String chooseLockAction = getActivity().getIntent().getAction(); mFingerprintManager = Utils.getFingerprintManagerOrNull(getActivity()); @@ -248,6 +253,10 @@ public class ChooseLockGeneric extends SettingsActivity { addHeaderView(); } + protected boolean canRunBeforeDeviceProvisioned() { + return false; + } + protected void addHeaderView() { if (mForFingerprint) { setHeaderView(R.layout.choose_lock_generic_fingerprint_header); diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java index 179bd797cb7..885f9dfb420 100644 --- a/src/com/android/settings/password/SetupChooseLockGeneric.java +++ b/src/com/android/settings/password/SetupChooseLockGeneric.java @@ -129,6 +129,11 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric { return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); } + @Override + protected boolean canRunBeforeDeviceProvisioned() { + return true; + } + /*** * Disables preferences that are less secure than required quality and shows only secure * screen lock options here. diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java index 3fc46e86609..6a549fdddde 100644 --- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java @@ -35,12 +35,11 @@ import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; -import android.view.Menu; +import android.provider.Settings.Global; +import android.view.View; import com.android.settings.search.SearchActivity; -import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -56,23 +55,44 @@ import org.robolectric.util.ReflectionHelpers; @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SettingsActivityTest { - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private Context mContext; - @Mock private FragmentManager mFragmentManager; @Mock private ActivityManager.TaskDescription mTaskDescription; @Mock private Bitmap mBitmap; + @Mock + private View mSearchBar; private SettingsActivity mActivity; + private Context mContext; @Before public void setUp() { MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; mActivity = spy(new SettingsActivity()); doReturn(mBitmap).when(mActivity).getBitmapFromXmlResource(anyInt()); + doReturn(mContext.getContentResolver()).when(mActivity).getContentResolver(); + doReturn(mSearchBar).when(mActivity).findViewById(R.id.search_bar); + } + + @Test + public void setSearchBarVisibility_deviceNotProvisioned_shouldDisableSearch() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + + mActivity.setSearchBarVisibility(); + + verify(mSearchBar).setVisibility(View.INVISIBLE); + } + + @Test + public void setSearchBarVisibility_deviceProvisioned_shouldEnableSearch() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); + + mActivity.setSearchBarVisibility(); + + verify(mSearchBar).setVisibility(View.VISIBLE); } @Test diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java new file mode 100644 index 00000000000..f1862e3cb86 --- /dev/null +++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2018 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.password; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import android.app.FragmentHostCallback; +import android.content.Context; +import android.os.Bundle; +import android.provider.Settings.Global; + +import com.android.settings.TestConfig; +import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResources; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config( + manifest = TestConfig.MANIFEST_PATH, + sdk = TestConfig.SDK_VERSION, + shadows = { + SettingsShadowResources.class, + SettingsShadowResources.SettingsShadowTheme.class + }) +public class ChooseLockGenericTest { + + @Mock + private ChooseLockGeneric mActivity; + + private Context mContext; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + when(mActivity.getContentResolver()).thenReturn(mContext.getContentResolver()); + when(mActivity.getTheme()).thenReturn(mContext.getTheme()); + when(mActivity.getResources()).thenReturn(mContext.getResources()); + } + + @After + public void tearDown() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); + } + + @Test + public void onCreate_deviceNotProvisioned_shouldFinishActivity() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + final ChooseLockGenericFragment fragment = spy(new ChooseLockGenericFragment()); + when(fragment.getActivity()).thenReturn(mActivity); + ReflectionHelpers.setField(fragment, "mHost", new TestHostCallbacks()); + + fragment.onCreate(Bundle.EMPTY); + + verify(mActivity).finish(); + } + + public class TestHostCallbacks extends FragmentHostCallback { + + public TestHostCallbacks() { + super(mActivity, null /* handler */, 0 /* windowAnimations */); + } + + @Override + public Activity onGetHost() { + return mActivity; + } + } + +}