From c8987759144c08ba07db1d4713ebd669afb3cbf8 Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Fri, 18 Oct 2019 09:57:49 +0800 Subject: [PATCH] Hide search box if it is called in initial setup wizard - Search box is hidden if user set intent extra isSetupFlow true Fixes: 135717823 Test: search box is hidden in the following command adb shell am start -a android.settings.SETTINGS --ez isSetupFlow true Change-Id: Ia3d955c9390d6b0eef9391b9b35b6a483eb63d26 --- .../android/settings/MasterClearConfirm.java | 3 +- .../android/settings/SettingsActivity.java | 2 +- src/com/android/settings/Utils.java | 6 -- .../DevelopmentSettingsDashboardFragment.java | 4 +- .../BuildNumberPreferenceController.java | 4 +- .../settings/password/ChooseLockGeneric.java | 9 +-- .../password/SetNewPasswordActivity.java | 6 +- .../search/SearchFeatureProvider.java | 7 ++- .../actionbar/SearchMenuController.java | 23 ++++---- .../android/settings/users/UserSettings.java | 7 ++- ...randfather_not_implementing_index_provider | 2 + .../actionbar/SearchMenuControllerTest.java | 57 +++++++------------ 12 files changed, 62 insertions(+), 68 deletions(-) diff --git a/src/com/android/settings/MasterClearConfirm.java b/src/com/android/settings/MasterClearConfirm.java index a8c4341afd8..679f18f39c0 100644 --- a/src/com/android/settings/MasterClearConfirm.java +++ b/src/com/android/settings/MasterClearConfirm.java @@ -49,6 +49,7 @@ import com.android.settingslib.RestrictedLockUtilsInternal; import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.template.FooterButton.ButtonType; +import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupdesign.GlifLayout; /** @@ -86,7 +87,7 @@ public class MasterClearConfirm extends InstrumentedFragment { getActivity().getSystemService(Context.OEM_LOCK_SERVICE); if (pdbManager != null && !oemLockManager.isOemUnlockAllowed() && - Utils.isDeviceProvisioned(getActivity())) { + WizardManagerHelper.isDeviceProvisioned(getActivity())) { // if OEM unlock is allowed, the persistent data block will be wiped during FR // process. If disabled, it will be wiped here, unless the device is still being // provisioned, in which case the persistent data block will be preserved. diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 4d813d5ccc2..b489bc4a4b7 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -276,7 +276,7 @@ public class SettingsActivity extends SettingsBaseActivity launchSettingFragment(initialFragmentName, intent); } - final boolean deviceProvisioned = Utils.isDeviceProvisioned(this); + final boolean deviceProvisioned = WizardManagerHelper.isDeviceProvisioned(this); final ActionBar actionBar = getActionBar(); if (actionBar != null) { diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 75db3e18188..aef0ac89043 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -73,7 +73,6 @@ import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.Profile; import android.provider.ContactsContract.RawContacts; -import android.provider.Settings; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.Spannable; @@ -729,11 +728,6 @@ public final class Utils extends com.android.settingslib.Utils { } } - public static boolean isDeviceProvisioned(Context context) { - return Settings.Global.getInt(context.getContentResolver(), - Settings.Global.DEVICE_PROVISIONED, 0) != 0; - } - public static boolean startQuietModeDialogIfNecessary(Context context, UserManager um, int userId) { if (um.isQuietModeEnabled(UserHandle.of(userId))) { diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 52a5cd91faa..8e8a82d9231 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -53,6 +53,8 @@ import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.development.SystemPropPoker; import com.android.settingslib.search.SearchIndexable; +import com.google.android.setupcompat.util.WizardManagerHelper; + import java.util.ArrayList; import java.util.List; @@ -166,7 +168,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra super.onActivityCreated(icicle); // Apply page-level restrictions setIfOnlyAvailableForAdmins(true); - if (isUiRestricted() || !Utils.isDeviceProvisioned(getActivity())) { + if (isUiRestricted() || !WizardManagerHelper.isDeviceProvisioned(getActivity())) { // Block access to developer options if the user is not the owner, if user policy // restricts it, or if the device has not been provisioned mIsAvailable = false; diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java index dd522bfa1d2..40e34c073ea 100644 --- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java +++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java @@ -46,6 +46,8 @@ import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.development.DevelopmentSettingsEnabler; +import com.google.android.setupcompat.util.WizardManagerHelper; + public class BuildNumberPreferenceController extends BasePreferenceController implements LifecycleObserver, OnStart { @@ -131,7 +133,7 @@ public class BuildNumberPreferenceController extends BasePreferenceController im } // Don't enable developer options until device has been provisioned - if (!Utils.isDeviceProvisioned(mContext)) { + if (!WizardManagerHelper.isDeviceProvisioned(mContext)) { mMetricsFeatureProvider.action( mContext, SettingsEnums.ACTION_SETTINGS_BUILD_NUMBER_PREF); return false; diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index a2885d681c0..6809f35e874 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -36,12 +36,8 @@ import android.app.admin.DevicePolicyManager.PasswordComplexity; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; -import android.content.pm.UserInfo; -import android.hardware.face.Face; import android.hardware.face.FaceManager; -import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; -import android.hardware.fingerprint.FingerprintManager.RemovalCallback; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; @@ -76,7 +72,7 @@ import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedPreference; -import java.util.List; +import com.google.android.setupcompat.util.WizardManagerHelper; public class ChooseLockGeneric extends SettingsActivity { public static final String CONFIRM_CREDENTIALS = "confirm_credentials"; @@ -188,7 +184,8 @@ public class ChooseLockGeneric extends SettingsActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Activity activity = getActivity(); - if (!Utils.isDeviceProvisioned(activity) && !canRunBeforeDeviceProvisioned()) { + if (!WizardManagerHelper.isDeviceProvisioned(activity) + && !canRunBeforeDeviceProvisioned()) { Log.i(TAG, "Refusing to start because device is not provisioned"); activity.finish(); return; diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java index 055e5bedf8d..4bffbf5f995 100644 --- a/src/com/android/settings/password/SetNewPasswordActivity.java +++ b/src/com/android/settings/password/SetNewPasswordActivity.java @@ -32,16 +32,16 @@ import android.app.admin.DevicePolicyManager.PasswordComplexity; import android.app.admin.PasswordMetrics; import android.app.settings.SettingsEnums; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.IBinder; import android.util.Log; -import com.android.settings.Utils; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import com.google.android.setupcompat.util.WizardManagerHelper; + import java.util.List; /** @@ -110,7 +110,7 @@ public class SetNewPasswordActivity extends Activity implements SetNewPasswordCo @Override public void launchChooseLock(Bundle chooseLockFingerprintExtras) { - final boolean isInSetupWizard = !Utils.isDeviceProvisioned(this); + final boolean isInSetupWizard = !WizardManagerHelper.isDeviceProvisioned(this); Intent intent = isInSetupWizard ? new Intent(this, SetupChooseLockGeneric.class) : new Intent(this, ChooseLockGeneric.class); intent.setAction(mNewPasswordAction); diff --git a/src/com/android/settings/search/SearchFeatureProvider.java b/src/com/android/settings/search/SearchFeatureProvider.java index 896f6e5c78c..20d4e7c16bd 100644 --- a/src/com/android/settings/search/SearchFeatureProvider.java +++ b/src/com/android/settings/search/SearchFeatureProvider.java @@ -34,6 +34,8 @@ import com.android.settings.Utils; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.search.SearchIndexableResources; +import com.google.android.setupcompat.util.WizardManagerHelper; + /** * FeatureProvider for Settings Search */ @@ -67,8 +69,9 @@ public interface SearchFeatureProvider { return; } - if (!Utils.isDeviceProvisioned(activity) || - !Utils.isPackageEnabled(activity, getSettingsIntelligencePkgName(activity))) { + if (!WizardManagerHelper.isDeviceProvisioned(activity) + || !Utils.isPackageEnabled(activity, getSettingsIntelligencePkgName(activity)) + || WizardManagerHelper.isAnySetupWizard(activity.getIntent())) { final ViewGroup parent = (ViewGroup) toolbar.getParent(); if (parent != null) { parent.setVisibility(View.GONE); diff --git a/src/com/android/settings/search/actionbar/SearchMenuController.java b/src/com/android/settings/search/actionbar/SearchMenuController.java index 25d0d3027d5..0243c0963a0 100644 --- a/src/com/android/settings/search/actionbar/SearchMenuController.java +++ b/src/com/android/settings/search/actionbar/SearchMenuController.java @@ -17,8 +17,8 @@ package com.android.settings.search.actionbar; import android.annotation.NonNull; +import android.app.Activity; import android.app.settings.SettingsEnums; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; @@ -37,6 +37,8 @@ import com.android.settings.search.SearchFeatureProvider; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu; +import com.google.android.setupcompat.util.WizardManagerHelper; + public class SearchMenuController implements LifecycleObserver, OnCreateOptionsMenu { public static final String NEED_SEARCH_ICON_IN_ACTION_BAR = "need_search_icon_in_action_bar"; @@ -61,13 +63,14 @@ public class SearchMenuController implements LifecycleObserver, OnCreateOptionsM @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - final Context context = mHost.getContext(); - final String SettingsIntelligencePkgName = context.getString( + final Activity activity = mHost.getActivity(); + final String SettingsIntelligencePkgName = activity.getString( R.string.config_settingsintelligence_package_name); - if (!Utils.isDeviceProvisioned(mHost.getContext())) { + if (!WizardManagerHelper.isDeviceProvisioned(activity) + || WizardManagerHelper.isAnySetupWizard(activity.getIntent())) { return; } - if (!Utils.isPackageEnabled(mHost.getContext(), SettingsIntelligencePkgName)) { + if (!Utils.isPackageEnabled(activity, SettingsIntelligencePkgName)) { return; } if (menu == null) { @@ -83,17 +86,17 @@ public class SearchMenuController implements LifecycleObserver, OnCreateOptionsM searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); searchItem.setOnMenuItemClickListener(target -> { - final Intent intent = FeatureFactory.getFactory(context) + final Intent intent = FeatureFactory.getFactory(activity) .getSearchFeatureProvider() - .buildSearchIntent(context, mPageId); + .buildSearchIntent(activity, mPageId); - if (context.getPackageManager().queryIntentActivities(intent, + if (activity.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) { return true; } - FeatureFactory.getFactory(context).getMetricsFeatureProvider() - .action(context, SettingsEnums.ACTION_SEARCH_RESULTS); + FeatureFactory.getFactory(activity).getMetricsFeatureProvider() + .action(activity, SettingsEnums.ACTION_SEARCH_RESULTS); mHost.startActivityForResult(intent, SearchFeatureProvider.REQUEST_CODE); return true; }); diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 5ad68fe7e18..7a9f02654a4 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -74,6 +74,8 @@ import com.android.settingslib.RestrictedPreference; import com.android.settingslib.drawable.CircleFramedDrawable; import com.android.settingslib.search.SearchIndexable; +import com.google.android.setupcompat.util.WizardManagerHelper; + import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -224,7 +226,7 @@ public class UserSettings extends SettingsPreferenceFragment super.onCreate(icicle); addPreferencesFromResource(R.xml.user_settings); final Activity activity = getActivity(); - if (!Utils.isDeviceProvisioned(activity)) { + if (!WizardManagerHelper.isDeviceProvisioned(activity)) { activity.finish(); return; } @@ -977,7 +979,8 @@ public class UserSettings extends SettingsPreferenceFragment private void updateAddUser(Context context) { if ((mUserCaps.mCanAddUser || mUserCaps.mDisallowAddUserSetByAdmin) - && Utils.isDeviceProvisioned(context) && mUserCaps.mUserSwitcherEnabled) { + && WizardManagerHelper.isDeviceProvisioned(context) + && mUserCaps.mUserSwitcherEnabled) { mAddUser.setVisible(true); final boolean moreUsers = mUserManager.canAddMoreUsers(); mAddUser.setEnabled(moreUsers && !mAddingUser && mUserManager.canSwitchUsers()); diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider index 20c1792705f..d0f02d3ee23 100644 --- a/tests/robotests/assets/grandfather_not_implementing_index_provider +++ b/tests/robotests/assets/grandfather_not_implementing_index_provider @@ -6,6 +6,8 @@ com.android.settings.accessibility.ToggleScreenMagnificationPreferenceFragmentFo com.android.settings.accessibility.ToggleScreenReaderPreferenceFragmentForSetupWizard com.android.settings.accessibility.ToggleSelectToSpeakPreferenceFragmentForSetupWizard com.android.settings.accounts.AccountDetailDashboardFragment +com.android.settings.accounts.AccountPersonalDashboardFragment +com.android.settings.accounts.AccountWorkProfileDashboardFragment com.android.settings.accounts.AccountSyncSettings com.android.settings.accounts.ChooseAccountFragment com.android.settings.applications.appinfo.AppInfoDashboardFragment 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 3063912e0f6..e2b896a3d7a 100644 --- a/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java +++ b/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java @@ -17,29 +17,33 @@ 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.app.settings.SettingsEnums; -import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.provider.Settings.Global; import android.view.Menu; import android.view.MenuItem; +import androidx.fragment.app.FragmentActivity; + import com.android.settings.R; import com.android.settings.core.InstrumentedFragment; -import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.testutils.shadow.ShadowUtils; +import com.google.android.setupcompat.util.WizardManagerHelper; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @@ -48,40 +52,27 @@ public class SearchMenuControllerTest { @Mock private Menu mMenu; - private TestPreferenceFragment mPreferenceHost; private InstrumentedFragment mHost; - private Context mContext; + private FragmentActivity mActivity; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; - mHost = new InstrumentedFragment() { - @Override - public Context getContext() { - return mContext; - } + mActivity = Robolectric.buildActivity(FragmentActivity.class).get(); + mHost = spy(new InstrumentedFragment() { @Override public int getMetricsCategory() { return SettingsEnums.TESTING; } - }; - mPreferenceHost = new TestPreferenceFragment(); - Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); + }); + Global.putInt(mActivity.getContentResolver(), Global.DEVICE_PROVISIONED, 1); + when(mHost.getActivity()).thenReturn(mActivity); when(mMenu.add(Menu.NONE, Menu.NONE, 0 /* order */, R.string.search_menu)) .thenReturn(mock(MenuItem.class)); } - @Test - public void init_prefFragment_shouldAddMenu() { - SearchMenuController.init(mPreferenceHost); - mPreferenceHost.getSettingsLifecycle().onCreateOptionsMenu(mMenu, null /* inflater */); - - verify(mMenu).add(Menu.NONE, Menu.NONE, 0 /* order */, R.string.search_menu); - } - @Test public void init_observableFragment_shouldAddMenu() { SearchMenuController.init(mHost); @@ -103,26 +94,22 @@ public class SearchMenuControllerTest { @Test public void init_deviceNotProvisioned_shouldNotAddMenu() { - Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + Global.putInt(mActivity.getContentResolver(), Global.DEVICE_PROVISIONED, 0); SearchMenuController.init(mHost); mHost.getSettingsLifecycle().onCreateOptionsMenu(mMenu, null /* inflater */); verifyZeroInteractions(mMenu); } - private static class TestPreferenceFragment extends InstrumentedPreferenceFragment { - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - } + @Test + public void init_startFromSetupWizard_shouldNotAddMenu() { + final Intent intent = new Intent(); + intent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true); + mActivity.setIntent(intent); + SearchMenuController.init(mHost); - @Override - public Context getContext() { - return RuntimeEnvironment.application; - } + mHost.getSettingsLifecycle().onCreateOptionsMenu(mMenu, null /* inflater */); - @Override - public int getMetricsCategory() { - return SettingsEnums.TESTING; - } + verifyZeroInteractions(mMenu); } }