Merge "Add the settings content observer for shortcut preference." into rvc-dev
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 3b085dc..d4a69f2 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -290,7 +290,7 @@
<string name="lockdown_settings_summary" msgid="7422522013953398806">"Mostra a opción do botón de acendido que desactiva Smart Lock, o desbloqueo biométrico e as notificacións da pantalla de bloqueo"</string>
<string name="trust_lost_locks_screen_title" msgid="4231232144565291276">"Bloquear pantalla ao perder a confianza"</string>
<string name="trust_lost_locks_screen_summary" msgid="718374221849537361">"Se se activa, o dispositivo bloquearase cando o último axente de confianza perda ese privilexio"</string>
- <string name="owner_info_settings_summary" msgid="347238313388083297">"Ningunha"</string>
+ <string name="owner_info_settings_summary" msgid="347238313388083297">"Ningún"</string>
<string name="owner_info_settings_status" msgid="7488764871758677862">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="COUNT_1">%2$d</xliff:g>"</string>
<string name="owner_info_settings_edit_text_hint" msgid="841926875876050274">"Por exemplo: Android de Xoán."</string>
<string name="show_profile_info_on_lockscreen_label" msgid="5734739022887933365">"Mostrar info do perfil na pantalla de bloqueo"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 9d878d0..4be0b18 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -2127,24 +2127,17 @@
<string name="accessibility_screen_magnification_summary" msgid="2023126829553044999">"Vuta karibu haraka kwenye skrini ili uonyeshe maudhui vizuri zaidi.<br/><br/><b>Ili uvute karibu:</b><br/> 1. Tumia njia ya mkato ili uanzishe ukuzaji<br/> 2. Gusa skrini<br/> 3. Buruta vidole viwili ili usogeze kwenye skrini<br/> 4. Bana kwa vidole viwili ili ubadilishe ukuzaji<br/> 5. Tumia njia ya mkato ili usimamishe ukuzaji<br/><br/><b>Ili uvute karibu kwa muda:</b><br/> 1. Tumia njia ya mkato ili uanzishe ukuzaji<br/> 2. Gusa na ushikilie mahali popote kwenye skrini<br/> 3. Buruta kidole ili usogeze kwenye skrini<br/> 4. Inua kidole ili uache kukuza"</string>
<string name="accessibility_screen_magnification_navbar_summary" msgid="807985499898802296">"Ukiwasha ukuzaji, unaweza kuvuta karibu kwenye skrini yako.\n\n"<b>"Ili ukuze"</b>", anzisha ukuzaji kisha uguse mahali popote kwenye skrini.\n"<ul><li>"Buruta vidole 2 au zaidi ili usogeze"</li>\n<li>"Bana vidole 2 au zaidi ili urekebishe ukuzaji"</li></ul>\n\n<b>"Ili ukuze kwa muda"</b>", anzisha ukuzaji kisha uguse na ushikilie mahali popote kwenye skrini.\n"<ul><li>"Buruta ili usogeze kwenye skrini"</li>\n<li>"Inua kidole ili usogeze mbali"</li></ul>\n\n"Huwezi kuvuta karibu kwenye kibodi au sehemu ya viungo muhimu."</string>
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Tumia kitufe cha ufikivu kufungua"</string>
- <!-- no translation found for accessibility_tutorial_dialog_title_volume (494810949830845234) -->
- <skip />
+ <string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Shikilia vitufe vya sauti ili ufungue"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Gusa skrini mara tatu ili ufungue"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Tumia ishara ili ufungue"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="8485448068531147828">"Tumia ishara mpya ya ufikivu"</string>
- <!-- no translation found for accessibility_tutorial_dialog_message_button (7002398857479782303) -->
- <skip />
- <!-- no translation found for accessibility_tutorial_dialog_message_volume (5033080515460519183) -->
- <skip />
+ <string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Ili utumie kipengele hiki, gusa kitufe cha zana za ufikivu cha <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> katika sehemu ya chini ya skrini yako.\n\nIli ubadilishe kati ya vipengele, gusa na ushikilie kitufe cha zana za ufikivu."</string>
+ <string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Ili utumie kipengele hiki, bonyeza na ushikilie vitufe vyote viwili vya sauti."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Ili uanzishe na kusimamisha ukuzaji, gusa mara tatu mahali popote kwenye skrini yako."</string>
- <!-- no translation found for accessibility_tutorial_dialog_message_gesture (4148062210755434854) -->
- <skip />
- <!-- no translation found for accessibility_tutorial_dialog_message_gesture_talkback (8142847782708562793) -->
- <skip />
- <!-- no translation found for accessibility_tutorial_dialog_message_gesture_settings (40769674586981429) -->
- <skip />
- <!-- no translation found for accessibility_tutorial_dialog_message_gesture_settings_talkback (7292969929578621958) -->
- <skip />
+ <string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Ili utumie kipengele hiki, telezesha vidole viwili juu kutoka sehemu ya chini ya skrini.\n\nIli ubadilishe kati ya vipengele, telezesha vidole viwili juu na ushikilie."</string>
+ <string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Ili utumie kipengele hiki, telezesha vidole vitatu juu kutoka sehemu ya chini ya skrini.\n\nIli ubadilishe kati ya vipengele, telezesha vidole vitatu juu na ushikilie."</string>
+ <string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Ili utumie kipengele cha ufikivu, telezesha vidole viwili juu kutoka sehemu ya chini ya skrini.\n\nIli ubadilishe kati ya vipengele, telezesha vidole viwili juu na ushikilie."</string>
+ <string name="accessibility_tutorial_dialog_message_gesture_settings_talkback" msgid="7292969929578621958">"Ili utumie kipengele cha ufikivu, telezesha vidole vitatu juu kutoka sehemu ya chini ya skrini.\n\nIli ubadilishe kati ya vipengele, telezesha vidole vitatu juu na ushikilie."</string>
<string name="accessibility_tutorial_dialog_button" msgid="2031773187678948436">"Nimeelewa"</string>
<string name="accessibility_shortcut_title" msgid="8125867833704517463">"Njia mkato ya <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_edit_summary_software" msgid="6405629977940618205">"Kitufe cha zana za ufikivu"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index da7d6c1..30314f5 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -2127,24 +2127,17 @@
<string name="accessibility_screen_magnification_summary" msgid="2023126829553044999">"İçeriği daha net görüntülemek için ekranı hızlıca yakınlaştırın.<br/><br/><b>Yakınlaştırmak için:</b><br/> 1. Büyütmeyi başlatmak için kısayolu kullanın<br/> 2. Ekrana dokunun<br/> 3. Ekranda gezinmek için 2 parmağınızı sürükleyin<br/> 4. Yakınlaştırmayı ayarlamak için 2 parmağınızla sıkıştırın<br/> 5. Büyütmeyi durdurmak için kısayolu kullanın<br/><br/><b>Geçici bir süreliğine yakınlaştırmak için:</b><br/> 1. Büyütmeyi başlatmak için kısayolu kullanın<br/> 2. Ekranda herhangi bir yere dokunup basılı tutun<br/> 3. Ekranda gezinmek için parmağınızı sürükleyin<br/> 4. Büyütmeyi durdurmak için parmağınızı kaldırın"</string>
<string name="accessibility_screen_magnification_navbar_summary" msgid="807985499898802296">"Büyütme açıldığında ekranınızda yakınlaştırma yapabilirsiniz.\n\n"<b>"Yakınlaştırmak için"</b>", büyütmeyi başlatın, ardından ekranda herhangi bir yere dokunun.\n"<ul><li>"Kaydırmak için 2 veya daha fazla parmağınızı sürükleyin"</li>\n<li>"Yakınlaştırmayı ayarlamak için 2 veya daha fazla parmağınızı birbirine yaklaştırın"</li></ul>\n\n<b>"Geçici olarak yakınlaştırmak için"</b>", büyütmeyi başlatın, ardından ekranda herhangi bir yere dokunup basılı tutun.\n"<ul><li>"Ekranda hareket etmek için sürükleyin"</li>\n<li>"Uzaklaştırmak için parmağınızı çekin"</li></ul>\n\n"Klavyede veya gezinme çubuğundayken yakınlaştırma yapamazsınız."</string>
<string name="accessibility_tutorial_dialog_title_button" msgid="4681164949716215131">"Açmak için erişilebilirlik düğmesini kullanın"</string>
- <!-- no translation found for accessibility_tutorial_dialog_title_volume (494810949830845234) -->
- <skip />
+ <string name="accessibility_tutorial_dialog_title_volume" msgid="494810949830845234">"Açmak için ses düğmelerini basılı tutun"</string>
<string name="accessibility_tutorial_dialog_title_triple" msgid="7089562919284464400">"Açmak için ekrana üç kez dokunun"</string>
<string name="accessibility_tutorial_dialog_title_gesture" msgid="4965810097646659332">"Açmak için hareketi kullanın"</string>
<string name="accessibility_tutorial_dialog_title_gesture_settings" msgid="8485448068531147828">"Yeni erişilebilirlik hareketlerini kullanma"</string>
- <!-- no translation found for accessibility_tutorial_dialog_message_button (7002398857479782303) -->
- <skip />
- <!-- no translation found for accessibility_tutorial_dialog_message_volume (5033080515460519183) -->
- <skip />
+ <string name="accessibility_tutorial_dialog_message_button" msgid="7002398857479782303">"Bu özelliği kullanmak için ekranınızın alt kısmındaki erişilebilirlik düğmesine <xliff:g id="ACCESSIBILITY_ICON">%s</xliff:g> dokunun.\n\nÖzellikler arasında geçiş yapmak için erişilebilirlik düğmesine dokunup basılı tutun."</string>
+ <string name="accessibility_tutorial_dialog_message_volume" msgid="5033080515460519183">"Bu özelliği kullanmak için ses tuşlarının ikisini birden basılı tutun."</string>
<string name="accessibility_tutorial_dialog_message_triple" msgid="5219991116201165146">"Büyütmeyi başlatıp durdurmak için ekranınızda herhangi bir yere üç kez dokunun."</string>
- <!-- no translation found for accessibility_tutorial_dialog_message_gesture (4148062210755434854) -->
- <skip />
- <!-- no translation found for accessibility_tutorial_dialog_message_gesture_talkback (8142847782708562793) -->
- <skip />
- <!-- no translation found for accessibility_tutorial_dialog_message_gesture_settings (40769674586981429) -->
- <skip />
- <!-- no translation found for accessibility_tutorial_dialog_message_gesture_settings_talkback (7292969929578621958) -->
- <skip />
+ <string name="accessibility_tutorial_dialog_message_gesture" msgid="4148062210755434854">"Bu özelliği kullanmak için 2 parmağınızla ekranın alt kısmından yukarı kaydırın.\n\nÖzellikler arasında geçiş yapmak için 2 parmağınızla yukarı kaydırıp basılı tutun."</string>
+ <string name="accessibility_tutorial_dialog_message_gesture_talkback" msgid="8142847782708562793">"Bu özelliği kullanmak için 3 parmağınızla ekranın alt kısmından yukarı kaydırın.\n\nÖzellikler arasında geçiş yapmak için 3 parmağınızla yukarı kaydırıp basılı tutun."</string>
+ <string name="accessibility_tutorial_dialog_message_gesture_settings" msgid="40769674586981429">"Bir erişilebilirlik özelliğini kullanmak için 2 parmağınızla ekranın alt kısmından yukarı kaydırın.\n\nÖzellikler arasında geçiş yapmak için 2 parmağınızla yukarı kaydırıp basılı tutun."</string>
+ <string name="accessibility_tutorial_dialog_message_gesture_settings_talkback" msgid="7292969929578621958">"Bir erişilebilirlik özelliğini kullanmak için 3 parmağınızla ekranın alt kısmından yukarı kaydırın.\n\nÖzellikler arasında geçiş yapmak için 3 parmağınızla yukarı kaydırıp basılı tutun."</string>
<string name="accessibility_tutorial_dialog_button" msgid="2031773187678948436">"Anladım"</string>
<string name="accessibility_shortcut_title" msgid="8125867833704517463">"<xliff:g id="SERVICE">%1$s</xliff:g> kısayolu"</string>
<string name="accessibility_shortcut_edit_summary_software" msgid="6405629977940618205">"Erişilebilirlik düğmesi"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3684056..0f6abf7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4944,7 +4944,7 @@
<string name="accessibility_screen_magnification_navbar_summary">When magnification is turned on, you can zoom in on your screen.\n\n<b>To zoom</b>, start magnification, then tap anywhere on the screen.\n<ul><li>Drag 2 or more fingers to scroll</li>\n<li>Pinch 2 or more fingers to adjust zoom</li></ul>\n\n<b>To zoom temporarily</b>, start magnification, then touch & hold anywhere on the screen.\n<ul><li>Drag to move around the screen</li>\n<li>Lift finger to zoom out</li></ul>\n\nYou can’t zoom in on the keyboard or navigation bar.</string>
<!-- Title for the accessibility tutorial dialog in accessibility service with button. [CHAR LIMIT=50] -->
<string name="accessibility_tutorial_dialog_title_button">Use accessibility button to open</string>
- <!-- Title for the accessibility tutorial dialog in accessibility service with volume keys. [CHAR LIMIT=50] -->
+ <!-- Title for the accessibility tutorial dialog in accessibility service with volume keys. [CHAR LIMIT=100] -->
<string name="accessibility_tutorial_dialog_title_volume">Hold volume keys to open</string>
<!-- Title for the accessibility tutorial dialog in accessibility service with triple tap. [CHAR LIMIT=100] -->
<string name="accessibility_tutorial_dialog_title_triple">Triple tap screen to open</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 8393f80..d8f5e87 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -501,6 +501,11 @@
<item name="rowStyle">@style/SliceRow.Settings</item>
</style>
+ <style name="Widget.SliceView.ContextualCard">
+ <item name="rowStyle">@style/SliceRow</item>
+ <item name="android:background">@color/contextual_card_background</item>
+ </style>
+
<style name="Widget.SliceView.Panel">
<item name="titleSize">16sp</item>
<item name="rowStyle">@style/SliceRow</item>
@@ -511,35 +516,6 @@
<item name="rowStyle">@style/SliceRow.Slider</item>
</style>
- <style name="SliceRow.Slider">
- <!-- 2dp start padding for the start icon -->
- <item name="titleItemStartPadding">10dp</item>
- <item name="titleItemEndPadding">0dp</item>
-
- <!-- Padding between content and the start icon is 14dp -->
- <item name="contentStartPadding">5dp</item>
- <!-- Padding between content and end items is 16dp -->
- <item name="contentEndPadding">16dp</item>
-
- <!-- Both side margins of end item are 16dp -->
- <item name="endItemStartPadding">0dp</item>
- <item name="endItemEndPadding">24dp</item>
-
- <!-- Both side margins of bottom divider are 12dp -->
- <item name="bottomDividerStartPadding">12dp</item>
- <item name="bottomDividerEndPadding">12dp</item>
-
- <item name="actionDividerHeight">32dp</item>
- <!-- Align text with slider -->
- <item name="titleStartPadding">6dp</item>
- <item name="subContentStartPadding">6dp</item>
- </style>
-
- <style name="Widget.SliceView.ContextualCard">
- <item name="rowStyle">@style/SliceRow</item>
- <item name="android:background">@color/contextual_card_background</item>
- </style>
-
<style name="SliceRow">
<!-- 2dp start padding for the start icon -->
<item name="titleItemStartPadding">2dp</item>
@@ -566,6 +542,23 @@
<item name="contentStartPadding">8dp</item>
</style>
+ <style name="SliceRow.Slider">
+ <!-- 10dp start padding for the start icon -->
+ <item name="titleItemStartPadding">10dp</item>
+
+ <!-- Padding between content and the start icon is 5dp -->
+ <item name="contentStartPadding">5dp</item>
+
+ <!-- 0dp start padding for the end item -->
+ <item name="endItemStartPadding">0dp</item>
+ <!-- 24dp end padding for the end item -->
+ <item name="endItemEndPadding">24dp</item>
+
+ <!-- Align text with slider -->
+ <item name="titleStartPadding">6dp</item>
+ <item name="subContentStartPadding">6dp</item>
+ </style>
+
<style name="DisclaimerPositiveButton" parent="@style/SudGlifButton.Primary">
<item name="android:layout_margin">16dp</item>
<item name="android:paddingStart">8dp</item>
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 8973dec..92f8a3e 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -45,6 +45,7 @@
android:title="@string/media_output_title"
android:dialogTitle="@string/media_output_title"
android:order="-175"
+ settings:searchable="false"
settings:controller="com.android.settings.sound.MediaOutputPreferenceController"/>
<!-- Call volume -->
diff --git a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
index 73df875..e91f2a2 100644
--- a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
@@ -139,9 +139,6 @@
AccessibilityUtils.getEnabledServicesFromSettings(getActivity());
final boolean serviceEnabled = enabledServices.contains(componentName);
String description = info.loadDescription(getActivity().getPackageManager());
- if (TextUtils.isEmpty(description)) {
- description = getString(R.string.accessibility_service_default_description);
- }
if (serviceEnabled && info.crashed) {
// Update the summaries for services that have crashed.
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
index 090e5d4..ffc8335 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
@@ -24,7 +24,6 @@
import android.content.Context;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
-import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -172,11 +171,10 @@
extras.putString(AccessibilitySettings.EXTRA_TITLE, title);
String description = info.loadDescription(getPackageManager());
- if (TextUtils.isEmpty(description)) {
- description = getString(R.string.accessibility_service_default_description);
- }
extras.putString(AccessibilitySettings.EXTRA_SUMMARY, description);
+ extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, info.getAnimatedImageRes());
+
final String htmlDescription = info.loadHtmlDescription(getPackageManager());
extras.putString(AccessibilitySettings.EXTRA_HTML_DESCRIPTION, htmlDescription);
}
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index d954e72..147c412 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -16,6 +16,10 @@
package com.android.settings.applications.appinfo;
+import static com.android.settings.core.instrumentation.SettingsStatsLog.AUTO_REVOKED_APP_INTERACTION;
+import static com.android.settings.core.instrumentation.SettingsStatsLog.AUTO_REVOKED_APP_INTERACTION__ACTION__OPEN_IN_SETTINGS;
+import static com.android.settings.core.instrumentation.SettingsStatsLog.AUTO_REVOKED_APP_INTERACTION__ACTION__REMOVE_IN_SETTINGS;
+
import android.app.Activity;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
@@ -52,6 +56,7 @@
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.instrumentation.SettingsStatsLog;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
@@ -118,10 +123,12 @@
private RestrictedLockUtils.EnforcedAdmin mAppsControlDisallowedAdmin;
private PreferenceScreen mScreen;
+ private long mSessionId;
private boolean mUpdatedSysApp = false;
private boolean mListeningToPackageRemove = false;
private boolean mFinishing = false;
private boolean mAppsControlDisallowedBySystem;
+ private boolean mAccessedFromAutoRevoke;
public AppButtonsPreferenceController(SettingsActivity activity,
InstrumentedPreferenceFragment fragment,
@@ -149,6 +156,8 @@
mRequestUninstall = requestUninstall;
mRequestRemoveDeviceAdmin = requestRemoveDeviceAdmin;
mAppLaunchIntent = mPm.getLaunchIntentForPackage(mPackageName);
+ mSessionId = activity.getIntent().getLongExtra(Intent.ACTION_AUTO_REVOKE_PERMISSIONS, 0);
+ mAccessedFromAutoRevoke = mSessionId != 0;
if (packageName != null) {
mAppEntry = mState.getEntry(packageName, mUserId);
@@ -202,6 +211,13 @@
@Override
public void onClick(View v) {
+ if (mAccessedFromAutoRevoke) {
+
+ Log.i(TAG, "sessionId: " + mSessionId + " uninstalling " + mPackageName
+ + " with uid " + getUid() + ", reached from auto revoke");
+ SettingsStatsLog.write(AUTO_REVOKED_APP_INTERACTION, mSessionId, getUid(),
+ mPackageName, AUTO_REVOKED_APP_INTERACTION__ACTION__REMOVE_IN_SETTINGS);
+ }
final String packageName = mAppEntry.info.packageName;
// Uninstall
if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
@@ -701,10 +717,28 @@
private void launchApplication() {
if (mAppLaunchIntent != null) {
+ if (mAccessedFromAutoRevoke) {
+
+ Log.i(TAG, "sessionId: " + mSessionId + " uninstalling " + mPackageName
+ + " with uid " + getUid() + ", reached from auto revoke");
+ SettingsStatsLog.write(AUTO_REVOKED_APP_INTERACTION, mSessionId, getUid(),
+ mPackageName, AUTO_REVOKED_APP_INTERACTION__ACTION__OPEN_IN_SETTINGS);
+ }
mContext.startActivityAsUser(mAppLaunchIntent, new UserHandle(mUserId));
}
}
+ private int getUid() {
+ int uid = -1;
+ if (mPackageInfo == null) {
+ retrieveAppEntry();
+ }
+ if (mPackageInfo != null) {
+ uid = mPackageInfo.applicationInfo.uid;
+ }
+ return uid;
+ }
+
private boolean isInstantApp() {
return mAppEntry != null && AppUtils.isInstant(mAppEntry.info);
}
diff --git a/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java b/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java
index cf0be20..8860de9 100644
--- a/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java
@@ -35,6 +35,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Random;
/**
* A PreferenceController handling the logic for permissions of apps.
@@ -44,6 +45,7 @@
private static final String TAG = "PermissionPrefControl";
private static final String EXTRA_HIDE_INFO_BUTTON = "hideInfoButton";
+ private static final long INVALID_SESSION_ID = 0;
private final PackageManager mPackageManager;
@@ -124,6 +126,16 @@
final Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS);
intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mParent.getAppEntry().info.packageName);
intent.putExtra(EXTRA_HIDE_INFO_BUTTON, true);
+ String action = mParent.getActivity().getIntent().getAction();
+ long sessionId = mParent.getActivity().getIntent().getLongExtra(
+ Intent.ACTION_AUTO_REVOKE_PERMISSIONS, INVALID_SESSION_ID);
+ if ((action != null && action.equals(Intent.ACTION_AUTO_REVOKE_PERMISSIONS))
+ || sessionId != INVALID_SESSION_ID) {
+ while (sessionId == INVALID_SESSION_ID) {
+ sessionId = new Random().nextLong();
+ }
+ intent.putExtra(Intent.ACTION_AUTO_REVOKE_PERMISSIONS, sessionId);
+ }
try {
mParent.getActivity().startActivityForResult(intent, mParent.SUB_INFO_FRAGMENT);
} catch (ActivityNotFoundException e) {
diff --git a/src/com/android/settings/sound/MediaOutputPreferenceController.java b/src/com/android/settings/sound/MediaOutputPreferenceController.java
index c731bc3..da92b2b 100644
--- a/src/com/android/settings/sound/MediaOutputPreferenceController.java
+++ b/src/com/android/settings/sound/MediaOutputPreferenceController.java
@@ -20,8 +20,12 @@
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
+import android.media.session.MediaController;
+import android.media.session.MediaSessionManager;
+import android.media.session.PlaybackState;
import android.text.TextUtils;
+import androidx.annotation.Nullable;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -43,15 +47,18 @@
*/
public class MediaOutputPreferenceController extends AudioSwitchPreferenceController {
+ private MediaController mMediaController;
+
public MediaOutputPreferenceController(Context context, String key) {
super(context, key);
+ mMediaController = getActiveLocalMediaController();
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- if (!Utils.isAudioModeOngoingCall(mContext)) {
+ if (!Utils.isAudioModeOngoingCall(mContext) && mMediaController != null) {
mPreference.setVisible(true);
}
}
@@ -63,6 +70,11 @@
return;
}
+ if (mMediaController == null) {
+ // No active local playback
+ return;
+ }
+
if (Utils.isAudioModeOngoingCall(mContext)) {
// Ongoing call status, switch entry for media will be disabled.
mPreference.setVisible(false);
@@ -81,6 +93,9 @@
|| (connectedHADevices != null && !connectedHADevices.isEmpty()))) {
activeDevice = findActiveDevice();
}
+ mPreference.setTitle(mContext.getString(R.string.media_output_label_title,
+ com.android.settings.Utils.getApplicationLabel(mContext,
+ mMediaController.getPackageName())));
mPreference.setSummary((activeDevice == null) ?
mContext.getText(R.string.media_output_default_summary) :
activeDevice.getAlias());
@@ -126,4 +141,26 @@
}
return false;
}
+
+ @Nullable
+ MediaController getActiveLocalMediaController() {
+ final MediaSessionManager mMediaSessionManager = mContext.getSystemService(
+ MediaSessionManager.class);
+
+ for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) {
+ final MediaController.PlaybackInfo pi = controller.getPlaybackInfo();
+ if (pi == null) {
+ return null;
+ }
+ final PlaybackState playbackState = controller.getPlaybackState();
+ if (playbackState == null) {
+ return null;
+ }
+ if (pi.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL
+ && playbackState.getState() == PlaybackState.STATE_PLAYING) {
+ return controller;
+ }
+ }
+ return null;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
index f78d42f..49928db 100644
--- a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
@@ -22,6 +22,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -33,7 +34,15 @@
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageStats;
+import android.media.AudioAttributes;
import android.media.AudioManager;
+import android.media.VolumeProvider;
+import android.media.session.MediaController;
+import android.media.session.MediaSessionManager;
+import android.media.session.PlaybackState;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
@@ -60,8 +69,10 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowBluetoothDevice;
+import org.robolectric.shadows.ShadowPackageManager;
import java.util.ArrayList;
import java.util.List;
@@ -82,6 +93,8 @@
private static final String TEST_DEVICE_ADDRESS_2 = "00:B2:B2:B2:B2:B2";
private static final String TEST_DEVICE_ADDRESS_3 = "00:C3:C3:C3:C3:C3";
private static final String TEST_DEVICE_ADDRESS_4 = "00:D4:D4:D4:D4:D4";
+ private static final String TEST_PACKAGE_NAME = "com.test.packagename";
+ private static final String TEST_APPLICATION_LABEL = "APP Test Label";
@Mock
private LocalBluetoothManager mLocalManager;
@@ -95,6 +108,10 @@
private HearingAidProfile mHearingAidProfile;
@Mock
private AudioSwitchPreferenceController.AudioSwitchCallback mAudioSwitchPreferenceCallback;
+ @Mock
+ private MediaSessionManager mMediaSessionManager;
+ @Mock
+ private MediaController mMediaController;
private Context mContext;
private PreferenceScreen mScreen;
@@ -111,6 +128,13 @@
private MediaOutputPreferenceController mController;
private List<BluetoothDevice> mProfileConnectedDevices;
private List<BluetoothDevice> mHearingAidActiveDevices;
+ private List<MediaController> mMediaControllers = new ArrayList<>();
+ private MediaController.PlaybackInfo mPlaybackInfo;
+ private PlaybackState mPlaybackState;
+ private ShadowPackageManager mShadowPackageManager;
+ private ApplicationInfo mAppInfo;
+ private PackageInfo mPackageInfo;
+ private PackageStats mPackageStats;
@Before
public void setUp() {
@@ -123,6 +147,23 @@
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalManager;
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
+ when(mContext.getSystemService(MediaSessionManager.class)).thenReturn(mMediaSessionManager);
+ when(mMediaSessionManager.getActiveSessions(any())).thenReturn(mMediaControllers);
+ when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ mPlaybackInfo = new MediaController.PlaybackInfo(
+ MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL,
+ VolumeProvider.VOLUME_CONTROL_ABSOLUTE,
+ 100,
+ 10,
+ new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build(),
+ null);
+ mPlaybackState = new PlaybackState.Builder()
+ .setState(PlaybackState.STATE_PLAYING, 0, 1)
+ .build();
+ when(mMediaController.getPlaybackInfo()).thenReturn(mPlaybackInfo);
+ when(mMediaController.getPlaybackState()).thenReturn(mPlaybackState);
+ mMediaControllers.add(mMediaController);
+
when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager);
when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager);
when(mLocalBluetoothProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
@@ -227,6 +268,30 @@
}
@Test
+ public void updateState_noActiveLocalPlayback_noTitle() {
+ mPlaybackState = new PlaybackState.Builder()
+ .setState(PlaybackState.STATE_NONE, 0, 1)
+ .build();
+ when(mMediaController.getPlaybackState()).thenReturn(mPlaybackState);
+ mController = new MediaOutputPreferenceController(mContext, TEST_KEY);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.getTitle()).isNull();
+ }
+
+ @Test
+ public void updateState_withActiveLocalPlayback_checkTitle() {
+ initPackage();
+ mShadowPackageManager.addPackage(mPackageInfo, mPackageStats);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.getTitle()).isEqualTo(
+ mContext.getString(R.string.media_output_label_title, TEST_APPLICATION_LABEL));
+ }
+
+ @Test
public void click_launch_outputSwitcherSlice() {
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
mController.handlePreferenceTreeClick(mPreference);
@@ -282,4 +347,16 @@
assertThat(mController.findActiveDevice()).isNull();
}
+
+ private void initPackage() {
+ mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
+ mAppInfo = new ApplicationInfo();
+ mAppInfo.flags = ApplicationInfo.FLAG_INSTALLED;
+ mAppInfo.packageName = TEST_PACKAGE_NAME;
+ mAppInfo.name = TEST_APPLICATION_LABEL;
+ mPackageInfo = new PackageInfo();
+ mPackageInfo.packageName = TEST_PACKAGE_NAME;
+ mPackageInfo.applicationInfo = mAppInfo;
+ mPackageStats = new PackageStats(TEST_PACKAGE_NAME);
+ }
}