Merge "Improvements to user settings" into lmp-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index fac2d34..b9f87d1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -93,6 +93,13 @@
</intent-filter>
</activity>
+ <receiver android:name="LauncherIconToggler">
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED"/>
+ <action android:name="android.intent.action.PRE_BOOT_COMPLETED"/>
+ </intent-filter>
+ </receiver>
+
<activity android:name=".SubSettings"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
diff --git a/res/layout/crypt_keeper_password_entry.xml b/res/layout/crypt_keeper_password_entry.xml
index ecbfefd..6e99527 100644
--- a/res/layout/crypt_keeper_password_entry.xml
+++ b/res/layout/crypt_keeper_password_entry.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
-** Copyright 2011, The Android Open Source Project
+** Copyright 2014, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License")
** you may not use this file except in compliance with the License.
@@ -20,29 +20,36 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
->
+ android:orientation="vertical">
+
<include layout="@layout/crypt_keeper_status" />
<LinearLayout
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:layout_width="match_parent"
- android:layout_marginStart="8dip"
- android:layout_marginEnd="8dip"
- android:orientation="horizontal"
- >
- <include layout="@layout/crypt_keeper_password_field" />
+ android:layout_weight="1"
+ android:layout_marginStart="@dimen/crypt_keeper_edit_text_margin"
+ android:layout_marginEnd="@dimen/crypt_keeper_edit_text_margin"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+
+ <LinearLayout
+ android:background="@color/crypt_keeper_password_background"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <include layout="@layout/crypt_keeper_password_field" />
+ </LinearLayout>
+
</LinearLayout>
+
<!-- Emergency call button.
Text is set by CryptKeeper.updateEmergencyCallButtonState() -->
<Button android:id="@+id/emergencyCallButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginTop="16dip"
- style="?android:attr/borderlessButtonStyle"
- android:textSize="14sp"
- android:drawablePadding="6dip"
- />
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="@dimen/crypt_keeper_emergency_call_space_above"
+ style="?android:attr/borderlessButtonStyle" />
</LinearLayout>
diff --git a/res/layout/crypt_keeper_password_field.xml b/res/layout/crypt_keeper_password_field.xml
index 9a2a24d..2d98b25 100644
--- a/res/layout/crypt_keeper_password_field.xml
+++ b/res/layout/crypt_keeper_password_field.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
-** Copyright 2011, The Android Open Source Project
+** Copyright 2014, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License")
** you may not use this file except in compliance with the License.
@@ -20,16 +20,13 @@
<!-- Contents of the password entry field for CryptKeeper. Comes with an IME
switcher, if necessary. Assumed to be in a horizontal LinearLayout. -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
<EditText android:id="@+id/passwordEntry"
android:layout_height="wrap_content"
android:layout_width="0dip"
android:layout_weight="1"
- android:singleLine="true"
android:inputType="textPassword"
- android:imeOptions="flagForceAscii|actionDone"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:gravity="center_horizontal"
- />
+ style="@style/TextAppearance.CryptKeeper_PasswordEntry" />
<ImageView android:id="@+id/switch_ime_button"
android:layout_width="wrap_content"
@@ -37,9 +34,9 @@
android:src="@drawable/ic_lockscreen_ime"
android:clickable="true"
android:contentDescription="@string/crypt_keeper_switch_input_method"
- android:padding="8dip"
+ android:padding="@dimen/crypt_keeper_edit_text_ime_padding"
android:layout_gravity="center"
android:background="?android:attr/selectableItemBackground"
- android:visibility="gone"
- />
+ android:visibility="gone" />
+
</merge>
diff --git a/res/layout/crypt_keeper_pattern_entry.xml b/res/layout/crypt_keeper_pattern_entry.xml
index 2538809..80e318f 100644
--- a/res/layout/crypt_keeper_pattern_entry.xml
+++ b/res/layout/crypt_keeper_pattern_entry.xml
@@ -20,18 +20,26 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
->
+ android:orientation="vertical">
+
<include layout="@layout/crypt_keeper_status" />
<LinearLayout
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:layout_width="match_parent"
- android:layout_marginStart="8dip"
- android:layout_marginEnd="8dip"
- android:orientation="horizontal"
- >
- <include layout="@layout/crypt_keeper_pattern_field" />
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+
+ <LinearLayout
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginStart="@dimen/crypt_keeper_edit_text_margin"
+ android:layout_marginEnd="@dimen/crypt_keeper_edit_text_margin"
+ android:orientation="horizontal" >
+ <include layout="@layout/crypt_keeper_pattern_field" />
+ </LinearLayout>
+
</LinearLayout>
<!-- Emergency call button.
@@ -40,9 +48,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:layout_marginTop="16dip"
- style="?android:attr/borderlessButtonStyle"
- android:drawablePadding="6dip"
- />
+ android:layout_marginTop="@dimen/crypt_keeper_emergency_call_space_above"
+ style="?android:attr/borderlessButtonStyle" />
</LinearLayout>
diff --git a/res/layout/crypt_keeper_pattern_field.xml b/res/layout/crypt_keeper_pattern_field.xml
index a24d9aa..cf6a29f 100644
--- a/res/layout/crypt_keeper_pattern_field.xml
+++ b/res/layout/crypt_keeper_pattern_field.xml
@@ -20,11 +20,11 @@
<!-- Contents of the password entry field for CryptKeeper. Comes with an IME
switcher, if necessary. Assumed to be in a horizontal LinearLayout. -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
<com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/lock_pattern_background"
- />
+ android:background="@color/lock_pattern_background" />
<ImageView android:id="@+id/switch_ime_button"
android:layout_width="wrap_content"
@@ -32,9 +32,9 @@
android:src="@drawable/ic_lockscreen_ime"
android:clickable="true"
android:contentDescription="@string/crypt_keeper_switch_input_method"
- android:padding="8dip"
+ android:padding="@dimen/crypt_keeper_edit_text_ime_padding"
android:layout_gravity="center"
android:background="?android:attr/selectableItemBackground"
- android:visibility="gone"
- />
+ android:visibility="gone" />
+
</merge>
diff --git a/res/layout/crypt_keeper_pin_entry.xml b/res/layout/crypt_keeper_pin_entry.xml
index 0f1f1e7..0bcbec5 100644
--- a/res/layout/crypt_keeper_pin_entry.xml
+++ b/res/layout/crypt_keeper_pin_entry.xml
@@ -20,29 +20,36 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
->
+ android:orientation="vertical">
+
<include layout="@layout/crypt_keeper_status" />
<LinearLayout
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:layout_width="match_parent"
- android:layout_marginStart="8dip"
- android:layout_marginEnd="8dip"
- android:orientation="horizontal"
- >
- <include layout="@layout/crypt_keeper_pin_field" />
+ android:layout_weight="1"
+ android:layout_marginStart="@dimen/crypt_keeper_edit_text_margin"
+ android:layout_marginEnd="@dimen/crypt_keeper_edit_text_margin"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+
+ <LinearLayout
+ android:background="@color/crypt_keeper_password_background"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <include layout="@layout/crypt_keeper_pin_field" />
+ </LinearLayout>
+
</LinearLayout>
<!-- Emergency call button.
- Text and icon are set by CryptKeeper.updateEmergencyCallButtonState() -->
+ Text is set by CryptKeeper.updateEmergencyCallButtonState() -->
<Button android:id="@+id/emergencyCallButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginTop="16dip"
- style="?android:attr/borderlessButtonStyle"
- android:drawablePadding="6dip"
- />
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="@dimen/crypt_keeper_emergency_call_space_above"
+ style="?android:attr/borderlessButtonStyle" />
</LinearLayout>
diff --git a/res/layout/crypt_keeper_pin_field.xml b/res/layout/crypt_keeper_pin_field.xml
index dd9d233..2fc1e81 100644
--- a/res/layout/crypt_keeper_pin_field.xml
+++ b/res/layout/crypt_keeper_pin_field.xml
@@ -20,16 +20,13 @@
<!-- Contents of the password entry field for CryptKeeper. Comes with an IME
switcher, if necessary. Assumed to be in a horizontal LinearLayout. -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
<EditText android:id="@+id/passwordEntry"
android:layout_height="wrap_content"
android:layout_width="0dip"
android:layout_weight="1"
- android:singleLine="true"
android:inputType="numberPassword"
- android:imeOptions="flagForceAscii|actionDone"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:gravity="center_horizontal"
- />
+ style="@style/TextAppearance.CryptKeeper_PasswordEntry" />
<ImageView android:id="@+id/switch_ime_button"
android:layout_width="wrap_content"
@@ -37,9 +34,9 @@
android:src="@drawable/ic_lockscreen_ime"
android:clickable="true"
android:contentDescription="@string/crypt_keeper_switch_input_method"
- android:padding="8dip"
+ android:padding="@dimen/crypt_keeper_edit_text_ime_padding"
android:layout_gravity="center"
android:background="?android:attr/selectableItemBackground"
- android:visibility="gone"
- />
+ android:visibility="gone" />
+
</merge>
diff --git a/res/layout/crypt_keeper_status.xml b/res/layout/crypt_keeper_status.xml
index 9015613..72f7aec 100644
--- a/res/layout/crypt_keeper_status.xml
+++ b/res/layout/crypt_keeper_status.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
-** Copyright 2011, The Android Open Source Project
+** Copyright 2014, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License")
** you may not use this file except in compliance with the License.
@@ -23,8 +23,8 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
->
+ android:layout_gravity="center_horizontal">
+
<TextView
android:id="@+id/status"
android:layout_width="wrap_content"
@@ -33,11 +33,10 @@
android:layout_marginStart="8dip"
android:layout_marginEnd="8dip"
android:textSize="18sp"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/enter_password"
- android:drawableLeft="@*android:drawable/ic_lock_idle_lock"
- android:layout_gravity="center_horizontal"
- />
+ android:layout_gravity="center_horizontal" />
+
<TextView
android:id="@+id/owner_info"
android:layout_width="match_parent"
@@ -49,6 +48,6 @@
android:ellipsize="marquee"
android:marqueeRepeatLimit ="marquee_forever"
android:textSize="16sp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- />
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
</LinearLayout>
diff --git a/res/layout/preference_list_fragment.xml b/res/layout/preference_list_fragment.xml
index 297e33b..a97415e 100644
--- a/res/layout/preference_list_fragment.xml
+++ b/res/layout/preference_list_fragment.xml
@@ -29,8 +29,8 @@
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
- android:paddingStart="@dimen/dashboard_padding_start"
- android:paddingEnd="@dimen/dashboard_padding_end"
+ android:paddingStart="@dimen/settings_side_margin"
+ android:paddingEnd="@dimen/settings_side_margin"
android:paddingTop="@dimen/dashboard_padding_top"
android:paddingBottom="@dimen/dashboard_padding_bottom"
android:scrollbarStyle="@*android:integer/preference_fragment_scrollbarStyle"
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index a00fbb4..3911378 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -641,10 +641,12 @@
<item>alarm volume</item>
<item>notification volume</item>
<item>bluetooth volume</item>
- <item>mute/unmute microphone</item>
<item>keep awake</item>
<item>monitor location</item>
<item>monitor high power location</item>
+ <item>get usage stats</item>
+ <item>mute/unmute microphone</item>
+ <item>project media</item>
</string-array>
<!-- User display names for app ops codes -->
@@ -689,10 +691,12 @@
<item>Alarm volume</item>
<item>Notification volume</item>
<item>Bluetooth volume</item>
- <item>Mute/unmute microphone</item>
<item>Keep awake</item>
<item>Location</item>
<item>Location</item>
+ <item>Get usage stats</item>
+ <item>Mute/unmute microphone</item>
+ <item>Project media</item>
</string-array>
<!-- Titles for the list of long press timeout options. -->
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ee9c4c4..5b0092e 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -34,6 +34,7 @@
<color name="crypt_keeper_clock_background">#ff9a9a9a</color>
<color name="crypt_keeper_clock_foreground">#ff666666</color>
<color name="crypt_keeper_clock_am_pm">#ff9a9a9a</color>
+ <color name="crypt_keeper_password_background">#70606060</color>
<color name="divider_color">#20ffffff</color>
<color name="title_color">@android:color/holo_blue_light</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ae654e4..29d311f 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -171,4 +171,13 @@
<dimen name="wifi_assistant_padding">25dp</dimen>
<dimen name="wifi_assistant_text_padding">16dp</dimen>
+ <!-- CryptKeeper edit text margin -->
+ <dimen name="crypt_keeper_edit_text_margin">16dip</dimen>
+
+ <!-- CryptKeeper emergency call button dimensions -->
+ <dimen name="crypt_keeper_emergency_call_space_above">16dip</dimen>
+
+ <!-- CryptKeeper edit text ime icon padding -->
+ <dimen name="crypt_keeper_edit_text_ime_padding">8dip</dimen>
+
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d938772..96ccc59 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1296,8 +1296,6 @@
<!-- Wifi Assistant title string. [CHAR LIMIT=20] -->
<string name="wifi_assistant_intro_setup">Introducing\nWi\u2011Fi Assistant</string>
- <!-- Wifi Assistant title string. [CHAR LIMIT=40] -->
- <string name="wifi_assistant_title">Wi\u2011Fi Assistant</string>
<!-- Wifi Assistant No, thanks string. Text to say no to wifi assistant. [CHAR LIMIT=20] -->
<string name="wifi_assistant_no_thanks">NO, THANKS</string>
<!-- Wifi Assistant setup string. Text to say yes to wifi assistant and begin setup. [CHAR LIMIT=20] -->
@@ -4848,7 +4846,7 @@
<!-- Data Usage Foreground label. [CHAR LIMIT=40] -->
<string name="data_usage_forground_label">Foreground:</string>
<!-- Data Usage Background label. [CHAR LIMIT=40] -->
- <string name="data_usage_forground_label">Background:</string>
+ <string name="data_usage_background_label">Background:</string>
<!-- Button title for launching application-specific data usage settings. [CHAR LIMIT=32] -->
<string name="data_usage_app_settings">View app settings</string>
<!-- Checkbox label that restricts background data usage of a specific application. [CHAR LIMIT=32] -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 32a205d..1923ce6 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -82,6 +82,15 @@
<item name="android:textColor">?android:attr/textColorPrimary</item>
</style>
+ <style name="TextAppearance.CryptKeeper_PasswordEntry" parent="android:TextAppearance.Material">
+ <item name="android:textSize">36sp</item>
+ <item name="android:gravity">center_horizontal</item>
+ <item name="android:background">@null</item>
+ <item name="android:textCursorDrawable">@null</item>
+ <item name="android:singleLine">true</item>
+ <item name="android:imeOptions">flagForceAscii|actionDone</item>
+ </style>
+
<style name="TallTitleBarTheme" parent="android:Theme.NoTitleBar">
<item name="android:windowContentOverlay">@null</item>
</style>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 44b83b1..54b5d41 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -150,6 +150,10 @@
</style>
<style name="Theme.CryptKeeper" parent="@android:style/Theme.Material.NoActionBar">
+ <item name="android:windowTranslucentStatus">false</item>
+ <item name="android:windowTranslucentNavigation">false</item>
+ <item name="android:windowDrawsSystemBarBackgrounds">false</item>
+
<!-- LockPatternView colors -->
<item name="@*android:regularColor">@color/unlock_pattern_view_regular_color</item>
<item name="@*android:successColor">@color/unlock_pattern_view_success_color</item>
diff --git a/src/com/android/settings/LauncherIconToggler.java b/src/com/android/settings/LauncherIconToggler.java
new file mode 100644
index 0000000..5016918
--- /dev/null
+++ b/src/com/android/settings/LauncherIconToggler.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.UserManager;
+
+/**
+ * Listens to {@link Intent.ACTION_BOOT_COMPLETED} and {@link Intent.ACTION_PRE_BOOT_COMPLETED} and
+ * disables the launcher icon of the Settings app for a managed profile.
+ */
+public class LauncherIconToggler extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)
+ || intent.getAction().equals(Intent.ACTION_PRE_BOOT_COMPLETED)) {
+ final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ if (Utils.isManagedProfile(um)) {
+ ComponentName launcherActivity = new ComponentName(context, Settings.class);
+ final PackageManager pm = context.getPackageManager();
+ pm.setComponentEnabledSetting(launcherActivity,
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index f035d7b..d3f0466 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -510,7 +510,8 @@
mToggleLargeTextPreference.setChecked(mCurConfig.fontScale == LARGE_FONT_SCALE);
mToggleHighTextContrastPreference.setChecked(
- AccessibilityManager.getInstance(getActivity()).isHighTextContrastEnabled());
+ Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, 0) == 1);
// Power button ends calls.
if (KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_POWER)
diff --git a/src/com/android/settings/accounts/AddAccountSettings.java b/src/com/android/settings/accounts/AddAccountSettings.java
index 0af0260..4e97c05 100644
--- a/src/com/android/settings/accounts/AddAccountSettings.java
+++ b/src/com/android/settings/accounts/AddAccountSettings.java
@@ -98,7 +98,7 @@
Utils.hasMultipleUsers(AddAccountSettings.this));
addAccountOptions.putParcelable(EXTRA_USER, mUserHandle);
intent.putExtras(addAccountOptions);
- startActivityForResult(intent, ADD_ACCOUNT_REQUEST);
+ startActivityForResultAsUser(intent, ADD_ACCOUNT_REQUEST, mUserHandle);
} else {
setResult(RESULT_OK);
if (mPendingIntent != null) {
@@ -199,22 +199,15 @@
mPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(), 0);
addAccountOptions.putParcelable(KEY_CALLER_IDENTITY, mPendingIntent);
addAccountOptions.putBoolean(EXTRA_HAS_MULTIPLE_USERS, Utils.hasMultipleUsers(this));
- // TODO: We need an API to add an account to a different user. See: http://b/15466880
- int userId = mUserHandle.getIdentifier();
- int callingUserId = UserHandle.getCallingUserId();
- if (userId != callingUserId) {
- Log.w(TAG, "Cannot add an account for user " + userId + " from " + callingUserId + ".");
- finish();
- return;
- }
- AccountManager.get(this).addAccount(
+ AccountManager.get(this).addAccountAsUser(
accountType,
null, /* authTokenType */
null, /* requiredFeatures */
addAccountOptions,
null,
mCallback,
- null /* handler */);
+ null /* handler */,
+ mUserHandle);
mAddAccountCalled = true;
}
}
diff --git a/src/com/android/settings/applications/AppOpsState.java b/src/com/android/settings/applications/AppOpsState.java
index 4ef5ef2..75a8372 100644
--- a/src/com/android/settings/applications/AppOpsState.java
+++ b/src/com/android/settings/applications/AppOpsState.java
@@ -103,14 +103,14 @@
AppOpsManager.OP_WIFI_SCAN,
AppOpsManager.OP_NEIGHBORING_CELLS,
AppOpsManager.OP_MONITOR_LOCATION,
- AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION},
+ AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION },
new boolean[] { true,
true,
false,
false,
false,
false,
- false}
+ false }
);
public static final OpsTemplate PERSONAL_TEMPLATE = new OpsTemplate(
@@ -189,13 +189,15 @@
AppOpsManager.OP_CALL_PHONE,
AppOpsManager.OP_WRITE_SETTINGS,
AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
- AppOpsManager.OP_WAKE_LOCK },
+ AppOpsManager.OP_WAKE_LOCK,
+ AppOpsManager.OP_PROJECT_MEDIA },
new boolean[] { false,
true,
true,
true,
true,
- true, }
+ true,
+ false, }
);
public static final OpsTemplate[] ALL_TEMPLATES = new OpsTemplate[] {
diff --git a/src/com/android/settings/location/RecentLocationApps.java b/src/com/android/settings/location/RecentLocationApps.java
index 164f4e7..8e1ec05 100644
--- a/src/com/android/settings/location/RecentLocationApps.java
+++ b/src/com/android/settings/location/RecentLocationApps.java
@@ -16,15 +16,18 @@
package com.android.settings.location;
-import android.app.ActivityManager;
+import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.IPackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Process;
+import android.os.RemoteException;
import android.os.UserHandle;
+import android.os.UserManager;
import android.preference.Preference;
import android.util.Log;
@@ -89,33 +92,37 @@
}
/**
- * Fills a list of applications which queried location recently within
- * specified time.
+ * Fills a list of applications which queried location recently within specified time.
*/
public List<Preference> getAppList() {
// Retrieve a location usage list from AppOps
AppOpsManager aoManager =
(AppOpsManager) mActivity.getSystemService(Context.APP_OPS_SERVICE);
- List<AppOpsManager.PackageOps> appOps = aoManager.getPackagesForOps(
- new int[] {
- AppOpsManager.OP_MONITOR_LOCATION,
- AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION,
- });
+ List<AppOpsManager.PackageOps> appOps = aoManager.getPackagesForOps(new int[] {
+ AppOpsManager.OP_MONITOR_LOCATION, AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION, });
// Process the AppOps list and generate a preference list.
ArrayList<Preference> prefs = new ArrayList<Preference>();
- long now = System.currentTimeMillis();
- for (AppOpsManager.PackageOps ops : appOps) {
+ final long now = System.currentTimeMillis();
+ final UserManager um = (UserManager) mActivity.getSystemService(Context.USER_SERVICE);
+ final List<UserHandle> profiles = um.getUserProfiles();
+
+ final int appOpsN = appOps.size();
+ for (int i = 0; i < appOpsN; ++i) {
+ AppOpsManager.PackageOps ops = appOps.get(i);
// Don't show the Android System in the list - it's not actionable for the user.
- // Also don't show apps belonging to background users.
+ // Also don't show apps belonging to background users except managed users.
+ String packageName = ops.getPackageName();
int uid = ops.getUid();
- boolean isAndroidOs = (uid == Process.SYSTEM_UID)
- && ANDROID_SYSTEM_PACKAGE_NAME.equals(ops.getPackageName());
- if (!isAndroidOs && ActivityManager.getCurrentUser() == UserHandle.getUserId(uid)) {
- Preference pref = getPreferenceFromOps(now, ops);
- if (pref != null) {
- prefs.add(pref);
- }
+ int userId = UserHandle.getUserId(uid);
+ boolean isAndroidOs =
+ (uid == Process.SYSTEM_UID) && ANDROID_SYSTEM_PACKAGE_NAME.equals(packageName);
+ if (isAndroidOs || !profiles.contains(new UserHandle(userId))) {
+ continue;
+ }
+ Preference preference = getPreferenceFromOps(um, now, ops);
+ if (preference != null) {
+ prefs.add(preference);
}
}
@@ -130,7 +137,8 @@
* When the PackageOps is fresh enough, this method returns a Preference pointing to the App
* Info page for that package.
*/
- private Preference getPreferenceFromOps(long now, AppOpsManager.PackageOps ops) {
+ private Preference getPreferenceFromOps(final UserManager um, long now,
+ AppOpsManager.PackageOps ops) {
String packageName = ops.getPackageName();
List<AppOpsManager.OpEntry> entries = ops.getOps();
boolean highBattery = false;
@@ -161,30 +169,24 @@
// The package is fresh enough, continue.
- Preference pref = null;
+ int uid = ops.getUid();
+ int userId = UserHandle.getUserId(uid);
+
+ Preference preference = null;
try {
- ApplicationInfo appInfo = mPackageManager.getApplicationInfo(
- packageName, PackageManager.GET_META_DATA);
- // Multiple users can install the same package. Each user gets a different Uid for
- // the same package.
- //
- // Here we retrieve the Uid with package name, that will be the Uid for that package
- // associated with the current active user. If the Uid differs from the Uid in ops,
- // that means this entry belongs to another inactive user and we should ignore that.
- if (appInfo.uid == ops.getUid()) {
- pref = createRecentLocationEntry(
- mPackageManager.getApplicationIcon(appInfo),
- mPackageManager.getApplicationLabel(appInfo),
- highBattery,
- new PackageEntryClickedListener(packageName));
- } else if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "package " + packageName + " with Uid " + ops.getUid() +
- " belongs to another inactive account, ignored.");
- }
- } catch (PackageManager.NameNotFoundException e) {
- Log.wtf(TAG, "Package not found: " + packageName, e);
+ IPackageManager ipm = AppGlobals.getPackageManager();
+ ApplicationInfo appInfo =
+ ipm.getApplicationInfo(packageName, PackageManager.GET_META_DATA, userId);
+
+ Drawable icon = um.getBadgedDrawableForUser(
+ mPackageManager.getApplicationIcon(appInfo), new UserHandle(userId));
+ preference = createRecentLocationEntry(icon,
+ mPackageManager.getApplicationLabel(appInfo), highBattery,
+ new PackageEntryClickedListener(packageName));
+ } catch (RemoteException e) {
+ Log.w(TAG, "Error while retrieving application info", e);
}
- return pref;
+ return preference;
}
}