diff options
Diffstat (limited to 'src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java')
-rw-r--r-- | src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java | 187 |
1 files changed, 177 insertions, 10 deletions
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java index 45aafdf..a3140a1 100644 --- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java +++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java @@ -16,18 +16,33 @@ package com.android.settings.wifi; +import static android.os.UserManager.DISALLOW_CONFIG_WIFI; + import android.app.Dialog; +import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; +import android.database.ContentObserver; +import android.net.Uri; +import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.Bundle; +import android.os.Handler; import android.preference.Preference; import android.preference.PreferenceScreen; import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; import com.android.internal.logging.MetricsLogger; +import com.android.settings.DraggableSortListView; import com.android.settings.R; +import com.android.settings.RestrictedSettingsFragment; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; @@ -35,6 +50,7 @@ import com.android.settings.search.SearchIndexableRaw; import com.android.settings.wifi.AccessPointPreference.UserBadgeCache; import com.android.settingslib.wifi.AccessPoint; import com.android.settingslib.wifi.WifiTracker; +import cyanogenmod.providers.CMSettings; import java.util.ArrayList; import java.util.Collections; @@ -44,20 +60,74 @@ import java.util.List; /** * UI to manage saved networks/access points. */ -public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment +public class SavedAccessPointsWifiSettings extends RestrictedSettingsFragment implements DialogInterface.OnClickListener, Indexable { private static final String TAG = "SavedAccessPointsWifiSettings"; + private DraggableSortListView.DropListener mDropListener = + new DraggableSortListView.DropListener() { + @Override + public void drop(int from, int to) { + if (from == to) return; + + PreferenceScreen preferences = getPreferenceScreen(); + int count = preferences.getPreferenceCount(); + + // Sort the new list + List<AccessPointPreference> aps = new ArrayList<>(count); + for (int i = 0; i < count; i++) { + aps.add((AccessPointPreference) preferences.getPreference(i)); + } + AccessPointPreference o = aps.remove(from); + aps.add(to, o); + + // Update the priorities + for (int i = 0; i < count; i++) { + AccessPoint ap = aps.get(i).getAccessPoint(); + WifiConfiguration config = ap.getConfig(); + config.priority = count - i; + + mWifiManager.updateNetwork(config); + } + + // Now, save all the Wi-Fi configuration with its new priorities + mWifiManager.saveConfiguration(); + mPrioritiesOrderChanged = true; + + // Redraw the listview + initPreferences(); + } + }; + + private final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange, Uri uri) { + mNetworksListView.setDropListener(isAutoConfigPriorities() ? null : mDropListener); + getActivity().invalidateOptionsMenu(); + } + }; + + + private static final int MENU_ID_AUTO_CONFIG_PRIORITIES = Menu.FIRST; + private WifiDialog mDialog; private WifiManager mWifiManager; private AccessPoint mDlgAccessPoint; private Bundle mAccessPointSavedState; private AccessPoint mSelectedAccessPoint; + private boolean mPrioritiesOrderChanged; private UserBadgeCache mUserBadgeCache; + private DraggableSortListView mNetworksListView; + // Instance state key private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state"; + private static final String PRIORITIES_ORDER_CHANGED_STATE = "priorities_order_changed"; + + public SavedAccessPointsWifiSettings() { + super(DISALLOW_CONFIG_WIFI); + } @Override protected int getMetricsCategory() { @@ -75,6 +145,27 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment public void onResume() { super.onResume(); initPreferences(); + + mNetworksListView.setDropListener(isAutoConfigPriorities() ? null : mDropListener); + getActivity().invalidateOptionsMenu(); + ContentResolver resolver = getContentResolver(); + resolver.registerContentObserver(CMSettings.Global.getUriFor( + CMSettings.Global.WIFI_AUTO_PRIORITIES_CONFIGURATION), false, mSettingsObserver); + } + + @Override + public void onPause() { + super.onResume(); + getContentResolver().unregisterContentObserver(mSettingsObserver); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mNetworksListView = new DraggableSortListView(getActivity()); + mNetworksListView.setId(android.R.id.list); + mNetworksListView.setDropListener(mDropListener); + return mNetworksListView; } @Override @@ -87,7 +178,69 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE); } + mPrioritiesOrderChanged = savedInstanceState.getBoolean( + PRIORITIES_ORDER_CHANGED_STATE, false); } + + registerForContextMenu(getListView()); + setHasOptionsMenu(true); + } + + @Override + public void onDetach() { + super.onDetach(); + + if (mPrioritiesOrderChanged) { + // Send a disconnect to ensure the new wifi priorities are detected + mWifiManager.disconnect(); + } + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + // If the user is not allowed to configure wifi, do not show the menu. + if (isUiRestricted()) return; + + addOptionsMenuItems(menu); + super.onCreateOptionsMenu(menu, inflater); + } + + void addOptionsMenuItems(Menu menu) { + menu.add(Menu.NONE, MENU_ID_AUTO_CONFIG_PRIORITIES, 0, R.string.wifi_auto_config_priorities) + .setCheckable(true) + .setChecked(isAutoConfigPriorities()) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // If the user is not allowed to configure wifi, do not handle menu selections. + if (isUiRestricted()) return false; + + switch (item.getItemId()) { + case MENU_ID_AUTO_CONFIG_PRIORITIES: + boolean autoConfig = !item.isChecked(); + + // Set the system settings and refresh the listview + CMSettings.Global.putInt(getActivity().getContentResolver(), + CMSettings.Global.WIFI_AUTO_PRIORITIES_CONFIGURATION, autoConfig ? 1 : 0); + mNetworksListView.setDropListener(autoConfig ? null : mDropListener); + item.setChecked(autoConfig); + + if (!autoConfig) { + // Reenable all the entries + PreferenceScreen preferences = getPreferenceScreen(); + int count = preferences.getPreferenceCount(); + for (int i = 0; i < count; i++) { + AccessPoint ap = ((AccessPointPreference) + preferences.getPreference(i)).getAccessPoint(); + WifiConfiguration config = ap.getConfig(); + mWifiManager.enableNetwork(config.networkId, false); + } + } + return true; + } + return super.onOptionsItemSelected(item); } private void initPreferences() { @@ -96,26 +249,34 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment final List<AccessPoint> accessPoints = WifiTracker.getCurrentAccessPoints(context, true, false, true); + // Sort network list by priority (or by network id if the priority is the same) Collections.sort(accessPoints, new Comparator<AccessPoint>() { - public int compare(AccessPoint ap1, AccessPoint ap2) { - if (ap1.getConfigName() != null) { - return ap1.getConfigName().compareTo(ap2.getConfigName()); - } else { - return -1; - } + @Override + public int compare(AccessPoint lhs, AccessPoint rhs) { + WifiConfiguration lwc = lhs.getConfig(); + WifiConfiguration rwc = rhs.getConfig(); + + // > priority -- > lower position + if (lwc.priority < rwc.priority) return 1; + if (lwc.priority > rwc.priority) return -1; + // < network id -- > lower position + if (lhs.getNetworkId() < rhs.getNetworkId()) return -1; + if (lhs.getNetworkId() > rhs.getNetworkId()) return 1; + return 0; } }); + preferenceScreen.setOrderingAsAdded(false); preferenceScreen.removeAll(); final int accessPointsSize = accessPoints.size(); for (int i = 0; i < accessPointsSize; ++i){ AccessPointPreference preference = new AccessPointPreference(accessPoints.get(i), - context, mUserBadgeCache, true); - preference.setIcon(null); + context, mUserBadgeCache, true, true); + preference.setOrder(i); preferenceScreen.addPreference(preference); } - if(getPreferenceScreen().getPreferenceCount() < 1) { + if (getPreferenceScreen().getPreferenceCount() < 1) { Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!"); } } @@ -167,6 +328,7 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); } } + outState.putBoolean(PRIORITIES_ORDER_CHANGED_STATE, mPrioritiesOrderChanged); } @Override @@ -188,6 +350,11 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment } } + private boolean isAutoConfigPriorities() { + return CMSettings.Global.getInt(getActivity().getContentResolver(), + CMSettings.Global.WIFI_AUTO_PRIORITIES_CONFIGURATION, 1) != 0; + } + /** * For search. */ |