Update Network & internet->Wi-Fi to use MasterSwitchPreference.
- Add a preference controller for Network & internet->Wi-Fi to control the preference toggling and summary update. - Refactor WifiSettings and WifiEnabler to share code between the new wifi preference controller and the wifi setting. - Refactor BluetoothSummaryHelper to have a common base class with the WifiSummaryHelper. - Rename the summary helper to summary updater. Bug: 34280769 Test: make RunSettingsRoboTests Change-Id: I00ebfc161bcef89331bb41ba405ed8cb8232d248
This commit is contained in:
@@ -29,23 +29,22 @@ import android.os.Message;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.provider.Settings;
|
||||
import android.widget.Switch;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settings.search.Index;
|
||||
import com.android.settings.widget.SwitchBar;
|
||||
import com.android.settings.widget.SwitchWidgetController;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
||||
import com.android.settingslib.WirelessUtils;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class WifiEnabler implements SwitchBar.OnSwitchChangeListener {
|
||||
public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListener {
|
||||
|
||||
private final SwitchBar mSwitchBar;
|
||||
private final SwitchWidgetController mSwitchWidget;
|
||||
private final WifiManager mWifiManager;
|
||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
||||
|
||||
@@ -93,10 +92,11 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener {
|
||||
}
|
||||
};
|
||||
|
||||
public WifiEnabler(Context context, SwitchBar switchBar,
|
||||
public WifiEnabler(Context context, SwitchWidgetController switchWidget,
|
||||
MetricsFeatureProvider metricsFeatureProvider) {
|
||||
mContext = context;
|
||||
mSwitchBar = switchBar;
|
||||
mSwitchWidget = switchWidget;
|
||||
mSwitchWidget.setListener(this);
|
||||
mMetricsFeatureProvider = metricsFeatureProvider;
|
||||
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
||||
|
||||
@@ -105,25 +105,25 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener {
|
||||
mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
|
||||
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
|
||||
|
||||
setupSwitchBar();
|
||||
setupSwitchController();
|
||||
}
|
||||
|
||||
public void setupSwitchBar() {
|
||||
public void setupSwitchController() {
|
||||
final int state = mWifiManager.getWifiState();
|
||||
handleWifiStateChanged(state);
|
||||
if (!mListeningToOnSwitchChange) {
|
||||
mSwitchBar.addOnSwitchChangeListener(this);
|
||||
mSwitchWidget.startListening();
|
||||
mListeningToOnSwitchChange = true;
|
||||
}
|
||||
mSwitchBar.show();
|
||||
mSwitchWidget.setupView();
|
||||
}
|
||||
|
||||
public void teardownSwitchBar() {
|
||||
public void teardownSwitchController() {
|
||||
if (mListeningToOnSwitchChange) {
|
||||
mSwitchBar.removeOnSwitchChangeListener(this);
|
||||
mSwitchWidget.stopListening();
|
||||
mListeningToOnSwitchChange = false;
|
||||
}
|
||||
mSwitchBar.hide();
|
||||
mSwitchWidget.teardownView();
|
||||
}
|
||||
|
||||
public void resume(Context context) {
|
||||
@@ -131,7 +131,7 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener {
|
||||
// Wi-Fi state is sticky, so just let the receiver update UI
|
||||
mContext.registerReceiver(mReceiver, mIntentFilter);
|
||||
if (!mListeningToOnSwitchChange) {
|
||||
mSwitchBar.addOnSwitchChangeListener(this);
|
||||
mSwitchWidget.startListening();
|
||||
mListeningToOnSwitchChange = true;
|
||||
}
|
||||
}
|
||||
@@ -139,45 +139,45 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener {
|
||||
public void pause() {
|
||||
mContext.unregisterReceiver(mReceiver);
|
||||
if (mListeningToOnSwitchChange) {
|
||||
mSwitchBar.removeOnSwitchChangeListener(this);
|
||||
mSwitchWidget.stopListening();
|
||||
mListeningToOnSwitchChange = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void handleWifiStateChanged(int state) {
|
||||
// Clear any previous state
|
||||
mSwitchBar.setDisabledByAdmin(null);
|
||||
mSwitchWidget.setDisabledByAdmin(null);
|
||||
|
||||
switch (state) {
|
||||
case WifiManager.WIFI_STATE_ENABLING:
|
||||
mSwitchBar.setEnabled(false);
|
||||
mSwitchWidget.setEnabled(false);
|
||||
break;
|
||||
case WifiManager.WIFI_STATE_ENABLED:
|
||||
setSwitchBarChecked(true);
|
||||
mSwitchBar.setEnabled(true);
|
||||
mSwitchWidget.setEnabled(true);
|
||||
updateSearchIndex(true);
|
||||
break;
|
||||
case WifiManager.WIFI_STATE_DISABLING:
|
||||
mSwitchBar.setEnabled(false);
|
||||
mSwitchWidget.setEnabled(false);
|
||||
break;
|
||||
case WifiManager.WIFI_STATE_DISABLED:
|
||||
setSwitchBarChecked(false);
|
||||
mSwitchBar.setEnabled(true);
|
||||
mSwitchWidget.setEnabled(true);
|
||||
updateSearchIndex(false);
|
||||
break;
|
||||
default:
|
||||
setSwitchBarChecked(false);
|
||||
mSwitchBar.setEnabled(true);
|
||||
mSwitchWidget.setEnabled(true);
|
||||
updateSearchIndex(false);
|
||||
}
|
||||
if (mayDisableTethering(!mSwitchBar.isChecked())) {
|
||||
if (mayDisableTethering(!mSwitchWidget.isChecked())) {
|
||||
if (RestrictedLockUtils.hasBaseUserRestriction(mContext,
|
||||
UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId())) {
|
||||
mSwitchBar.setEnabled(false);
|
||||
mSwitchWidget.setEnabled(false);
|
||||
} else {
|
||||
final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext,
|
||||
UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId());
|
||||
mSwitchBar.setDisabledByAdmin(admin);
|
||||
mSwitchWidget.setDisabledByAdmin(admin);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -193,7 +193,7 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener {
|
||||
|
||||
private void setSwitchBarChecked(boolean checked) {
|
||||
mStateMachineEvent = true;
|
||||
mSwitchBar.setChecked(checked);
|
||||
mSwitchWidget.setChecked(checked);
|
||||
mStateMachineEvent = false;
|
||||
}
|
||||
|
||||
@@ -214,17 +214,17 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSwitchChanged(Switch switchView, boolean isChecked) {
|
||||
public boolean onSwitchToggled(boolean isChecked) {
|
||||
//Do nothing if called as a result of a state machine event
|
||||
if (mStateMachineEvent) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
// Show toast message if Wi-Fi is not allowed in airplane mode
|
||||
if (isChecked && !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_WIFI)) {
|
||||
Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show();
|
||||
// Reset switch to off. No infinite check/listenenr loop.
|
||||
mSwitchBar.setChecked(false);
|
||||
return;
|
||||
mSwitchWidget.setChecked(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Disable tethering if enabling Wifi
|
||||
@@ -240,9 +240,10 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener {
|
||||
}
|
||||
if (!mWifiManager.setWifiEnabled(isChecked)) {
|
||||
// Error
|
||||
mSwitchBar.setEnabled(true);
|
||||
mSwitchWidget.setEnabled(true);
|
||||
Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean mayDisableTethering(boolean isChecked) {
|
||||
|
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* 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.wifi;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.core.PreferenceController;
|
||||
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settings.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settings.core.lifecycle.events.OnPause;
|
||||
import com.android.settings.core.lifecycle.events.OnResume;
|
||||
import com.android.settings.core.lifecycle.events.OnStart;
|
||||
import com.android.settings.core.lifecycle.events.OnStop;
|
||||
import com.android.settings.widget.SummaryUpdater;
|
||||
import com.android.settings.widget.MasterSwitchPreference;
|
||||
import com.android.settings.widget.MasterSwitchController;
|
||||
|
||||
public class WifiMasterSwitchPreferenceController extends PreferenceController
|
||||
implements SummaryUpdater.OnSummaryChangeListener,
|
||||
LifecycleObserver, OnResume, OnPause, OnStart, OnStop {
|
||||
|
||||
private static final String KEY_TOGGLE_WIFI = "toggle_wifi";
|
||||
|
||||
private MasterSwitchPreference mWifiPreference;
|
||||
private WifiEnabler mWifiEnabler;
|
||||
private final WifiSummaryUpdater mSummaryHelper;
|
||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
||||
|
||||
public WifiMasterSwitchPreferenceController(Context context,
|
||||
MetricsFeatureProvider metricsFeatureProvider) {
|
||||
super(context);
|
||||
mMetricsFeatureProvider = metricsFeatureProvider;
|
||||
mSummaryHelper = new WifiSummaryUpdater(mContext, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mWifiPreference = (MasterSwitchPreference) screen.findPreference(KEY_TOGGLE_WIFI);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreferenceKey() {
|
||||
return KEY_TOGGLE_WIFI;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
mSummaryHelper.register(true);
|
||||
if (mWifiEnabler != null) {
|
||||
mWifiEnabler.resume(mContext);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
if (mWifiEnabler != null) {
|
||||
mWifiEnabler.pause();
|
||||
}
|
||||
mSummaryHelper.register(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
mWifiEnabler = new WifiEnabler(mContext, new MasterSwitchController(mWifiPreference),
|
||||
mMetricsFeatureProvider);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
if (mWifiEnabler != null) {
|
||||
mWifiEnabler.teardownSwitchController();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSummaryChanged(String summary) {
|
||||
if (mWifiPreference != null) {
|
||||
mWifiPreference.setSummary(summary);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -19,12 +19,10 @@ package com.android.settings.wifi;
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.res.Resources;
|
||||
@@ -39,6 +37,7 @@ import android.os.Bundle;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.Process;
|
||||
import android.provider.Settings;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceCategory;
|
||||
import android.support.v7.preference.PreferenceManager;
|
||||
@@ -64,11 +63,12 @@ import com.android.settings.location.ScanningSettings;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
import com.android.settings.search.Indexable;
|
||||
import com.android.settings.search.SearchIndexableRaw;
|
||||
import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
|
||||
import com.android.settings.widget.SwitchBarController;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.wifi.AccessPoint;
|
||||
import com.android.settingslib.wifi.AccessPoint.AccessPointListener;
|
||||
import com.android.settingslib.wifi.AccessPointPreference;
|
||||
import com.android.settingslib.wifi.WifiStatusTracker;
|
||||
import com.android.settingslib.wifi.WifiTracker;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -303,7 +303,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
||||
super.onDestroyView();
|
||||
|
||||
if (mWifiEnabler != null) {
|
||||
mWifiEnabler.teardownSwitchBar();
|
||||
mWifiEnabler.teardownSwitchController();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -320,7 +320,8 @@ public class WifiSettings extends RestrictedSettingsFragment
|
||||
*/
|
||||
private WifiEnabler createWifiEnabler() {
|
||||
final SettingsActivity activity = (SettingsActivity) getActivity();
|
||||
return new WifiEnabler(activity, activity.getSwitchBar(), mMetricsFeatureProvider);
|
||||
return new WifiEnabler(activity, new SwitchBarController(activity.getSwitchBar()),
|
||||
mMetricsFeatureProvider);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1002,46 +1003,30 @@ public class WifiSettings extends RestrictedSettingsFragment
|
||||
return !isLockdownFeatureEnabled;
|
||||
}
|
||||
|
||||
private static class SummaryProvider extends BroadcastReceiver
|
||||
implements SummaryLoader.SummaryProvider {
|
||||
private static class SummaryProvider
|
||||
implements SummaryLoader.SummaryProvider, OnSummaryChangeListener {
|
||||
|
||||
private final Context mContext;
|
||||
private final WifiManager mWifiManager;
|
||||
private final WifiStatusTracker mWifiTracker;
|
||||
private final SummaryLoader mSummaryLoader;
|
||||
|
||||
@VisibleForTesting
|
||||
WifiSummaryUpdater mSummaryHelper;
|
||||
|
||||
public SummaryProvider(Context context, SummaryLoader summaryLoader) {
|
||||
mContext = context;
|
||||
mSummaryLoader = summaryLoader;
|
||||
mWifiManager = context.getSystemService(WifiManager.class);
|
||||
mWifiTracker = new WifiStatusTracker(mWifiManager);
|
||||
mSummaryHelper = new WifiSummaryUpdater(mContext, this);
|
||||
}
|
||||
|
||||
private CharSequence getSummary() {
|
||||
if (!mWifiTracker.enabled) {
|
||||
return mContext.getString(R.string.wifi_disabled_generic);
|
||||
}
|
||||
if (!mWifiTracker.connected) {
|
||||
return mContext.getString(R.string.disconnected);
|
||||
}
|
||||
return mWifiTracker.ssid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setListening(boolean listening) {
|
||||
if (listening) {
|
||||
IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
|
||||
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
|
||||
filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
|
||||
mSummaryLoader.registerReceiver(this, filter);
|
||||
}
|
||||
mSummaryHelper.register(listening);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
mWifiTracker.handleBroadcast(intent);
|
||||
mSummaryLoader.setSummary(this, getSummary());
|
||||
public void onSummaryChanged(String summary) {
|
||||
mSummaryLoader.setSummary(this, summary);
|
||||
}
|
||||
}
|
||||
|
||||
|
84
src/com/android/settings/wifi/WifiSummaryUpdater.java
Normal file
84
src/com/android/settings/wifi/WifiSummaryUpdater.java
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* 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.wifi;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.widget.SummaryUpdater;
|
||||
import com.android.settingslib.wifi.WifiStatusTracker;
|
||||
|
||||
/**
|
||||
* Helper class that listeners to wifi callback and notify client when there is update in
|
||||
* wifi summary info.
|
||||
*/
|
||||
public final class WifiSummaryUpdater extends SummaryUpdater {
|
||||
|
||||
private final WifiStatusTracker mWifiTracker;
|
||||
private final BroadcastReceiver mReceiver;
|
||||
|
||||
private static final IntentFilter INTENT_FILTER;
|
||||
static {
|
||||
INTENT_FILTER = new IntentFilter();
|
||||
INTENT_FILTER.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
|
||||
INTENT_FILTER.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
|
||||
INTENT_FILTER.addAction(WifiManager.RSSI_CHANGED_ACTION);
|
||||
}
|
||||
|
||||
public WifiSummaryUpdater(Context context, OnSummaryChangeListener listener) {
|
||||
this(context, listener, new WifiStatusTracker(context.getSystemService(WifiManager.class)));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public WifiSummaryUpdater(Context context, OnSummaryChangeListener listener,
|
||||
WifiStatusTracker wifiTracker) {
|
||||
super(context, listener);
|
||||
mWifiTracker = wifiTracker;
|
||||
mReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
mWifiTracker.handleBroadcast(intent);
|
||||
notifyChangeIfNeeded();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(boolean register) {
|
||||
if (register) {
|
||||
mContext.registerReceiver(mReceiver, INTENT_FILTER);
|
||||
} else {
|
||||
mContext.unregisterReceiver(mReceiver);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSummary() {
|
||||
if (!mWifiTracker.enabled) {
|
||||
return mContext.getString(R.string.wifi_disabled_generic);
|
||||
}
|
||||
if (!mWifiTracker.connected) {
|
||||
return mContext.getString(R.string.disconnected);
|
||||
}
|
||||
return mWifiTracker.ssid;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user