Final UX for Wi-Fi assistant platform settings.
When one app is available, the toggle works as before. When multiple apps are available, we allow the user to choose the app in a dialog before turning on the setting. Bug: 13780935 Change-Id: I1c4391bf97a53febe580fb2b896b4850372062e7
This commit is contained in:
@@ -1451,10 +1451,12 @@
|
|||||||
<string name="wifi_scan_always_available_title">Always allow scanning</string>
|
<string name="wifi_scan_always_available_title">Always allow scanning</string>
|
||||||
<!-- Checkbox summary for option to toggle scan always available setting -->
|
<!-- Checkbox summary for option to toggle scan always available setting -->
|
||||||
<string name="wifi_scan_always_available_summary">Let Google\'s location service and other apps scan for networks, even when Wi\u2011Fi is off</string>
|
<string name="wifi_scan_always_available_summary">Let Google\'s location service and other apps scan for networks, even when Wi\u2011Fi is off</string>
|
||||||
<!-- Checkbox title for option to Automatically manage Wi\u2011Fi [CHAR LIMIT=40] -->
|
<!-- Checkbox title for option to connect to open Wi-Fi automatically [CHAR LIMIT=40] -->
|
||||||
<string name="wifi_automatically_manage_title">Automatically manage Wi\u2011Fi</string>
|
<string name="wifi_automatically_connect_title">Connect to open Wi\u2011Fi automatically</string>
|
||||||
<!-- Checkbox summary for option to Automatically manage Wi\u2011Fi [CHAR LIMIT=100] -->
|
<!-- Checkbox summary for option to connect to open Wi-Fi automatically [CHAR LIMIT=100] -->
|
||||||
<string name="wifi_automatically_manage_summary">Let <xliff:g id="wifi_assistant">%1$s</xliff:g> manage your Wi\u2011Fi connection</string>
|
<string name="wifi_automatically_connect_summary">Allow a Wi\u2011Fi assistant to automatically rate and connect to open Wi\u2011Fi networks determined to be high quality</string>
|
||||||
|
<!-- Dialog title for option to select an app which connects to open Wi-Fi automatically [CHAR LIMIT=40] -->
|
||||||
|
<string name="wifi_select_assistant_dialog_title">Select a Wi\u2011Fi assistant</string>
|
||||||
<!-- Preference title for option to install certificates -->
|
<!-- Preference title for option to install certificates -->
|
||||||
<string name="wifi_install_credentials">Install certificates</string>
|
<string name="wifi_install_credentials">Install certificates</string>
|
||||||
<string name="wifi_scan_notify_text_location_on">To improve location accuracy and for other purposes, Google and other apps may scan for nearby networks, even when Wi-Fi is off. If you don\'t want this to happen, go to Advanced > Scanning always available.</string>
|
<string name="wifi_scan_notify_text_location_on">To improve location accuracy and for other purposes, Google and other apps may scan for nearby networks, even when Wi-Fi is off. If you don\'t want this to happen, go to Advanced > Scanning always available.</string>
|
||||||
|
@@ -312,6 +312,10 @@
|
|||||||
<item name="android:layout">@layout/apn_preference_layout</item>
|
<item name="android:layout">@layout/apn_preference_layout</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="AppListSwitchPreference" parent="@*android:style/Preference.Material.DialogPreference">
|
||||||
|
<item name="android:widgetLayout">@*android:layout/preference_widget_switch</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="TextAppearance.Medium" parent="@android:style/TextAppearance.Material.Medium">
|
<style name="TextAppearance.Medium" parent="@android:style/TextAppearance.Material.Medium">
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@@ -341,5 +345,4 @@
|
|||||||
<style name="Widget.TimePicker" parent="@*android:style/Widget.Material.Light.TimePicker">
|
<style name="Widget.TimePicker" parent="@*android:style/Widget.Material.Light.TimePicker">
|
||||||
<item name="@android:numbersBackgroundColor">@android:color/white</item>
|
<item name="@android:numbersBackgroundColor">@android:color/white</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -30,11 +30,6 @@
|
|||||||
android:summary="@string/wifi_scan_always_available_summary"
|
android:summary="@string/wifi_scan_always_available_summary"
|
||||||
android:persistent="false" />
|
android:persistent="false" />
|
||||||
|
|
||||||
<SwitchPreference
|
|
||||||
android:key="wifi_assistant"
|
|
||||||
android:title="@string/wifi_automatically_manage_title"
|
|
||||||
android:persistent="false" />
|
|
||||||
|
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:key="sleep_policy"
|
android:key="sleep_policy"
|
||||||
android:title="@string/wifi_setting_sleep_policy_title"
|
android:title="@string/wifi_setting_sleep_policy_title"
|
||||||
@@ -42,6 +37,13 @@
|
|||||||
android:entries="@array/wifi_sleep_policy_entries"
|
android:entries="@array/wifi_sleep_policy_entries"
|
||||||
android:entryValues="@array/wifi_sleep_policy_values" />
|
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
|
<ListPreference
|
||||||
android:key="frequency_band"
|
android:key="frequency_band"
|
||||||
android:title="@string/wifi_setting_frequency_band_title"
|
android:title="@string/wifi_setting_frequency_band_title"
|
||||||
|
@@ -67,6 +67,11 @@ public class AppListPreference extends ListPreference {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AppListPreference(Context context, AttributeSet attrs,
|
||||||
|
int defStyleAttr, int defStyleRes) {
|
||||||
|
super(context, attrs, defStyleAttr, defStyleRes);
|
||||||
|
}
|
||||||
|
|
||||||
public AppListPreference(Context context, AttributeSet attrs) {
|
public AppListPreference(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
}
|
}
|
||||||
@@ -105,6 +110,8 @@ public class AppListPreference extends ListPreference {
|
|||||||
setEntryValues(packageNames);
|
setEntryValues(packageNames);
|
||||||
if (selectedIndex != -1) {
|
if (selectedIndex != -1) {
|
||||||
setValueIndex(selectedIndex);
|
setValueIndex(selectedIndex);
|
||||||
|
} else {
|
||||||
|
setValue(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
59
src/com/android/settings/AppListSwitchPreference.java
Normal file
59
src/com/android/settings/AppListSwitchPreference.java
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package com.android.settings;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Checkable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A hybrid of AppListPreference and SwitchPreference, representing a preference which can be on or
|
||||||
|
* off but must have a selected value when turned on.
|
||||||
|
*
|
||||||
|
* It is invalid to show this preference when zero valid apps are present.
|
||||||
|
*/
|
||||||
|
public class AppListSwitchPreference extends AppListPreference {
|
||||||
|
private static final String TAG = "AppListSwitchPref";
|
||||||
|
|
||||||
|
private Checkable mSwitch;
|
||||||
|
|
||||||
|
public AppListSwitchPreference(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs, 0, R.style.AppListSwitchPreference);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onBindView(View view) {
|
||||||
|
super.onBindView(view);
|
||||||
|
mSwitch = (Checkable) view.findViewById(com.android.internal.R.id.switchWidget);
|
||||||
|
mSwitch.setChecked(getValue() != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void showDialog(Bundle state) {
|
||||||
|
if (getValue() != null) {
|
||||||
|
// Turning off the current value.
|
||||||
|
if (callChangeListener(null)) {
|
||||||
|
setValue(null);
|
||||||
|
}
|
||||||
|
} else if (getEntryValues() == null || getEntryValues().length == 0) {
|
||||||
|
Log.e(TAG, "Attempting to show dialog with zero entries: " + getKey());
|
||||||
|
} else if (getEntryValues().length == 1) {
|
||||||
|
// Suppress the dialog and just toggle the preference with the only choice.
|
||||||
|
String value = getEntryValues()[0].toString();
|
||||||
|
if (callChangeListener(value)) {
|
||||||
|
setValue(value);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
super.showDialog(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setValue(String value) {
|
||||||
|
super.setValue(value);
|
||||||
|
if (mSwitch != null) {
|
||||||
|
mSwitch.setChecked(value != null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -42,6 +42,7 @@ import android.text.TextUtils;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.android.settings.AppListSwitchPreference;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsPreferenceFragment;
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
@@ -66,6 +67,7 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
private WifiManager mWifiManager;
|
private WifiManager mWifiManager;
|
||||||
private NetworkScoreManager mNetworkScoreManager;
|
private NetworkScoreManager mNetworkScoreManager;
|
||||||
|
private AppListSwitchPreference mWifiAssistantPreference;
|
||||||
|
|
||||||
private IntentFilter mFilter;
|
private IntentFilter mFilter;
|
||||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||||
@@ -130,18 +132,14 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
|
|||||||
pref.setIntent(intent);
|
pref.setIntent(intent);
|
||||||
|
|
||||||
final Context context = getActivity();
|
final Context context = getActivity();
|
||||||
SwitchPreference wifiAssistant = (SwitchPreference)findPreference(KEY_WIFI_ASSISTANT);
|
mWifiAssistantPreference = (AppListSwitchPreference) findPreference(KEY_WIFI_ASSISTANT);
|
||||||
NetworkScorerAppData scorer = getWifiAssistantApp(context);
|
Collection<NetworkScorerAppData> scorers =
|
||||||
if (UserHandle.myUserId() == UserHandle.USER_OWNER && scorer != null) {
|
NetworkScorerAppManager.getAllValidScorers(context);
|
||||||
final boolean checked = NetworkScorerAppManager.getActiveScorer(context) != null;
|
if (UserHandle.myUserId() == UserHandle.USER_OWNER && !scorers.isEmpty()) {
|
||||||
wifiAssistant.setSummary(getResources().getString(
|
mWifiAssistantPreference.setOnPreferenceChangeListener(this);
|
||||||
R.string.wifi_automatically_manage_summary, scorer.mScorerName));
|
initWifiAssistantPreference(scorers);
|
||||||
wifiAssistant.setOnPreferenceChangeListener(this);
|
} else if (mWifiAssistantPreference != null) {
|
||||||
wifiAssistant.setChecked(checked);
|
getPreferenceScreen().removePreference(mWifiAssistantPreference);
|
||||||
} else {
|
|
||||||
if (wifiAssistant != null) {
|
|
||||||
getPreferenceScreen().removePreference(wifiAssistant);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Intent wifiDirectIntent = new Intent(context,
|
Intent wifiDirectIntent = new Intent(context,
|
||||||
@@ -202,6 +200,18 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
private void updateSleepPolicySummary(Preference sleepPolicyPref, String value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
String[] values = getResources().getStringArray(R.array.wifi_sleep_policy_values);
|
String[] values = getResources().getStringArray(R.array.wifi_sleep_policy_values);
|
||||||
@@ -261,12 +271,13 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (KEY_WIFI_ASSISTANT.equals(key)) {
|
} else if (KEY_WIFI_ASSISTANT.equals(key)) {
|
||||||
if (((Boolean)newValue).booleanValue() == false) {
|
NetworkScorerAppData wifiAssistant =
|
||||||
|
NetworkScorerAppManager.getScorer(context, (String) newValue);
|
||||||
|
if (wifiAssistant == null) {
|
||||||
mNetworkScoreManager.setActiveScorer(null);
|
mNetworkScoreManager.setActiveScorer(null);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkScorerAppData wifiAssistant = getWifiAssistantApp(context);
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
if (wifiAssistant.mConfigurationActivityClassName != null) {
|
if (wifiAssistant.mConfigurationActivityClassName != null) {
|
||||||
// App has a custom configuration activity; launch that.
|
// App has a custom configuration activity; launch that.
|
||||||
@@ -282,6 +293,9 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
startActivity(intent);
|
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)) {
|
if (KEY_SLEEP_POLICY.equals(key)) {
|
||||||
@@ -317,22 +331,6 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
|
|||||||
wifiIpAddressPref.setSelectable(false);
|
wifiIpAddressPref.setSelectable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the Network Scorer for the Wifi Assistant App.
|
|
||||||
*/
|
|
||||||
public static NetworkScorerAppData getWifiAssistantApp(Context context) {
|
|
||||||
Collection<NetworkScorerAppData> scorers =
|
|
||||||
NetworkScorerAppManager.getAllValidScorers(context);
|
|
||||||
|
|
||||||
if (scorers.isEmpty()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: b/13780935 - Implement proper scorer selection. Rather than pick the first
|
|
||||||
// scorer on the system, we should allow the user to select one.
|
|
||||||
return scorers.iterator().next();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wrapper class for the WPS dialog to properly handle life cycle events like rotation. */
|
/* Wrapper class for the WPS dialog to properly handle life cycle events like rotation. */
|
||||||
public static class WpsFragment extends DialogFragment {
|
public static class WpsFragment extends DialogFragment {
|
||||||
private static int mWpsSetup;
|
private static int mWpsSetup;
|
||||||
|
Reference in New Issue
Block a user