OSDN Git Service

Create configure Wi-Fi screen
authorJason Monk <jmonk@google.com>
Fri, 4 Dec 2015 14:36:36 +0000 (09:36 -0500)
committerJason Monk <jmonk@google.com>
Fri, 4 Dec 2015 17:57:39 +0000 (12:57 -0500)
Add a gear on Settings menu, and move a bunch of stuff from
overflow and advanced screen to there.  Also move add network
to be the last item in the list rather than in overflow.

Also fix WifiP2p breakage.

Change-Id: I5c84c25e5ba9224f77dcd988b0b2850ae6e71168

res/values/strings.xml
res/xml/wifi_advanced_settings.xml
res/xml/wifi_configure_settings.xml [new file with mode: 0644]
src/com/android/settings/InstrumentedFragment.java
src/com/android/settings/wifi/AdvancedWifiSettings.java
src/com/android/settings/wifi/ConfigureWifiSettings.java [new file with mode: 0644]
src/com/android/settings/wifi/WifiSettings.java
src/com/android/settings/wifi/p2p/WifiP2pPeer.java

index 8928307..d8a3d2b 100644 (file)
     <string name="wifi_menu_scan">Scan</string>
     <!-- Menu option to Wi-Fi advanced settings -->
     <string name="wifi_menu_advanced">Advanced</string>
+    <!-- Menu option to Wi-Fi configure settings -->
+    <string name="wifi_menu_configure">Configure</string>
     <!-- Menu option to connect to a Wi-Fi network -->
     <string name="wifi_menu_connect">Connect to network</string>
     <!-- Menu option to remember a temporary Wi-Fi network -->
     <string name="wifi_saved_access_points_titlebar">Saved networks</string>
     <!-- Wi-Fi settings screen, advanced, settings section.  This is a header shown above advanced wifi settings. [CHAR LIMIT=30] -->
     <string name="wifi_advanced_titlebar">Advanced Wi\u2011Fi</string>
+    <!-- Wi-Fi settings screen, configure, settings section.  This is a header shown above configure wifi settings. [CHAR LIMIT=30] -->
+    <string name="wifi_configure_titlebar">Configure Wi\u2011Fi</string>
     <!-- Wi-Fi settings screen, setting title for setting the band [CHAR LIMIT=50]-->
     <string name="wifi_setting_frequency_band_title">Wi\u2011Fi frequency band</string>
     <!-- Wi-Fi settings screen, setting summary for setting the wifi frequency band [CHAR LIMIT=50]-->
index ed6cfbd..8d9a6cd 100644 (file)
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         android:title="@string/wifi_advanced_titlebar">
 
-    <!-- android:dependency="enable_wifi" -->
-    <SwitchPreference
-            android:key="notify_open_networks"
-            android:title="@string/wifi_notify_open_networks"
-            android:summary="@string/wifi_notify_open_networks_summary"
-            android:persistent="false" />
-
-    <ListPreference
-            android:key="sleep_policy"
-            android:title="@string/wifi_setting_sleep_policy_title"
-            android:persistent="false"
-            android:entries="@array/wifi_sleep_policy_entries"
-            android:entryValues="@array/wifi_sleep_policy_values" />
-
-    <com.android.settings.AppListSwitchPreference
-            android:key="wifi_assistant"
-            android:title="@string/wifi_automatically_connect_title"
-            android:summary="@string/wifi_automatically_connect_summary"
-            android:dialogTitle="@string/wifi_select_assistant_dialog_title"
-            android:persistent="false" />
-
-    <ListPreference
-            android:key="frequency_band"
-            android:title="@string/wifi_setting_frequency_band_title"
-            android:summary="@string/wifi_setting_frequency_band_summary"
-            android:persistent="false"
-            android:entries="@array/wifi_frequency_band_entries"
-            android:entryValues="@array/wifi_frequency_band_values" />
-
     <Preference
             android:key="install_credentials"
             android:title="@string/wifi_install_credentials"
             android:title="@string/wifi_menu_wps_pin"
             android:persistent="false" />
 
-    <Preference
-            android:key="mac_address"
-            android:title="@string/wifi_advanced_mac_address_title"
-            android:layout="@layout/wifi_advance_layout" />
-
-    <Preference
-            android:key="current_ip_address"
-            android:title="@string/wifi_advanced_ip_address_title"
-            android:layout="@layout/wifi_advance_layout" />
-
-</PreferenceScreen>   
+</PreferenceScreen>
diff --git a/res/xml/wifi_configure_settings.xml b/res/xml/wifi_configure_settings.xml
new file mode 100644 (file)
index 0000000..15e524a
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+        android:title="@string/wifi_configure_titlebar">
+
+    <Preference
+        android:key="saved_networks"
+        android:title="@string/wifi_saved_access_points_label"
+        android:fragment="com.android.settings.wifi.SavedAccessPointsWifiSettings" />
+
+    <!-- android:dependency="enable_wifi" -->
+    <SwitchPreference
+        android:key="notify_open_networks"
+        android:title="@string/wifi_notify_open_networks"
+        android:summary="@string/wifi_notify_open_networks_summary"
+        android:persistent="false" />
+
+    <ListPreference
+        android:key="sleep_policy"
+        android:title="@string/wifi_setting_sleep_policy_title"
+        android:persistent="false"
+        android:entries="@array/wifi_sleep_policy_entries"
+        android:entryValues="@array/wifi_sleep_policy_values" />
+
+    <com.android.settings.AppListSwitchPreference
+        android:key="wifi_assistant"
+        android:title="@string/wifi_automatically_connect_title"
+        android:summary="@string/wifi_automatically_connect_summary"
+        android:dialogTitle="@string/wifi_select_assistant_dialog_title"
+        android:persistent="false" />
+
+    <ListPreference
+        android:key="frequency_band"
+        android:title="@string/wifi_setting_frequency_band_title"
+        android:summary="@string/wifi_setting_frequency_band_summary"
+        android:persistent="false"
+        android:entries="@array/wifi_frequency_band_entries"
+        android:entryValues="@array/wifi_frequency_band_values" />
+
+    <Preference
+        android:key="mac_address"
+        android:title="@string/wifi_advanced_mac_address_title"
+        android:layout="@layout/wifi_advance_layout" />
+
+    <Preference
+        android:key="current_ip_address"
+        android:title="@string/wifi_advanced_ip_address_title"
+        android:layout="@layout/wifi_advance_layout" />
+
+</PreferenceScreen>
index 80e1131..44fd110 100644 (file)
@@ -31,6 +31,7 @@ public abstract class InstrumentedFragment extends PreferenceFragment {
     public static final int ACCESSIBILITY_TOGGLE_AUTOCLICK = UNDECLARED + 1;
     public static final int SOUND = UNDECLARED + 2;
     public static final int CONFIGURE_NOTIFICATION = UNDECLARED + 3;
+    public static final int CONFIGURE_WIFI = UNDECLARED + 4;
 
     /**
      * Declare the view of this category.
index aaab0c5..8dfb024 100644 (file)
@@ -18,68 +18,25 @@ package com.android.settings.wifi;
 
 import android.app.Dialog;
 import android.app.DialogFragment;
-import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.NetworkScoreManager;
-import android.net.NetworkScorerAppManager;
-import android.net.NetworkScorerAppManager.NetworkScorerAppData;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
 import android.net.wifi.WpsInfo;
 import android.os.Bundle;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.provider.Settings.Global;
 import android.security.Credentials;
-import android.support.v14.preference.SwitchPreference;
-import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceClickListener;
-import android.text.TextUtils;
-import android.util.Log;
-import android.widget.Toast;
-
 import com.android.internal.logging.MetricsLogger;
-import com.android.settings.AppListSwitchPreference;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
-
-import java.util.Collection;
-
-public class AdvancedWifiSettings extends SettingsPreferenceFragment
-        implements Preference.OnPreferenceChangeListener {
 
+public class AdvancedWifiSettings extends SettingsPreferenceFragment {
     private static final String TAG = "AdvancedWifiSettings";
-    private static final String KEY_MAC_ADDRESS = "mac_address";
-    private static final String KEY_CURRENT_IP_ADDRESS = "current_ip_address";
-    private static final String KEY_FREQUENCY_BAND = "frequency_band";
-    private static final String KEY_NOTIFY_OPEN_NETWORKS = "notify_open_networks";
-    private static final String KEY_SLEEP_POLICY = "sleep_policy";
+
     private static final String KEY_INSTALL_CREDENTIALS = "install_credentials";
-    private static final String KEY_WIFI_ASSISTANT = "wifi_assistant";
     private static final String KEY_WIFI_DIRECT = "wifi_direct";
     private static final String KEY_WPS_PUSH = "wps_push_button";
     private static final String KEY_WPS_PIN = "wps_pin_entry";
 
-    private WifiManager mWifiManager;
-    private NetworkScoreManager mNetworkScoreManager;
-    private AppListSwitchPreference mWifiAssistantPreference;
-
-    private IntentFilter mFilter;
-    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION) ||
-                action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
-                refreshWifiInfo();
-            }
-        }
-    };
-
     @Override
     protected int getMetricsCategory() {
         return MetricsLogger.WIFI_ADVANCED;
@@ -92,37 +49,13 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
-        mFilter = new IntentFilter();
-        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
-        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
-        mNetworkScoreManager =
-                (NetworkScoreManager) getSystemService(Context.NETWORK_SCORE_SERVICE);
-    }
-
-    @Override
     public void onResume() {
         super.onResume();
         initPreferences();
-        getActivity().registerReceiver(mReceiver, mFilter);
-        refreshWifiInfo();
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        getActivity().unregisterReceiver(mReceiver);
     }
 
     private void initPreferences() {
-        SwitchPreference notifyOpenNetworks =
-            (SwitchPreference) findPreference(KEY_NOTIFY_OPEN_NETWORKS);
-        notifyOpenNetworks.setChecked(Settings.Global.getInt(getContentResolver(),
-                Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1);
-        notifyOpenNetworks.setEnabled(mWifiManager.isWifiEnabled());
-
+        final Context context = getActivity();
         Intent intent = new Intent(Credentials.INSTALL_AS_USER_ACTION);
         intent.setClassName("com.android.certinstaller",
                 "com.android.certinstaller.CertInstallerMain");
@@ -130,16 +63,6 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
         Preference pref = findPreference(KEY_INSTALL_CREDENTIALS);
         pref.setIntent(intent);
 
-        final Context context = getActivity();
-        mWifiAssistantPreference = (AppListSwitchPreference) findPreference(KEY_WIFI_ASSISTANT);
-        Collection<NetworkScorerAppData> scorers =
-                NetworkScorerAppManager.getAllValidScorers(context);
-        if (UserManager.get(context).isAdminUser() && !scorers.isEmpty()) {
-            mWifiAssistantPreference.setOnPreferenceChangeListener(this);
-            initWifiAssistantPreference(scorers);
-        } else if (mWifiAssistantPreference != null) {
-            getPreferenceScreen().removePreference(mWifiAssistantPreference);
-        }
 
         Intent wifiDirectIntent = new Intent(context,
                 com.android.settings.Settings.WifiP2pSettingsActivity.class);
@@ -165,165 +88,6 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
                     return true;
                 }
         });
-
-        ListPreference frequencyPref = (ListPreference) findPreference(KEY_FREQUENCY_BAND);
-
-        if (mWifiManager.isDualBandSupported()) {
-            frequencyPref.setOnPreferenceChangeListener(this);
-            int value = mWifiManager.getFrequencyBand();
-            if (value != -1) {
-                frequencyPref.setValue(String.valueOf(value));
-                updateFrequencyBandSummary(frequencyPref, value);
-            } else {
-                Log.e(TAG, "Failed to fetch frequency band");
-            }
-        } else {
-            if (frequencyPref != null) {
-                // null if it has already been removed before resume
-                getPreferenceScreen().removePreference(frequencyPref);
-            }
-        }
-
-        ListPreference sleepPolicyPref = (ListPreference) findPreference(KEY_SLEEP_POLICY);
-        if (sleepPolicyPref != null) {
-            if (Utils.isWifiOnly(context)) {
-                sleepPolicyPref.setEntries(R.array.wifi_sleep_policy_entries_wifi_only);
-            }
-            sleepPolicyPref.setOnPreferenceChangeListener(this);
-            int value = Settings.Global.getInt(getContentResolver(),
-                    Settings.Global.WIFI_SLEEP_POLICY,
-                    Settings.Global.WIFI_SLEEP_POLICY_NEVER);
-            String stringValue = String.valueOf(value);
-            sleepPolicyPref.setValue(stringValue);
-            updateSleepPolicySummary(sleepPolicyPref, stringValue);
-        }
-    }
-
-    private void initWifiAssistantPreference(Collection<NetworkScorerAppData> scorers) {
-        int count = scorers.size();
-        String[] packageNames = new String[count];
-        int i = 0;
-        for (NetworkScorerAppData scorer : scorers) {
-            packageNames[i] = scorer.mPackageName;
-            i++;
-        }
-        mWifiAssistantPreference.setPackageNames(packageNames,
-                mNetworkScoreManager.getActiveScorerPackage());
-    }
-
-    private void updateSleepPolicySummary(Preference sleepPolicyPref, String value) {
-        if (value != null) {
-            String[] values = getResources().getStringArray(R.array.wifi_sleep_policy_values);
-            final int summaryArrayResId = Utils.isWifiOnly(getActivity()) ?
-                    R.array.wifi_sleep_policy_entries_wifi_only : R.array.wifi_sleep_policy_entries;
-            String[] summaries = getResources().getStringArray(summaryArrayResId);
-            for (int i = 0; i < values.length; i++) {
-                if (value.equals(values[i])) {
-                    if (i < summaries.length) {
-                        sleepPolicyPref.setSummary(summaries[i]);
-                        return;
-                    }
-                }
-            }
-        }
-
-        sleepPolicyPref.setSummary("");
-        Log.e(TAG, "Invalid sleep policy value: " + value);
-    }
-
-    private void updateFrequencyBandSummary(Preference frequencyBandPref, int index) {
-        String[] summaries = getResources().getStringArray(R.array.wifi_frequency_band_entries);
-        frequencyBandPref.setSummary(summaries[index]);
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        String key = preference.getKey();
-
-        if (KEY_NOTIFY_OPEN_NETWORKS.equals(key)) {
-            Global.putInt(getContentResolver(),
-                    Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
-                    ((SwitchPreference) preference).isChecked() ? 1 : 0);
-        } else {
-            return super.onPreferenceTreeClick(preference);
-        }
-        return true;
-    }
-
-    @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        final Context context = getActivity();
-        String key = preference.getKey();
-
-        if (KEY_FREQUENCY_BAND.equals(key)) {
-            try {
-                int value = Integer.parseInt((String) newValue);
-                mWifiManager.setFrequencyBand(value, true);
-                updateFrequencyBandSummary(preference, value);
-            } catch (NumberFormatException e) {
-                Toast.makeText(context, R.string.wifi_setting_frequency_band_error,
-                        Toast.LENGTH_SHORT).show();
-                return false;
-            }
-        } else if (KEY_WIFI_ASSISTANT.equals(key)) {
-            NetworkScorerAppData wifiAssistant =
-                    NetworkScorerAppManager.getScorer(context, (String) newValue);
-            if (wifiAssistant == null) {
-                mNetworkScoreManager.setActiveScorer(null);
-                return true;
-            }
-
-            Intent intent = new Intent();
-            if (wifiAssistant.mConfigurationActivityClassName != null) {
-                // App has a custom configuration activity; launch that.
-                // This custom activity will be responsible for launching the system
-                // dialog.
-                intent.setClassName(wifiAssistant.mPackageName,
-                        wifiAssistant.mConfigurationActivityClassName);
-            } else {
-                // Fall back on the system dialog.
-                intent.setAction(NetworkScoreManager.ACTION_CHANGE_ACTIVE);
-                intent.putExtra(NetworkScoreManager.EXTRA_PACKAGE_NAME,
-                        wifiAssistant.mPackageName);
-            }
-
-            startActivity(intent);
-            // Don't update the preference widget state until the child activity returns.
-            // It will be updated in onResume after the activity finishes.
-            return false;
-        }
-
-        if (KEY_SLEEP_POLICY.equals(key)) {
-            try {
-                String stringValue = (String) newValue;
-                Settings.Global.putInt(getContentResolver(), Settings.Global.WIFI_SLEEP_POLICY,
-                        Integer.parseInt(stringValue));
-                updateSleepPolicySummary(preference, stringValue);
-            } catch (NumberFormatException e) {
-                Toast.makeText(context, R.string.wifi_setting_sleep_policy_error,
-                        Toast.LENGTH_SHORT).show();
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    private void refreshWifiInfo() {
-        final Context context = getActivity();
-        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
-
-        Preference wifiMacAddressPref = findPreference(KEY_MAC_ADDRESS);
-        String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
-        wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress
-                : context.getString(R.string.status_unavailable));
-        wifiMacAddressPref.setSelectable(false);
-
-        Preference wifiIpAddressPref = findPreference(KEY_CURRENT_IP_ADDRESS);
-        String ipAddress = Utils.getWifiIpAddresses(context);
-        wifiIpAddressPref.setSummary(ipAddress == null ?
-                context.getString(R.string.status_unavailable) : ipAddress);
-        wifiIpAddressPref.setSelectable(false);
     }
 
     /* Wrapper class for the WPS dialog to properly handle life cycle events like rotation. */
diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java
new file mode 100644 (file)
index 0000000..54ce036
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2015 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.NetworkScoreManager;
+import android.net.NetworkScorerAppManager;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.Toast;
+import com.android.settings.AppListSwitchPreference;
+import com.android.settings.InstrumentedFragment;
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
+
+import java.util.Collection;
+import java.util.List;
+
+public class ConfigureWifiSettings extends SettingsPreferenceFragment
+        implements Preference.OnPreferenceChangeListener {
+    private static final String TAG = "ConfigureWifiSettings";
+
+    private static final String KEY_MAC_ADDRESS = "mac_address";
+    private static final String KEY_SAVED_NETWORKS = "saved_networks";
+    private static final String KEY_CURRENT_IP_ADDRESS = "current_ip_address";
+    private static final String KEY_FREQUENCY_BAND = "frequency_band";
+    private static final String KEY_NOTIFY_OPEN_NETWORKS = "notify_open_networks";
+    private static final String KEY_SLEEP_POLICY = "sleep_policy";
+    private static final String KEY_WIFI_ASSISTANT = "wifi_assistant";
+
+    private WifiManager mWifiManager;
+    private NetworkScoreManager mNetworkScoreManager;
+    private AppListSwitchPreference mWifiAssistantPreference;
+
+    private IntentFilter mFilter;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        addPreferencesFromResource(R.xml.wifi_configure_settings);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
+        mFilter = new IntentFilter();
+        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
+        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+        mNetworkScoreManager =
+                (NetworkScoreManager) getSystemService(Context.NETWORK_SCORE_SERVICE);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        initPreferences();
+        getActivity().registerReceiver(mReceiver, mFilter);
+        refreshWifiInfo();
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        getActivity().unregisterReceiver(mReceiver);
+    }
+
+    private void initPreferences() {
+        List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+        if (configs == null || configs.size() == 0) {
+            removePreference(KEY_SAVED_NETWORKS);
+        }
+
+        SwitchPreference notifyOpenNetworks =
+                (SwitchPreference) findPreference(KEY_NOTIFY_OPEN_NETWORKS);
+        notifyOpenNetworks.setChecked(Settings.Global.getInt(getContentResolver(),
+                Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1);
+        notifyOpenNetworks.setEnabled(mWifiManager.isWifiEnabled());
+
+        final Context context = getActivity();
+        mWifiAssistantPreference = (AppListSwitchPreference) findPreference(KEY_WIFI_ASSISTANT);
+        Collection<NetworkScorerAppManager.NetworkScorerAppData> scorers =
+                NetworkScorerAppManager.getAllValidScorers(context);
+        if (UserManager.get(context).isAdminUser() && !scorers.isEmpty()) {
+            mWifiAssistantPreference.setOnPreferenceChangeListener(this);
+            initWifiAssistantPreference(scorers);
+        } else if (mWifiAssistantPreference != null) {
+            getPreferenceScreen().removePreference(mWifiAssistantPreference);
+        }
+
+        ListPreference frequencyPref = (ListPreference) findPreference(KEY_FREQUENCY_BAND);
+
+        if (mWifiManager.isDualBandSupported()) {
+            frequencyPref.setOnPreferenceChangeListener(this);
+            int value = mWifiManager.getFrequencyBand();
+            if (value != -1) {
+                frequencyPref.setValue(String.valueOf(value));
+                updateFrequencyBandSummary(frequencyPref, value);
+            } else {
+                Log.e(TAG, "Failed to fetch frequency band");
+            }
+        } else {
+            if (frequencyPref != null) {
+                // null if it has already been removed before resume
+                getPreferenceScreen().removePreference(frequencyPref);
+            }
+        }
+
+        ListPreference sleepPolicyPref = (ListPreference) findPreference(KEY_SLEEP_POLICY);
+        if (sleepPolicyPref != null) {
+            if (Utils.isWifiOnly(context)) {
+                sleepPolicyPref.setEntries(R.array.wifi_sleep_policy_entries_wifi_only);
+            }
+            sleepPolicyPref.setOnPreferenceChangeListener(this);
+            int value = Settings.Global.getInt(getContentResolver(),
+                    Settings.Global.WIFI_SLEEP_POLICY,
+                    Settings.Global.WIFI_SLEEP_POLICY_NEVER);
+            String stringValue = String.valueOf(value);
+            sleepPolicyPref.setValue(stringValue);
+            updateSleepPolicySummary(sleepPolicyPref, stringValue);
+        }
+    }
+
+    private void updateSleepPolicySummary(Preference sleepPolicyPref, String value) {
+        if (value != null) {
+            String[] values = getResources().getStringArray(R.array.wifi_sleep_policy_values);
+            final int summaryArrayResId = Utils.isWifiOnly(getActivity()) ?
+                    R.array.wifi_sleep_policy_entries_wifi_only : R.array.wifi_sleep_policy_entries;
+            String[] summaries = getResources().getStringArray(summaryArrayResId);
+            for (int i = 0; i < values.length; i++) {
+                if (value.equals(values[i])) {
+                    if (i < summaries.length) {
+                        sleepPolicyPref.setSummary(summaries[i]);
+                        return;
+                    }
+                }
+            }
+        }
+
+        sleepPolicyPref.setSummary("");
+        Log.e(TAG, "Invalid sleep policy value: " + value);
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        String key = preference.getKey();
+
+        if (KEY_NOTIFY_OPEN_NETWORKS.equals(key)) {
+            Settings.Global.putInt(getContentResolver(),
+                    Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
+                    ((SwitchPreference) preference).isChecked() ? 1 : 0);
+        } else {
+            return super.onPreferenceTreeClick(preference);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        final Context context = getActivity();
+        String key = preference.getKey();
+
+        if (KEY_FREQUENCY_BAND.equals(key)) {
+            try {
+                int value = Integer.parseInt((String) newValue);
+                mWifiManager.setFrequencyBand(value, true);
+                updateFrequencyBandSummary(preference, value);
+            } catch (NumberFormatException e) {
+                Toast.makeText(context, R.string.wifi_setting_frequency_band_error,
+                        Toast.LENGTH_SHORT).show();
+                return false;
+            }
+        } else if (KEY_WIFI_ASSISTANT.equals(key)) {
+            NetworkScorerAppManager.NetworkScorerAppData wifiAssistant =
+                    NetworkScorerAppManager.getScorer(context, (String) newValue);
+            if (wifiAssistant == null) {
+                mNetworkScoreManager.setActiveScorer(null);
+                return true;
+            }
+
+            Intent intent = new Intent();
+            if (wifiAssistant.mConfigurationActivityClassName != null) {
+                // App has a custom configuration activity; launch that.
+                // This custom activity will be responsible for launching the system
+                // dialog.
+                intent.setClassName(wifiAssistant.mPackageName,
+                        wifiAssistant.mConfigurationActivityClassName);
+            } else {
+                // Fall back on the system dialog.
+                intent.setAction(NetworkScoreManager.ACTION_CHANGE_ACTIVE);
+                intent.putExtra(NetworkScoreManager.EXTRA_PACKAGE_NAME,
+                        wifiAssistant.mPackageName);
+            }
+
+            startActivity(intent);
+            // Don't update the preference widget state until the child activity returns.
+            // It will be updated in onResume after the activity finishes.
+            return false;
+        }
+
+        if (KEY_SLEEP_POLICY.equals(key)) {
+            try {
+                String stringValue = (String) newValue;
+                Settings.Global.putInt(getContentResolver(), Settings.Global.WIFI_SLEEP_POLICY,
+                        Integer.parseInt(stringValue));
+                updateSleepPolicySummary(preference, stringValue);
+            } catch (NumberFormatException e) {
+                Toast.makeText(context, R.string.wifi_setting_sleep_policy_error,
+                        Toast.LENGTH_SHORT).show();
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private void refreshWifiInfo() {
+        final Context context = getActivity();
+        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+
+        Preference wifiMacAddressPref = findPreference(KEY_MAC_ADDRESS);
+        String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
+        wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress
+                : context.getString(R.string.status_unavailable));
+        wifiMacAddressPref.setSelectable(false);
+
+        Preference wifiIpAddressPref = findPreference(KEY_CURRENT_IP_ADDRESS);
+        String ipAddress = Utils.getWifiIpAddresses(context);
+        wifiIpAddressPref.setSummary(ipAddress == null ?
+                context.getString(R.string.status_unavailable) : ipAddress);
+        wifiIpAddressPref.setSelectable(false);
+    }
+
+    private void updateFrequencyBandSummary(Preference frequencyBandPref, int index) {
+        String[] summaries = getResources().getStringArray(R.array.wifi_frequency_band_entries);
+        frequencyBandPref.setSummary(summaries[index]);
+    }
+
+    private void initWifiAssistantPreference(
+            Collection<NetworkScorerAppManager.NetworkScorerAppData> scorers) {
+        int count = scorers.size();
+        String[] packageNames = new String[count];
+        int i = 0;
+        for (NetworkScorerAppManager.NetworkScorerAppData scorer : scorers) {
+            packageNames[i] = scorer.mPackageName;
+            i++;
+        }
+        mWifiAssistantPreference.setPackageNames(packageNames,
+                mNetworkScoreManager.getActiveScorerPackage());
+    }
+
+    @Override
+    protected int getMetricsCategory() {
+        return InstrumentedFragment.CONFIGURE_WIFI;
+    }
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION) ||
+                action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+                refreshWifiInfo();
+            }
+        }
+    };
+}
index 74d3e51..87f72f5 100644 (file)
@@ -32,7 +32,7 @@ import android.content.pm.IPackageManager;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
-import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.State;
@@ -47,9 +47,11 @@ import android.os.RemoteException;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceViewHolder;
 import android.text.Spannable;
 import android.text.style.TextAppearanceSpan;
 import android.util.Log;
+import android.util.TypedValue;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.Gravity;
@@ -99,14 +101,13 @@ public class WifiSettings extends RestrictedSettingsFragment
 
     /* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST;
     private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
-    private static final int MENU_ID_SAVED_NETWORK = Menu.FIRST + 2;
-    /* package */ static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 3;
     private static final int MENU_ID_ADVANCED = Menu.FIRST + 4;
     private static final int MENU_ID_SCAN = Menu.FIRST + 5;
     private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
     private static final int MENU_ID_FORGET = Menu.FIRST + 7;
     private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
     private static final int MENU_ID_WRITE_NFC = Menu.FIRST + 9;
+    private static final int MENU_ID_CONFIGURE = Menu.FIRST + 10;
 
     public static final int WIFI_DIALOG_ID = 1;
     /* package */ static final int WPS_PBC_DIALOG_ID = 2;
@@ -118,8 +119,6 @@ public class WifiSettings extends RestrictedSettingsFragment
     private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
     private static final String SAVED_WIFI_NFC_DIALOG_STATE = "wifi_nfc_dlg_state";
 
-    private static boolean savedNetworksExist;
-
     protected WifiManager mWifiManager;
     private WifiManager.ActionListener mConnectListener;
     private WifiManager.ActionListener mSaveListener;
@@ -157,6 +156,7 @@ public class WifiSettings extends RestrictedSettingsFragment
     private HandlerThread mBgThread;
 
     private UserBadgeCache mUserBadgeCache;
+    private Preference mAddPreference;
 
     /* End of "used in Wifi Setup context" */
 
@@ -177,6 +177,14 @@ public class WifiSettings extends RestrictedSettingsFragment
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         addPreferencesFromResource(R.xml.wifi_settings);
+        mAddPreference = new Preference(getContext());
+        Drawable ic_add = getContext().getDrawable(R.drawable.ic_menu_add).mutate();
+        TypedValue tv = new TypedValue();
+        getContext().getTheme().resolveAttribute(android.R.attr.colorAccent, tv, true);
+        ic_add.setTint(getContext().getColor(tv.resourceId));
+        mAddPreference.setIcon(ic_add);
+        mAddPreference.setTitle(R.string.wifi_add_network);
+
         mUserBadgeCache = new UserBadgeCache(getPackageManager());
 
         mBgThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND);
@@ -343,24 +351,14 @@ public class WifiSettings extends RestrictedSettingsFragment
      */
     void addOptionsMenuItems(Menu menu) {
         final boolean wifiIsEnabled = mWifiTracker.isWifiEnabled();
-        TypedArray ta = getActivity().getTheme().obtainStyledAttributes(
-                new int[] {R.attr.ic_menu_add, R.attr.ic_wps});
-        menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network)
-                .setIcon(ta.getDrawable(0))
-                .setEnabled(wifiIsEnabled)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
-        if (savedNetworksExist) {
-            menu.add(Menu.NONE, MENU_ID_SAVED_NETWORK, 0, R.string.wifi_saved_access_points_label)
-                    .setIcon(ta.getDrawable(0))
-                    .setEnabled(wifiIsEnabled)
-                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
-        }
         menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.menu_stats_refresh)
                .setEnabled(wifiIsEnabled)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
         menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
-        ta.recycle();
+        menu.add(Menu.NONE, MENU_ID_CONFIGURE, 0, R.string.wifi_menu_configure)
+                .setIcon(R.drawable.ic_settings_24dp)
+                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
     }
 
     @Override
@@ -419,22 +417,6 @@ public class WifiSettings extends RestrictedSettingsFragment
                 MetricsLogger.action(getActivity(), MetricsLogger.ACTION_WIFI_FORCE_SCAN);
                 mWifiTracker.forceScan();
                 return true;
-            case MENU_ID_ADD_NETWORK:
-                if (mWifiTracker.isWifiEnabled()) {
-                    onAddNetworkPressed();
-                }
-                return true;
-            case MENU_ID_SAVED_NETWORK:
-                if (getActivity() instanceof SettingsActivity) {
-                    ((SettingsActivity) getActivity()).startPreferencePanel(
-                            SavedAccessPointsWifiSettings.class.getCanonicalName(), null,
-                            R.string.wifi_saved_access_points_titlebar, null, this, 0);
-                } else {
-                    startFragment(this, SavedAccessPointsWifiSettings.class.getCanonicalName(),
-                            R.string.wifi_saved_access_points_titlebar,
-                            -1 /* Do not request a result */, null);
-                }
-                return true;
             case MENU_ID_ADVANCED:
                 if (getActivity() instanceof SettingsActivity) {
                     ((SettingsActivity) getActivity()).startPreferencePanel(
@@ -446,6 +428,18 @@ public class WifiSettings extends RestrictedSettingsFragment
                             null);
                 }
                 return true;
+            case MENU_ID_CONFIGURE:
+                if (getActivity() instanceof SettingsActivity) {
+                    ((SettingsActivity) getActivity()).startPreferencePanel(
+                            ConfigureWifiSettings.class.getCanonicalName(), null,
+                            R.string.wifi_configure_titlebar, null, this, 0);
+                } else {
+                    startFragment(this, ConfigureWifiSettings.class.getCanonicalName(),
+                            R.string.wifi_configure_titlebar, -1 /* Do not request a results */,
+                            null);
+                }
+                return true;
+
         }
         return super.onOptionsItemSelected(item);
     }
@@ -530,16 +524,14 @@ public class WifiSettings extends RestrictedSettingsFragment
             if (mSelectedAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE &&
                     !mSelectedAccessPoint.isSaved() && !mSelectedAccessPoint.isActive()) {
                 mSelectedAccessPoint.generateOpenNetworkConfig();
-                if (!savedNetworksExist) {
-                    savedNetworksExist = true;
-                    getActivity().invalidateOptionsMenu();
-                }
                 connect(mSelectedAccessPoint.getConfig());
-            } else if (mSelectedAccessPoint.isSaved()){
+            } else if (mSelectedAccessPoint.isSaved()) {
                 showDialog(mSelectedAccessPoint, WifiConfigUiBase.MODE_VIEW);
             } else {
                 showDialog(mSelectedAccessPoint, WifiConfigUiBase.MODE_CONNECT);
             }
+        } else if (preference == mAddPreference) {
+            onAddNetworkPressed();
         } else {
             return super.onPreferenceTreeClick(preference);
         }
@@ -678,8 +670,23 @@ public class WifiSettings extends RestrictedSettingsFragment
                 }
                 if (!hasAvailableAccessPoints) {
                     setProgressBarVisible(true);
-                    addMessagePreference(R.string.wifi_empty_list_wifi_on);
+                    Preference pref = new Preference(getContext()) {
+                        @Override
+                        public void onBindViewHolder(PreferenceViewHolder holder) {
+                            super.onBindViewHolder(holder);
+                            // Show a line on each side of add network.
+                            holder.setDividerAllowedBelow(true);
+                        }
+                    };
+                    pref.setSelectable(false);
+                    pref.setSummary(R.string.wifi_empty_list_wifi_on);
+                    pref.setOrder(0);
+                    getPreferenceScreen().addPreference(pref);
+                    mAddPreference.setOrder(1);
+                    getPreferenceScreen().addPreference(mAddPreference);
                 } else {
+                    mAddPreference.setOrder(index++);
+                    getPreferenceScreen().addPreference(mAddPreference);
                     setProgressBarVisible(false);
                 }
                 break;
@@ -699,11 +706,6 @@ public class WifiSettings extends RestrictedSettingsFragment
                 setProgressBarVisible(false);
                 break;
         }
-        // Update "Saved Networks" menu option.
-        if (savedNetworksExist != mWifiTracker.doSavedNetworksExist()) {
-            savedNetworksExist = !savedNetworksExist;
-            getActivity().invalidateOptionsMenu();
-        }
     }
 
     protected TextView initEmptyView() {
@@ -768,11 +770,6 @@ public class WifiSettings extends RestrictedSettingsFragment
 
     @Override
     public void onWifiStateChanged(int state) {
-        Activity activity = getActivity();
-        if (activity != null) {
-            activity.invalidateOptionsMenu();
-        }
-
         switch (state) {
             case WifiManager.WIFI_STATE_ENABLING:
                 addMessagePreference(R.string.wifi_starting);
index d4b50e6..a318e6f 100644 (file)
@@ -23,7 +23,6 @@ import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceViewHolder;
 import android.text.TextUtils;
 import android.widget.ImageView;
-
 import com.android.settings.R;
 
 public class WifiP2pPeer extends Preference {
@@ -41,15 +40,18 @@ public class WifiP2pPeer extends Preference {
         device = dev;
         setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
         mRssi = 60; //TODO: fix
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder view) {
         if (TextUtils.isEmpty(device.deviceName)) {
             setTitle(device.deviceAddress);
         } else {
             setTitle(device.deviceName);
         }
+        String[] statusArray = context.getResources().getStringArray(R.array.wifi_p2p_status);
+        setSummary(statusArray[device.status]);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
         mSignal = (ImageView) view.findViewById(R.id.signal);
         if (mRssi == Integer.MAX_VALUE) {
             mSignal.setImageDrawable(null);
@@ -57,8 +59,7 @@ public class WifiP2pPeer extends Preference {
             mSignal.setImageResource(R.drawable.wifi_signal_dark);
             mSignal.setImageState(STATE_SECURED,  true);
         }
-        refresh();
-        super.onBindViewHolder(view);
+        mSignal.setImageLevel(getLevel());
     }
 
     @Override
@@ -87,14 +88,4 @@ public class WifiP2pPeer extends Preference {
         }
         return WifiManager.calculateSignalLevel(mRssi, SIGNAL_LEVELS);
     }
-
-    private void refresh() {
-        if (mSignal == null) {
-            return;
-        }
-        Context context = getContext();
-        mSignal.setImageLevel(getLevel());
-        String[] statusArray = context.getResources().getStringArray(R.array.wifi_p2p_status);
-        setSummary(statusArray[device.status]);
-    }
 }