Commit be90341c authored by Stuart Scott's avatar Stuart Scott

Add option to reset network settings to factory

bug:16161518
Change-Id: I7c0cc58d5385352c6c9af2b27af23a744b5df977
parent 792343b2
......@@ -7,6 +7,8 @@
-keep class com.android.settings.bluetooth.*
-keep class com.android.settings.applications.*
-keep class com.android.settings.inputmethod.*
-keep class com.android.settings.ResetNetwork
-keep class com.android.settings.ResetNetworkConfirm
-keep class com.android.settings.MasterClear
-keep class com.android.settings.MasterClearConfirm
-keep class com.android.settings.accounts.*
......
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2015 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:layout_marginTop="12dp"
android:layout_weight="1">
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="@string/reset_network_desc" />
</LinearLayout>
</ScrollView>
<Spinner android:id="@+id/reset_network_subscription"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/initiate_reset_network"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dip"
android:layout_marginBottom="12dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reset_network_button_text"
android:gravity="center" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2015 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:layout_marginTop="12dp"
android:textSize="20sp"
android:text="@string/reset_network_final_desc" />
<Button android:id="@+id/execute_reset_network"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reset_network_final_button_text"
android:gravity="center" />
</LinearLayout>
......@@ -2359,15 +2359,29 @@
<!-- APNs screen toast message to inform reset default APN settings is completed -->
<string name="restore_default_apn_completed">Reset default APN settings completed.</string>
<!-- Reset Network -->
<!-- SD card & phone storage settings screen, setting option name under Backup & Restore heading -->
<string name="reset_network_title">Network settings reset</string>
<!-- SD card & phone storage settings screen, message on screen after user selects Reset network settings [CHAR LIMIT=NONE] -->
<string name="reset_network_desc">This will reset all settings related to networking to the factory defaults, including:\n\n<li>Wifi</li>\n<li>Mobile data</li>\n<li>Bluetooth</li>"</string>
<!-- SD card & phone storage settings screen, button on screen after user selects Reset network settings -->
<string name="reset_network_button_text">Reset settings</string>
<!-- SD card & phone storage settings screen, message on screen after user selects Reset settings button -->
<string name="reset_network_final_desc">Reset all network settings? You can\'t reverse this action!</string>
<!-- SD card & phone storage settings screen, button on screen after user selects Reset settings button -->
<string name="reset_network_final_button_text">Reset settings</string>
<!-- Explanation of drawing unlock pattern to reset settings -->
<string name="reset_network_gesture_explanation">You need to draw your unlock pattern to confirm a network settings reset.</string>
<!-- Reset settings confirmation screen title [CHAR LIMIT=30] -->
<string name="reset_network_confirm_title">Reset?</string>
<!-- Reset settings complete toast text [CHAR LIMIT=75] -->
<string name="reset_network_complete_toast">Network settings reset</string>
<!-- Master Clear -->
<!-- SD card & phone storage settings screen, setting option name under Internal phone storage heading [CHAR LIMIT=30] -->
<string name="device_reset_title">Reset device</string>
<!-- SD card & phone storage settings screen, setting option name under Internal phone storage heading -->
<string name="master_clear_title">Factory data reset</string>
<!-- SD card & phone storage settings screen, setting option summary text under Internal phone storage heading -->
<string name="master_clear_summary" product="tablet">Erases all data on tablet</string>
<!-- SD card & phone storage settings screen, setting option summary text under Internal phone storage heading -->
<string name="master_clear_summary" product="default">Erases all data on phone</string>
<!-- SD card & phone storage settings screen, message on screen after user selects Factory data reset [CHAR LIMIT=NONE] -->
<string name="master_clear_desc" product="tablet">"This will erase all data from your tablet\'s <b>internal storage</b>, including:\n\n<li>Your Google account</li>\n<li>System and app data and settings</li>\n<li>Downloaded apps</li>"</string>
<!-- SD card & phone storage settings screen, message on screen after user selects Factory data reset [CHAR LIMIT=NONE] -->
......@@ -4326,8 +4340,6 @@
<string name="backup_data_summary">Back up app data, Wi\u2011Fi passwords, and other settings to Google servers</string>
<!-- Configure backup account options menu title [CHAR LIMIT=25]-->
<string name="backup_configure_account_title">Backup account</string>
<!-- Default summary text of the "Configure backup account" setting [CHAR LIMIT=80]-->
<string name="backup_configure_account_default_summary">No account is currently storing backed up data</string>
<!-- Auto-restore menu title [CHAR LIMIT=30] -->
<string name="include_app_data_title">Include app data</string>
<!-- Auto-restore menu title -->
......@@ -4336,8 +4348,6 @@
<string name="auto_restore_summary">When reinstalling an app, restore backed up settings and data</string>
<!-- Title of the preference informing the user about the backup service being inactive [CHAR LIMIT=50]-->
<string name="backup_inactive_title">Backup service is inactive.</string>
<!-- Summary text of the preference informing the user about the backup service being inactive, explaining that this is likely set by device policy [CHAR LIMIT=150]-->
<string name="backup_inactive_summary">This is set by your device policy.</string>
<!-- Local (desktop) backup password menu title [CHAR LIMIT=25] -->
<string name="local_backup_password_title">Desktop backup password</string>
......
......@@ -15,54 +15,47 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/privacy_settings_title">
<PreferenceCategory android:key="backup_category"
android:title="@string/backup_section_title">
<!-- Backup settings -->
<SwitchPreference
android:key="backup_data"
android:title="@string/backup_data_title"
android:summary="@string/backup_data_summary"
android:persistent="false" />
<PreferenceScreen
android:key="configure_account"
android:title="@string/backup_configure_account_title"
android:summary="@string/backup_configure_account_default_summary"
android:persistent="false">
<!-- the Intent declared here is always overwritten by a real one -->
<intent android:action="dummy" />
</PreferenceScreen>
<SwitchPreference
android:key="auto_restore"
android:title="@string/auto_restore_title"
android:summary="@string/auto_restore_summary"
android:persistent="false" />
<Preference
android:key="backup_inactive"
android:title="@string/backup_inactive_title"
android:summary="@string/backup_inactive_summary"
android:persistent="false"
android:enabled="false"
android:selectable="false" />
</PreferenceCategory>
<PreferenceCategory android:key="personal_data_category"
android:title="@string/personal_data_section_title">
<!-- Factory reset -->
<PreferenceScreen
android:title="@string/master_clear_title"
android:summary="@string/master_clear_summary"
settings:keywords="@string/keywords_factory_data_reset"
android:fragment="com.android.settings.MasterClear" />
</PreferenceCategory>
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/privacy_settings_title">
<!-- Backup settings -->
<SwitchPreference
android:key="backup_data"
android:title="@string/backup_data_title"
android:summary="@string/backup_data_summary"
android:persistent="false" />
<PreferenceScreen
android:key="configure_account"
android:title="@string/backup_configure_account_title"
android:persistent="false">
<!-- the Intent declared here is always overwritten by a real one -->
<intent android:action="dummy" />
</PreferenceScreen>
<SwitchPreference
android:key="auto_restore"
android:title="@string/auto_restore_title"
android:summary="@string/auto_restore_summary"
android:persistent="false" />
<Preference
android:key="backup_inactive"
android:title="@string/backup_inactive_title"
android:persistent="false"
android:enabled="false"
android:selectable="false" />
<!-- Network reset -->
<PreferenceScreen
android:title="@string/reset_network_title"
android:fragment="com.android.settings.ResetNetwork" />
<!-- Factory reset -->
<PreferenceScreen
android:key="factory_reset"
android:title="@string/master_clear_title"
settings:keywords="@string/keywords_factory_data_reset"
android:fragment="com.android.settings.MasterClear" />
</PreferenceScreen>
......@@ -77,9 +77,8 @@ public class MasterClear extends Fragment {
*/
private boolean runKeyguardConfirmation(int request) {
Resources res = getActivity().getResources();
return new ChooseLockSettingsHelper(getActivity(), this)
.launchConfirmationActivity(request, null,
res.getText(R.string.master_clear_gesture_explanation));
return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(request,
null, res.getText(R.string.master_clear_gesture_explanation));
}
@Override
......@@ -100,11 +99,10 @@ public class MasterClear extends Fragment {
}
private void showFinalConfirmation() {
Preference preference = new Preference(getActivity());
preference.setFragment(MasterClearConfirm.class.getName());
preference.setTitle(R.string.master_clear_confirm_title);
preference.getExtras().putBoolean(ERASE_EXTERNAL_EXTRA, mExternalStorage.isChecked());
((SettingsActivity) getActivity()).onPreferenceStartFragment(null, preference);
Bundle args = new Bundle();
args.putBoolean(ERASE_EXTERNAL_EXTRA, mExternalStorage.isChecked());
((SettingsActivity) getActivity()).startPreferencePanel(MasterClearConfirm.class.getName(),
args, R.string.master_clear_confirm_title, null, null, 0);
}
/**
......
......@@ -43,7 +43,10 @@ import com.android.settings.search.Indexable;
import com.android.settings.search.Indexable.SearchIndexProvider;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Gesture lock pattern settings.
......@@ -53,12 +56,11 @@ public class PrivacySettings extends SettingsPreferenceFragment implements
// Vendor specific
private static final String GSETTINGS_PROVIDER = "com.google.settings";
private static final String BACKUP_CATEGORY = "backup_category";
private static final String BACKUP_DATA = "backup_data";
private static final String AUTO_RESTORE = "auto_restore";
private static final String CONFIGURE_ACCOUNT = "configure_account";
private static final String BACKUP_INACTIVE = "backup_inactive";
private static final String PERSONAL_DATA_CATEGORY = "personal_data_category";
private static final String FACTORY_RESET = "factory_reset";
private static final String TAG = "PrivacySettings";
private IBackupManager mBackupManager;
private SwitchPreference mBackup;
......@@ -92,7 +94,8 @@ public class PrivacySettings extends SettingsPreferenceFragment implements
mConfigure = (PreferenceScreen) screen.findPreference(CONFIGURE_ACCOUNT);
ArrayList<String> keysToRemove = getNonVisibleKeys(getActivity());
Set<String> keysToRemove = new HashSet<>();
getNonVisibleKeys(getActivity(), keysToRemove);
final int screenPreferenceCount = screen.getPreferenceCount();
for (int i = screenPreferenceCount - 1; i >= 0; --i) {
Preference preference = screen.getPreference(i);
......@@ -100,16 +103,7 @@ public class PrivacySettings extends SettingsPreferenceFragment implements
screen.removePreference(preference);
}
}
PreferenceCategory backupCategory = (PreferenceCategory) findPreference(BACKUP_CATEGORY);
if (backupCategory != null) {
final int backupCategoryPreferenceCount = backupCategory.getPreferenceCount();
for (int i = backupCategoryPreferenceCount - 1; i >= 0; --i) {
Preference preference = backupCategory.getPreference(i);
if (keysToRemove.contains(preference.getKey())) {
backupCategory.removePreference(preference);
}
}
}
updateToggles();
}
......@@ -300,12 +294,13 @@ public class PrivacySettings extends SettingsPreferenceFragment implements
@Override
public List<String> getNonIndexableKeys(Context context) {
return getNonVisibleKeys(context);
final List<String> nonVisibleKeys = new ArrayList<>();
getNonVisibleKeys(context, nonVisibleKeys);
return nonVisibleKeys;
}
}
private static ArrayList<String> getNonVisibleKeys(Context context) {
final ArrayList<String> nonVisibleKeys = new ArrayList<String>();
private static void getNonVisibleKeys(Context context, Collection<String> nonVisibleKeys) {
final IBackupManager backupManager = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
boolean isServiceActive = false;
......@@ -315,22 +310,19 @@ public class PrivacySettings extends SettingsPreferenceFragment implements
Log.w(TAG, "Failed querying backup manager service activity status. " +
"Assuming it is inactive.");
}
if (isServiceActive) {
boolean vendorSpecific = context.getPackageManager().
resolveContentProvider(GSETTINGS_PROVIDER, 0) == null;
if (vendorSpecific || isServiceActive) {
nonVisibleKeys.add(BACKUP_INACTIVE);
} else {
}
if (vendorSpecific || !isServiceActive) {
nonVisibleKeys.add(BACKUP_DATA);
nonVisibleKeys.add(AUTO_RESTORE);
nonVisibleKeys.add(CONFIGURE_ACCOUNT);
nonVisibleKeys.add(BACKUP_DATA);
}
if (UserManager.get(context).hasUserRestriction(
UserManager.DISALLOW_FACTORY_RESET)) {
nonVisibleKeys.add(PERSONAL_DATA_CATEGORY);
}
// Vendor specific
if (context.getPackageManager().
resolveContentProvider(GSETTINGS_PROVIDER, 0) == null) {
nonVisibleKeys.add(BACKUP_CATEGORY);
nonVisibleKeys.add(FACTORY_RESET);
}
return nonVisibleKeys;
}
}
/*
* Copyright (C) 2015 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;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemProperties;
import android.os.UserManager;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import com.android.internal.telephony.PhoneConstants;
import java.util.ArrayList;
import java.util.List;
/**
* Confirm and execute a reset of the device's network settings to a clean "just out of the box"
* state. Multiple confirmations are required: first, a general "are you sure you want to do this?"
* prompt, followed by a keyguard pattern trace if the user has defined one, followed by a final
* strongly-worded "THIS WILL RESET EVERYTHING" prompt. If at any time the phone is allowed to go
* to sleep, is locked, et cetera, then the confirmation sequence is abandoned.
*
* This is the initial screen.
*/
public class ResetNetwork extends Fragment {
private static final String TAG = "ResetNetwork";
// Arbitrary to avoid conficts
private static final int KEYGUARD_REQUEST = 55;
private List<SubscriptionInfo> mSubscriptions;
private View mContentView;
private Spinner mSubscriptionSpinner;
private Button mInitiateButton;
/**
* Keyguard validation is run using the standard {@link ConfirmLockPattern}
* component as a subactivity
* @param request the request code to be returned once confirmation finishes
* @return true if confirmation launched
*/
private boolean runKeyguardConfirmation(int request) {
Resources res = getActivity().getResources();
return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(request,
null, res.getText(R.string.reset_network_gesture_explanation));
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode != KEYGUARD_REQUEST) {
return;
}
// If the user entered a valid keyguard trace, present the final
// confirmation prompt; otherwise, go back to the initial state.
if (resultCode == Activity.RESULT_OK) {
showFinalConfirmation();
} else {
establishInitialState();
}
}
private void showFinalConfirmation() {
Bundle args = new Bundle();
if (mSubscriptions.size() > 0) {
int selectedIndex = mSubscriptionSpinner.getSelectedItemPosition();
SubscriptionInfo subscription = mSubscriptions.get(selectedIndex);
args.putInt(PhoneConstants.SUBSCRIPTION_KEY, subscription.getSubscriptionId());
}
((SettingsActivity) getActivity()).startPreferencePanel(ResetNetworkConfirm.class.getName(),
args, R.string.reset_network_confirm_title, null, null, 0);
}
/**
* If the user clicks to begin the reset sequence, we next require a
* keyguard confirmation if the user has currently enabled one. If there
* is no keyguard available, we simply go to the final confirmation prompt.
*/
private final Button.OnClickListener mInitiateListener = new Button.OnClickListener() {
@Override
public void onClick(View v) {
if (!runKeyguardConfirmation(KEYGUARD_REQUEST)) {
showFinalConfirmation();
}
}
};
/**
* In its initial state, the activity presents a button for the user to
* click in order to initiate a confirmation sequence. This method is
* called from various other points in the code to reset the activity to
* this base state.
*
* <p>Reinflating views from resources is expensive and prevents us from
* caching widget pointers, so we use a single-inflate pattern: we lazy-
* inflate each view, caching all of the widget pointers we'll need at the
* time, then simply reuse the inflated views directly whenever we need
* to change contents.
*/
private void establishInitialState() {
mSubscriptionSpinner = (Spinner) mContentView.findViewById(R.id.reset_network_subscription);
mSubscriptions = SubscriptionManager.from(getActivity()).getActiveSubscriptionInfoList();
if (mSubscriptions.size() > 0) {
// Get the default subscription in the order of data, voice, sms, first up.
int defaultSubscription = SubscriptionManager.getDefaultDataSubId();
if (!SubscriptionManager.isUsableSubIdValue(defaultSubscription)) {
defaultSubscription = SubscriptionManager.getDefaultVoiceSubId();
}
if (!SubscriptionManager.isUsableSubIdValue(defaultSubscription)) {
defaultSubscription = SubscriptionManager.getDefaultSmsSubId();
}
if (!SubscriptionManager.isUsableSubIdValue(defaultSubscription)) {
defaultSubscription = SubscriptionManager.getDefaultSubId();
}
int selectedIndex = 0;
int size = mSubscriptions.size();
List<String> subscriptionNames = new ArrayList<>();
for (SubscriptionInfo record : mSubscriptions) {
if (record.getSubscriptionId() == defaultSubscription) {
// Set the first selected value to the default
selectedIndex = subscriptionNames.size();
}
String name = record.getDisplayName().toString();
if (TextUtils.isEmpty(name)) {
name = record.getNumber();
}
if (TextUtils.isEmpty(name)) {
name = record.getCarrierName().toString();
}
if (TextUtils.isEmpty(name)) {
name = String.format("MCC:%s MNC:%s Slot:%s Id:%s", record.getMcc(),
record.getMnc(), record.getSimSlotIndex(), record.getSubscriptionId());
}
subscriptionNames.add(name);
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_spinner_item, subscriptionNames);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSubscriptionSpinner.setAdapter(adapter);
mSubscriptionSpinner.setSelection(selectedIndex);
mSubscriptionSpinner.setVisibility(View.VISIBLE);
} else {
mSubscriptionSpinner.setVisibility(View.INVISIBLE);
}
mInitiateButton = (Button) mContentView.findViewById(R.id.initiate_reset_network);
mInitiateButton.setOnClickListener(mInitiateListener);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mContentView = inflater.inflate(R.layout.reset_network, null);
establishInitialState();
return mContentView;
}
}
/*
* Copyright (C) 2015 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;
import android.app.Fragment;
import android.content.Context;
import android.net.IConnectivityManager;
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.net.NetworkTemplate;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;
import com.android.internal.net.VpnConfig;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
import com.android.settings.net.NetworkPolicyEditor;
import java.util.ArrayList;
import java.util.List;
/**
* Confirm and execute a reset of the network settings to a clean "just out of the box"
* state. Multiple confirmations are required: first, a general "are you sure
* you want to do this?" prompt, followed by a keyguard pattern trace if the user
* has defined one, followed by a final strongly-worded "THIS WILL RESET EVERYTHING"
* prompt. If at any time the phone is allowed to go to sleep, is
* locked, et cetera, then the confirmation sequence is abandoned.
*
* This is the confirmation screen.
*/
public class ResetNetworkConfirm extends Fragment {
private View mContentView;
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
/**
* The user has gone through the multiple confirmation, so now we go ahead
* and reset the network settings to its factory-default state.
*/
private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
@Override
public void onClick(View v) {
if (Utils.isMonkeyRunning()) {
return;
}
// TODO maybe show a progress dialog if this ends up taking a while
IConnectivityManager connectivityService = IConnectivityManager.Stub.asInterface(
ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
WifiManager wifiManager = (WifiManager)
getActivity().getSystemService(Context.WIFI_SERVICE);
TelephonyManager telephonyManager = (TelephonyManager)
getActivity().getSystemService(Context.TELEPHONY_SERVICE);
NetworkPolicyManager policyManager = NetworkPolicyManager.from(getActivity());
NetworkPolicyEditor policyEditor = new NetworkPolicyEditor(policyManager);
policyEditor.read();
// Turn airplane mode off
try {
connectivityService.setAirplaneMode(false);
} catch (RemoteException e) {
// Well, we tried
}
// Turn wifi on
wifiManager.setWifiEnabled(true);
// Delete all Wifi SSIDs
List<WifiConfiguration> networks = wifiManager.getConfiguredNetworks();
if (networks != null) {
for (WifiConfiguration config : networks) {
wifiManager.removeNetwork(config.networkId);
}
}
// Turn mobile hotspot off
wifiManager.setWifiApEnabled(null, false);
// Un-tether
try {
for (String tether : connectivityService.getTetheredIfaces()) {
connectivityService.untether(tether);
}
} catch (RemoteException e) {
// Well, we tried
}
// Turn VPN off
try {
VpnConfig vpnConfig = connectivityService.getVpnConfig();
if (vpnConfig != null) {
if (vpnConfig.legacy) {
connectivityService.prepareVpn(VpnConfig.LEGACY_VPN, VpnConfig.LEGACY_VPN);
} else {
// Prevent this app from initiating VPN connections in the future without