Merge "Larger touch targets, snap to persisted value."
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 3cd367f..1c6bc24 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -358,34 +358,34 @@
<!-- Wi-Fi settings. Presented as a list dialog to the user to choose the Wi-Fi sleep policy. -->
<string-array name="wifi_sleep_policy_entries">
- <!-- Wi-Fi should go to sleep when the screen turns off. -->
- <item>When screen turns off (uses more mobile data)</item>
- <!-- When plugged in, never go to sleep. When on battery, go to sleep when screen turns off. -->
- <item>Never when plugged in</item>
- <!-- Never go to sleep. -->
- <item>Never (uses more battery power)</item>
+ <!-- Always keep Wi-Fi on when screen turns off. -->
+ <item>Always</item>
+ <!-- Keep Wi-Fi on when screen turns off and plugged in. When on battery, go to sleep when screen turns off. -->
+ <item>Only when plugged in</item>
+ <!-- Do not keep Wi-Fi on when screen turns off. -->
+ <item>Never (increases data usage)</item>
</string-array>
<!-- Wi-Fi settings. Presented as a list dialog to the user to choose the Wi-Fi sleep policy. Used when
the device is Wi-Fi-only. [CHAR LIMIT=30] -->
<string-array name="wifi_sleep_policy_entries_wifi_only">
- <!-- Wi-Fi should go to sleep when the screen turns off, for Wi-Fi-only devices. -->
- <item>When screen turns off</item>
- <!-- When plugged in, never go to sleep. When on battery, go to sleep when screen turns off. -->
- <item>Never when plugged in</item>
- <!-- Never go to sleep. -->
- <item>Never (uses more battery power)</item>
+ <!-- Always keep Wi-Fi on when screen turns off. -->
+ <item>Always</item>
+ <!-- Keep Wi-Fi on when screen turns off and plugged in. When on battery, go to sleep when screen turns off. -->
+ <item>Only when plugged in</item>
+ <!-- Do not keep Wi-Fi on when screen turns off, for Wi-Fi-only devices, no other data connection -->
+ <item>Never</item>
</string-array>
<!-- Match with wifi_sleep_policy_entries and the values of the settings in Settings class. --> <skip />
<!-- Do not translate. -->
<string-array name="wifi_sleep_policy_values">
<!-- Do not translate. -->
- <item>0</item>
+ <item>2</item>
<!-- Do not translate. -->
<item>1</item>
<!-- Do not translate. -->
- <item>2</item>
+ <item>0</item>
</string-array>
<!-- Wi-Fi settings. Presented as a list dialog to the user to choose the Wi-Fi frequency band. -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f2287b6..1874107 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -777,22 +777,27 @@
<!-- Title for preference that disables unlock security [CHAR LIMIT=22] -->
<string name="unlock_set_unlock_none_title">Slide</string>
<!-- Summary for preference that disables unlock security [CHAR LIMIT=45]-->
- <string name="unlock_set_unlock_none_summary"></string>
+ <string name="unlock_set_unlock_none_summary">No security</string>
+
+ <!-- Title for preference that guides the user through a weak biometric lock [CHAR LIMIT=22] -->
+ <string name="unlock_set_unlock_biometric_weak_title">FacePass</string>
+ <!-- Summary for preference that disables unlock security [CHAR LIMIT=45]-->
+ <string name="unlock_set_unlock_biometric_weak_summary">Low security, experimental</string>
<!-- Title for preference that guides the user through creating an unlock pattern [CHAR LIMIT=22]-->
<string name="unlock_set_unlock_pattern_title">Pattern</string>
<!-- Summary for preference that guides the user through creating an unlock pattern [CHAR LIMIT=45] -->
- <string name="unlock_set_unlock_pattern_summary"></string>
+ <string name="unlock_set_unlock_pattern_summary">Medium security</string>
<!-- Title for preference that guides the user through creating an unlock PIN (Personal Identification Number) [CHAR LIMIT=22] -->
<string name="unlock_set_unlock_pin_title">PIN</string>
<!-- Summary for preference that guides the user through creating an unlock PIN (Personal Identification Number) [CHAR LIMIT=45] -->
- <string name="unlock_set_unlock_pin_summary"></string>
+ <string name="unlock_set_unlock_pin_summary">Medium to high security</string>
<!-- Title for preference that guides the user through creating an unlock password [CHAR LIMIT=22] -->
<string name="unlock_set_unlock_password_title">Password</string>
<!-- Title for preference that guides the user through creating an unlock password [CHAR LIMIT=45] -->
- <string name="unlock_set_unlock_password_summary"></string>
+ <string name="unlock_set_unlock_password_summary">High security</string>
<!-- Summary for preference that has been disabled by because of the DevicePolicyAdmin, or because device encryption is enabled, or because there are credentials in the credential storage [CHAR LIMIT=50] -->
<string name="unlock_set_unlock_disabled_summary">Disabled by administrator, encryption policy, or credential storage</string>
@@ -801,6 +806,8 @@
<string name="unlock_set_unlock_mode_off">None</string>
<!-- Summary for "Configure lockscreen" when security is disabled [CHAR LIMIT=45] -->
<string name="unlock_set_unlock_mode_none">Slide</string>
+ <!-- Summary for "Configure lockscreen" when security biometric weak is enabled [CHAR LIMIT=45] -->
+ <string name="unlock_set_unlock_mode_biometric_weak">FacePass</string>
<!-- Summary for "Configure lockscreen" when security pattern is enabled [CHAR LIMIT=45] -->
<string name="unlock_set_unlock_mode_pattern">Secured with pattern</string>
<!-- Summary for "Configure lockscreen" when security PIN is enabled [CHAR LIMIT=45] -->
@@ -1143,12 +1150,8 @@
<string name="wifi_enable_watchdog_service">Avoid poor connections</string>
<!-- Checkbox summary for option to toggle wifi watchdog service -->
<string name="wifi_enable_watchdog_service_summary">Don\'t use a Wi-Fi network unless it has a decent internet connection</string>
- <!-- Setting title for setting the wifi sleep policy -->
- <string name="wifi_setting_sleep_policy_title">Wi-Fi disconnect policy</string>
- <!-- Setting summary for setting the wifi sleep policy -->
- <string name="wifi_setting_sleep_policy_summary">Specify when to switch from Wi-Fi to mobile data</string>
- <!-- Setting summary for setting the wifi sleep policy for wifi-only devices [CHAR LIMIT=100] -->
- <string name="wifi_setting_sleep_policy_summary_wifi_only">Specify when to disconnect from Wi-Fi</string>
+ <!-- Setting title for setting the wifi sleep policy. Do we keep Wi-Fi active when the screen turns off? -->
+ <string name="wifi_setting_sleep_policy_title">Keep Wi-Fi during sleep</string>
<!-- Generic error message when the sleep policy could not be set. -->
<string name="wifi_setting_sleep_policy_error">There was a problem changing the setting</string>
<!-- Action bar text message to manually add a wifi network [CHAR LIMIT=20]-->
@@ -3460,8 +3463,8 @@
<string name="data_usage_cycle">Data usage cycle</string>
<!-- Title for checkbox menu option to enable mobile data when roaming. [CHAR LIMIT=32] -->
<string name="data_usage_menu_roaming">Data roaming</string>
- <!-- Title for checkbox menu option to restrict background data usage. [CHAR LIMIT=32] -->
- <string name="data_usage_menu_restrict_background">Restrict background data</string>
+ <!-- Title for checkbox menu option to restrict background data usage. [CHAR LIMIT=20] -->
+ <string name="data_usage_menu_restrict_background">Restrict data</string>
<!-- Title for checkbox menu option to show 4G mobile data usage separate from other mobile data usage. [CHAR LIMIT=32] -->
<string name="data_usage_menu_split_4g">Separate 4G usage</string>
<!-- Title for checkbox menu option to show Wi-Fi data usage. [CHAR LIMIT=32] -->
diff --git a/res/xml/appwidget_info.xml b/res/xml/appwidget_info.xml
index 7a89cec..dc90d4e 100644
--- a/res/xml/appwidget_info.xml
+++ b/res/xml/appwidget_info.xml
@@ -15,8 +15,8 @@
-->
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="288dip"
- android:minHeight="48dip"
+ android:minWidth="260dip"
+ android:minHeight="40dip"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/widget"
>
diff --git a/res/xml/security_settings_biometric_weak.xml b/res/xml/security_settings_biometric_weak.xml
new file mode 100644
index 0000000..42af769
--- /dev/null
+++ b/res/xml/security_settings_biometric_weak.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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">
+
+ <PreferenceCategory
+ android:key="security_category"
+ android:title="@string/lock_settings_title">
+
+ <PreferenceScreen
+ android:key="unlock_set_or_change"
+ android:title="@string/unlock_set_unlock_launch_picker_title"
+ android:summary="@string/unlock_set_unlock_mode_biometric_weak"
+ android:persistent="false"/>
+
+ <ListPreference
+ android:key="lock_after_timeout"
+ android:title="@string/lock_after_timeout"
+ android:summary="@string/lock_after_timeout_summary"
+ android:entries="@array/lock_after_timeout_entries"
+ android:entryValues="@array/lock_after_timeout_values"
+ android:persistent="false"/>
+
+ <PreferenceScreen
+ android:fragment="com.android.settings.OwnerInfoSettings"
+ android:key="owner_info_settings"
+ android:title="@string/owner_info_settings_title"
+ android:summary="@string/owner_info_settings_summary"/>
+
+ </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/res/xml/security_settings_picker.xml b/res/xml/security_settings_picker.xml
index 04258df..c220214 100644
--- a/res/xml/security_settings_picker.xml
+++ b/res/xml/security_settings_picker.xml
@@ -33,6 +33,12 @@
android:persistent="false"/>
<PreferenceScreen
+ android:key="unlock_set_biometric_weak"
+ android:title="@string/unlock_set_unlock_biometric_weak_title"
+ android:summary="@string/unlock_set_unlock_biometric_weak_summary"
+ android:persistent="false"/>
+
+ <PreferenceScreen
android:key="unlock_set_pattern"
android:title="@string/unlock_set_unlock_pattern_title"
android:summary="@string/unlock_set_unlock_pattern_summary"
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index a13d6fc..da33d6a 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -64,11 +64,6 @@
android:persistent="false"
android:ringtoneType="notification" />
- <CheckBoxPreference
- android:key="notification_pulse"
- android:title="@string/notification_pulse_title"
- android:persistent="false" />
-
<PreferenceCategory
android:title="@string/sound_category_feedback_title"/>
@@ -94,6 +89,11 @@
android:title="@string/haptic_feedback_enable_title"
android:defaultValue="true" />
+ <CheckBoxPreference
+ android:key="notification_pulse"
+ android:title="@string/notification_pulse_title"
+ android:persistent="false" />
+
<ListPreference
android:key="emergency_tone"
android:title="@string/emergency_tone_title"
diff --git a/res/xml/wifi_advanced_settings.xml b/res/xml/wifi_advanced_settings.xml
index c9cc884..d500ff2 100644
--- a/res/xml/wifi_advanced_settings.xml
+++ b/res/xml/wifi_advanced_settings.xml
@@ -27,7 +27,6 @@
<ListPreference
android:key="sleep_policy"
android:title="@string/wifi_setting_sleep_policy_title"
- android:summary="@string/wifi_setting_sleep_policy_summary"
android:persistent="false"
android:entries="@array/wifi_sleep_policy_entries"
android:entryValues="@array/wifi_sleep_policy_values"
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index b1bc856..5e44df3 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -17,10 +17,12 @@
package com.android.settings;
import android.app.Activity;
+import android.app.PendingIntent;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+import android.os.SystemProperties;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
@@ -43,6 +45,7 @@
private static final int MIN_PASSWORD_LENGTH = 4;
private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
+ private static final String KEY_UNLOCK_SET_BIOMETRIC_WEAK = "unlock_set_biometric_weak";
private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
@@ -91,7 +94,10 @@
} else if (KEY_UNLOCK_SET_NONE.equals(key)) {
updateUnlockMethodAndFinish(
DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false);
- } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
+ } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) {
+ updateUnlockMethodAndFinish(
+ DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK, false);
+ }else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
updateUnlockMethodAndFinish(
DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
} else if (KEY_UNLOCK_SET_PIN.equals(key)) {
@@ -126,11 +132,11 @@
}
private void updatePreferencesOrFinish() {
- int quality = getActivity().getIntent()
- .getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
+ Intent intent = getActivity().getIntent();
+ int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
if (quality == -1) {
// If caller didn't specify password quality, show UI and allow the user to choose.
- quality = getActivity().getIntent().getIntExtra(MINIMUM_QUALITY_KEY, -1);
+ quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
quality = upgradeQuality(quality);
final PreferenceScreen prefScreen = getPreferenceScreen();
if (prefScreen != null) {
@@ -197,15 +203,23 @@
getPreferenceScreen().findPreference("security_picker_category");
final PreferenceCategory cat = (PreferenceCategory) picker;
final int preferenceCount = cat.getPreferenceCount();
- for (int i = 0; i < preferenceCount; i++) {
+ final boolean onlyShowFallback = getActivity().getIntent()
+ .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
+ final boolean weakBiometricAvailable = isBiometricSensorAvailable(
+ DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK);
+ for (int i = preferenceCount-1; i >= 0; --i) {
Preference pref = cat.getPreference(i);
if (pref instanceof PreferenceScreen) {
final String key = ((PreferenceScreen) pref).getKey();
boolean enabled = true;
+ boolean visible = true;
if (KEY_UNLOCK_SET_OFF.equals(key)) {
enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
} else if (KEY_UNLOCK_SET_NONE.equals(key)) {
enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+ } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) {
+ enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK;
+ visible = weakBiometricAvailable; // If not available, then don't show it.
} else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
} else if (KEY_UNLOCK_SET_PIN.equals(key)) {
@@ -213,7 +227,9 @@
} else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
}
- if (!enabled) {
+ if (!visible || (onlyShowFallback && !allowedForFallback(key))) {
+ cat.removePreference(pref);
+ } else if (!enabled) {
pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
pref.setEnabled(false);
}
@@ -222,6 +238,34 @@
}
/**
+ * Check whether the key is allowed for fallback (e.g. bio sensor). Returns true if it's
+ * supported as a backup.
+ *
+ * @param key
+ * @return true if allowed
+ */
+ private boolean allowedForFallback(String key) {
+ return KEY_UNLOCK_SET_PATTERN.equals(key) || KEY_UNLOCK_SET_PIN.equals(key);
+ }
+
+ private boolean isBiometricSensorAvailable(int quality) {
+ return SystemProperties.getBoolean("ro.lockscreen.facelock_enabled", false);
+ }
+
+ private Intent getBiometricSensorIntent(int quality) {
+ Intent fallBackIntent = new Intent().setClass(getActivity(), ChooseLockGeneric.class);
+ fallBackIntent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, true);
+ fallBackIntent.putExtra(CONFIRM_CREDENTIALS, false);
+ fallBackIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ Intent intent = new Intent().setClassName("com.android.facelock",
+ "com.android.facelock.SetupFaceLock");
+ PendingIntent pending = PendingIntent.getActivity(getActivity(), 0, fallBackIntent, 0);
+ intent.putExtra("PendingIntent", pending);
+ return intent;
+ }
+
+ /**
* Invokes an activity to change the user's pattern, password or PIN based on given quality
* and minimum quality specified by DevicePolicyManager. If quality is
* {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
@@ -236,6 +280,9 @@
throw new IllegalStateException("Tried to update password without confirming it");
}
+ final boolean isFallback = getActivity().getIntent()
+ .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
+
quality = upgradeQuality(quality);
if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
int minLength = mDPM.getPasswordMinimumLength(null);
@@ -249,6 +296,8 @@
intent.putExtra(ChooseLockPassword.PASSWORD_MAX_KEY, maxLength);
intent.putExtra(CONFIRM_CREDENTIALS, false);
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+ intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK,
+ isFallback);
startActivity(intent);
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
boolean showTutorial = !mChooseLockSettingsHelper.utils().isPatternEverChosen();
@@ -259,6 +308,11 @@
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent.putExtra("key_lock_method", "pattern");
intent.putExtra(CONFIRM_CREDENTIALS, false);
+ intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK,
+ isFallback);
+ startActivity(intent);
+ } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) {
+ Intent intent = getBiometricSensorIntent(quality);
startActivity(intent);
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
mChooseLockSettingsHelper.utils().clearLock();
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 96255eb..c201d15 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -368,7 +368,9 @@
} else if (mUiStage == Stage.NeedToConfirm) {
if (mFirstPin.equals(pin)) {
mLockPatternUtils.clearLock();
- mLockPatternUtils.saveLockPassword(pin, mRequestedQuality);
+ final boolean isFallback = getActivity().getIntent().getBooleanExtra(
+ LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
+ mLockPatternUtils.saveLockPassword(pin, mRequestedQuality, isFallback);
getActivity().finish();
} else {
updateStage(Stage.ConfirmWrong);
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 9a34f2f..180eee1 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -507,7 +507,9 @@
LockPatternUtils utils = mChooseLockSettingsHelper.utils();
final boolean lockVirgin = !utils.isPatternEverChosen();
- utils.saveLockPattern(mChosenPattern);
+ final boolean isFallback = getActivity().getIntent()
+ .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
+ utils.saveLockPattern(mChosenPattern, isFallback);
utils.setLockPatternEnabled(true);
if (lockVirgin) {
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 3813ecd..5b8035d 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -106,6 +106,8 @@
} else {
resid = R.xml.security_settings_chooser;
}
+ } else if (mLockPatternUtils.usingBiometricWeak()) {
+ resid = R.xml.security_settings_biometric_weak;
} else {
switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
@@ -120,6 +122,7 @@
resid = R.xml.security_settings_password;
break;
}
+ // TODO: enable facepass options
}
addPreferencesFromResource(resid);
diff --git a/src/com/android/settings/applications/RunningState.java b/src/com/android/settings/applications/RunningState.java
index 552aa56..beb9605 100644
--- a/src/com/android/settings/applications/RunningState.java
+++ b/src/com/android/settings/applications/RunningState.java
@@ -99,7 +99,20 @@
// All processes, used for retrieving memory information.
final ArrayList<ProcessItem> mAllProcessItems = new ArrayList<ProcessItem>();
-
+
+ static class AppProcessInfo {
+ final ActivityManager.RunningAppProcessInfo info;
+ boolean hasServices;
+ boolean hasForegroundServices;
+
+ AppProcessInfo(ActivityManager.RunningAppProcessInfo _info) {
+ info = _info;
+ }
+ }
+
+ // Temporary structure used when updating above information.
+ final SparseArray<AppProcessInfo> mTmpAppProcesses = new SparseArray<AppProcessInfo>();
+
int mSequence = 0;
// ----- following protected by mLock -----
@@ -641,25 +654,97 @@
mSequence++;
boolean changed = false;
-
+
+ // Retrieve list of services, filtering out anything that definitely
+ // won't be shown in the UI.
List<ActivityManager.RunningServiceInfo> services
= am.getRunningServices(MAX_SERVICES);
- final int NS = services != null ? services.size() : 0;
+ int NS = services != null ? services.size() : 0;
for (int i=0; i<NS; i++) {
ActivityManager.RunningServiceInfo si = services.get(i);
// We are not interested in services that have not been started
// and don't have a known client, because
// there is nothing the user can do about them.
if (!si.started && si.clientLabel == 0) {
+ services.remove(i);
+ i--;
+ NS--;
continue;
}
// We likewise don't care about services running in a
// persistent process like the system or phone.
if ((si.flags&ActivityManager.RunningServiceInfo.FLAG_PERSISTENT_PROCESS)
!= 0) {
+ services.remove(i);
+ i--;
+ NS--;
continue;
}
-
+ }
+
+ // Retrieve list of running processes, organizing them into a sparse
+ // array for easy retrieval.
+ List<ActivityManager.RunningAppProcessInfo> processes
+ = am.getRunningAppProcesses();
+ final int NP = processes != null ? processes.size() : 0;
+ mTmpAppProcesses.clear();
+ for (int i=0; i<NP; i++) {
+ ActivityManager.RunningAppProcessInfo pi = processes.get(i);
+ mTmpAppProcesses.put(pi.pid, new AppProcessInfo(pi));
+ }
+
+ // Initial iteration through running services to collect per-process
+ // info about them.
+ for (int i=0; i<NS; i++) {
+ ActivityManager.RunningServiceInfo si = services.get(i);
+ if (si.restarting == 0 && si.pid > 0) {
+ AppProcessInfo ainfo = mTmpAppProcesses.get(si.pid);
+ if (ainfo != null) {
+ ainfo.hasServices = true;
+ if (si.foreground) {
+ ainfo.hasForegroundServices = true;
+ }
+ }
+ }
+ }
+
+ // Update state we are maintaining about process that are running services.
+ for (int i=0; i<NS; i++) {
+ ActivityManager.RunningServiceInfo si = services.get(i);
+
+ // If this service's process is in use at a higher importance
+ // due to another process bound to one of its services, then we
+ // won't put it in the top-level list of services. Instead we
+ // want it to be included in the set of processes that the other
+ // process needs.
+ if (si.restarting == 0 && si.pid > 0) {
+ AppProcessInfo ainfo = mTmpAppProcesses.get(si.pid);
+ if (ainfo != null && !ainfo.hasForegroundServices) {
+ // This process does not have any foreground services.
+ // If its importance is greater than the service importance
+ // then there is something else more significant that is
+ // keeping it around that it should possibly be included as
+ // a part of instead of being shown by itself.
+ if (ainfo.info.importance
+ < ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE) {
+ // Follow process chain to see if there is something
+ // else that could be shown
+ boolean skip = false;
+ ainfo = mTmpAppProcesses.get(ainfo.info.importanceReasonPid);
+ while (ainfo != null) {
+ if (ainfo.hasServices || isInterestingProcess(ainfo.info)) {
+ skip = true;
+ break;
+ }
+ ainfo = mTmpAppProcesses.get(ainfo.info.importanceReasonPid);
+ }
+ if (skip) {
+ continue;
+ }
+ }
+ }
+ }
+
HashMap<String, ProcessItem> procs = mServiceProcessesByName.get(si.uid);
if (procs == null) {
procs = new HashMap<String, ProcessItem>();
@@ -694,9 +779,6 @@
// Now update the map of other processes that are running (but
// don't have services actively running inside them).
- List<ActivityManager.RunningAppProcessInfo> processes
- = am.getRunningAppProcesses();
- final int NP = processes != null ? processes.size() : 0;
for (int i=0; i<NP; i++) {
ActivityManager.RunningAppProcessInfo pi = processes.get(i);
ProcessItem proc = mServiceProcessesByPid.get(pi.pid);
diff --git a/src/com/android/settings/wifi/AdvancedWifiSettings.java b/src/com/android/settings/wifi/AdvancedWifiSettings.java
index 7fb9871..19d05c1 100644
--- a/src/com/android/settings/wifi/AdvancedWifiSettings.java
+++ b/src/com/android/settings/wifi/AdvancedWifiSettings.java
@@ -99,16 +99,37 @@
if (sleepPolicyPref != null) {
if (Utils.isWifiOnly(getActivity())) {
sleepPolicyPref.setEntries(R.array.wifi_sleep_policy_entries_wifi_only);
- sleepPolicyPref.setSummary(R.string.wifi_setting_sleep_policy_summary_wifi_only);
}
sleepPolicyPref.setOnPreferenceChangeListener(this);
int value = Settings.System.getInt(getContentResolver(),
Settings.System.WIFI_SLEEP_POLICY,
Settings.System.WIFI_SLEEP_POLICY_NEVER);
- sleepPolicyPref.setValue(String.valueOf(value));
+ 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(PreferenceScreen screen, Preference preference) {
String key = preference.getKey();
@@ -133,7 +154,7 @@
if (KEY_FREQUENCY_BAND.equals(key)) {
try {
- mWifiManager.setFrequencyBand(Integer.parseInt(((String) newValue)), true);
+ mWifiManager.setFrequencyBand(Integer.parseInt((String) newValue), true);
} catch (NumberFormatException e) {
Toast.makeText(getActivity(), R.string.wifi_setting_frequency_band_error,
Toast.LENGTH_SHORT).show();
@@ -143,8 +164,10 @@
if (KEY_SLEEP_POLICY.equals(key)) {
try {
- Settings.System.putInt(getContentResolver(),
- Settings.System.WIFI_SLEEP_POLICY, Integer.parseInt(((String) newValue)));
+ String stringValue = (String) newValue;
+ Settings.System.putInt(getContentResolver(), Settings.System.WIFI_SLEEP_POLICY,
+ Integer.parseInt(stringValue));
+ updateSleepPolicySummary(preference, stringValue);
} catch (NumberFormatException e) {
Toast.makeText(getActivity(), R.string.wifi_setting_sleep_policy_error,
Toast.LENGTH_SHORT).show();