/* * Copyright (C) 2014 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.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceScreen; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.search.SearchIndexableRaw; import android.util.Log; import android.view.View; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * UI to manage saved networks/access points. */ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment implements DialogInterface.OnClickListener, Indexable { private static final String TAG = "SavedAccessPointsWifiSettings"; private WifiDialog mDialog; private WifiManager mWifiManager; private AccessPoint mDlgAccessPoint; private Bundle mAccessPointSavedState; private AccessPoint mSelectedAccessPoint; // Instance state key private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.wifi_display_saved_access_points); } @Override public void onResume() { super.onResume(); initPreferences(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (savedInstanceState != null) { if (savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) { mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE); } } } private void initPreferences() { PreferenceScreen preferenceScreen = getPreferenceScreen(); final Context context = getActivity(); mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final List accessPoints = constructSavedAccessPoints(context, mWifiManager); preferenceScreen.removeAll(); final int accessPointsSize = accessPoints.size(); for (int i = 0; i < accessPointsSize; ++i){ preferenceScreen.addPreference(accessPoints.get(i)); } if(getPreferenceScreen().getPreferenceCount() < 1) { Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!"); } } private static List constructSavedAccessPoints(Context context, WifiManager wifiManager){ List accessPoints = new ArrayList(); Map> resultsMap = new HashMap>(); final List configs = wifiManager.getConfiguredNetworks(); final List scanResults = wifiManager.getScanResults(); if (configs != null) { //Construct a Map for quick searching of a wifi network via ssid. final int scanResultsSize = scanResults.size(); for (int i = 0; i < scanResultsSize; ++i){ final ScanResult result = scanResults.get(i); List res = resultsMap.get(result.SSID); if(res == null){ res = new ArrayList(); resultsMap.put(result.SSID, res); } res.add(result); } final int configsSize = configs.size(); for (int i = 0; i < configsSize; ++i){ WifiConfiguration config = configs.get(i); if (config.selfAdded && config.numAssociation == 0) { continue; } AccessPoint accessPoint = new AccessPoint(context, config); final List results = resultsMap.get(accessPoint.ssid); accessPoint.setShowSummary(false); if(results != null){ final int resultsSize = results.size(); for (int j = 0; j < resultsSize; ++j){ accessPoint.update(results.get(j)); accessPoint.setIcon(null); } } accessPoints.add(accessPoint); } } return accessPoints; } private void showDialog(AccessPoint accessPoint, boolean edit) { if (mDialog != null) { removeDialog(WifiSettings.WIFI_DIALOG_ID); mDialog = null; } // Save the access point and edit mode mDlgAccessPoint = accessPoint; showDialog(WifiSettings.WIFI_DIALOG_ID); } @Override public Dialog onCreateDialog(int dialogId) { switch (dialogId) { case WifiSettings.WIFI_DIALOG_ID: if (mDlgAccessPoint == null) { // For re-launch from saved state mDlgAccessPoint = new AccessPoint(getActivity(), mAccessPointSavedState); // Reset the saved access point data mAccessPointSavedState = null; } mSelectedAccessPoint = mDlgAccessPoint; mDialog = new WifiDialog(getActivity(), this, mDlgAccessPoint, false /* not editting */, true /* hide the submit button */); return mDialog; } return super.onCreateDialog(dialogId); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // If the dialog is showing, save its state. if (mDialog != null && mDialog.isShowing()) { if (mDlgAccessPoint != null) { mAccessPointSavedState = new Bundle(); mDlgAccessPoint.saveWifiState(mAccessPointSavedState); outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); } } } @Override public void onClick(DialogInterface dialogInterface, int button) { if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { mWifiManager.forget(mSelectedAccessPoint.networkId, null); getPreferenceScreen().removePreference(mSelectedAccessPoint); mSelectedAccessPoint = null; } } @Override public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { if (preference instanceof AccessPoint) { showDialog((AccessPoint) preference, false); return true; } else{ return super.onPreferenceTreeClick(screen, preference); } } /** * For search. */ public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override public List getRawDataToIndex(Context context, boolean enabled) { final List result = new ArrayList(); final Resources res = context.getResources(); final String title = res.getString(R.string.wifi_saved_access_points_titlebar); // Add fragment title SearchIndexableRaw data = new SearchIndexableRaw(context); data.title = title; data.screenTitle = title; data.enabled = enabled; result.add(data); // Add available Wi-Fi access points WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final List accessPoints = constructSavedAccessPoints(context, wifiManager); final int accessPointsSize = accessPoints.size(); for (int i = 0; i < accessPointsSize; ++i){ data = new SearchIndexableRaw(context); data.title = accessPoints.get(i).getTitle().toString(); data.screenTitle = title; data.enabled = enabled; result.add(data); } return result; } }; }