From 51059c5c9101300c7cd410bfe6582de25145079e Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Fri, 24 Mar 2017 13:43:11 -0700 Subject: [PATCH] Move reset options to one place Change-Id: I419c16cbfc69861e01f28c14abdde137bd78f0bb Fix: 36458355 Test: make RunSettingsRoboTests --- res/xml/reset_dashboard_fragment.xml | 43 ++++++++++ res/xml/system_dashboard_fragment.xml | 18 ++-- .../ResetAppPrefPreferenceController.java | 71 +++++++++++++++ .../applications/ResetAppsHelper.java | 6 +- .../core/gateway/SettingsGateway.java | 2 + .../NetworkResetActionMenuController.java | 7 +- .../NetworkResetPreferenceController.java | 38 ++++++++ .../search/SearchIndexableResources.java | 2 + .../FactoryResetPreferenceController.java | 34 +++++++- .../system/ResetDashboardFragment.java | 86 +++++++++++++++++++ .../system/SystemDashboardFragment.java | 1 - .../NetworkResetActionMenuControllerTest.java | 16 ++-- .../FactoryResetPreferenceControllerTest.java | 12 ++- 13 files changed, 304 insertions(+), 32 deletions(-) create mode 100644 res/xml/reset_dashboard_fragment.xml create mode 100644 src/com/android/settings/applications/ResetAppPrefPreferenceController.java create mode 100644 src/com/android/settings/network/NetworkResetPreferenceController.java create mode 100644 src/com/android/settings/system/ResetDashboardFragment.java diff --git a/res/xml/reset_dashboard_fragment.xml b/res/xml/reset_dashboard_fragment.xml new file mode 100644 index 00000000000..02328af96fe --- /dev/null +++ b/res/xml/reset_dashboard_fragment.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + diff --git a/res/xml/system_dashboard_fragment.xml b/res/xml/system_dashboard_fragment.xml index b03fab6b2af..1186e78713d 100644 --- a/res/xml/system_dashboard_fragment.xml +++ b/res/xml/system_dashboard_fragment.xml @@ -16,7 +16,6 @@ @@ -26,7 +25,7 @@ android:summary="@string/summary_placeholder" android:icon="@drawable/ic_system_update" android:order="-30"> - + + android:targetClass="@string/additional_system_update_menu" /> - - + android:fragment="com.android.settings.system.ResetDashboardFragment" /> + \ No newline at end of file diff --git a/src/com/android/settings/applications/ResetAppPrefPreferenceController.java b/src/com/android/settings/applications/ResetAppPrefPreferenceController.java new file mode 100644 index 00000000000..41352bbdd00 --- /dev/null +++ b/src/com/android/settings/applications/ResetAppPrefPreferenceController.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2017 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.applications; + +import android.content.Context; +import android.os.Bundle; +import android.support.v7.preference.Preference; +import android.text.TextUtils; + +import com.android.settings.core.PreferenceController; +import com.android.settings.core.lifecycle.Lifecycle; +import com.android.settings.core.lifecycle.LifecycleObserver; +import com.android.settings.core.lifecycle.events.OnCreate; +import com.android.settings.core.lifecycle.events.OnSaveInstanceState; + +public class ResetAppPrefPreferenceController extends PreferenceController + implements LifecycleObserver, OnCreate, OnSaveInstanceState { + + private ResetAppsHelper mResetAppsHelper; + + public ResetAppPrefPreferenceController(Context context, Lifecycle lifecycle) { + super(context); + mResetAppsHelper = new ResetAppsHelper(context); + if (lifecycle != null) { + lifecycle.addObserver(this); + } + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) { + return false; + } + mResetAppsHelper.buildResetDialog(); + return true; + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public String getPreferenceKey() { + return "reset_app_prefs"; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + mResetAppsHelper.onRestoreInstanceState(savedInstanceState); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + mResetAppsHelper.onSaveInstanceState(outState); + } +} diff --git a/src/com/android/settings/applications/ResetAppsHelper.java b/src/com/android/settings/applications/ResetAppsHelper.java index ddcb244edea..93d384d7c5f 100644 --- a/src/com/android/settings/applications/ResetAppsHelper.java +++ b/src/com/android/settings/applications/ResetAppsHelper.java @@ -15,6 +15,9 @@ */ package com.android.settings.applications; +import static android.net.NetworkPolicyManager.POLICY_NONE; +import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; + import android.app.ActivityManager; import android.app.AlertDialog; import android.app.AppOpsManager; @@ -36,9 +39,6 @@ import com.android.settings.R; import java.util.List; -import static android.net.NetworkPolicyManager.POLICY_NONE; -import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; - public class ResetAppsHelper implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener { diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index 59cedf87484..03b3d3927ba 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -113,6 +113,7 @@ import com.android.settings.print.PrintJobSettingsFragment; import com.android.settings.print.PrintSettingsFragment; import com.android.settings.security.LockscreenDashboardFragment; import com.android.settings.sim.SimSettings; +import com.android.settings.system.ResetDashboardFragment; import com.android.settings.system.SystemDashboardFragment; import com.android.settings.tts.TextToSpeechSettings; import com.android.settings.users.UserSettings; @@ -231,6 +232,7 @@ public class SettingsGateway { WifiAPITest.class.getName(), WifiInfo.class.getName(), MasterClear.class.getName(), + ResetDashboardFragment.class.getName(), NightDisplaySettings.class.getName(), ManageDomainUrls.class.getName(), AutomaticStorageManagerSettings.class.getName(), diff --git a/src/com/android/settings/network/NetworkResetActionMenuController.java b/src/com/android/settings/network/NetworkResetActionMenuController.java index d5065d1b89a..028ac7bc95e 100644 --- a/src/com/android/settings/network/NetworkResetActionMenuController.java +++ b/src/com/android/settings/network/NetworkResetActionMenuController.java @@ -55,7 +55,12 @@ public class NetworkResetActionMenuController { @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) boolean isAvailable() { - return !RestrictedLockUtils.hasBaseUserRestriction(mContext, + return isAvailable(mContext); + } + + static boolean isAvailable(Context context) { + return !RestrictedLockUtils.hasBaseUserRestriction(context, UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId()); } + } diff --git a/src/com/android/settings/network/NetworkResetPreferenceController.java b/src/com/android/settings/network/NetworkResetPreferenceController.java new file mode 100644 index 00000000000..04573c91390 --- /dev/null +++ b/src/com/android/settings/network/NetworkResetPreferenceController.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2017 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.network; + +import android.content.Context; + +import com.android.settings.core.PreferenceController; + +public class NetworkResetPreferenceController extends PreferenceController { + + public NetworkResetPreferenceController(Context context) { + super(context); + } + + @Override + public boolean isAvailable() { + return NetworkResetActionMenuController.isAvailable(mContext); + } + + @Override + public String getPreferenceKey() { + return "network_reset_pref"; + } +} diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java index 8b1983434d0..51209dd5fc6 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/search/SearchIndexableResources.java @@ -73,6 +73,7 @@ import com.android.settings.notification.ZenModeVisualInterruptionSettings; import com.android.settings.print.PrintSettingsFragment; import com.android.settings.security.LockscreenDashboardFragment; import com.android.settings.sim.SimSettings; +import com.android.settings.system.ResetDashboardFragment; import com.android.settings.system.SystemDashboardFragment; import com.android.settings.tts.TtsEnginePreferenceFragment; import com.android.settings.users.UserSettings; @@ -165,6 +166,7 @@ public final class SearchIndexableResources { R.xml.zen_mode_visual_interruptions_settings, R.drawable.ic_settings_notifications); addIndex(SystemDashboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_about); + addIndex(ResetDashboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_restore); addIndex(StorageDashboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_storage); addIndex(ConnectedDeviceDashboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_devices_other); diff --git a/src/com/android/settings/system/FactoryResetPreferenceController.java b/src/com/android/settings/system/FactoryResetPreferenceController.java index 95a9e5494cc..38afd160953 100644 --- a/src/com/android/settings/system/FactoryResetPreferenceController.java +++ b/src/com/android/settings/system/FactoryResetPreferenceController.java @@ -15,22 +15,30 @@ */ package com.android.settings.system; +import android.accounts.Account; +import android.accounts.AccountManager; import android.content.Context; - +import android.content.pm.UserInfo; +import android.os.UserHandle; import android.os.UserManager; +import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.core.PreferenceController; +import java.util.List; + public class FactoryResetPreferenceController extends PreferenceController { - /** Key of the "Factory reset" preference in {@link R.xml.system_dashboard_fragment}.*/ + /** Key of the "Factory reset" preference in {@link R.xml.reset_dashboard_fragment}. */ private static final String KEY_FACTORY_RESET = "factory_reset"; private final UserManager mUm; + private final AccountManager mAm; - public FactoryResetPreferenceController(Context context, UserManager um) { + public FactoryResetPreferenceController(Context context) { super(context); - mUm = um; + mUm = (UserManager) context.getSystemService(Context.USER_SERVICE); + mAm = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE); } /** Hide "Factory reset" settings for secondary users. */ @@ -43,4 +51,22 @@ public class FactoryResetPreferenceController extends PreferenceController { public String getPreferenceKey() { return KEY_FACTORY_RESET; } + + @Override + public void updateState(Preference preference) { + final List profiles = mUm.getProfiles(UserHandle.myUserId()); + int accountsCount = 0; + for (UserInfo userInfo : profiles) { + final int profileId = userInfo.id; + Account[] accounts = mAm.getAccountsAsUser(profileId); + accountsCount += accounts.length; + } + if (accountsCount == 0) { + preference.setSummary(R.string.master_clear_summary); + } else { + preference.setSummary(mContext.getResources().getQuantityString( + R.plurals.master_clear_with_account_summary, + accountsCount, accountsCount)); + } + } } diff --git a/src/com/android/settings/system/ResetDashboardFragment.java b/src/com/android/settings/system/ResetDashboardFragment.java new file mode 100644 index 00000000000..d4685bc0c89 --- /dev/null +++ b/src/com/android/settings/system/ResetDashboardFragment.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2017 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.system; + +import android.content.Context; +import android.provider.SearchIndexableResource; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.applications.ResetAppPrefPreferenceController; +import com.android.settings.core.PreferenceController; +import com.android.settings.core.lifecycle.Lifecycle; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.network.NetworkResetPreferenceController; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; + +import java.util.ArrayList; +import java.util.List; + +public class ResetDashboardFragment extends DashboardFragment { + + private static final String TAG = "ResetDashboardFragment"; + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.RESET_DASHBOARD; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.reset_dashboard_fragment; + } + + @Override + protected List getPreferenceControllers(Context context) { + return buildPreferenceControllers(context, getLifecycle()); + } + + private static List buildPreferenceControllers(Context context, + Lifecycle lifecycle) { + final List controllers = new ArrayList<>(); + controllers.add(new NetworkResetPreferenceController(context)); + controllers.add(new FactoryResetPreferenceController(context)); + controllers.add(new ResetAppPrefPreferenceController(context, lifecycle)); + return controllers; + } + + public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getXmlResourcesToIndex(Context context, + boolean enabled) { + final ArrayList result = new ArrayList<>(); + + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.reset_dashboard_fragment; + result.add(sir); + return result; + } + + @Override + public List getPreferenceControllers(Context context) { + return buildPreferenceControllers(context, null /* lifecycle */); + } + }; +} diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java index d4c63c2ee32..76ac4a6dab0 100644 --- a/src/com/android/settings/system/SystemDashboardFragment.java +++ b/src/com/android/settings/system/SystemDashboardFragment.java @@ -60,7 +60,6 @@ public class SystemDashboardFragment extends DashboardFragment { final List controllers = new ArrayList<>(); controllers.add(new SystemUpdatePreferenceController(context, UserManager.get(context))); controllers.add(new AdditionalSystemUpdatePreferenceController(context)); - controllers.add(new FactoryResetPreferenceController(context, UserManager.get(context))); return controllers; } diff --git a/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java b/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java index ba332b78e77..7cd76d3d15d 100644 --- a/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java @@ -17,6 +17,14 @@ package com.android.settings.network; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import android.content.Context; import android.view.Menu; import android.view.MenuItem; @@ -32,14 +40,6 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class NetworkResetActionMenuControllerTest { diff --git a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java index f41870e79ab..1d15b425079 100644 --- a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java @@ -16,11 +16,10 @@ package com.android.settings.system; import static com.google.common.truth.Truth.assertThat; - import static org.mockito.Answers.RETURNS_DEEP_STUBS; - import static org.mockito.Mockito.when; +import android.accounts.AccountManager; import android.content.Context; import android.os.UserManager; @@ -45,13 +44,17 @@ public class FactoryResetPreferenceControllerTest { private Context mContext; @Mock private UserManager mUserManager; + @Mock + private AccountManager mAccountManager; private FactoryResetPreferenceController mController; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mController = new FactoryResetPreferenceController(mContext, mUserManager); + when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + when(mContext.getSystemService(Context.ACCOUNT_SERVICE)).thenReturn(mAccountManager); + mController = new FactoryResetPreferenceController(mContext); } @Test @@ -68,7 +71,8 @@ public class FactoryResetPreferenceControllerTest { assertThat(mController.isAvailable()).isFalse(); } - @Test public void getPreferenceKey() { + @Test + public void getPreferenceKey() { assertThat(mController.getPreferenceKey()).isEqualTo(FACTORY_RESET_KEY); } }