summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/settings/AppListPreference.java7
-rw-r--r--src/com/android/settings/AppListSwitchPreference.java59
-rw-r--r--src/com/android/settings/wifi/AdvancedWifiSettings.java58
3 files changed, 94 insertions, 30 deletions
diff --git a/src/com/android/settings/AppListPreference.java b/src/com/android/settings/AppListPreference.java
index 2180983..96897ae 100644
--- a/src/com/android/settings/AppListPreference.java
+++ b/src/com/android/settings/AppListPreference.java
@@ -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) {
super(context, attrs);
}
@@ -105,6 +110,8 @@ public class AppListPreference extends ListPreference {
setEntryValues(packageNames);
if (selectedIndex != -1) {
setValueIndex(selectedIndex);
+ } else {
+ setValue(null);
}
}
diff --git a/src/com/android/settings/AppListSwitchPreference.java b/src/com/android/settings/AppListSwitchPreference.java
new file mode 100644
index 0000000..f9f1ba0
--- /dev/null
+++ b/src/com/android/settings/AppListSwitchPreference.java
@@ -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);
+ }
+ }
+}
diff --git a/src/com/android/settings/wifi/AdvancedWifiSettings.java b/src/com/android/settings/wifi/AdvancedWifiSettings.java
index 7d06fdb..ac93c2e 100644
--- a/src/com/android/settings/wifi/AdvancedWifiSettings.java
+++ b/src/com/android/settings/wifi/AdvancedWifiSettings.java
@@ -42,6 +42,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
+import com.android.settings.AppListSwitchPreference;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
@@ -66,6 +67,7 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
private WifiManager mWifiManager;
private NetworkScoreManager mNetworkScoreManager;
+ private AppListSwitchPreference mWifiAssistantPreference;
private IntentFilter mFilter;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -130,18 +132,14 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
pref.setIntent(intent);
final Context context = getActivity();
- SwitchPreference wifiAssistant = (SwitchPreference)findPreference(KEY_WIFI_ASSISTANT);
- NetworkScorerAppData scorer = getWifiAssistantApp(context);
- if (UserHandle.myUserId() == UserHandle.USER_OWNER && scorer != null) {
- final boolean checked = NetworkScorerAppManager.getActiveScorer(context) != null;
- wifiAssistant.setSummary(getResources().getString(
- R.string.wifi_automatically_manage_summary, scorer.mScorerName));
- wifiAssistant.setOnPreferenceChangeListener(this);
- wifiAssistant.setChecked(checked);
- } else {
- if (wifiAssistant != null) {
- getPreferenceScreen().removePreference(wifiAssistant);
- }
+ mWifiAssistantPreference = (AppListSwitchPreference) findPreference(KEY_WIFI_ASSISTANT);
+ Collection<NetworkScorerAppData> scorers =
+ NetworkScorerAppManager.getAllValidScorers(context);
+ if (UserHandle.myUserId() == UserHandle.USER_OWNER && !scorers.isEmpty()) {
+ mWifiAssistantPreference.setOnPreferenceChangeListener(this);
+ initWifiAssistantPreference(scorers);
+ } else if (mWifiAssistantPreference != null) {
+ getPreferenceScreen().removePreference(mWifiAssistantPreference);
}
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) {
if (value != null) {
String[] values = getResources().getStringArray(R.array.wifi_sleep_policy_values);
@@ -261,12 +271,13 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
return false;
}
} 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);
return true;
}
- NetworkScorerAppData wifiAssistant = getWifiAssistantApp(context);
Intent intent = new Intent();
if (wifiAssistant.mConfigurationActivityClassName != null) {
// App has a custom configuration activity; launch that.
@@ -282,6 +293,9 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
}
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)) {
@@ -317,22 +331,6 @@ public class AdvancedWifiSettings extends SettingsPreferenceFragment
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. */
public static class WpsFragment extends DialogFragment {
private static int mWpsSetup;