From: Doris Ling Date: Tue, 31 Jul 2018 21:04:44 +0000 (-0700) Subject: Disable changing lock when device is not provisioned. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=882bef396295ff7ea1e380f1e05ab07f656e4c3f;p=android-x86%2Fpackages-apps-Settings.git 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 - remove the search menu Bug: 110034419 Test: make RunSettingsRoboTests Change-Id: Ieb7eb0e8699229ec0824ccc19d7b958ac44965a2 --- diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index cacd04e535..f95a303ead 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -290,8 +290,10 @@ public class SettingsActivity extends SettingsBaseActivity launchSettingFragment(initialFragmentName, isSubSettings, intent); } + final boolean deviceProvisioned = Utils.isDeviceProvisioned(this); if (mIsShowingDashboard) { - findViewById(R.id.search_bar).setVisibility(View.VISIBLE); + findViewById(R.id.search_bar).setVisibility( + deviceProvisioned ? View.VISIBLE : View.INVISIBLE); findViewById(R.id.action_bar).setVisibility(View.GONE); final Toolbar toolbar = findViewById(R.id.search_action_bar); FeatureFactory.getFactory(this).getSearchFeatureProvider() @@ -310,7 +312,6 @@ public class SettingsActivity extends SettingsBaseActivity ActionBar actionBar = getActionBar(); if (actionBar != null) { - boolean deviceProvisioned = Utils.isDeviceProvisioned(this); actionBar.setDisplayHomeAsUpEnabled(deviceProvisioned); actionBar.setHomeButtonEnabled(deviceProvisioned); actionBar.setDisplayShowTitleEnabled(!mIsShowingDashboard); diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 3dc40683dd..a45bea77ea 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -165,6 +165,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()); @@ -249,6 +254,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 6ca0916cd3..1642bf0ff3 100644 --- a/src/com/android/settings/password/SetupChooseLockGeneric.java +++ b/src/com/android/settings/password/SetupChooseLockGeneric.java @@ -130,6 +130,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/src/com/android/settings/search/actionbar/SearchMenuController.java b/src/com/android/settings/search/actionbar/SearchMenuController.java index 2fcc0487e1..54fae7e3a9 100644 --- a/src/com/android/settings/search/actionbar/SearchMenuController.java +++ b/src/com/android/settings/search/actionbar/SearchMenuController.java @@ -24,6 +24,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.SearchFeatureProvider; import com.android.settingslib.core.lifecycle.LifecycleObserver; @@ -53,6 +54,9 @@ public class SearchMenuController implements LifecycleObserver, OnCreateOptionsM @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + if (!Utils.isDeviceProvisioned(mHost.getContext())) { + return; + } if (menu == null) { return; } diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java index d1033eabcd..3d529e45d7 100644 --- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java @@ -25,8 +25,11 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManager; +import android.content.Context; import android.content.Intent; - +import android.os.Bundle; +import android.provider.Settings.Global; +import android.view.View; import com.android.settings.core.OnActivityResultListener; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -35,6 +38,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; @@ -52,15 +56,38 @@ public class SettingsActivityTest { @Mock private ActivityManager.TaskDescription mTaskDescription; private SettingsActivity mActivity; + private Context mContext; @Before public void setUp() { MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; mActivity = spy(new SettingsActivity()); } @Test + public void onCreate_deviceNotProvisioned_shouldDisableSearch() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + final Intent intent = new Intent(mContext, Settings.class); + final SettingsActivity activity = + Robolectric.buildActivity(SettingsActivity.class, intent).create(Bundle.EMPTY).get(); + + assertThat(activity.findViewById(R.id.search_bar).getVisibility()) + .isEqualTo(View.INVISIBLE); + } + + @Test + public void onCreate_deviceProvisioned_shouldEnableSearch() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); + final Intent intent = new Intent(mContext, Settings.class); + final SettingsActivity activity = + Robolectric.buildActivity(SettingsActivity.class, intent).create(Bundle.EMPTY).get(); + + assertThat(activity.findViewById(R.id.search_bar).getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test public void launchSettingFragment_nullExtraShowFragment_shouldNotCrash() { when(mActivity.getSupportFragmentManager()).thenReturn(mFragmentManager); when(mFragmentManager.beginTransaction()).thenReturn(mock(FragmentTransaction.class)); diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java index 24a45daf91..369cb3c94e 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java @@ -18,19 +18,54 @@ package com.android.settings.password; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.provider.Settings.Global; import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResources; +import androidx.fragment.app.FragmentActivity; + +import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; @RunWith(SettingsRobolectricTestRunner.class) public class ChooseLockGenericTest { + @After + public void tearDown() { + Global.putInt(RuntimeEnvironment.application.getContentResolver(), + Global.DEVICE_PROVISIONED, 1); + } + + @Test + @Config(shadows = SettingsShadowResources.SettingsShadowTheme.class) + public void onCreate_deviceNotProvisioned_shouldFinishActivity() { + final Context context = RuntimeEnvironment.application; + Global.putInt(context.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + final FragmentActivity activity = mock(FragmentActivity.class); + when(activity.getContentResolver()).thenReturn(context.getContentResolver()); + when(activity.getTheme()).thenReturn(context.getTheme()); + + final ChooseLockGenericFragment fragment = spy(new ChooseLockGenericFragment()); + when(fragment.getActivity()).thenReturn(activity); + when(fragment.getArguments()).thenReturn(Bundle.EMPTY); + + fragment.onCreate(Bundle.EMPTY); + verify(activity).finish(); + } + @Test public void onActivityResult_nullIntentData_shouldNotCrash() { ChooseLockGenericFragment fragment = spy(new ChooseLockGenericFragment()); diff --git a/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java b/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java index b36769d66f..394d5f40b3 100644 --- a/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java +++ b/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java @@ -17,11 +17,14 @@ package com.android.settings.search.actionbar; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; +import android.content.Context; import android.os.Bundle; +import android.provider.Settings.Global; import android.view.Menu; import android.view.MenuItem; @@ -35,6 +38,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) public class SearchMenuControllerTest { @@ -43,12 +47,16 @@ public class SearchMenuControllerTest { private Menu mMenu; private TestPreferenceFragment mPreferenceHost; private ObservableFragment mHost; + private Context mContext; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mHost = new ObservableFragment(); + mContext = RuntimeEnvironment.application; + mHost = spy(new ObservableFragment()); + when(mHost.getContext()).thenReturn(mContext); mPreferenceHost = new TestPreferenceFragment(); + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); when(mMenu.add(Menu.NONE, Menu.NONE, 0 /* order */, R.string.search_menu)) .thenReturn(mock(MenuItem.class)); @@ -81,9 +89,23 @@ public class SearchMenuControllerTest { verifyZeroInteractions(mMenu); } + @Test + public void init_deviceNotProvisioned_shouldNotAddMenu() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + SearchMenuController.init(mHost); + mHost.getSettingsLifecycle().onCreateOptionsMenu(mMenu, null /* inflater */); + + verifyZeroInteractions(mMenu); + } + private static class TestPreferenceFragment extends ObservablePreferenceFragment { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { } + + @Override + public Context getContext() { + return RuntimeEnvironment.application; + } } }