summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java')
-rw-r--r--src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java187
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.
*/