Move reset options to one place

Change-Id: I419c16cbfc69861e01f28c14abdde137bd78f0bb
Fix: 36458355
Test: make RunSettingsRoboTests
This commit is contained in:
Fan Zhang
2017-03-24 13:43:11 -07:00
parent 45f21c0aa4
commit 51059c5c91
13 changed files with 304 additions and 32 deletions

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/reset_dashboard_title">
<!-- Network reset -->
<Preference
android:key="network_reset_pref"
android:title="@string/reset_network_title"
android:fragment="com.android.settings.ResetNetwork" />
<!-- Reset app preferences -->
<Preference
android:key="reset_app_prefs"
android:title="@string/reset_app_preferences" />
<!-- Factory reset -->
<com.android.settingslib.RestrictedPreference
android:key="factory_reset"
android:title="@string/master_clear_title"
android:summary="@string/master_clear_summary"
settings:keywords="@string/keywords_factory_data_reset"
settings:userRestriction="no_factory_reset"
settings:useAdminDisabledSummary="true"
android:fragment="com.android.settings.MasterClear" />
</PreferenceScreen>

View File

@@ -16,7 +16,6 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/header_category_system">
<!-- System updates -->
@@ -26,7 +25,7 @@
android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_system_update"
android:order="-30">
<intent android:action="android.settings.SYSTEM_UPDATE_SETTINGS"/>
<intent android:action="android.settings.SYSTEM_UPDATE_SETTINGS" />
</Preference>
<Preference
@@ -35,17 +34,14 @@
android:order="-31">
<intent android:action="android.intent.action.MAIN"
android:targetPackage="@string/additional_system_update"
android:targetClass="@string/additional_system_update_menu"/>
android:targetClass="@string/additional_system_update_menu" />
</Preference>
<!-- Factory reset -->
<com.android.settingslib.RestrictedPreference
android:key="factory_reset"
android:title="@string/master_clear_title"
<Preference
android:key="reset_dashboard"
android:title="@string/reset_dashboard_title"
android:icon="@drawable/ic_restore"
android:order="-20"
settings:keywords="@string/keywords_factory_data_reset"
settings:userRestriction="no_factory_reset"
settings:useAdminDisabledSummary="true"
android:fragment="com.android.settings.MasterClear" />
android:fragment="com.android.settings.system.ResetDashboardFragment" />
</PreferenceScreen>

View File

@@ -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);
}
}

View File

@@ -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 {

View File

@@ -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(),

View File

@@ -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());
}
}

View File

@@ -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";
}
}

View File

@@ -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);

View File

@@ -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<UserInfo> 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));
}
}
}

View File

@@ -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<PreferenceController> getPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
private static List<PreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List<PreferenceController> 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<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
final ArrayList<SearchIndexableResource> result = new ArrayList<>();
final SearchIndexableResource sir = new SearchIndexableResource(context);
sir.xmlResId = R.xml.reset_dashboard_fragment;
result.add(sir);
return result;
}
@Override
public List<PreferenceController> getPreferenceControllers(Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
};
}

View File

@@ -60,7 +60,6 @@ public class SystemDashboardFragment extends DashboardFragment {
final List<PreferenceController> 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;
}

View File

@@ -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 {

View File

@@ -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);
}
}