/*
* Copyright (C) 2013 The CyanogenMod 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.app.ListFragment;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.android.settings.R;
import com.android.settings.cyanogenmod.TouchInterceptor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class WifiPriority extends ListFragment {
private final TouchInterceptor.DropListener mDropListener =
new TouchInterceptor.DropListener() {
public void drop(int from, int to) {
if (from == to) return;
// Sort networks by user selection
List<WifiConfiguration> mNetworks = mAdapter.getNetworks();
WifiConfiguration o = mNetworks.remove(from);
mNetworks.add(to, o);
// Set the new priorities of the networks
int cc = mNetworks.size();
for (int i = 0; i < cc; i++) {
WifiConfiguration network = mNetworks.get(i);
network.priority = cc - i;
// Update the priority
mWifiManager.updateNetwork(network);
}
// Now, save all the Wi-Fi configuration with its new priorities
mWifiManager.saveConfiguration();
// Reload the networks
mAdapter.reloadNetworks();
mNetworksListView.invalidateViews();
}
};
private WifiManager mWifiManager;
private TouchInterceptor mNetworksListView;
private WifiPriorityAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.wifi_network_priority, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Context ctx = getActivity().getApplicationContext();
mWifiManager = (WifiManager)ctx.getSystemService(Context.WIFI_SERVICE);
// Set the touchable listview
mNetworksListView = (TouchInterceptor)getListView();
mNetworksListView.setDropListener(mDropListener);
mAdapter = new WifiPriorityAdapter(ctx, mWifiManager);
setListAdapter(mAdapter);
}
@Override
public void onDestroy() {
mNetworksListView.setDropListener(null);
setListAdapter(null);
super.onDestroy();
}
@Override
public void onResume() {
super.onResume();
// Reload the networks
mAdapter.reloadNetworks();
mNetworksListView.invalidateViews();
}
private class WifiPriorityAdapter extends BaseAdapter {
private final WifiManager mWifiManager;
private final LayoutInflater mInflater;
private List<WifiConfiguration> mNetworks;
public WifiPriorityAdapter(Context ctx, WifiManager wifiManager) {
mWifiManager = wifiManager;
mInflater = LayoutInflater.from(ctx);
reloadNetworks();
}
private void reloadNetworks() {
mNetworks = mWifiManager.getConfiguredNetworks();
if (mNetworks == null) {
mNetworks = new ArrayList<WifiConfiguration>();
}
// Sort network list by priority (or by network id if the priority is the same)
Collections.sort(mNetworks, new Comparator<WifiConfiguration>() {
@Override
public int compare(WifiConfiguration lhs, WifiConfiguration rhs) {
// > priority -- > lower position
if (lhs.priority < rhs.priority) return 1;
if (lhs.priority > rhs.priority) return -1;
// < network id -- > lower position
if (lhs.networkId < rhs.networkId) return -1;
if (lhs.networkId > rhs.networkId) return 1;
return 0;
}
});
}
/**package**/ List<WifiConfiguration> getNetworks() {
return mNetworks;
}
@Override
public int getCount() {
return mNetworks.size();
}
@Override
public Object getItem(int position) {
return mNetworks.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final View v;
if (convertView == null) {
v = mInflater.inflate(R.layout.order_power_widget_button_list_item, null);
} else {
v = convertView;
}
WifiConfiguration network = (WifiConfiguration)getItem(position);
final TextView name = (TextView) v.findViewById(R.id.name);
// wpa_suplicant returns the SSID between double quotes. Remove them if are present.
name.setText(filterSSID(network.SSID));
return v;
}
private String filterSSID(String ssid) {
// Filter only if has start and end double quotes
if (ssid == null || !ssid.startsWith("\"") || !ssid.endsWith("\"")) {
return ssid;
}
return ssid.substring(1, ssid.length()-1);
}
}
}