summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk3
-rw-r--r--api/system-current.txt3
-rw-r--r--api/test-current.txt7
-rw-r--r--cmds/am/src/com/android/commands/am/Am.java45
-rw-r--r--core/java/android/app/ActivityView.java620
-rw-r--r--core/java/android/app/IActivityContainer.aidl36
-rw-r--r--core/java/android/app/IActivityManager.aidl6
-rw-r--r--core/java/android/app/IInputForwarder.aidl (renamed from core/java/android/app/IActivityContainerCallback.aidl)18
-rw-r--r--core/java/android/content/pm/PackageParser.java6
-rw-r--r--core/java/android/content/pm/PermissionGroupInfo.java14
-rw-r--r--core/java/android/content/pm/PermissionInfo.java12
-rw-r--r--core/java/android/hardware/input/IInputManager.aidl4
-rw-r--r--core/java/android/hardware/input/InputManager.java22
-rw-r--r--core/java/android/provider/DocumentsProvider.java29
-rw-r--r--core/java/android/service/notification/ZenModeConfig.java2
-rw-r--r--core/java/android/text/BoringLayout.java206
-rw-r--r--core/java/android/text/Selection.java183
-rw-r--r--core/java/android/text/TextUtils.java93
-rwxr-xr-xcore/java/android/text/format/DateFormat.java135
-rw-r--r--core/java/android/text/style/BulletSpan.java32
-rw-r--r--core/java/android/text/style/TextAppearanceSpan.java87
-rw-r--r--core/java/android/webkit/HttpAuthHandler.java10
-rw-r--r--core/java/android/webkit/WebChromeClient.java11
-rw-r--r--core/java/android/widget/Editor.java4
-rw-r--r--core/java/android/widget/TextView.java53
-rw-r--r--core/java/com/android/internal/content/FileSystemProvider.java51
-rw-r--r--core/res/AndroidManifest.xml13
-rw-r--r--core/res/res/values-af/strings.xml4
-rw-r--r--core/res/res/values-am/strings.xml4
-rw-r--r--core/res/res/values-ar/strings.xml4
-rw-r--r--core/res/res/values-az/strings.xml4
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml4
-rw-r--r--core/res/res/values-be/strings.xml4
-rw-r--r--core/res/res/values-bg/strings.xml4
-rw-r--r--core/res/res/values-bn/strings.xml4
-rw-r--r--core/res/res/values-bs/strings.xml4
-rw-r--r--core/res/res/values-ca/strings.xml4
-rw-r--r--core/res/res/values-cs/strings.xml4
-rw-r--r--core/res/res/values-da/strings.xml4
-rw-r--r--core/res/res/values-de/strings.xml4
-rw-r--r--core/res/res/values-el/strings.xml4
-rw-r--r--core/res/res/values-en-rAU/strings.xml4
-rw-r--r--core/res/res/values-en-rGB/strings.xml4
-rw-r--r--core/res/res/values-en-rIN/strings.xml4
-rw-r--r--core/res/res/values-es-rUS/strings.xml4
-rw-r--r--core/res/res/values-es/strings.xml4
-rw-r--r--core/res/res/values-et/strings.xml4
-rw-r--r--core/res/res/values-eu/strings.xml4
-rw-r--r--core/res/res/values-fa/strings.xml6
-rw-r--r--core/res/res/values-fi/strings.xml4
-rw-r--r--core/res/res/values-fr-rCA/strings.xml4
-rw-r--r--core/res/res/values-fr/strings.xml4
-rw-r--r--core/res/res/values-gl/strings.xml4
-rw-r--r--core/res/res/values-gu/strings.xml4
-rw-r--r--core/res/res/values-hi/strings.xml4
-rw-r--r--core/res/res/values-hr/strings.xml4
-rw-r--r--core/res/res/values-hu/strings.xml4
-rw-r--r--core/res/res/values-hy/strings.xml4
-rw-r--r--core/res/res/values-in/strings.xml4
-rw-r--r--core/res/res/values-is/strings.xml4
-rw-r--r--core/res/res/values-it/strings.xml4
-rw-r--r--core/res/res/values-iw/strings.xml4
-rw-r--r--core/res/res/values-ja/strings.xml4
-rw-r--r--core/res/res/values-ka/strings.xml4
-rw-r--r--core/res/res/values-kk/strings.xml4
-rw-r--r--core/res/res/values-km/strings.xml4
-rw-r--r--core/res/res/values-kn/strings.xml8
-rw-r--r--core/res/res/values-ko/strings.xml4
-rw-r--r--core/res/res/values-ky/strings.xml4
-rw-r--r--core/res/res/values-lo/strings.xml4
-rw-r--r--core/res/res/values-lt/strings.xml4
-rw-r--r--core/res/res/values-lv/strings.xml4
-rw-r--r--core/res/res/values-mk/strings.xml4
-rw-r--r--core/res/res/values-ml/strings.xml4
-rw-r--r--core/res/res/values-mn/strings.xml4
-rw-r--r--core/res/res/values-mr/strings.xml4
-rw-r--r--core/res/res/values-ms/strings.xml4
-rw-r--r--core/res/res/values-my/strings.xml4
-rw-r--r--core/res/res/values-nb/strings.xml4
-rw-r--r--core/res/res/values-ne/strings.xml4
-rw-r--r--core/res/res/values-nl/strings.xml4
-rw-r--r--core/res/res/values-pa/strings.xml4
-rw-r--r--core/res/res/values-pl/strings.xml4
-rw-r--r--core/res/res/values-pt-rBR/strings.xml4
-rw-r--r--core/res/res/values-pt-rPT/strings.xml96
-rw-r--r--core/res/res/values-pt/strings.xml4
-rw-r--r--core/res/res/values-ro/strings.xml4
-rw-r--r--core/res/res/values-ru/strings.xml4
-rw-r--r--core/res/res/values-si/strings.xml4
-rw-r--r--core/res/res/values-sk/strings.xml4
-rw-r--r--core/res/res/values-sl/strings.xml4
-rw-r--r--core/res/res/values-sq/strings.xml4
-rw-r--r--core/res/res/values-sr/strings.xml4
-rw-r--r--core/res/res/values-sv/strings.xml4
-rw-r--r--core/res/res/values-sw/strings.xml4
-rw-r--r--core/res/res/values-ta/strings.xml4
-rw-r--r--core/res/res/values-te/strings.xml4
-rw-r--r--core/res/res/values-th/strings.xml4
-rw-r--r--core/res/res/values-tl/strings.xml4
-rw-r--r--core/res/res/values-tr/strings.xml4
-rw-r--r--core/res/res/values-uk/strings.xml4
-rw-r--r--core/res/res/values-ur/strings.xml4
-rw-r--r--core/res/res/values-uz/strings.xml4
-rw-r--r--core/res/res/values-vi/strings.xml4
-rw-r--r--core/res/res/values-zh-rCN/strings.xml4
-rw-r--r--core/res/res/values-zh-rHK/strings.xml4
-rw-r--r--core/res/res/values-zh-rTW/strings.xml4
-rw-r--r--core/res/res/values-zu/strings.xml4
-rw-r--r--core/res/res/values/attrs.xml6
-rw-r--r--core/res/res/values/attrs_manifest.xml2
-rw-r--r--core/res/res/values/strings.xml30
-rw-r--r--core/res/res/values/symbols.xml2
-rw-r--r--core/tests/coretests/src/android/text/TextUtilsTest.java32
-rw-r--r--core/tests/coretests/src/android/widget/TextViewTest.java29
-rw-r--r--data/etc/privapp-permissions-platform.xml1
-rw-r--r--graphics/java/android/graphics/LeakyTypefaceStorage.java86
-rw-r--r--graphics/java/android/graphics/fonts/FontVariationAxis.java2
-rw-r--r--libs/hwui/Caches.cpp10
-rw-r--r--libs/hwui/Caches.h7
-rw-r--r--libs/hwui/DeviceInfo.cpp12
-rw-r--r--libs/hwui/DeviceInfo.h13
-rw-r--r--libs/hwui/FboCache.cpp2
-rw-r--r--libs/hwui/FontRenderer.cpp23
-rw-r--r--libs/hwui/GradientCache.cpp7
-rw-r--r--libs/hwui/GradientCache.h2
-rw-r--r--libs/hwui/PatchCache.cpp2
-rw-r--r--libs/hwui/PathCache.cpp17
-rw-r--r--libs/hwui/ProgramCache.cpp2
-rw-r--r--libs/hwui/ProgramCache.h2
-rw-r--r--libs/hwui/Properties.cpp38
-rw-r--r--libs/hwui/Properties.h89
-rw-r--r--libs/hwui/RenderBufferCache.cpp10
-rw-r--r--libs/hwui/TessellationCache.cpp2
-rw-r--r--libs/hwui/TextDropShadowCache.cpp2
-rw-r--r--libs/hwui/TextureCache.cpp10
-rw-r--r--libs/hwui/font/FontUtil.h5
-rw-r--r--libs/hwui/renderstate/OffscreenBufferPool.cpp4
-rw-r--r--libs/hwui/renderstate/RenderState.cpp13
-rw-r--r--libs/hwui/renderstate/RenderState.h4
-rw-r--r--libs/hwui/renderstate/Stencil.cpp2
-rw-r--r--libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp4
-rw-r--r--media/java/android/media/browse/MediaBrowser.java15
-rw-r--r--packages/PrintSpooler/res/values-pt-rPT/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ml/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ms/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-pa/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-pt/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml1
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java43
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java8
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java11
-rw-r--r--packages/Shell/AndroidManifest.xml1
-rw-r--r--packages/SystemUI/res-keyguard/values-ja/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml10
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml8
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml8
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java10
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java83
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerShellCommand.java15
-rw-r--r--services/core/java/com/android/server/am/ActivityRecord.java19
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java65
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java587
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java83
-rw-r--r--services/core/java/com/android/server/am/AppErrors.java7
-rw-r--r--services/core/java/com/android/server/am/PendingIntentRecord.java17
-rw-r--r--services/core/java/com/android/server/am/PinnedActivityStack.java7
-rw-r--r--services/core/java/com/android/server/am/TaskRecord.java6
-rw-r--r--services/core/java/com/android/server/input/InputForwarder.java46
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java26
-rw-r--r--services/core/java/com/android/server/notification/ConditionProviders.java6
-rw-r--r--services/core/java/com/android/server/notification/ManagedServices.java58
-rw-r--r--services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java10
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java99
-rw-r--r--services/core/java/com/android/server/notification/RankingHelper.java33
-rw-r--r--services/core/java/com/android/server/notification/XmlUtils.java52
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java1
-rw-r--r--services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java26
-rw-r--r--services/tests/notification/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java25
-rw-r--r--services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java184
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java80
259 files changed, 1853 insertions, 2504 deletions
diff --git a/Android.mk b/Android.mk
index 4695a1970cbc..69c8c2cae858 100644
--- a/Android.mk
+++ b/Android.mk
@@ -71,8 +71,6 @@ LOCAL_SRC_FILES += \
core/java/android/accounts/IAccountManagerResponse.aidl \
core/java/android/accounts/IAccountAuthenticator.aidl \
core/java/android/accounts/IAccountAuthenticatorResponse.aidl \
- core/java/android/app/IActivityContainer.aidl \
- core/java/android/app/IActivityContainerCallback.aidl \
core/java/android/app/IActivityController.aidl \
core/java/android/app/IActivityManager.aidl \
core/java/android/app/IActivityPendingResult.aidl \
@@ -84,6 +82,7 @@ LOCAL_SRC_FILES += \
core/java/android/app/ITaskStackListener.aidl \
core/java/android/app/IBackupAgent.aidl \
core/java/android/app/IEphemeralResolver.aidl \
+ core/java/android/app/IInputForwarder.aidl \
core/java/android/app/IInstantAppResolver.aidl \
core/java/android/app/IInstrumentationWatcher.aidl \
core/java/android/app/INotificationManager.aidl \
diff --git a/api/system-current.txt b/api/system-current.txt
index 47e47ac6f1be..fc4a5bc2a715 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -22,6 +22,7 @@ package android {
field public static final java.lang.String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER";
field public static final java.lang.String ACCESS_WIFI_STATE = "android.permission.ACCESS_WIFI_STATE";
field public static final java.lang.String ACCOUNT_MANAGER = "android.permission.ACCOUNT_MANAGER";
+ field public static final java.lang.String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
field public static final java.lang.String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
field public static final java.lang.String ALLOCATE_AGGRESSIVE = "android.permission.ALLOCATE_AGGRESSIVE";
field public static final java.lang.String ALLOW_ANY_CODEC_FOR_PLAYBACK = "android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK";
@@ -11638,6 +11639,7 @@ package android.content.pm {
field public int flags;
field public java.lang.CharSequence nonLocalizedDescription;
field public int priority;
+ field public int requestRes;
}
public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
@@ -11671,6 +11673,7 @@ package android.content.pm {
field public java.lang.String group;
field public java.lang.CharSequence nonLocalizedDescription;
field public int protectionLevel;
+ field public int requestRes;
}
public final class ProviderInfo extends android.content.pm.ComponentInfo implements android.os.Parcelable {
diff --git a/api/test-current.txt b/api/test-current.txt
index 62f8418b4a71..225a749c427c 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -41759,6 +41759,13 @@ package android.text {
field public static final java.lang.Object SELECTION_START;
}
+ public static final class Selection.MemoryTextWatcher implements android.text.TextWatcher {
+ ctor public Selection.MemoryTextWatcher();
+ method public void afterTextChanged(android.text.Editable);
+ method public void beforeTextChanged(java.lang.CharSequence, int, int, int);
+ method public void onTextChanged(java.lang.CharSequence, int, int, int);
+ }
+
public abstract interface SpanWatcher implements android.text.NoCopySpan {
method public abstract void onSpanAdded(android.text.Spannable, java.lang.Object, int, int);
method public abstract void onSpanChanged(android.text.Spannable, java.lang.Object, int, int, int, int);
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index f003061cec3a..ab075ee0e9f2 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -16,70 +16,25 @@
package com.android.commands.am;
-import static android.app.ActivityManager.RESIZE_MODE_SYSTEM;
-import static android.app.ActivityManager.RESIZE_MODE_USER;
-import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-
import android.app.ActivityManager;
-import android.app.ActivityManager.StackInfo;
-import android.app.IActivityContainer;
-import android.app.IActivityController;
import android.app.IActivityManager;
-import android.app.IInstrumentationWatcher;
-import android.app.Instrumentation;
-import android.app.IStopUserCallback;
-import android.app.ProfilerInfo;
-import android.app.UiAutomationConnection;
-import android.app.usage.ConfigurationStats;
-import android.app.usage.IUsageStatsManager;
-import android.app.usage.UsageStatsManager;
-import android.content.ComponentCallbacks2;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.IIntentReceiver;
-import android.content.Intent;
import android.content.pm.IPackageManager;
-import android.content.pm.InstrumentationInfo;
-import android.content.pm.ParceledListSlice;
-import android.content.pm.UserInfo;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.SELinux;
import android.os.ServiceManager;
import android.os.ShellCallback;
-import android.os.ShellCommand;
-import android.os.SystemProperties;
import android.os.UserHandle;
-import android.text.TextUtils;
import android.util.AndroidException;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.view.IWindowManager;
import com.android.internal.os.BaseCommand;
-import com.android.internal.util.HexDump;
-import com.android.internal.util.Preconditions;
-import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.InputStreamReader;
import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
public class Am extends BaseCommand {
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index 29b83dc3b315..5dd47acfb940 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -1,5 +1,5 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
+/**
+ * Copyright (c) 2017 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.
@@ -16,17 +16,12 @@
package android.app;
-import static android.app.ActivityManager.START_CANCELED;
-
+import android.annotation.NonNull;
import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.IIntentSender;
import android.content.Intent;
-import android.content.IntentSender;
-import android.graphics.SurfaceTexture;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.OperationCanceledException;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.VirtualDisplay;
+import android.hardware.input.InputManager;
import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
@@ -35,163 +30,177 @@ import android.view.InputDevice;
import android.view.InputEvent;
import android.view.MotionEvent;
import android.view.Surface;
-import android.view.TextureView;
-import android.view.TextureView.SurfaceTextureListener;
-import android.view.View;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
import android.view.ViewGroup;
import android.view.WindowManager;
-import dalvik.system.CloseGuard;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayDeque;
-import java.util.concurrent.Executor;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import com.android.internal.annotations.GuardedBy;
+import dalvik.system.CloseGuard;
-/** @hide */
+/**
+ * Activity container that allows launching activities into itself and does input forwarding.
+ * <p>Creation of this view is only allowed to callers who have
+ * {@link android.Manifest.permission#INJECT_EVENTS} permission.
+ * <p>Activity launching into this container is restricted by the same rules that apply to launching
+ * on VirtualDisplays.
+ * @hide
+ */
public class ActivityView extends ViewGroup {
- private static final String TAG = "ActivityView";
- private static final boolean DEBUG = false;
-
- private static final int MSG_SET_SURFACE = 1;
-
- private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
- private static final int MINIMUM_POOL_SIZE = 1;
- private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
- private static final int KEEP_ALIVE = 1;
-
- private static final ThreadFactory sThreadFactory = new ThreadFactory() {
- private final AtomicInteger mCount = new AtomicInteger(1);
-
- public Thread newThread(Runnable r) {
- return new Thread(r, "ActivityView #" + mCount.getAndIncrement());
- }
- };
-
- private static final BlockingQueue<Runnable> sPoolWorkQueue =
- new LinkedBlockingQueue<Runnable>(128);
- /**
- * An {@link Executor} that can be used to execute tasks in parallel.
- */
- private static final Executor sExecutor = new ThreadPoolExecutor(MINIMUM_POOL_SIZE,
- MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
-
-
- private static class SerialExecutor implements Executor {
- private final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
- private Runnable mActive;
-
- public synchronized void execute(final Runnable r) {
- mTasks.offer(new Runnable() {
- public void run() {
- try {
- r.run();
- } finally {
- scheduleNext();
- }
- }
- });
- if (mActive == null) {
- scheduleNext();
- }
- }
-
- protected synchronized void scheduleNext() {
- if ((mActive = mTasks.poll()) != null) {
- sExecutor.execute(mActive);
- }
- }
- }
-
- private final SerialExecutor mExecutor = new SerialExecutor();
+ private static final String DISPLAY_NAME = "ActivityViewVirtualDisplay";
+ private static final String TAG = "ActivityView";
- private final int mDensityDpi;
- private final TextureView mTextureView;
+ private VirtualDisplay mVirtualDisplay;
+ private final SurfaceView mSurfaceView;
+ private Surface mSurface;
- @GuardedBy("mActivityContainerLock")
- private ActivityContainerWrapper mActivityContainer;
- private Object mActivityContainerLock = new Object();
+ private final SurfaceCallback mSurfaceCallback;
+ private StateCallback mActivityViewCallback;
- private Activity mActivity;
- private int mWidth;
- private int mHeight;
- private Surface mSurface;
- private int mLastVisibility;
- private ActivityViewCallback mActivityViewCallback;
+ private IInputForwarder mInputForwarder;
+ private final CloseGuard mGuard = CloseGuard.get();
+ private boolean mOpened; // Protected by mGuard.
public ActivityView(Context context) {
- this(context, null);
+ this(context, null /* attrs */);
}
public ActivityView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
+ this(context, attrs, 0 /* defStyle */);
}
public ActivityView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- while (context instanceof ContextWrapper) {
- if (context instanceof Activity) {
- mActivity = (Activity)context;
- break;
- }
- context = ((ContextWrapper)context).getBaseContext();
- }
- if (mActivity == null) {
- throw new IllegalStateException("The ActivityView's Context is not an Activity.");
- }
+ mSurfaceView = new SurfaceView(context);
+ mSurfaceCallback = new SurfaceCallback();
+ mSurfaceView.getHolder().addCallback(mSurfaceCallback);
+ addView(mSurfaceView);
- try {
- mActivityContainer = new ActivityContainerWrapper(
- ActivityManager.getService().createVirtualActivityContainer(
- mActivity.getActivityToken(), new ActivityContainerCallback(this)));
- } catch (RemoteException e) {
- throw new RuntimeException("ActivityView: Unable to create ActivityContainer. "
- + e);
- }
+ mOpened = true;
+ mGuard.open("release");
+ }
- mTextureView = new TextureView(context);
- mTextureView.setSurfaceTextureListener(new ActivityViewSurfaceTextureListener());
- addView(mTextureView);
+ /** Callback that notifies when the container is ready or destroyed. */
+ public abstract static class StateCallback {
+ /**
+ * Called when the container is ready for launching activities. Calling
+ * {@link #startActivity(Intent)} prior to this callback will result in an
+ * {@link IllegalStateException}.
+ *
+ * @see #startActivity(Intent)
+ */
+ public abstract void onActivityViewReady(ActivityView view);
+ /**
+ * Called when the container can no longer launch activities. Calling
+ * {@link #startActivity(Intent)} after this callback will result in an
+ * {@link IllegalStateException}.
+ *
+ * @see #startActivity(Intent)
+ */
+ public abstract void onActivityViewDestroyed(ActivityView view);
+ }
- WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);
- DisplayMetrics metrics = new DisplayMetrics();
- wm.getDefaultDisplay().getMetrics(metrics);
- mDensityDpi = metrics.densityDpi;
+ /**
+ * Set the callback to be notified about state changes.
+ * <p>This class must finish initializing before {@link #startActivity(Intent)} can be called.
+ * <p>Note: If the instance was ready prior to this call being made, then
+ * {@link StateCallback#onActivityViewReady(ActivityView)} will be called from within
+ * this method call.
+ *
+ * @param callback The callback to report events to.
+ *
+ * @see StateCallback
+ * @see #startActivity(Intent)
+ */
+ public void setCallback(StateCallback callback) {
+ mActivityViewCallback = callback;
- mLastVisibility = getVisibility();
+ if (mVirtualDisplay != null && mActivityViewCallback != null) {
+ mActivityViewCallback.onActivityViewReady(this);
+ }
+ }
- if (DEBUG) Log.v(TAG, "ctor()");
+ /**
+ * Launch a new activity into this container.
+ * <p>Activity resolved by the provided {@link Intent} must have
+ * {@link android.R.attr#resizeableActivity} attribute set to {@code true} in order to be
+ * launched here. Also, if activity is not owned by the owner of this container, it must allow
+ * embedding and the caller must have permission to embed.
+ * <p>Note: This class must finish initializing and
+ * {@link StateCallback#onActivityViewReady(ActivityView)} callback must be triggered before
+ * this method can be called.
+ *
+ * @param intent Intent used to launch an activity.
+ *
+ * @see StateCallback
+ * @see #startActivity(PendingIntent)
+ */
+ public void startActivity(@NonNull Intent intent) {
+ final ActivityOptions options = prepareActivityOptions();
+ getContext().startActivity(intent, options.toBundle());
}
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- mTextureView.layout(0, 0, r - l, b - t);
+ /**
+ * Launch a new activity into this container.
+ * <p>Activity resolved by the provided {@link PendingIntent} must have
+ * {@link android.R.attr#resizeableActivity} attribute set to {@code true} in order to be
+ * launched here. Also, if activity is not owned by the owner of this container, it must allow
+ * embedding and the caller must have permission to embed.
+ * <p>Note: This class must finish initializing and
+ * {@link StateCallback#onActivityViewReady(ActivityView)} callback must be triggered before
+ * this method can be called.
+ *
+ * @param pendingIntent Intent used to launch an activity.
+ *
+ * @see StateCallback
+ * @see #startActivity(Intent)
+ */
+ public void startActivity(@NonNull PendingIntent pendingIntent) {
+ final ActivityOptions options = prepareActivityOptions();
+ try {
+ pendingIntent.send(null /* context */, 0 /* code */, null /* intent */,
+ null /* onFinished */, null /* handler */, null /* requiredPermission */,
+ options.toBundle());
+ } catch (PendingIntent.CanceledException e) {
+ throw new RuntimeException(e);
+ }
}
- @Override
- protected void onVisibilityChanged(View changedView, final int visibility) {
- super.onVisibilityChanged(changedView, visibility);
+ /**
+ * Check if container is ready to launch and create {@link ActivityOptions} to target the
+ * virtual display.
+ */
+ private ActivityOptions prepareActivityOptions() {
+ if (mVirtualDisplay == null) {
+ throw new IllegalStateException(
+ "Trying to start activity before ActivityView is ready.");
+ }
+ final ActivityOptions options = ActivityOptions.makeBasic();
+ options.setLaunchDisplayId(mVirtualDisplay.getDisplay().getDisplayId());
+ return options;
+ }
- if (mSurface != null && (visibility == View.GONE || mLastVisibility == View.GONE)) {
- if (DEBUG) Log.v(TAG, "visibility changed; enqueing runnable");
- final Surface surface = (visibility == View.GONE) ? null : mSurface;
- setSurfaceAsync(surface, mWidth, mHeight, mDensityDpi, false);
+ /**
+ * Release this container. Activity launching will no longer be permitted.
+ * <p>Note: Calling this method is allowed after
+ * {@link StateCallback#onActivityViewReady(ActivityView)} callback was triggered and before
+ * {@link StateCallback#onActivityViewDestroyed(ActivityView)}.
+ *
+ * @see StateCallback
+ */
+ public void release() {
+ if (mVirtualDisplay == null) {
+ throw new IllegalStateException(
+ "Trying to release container that is not initialized.");
}
- mLastVisibility = visibility;
+ performRelease();
}
- private boolean injectInputEvent(InputEvent event) {
- return mActivityContainer != null && mActivityContainer.injectEvent(event);
+ @Override
+ public void onLayout(boolean changed, int l, int t, int r, int b) {
+ mSurfaceView.layout(0 /* left */, 0 /* top */, r - l /* right */, b - t /* bottom */);
}
@Override
@@ -209,309 +218,118 @@ public class ActivityView extends ViewGroup {
return super.onGenericMotionEvent(event);
}
- @Override
- public void onAttachedToWindow() {
- if (DEBUG) Log.v(TAG, "onAttachedToWindow(): mActivityContainer=" + mActivityContainer +
- " mSurface=" + mSurface);
- }
-
- @Override
- public void onDetachedFromWindow() {
- if (DEBUG) Log.v(TAG, "onDetachedFromWindow(): mActivityContainer=" + mActivityContainer +
- " mSurface=" + mSurface);
- }
-
- public boolean isAttachedToDisplay() {
- return mSurface != null;
- }
-
- public void startActivity(Intent intent) {
- if (mActivityContainer == null) {
- throw new IllegalStateException("Attempt to call startActivity after release");
- }
- if (mSurface == null) {
- throw new IllegalStateException("Surface not yet created.");
- }
- if (DEBUG) Log.v(TAG, "startActivity(): intent=" + intent + " " +
- (isAttachedToDisplay() ? "" : "not") + " attached");
- if (mActivityContainer.startActivity(intent) == START_CANCELED) {
- throw new OperationCanceledException();
- }
- }
-
- public void startActivity(IntentSender intentSender) {
- if (mActivityContainer == null) {
- throw new IllegalStateException("Attempt to call startActivity after release");
- }
- if (mSurface == null) {
- throw new IllegalStateException("Surface not yet created.");
- }
- if (DEBUG) Log.v(TAG, "startActivityIntentSender(): intentSender=" + intentSender + " " +
- (isAttachedToDisplay() ? "" : "not") + " attached");
- final IIntentSender iIntentSender = intentSender.getTarget();
- if (mActivityContainer.startActivityIntentSender(iIntentSender) == START_CANCELED) {
- throw new OperationCanceledException();
- }
- }
-
- public void startActivity(PendingIntent pendingIntent) {
- if (mActivityContainer == null) {
- throw new IllegalStateException("Attempt to call startActivity after release");
- }
- if (mSurface == null) {
- throw new IllegalStateException("Surface not yet created.");
- }
- if (DEBUG) Log.v(TAG, "startActivityPendingIntent(): PendingIntent=" + pendingIntent + " "
- + (isAttachedToDisplay() ? "" : "not") + " attached");
- final IIntentSender iIntentSender = pendingIntent.getTarget();
- if (mActivityContainer.startActivityIntentSender(iIntentSender) == START_CANCELED) {
- throw new OperationCanceledException();
- }
- }
-
- public void release() {
- if (DEBUG) Log.v(TAG, "release() mActivityContainer=" + mActivityContainer +
- " mSurface=" + mSurface);
- if (mActivityContainer == null) {
- Log.e(TAG, "Duplicate call to release");
- return;
- }
- synchronized (mActivityContainerLock) {
- mActivityContainer.release();
- mActivityContainer = null;
- }
-
- if (mSurface != null) {
- mSurface.release();
- mSurface = null;
- }
-
- mTextureView.setSurfaceTextureListener(null);
- }
-
- private void setSurfaceAsync(final Surface surface, final int width, final int height,
- final int densityDpi, final boolean callback) {
- mExecutor.execute(new Runnable() {
- public void run() {
- try {
- synchronized (mActivityContainerLock) {
- if (mActivityContainer != null) {
- mActivityContainer.setSurface(surface, width, height, densityDpi);
- }
- }
- } catch (RemoteException e) {
- throw new RuntimeException(
- "ActivityView: Unable to set surface of ActivityContainer. ",
- e);
- }
- if (callback) {
- post(new Runnable() {
- @Override
- public void run() {
- if (mActivityViewCallback != null) {
- if (surface != null) {
- mActivityViewCallback.onSurfaceAvailable(ActivityView.this);
- } else {
- mActivityViewCallback.onSurfaceDestroyed(ActivityView.this);
- }
- }
- }
- });
- }
+ private boolean injectInputEvent(InputEvent event) {
+ if (mInputForwarder != null) {
+ try {
+ return mInputForwarder.forwardEvent(event);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
}
- });
- }
-
- /**
- * Set the callback to use to report certain state changes.
- *
- * Note: If the surface has been created prior to this call being made, then
- * ActivityViewCallback.onSurfaceAvailable will be called from within setCallback.
- *
- * @param callback The callback to report events to.
- *
- * @see ActivityViewCallback
- */
- public void setCallback(ActivityViewCallback callback) {
- mActivityViewCallback = callback;
-
- if (mSurface != null) {
- mActivityViewCallback.onSurfaceAvailable(this);
}
+ return false;
}
- public static abstract class ActivityViewCallback {
- /**
- * Called when all activities in the ActivityView have completed and been removed. Register
- * using {@link ActivityView#setCallback(ActivityViewCallback)}. Each ActivityView may
- * have at most one callback registered.
- */
- public abstract void onAllActivitiesComplete(ActivityView view);
- /**
- * Called when the surface is ready to be drawn to. Calling startActivity prior to this
- * callback will result in an IllegalStateException.
- */
- public abstract void onSurfaceAvailable(ActivityView view);
- /**
- * Called when the surface has been removed. Calling startActivity after this callback
- * will result in an IllegalStateException.
- */
- public abstract void onSurfaceDestroyed(ActivityView view);
- }
-
- private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener {
+ private class SurfaceCallback implements SurfaceHolder.Callback {
@Override
- public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
- int height) {
- if (mActivityContainer == null) {
- return;
+ public void surfaceCreated(SurfaceHolder surfaceHolder) {
+ if (mVirtualDisplay == null) {
+ mSurface = mSurfaceView.getHolder().getSurface();
+ initVirtualDisplay();
+ if (mVirtualDisplay != null && mActivityViewCallback != null) {
+ mActivityViewCallback.onActivityViewReady(ActivityView.this);
+ }
+ } else {
+ mVirtualDisplay.setSurface(surfaceHolder.getSurface());
}
- if (DEBUG) Log.d(TAG, "onSurfaceTextureAvailable: width=" + width + " height="
- + height);
- mWidth = width;
- mHeight = height;
- mSurface = new Surface(surfaceTexture);
- setSurfaceAsync(mSurface, mWidth, mHeight, mDensityDpi, true);
}
@Override
- public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width,
- int height) {
- if (mActivityContainer == null) {
- return;
+ public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
+ if (mVirtualDisplay != null) {
+ mVirtualDisplay.resize(width, height, getBaseDisplayDensity());
}
- if (DEBUG) Log.d(TAG, "onSurfaceTextureSizeChanged: w=" + width + " h=" + height);
}
@Override
- public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
- if (mActivityContainer == null) {
- return true;
- }
- if (DEBUG) Log.d(TAG, "onSurfaceTextureDestroyed");
+ public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
mSurface.release();
mSurface = null;
- setSurfaceAsync(null, mWidth, mHeight, mDensityDpi, true);
- return true;
- }
-
- @Override
- public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
-// Log.d(TAG, "onSurfaceTextureUpdated");
+ if (mVirtualDisplay != null) {
+ mVirtualDisplay.setSurface(null);
+ }
}
-
}
- private static class ActivityContainerCallback extends IActivityContainerCallback.Stub {
- private final WeakReference<ActivityView> mActivityViewWeakReference;
-
- ActivityContainerCallback(ActivityView activityView) {
- mActivityViewWeakReference = new WeakReference<>(activityView);
+ private void initVirtualDisplay() {
+ if (mVirtualDisplay != null) {
+ throw new IllegalStateException("Trying to initialize for the second time.");
}
- @Override
- public void setVisible(IBinder container, boolean visible) {
- if (DEBUG) Log.v(TAG, "setVisible(): container=" + container + " visible=" + visible +
- " ActivityView=" + mActivityViewWeakReference.get());
+ final int width = mSurfaceView.getWidth();
+ final int height = mSurfaceView.getHeight();
+ final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
+ mVirtualDisplay = displayManager.createVirtualDisplay(
+ DISPLAY_NAME + "@" + System.identityHashCode(this),
+ width, height, getBaseDisplayDensity(), mSurface, 0 /* flags */);
+ if (mVirtualDisplay == null) {
+ Log.e(TAG, "Failed to initialize ActivityView");
+ return;
}
- @Override
- public void onAllActivitiesComplete(IBinder container) {
- final ActivityView activityView = mActivityViewWeakReference.get();
- if (activityView != null) {
- final ActivityViewCallback callback = activityView.mActivityViewCallback;
- if (callback != null) {
- final WeakReference<ActivityViewCallback> callbackRef =
- new WeakReference<>(callback);
- activityView.post(new Runnable() {
- @Override
- public void run() {
- ActivityViewCallback callback = callbackRef.get();
- if (callback != null) {
- callback.onAllActivitiesComplete(activityView);
- }
- }
- });
- }
- }
- }
+ mInputForwarder = InputManager.getInstance().createInputForwarder(
+ mVirtualDisplay.getDisplay().getDisplayId());
}
- private static class ActivityContainerWrapper {
- private final IActivityContainer mIActivityContainer;
- private final CloseGuard mGuard = CloseGuard.get();
- boolean mOpened; // Protected by mGuard.
-
- ActivityContainerWrapper(IActivityContainer container) {
- mIActivityContainer = container;
- mOpened = true;
- mGuard.open("release");
+ private void performRelease() {
+ if (!mOpened) {
+ return;
}
- void setSurface(Surface surface, int width, int height, int density)
- throws RemoteException {
- mIActivityContainer.setSurface(surface, width, height, density);
- }
+ mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
- int startActivity(Intent intent) {
- try {
- return mIActivityContainer.startActivity(intent);
- } catch (RemoteException e) {
- throw new RuntimeException("ActivityView: Unable to startActivity. " + e);
- }
+ if (mInputForwarder != null) {
+ mInputForwarder = null;
}
- int startActivityIntentSender(IIntentSender intentSender) {
- try {
- return mIActivityContainer.startActivityIntentSender(intentSender);
- } catch (RemoteException e) {
- throw new RuntimeException(
- "ActivityView: Unable to startActivity from IntentSender. " + e);
- }
+ final boolean displayReleased;
+ if (mVirtualDisplay != null) {
+ mVirtualDisplay.release();
+ mVirtualDisplay = null;
+ displayReleased = true;
+ } else {
+ displayReleased = false;
}
- int getDisplayId() {
- try {
- return mIActivityContainer.getDisplayId();
- } catch (RemoteException e) {
- return -1;
- }
+ if (mSurface != null) {
+ mSurface.release();
+ mSurface = null;
}
- boolean injectEvent(InputEvent event) {
- try {
- return mIActivityContainer.injectEvent(event);
- } catch (RemoteException e) {
- return false;
- }
+ if (displayReleased && mActivityViewCallback != null) {
+ mActivityViewCallback.onActivityViewDestroyed(this);
}
- void release() {
- synchronized (mGuard) {
- if (mOpened) {
- if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: release called");
- try {
- mIActivityContainer.release();
- mGuard.close();
- } catch (RemoteException e) {
- }
- mOpened = false;
- }
- }
- }
+ mGuard.close();
+ mOpened = false;
+ }
- @Override
- protected void finalize() throws Throwable {
- if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: finalize called");
- try {
- if (mGuard != null) {
- mGuard.warnIfOpen();
- release();
- }
- } finally {
- super.finalize();
+ /** Get density of the hosting display. */
+ private int getBaseDisplayDensity() {
+ final WindowManager wm = mContext.getSystemService(WindowManager.class);
+ final DisplayMetrics metrics = new DisplayMetrics();
+ wm.getDefaultDisplay().getMetrics(metrics);
+ return metrics.densityDpi;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ if (mGuard != null) {
+ mGuard.warnIfOpen();
+ performRelease();
}
+ } finally {
+ super.finalize();
}
-
}
}
diff --git a/core/java/android/app/IActivityContainer.aidl b/core/java/android/app/IActivityContainer.aidl
deleted file mode 100644
index 1ff3c87bef6e..000000000000
--- a/core/java/android/app/IActivityContainer.aidl
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright (c) 2013, 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 android.app;
-
-import android.app.IActivityContainerCallback;
-import android.content.Intent;
-import android.content.IIntentSender;
-import android.os.IBinder;
-import android.view.InputEvent;
-import android.view.Surface;
-
-/** @hide */
-interface IActivityContainer {
- void addToDisplay(int displayId);
- void setSurface(in Surface surface, int width, int height, int density);
- int startActivity(in Intent intent);
- int startActivityIntentSender(in IIntentSender intentSender);
- int getDisplayId();
- int getStackId();
- boolean injectEvent(in InputEvent event);
- void release();
-}
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index df1a412d464e..fa9d7ca8ebc5 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -20,8 +20,6 @@ import android.app.ActivityManager;
import android.app.ApplicationErrorReport;
import android.app.ContentProviderHolder;
import android.app.IApplicationThread;
-import android.app.IActivityContainer;
-import android.app.IActivityContainerCallback;
import android.app.IActivityController;
import android.app.IAppTask;
import android.app.IInstrumentationWatcher;
@@ -355,8 +353,6 @@ interface IActivityManager {
void killUid(int appId, int userId, in String reason);
void setUserIsMonkey(boolean monkey);
void hang(in IBinder who, boolean allowRestart);
- IActivityContainer createVirtualActivityContainer(in IBinder parentActivityToken,
- in IActivityContainerCallback callback);
void moveTaskToStack(int taskId, int stackId, boolean toTop);
/**
* Resizes the input stack id to the given bounds.
@@ -436,7 +432,7 @@ interface IActivityManager {
// Start of M transactions
void notifyCleartextNetwork(int uid, in byte[] firstPacket);
- IActivityContainer createStackOnDisplay(int displayId);
+ int createStackOnDisplay(int displayId);
int getFocusedStackId();
void setTaskResizeable(int taskId, int resizeableMode);
boolean requestAssistContextExtras(int requestType, in IResultReceiver receiver,
diff --git a/core/java/android/app/IActivityContainerCallback.aidl b/core/java/android/app/IInputForwarder.aidl
index 99d0a6f8189e..d6be63eb54e5 100644
--- a/core/java/android/app/IActivityContainerCallback.aidl
+++ b/core/java/android/app/IInputForwarder.aidl
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2013, The Android Open Source Project
+ * Copyright (c) 2017, 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.
@@ -16,10 +16,14 @@
package android.app;
-import android.os.IBinder;
+import android.view.InputEvent;
-/** @hide */
-interface IActivityContainerCallback {
- oneway void setVisible(IBinder container, boolean visible);
- oneway void onAllActivitiesComplete(IBinder container);
-}
+/**
+ * Forwards input events into owned activity container, used in {@link android.app.ActivityView}.
+ * To forward input to other apps {@link android.Manifest.permission.INJECT_EVENTS} permission is
+ * required.
+ * @hide
+ */
+interface IInputForwarder {
+ boolean forwardEvent(in InputEvent event);
+} \ No newline at end of file
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index c76ca6dbbe49..640eee69f8a4 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -3145,6 +3145,8 @@ public class PackageParser {
perm.info.descriptionRes = sa.getResourceId(
com.android.internal.R.styleable.AndroidManifestPermissionGroup_description,
0);
+ perm.info.requestRes = sa.getResourceId(
+ com.android.internal.R.styleable.AndroidManifestPermissionGroup_request, 0);
perm.info.flags = sa.getInt(
com.android.internal.R.styleable.AndroidManifestPermissionGroup_permissionGroupFlags, 0);
perm.info.priority = sa.getInt(
@@ -3199,6 +3201,9 @@ public class PackageParser {
com.android.internal.R.styleable.AndroidManifestPermission_description,
0);
+ perm.info.requestRes = sa.getResourceId(
+ com.android.internal.R.styleable.AndroidManifestPermission_request, 0);
+
perm.info.protectionLevel = sa.getInt(
com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel,
PermissionInfo.PROTECTION_NORMAL);
@@ -3273,6 +3278,7 @@ public class PackageParser {
}
perm.info.descriptionRes = 0;
+ perm.info.requestRes = 0;
perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL;
perm.tree = true;
diff --git a/core/java/android/content/pm/PermissionGroupInfo.java b/core/java/android/content/pm/PermissionGroupInfo.java
index 452bf0d2b6a1..7c4478d0b689 100644
--- a/core/java/android/content/pm/PermissionGroupInfo.java
+++ b/core/java/android/content/pm/PermissionGroupInfo.java
@@ -16,6 +16,8 @@
package android.content.pm;
+import android.annotation.StringRes;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -34,6 +36,15 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
public int descriptionRes;
/**
+ * A string resource identifier (in the package's resources) used to request the permissions.
+ * From the "request" attribute or, if not set, 0.
+ *
+ * @hide
+ */
+ @SystemApi
+ public @StringRes int requestRes;
+
+ /**
* The description string provided in the AndroidManifest file, if any. You
* probably don't want to use this, since it will be null if the description
* is in a resource. You probably want
@@ -64,6 +75,7 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
public PermissionGroupInfo(PermissionGroupInfo orig) {
super(orig);
descriptionRes = orig.descriptionRes;
+ requestRes = orig.requestRes;
nonLocalizedDescription = orig.nonLocalizedDescription;
flags = orig.flags;
priority = orig.priority;
@@ -106,6 +118,7 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
public void writeToParcel(Parcel dest, int parcelableFlags) {
super.writeToParcel(dest, parcelableFlags);
dest.writeInt(descriptionRes);
+ dest.writeInt(requestRes);
TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags);
dest.writeInt(flags);
dest.writeInt(priority);
@@ -124,6 +137,7 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
private PermissionGroupInfo(Parcel source) {
super(source);
descriptionRes = source.readInt();
+ requestRes = source.readInt();
nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
flags = source.readInt();
priority = source.readInt();
diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java
index 694e60781546..71a632189796 100644
--- a/core/java/android/content/pm/PermissionInfo.java
+++ b/core/java/android/content/pm/PermissionInfo.java
@@ -198,6 +198,15 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
public int descriptionRes;
/**
+ * A string resource identifier (in the package's resources) used to request the permissions.
+ * From the "request" attribute or, if not set, 0.
+ *
+ * @hide
+ */
+ @SystemApi
+ public int requestRes;
+
+ /**
* The description string provided in the AndroidManifest file, if any. You
* probably don't want to use this, since it will be null if the description
* is in a resource. You probably want
@@ -272,6 +281,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
flags = orig.flags;
group = orig.group;
descriptionRes = orig.descriptionRes;
+ requestRes = orig.requestRes;
nonLocalizedDescription = orig.nonLocalizedDescription;
}
@@ -315,6 +325,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
dest.writeInt(flags);
dest.writeString(group);
dest.writeInt(descriptionRes);
+ dest.writeInt(requestRes);
TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags);
}
@@ -334,6 +345,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
flags = source.readInt();
group = source.readString();
descriptionRes = source.readInt();
+ requestRes = source.readInt();
nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
}
}
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl
index 45863167fa1b..9e0c680cafa1 100644
--- a/core/java/android/hardware/input/IInputManager.aidl
+++ b/core/java/android/hardware/input/IInputManager.aidl
@@ -16,6 +16,7 @@
package android.hardware.input;
+import android.app.IInputForwarder;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.KeyboardLayout;
import android.hardware.input.IInputDevicesChangedListener;
@@ -88,4 +89,7 @@ interface IInputManager {
void setCustomPointerIcon(in PointerIcon icon);
void requestPointerCapture(IBinder windowToken, boolean enabled);
+
+ /** Create input forwarder to deliver touch events to owned display. */
+ IInputForwarder createInputForwarder(int displayId);
}
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index 4898c1a0802f..c531a899f45d 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -19,8 +19,9 @@ package android.hardware.input;
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
-import android.annotation.SystemService;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SystemService;
+import android.app.IInputForwarder;
import android.content.Context;
import android.media.AudioAttributes;
import android.os.Binder;
@@ -971,6 +972,25 @@ public final class InputManager {
}
}
+
+ /**
+ * Create an {@link IInputForwarder} targeted to provided display.
+ * {@link android.Manifest.permission.INJECT_EVENTS} permission is required to call this method.
+ *
+ * @param displayId Id of the target display where input events should be forwarded.
+ * Display must exist and must be owned by the caller.
+ * @return The forwarder instance.
+ *
+ * @hide
+ */
+ public IInputForwarder createInputForwarder(int displayId) {
+ try {
+ return mIm.createInputForwarder(displayId);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
private void populateInputDevicesLocked() {
if (mInputDevicesChangedListener == null) {
final InputDevicesChangedListener listener = new InputDevicesChangedListener();
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index 4bdcdb097df6..fa87631b5f9e 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -66,6 +66,8 @@ import android.util.Log;
import libcore.io.IoUtils;
import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.LinkedList;
import java.util.Objects;
@@ -633,6 +635,29 @@ public abstract class DocumentsProvider extends ContentProvider {
}
/**
+ * Returns metadata for arbitrary file given its stream and mimetype.
+ *
+ * <p><b>Note: Providers should only call this with streams for locally cached resources.
+ * Use of network backed streams is inadvisable for performance reasons.
+ *
+ * @param stream The input stream. Should be backed by locally cached content.
+ * Client retains ownership of the stream.
+ * @param mimeType The mime type of the file.
+ * @param tags The list of tags to load, if known. Pass null to get a default set.
+ * @return Bundle containing any metadata found.
+ * @throws IOException in the event of an error reading metadata.
+ *
+ * @hide
+ */
+ protected Bundle getDocumentMetadataFromStream(
+ InputStream stream, String mimeType, @Nullable String[] tags)
+ throws IOException {
+ Bundle metadata = new Bundle();
+ MetadataReader.getMetadata(metadata, stream, mimeType, tags);
+ return metadata;
+ }
+
+ /**
* Return concrete MIME type of the requested document. Must match the value
* of {@link Document#COLUMN_MIME_TYPE} for this document. The default
* implementation queries {@link #queryDocument(String, String[])}, so
@@ -685,7 +710,9 @@ public abstract class DocumentsProvider extends ContentProvider {
* @see ParcelFileDescriptor#parseMode(String)
*/
public abstract ParcelFileDescriptor openDocument(
- String documentId, String mode, CancellationSignal signal) throws FileNotFoundException;
+ String documentId,
+ String mode,
+ @Nullable CancellationSignal signal) throws FileNotFoundException;
/**
* Open and return a thumbnail of the requested document.
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index b22501823020..6ba11b9954c4 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -85,7 +85,7 @@ public class ZenModeConfig implements Parcelable {
private static final boolean DEFAULT_ALLOW_SCREEN_ON = true;
private static final int XML_VERSION = 2;
- private static final String ZEN_TAG = "zen";
+ public static final String ZEN_TAG = "zen";
private static final String ZEN_ATT_VERSION = "version";
private static final String ZEN_ATT_USER = "user";
private static final String ALLOW_TAG = "allow";
diff --git a/core/java/android/text/BoringLayout.java b/core/java/android/text/BoringLayout.java
index eddfe033713e..ce38ebb9bea7 100644
--- a/core/java/android/text/BoringLayout.java
+++ b/core/java/android/text/BoringLayout.java
@@ -35,46 +35,80 @@ import android.text.style.ParagraphStyle;
* Canvas.drawText()} directly.</p>
*/
public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback {
- public static BoringLayout make(CharSequence source,
- TextPaint paint, int outerwidth,
- Alignment align,
- float spacingmult, float spacingadd,
- BoringLayout.Metrics metrics, boolean includepad) {
- return new BoringLayout(source, paint, outerwidth, align,
- spacingmult, spacingadd, metrics,
- includepad);
+
+ /**
+ * Utility function to construct a BoringLayout instance.
+ *
+ * @param source the text to render
+ * @param paint the default paint for the layout
+ * @param outerWidth the wrapping width for the text
+ * @param align whether to left, right, or center the text
+ * @param spacingMult this value is no longer used by BoringLayout
+ * @param spacingAdd this value is no longer used by BoringLayout
+ * @param metrics {@code #Metrics} instance that contains information about FontMetrics and
+ * line width
+ * @param includePad set whether to include extra space beyond font ascent and descent which is
+ * needed to avoid clipping in some scripts
+ */
+ public static BoringLayout make(CharSequence source, TextPaint paint, int outerWidth,
+ Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics,
+ boolean includePad) {
+ return new BoringLayout(source, paint, outerWidth, align, spacingMult, spacingAdd, metrics,
+ includePad);
}
- public static BoringLayout make(CharSequence source,
- TextPaint paint, int outerwidth,
- Alignment align,
- float spacingmult, float spacingadd,
- BoringLayout.Metrics metrics, boolean includepad,
- TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
- return new BoringLayout(source, paint, outerwidth, align,
- spacingmult, spacingadd, metrics,
- includepad, ellipsize, ellipsizedWidth);
+ /**
+ * Utility function to construct a BoringLayout instance.
+ *
+ * @param source the text to render
+ * @param paint the default paint for the layout
+ * @param outerWidth the wrapping width for the text
+ * @param align whether to left, right, or center the text
+ * @param spacingmult this value is no longer used by BoringLayout
+ * @param spacingadd this value is no longer used by BoringLayout
+ * @param metrics {@code #Metrics} instance that contains information about FontMetrics and
+ * line width
+ * @param includePad set whether to include extra space beyond font ascent and descent which is
+ * needed to avoid clipping in some scripts
+ * @param ellipsize whether to ellipsize the text if width of the text is longer than the
+ * requested width
+ * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is
+ * {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is
+ * not used, {@code outerWidth} is used instead
+ */
+ public static BoringLayout make(CharSequence source, TextPaint paint, int outerWidth,
+ Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics,
+ boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
+ return new BoringLayout(source, paint, outerWidth, align, spacingmult, spacingadd, metrics,
+ includePad, ellipsize, ellipsizedWidth);
}
/**
* Returns a BoringLayout for the specified text, potentially reusing
* this one if it is already suitable. The caller must make sure that
* no one is still using this Layout.
+ *
+ * @param source the text to render
+ * @param paint the default paint for the layout
+ * @param outerwidth the wrapping width for the text
+ * @param align whether to left, right, or center the text
+ * @param spacingMult this value is no longer used by BoringLayout
+ * @param spacingAdd this value is no longer used by BoringLayout
+ * @param metrics {@code #Metrics} instance that contains information about FontMetrics and
+ * line width
+ * @param includePad set whether to include extra space beyond font ascent and descent which is
+ * needed to avoid clipping in some scripts
*/
- public BoringLayout replaceOrMake(CharSequence source, TextPaint paint,
- int outerwidth, Alignment align,
- float spacingmult, float spacingadd,
- BoringLayout.Metrics metrics,
- boolean includepad) {
- replaceWith(source, paint, outerwidth, align, spacingmult,
- spacingadd);
+ public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerwidth,
+ Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics,
+ boolean includePad) {
+ replaceWith(source, paint, outerwidth, align, spacingMult, spacingAdd);
mEllipsizedWidth = outerwidth;
mEllipsizedStart = 0;
mEllipsizedCount = 0;
- init(source, paint, outerwidth, align, spacingmult, spacingadd,
- metrics, includepad, true);
+ init(source, paint, align, metrics, includePad, true);
return this;
}
@@ -82,95 +116,118 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
* Returns a BoringLayout for the specified text, potentially reusing
* this one if it is already suitable. The caller must make sure that
* no one is still using this Layout.
+ *
+ * @param source the text to render
+ * @param paint the default paint for the layout
+ * @param outerWidth the wrapping width for the text
+ * @param align whether to left, right, or center the text
+ * @param spacingMult this value is no longer used by BoringLayout
+ * @param spacingAdd this value is no longer used by BoringLayout
+ * @param metrics {@code #Metrics} instance that contains information about FontMetrics and
+ * line width
+ * @param includePad set whether to include extra space beyond font ascent and descent which is
+ * needed to avoid clipping in some scripts
+ * @param ellipsize whether to ellipsize the text if width of the text is longer than the
+ * requested width
+ * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is
+ * {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is
+ * not used, {@code outerwidth} is used instead
*/
- public BoringLayout replaceOrMake(CharSequence source, TextPaint paint,
- int outerwidth, Alignment align,
- float spacingmult, float spacingadd,
- BoringLayout.Metrics metrics,
- boolean includepad,
- TextUtils.TruncateAt ellipsize,
- int ellipsizedWidth) {
+ public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerWidth,
+ Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics,
+ boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
boolean trust;
if (ellipsize == null || ellipsize == TextUtils.TruncateAt.MARQUEE) {
- replaceWith(source, paint, outerwidth, align, spacingmult,
- spacingadd);
+ replaceWith(source, paint, outerWidth, align, spacingMult, spacingAdd);
- mEllipsizedWidth = outerwidth;
+ mEllipsizedWidth = outerWidth;
mEllipsizedStart = 0;
mEllipsizedCount = 0;
trust = true;
} else {
- replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth,
- ellipsize, true, this),
- paint, outerwidth, align, spacingmult,
- spacingadd);
+ replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this),
+ paint, outerWidth, align, spacingMult, spacingAdd);
mEllipsizedWidth = ellipsizedWidth;
trust = false;
}
- init(getText(), paint, outerwidth, align, spacingmult, spacingadd,
- metrics, includepad, trust);
+ init(getText(), paint, align, metrics, includePad, trust);
return this;
}
- public BoringLayout(CharSequence source,
- TextPaint paint, int outerwidth,
- Alignment align,
- float spacingmult, float spacingadd,
- BoringLayout.Metrics metrics, boolean includepad) {
- super(source, paint, outerwidth, align, spacingmult, spacingadd);
+ /**
+ * @param source the text to render
+ * @param paint the default paint for the layout
+ * @param outerwidth the wrapping width for the text
+ * @param align whether to left, right, or center the text
+ * @param spacingMult this value is no longer used by BoringLayout
+ * @param spacingAdd this value is no longer used by BoringLayout
+ * @param metrics {@code #Metrics} instance that contains information about FontMetrics and
+ * line width
+ * @param includePad set whether to include extra space beyond font ascent and descent which is
+ * needed to avoid clipping in some scripts
+ */
+ public BoringLayout(CharSequence source, TextPaint paint, int outerwidth, Alignment align,
+ float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad) {
+ super(source, paint, outerwidth, align, spacingMult, spacingAdd);
mEllipsizedWidth = outerwidth;
mEllipsizedStart = 0;
mEllipsizedCount = 0;
- init(source, paint, outerwidth, align, spacingmult, spacingadd,
- metrics, includepad, true);
+ init(source, paint, align, metrics, includePad, true);
}
- public BoringLayout(CharSequence source,
- TextPaint paint, int outerwidth,
- Alignment align,
- float spacingmult, float spacingadd,
- BoringLayout.Metrics metrics, boolean includepad,
- TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
+ /**
+ *
+ * @param source the text to render
+ * @param paint the default paint for the layout
+ * @param outerWidth the wrapping width for the text
+ * @param align whether to left, right, or center the text
+ * @param spacingMult this value is no longer used by BoringLayout
+ * @param spacingAdd this value is no longer used by BoringLayout
+ * @param metrics {@code #Metrics} instance that contains information about FontMetrics and
+ * line width
+ * @param includePad set whether to include extra space beyond font ascent and descent which is
+ * needed to avoid clipping in some scripts
+ * @param ellipsize whether to ellipsize the text if width of the text is longer than the
+ * requested {@code outerwidth}
+ * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is
+ * {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is
+ * not used, {@code outerwidth} is used instead
+ */
+ public BoringLayout(CharSequence source, TextPaint paint, int outerWidth, Alignment align,
+ float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad,
+ TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
/*
* It is silly to have to call super() and then replaceWith(),
* but we can't use "this" for the callback until the call to
* super() finishes.
*/
- super(source, paint, outerwidth, align, spacingmult, spacingadd);
+ super(source, paint, outerWidth, align, spacingMult, spacingAdd);
boolean trust;
if (ellipsize == null || ellipsize == TextUtils.TruncateAt.MARQUEE) {
- mEllipsizedWidth = outerwidth;
+ mEllipsizedWidth = outerWidth;
mEllipsizedStart = 0;
mEllipsizedCount = 0;
trust = true;
} else {
- replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth,
- ellipsize, true, this),
- paint, outerwidth, align, spacingmult,
- spacingadd);
-
+ replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this),
+ paint, outerWidth, align, spacingMult, spacingAdd);
mEllipsizedWidth = ellipsizedWidth;
trust = false;
}
- init(getText(), paint, outerwidth, align, spacingmult, spacingadd,
- metrics, includepad, trust);
+ init(getText(), paint, align, metrics, includePad, trust);
}
- /* package */ void init(CharSequence source,
- TextPaint paint, int outerwidth,
- Alignment align,
- float spacingmult, float spacingadd,
- BoringLayout.Metrics metrics, boolean includepad,
- boolean trustWidth) {
+ /* package */ void init(CharSequence source, TextPaint paint, Alignment align,
+ BoringLayout.Metrics metrics, boolean includePad, boolean trustWidth) {
int spacing;
if (source instanceof String && align == Layout.Alignment.ALIGN_NORMAL) {
@@ -181,7 +238,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
mPaint = paint;
- if (includepad) {
+ if (includePad) {
spacing = metrics.bottom - metrics.top;
mDesc = metrics.bottom;
} else {
@@ -206,7 +263,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
TextLine.recycle(line);
}
- if (includepad) {
+ if (includePad) {
mTopPadding = metrics.top - metrics.ascent;
mBottomPadding = metrics.bottom - metrics.descent;
}
@@ -215,8 +272,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
/**
* Returns null if not boring; the width, ascent, and descent if boring.
*/
- public static Metrics isBoring(CharSequence text,
- TextPaint paint) {
+ public static Metrics isBoring(CharSequence text, TextPaint paint) {
return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, null);
}
diff --git a/core/java/android/text/Selection.java b/core/java/android/text/Selection.java
index 3222dbf8718e..34456580ee61 100644
--- a/core/java/android/text/Selection.java
+++ b/core/java/android/text/Selection.java
@@ -16,6 +16,8 @@
package android.text;
+import android.annotation.TestApi;
+
import java.text.BreakIterator;
@@ -35,10 +37,10 @@ public class Selection {
* there is no selection or cursor.
*/
public static final int getSelectionStart(CharSequence text) {
- if (text instanceof Spanned)
+ if (text instanceof Spanned) {
return ((Spanned) text).getSpanStart(SELECTION_START);
- else
- return -1;
+ }
+ return -1;
}
/**
@@ -46,10 +48,17 @@ public class Selection {
* there is no selection or cursor.
*/
public static final int getSelectionEnd(CharSequence text) {
- if (text instanceof Spanned)
+ if (text instanceof Spanned) {
return ((Spanned) text).getSpanStart(SELECTION_END);
- else
- return -1;
+ }
+ return -1;
+ }
+
+ private static int getSelectionMemory(CharSequence text) {
+ if (text instanceof Spanned) {
+ return ((Spanned) text).getSpanStart(SELECTION_MEMORY);
+ }
+ return -1;
}
/*
@@ -65,6 +74,14 @@ public class Selection {
* to <code>stop</code>.
*/
public static void setSelection(Spannable text, int start, int stop) {
+ setSelection(text, start, stop, -1);
+ }
+
+ /**
+ * Set the selection anchor to <code>start</code>, the selection edge
+ * to <code>stop</code> and the memory horizontal to <code>memory</code>.
+ */
+ private static void setSelection(Spannable text, int start, int stop, int memory) {
// int len = text.length();
// start = pin(start, 0, len); XXX remove unless we really need it
// stop = pin(stop, 0, len);
@@ -74,9 +91,57 @@ public class Selection {
if (ostart != start || oend != stop) {
text.setSpan(SELECTION_START, start, start,
- Spanned.SPAN_POINT_POINT|Spanned.SPAN_INTERMEDIATE);
- text.setSpan(SELECTION_END, stop, stop,
- Spanned.SPAN_POINT_POINT);
+ Spanned.SPAN_POINT_POINT | Spanned.SPAN_INTERMEDIATE);
+ text.setSpan(SELECTION_END, stop, stop, Spanned.SPAN_POINT_POINT);
+ updateMemory(text, memory);
+ }
+ }
+
+ /**
+ * Update the memory position for text. This is used to ensure vertical navigation of lines
+ * with different lengths behaves as expected and remembers the longest horizontal position
+ * seen during a vertical traversal.
+ */
+ private static void updateMemory(Spannable text, int memory) {
+ if (memory > -1) {
+ int currentMemory = getSelectionMemory(text);
+ if (memory != currentMemory) {
+ text.setSpan(SELECTION_MEMORY, memory, memory, Spanned.SPAN_POINT_POINT);
+ if (currentMemory == -1) {
+ // This is the first value, create a watcher.
+ final TextWatcher watcher = new MemoryTextWatcher();
+ text.setSpan(watcher, 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+ }
+ }
+ } else {
+ removeMemory(text);
+ }
+ }
+
+ private static void removeMemory(Spannable text) {
+ text.removeSpan(SELECTION_MEMORY);
+ MemoryTextWatcher[] watchers = text.getSpans(0, text.length(), MemoryTextWatcher.class);
+ for (MemoryTextWatcher watcher : watchers) {
+ text.removeSpan(watcher);
+ }
+ }
+
+ /**
+ * @hide
+ */
+ @TestApi
+ public static final class MemoryTextWatcher implements TextWatcher {
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {}
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ s.removeSpan(SELECTION_MEMORY);
+ s.removeSpan(this);
}
}
@@ -98,8 +163,17 @@ public class Selection {
* Move the selection edge to offset <code>index</code>.
*/
public static final void extendSelection(Spannable text, int index) {
- if (text.getSpanStart(SELECTION_END) != index)
+ extendSelection(text, index, -1);
+ }
+
+ /**
+ * Move the selection edge to offset <code>index</code> and update the memory horizontal.
+ */
+ private static void extendSelection(Spannable text, int index, int memory) {
+ if (text.getSpanStart(SELECTION_END) != index) {
text.setSpan(SELECTION_END, index, index, Spanned.SPAN_POINT_POINT);
+ }
+ updateMemory(text, memory);
}
/**
@@ -108,6 +182,7 @@ public class Selection {
public static final void removeSelection(Spannable text) {
text.removeSpan(SELECTION_START);
text.removeSpan(SELECTION_END);
+ removeMemory(text);
}
/*
@@ -138,17 +213,8 @@ public class Selection {
int line = layout.getLineForOffset(end);
if (line > 0) {
- int move;
-
- if (layout.getParagraphDirection(line) ==
- layout.getParagraphDirection(line - 1)) {
- float h = layout.getPrimaryHorizontal(end);
- move = layout.getOffsetForHorizontal(line - 1, h);
- } else {
- move = layout.getLineStart(line - 1);
- }
-
- setSelection(text, move);
+ setSelectionAndMemory(
+ text, layout, line, end, -1 /* direction */, false /* extend */);
return true;
} else if (end != 0) {
setSelection(text, 0);
@@ -160,6 +226,40 @@ public class Selection {
}
/**
+ * Calculate the movement and memory positions needed, and set or extend the selection.
+ */
+ private static void setSelectionAndMemory(Spannable text, Layout layout, int line, int end,
+ int direction, boolean extend) {
+ int move;
+ int newMemory;
+
+ if (layout.getParagraphDirection(line)
+ == layout.getParagraphDirection(line + direction)) {
+ int memory = getSelectionMemory(text);
+ if (memory > -1) {
+ // We have a memory position
+ float h = layout.getPrimaryHorizontal(memory);
+ move = layout.getOffsetForHorizontal(line + direction, h);
+ newMemory = memory;
+ } else {
+ // Create a new memory position
+ float h = layout.getPrimaryHorizontal(end);
+ move = layout.getOffsetForHorizontal(line + direction, h);
+ newMemory = end;
+ }
+ } else {
+ move = layout.getLineStart(line + direction);
+ newMemory = -1;
+ }
+
+ if (extend) {
+ extendSelection(text, move, newMemory);
+ } else {
+ setSelection(text, move, move, newMemory);
+ }
+ }
+
+ /**
* Move the cursor to the buffer offset physically below the current
* offset, to the end of the buffer if it is on the bottom line but
* not at the end, or return false if the cursor is already at the
@@ -184,17 +284,8 @@ public class Selection {
int line = layout.getLineForOffset(end);
if (line < layout.getLineCount() - 1) {
- int move;
-
- if (layout.getParagraphDirection(line) ==
- layout.getParagraphDirection(line + 1)) {
- float h = layout.getPrimaryHorizontal(end);
- move = layout.getOffsetForHorizontal(line + 1, h);
- } else {
- move = layout.getLineStart(line + 1);
- }
-
- setSelection(text, move);
+ setSelectionAndMemory(
+ text, layout, line, end, 1 /* direction */, false /* extend */);
return true;
} else if (end != text.length()) {
setSelection(text, text.length());
@@ -263,17 +354,7 @@ public class Selection {
int line = layout.getLineForOffset(end);
if (line > 0) {
- int move;
-
- if (layout.getParagraphDirection(line) ==
- layout.getParagraphDirection(line - 1)) {
- float h = layout.getPrimaryHorizontal(end);
- move = layout.getOffsetForHorizontal(line - 1, h);
- } else {
- move = layout.getLineStart(line - 1);
- }
-
- extendSelection(text, move);
+ setSelectionAndMemory(text, layout, line, end, -1 /* direction */, true /* extend */);
return true;
} else if (end != 0) {
extendSelection(text, 0);
@@ -292,20 +373,10 @@ public class Selection {
int line = layout.getLineForOffset(end);
if (line < layout.getLineCount() - 1) {
- int move;
-
- if (layout.getParagraphDirection(line) ==
- layout.getParagraphDirection(line + 1)) {
- float h = layout.getPrimaryHorizontal(end);
- move = layout.getOffsetForHorizontal(line + 1, h);
- } else {
- move = layout.getLineStart(line + 1);
- }
-
- extendSelection(text, move);
+ setSelectionAndMemory(text, layout, line, end, 1 /* direction */, true /* extend */);
return true;
} else if (end != text.length()) {
- extendSelection(text, text.length());
+ extendSelection(text, text.length(), -1);
return true;
}
@@ -466,6 +537,8 @@ public class Selection {
private static final class START implements NoCopySpan { }
private static final class END implements NoCopySpan { }
+ private static final class MEMORY implements NoCopySpan { }
+ private static final Object SELECTION_MEMORY = new MEMORY();
/*
* Public constants
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index 440c88e8cabb..9ebe8a29b137 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -17,6 +17,7 @@
package android.text;
import android.annotation.FloatRange;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.PluralsRes;
@@ -297,37 +298,46 @@ public class TextUtils {
/**
* Returns a string containing the tokens joined by delimiters.
- * @param tokens an array objects to be joined. Strings will be formed from
- * the objects by calling object.toString().
+ *
+ * @param delimiter a CharSequence that will be inserted between the tokens. If null, the string
+ * "null" will be used as the delimiter.
+ * @param tokens an array objects to be joined. Strings will be formed from the objects by
+ * calling object.toString(). If tokens is null, a NullPointerException will be thrown. If
+ * tokens is an empty array, an empty string will be returned.
*/
- public static String join(CharSequence delimiter, Object[] tokens) {
- StringBuilder sb = new StringBuilder();
- boolean firstTime = true;
- for (Object token: tokens) {
- if (firstTime) {
- firstTime = false;
- } else {
- sb.append(delimiter);
- }
- sb.append(token);
+ public static String join(@NonNull CharSequence delimiter, @NonNull Object[] tokens) {
+ final int length = tokens.length;
+ if (length == 0) {
+ return "";
+ }
+ final StringBuilder sb = new StringBuilder();
+ sb.append(tokens[0]);
+ for (int i = 1; i < length; i++) {
+ sb.append(delimiter);
+ sb.append(tokens[i]);
}
return sb.toString();
}
/**
* Returns a string containing the tokens joined by delimiters.
- * @param tokens an array objects to be joined. Strings will be formed from
- * the objects by calling object.toString().
+ *
+ * @param delimiter a CharSequence that will be inserted between the tokens. If null, the string
+ * "null" will be used as the delimiter.
+ * @param tokens an array objects to be joined. Strings will be formed from the objects by
+ * calling object.toString(). If tokens is null, a NullPointerException will be thrown. If
+ * tokens is empty, an empty string will be returned.
*/
- public static String join(CharSequence delimiter, Iterable tokens) {
- StringBuilder sb = new StringBuilder();
- Iterator<?> it = tokens.iterator();
- if (it.hasNext()) {
+ public static String join(@NonNull CharSequence delimiter, @NonNull Iterable tokens) {
+ final Iterator<?> it = tokens.iterator();
+ if (!it.hasNext()) {
+ return "";
+ }
+ final StringBuilder sb = new StringBuilder();
+ sb.append(it.next());
+ while (it.hasNext()) {
+ sb.append(delimiter);
sb.append(it.next());
- while (it.hasNext()) {
- sb.append(delimiter);
- sb.append(it.next());
- }
}
return sb.toString();
}
@@ -2024,6 +2034,45 @@ public class TextUtils {
builder.append(end);
}
+ /**
+ * Intent size limitations prevent sending over a megabyte of data. Limit
+ * text length to 100K characters - 200KB.
+ */
+ private static final int PARCEL_SAFE_TEXT_LENGTH = 100000;
+
+ /**
+ * Trims the text to {@link #PARCEL_SAFE_TEXT_LENGTH} length. Returns the string as it is if
+ * the length() is smaller than {@link #PARCEL_SAFE_TEXT_LENGTH}. Used for text that is parceled
+ * into a {@link Parcelable}.
+ *
+ * @hide
+ */
+ @Nullable
+ public static <T extends CharSequence> T trimToParcelableSize(@Nullable T text) {
+ return trimToSize(text, PARCEL_SAFE_TEXT_LENGTH);
+ }
+
+ /**
+ * Trims the text to {@code size} length. Returns the string as it is if the length() is
+ * smaller than {@code size}. If chars at {@code size-1} and {@code size} is a surrogate
+ * pair, returns a CharSequence of length {@code size-1}.
+ *
+ * @param size length of the result, should be greater than 0
+ *
+ * @hide
+ */
+ @Nullable
+ public static <T extends CharSequence> T trimToSize(@Nullable T text,
+ @IntRange(from = 1) int size) {
+ Preconditions.checkArgument(size > 0);
+ if (TextUtils.isEmpty(text) || text.length() <= size) return text;
+ if (Character.isHighSurrogate(text.charAt(size - 1))
+ && Character.isLowSurrogate(text.charAt(size))) {
+ size = size - 1;
+ }
+ return (T) text.subSequence(0, size);
+ }
+
private static Object sLock = new Object();
private static char[] sTemp = null;
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java
index b5a8acaf674f..34fe07bc1f01 100755
--- a/core/java/android/text/format/DateFormat.java
+++ b/core/java/android/text/format/DateFormat.java
@@ -177,43 +177,38 @@ public class DateFormat {
* @hide
*/
public static boolean is24HourFormat(Context context, int userHandle) {
- String value = Settings.System.getStringForUser(context.getContentResolver(),
+ final String value = Settings.System.getStringForUser(context.getContentResolver(),
Settings.System.TIME_12_24, userHandle);
+ if (value != null) {
+ return value.equals("24");
+ }
- if (value == null) {
- Locale locale = context.getResources().getConfiguration().locale;
+ final Locale locale = context.getResources().getConfiguration().locale;
- synchronized (sLocaleLock) {
- if (sIs24HourLocale != null && sIs24HourLocale.equals(locale)) {
- return sIs24Hour;
- }
+ synchronized (sLocaleLock) {
+ if (sIs24HourLocale != null && sIs24HourLocale.equals(locale)) {
+ return sIs24Hour;
}
+ }
- java.text.DateFormat natural =
- java.text.DateFormat.getTimeInstance(java.text.DateFormat.LONG, locale);
-
- if (natural instanceof SimpleDateFormat) {
- SimpleDateFormat sdf = (SimpleDateFormat) natural;
- String pattern = sdf.toPattern();
+ final java.text.DateFormat natural =
+ java.text.DateFormat.getTimeInstance(java.text.DateFormat.LONG, locale);
- if (pattern.indexOf('H') >= 0) {
- value = "24";
- } else {
- value = "12";
- }
- } else {
- value = "12";
- }
-
- synchronized (sLocaleLock) {
- sIs24HourLocale = locale;
- sIs24Hour = value.equals("24");
- }
+ final boolean is24Hour;
+ if (natural instanceof SimpleDateFormat) {
+ final SimpleDateFormat sdf = (SimpleDateFormat) natural;
+ final String pattern = sdf.toPattern();
+ is24Hour = hasDesignator(pattern, 'H');
+ } else {
+ is24Hour = false;
+ }
- return sIs24Hour;
+ synchronized (sLocaleLock) {
+ sIs24HourLocale = locale;
+ sIs24Hour = is24Hour;
}
- return value.equals("24");
+ return is24Hour;
}
/**
@@ -249,17 +244,18 @@ public class DateFormat {
/**
* Returns a {@link java.text.DateFormat} object that can format the time according
- * to the current locale and the user's 12-/24-hour clock preference.
+ * to the context's locale and the user's 12-/24-hour clock preference.
* @param context the application context
* @return the {@link java.text.DateFormat} object that properly formats the time.
*/
public static java.text.DateFormat getTimeFormat(Context context) {
- return new java.text.SimpleDateFormat(getTimeFormatString(context));
+ final Locale locale = context.getResources().getConfiguration().locale;
+ return new java.text.SimpleDateFormat(getTimeFormatString(context), locale);
}
/**
* Returns a String pattern that can be used to format the time according
- * to the current locale and the user's 12-/24-hour clock preference.
+ * to the context's locale and the user's 12-/24-hour clock preference.
* @param context the application context
* @hide
*/
@@ -269,45 +265,48 @@ public class DateFormat {
/**
* Returns a String pattern that can be used to format the time according
- * to the current locale and the user's 12-/24-hour clock preference.
+ * to the context's locale and the user's 12-/24-hour clock preference.
* @param context the application context
* @param userHandle the user handle of the user to query the format for
* @hide
*/
public static String getTimeFormatString(Context context, int userHandle) {
- LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale);
+ final LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale);
return is24HourFormat(context, userHandle) ? d.timeFormat_Hm : d.timeFormat_hm;
}
/**
* Returns a {@link java.text.DateFormat} object that can format the date
- * in short form according to the current locale.
+ * in short form according to the context's locale.
*
* @param context the application context
* @return the {@link java.text.DateFormat} object that properly formats the date.
*/
public static java.text.DateFormat getDateFormat(Context context) {
- return java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT);
+ final Locale locale = context.getResources().getConfiguration().locale;
+ return java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT, locale);
}
/**
* Returns a {@link java.text.DateFormat} object that can format the date
- * in long form (such as {@code Monday, January 3, 2000}) for the current locale.
+ * in long form (such as {@code Monday, January 3, 2000}) for the context's locale.
* @param context the application context
* @return the {@link java.text.DateFormat} object that formats the date in long form.
*/
public static java.text.DateFormat getLongDateFormat(Context context) {
- return java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG);
+ final Locale locale = context.getResources().getConfiguration().locale;
+ return java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG, locale);
}
/**
* Returns a {@link java.text.DateFormat} object that can format the date
- * in medium form (such as {@code Jan 3, 2000}) for the current locale.
+ * in medium form (such as {@code Jan 3, 2000}) for the context's locale.
* @param context the application context
* @return the {@link java.text.DateFormat} object that formats the date in long form.
*/
public static java.text.DateFormat getMediumDateFormat(Context context) {
- return java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM);
+ final Locale locale = context.getResources().getConfiguration().locale;
+ return java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM, locale);
}
/**
@@ -320,11 +319,13 @@ public class DateFormat {
* order returned here.
*/
public static char[] getDateFormatOrder(Context context) {
- return ICU.getDateFormatOrder(getDateFormatString());
+ return ICU.getDateFormatOrder(getDateFormatString(context));
}
- private static String getDateFormatString() {
- java.text.DateFormat df = java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT);
+ private static String getDateFormatString(Context context) {
+ final Locale locale = context.getResources().getConfiguration().locale;
+ java.text.DateFormat df = java.text.DateFormat.getDateInstance(
+ java.text.DateFormat.SHORT, locale);
if (df instanceof SimpleDateFormat) {
return ((SimpleDateFormat) df).toPattern();
}
@@ -375,6 +376,9 @@ public class DateFormat {
* Test if a format string contains the given designator. Always returns
* {@code false} if the input format is {@code null}.
*
+ * Note that this is intended for searching for designators, not arbitrary
+ * characters. So searching for a literal single quote would not work correctly.
+ *
* @hide
*/
public static boolean hasDesignator(CharSequence inFormat, char designator) {
@@ -382,50 +386,19 @@ public class DateFormat {
final int length = inFormat.length();
- int c;
- int count;
-
- for (int i = 0; i < length; i += count) {
- count = 1;
- c = inFormat.charAt(i);
-
- if (c == QUOTE) {
- count = skipQuotedText(inFormat, i, length);
- } else if (c == designator) {
- return true;
- }
- }
-
- return false;
- }
-
- private static int skipQuotedText(CharSequence s, int i, int len) {
- if (i + 1 < len && s.charAt(i + 1) == QUOTE) {
- return 2;
- }
-
- int count = 1;
- // skip leading quote
- i++;
-
- while (i < len) {
- char c = s.charAt(i);
-
+ boolean insideQuote = false;
+ for (int i = 0; i < length; i++) {
+ final char c = inFormat.charAt(i);
if (c == QUOTE) {
- count++;
- // QUOTEQUOTE -> QUOTE
- if (i + 1 < len && s.charAt(i + 1) == QUOTE) {
- i++;
- } else {
- break;
+ insideQuote = !insideQuote;
+ } else if (!insideQuote) {
+ if (c == designator) {
+ return true;
}
- } else {
- i++;
- count++;
}
}
- return count;
+ return false;
}
/**
diff --git a/core/java/android/text/style/BulletSpan.java b/core/java/android/text/style/BulletSpan.java
index 74084154ec60..a1aca163e2f6 100644
--- a/core/java/android/text/style/BulletSpan.java
+++ b/core/java/android/text/style/BulletSpan.java
@@ -31,7 +31,8 @@ public class BulletSpan implements LeadingMarginSpan, ParcelableSpan {
private final boolean mWantColor;
private final int mColor;
- private static final int BULLET_RADIUS = 3;
+ // Bullet is slightly bigger to avoid aliasing artifacts on mdpi devices.
+ private static final float BULLET_RADIUS = 3 * 1.2f;
private static Path sBulletPath = null;
public static final int STANDARD_GAP_WIDTH = 2;
@@ -59,34 +60,41 @@ public class BulletSpan implements LeadingMarginSpan, ParcelableSpan {
mColor = src.readInt();
}
+ @Override
public int getSpanTypeId() {
return getSpanTypeIdInternal();
}
/** @hide */
+ @Override
public int getSpanTypeIdInternal() {
return TextUtils.BULLET_SPAN;
}
+ @Override
public int describeContents() {
return 0;
}
+ @Override
public void writeToParcel(Parcel dest, int flags) {
writeToParcelInternal(dest, flags);
}
/** @hide */
+ @Override
public void writeToParcelInternal(Parcel dest, int flags) {
dest.writeInt(mGapWidth);
dest.writeInt(mWantColor ? 1 : 0);
dest.writeInt(mColor);
}
+ @Override
public int getLeadingMargin(boolean first) {
- return 2 * BULLET_RADIUS + mGapWidth;
+ return (int) (2 * BULLET_RADIUS + mGapWidth);
}
+ @Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,
int top, int baseline, int bottom,
CharSequence text, int start, int end,
@@ -102,19 +110,31 @@ public class BulletSpan implements LeadingMarginSpan, ParcelableSpan {
p.setStyle(Paint.Style.FILL);
+ final int line = l.getLineForOffset(start);
+ final float y;
+ if (line == l.getLineCount() - 1) {
+ // line spacing values are not added to last line, vertical center is top+bottom/2
+ y = (top + bottom) / 2f;
+ } else {
+ // line spacing values are added to the lines other than last line, remove added
+ // empty line spacing to calculate vertical center
+ final float lineHeight =
+ (top - bottom - l.getSpacingAdd()) / l.getSpacingMultiplier();
+ y = top - lineHeight / 2f;
+ }
+
if (c.isHardwareAccelerated()) {
if (sBulletPath == null) {
sBulletPath = new Path();
- // Bullet is slightly better to avoid aliasing artifacts on mdpi devices.
- sBulletPath.addCircle(0.0f, 0.0f, 1.2f * BULLET_RADIUS, Direction.CW);
+ sBulletPath.addCircle(0.0f, 0.0f, BULLET_RADIUS, Direction.CW);
}
c.save();
- c.translate(x + dir * BULLET_RADIUS, (top + bottom) / 2.0f);
+ c.translate(x + dir * BULLET_RADIUS, y);
c.drawPath(sBulletPath, p);
c.restore();
} else {
- c.drawCircle(x + dir * BULLET_RADIUS, (top + bottom) / 2.0f, BULLET_RADIUS, p);
+ c.drawCircle(x + dir * BULLET_RADIUS, y, BULLET_RADIUS, p);
}
if (mWantColor) {
diff --git a/core/java/android/text/style/TextAppearanceSpan.java b/core/java/android/text/style/TextAppearanceSpan.java
index abbd793dcb2a..3a3646b99bdf 100644
--- a/core/java/android/text/style/TextAppearanceSpan.java
+++ b/core/java/android/text/style/TextAppearanceSpan.java
@@ -19,6 +19,7 @@ package android.text.style;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
+import android.graphics.LeakyTypefaceStorage;
import android.graphics.Typeface;
import android.os.Parcel;
import android.text.ParcelableSpan;
@@ -30,11 +31,12 @@ import android.text.TextUtils;
* resource.
*/
public class TextAppearanceSpan extends MetricAffectingSpan implements ParcelableSpan {
- private final String mTypeface;
+ private final String mFamilyName;
private final int mStyle;
private final int mTextSize;
private final ColorStateList mTextColor;
private final ColorStateList mTextColorLink;
+ private final Typeface mTypeface;
/**
* Uses the specified TextAppearance resource to determine the
@@ -55,7 +57,7 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
*/
public TextAppearanceSpan(Context context, int appearance, int colorList) {
ColorStateList textColor;
-
+
TypedArray a =
context.obtainStyledAttributes(appearance,
com.android.internal.R.styleable.TextAppearance);
@@ -68,28 +70,33 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
TextAppearance_textSize, -1);
mStyle = a.getInt(com.android.internal.R.styleable.TextAppearance_textStyle, 0);
- String family = a.getString(com.android.internal.R.styleable.TextAppearance_fontFamily);
- if (family != null) {
- mTypeface = family;
+ mTypeface = a.getFont(com.android.internal.R.styleable.TextAppearance_fontFamily);
+ if (mTypeface != null) {
+ mFamilyName = null;
} else {
- int tf = a.getInt(com.android.internal.R.styleable.TextAppearance_typeface, 0);
+ String family = a.getString(com.android.internal.R.styleable.TextAppearance_fontFamily);
+ if (family != null) {
+ mFamilyName = family;
+ } else {
+ int tf = a.getInt(com.android.internal.R.styleable.TextAppearance_typeface, 0);
- switch (tf) {
- case 1:
- mTypeface = "sans";
- break;
+ switch (tf) {
+ case 1:
+ mFamilyName = "sans";
+ break;
- case 2:
- mTypeface = "serif";
- break;
+ case 2:
+ mFamilyName = "serif";
+ break;
- case 3:
- mTypeface = "monospace";
- break;
+ case 3:
+ mFamilyName = "monospace";
+ break;
- default:
- mTypeface = null;
- break;
+ default:
+ mFamilyName = null;
+ break;
+ }
}
}
@@ -102,7 +109,7 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
textColor = a.getColorStateList(colorList);
a.recycle();
}
-
+
mTextColor = textColor;
}
@@ -112,15 +119,16 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
*/
public TextAppearanceSpan(String family, int style, int size,
ColorStateList color, ColorStateList linkColor) {
- mTypeface = family;
+ mFamilyName = family;
mStyle = style;
mTextSize = size;
mTextColor = color;
mTextColorLink = linkColor;
+ mTypeface = null;
}
public TextAppearanceSpan(Parcel src) {
- mTypeface = src.readString();
+ mFamilyName = src.readString();
mStyle = src.readInt();
mTextSize = src.readInt();
if (src.readInt() != 0) {
@@ -133,8 +141,9 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
} else {
mTextColorLink = null;
}
+ mTypeface = LeakyTypefaceStorage.readTypefaceFromParcel(src);
}
-
+
public int getSpanTypeId() {
return getSpanTypeIdInternal();
}
@@ -143,7 +152,7 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
public int getSpanTypeIdInternal() {
return TextUtils.TEXT_APPEARANCE_SPAN;
}
-
+
public int describeContents() {
return 0;
}
@@ -154,7 +163,7 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
/** @hide */
public void writeToParcelInternal(Parcel dest, int flags) {
- dest.writeString(mTypeface);
+ dest.writeString(mFamilyName);
dest.writeInt(mStyle);
dest.writeInt(mTextSize);
if (mTextColor != null) {
@@ -169,6 +178,7 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
} else {
dest.writeInt(0);
}
+ LeakyTypefaceStorage.writeTypefaceToParcel(mTypeface, dest);
}
/**
@@ -176,7 +186,7 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
* if it does not specify one.
*/
public String getFamily() {
- return mTypeface;
+ return mFamilyName;
}
/**
@@ -226,9 +236,14 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
@Override
public void updateMeasureState(TextPaint ds) {
- if (mTypeface != null || mStyle != 0) {
+ final Typeface styledTypeface;
+ int style = 0;
+
+ if (mTypeface != null) {
+ style = mStyle;
+ styledTypeface = Typeface.create(mTypeface, style);
+ } else if (mFamilyName != null || mStyle != 0) {
Typeface tf = ds.getTypeface();
- int style = 0;
if (tf != null) {
style = tf.getStyle();
@@ -236,15 +251,19 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
style |= mStyle;
- if (mTypeface != null) {
- tf = Typeface.create(mTypeface, style);
+ if (mFamilyName != null) {
+ styledTypeface = Typeface.create(mFamilyName, style);
} else if (tf == null) {
- tf = Typeface.defaultFromStyle(style);
+ styledTypeface = Typeface.defaultFromStyle(style);
} else {
- tf = Typeface.create(tf, style);
+ styledTypeface = Typeface.create(tf, style);
}
+ } else {
+ styledTypeface = null;
+ }
- int fake = style & ~tf.getStyle();
+ if (styledTypeface != null) {
+ int fake = style & ~styledTypeface.getStyle();
if ((fake & Typeface.BOLD) != 0) {
ds.setFakeBoldText(true);
@@ -254,7 +273,7 @@ public class TextAppearanceSpan extends MetricAffectingSpan implements Parcelabl
ds.setTextSkewX(-0.25f);
}
- ds.setTypeface(tf);
+ ds.setTypeface(styledTypeface);
}
if (mTextSize > 0) {
diff --git a/core/java/android/webkit/HttpAuthHandler.java b/core/java/android/webkit/HttpAuthHandler.java
index 45fc1f5204fd..5353bc6983ee 100644
--- a/core/java/android/webkit/HttpAuthHandler.java
+++ b/core/java/android/webkit/HttpAuthHandler.java
@@ -61,14 +61,4 @@ public class HttpAuthHandler extends Handler {
*/
public void proceed(String username, String password) {
}
-
- /**
- * Gets whether the prompt dialog should be suppressed.
- *
- * @return whether the prompt dialog should be suppressed
- * @hide
- */
- public boolean suppressDialog() {
- return false;
- }
}
diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java
index 70a49fb45e2c..5735f29b056f 100644
--- a/core/java/android/webkit/WebChromeClient.java
+++ b/core/java/android/webkit/WebChromeClient.java
@@ -525,15 +525,4 @@ public class WebChromeClient {
public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture) {
uploadFile.onReceiveValue(null);
}
-
- /**
- * Tell the client that the page being viewed has an autofillable
- * form and the user would like to set a profile up.
- * @param msg A Message to send once the user has successfully
- * set up a profile and to inform the WebTextView it should
- * now autofill using that new profile.
- * @hide
- */
- public void setupAutoFill(Message msg) { }
-
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 04a826514a83..0d0244423a7a 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -6449,7 +6449,9 @@ public class Editor {
private boolean fireIntent(Intent intent) {
if (intent != null && Intent.ACTION_PROCESS_TEXT.equals(intent.getAction())) {
- intent.putExtra(Intent.EXTRA_PROCESS_TEXT, mTextView.getSelectedText());
+ String selectedText = mTextView.getSelectedText();
+ selectedText = TextUtils.trimToParcelableSize(selectedText);
+ intent.putExtra(Intent.EXTRA_PROCESS_TEXT, selectedText);
mEditor.mPreserveSelection = true;
mTextView.startActivityForResult(intent, TextView.PROCESS_TEXT_REQUEST_CODE);
return true;
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 69edbbba1386..e170ab6a55b4 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -22,6 +22,7 @@ import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_C
import static android.view.inputmethod.CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION;
import android.R;
+import android.annotation.CheckResult;
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
import android.annotation.FloatRange;
@@ -4848,8 +4849,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
- * Sets line spacing for this TextView. Each line will have its height
- * multiplied by <code>mult</code> and have <code>add</code> added to it.
+ * Sets line spacing for this TextView. Each line other than the last line will have its height
+ * multiplied by {@code mult} and have {@code add} added to it.
+ *
*
* @attr ref android.R.styleable#TextView_lineSpacingExtra
* @attr ref android.R.styleable#TextView_lineSpacingMultiplier
@@ -10328,10 +10330,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return isTextEditable() ? AUTOFILL_TYPE_TEXT : AUTOFILL_TYPE_NONE;
}
+ /**
+ * Gets the {@link TextView}'s current text for AutoFill. The value is trimmed to 100K
+ * {@code char}s if longer.
+ *
+ * @return current text, {@code null} if the text is not editable
+ *
+ * @see View#getAutofillValue()
+ */
@Override
@Nullable
public AutofillValue getAutofillValue() {
- return isTextEditable() ? AutofillValue.forText(getText()) : null;
+ if (isTextEditable()) {
+ final CharSequence text = TextUtils.trimToParcelableSize(getText());
+ return AutofillValue.forText(text);
+ }
+ return null;
}
/** @hide */
@@ -10745,7 +10759,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
// Otherwise, return whatever text is being displayed.
- return mTransformed;
+ return TextUtils.trimToParcelableSize(mTransformed);
}
void sendAccessibilityEventTypeViewTextChanged(CharSequence beforeText,
@@ -10830,13 +10844,25 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return true;
case ID_CUT:
- setPrimaryClip(ClipData.newPlainText(null, getTransformedText(min, max)));
- deleteText_internal(min, max);
+ final ClipData cutData = ClipData.newPlainText(null, getTransformedText(min, max));
+ if (setPrimaryClip(cutData)) {
+ deleteText_internal(min, max);
+ } else {
+ Toast.makeText(getContext(),
+ com.android.internal.R.string.failed_to_copy_to_clipboard,
+ Toast.LENGTH_SHORT).show();
+ }
return true;
case ID_COPY:
- setPrimaryClip(ClipData.newPlainText(null, getTransformedText(min, max)));
- stopTextActionMode();
+ final ClipData copyData = ClipData.newPlainText(null, getTransformedText(min, max));
+ if (setPrimaryClip(copyData)) {
+ stopTextActionMode();
+ } else {
+ Toast.makeText(getContext(),
+ com.android.internal.R.string.failed_to_copy_to_clipboard,
+ Toast.LENGTH_SHORT).show();
+ }
return true;
case ID_REPLACE:
@@ -11192,17 +11218,24 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.removeExtra(android.content.Intent.EXTRA_TEXT);
+ selectedText = TextUtils.trimToParcelableSize(selectedText);
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, selectedText);
getContext().startActivity(Intent.createChooser(sharingIntent, null));
Selection.setSelection((Spannable) mText, getSelectionEnd());
}
}
- private void setPrimaryClip(ClipData clip) {
+ @CheckResult
+ private boolean setPrimaryClip(ClipData clip) {
ClipboardManager clipboard =
(ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE);
- clipboard.setPrimaryClip(clip);
+ try {
+ clipboard.setPrimaryClip(clip);
+ } catch (Throwable t) {
+ return false;
+ }
sLastCutCopyOrTextChangedTime = SystemClock.uptimeMillis();
+ return true;
}
/**
diff --git a/core/java/com/android/internal/content/FileSystemProvider.java b/core/java/com/android/internal/content/FileSystemProvider.java
index 17a598a00ca9..b85fa2631792 100644
--- a/core/java/com/android/internal/content/FileSystemProvider.java
+++ b/core/java/com/android/internal/content/FileSystemProvider.java
@@ -39,7 +39,6 @@ import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsProvider;
import android.provider.MediaStore;
-import android.provider.MetadataReader;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
@@ -75,12 +74,9 @@ public abstract class FileSystemProvider extends DocumentsProvider {
private Handler mHandler;
private static final String MIMETYPE_PDF = "application/pdf";
-
private static final String MIMETYPE_JPEG = "image/jpeg";
-
private static final String MIMETYPE_JPG = "image/jpg";
-
-
+ private static final String MIMETYPE_OCTET_STREAM = "application/octet-stream";
protected abstract File getFileForDocId(String docId, boolean visible)
throws FileNotFoundException;
@@ -117,23 +113,32 @@ public abstract class FileSystemProvider extends DocumentsProvider {
public @Nullable Bundle getDocumentMetadata(String documentId, @Nullable String[] tags)
throws FileNotFoundException {
File file = getFileForDocId(documentId);
- if (!(file.exists() && file.isFile() && file.canRead())) {
+
+ if (!file.exists()) {
+ throw new FileNotFoundException("Can't find the file for documentId: " + documentId);
+ }
+
+ if (!file.isFile()) {
+ Log.w(TAG, "Can't stream non-regular file. Returning empty metadata.");
+ return Bundle.EMPTY;
+ }
+
+ if (!file.canRead()) {
+ Log.w(TAG, "Can't stream non-readable file. Returning empty metadata.");
return Bundle.EMPTY;
}
+
String filePath = file.getAbsolutePath();
- Bundle metadata = new Bundle();
- if (getTypeForFile(file).equals(MIMETYPE_JPEG)
- || getTypeForFile(file).equals(MIMETYPE_JPG)) {
- FileInputStream stream = new FileInputStream(filePath);
- try {
- MetadataReader.getMetadata(metadata, stream, getTypeForFile(file), tags);
- return metadata;
- } catch (IOException e) {
- Log.e(TAG, "An error occurred retrieving the metadata", e);
- } finally {
- IoUtils.closeQuietly(stream);
- }
+ FileInputStream stream = new FileInputStream(filePath);
+
+ try {
+ return getDocumentMetadataFromStream(stream, getTypeForFile(file), tags);
+ } catch (IOException e) {
+ Log.e(TAG, "An error occurred retrieving the metadata", e);
+ } finally {
+ IoUtils.closeQuietly(stream);
}
+
return null;
}
@@ -468,6 +473,10 @@ public abstract class FileSystemProvider extends DocumentsProvider {
flags |= Document.FLAG_SUPPORTS_THUMBNAIL;
}
+ if (typeSupportsMetadata(mimeType)) {
+ flags |= Document.FLAG_SUPPORTS_METADATA;
+ }
+
final RowBuilder row = result.newRow();
row.add(Document.COLUMN_DOCUMENT_ID, docId);
row.add(Document.COLUMN_DISPLAY_NAME, displayName);
@@ -493,6 +502,10 @@ public abstract class FileSystemProvider extends DocumentsProvider {
}
}
+ protected boolean typeSupportsMetadata(String mimeType) {
+ return MIMETYPE_JPG.equals(mimeType) || MIMETYPE_JPEG.equals(mimeType);
+ }
+
private static String getTypeForName(String name) {
final int lastDot = name.lastIndexOf('.');
if (lastDot >= 0) {
@@ -503,7 +516,7 @@ public abstract class FileSystemProvider extends DocumentsProvider {
}
}
- return "application/octet-stream";
+ return MIMETYPE_OCTET_STREAM;
}
protected final File getFileForDocId(String docId) throws FileNotFoundException {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 4a2ef3228d5e..2a98feb12e90 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -562,6 +562,7 @@
android:icon="@drawable/perm_group_contacts"
android:label="@string/permgrouplab_contacts"
android:description="@string/permgroupdesc_contacts"
+ android:request="@string/permgrouprequest_contacts"
android:priority="100" />
<!-- Allows an application to read the user's contacts data.
@@ -592,6 +593,7 @@
android:icon="@drawable/perm_group_calendar"
android:label="@string/permgrouplab_calendar"
android:description="@string/permgroupdesc_calendar"
+ android:request="@string/permgrouprequest_calendar"
android:priority="200" />
<!-- Allows an application to read the user's calendar data.
@@ -622,6 +624,7 @@
android:icon="@drawable/perm_group_sms"
android:label="@string/permgrouplab_sms"
android:description="@string/permgroupdesc_sms"
+ android:request="@string/permgrouprequest_sms"
android:priority="300" />
<!-- Allows an application to send SMS messages.
@@ -698,6 +701,7 @@
android:icon="@drawable/perm_group_storage"
android:label="@string/permgrouplab_storage"
android:description="@string/permgroupdesc_storage"
+ android:request="@string/permgrouprequest_storage"
android:priority="900" />
<!-- Allows an application to read from external storage.
@@ -759,6 +763,7 @@
android:icon="@drawable/perm_group_location"
android:label="@string/permgrouplab_location"
android:description="@string/permgroupdesc_location"
+ android:request="@string/permgrouprequest_location"
android:priority="400" />
<!-- Allows an app to access precise location.
@@ -791,6 +796,7 @@
android:icon="@drawable/perm_group_phone_calls"
android:label="@string/permgrouplab_phone"
android:description="@string/permgroupdesc_phone"
+ android:request="@string/permgrouprequest_phone"
android:priority="500" />
<!-- Allows read only access to phone state, including the phone number of the device,
@@ -942,6 +948,7 @@
android:icon="@drawable/perm_group_microphone"
android:label="@string/permgrouplab_microphone"
android:description="@string/permgroupdesc_microphone"
+ android:request="@string/permgrouprequest_microphone"
android:priority="600" />
<!-- Allows an application to record audio.
@@ -984,6 +991,7 @@
android:icon="@drawable/perm_group_camera"
android:label="@string/permgrouplab_camera"
android:description="@string/permgroupdesc_camera"
+ android:request="@string/permgrouprequest_camera"
android:priority="700" />
<!-- Required to be able to access the camera device.
@@ -1013,6 +1021,7 @@
android:icon="@drawable/perm_group_sensors"
android:label="@string/permgrouplab_sensors"
android:description="@string/permgroupdesc_sensors"
+ android:request="@string/permgrouprequest_sensors"
android:priority="800" />
<!-- Allows an application to access data from sensors that the user uses to
@@ -1859,6 +1868,10 @@
<permission android:name="android.permission.MANAGE_ACTIVITY_STACKS"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi @hide Allows an application to embed other activities -->
+ <permission android:name="android.permission.ACTIVITY_EMBEDDING"
+ android:protectionLevel="signature|privileged" />
+
<!-- Allows an application to start any activity, regardless of permission
protection or exported state.
@hide -->
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index a35d61d544bd..5f894afbd61a 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Titelloos&gt;"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 9f67ea29c20d..de6ad70b4102 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"ኪባ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;ርዕስ አልባ&gt;"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index cc277561dec6..cad9ceb3fef4 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"بايت"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"كيلوبايت"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"ميغابايت"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"غيغابايت"</string>
- <string name="terabyteShort" msgid="231613018159186962">"تيرابايت"</string>
<string name="petabyteShort" msgid="5637816680144990219">"بيتابايت"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"‏&lt;بلا عنوان&gt;"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index dad5802ec0c6..ae042bfba99a 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"Başlıqsız"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 5f1ca49c6105..69038190aa68 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Bez naslova&gt;"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 7ec47510e490..5be57f6ce594 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Мб"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"Тб"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Пб"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Без назвы&gt;"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index e61e49c981db..6303961bf40e 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Без заглавие&gt;"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 939a45ca4b7a..4a4d938b1217 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"বাইট"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;শিরোনামহীন&gt;"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 1c1ec2565254..83e07dd4f389 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Bez naslova&gt;"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 0dbae8b3973c..5ca03baef05a 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Sense títol&gt;"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index a3072dcf603f..adf37f2466ee 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Bez názvu&gt;"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 22d4c3af1df5..c2ddb43f52d8 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"b"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Mb"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"Tb"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Pb"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Uden titel&gt;"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index b22322430af4..23df4b305308 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Unbenannt&gt;"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 88440cb1dfbf..15091c5378d4 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Χωρίς τίτλο&gt;"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 9b5528c32e1f..f3e01e2d3206 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Untitled&gt;"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 9b5528c32e1f..f3e01e2d3206 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Untitled&gt;"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 9b5528c32e1f..f3e01e2d3206 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Untitled&gt;"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 5bf170bc4bbc..49b1837c5e1a 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Sin título&gt;"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 6c5e7e566398..28aaff0b0cf5 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Sin título&gt;"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index b4d4cff5c4c4..5f7802fc9cae 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Pealkirjata&gt;"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index b5234a8e3154..e72b12b09b85 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Izengabea&gt;"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 9aeae4aff957..57e4317b5883 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"بایت"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"کیلوبایت"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"مگابایت"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"گیگابایت"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ترابایت"</string>
<string name="petabyteShort" msgid="5637816680144990219">"پتابایت"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> ‏<xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"‏&lt;بدون عنوان&gt;"</string>
@@ -233,7 +229,7 @@
<string name="global_action_assist" msgid="3892832961594295030">"دستیار"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"دستیار صوتی"</string>
<string name="global_action_lockdown" msgid="8751542514724332873">"اکنون قفل شود"</string>
- <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"بیشتر از 999"</string>
+ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"۹۹۹+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"محتواها پنهان هستند"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"محتوا بر اساس خط‌مشی پنهان شده است"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"صفحه‌‌کلید مجازی"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 44c5efa6c50b..4d1a8ef3b87c 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"t"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kt"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Mt"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"Gt"</string>
- <string name="terabyteShort" msgid="231613018159186962">"Tt"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Pt"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Nimetön&gt;"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index c6881825bfe1..c31240d6143c 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"o"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"ko"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Mo"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string>
- <string name="terabyteShort" msgid="231613018159186962">"To"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Po"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Sans_titre&gt;"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index a5c9b0f9c4fb..67962751125c 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"octet(s)"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"Ko"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Mo"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string>
- <string name="terabyteShort" msgid="231613018159186962">"To"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Po"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Sans nom&gt;"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 8db169b0276e..0898717df597 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Sen título&gt;"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 8745c647816c..abc8da093346 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;અનામાંકિત&gt;"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index bffede48084f..7d68579a97ce 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;शीर्षक-रहित&gt;"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 094af8d8110a..89c5d03afc16 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Bez naslova&gt;"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 29a79e54c890..c7a498c232be 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Névtelen&gt;"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 7cf7507e9100..b47cded04fe9 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Բ"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"կԲ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"ՄԲ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ԳԲ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ՏԲ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Պբ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Անանուն&gt;"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 81fe2471a59e..ed04809d2629 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Tanpa judul&gt;"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 2ce334e187d9..5ba15a31bdc0 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Ónefnt&gt;"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 29ebdd8b4f3b..8272d11ea009 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Senza nome&gt;"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 426442c0734c..06ee4ac753f0 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"‏&gt;ללא כותרת&lt;"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 0dcc4e013a1c..1206432ab158 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;新規&gt;"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 0ff01ab2100f..e4e8d30f10cf 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"ბაიტი"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"კბაიტი"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"მბაიტი"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"გბაიტი"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ტბაიტი"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"უსათაურო"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 08e1e912391b..a56f246a671e 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Атаусыз&gt;"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index f841721562d4..ef88958abf22 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"មេកាបៃ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ជីកាបៃ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"តេរ៉ាបៃ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;គ្មាន​ចំណង​ជើង&gt;"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 7527362f7aad..76af3638d156 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;ಶೀರ್ಷಿಕೆ ರಹಿತ&gt;"</string>
@@ -1094,7 +1090,7 @@
<item quantity="one">ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಲಭ್ಯವಿವೆ</item>
<item quantity="other">ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಲಭ್ಯವಿವೆ</item>
</plurals>
- <string name="wifi_available_title" msgid="3817100557900599505">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಿ"</string>
+ <string name="wifi_available_title" msgid="3817100557900599505">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಿ"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
@@ -1419,7 +1415,7 @@
<string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"ಬ್ಲೂಟೂತ್‌ ಆಡಿಯೊ"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"ವಯರ್‌ಲೆಸ್ ಪ್ರದರ್ಶನ"</string>
<string name="media_route_button_content_description" msgid="591703006349356016">"ಪಾತ್ರ"</string>
- <string name="media_route_chooser_title" msgid="1751618554539087622">"ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಿ"</string>
+ <string name="media_route_chooser_title" msgid="1751618554539087622">"ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಿಸಿ"</string>
<string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"ಸಾಧನಕ್ಕೆ ಬಿತ್ತರಿಸುವ ಪರದೆ"</string>
<string name="media_route_chooser_searching" msgid="4776236202610828706">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
<string name="media_route_chooser_extended_settings" msgid="87015534236701604">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index bab45194f54f..f1b7a01ce2d8 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;제목 없음&gt;"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 284253760f97..9daaf88ddfa9 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"Кб"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Мб"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"Гб"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Баш аты жок&gt;"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 52d5b0b4b8cf..a65b319be20c 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;ບໍ່ມີຊື່&gt;"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index a31dcc7e831e..befddc4f6817 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Be pavadinimo&gt;"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 8cc3d909cb62..8970f5a84e4e 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Bez nosaukuma&gt;"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index efac04215fe9..43235219f09c 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Без наслов&gt;"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 4f8d39dd6c3f..3ba18fead433 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;ശീർഷകമില്ലാത്ത&gt;"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 65b6b5b0a869..409e2247f9d9 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"килобайт"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Гарчиггүй&gt;"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index ea3705fae574..c80377b38117 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;अशीर्षकांकित&gt;"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index f322d4ee581b..c2804566a4ca 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B."</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Tidak bertajuk&gt;"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 7234cd955f32..2f3a0d5a3238 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;ခေါင်းစဉ်မဲ့&gt;"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index dabe298900b2..4eca1657e892 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Uten navn&gt;"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 44f17bcb3b23..4d8dfc661562 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"के.बि."</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;बिना शीर्षक&gt;"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 3c1f06775fbf..3e78d71d5b83 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">" KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Naamloos&gt;"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 64d267ee8e27..3f55342f8cff 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;ਬਿਨਾਂ ਸਿਰਲੇਖ&gt;"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 1747f2759d6d..cf786e5dbf13 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Bez nazwy&gt;"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 05af3261c9ea..22f8a3e5629c 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Sem título&gt;"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 04a78cab1a17..149727f1dd5e 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Sem nome&gt;"</string>
@@ -51,7 +47,7 @@
<string name="needPuk2" msgid="4526033371987193070">"Introduza o PUK2 para desbloquear o cartão SIM."</string>
<string name="enablePin" msgid="209412020907207950">"Ação sem êxito. Ative o bloqueio do SIM/RUIM."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1251012001539225582">
- <item quantity="one">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item>
+ <item quantity="one">Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar bloqueado.</item>
<item quantity="other">Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar bloqueado.</item>
</plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
@@ -164,7 +160,7 @@
<string name="low_memory" product="tv" msgid="516619861191025923">"O armazenamento da TV está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<plurals name="ssl_ca_cert_warning" formatted="false" msgid="5106721205300213569">
- <item quantity="one">Certificate authorities installed</item>
+ <item quantity="one">Autoridades de certificação instaladas</item>
<item quantity="other">Autoridades de certificação instaladas</item>
</plurals>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por um terceiro desconhecido"</string>
@@ -220,7 +216,7 @@
<string name="bugreport_option_full_title" msgid="6354382025840076439">"Relatório completo"</string>
<string name="bugreport_option_full_summary" msgid="7210859858969115745">"Utilize esta opção para uma interferência mínima do sistema quando o dispositivo não responder ou estiver demasiado lento, ou quando precisar de todas as secções de relatório. Não permite introduzir mais detalhes ou tirar capturas de ecrã adicionais."</string>
<plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
- <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
+ <item quantity="one">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos…</item>
<item quantity="other">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
</plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencioso"</string>
@@ -856,7 +852,7 @@
<string name="oneMonthDurationPast" msgid="7396384508953779925">"Há 1 mês"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Há mais de 1 mês"</string>
<plurals name="last_num_days" formatted="false" msgid="5104533550723932025">
- <item quantity="one">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
+ <item quantity="one">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
<item quantity="other">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
</plurals>
<string name="last_month" msgid="3959346739979055432">"Último mês"</string>
@@ -878,67 +874,67 @@
<string name="years" msgid="6881577717993213522">"anos"</string>
<string name="now_string_shortest" msgid="8912796667087856402">"agora"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>a</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one">dentro de <xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> min</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one">dentro de <xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one">dentro de <xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>a</item>
+ <item quantity="one">dentro de <xliff:g id="COUNT_1">%d</xliff:g> a</item>
+ <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> a</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item>
+ <item quantity="one">há <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
</plurals>
<plurals name="duration_hours_relative" formatted="false" msgid="676894109982008411">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item>
+ <item quantity="one">há <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
</plurals>
<plurals name="duration_days_relative" formatted="false" msgid="2203515825765397130">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item>
+ <item quantity="one">há <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
</plurals>
<plurals name="duration_years_relative" formatted="false" msgid="4820062134188885734">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
+ <item quantity="one">há <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
</plurals>
<plurals name="duration_minutes_relative_future" formatted="false" msgid="4655043589817680966">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
+ <item quantity="one">dentro de <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
</plurals>
<plurals name="duration_hours_relative_future" formatted="false" msgid="8084579714205223891">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
+ <item quantity="one">dentro de <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
</plurals>
<plurals name="duration_days_relative_future" formatted="false" msgid="333215369363433992">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
+ <item quantity="one">dentro de <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
</plurals>
<plurals name="duration_years_relative_future" formatted="false" msgid="8644862986413104011">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
+ <item quantity="one">dentro de <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
</plurals>
<string name="VideoView_error_title" msgid="3534509135438353077">"Problema com o vídeo"</string>
@@ -1087,11 +1083,11 @@
<string name="ringtone_picker_title_notification" msgid="4837740874822788802">"Sons de notificação"</string>
<string name="ringtone_unknown" msgid="3914515995813061520">"Desconhecido"</string>
<plurals name="wifi_available" formatted="false" msgid="7900333017752027322">
- <item quantity="one">Wi-Fi networks available</item>
+ <item quantity="one">Redes Wi-Fi disponíveis</item>
<item quantity="other">Redes Wi-Fi disponíveis</item>
</plurals>
<plurals name="wifi_available_detailed" formatted="false" msgid="1140699367193975606">
- <item quantity="one">Open Wi-Fi networks available</item>
+ <item quantity="one">Redes Wi-Fi abertas disponíveis</item>
<item quantity="other">Redes Wi-Fi abertas disponíveis</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ligar à rede Wi-Fi aberta"</string>
@@ -1304,7 +1300,7 @@
<string name="no_matches" msgid="8129421908915840737">"Sem correspondências"</string>
<string name="find_on_page" msgid="1946799233822820384">"Localizar na página"</string>
<plurals name="matches_found" formatted="false" msgid="1210884353962081884">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
+ <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
<item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
</plurals>
<string name="action_mode_done" msgid="7217581640461922289">"Concluído"</string>
@@ -1590,7 +1586,7 @@
<string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Os PINs não correspondem. Tente novamente."</string>
<string name="restr_pin_error_too_short" msgid="8173982756265777792">"O PIN é demasiado pequeno. Deve ter, no mínimo, 4 dígitos."</string>
<plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688">
- <item quantity="one">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
+ <item quantity="one">Tente novamente dentro de <xliff:g id="COUNT">%d</xliff:g> segundos</item>
<item quantity="other">Tente novamente dentro de <xliff:g id="COUNT">%d</xliff:g> segundos</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string>
@@ -1623,35 +1619,35 @@
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar a Poupança de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
- <item quantity="one">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Durante %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Durante %1$d minutos (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Durante %1$d minutos (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="6830154222366042597">
- <item quantity="one">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Durante %1$d min (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Durante %1$d min (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Durante %1$d min (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Durante %1$d horas (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Durante %1$d horas (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Durante %1$d horas (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
- <item quantity="one">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Durante %1$d h (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Durante %1$d h (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Durante %1$d h (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes" formatted="false" msgid="5127407202506485571">
- <item quantity="one">For %d minutes</item>
+ <item quantity="one">Durante %d minutos</item>
<item quantity="other">Durante %d minutos</item>
</plurals>
<plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2199350154433426128">
- <item quantity="one">For %d min</item>
+ <item quantity="one">Durante %d min</item>
<item quantity="other">Durante %d min</item>
</plurals>
<plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">For %d hours</item>
+ <item quantity="one">Durante %d horas</item>
<item quantity="other">Durante %d horas</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
- <item quantity="one">For %d hr</item>
+ <item quantity="one">Durante %d h</item>
<item quantity="other">Durante %d h</item>
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
@@ -1687,7 +1683,7 @@
<string name="close_button_text" msgid="3937902162644062866">"Fechar"</string>
<string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
</plurals>
<string name="default_notification_channel_label" msgid="5929663562028088222">"Sem categoria"</string>
@@ -1751,7 +1747,7 @@
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Não é possível preencher automaticamente o conteúdo"</string>
<string name="autofill_picker_no_suggestions" msgid="3908514303773350735">"Sem sugestões do preenchimento automático"</string>
<plurals name="autofill_picker_some_suggestions" formatted="false" msgid="5506565809835815274">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item>
+ <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> sugestões do preenchimento automático</item>
<item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugestões do preenchimento automático</item>
</plurals>
<string name="autofill_save_title" msgid="3345527308992082601">"Pretende guardar no &lt;b&gt;<xliff:g id="LABEL">%1$s</xliff:g>&lt;/b&gt;?"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 05af3261c9ea..22f8a3e5629c 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Sem título&gt;"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 795b71be31f4..84e1c968f8f6 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TO"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PO"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Fără titlu&gt;"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index d22022d88b4d..b441503994b2 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Без названия&gt;"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 0292f82bf37c..bc1e43333c79 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;නම් යොදා නැත&gt;"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 4c22ae7ea01d..f93a9bf4f5ad 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Bez mena&gt;"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index ac24366aadc1..4d3c3b2acf63 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Brez naslova&gt;"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index c31c8a4b9d88..a677d71e8844 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"terabajt"</string>
<string name="petabyteShort" msgid="5637816680144990219">"petabajt"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Pa titull&gt;"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 02dddb882bd7..319f0001eb7f 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Без наслова&gt;"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index b1a13511ecd7..808681c3e90e 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Okänd&gt;"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 2eb17206205d..afac1d3bcd0c 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Haina jina&gt;"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 714602ffe568..06406c62635f 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"பை."</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"கி.பை."</string>
- <string name="megabyteShort" msgid="6355851576770428922">"மெ.பை."</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ஜி.பை."</string>
- <string name="terabyteShort" msgid="231613018159186962">"டெ.பை."</string>
<string name="petabyteShort" msgid="5637816680144990219">"பெ.பை."</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;பெயரிடப்படாதது&gt;"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 92fba6ea1f5a..2a6c5b72050d 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;శీర్షిక లేనిది&gt;"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 3c33686d1a85..87a00b2b34ab 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;ไม่มีชื่อ&gt;"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 2976911b3a73..866292f22d49 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Walang pamagat&gt;"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 48c714b64658..58a69e55160c 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Adsız&gt;"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 715a019d85d7..c21d7be10ffb 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"Кб"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Мб"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"Гб"</string>
- <string name="terabyteShort" msgid="231613018159186962">"Тб"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Пб"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Без назви&gt;"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index ca753697142e..33f74daa443c 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"بائٹس"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"‏‎&gt;‎بلا عنوان‎&lt;‎"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index e26289386e2e..07f41fc94137 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Nomsiz&gt;"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 73a65b727e6d..661ff16040d2 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Không có tiêu đề&gt;"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index dc0395adf6dd..40ab9e449e9b 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;未命名&gt;"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 57798ee01ad6..8644877153f4 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;未命名&gt;"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 39564ea543fc..9b1d9523464e 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"位元組"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;未命名&gt;"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 85180965d084..d144ad7e7d20 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -21,10 +21,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"&lt;Akunasihloko&gt;"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index dd840b0e5b10..2eecf6d573be 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -4677,9 +4677,11 @@
result to valid color values. Saturate(S + D) -->
<enum name="add" value="16" />
</attr>
- <!-- Extra spacing between lines of text. -->
+ <!-- Extra spacing between lines of text. The value will not be applied for the last
+ line of text. -->
<attr name="lineSpacingExtra" format="dimension" />
- <!-- Extra spacing between lines of text, as a multiplier. -->
+ <!-- Extra spacing between lines of text, as a multiplier. The value will not be applied
+ for the last line of text.-->
<attr name="lineSpacingMultiplier" format="float" />
<!-- The number of times to repeat the marquee animation. Only applied if the
TextView has marquee enabled. -->
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 33f69b47af36..c2e97596192a 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -1527,6 +1527,7 @@
<attr name="logo" />
<attr name="permissionGroup" />
<attr name="description" />
+ <attr name="request" />
<attr name="protectionLevel" />
<attr name="permissionFlags" />
</declare-styleable>
@@ -1554,6 +1555,7 @@
<attr name="banner" />
<attr name="logo" />
<attr name="description" />
+ <attr name="request" />
<attr name="permissionGroupFlags" />
<attr name="priority" />
</declare-styleable>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 65c52792226b..bfd141e1c082 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -633,46 +633,73 @@
<string name="permgrouplab_contacts">Contacts</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_contacts">access your contacts</string>
+ <!-- Message shown to the user when the apps requests permission from this group -->
+ <string name="permgrouprequest_contacts">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access your contacts</string>
<!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgrouplab_location">Location</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_location">access this device\'s location</string>
+ <!-- Message shown to the user when the apps requests permission from this group -->
+ <string name="permgrouprequest_location">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access this device\'s location</string>
<!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgrouplab_calendar">Calendar</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_calendar">access your calendar</string>
+ <!-- Message shown to the user when the apps requests permission from this group -->
+ <string name="permgrouprequest_calendar">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access your calendar</string>
<!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgrouplab_sms">SMS</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_sms">send and view SMS messages</string>
+ <!-- Message shown to the user when the apps requests permission from this group -->
+ <string name="permgrouprequest_sms">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to send and view SMS messages</string>
<!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgrouplab_storage">Storage</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_storage">access photos, media, and files on your device</string>
+ <!-- Message shown to the user when the apps requests permission from this group -->
+ <string name="permgrouprequest_storage">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access photos, media, and files on your device</string>
<!-- Title of a category of application permissioncds, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgrouplab_microphone">Microphone</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_microphone">record audio</string>
+ <!-- Message shown to the user when the apps requests permission from this group -->
+ <string name="permgrouprequest_microphone">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to record audio</string>
<!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgrouplab_camera">Camera</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_camera">take pictures and record video</string>
+ <!-- Message shown to the user when the apps requests permission from this group -->
+ <string name="permgrouprequest_camera">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to take pictures and record video</string>
<!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgrouplab_phone">Phone</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_phone">make and manage phone calls</string>
+ <!-- Message shown to the user when the apps requests permission from this group -->
+ <string name="permgrouprequest_phone">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to make and manage phone calls</string>
<!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgrouplab_sensors">Body Sensors</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_sensors">access sensor data about your vital signs</string>
+ <!-- Message shown to the user when the apps requests permission from this group -->
+ <string name="permgrouprequest_sensors">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access sensor data about your vital signs</string>
<!-- Title for the capability of an accessibility service to retrieve window content. -->
<string name="capability_title_canRetrieveWindowContent">Retrieve window content</string>
@@ -2599,6 +2626,9 @@
<!-- Item on EditText context menu. This action is used to cut selected the text into the clipboard. -->
<string name="copy">Copy</string>
+ <!-- Error shown by TextView/EditText when cut/copy operation fails because text is too long to copy into the clipboard. -->
+ <string name="failed_to_copy_to_clipboard">Failed to copy to clipboard</string>
+
<!-- Item on EditText context menu. This action is used to paste from the clipboard into the eidt field -->
<string name="paste">Paste</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 4b24c4a7b635..6ca923d3d8d2 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2540,6 +2540,8 @@
<java-symbol type="id" name="suggestionContainer" />
<java-symbol type="id" name="addToDictionaryButton" />
<java-symbol type="id" name="deleteButton" />
+ <!-- TextView -->
+ <java-symbol type="string" name="failed_to_copy_to_clipboard" />
<java-symbol type="id" name="notification_material_reply_container" />
<java-symbol type="id" name="notification_material_reply_text_1" />
diff --git a/core/tests/coretests/src/android/text/TextUtilsTest.java b/core/tests/coretests/src/android/text/TextUtilsTest.java
index 472b3e2cd20d..46d361fae871 100644
--- a/core/tests/coretests/src/android/text/TextUtilsTest.java
+++ b/core/tests/coretests/src/android/text/TextUtilsTest.java
@@ -683,4 +683,36 @@ public class TextUtilsTest {
assertEquals(source.getSpanFlags(span), result.getSpanFlags(span));
}
}
+
+ @Test
+ public void testTrimToSize() {
+ final String testString = "a\uD800\uDC00a";
+ assertEquals("Should return text as it is if size is longer than length",
+ testString, TextUtils.trimToSize(testString, 5));
+ assertEquals("Should return text as it is if size is equal to length",
+ testString, TextUtils.trimToSize(testString, 4));
+ assertEquals("Should trim text",
+ "a\uD800\uDC00", TextUtils.trimToSize(testString, 3));
+ assertEquals("Should trim surrogate pairs if size is in the middle of a pair",
+ "a", TextUtils.trimToSize(testString, 2));
+ assertEquals("Should trim text",
+ "a", TextUtils.trimToSize(testString, 1));
+ assertEquals("Should handle null",
+ null, TextUtils.trimToSize(null, 1));
+
+ assertEquals("Should trim high surrogate if invalid surrogate",
+ "a\uD800", TextUtils.trimToSize("a\uD800\uD800", 2));
+ assertEquals("Should trim low surrogate if invalid surrogate",
+ "a\uDC00", TextUtils.trimToSize("a\uDC00\uDC00", 2));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testTrimToSizeThrowsExceptionForNegativeSize() {
+ TextUtils.trimToSize("", -1);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testTrimToSizeThrowsExceptionForZeroSize() {
+ TextUtils.trimToSize("abc", 0);
+ }
}
diff --git a/core/tests/coretests/src/android/widget/TextViewTest.java b/core/tests/coretests/src/android/widget/TextViewTest.java
index 1a1244f0a7d1..5806bf102beb 100644
--- a/core/tests/coretests/src/android/widget/TextViewTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewTest.java
@@ -220,4 +220,33 @@ public class TextViewTest {
assertTrue("Hyphenation must happen on TextView narrower than the word width",
hyphenationHappend);
}
+
+ @Test
+ @UiThreadTest
+ public void testCopyShouldNotThrowException() throws Throwable {
+ mTextView = new TextView(mActivity);
+ mTextView.setTextIsSelectable(true);
+ mTextView.setText(createLongText());
+ mTextView.onTextContextMenuItem(TextView.ID_SELECT_ALL);
+ mTextView.onTextContextMenuItem(TextView.ID_COPY);
+ }
+
+ @Test
+ @UiThreadTest
+ public void testCutShouldNotThrowException() throws Throwable {
+ mTextView = new TextView(mActivity);
+ mTextView.setTextIsSelectable(true);
+ mTextView.setText(createLongText());
+ mTextView.onTextContextMenuItem(TextView.ID_SELECT_ALL);
+ mTextView.onTextContextMenuItem(TextView.ID_CUT);
+ }
+
+ private String createLongText() {
+ int size = 600 * 1000;
+ final StringBuilder builder = new StringBuilder(size);
+ for (int i = 0; i < size; i++) {
+ builder.append('a');
+ }
+ return builder.toString();
+ }
}
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index e9e2e8acc1dc..1f552321390d 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -265,6 +265,7 @@ applications that come with the platform
<permission name="android.permission.DELETE_CACHE_FILES"/>
<permission name="android.permission.DELETE_PACKAGES"/>
<permission name="android.permission.DUMP"/>
+ <permission name="android.permission.ACTIVITY_EMBEDDING"/>
<permission name="android.permission.FORCE_STOP_PACKAGES"/>
<permission name="android.permission.GET_APP_OPS_STATS"/>
<permission name="android.permission.INSTALL_LOCATION_PROVIDER"/>
diff --git a/graphics/java/android/graphics/LeakyTypefaceStorage.java b/graphics/java/android/graphics/LeakyTypefaceStorage.java
new file mode 100644
index 000000000000..618e60d442d7
--- /dev/null
+++ b/graphics/java/android/graphics/LeakyTypefaceStorage.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 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 android.graphics;
+
+import com.android.internal.annotations.GuardedBy;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Process;
+import android.util.ArrayMap;
+
+import java.util.ArrayList;
+
+/**
+ * This class is used for Parceling Typeface object.
+ * Note: Typeface object can not be passed over the process boundary.
+ *
+ * @hide
+ */
+public class LeakyTypefaceStorage {
+ private static final Object sLock = new Object();
+
+ @GuardedBy("sLock")
+ private static final ArrayList<Typeface> sStorage = new ArrayList<>();
+ @GuardedBy("sLock")
+ private static final ArrayMap<Typeface, Integer> sTypefaceMap = new ArrayMap<>();
+
+ /**
+ * Write typeface to parcel.
+ *
+ * You can't transfer Typeface to a different process. {@link readTypefaceFromParcel} will
+ * return {@code null} if the {@link readTypefaceFromParcel} is called in a different process.
+ *
+ * @param typeface A {@link Typeface} to be written.
+ * @param parcel A {@link Parcel} object.
+ */
+ public static void writeTypefaceToParcel(@Nullable Typeface typeface, @NonNull Parcel parcel) {
+ parcel.writeInt(Process.myPid());
+ synchronized (sLock) {
+ final int id;
+ final Integer i = sTypefaceMap.get(typeface);
+ if (i != null) {
+ id = i.intValue();
+ } else {
+ id = sStorage.size();
+ sStorage.add(typeface);
+ sTypefaceMap.put(typeface, id);
+ }
+ parcel.writeInt(id);
+ }
+ }
+
+ /**
+ * Read typeface from parcel.
+ *
+ * If the {@link Typeface} was created in another process, this method returns null.
+ *
+ * @param parcel A {@link Parcel} object
+ * @return A {@link Typeface} object.
+ */
+ public static @Nullable Typeface readTypefaceFromParcel(@NonNull Parcel parcel) {
+ final int pid = parcel.readInt();
+ final int typefaceId = parcel.readInt();
+ if (pid != Process.myPid()) {
+ return null; // The Typeface was created and written in another process.
+ }
+ synchronized (sLock) {
+ return sStorage.get(typefaceId);
+ }
+ }
+}
diff --git a/graphics/java/android/graphics/fonts/FontVariationAxis.java b/graphics/java/android/graphics/fonts/FontVariationAxis.java
index 99564fab94cd..1b7408a03294 100644
--- a/graphics/java/android/graphics/fonts/FontVariationAxis.java
+++ b/graphics/java/android/graphics/fonts/FontVariationAxis.java
@@ -178,7 +178,7 @@ public final class FontVariationAxis {
* @return String a valid font variation settings string.
*/
public static @NonNull String toFontVariationSettings(@Nullable FontVariationAxis[] axes) {
- if (axes == null || axes.length == 0) {
+ if (axes == null) {
return "";
}
return TextUtils.join(",", axes);
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 2fdfcd42a1e1..0700d1fb9f70 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -50,9 +50,9 @@ Caches* Caches::sInstance = nullptr;
///////////////////////////////////////////////////////////////////////////////
Caches::Caches(RenderState& renderState)
- : gradientCache(mExtensions)
+ : gradientCache(extensions())
, patchCache(renderState)
- , programCache(mExtensions)
+ , programCache(extensions())
, mRenderState(&renderState)
, mInitialized(false) {
INIT_LOGD("Creating OpenGL renderer caches");
@@ -80,7 +80,7 @@ bool Caches::init() {
}
void Caches::initExtensions() {
- if (mExtensions.hasDebugMarker()) {
+ if (extensions().hasDebugMarker()) {
eventMark = glInsertEventMarkerEXT;
startMark = glPushGroupMarkerEXT;
@@ -93,12 +93,12 @@ void Caches::initExtensions() {
}
void Caches::initConstraints() {
- glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
+ maxTextureSize = DeviceInfo::get()->maxTextureSize();
}
void Caches::initStaticProperties() {
// OpenGL ES 3.0+ specific features
- gpuPixelBuffersEnabled = mExtensions.hasPixelBufferObjects()
+ gpuPixelBuffersEnabled = extensions().hasPixelBufferObjects()
&& property_get_bool(PROPERTY_ENABLE_GPU_PIXEL_BUFFERS, true);
}
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 19063e3768cd..29eddde1e42b 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -16,6 +16,7 @@
#pragma once
+#include "DeviceInfo.h"
#include "Extensions.h"
#include "FboCache.h"
#include "GammaFontRenderer.h"
@@ -145,10 +146,6 @@ public:
// Misc
GLint maxTextureSize;
-private:
- // Declared before gradientCache and programCache which need this to initialize.
- // TODO: cleanup / move elsewhere
- Extensions mExtensions;
public:
TextureCache textureCache;
RenderBufferCache renderBufferCache;
@@ -174,7 +171,7 @@ public:
void setProgram(const ProgramDescription& description);
void setProgram(Program* program);
- const Extensions& extensions() const { return mExtensions; }
+ const Extensions& extensions() const { return DeviceInfo::get()->extensions(); }
Program& program() { return *mProgram; }
PixelBufferState& pixelBufferState() { return *mPixelBufferState; }
TextureState& textureState() { return *mTextureState; }
diff --git a/libs/hwui/DeviceInfo.cpp b/libs/hwui/DeviceInfo.cpp
index d180ba51b304..37965daf9a8d 100644
--- a/libs/hwui/DeviceInfo.cpp
+++ b/libs/hwui/DeviceInfo.cpp
@@ -16,7 +16,8 @@
#include <DeviceInfo.h>
-#include "Extensions.h"
+#include <gui/ISurfaceComposer.h>
+#include <gui/SurfaceComposerClient.h>
#include <thread>
#include <mutex>
@@ -46,13 +47,22 @@ void DeviceInfo::initialize() {
void DeviceInfo::initialize(int maxTextureSize) {
std::call_once(sInitializedFlag, [maxTextureSize]() {
sDeviceInfo = new DeviceInfo();
+ sDeviceInfo->loadDisplayInfo();
sDeviceInfo->mMaxTextureSize = maxTextureSize;
});
}
void DeviceInfo::load() {
+ loadDisplayInfo();
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
}
+void DeviceInfo::loadDisplayInfo() {
+ sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(
+ ISurfaceComposer::eDisplayIdMain));
+ status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &mDisplayInfo);
+ LOG_ALWAYS_FATAL_IF(status, "Failed to get display info, error %d", status);
+}
+
} /* namespace uirenderer */
} /* namespace android */
diff --git a/libs/hwui/DeviceInfo.h b/libs/hwui/DeviceInfo.h
index aff84b02d85a..5bd7b14b156d 100644
--- a/libs/hwui/DeviceInfo.h
+++ b/libs/hwui/DeviceInfo.h
@@ -16,7 +16,10 @@
#ifndef DEVICEINFO_H
#define DEVICEINFO_H
+#include <ui/DisplayInfo.h>
+
#include "utils/Macros.h"
+#include "Extensions.h"
namespace android {
namespace uirenderer {
@@ -35,14 +38,24 @@ public:
static void initialize(int maxTextureSize);
int maxTextureSize() const { return mMaxTextureSize; }
+ const DisplayInfo& displayInfo() const { return mDisplayInfo; }
+ const Extensions& extensions() const { return mExtensions; }
+
+ static uint32_t multiplyByResolution(uint32_t in) {
+ auto di = DeviceInfo::get()->displayInfo();
+ return di.w * di.h * in;
+ }
private:
DeviceInfo() {}
~DeviceInfo() {}
void load();
+ void loadDisplayInfo();
int mMaxTextureSize;
+ DisplayInfo mDisplayInfo;
+ Extensions mExtensions;
};
} /* namespace uirenderer */
diff --git a/libs/hwui/FboCache.cpp b/libs/hwui/FboCache.cpp
index b2181b60054f..a39e49f82eb0 100644
--- a/libs/hwui/FboCache.cpp
+++ b/libs/hwui/FboCache.cpp
@@ -28,7 +28,7 @@ namespace uirenderer {
///////////////////////////////////////////////////////////////////////////////
FboCache::FboCache()
- : mMaxSize(Properties::fboCacheSize) {}
+ : mMaxSize(0) {}
FboCache::~FboCache() {
clear();
diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp
index ee99018fb652..bc4181075319 100644
--- a/libs/hwui/FontRenderer.cpp
+++ b/libs/hwui/FontRenderer.cpp
@@ -32,7 +32,6 @@
#include "utils/Timing.h"
#include <algorithm>
-#include <cutils/properties.h>
#include <RenderScript.h>
#include <SkGlyph.h>
#include <SkUtils.h>
@@ -99,22 +98,14 @@ FontRenderer::FontRenderer(const uint8_t* gammaTable)
INIT_LOGD("Creating FontRenderer");
}
- mSmallCacheWidth = property_get_int32(PROPERTY_TEXT_SMALL_CACHE_WIDTH,
- DEFAULT_TEXT_SMALL_CACHE_WIDTH);
- mSmallCacheHeight = property_get_int32(PROPERTY_TEXT_SMALL_CACHE_HEIGHT,
- DEFAULT_TEXT_SMALL_CACHE_HEIGHT);
+ auto deviceInfo = DeviceInfo::get();
+ int maxTextureSize = deviceInfo->maxTextureSize();
- mLargeCacheWidth = property_get_int32(PROPERTY_TEXT_LARGE_CACHE_WIDTH,
- DEFAULT_TEXT_LARGE_CACHE_WIDTH);
- mLargeCacheHeight = property_get_int32(PROPERTY_TEXT_LARGE_CACHE_HEIGHT,
- DEFAULT_TEXT_LARGE_CACHE_HEIGHT);
-
- uint32_t maxTextureSize = (uint32_t) Caches::getInstance().maxTextureSize;
-
- mSmallCacheWidth = std::min(mSmallCacheWidth, maxTextureSize);
- mSmallCacheHeight = std::min(mSmallCacheHeight, maxTextureSize);
- mLargeCacheWidth = std::min(mLargeCacheWidth, maxTextureSize);
- mLargeCacheHeight = std::min(mLargeCacheHeight, maxTextureSize);
+ // TODO: Most devices are hardcoded with this configuration, does it need to be dynamic?
+ mSmallCacheWidth = std::min(1024, maxTextureSize);
+ mSmallCacheHeight = std::min(1024, maxTextureSize);
+ mLargeCacheWidth = std::min(2048, maxTextureSize);
+ mLargeCacheHeight = std::min(1024, maxTextureSize);
if (sLogFontRendererCreate) {
INIT_LOGD(" Text cache sizes, in pixels: %i x %i, %i x %i, %i x %i, %i x %i",
diff --git a/libs/hwui/GradientCache.cpp b/libs/hwui/GradientCache.cpp
index d4d0c997be11..20262349dda4 100644
--- a/libs/hwui/GradientCache.cpp
+++ b/libs/hwui/GradientCache.cpp
@@ -20,6 +20,7 @@
#include "Debug.h"
#include "GradientCache.h"
#include "Properties.h"
+#include "DeviceInfo.h"
#include <cutils/properties.h>
@@ -62,14 +63,14 @@ int GradientCacheEntry::compare(const GradientCacheEntry& lhs, const GradientCac
// Constructors/destructor
///////////////////////////////////////////////////////////////////////////////
-GradientCache::GradientCache(Extensions& extensions)
+GradientCache::GradientCache(const Extensions& extensions)
: mCache(LruCache<GradientCacheEntry, Texture*>::kUnlimitedCapacity)
, mSize(0)
- , mMaxSize(Properties::gradientCacheSize)
+ , mMaxSize(MB(1))
, mUseFloatTexture(extensions.hasFloatTextures())
, mHasNpot(extensions.hasNPot())
, mHasLinearBlending(extensions.hasLinearBlending()) {
- glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
+ mMaxTextureSize = DeviceInfo::get()->maxTextureSize();
mCache.setOnEntryRemovedListener(this);
}
diff --git a/libs/hwui/GradientCache.h b/libs/hwui/GradientCache.h
index f299a40e994f..d95589c514eb 100644
--- a/libs/hwui/GradientCache.h
+++ b/libs/hwui/GradientCache.h
@@ -105,7 +105,7 @@ inline hash_t hash_type(const GradientCacheEntry& entry) {
*/
class GradientCache: public OnEntryRemoved<GradientCacheEntry, Texture*> {
public:
- explicit GradientCache(Extensions& extensions);
+ explicit GradientCache(const Extensions& extensions);
~GradientCache();
/**
diff --git a/libs/hwui/PatchCache.cpp b/libs/hwui/PatchCache.cpp
index 983c17e92266..78c7eb9ad809 100644
--- a/libs/hwui/PatchCache.cpp
+++ b/libs/hwui/PatchCache.cpp
@@ -32,7 +32,7 @@ namespace uirenderer {
PatchCache::PatchCache(RenderState& renderState)
: mRenderState(renderState)
- , mMaxSize(Properties::patchCacheSize)
+ , mMaxSize(KB(128))
, mSize(0)
, mCache(LruCache<PatchDescription, Patch*>::kUnlimitedCapacity)
, mMeshBuffer(0)
diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp
index cc96de71df82..8d4ae1b6622a 100644
--- a/libs/hwui/PathCache.cpp
+++ b/libs/hwui/PathCache.cpp
@@ -38,6 +38,8 @@
namespace android {
namespace uirenderer {
+static constexpr size_t PATH_CACHE_COUNT_LIMIT = 256;
+
template <class T>
static bool compareWidthHeight(const T& lhs, const T& rhs) {
return (lhs.mWidth == rhs.mWidth) && (lhs.mHeight == rhs.mHeight);
@@ -179,13 +181,9 @@ static sk_sp<Bitmap> drawPath(const SkPath* path, const SkPaint* paint, PathText
PathCache::PathCache()
: mCache(LruCache<PathDescription, PathTexture*>::kUnlimitedCapacity)
, mSize(0)
- , mMaxSize(Properties::pathCacheSize) {
+ , mMaxSize(DeviceInfo::multiplyByResolution(4)) {
mCache.setOnEntryRemovedListener(this);
-
- GLint maxTextureSize;
- glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
- mMaxTextureSize = maxTextureSize;
-
+ mMaxTextureSize = DeviceInfo::get()->maxTextureSize();
mDebugEnabled = Properties::debugLevel & kDebugCaches;
}
@@ -259,12 +257,7 @@ void PathCache::purgeCache(uint32_t width, uint32_t height) {
}
void PathCache::trim() {
- // 25 is just an arbitrary lower bound to ensure we aren't in weird edge cases
- // of things like a cap of 0 or 1 as that's going to break things.
- // It does not represent a reasonable minimum value
- static_assert(DEFAULT_PATH_TEXTURE_CAP > 25, "Path cache texture cap is too small");
-
- while (mSize > mMaxSize || mCache.size() > DEFAULT_PATH_TEXTURE_CAP) {
+ while (mSize > mMaxSize || mCache.size() > PATH_CACHE_COUNT_LIMIT) {
LOG_ALWAYS_FATAL_IF(!mCache.size(), "Inconsistent mSize! Ran out of items to remove!"
" mSize = %u, mMaxSize = %u", mSize, mMaxSize);
mCache.removeOldest();
diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp
index 8cc0aa7b414c..b767046f1a4f 100644
--- a/libs/hwui/ProgramCache.cpp
+++ b/libs/hwui/ProgramCache.cpp
@@ -505,7 +505,7 @@ const char* gBlendOps[18] = {
// Constructors/destructors
///////////////////////////////////////////////////////////////////////////////
-ProgramCache::ProgramCache(Extensions& extensions)
+ProgramCache::ProgramCache(const Extensions& extensions)
: mHasES3(extensions.getMajorGlVersion() >= 3)
, mHasLinearBlending(extensions.hasLinearBlending()) {
}
diff --git a/libs/hwui/ProgramCache.h b/libs/hwui/ProgramCache.h
index cedd854bb48b..ee76f22f35d4 100644
--- a/libs/hwui/ProgramCache.h
+++ b/libs/hwui/ProgramCache.h
@@ -40,7 +40,7 @@ namespace uirenderer {
*/
class ProgramCache {
public:
- explicit ProgramCache(Extensions& extensions);
+ explicit ProgramCache(const Extensions& extensions);
~ProgramCache();
Program* get(const ProgramDescription& description);
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index b5872485b136..acc75393ebcf 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -16,6 +16,7 @@
#include "Properties.h"
#include "Debug.h"
+#include "DeviceInfo.h"
#include <algorithm>
#include <cstdlib>
@@ -36,20 +37,6 @@ bool Properties::skipEmptyFrames = true;
bool Properties::useBufferAge = true;
bool Properties::enablePartialUpdates = true;
-float Properties::textGamma = DEFAULT_TEXT_GAMMA;
-
-int Properties::fboCacheSize = DEFAULT_FBO_CACHE_SIZE;
-int Properties::gradientCacheSize = MB(DEFAULT_GRADIENT_CACHE_SIZE);
-int Properties::layerPoolSize = MB(DEFAULT_LAYER_CACHE_SIZE);
-int Properties::patchCacheSize = KB(DEFAULT_PATCH_CACHE_SIZE);
-int Properties::pathCacheSize = MB(DEFAULT_PATH_CACHE_SIZE);
-int Properties::renderBufferCacheSize = MB(DEFAULT_RENDER_BUFFER_CACHE_SIZE);
-int Properties::tessellationCacheSize = MB(DEFAULT_VERTEX_CACHE_SIZE);
-int Properties::textDropShadowCacheSize = MB(DEFAULT_DROP_SHADOW_CACHE_SIZE);
-int Properties::textureCacheSize = MB(DEFAULT_TEXTURE_CACHE_SIZE);
-
-float Properties::textureCacheFlushRate = DEFAULT_TEXTURE_CACHE_FLUSH_RATE;
-
DebugLevel Properties::debugLevel = kDebugDisabled;
OverdrawColorSet Properties::overdrawColorSet = OverdrawColorSet::Default;
StencilClipDebug Properties::debugStencilClip = StencilClipDebug::Hide;
@@ -80,15 +67,6 @@ static int property_get_int(const char* key, int defaultValue) {
return defaultValue;
}
-static float property_get_float(const char* key, float defaultValue) {
- char buf[PROPERTY_VALUE_MAX] = {'\0',};
-
- if (property_get(key, buf, "") > 0) {
- return atof(buf);
- }
- return defaultValue;
-}
-
bool Properties::load() {
char property[PROPERTY_VALUE_MAX];
bool prevDebugLayersUpdates = debugLayersUpdates;
@@ -147,20 +125,6 @@ bool Properties::load() {
useBufferAge = property_get_bool(PROPERTY_USE_BUFFER_AGE, true);
enablePartialUpdates = property_get_bool(PROPERTY_ENABLE_PARTIAL_UPDATES, true);
- textGamma = property_get_float(PROPERTY_TEXT_GAMMA, DEFAULT_TEXT_GAMMA);
-
- fboCacheSize = property_get_int(PROPERTY_FBO_CACHE_SIZE, DEFAULT_FBO_CACHE_SIZE);
- gradientCacheSize = MB(property_get_float(PROPERTY_GRADIENT_CACHE_SIZE, DEFAULT_GRADIENT_CACHE_SIZE));
- layerPoolSize = MB(property_get_float(PROPERTY_LAYER_CACHE_SIZE, DEFAULT_LAYER_CACHE_SIZE));
- patchCacheSize = KB(property_get_float(PROPERTY_PATCH_CACHE_SIZE, DEFAULT_PATCH_CACHE_SIZE));
- pathCacheSize = MB(property_get_float(PROPERTY_PATH_CACHE_SIZE, DEFAULT_PATH_CACHE_SIZE));
- renderBufferCacheSize = MB(property_get_float(PROPERTY_RENDER_BUFFER_CACHE_SIZE, DEFAULT_RENDER_BUFFER_CACHE_SIZE));
- tessellationCacheSize = MB(property_get_float(PROPERTY_VERTEX_CACHE_SIZE, DEFAULT_VERTEX_CACHE_SIZE));
- textDropShadowCacheSize = MB(property_get_float(PROPERTY_DROP_SHADOW_CACHE_SIZE, DEFAULT_DROP_SHADOW_CACHE_SIZE));
- textureCacheSize = MB(property_get_float(PROPERTY_TEXTURE_CACHE_SIZE, DEFAULT_TEXTURE_CACHE_SIZE));
- textureCacheFlushRate = std::max(0.0f, std::min(1.0f,
- property_get_float(PROPERTY_TEXTURE_CACHE_FLUSH_RATE, DEFAULT_TEXTURE_CACHE_FLUSH_RATE)));
-
filterOutTestOverhead = property_get_bool(PROPERTY_FILTER_TEST_OVERHEAD, false);
return (prevDebugLayersUpdates != debugLayersUpdates)
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index 91b4a2d440e2..47ae9e912127 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -153,79 +153,16 @@ enum DebugLevel {
#define PROPERTY_FILTER_TEST_OVERHEAD "debug.hwui.filter_test_overhead"
/**
- * Allows to set rendering pipeline mode to OpenGL (default), Skia OpenGL
- * or Vulkan.
- */
-#define PROPERTY_RENDERER "debug.hwui.renderer"
-
-///////////////////////////////////////////////////////////////////////////////
-// Runtime configuration properties
-///////////////////////////////////////////////////////////////////////////////
-
-/**
- * Used to enable/disable scissor optimization. The accepted values are
- * "true" and "false". The default value is "false".
- *
- * When scissor optimization is enabled, libhwui will attempt to
- * minimize the use of scissor by selectively enabling and disabling the
- * GL scissor test.
- * When the optimization is disabled, OpenGLRenderer will keep the GL
- * scissor test enabled and change the scissor rect as needed.
- * Some GPUs (for instance the SGX 540) perform better when changing
- * the scissor rect often than when enabling/disabling the scissor test
- * often.
- */
-#define PROPERTY_DISABLE_SCISSOR_OPTIMIZATION "ro.hwui.disable_scissor_opt"
-
-/**
* Indicates whether PBOs can be used to back pixel buffers.
* Accepted values are "true" and "false". Default is true.
*/
-#define PROPERTY_ENABLE_GPU_PIXEL_BUFFERS "ro.hwui.use_gpu_pixel_buffers"
-
-// These properties are defined in mega-bytes
-#define PROPERTY_TEXTURE_CACHE_SIZE "ro.hwui.texture_cache_size"
-#define PROPERTY_LAYER_CACHE_SIZE "ro.hwui.layer_cache_size"
-#define PROPERTY_RENDER_BUFFER_CACHE_SIZE "ro.hwui.r_buffer_cache_size"
-#define PROPERTY_GRADIENT_CACHE_SIZE "ro.hwui.gradient_cache_size"
-#define PROPERTY_PATH_CACHE_SIZE "ro.hwui.path_cache_size"
-#define PROPERTY_VERTEX_CACHE_SIZE "ro.hwui.vertex_cache_size"
-#define PROPERTY_PATCH_CACHE_SIZE "ro.hwui.patch_cache_size"
-#define PROPERTY_DROP_SHADOW_CACHE_SIZE "ro.hwui.drop_shadow_cache_size"
-#define PROPERTY_FBO_CACHE_SIZE "ro.hwui.fbo_cache_size"
-
-// These properties are defined in percentage (range 0..1)
-#define PROPERTY_TEXTURE_CACHE_FLUSH_RATE "ro.hwui.texture_cache_flushrate"
-
-// These properties are defined in pixels
-#define PROPERTY_TEXT_SMALL_CACHE_WIDTH "ro.hwui.text_small_cache_width"
-#define PROPERTY_TEXT_SMALL_CACHE_HEIGHT "ro.hwui.text_small_cache_height"
-#define PROPERTY_TEXT_LARGE_CACHE_WIDTH "ro.hwui.text_large_cache_width"
-#define PROPERTY_TEXT_LARGE_CACHE_HEIGHT "ro.hwui.text_large_cache_height"
-
-// Gamma (>= 1.0, <= 3.0)
-#define PROPERTY_TEXT_GAMMA "hwui.text_gamma"
-
-///////////////////////////////////////////////////////////////////////////////
-// Default property values
-///////////////////////////////////////////////////////////////////////////////
-
-#define DEFAULT_TEXTURE_CACHE_SIZE 24.0f
-#define DEFAULT_LAYER_CACHE_SIZE 16.0f
-#define DEFAULT_RENDER_BUFFER_CACHE_SIZE 2.0f
-#define DEFAULT_PATH_CACHE_SIZE 4.0f
-#define DEFAULT_VERTEX_CACHE_SIZE 1.0f
-#define DEFAULT_PATCH_CACHE_SIZE 128.0f // in kB
-#define DEFAULT_GRADIENT_CACHE_SIZE 0.5f
-#define DEFAULT_DROP_SHADOW_CACHE_SIZE 2.0f
-#define DEFAULT_FBO_CACHE_SIZE 0
-
-#define DEFAULT_TEXTURE_CACHE_FLUSH_RATE 0.6f
+#define PROPERTY_ENABLE_GPU_PIXEL_BUFFERS "debug.hwui.use_gpu_pixel_buffers"
-#define DEFAULT_TEXT_GAMMA 1.45f // Match design tools
-
-// cap to 256 to limite paths in the path cache
-#define DEFAULT_PATH_TEXTURE_CAP 256
+/**
+ * Allows to set rendering pipeline mode to OpenGL (default), Skia OpenGL
+ * or Vulkan.
+ */
+#define PROPERTY_RENDERER "debug.hwui.renderer"
///////////////////////////////////////////////////////////////////////////////
// Misc
@@ -279,18 +216,8 @@ public:
static bool useBufferAge;
static bool enablePartialUpdates;
- static float textGamma;
-
- static int fboCacheSize;
- static int gradientCacheSize;
- static int layerPoolSize;
- static int patchCacheSize;
- static int pathCacheSize;
- static int renderBufferCacheSize;
- static int tessellationCacheSize;
- static int textDropShadowCacheSize;
- static int textureCacheSize;
- static float textureCacheFlushRate;
+ // TODO: Move somewhere else?
+ static constexpr float textGamma = 1.45f;
static DebugLevel debugLevel;
static OverdrawColorSet overdrawColorSet;
diff --git a/libs/hwui/RenderBufferCache.cpp b/libs/hwui/RenderBufferCache.cpp
index 1ac57cdbac0c..2f8ddfe6d660 100644
--- a/libs/hwui/RenderBufferCache.cpp
+++ b/libs/hwui/RenderBufferCache.cpp
@@ -17,6 +17,7 @@
#include "Debug.h"
#include "Properties.h"
#include "RenderBufferCache.h"
+#include "DeviceInfo.h"
#include <utils/Log.h>
@@ -36,13 +37,20 @@ namespace uirenderer {
#define RENDER_BUFFER_LOGD(...)
#endif
+static uint32_t calculateRboCacheSize() {
+ // TODO: Do we need to use extensions().has4BitStencil() here?
+ // The tuning guide recommends it, but all real devices are configured
+ // with a larger cache than necessary by 4x, so keep the 2x for now regardless
+ return DeviceInfo::multiplyByResolution(2);
+}
+
///////////////////////////////////////////////////////////////////////////////
// Constructors/destructor
///////////////////////////////////////////////////////////////////////////////
RenderBufferCache::RenderBufferCache()
: mSize(0)
- , mMaxSize(Properties::renderBufferCacheSize) {}
+ , mMaxSize(calculateRboCacheSize()) {}
RenderBufferCache::~RenderBufferCache() {
clear();
diff --git a/libs/hwui/TessellationCache.cpp b/libs/hwui/TessellationCache.cpp
index 91e7ac39af90..01582ce8f007 100644
--- a/libs/hwui/TessellationCache.cpp
+++ b/libs/hwui/TessellationCache.cpp
@@ -290,7 +290,7 @@ public:
///////////////////////////////////////////////////////////////////////////////
TessellationCache::TessellationCache()
- : mMaxSize(Properties::tessellationCacheSize)
+ : mMaxSize(MB(1))
, mCache(LruCache<Description, Buffer*>::kUnlimitedCapacity)
, mShadowCache(LruCache<ShadowDescription, Task<vertexBuffer_pair_t*>*>::kUnlimitedCapacity) {
mCache.setOnEntryRemovedListener(&mBufferRemovedListener);
diff --git a/libs/hwui/TextDropShadowCache.cpp b/libs/hwui/TextDropShadowCache.cpp
index e1f0b2a20172..c521892c69df 100644
--- a/libs/hwui/TextDropShadowCache.cpp
+++ b/libs/hwui/TextDropShadowCache.cpp
@@ -94,7 +94,7 @@ int ShadowText::compare(const ShadowText& lhs, const ShadowText& rhs) {
///////////////////////////////////////////////////////////////////////////////
TextDropShadowCache::TextDropShadowCache()
- : TextDropShadowCache(Properties::textDropShadowCacheSize) {}
+ : TextDropShadowCache(DeviceInfo::multiplyByResolution(2)) {}
TextDropShadowCache::TextDropShadowCache(uint32_t maxByteSize)
: mCache(LruCache<ShadowText, ShadowTexture*>::kUnlimitedCapacity)
diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp
index 710cdd9286e8..6fe3606a7576 100644
--- a/libs/hwui/TextureCache.cpp
+++ b/libs/hwui/TextureCache.cpp
@@ -24,6 +24,7 @@
#include "Properties.h"
#include "utils/TraceUtils.h"
#include "hwui/Bitmap.h"
+#include "DeviceInfo.h"
namespace android {
namespace uirenderer {
@@ -35,13 +36,10 @@ namespace uirenderer {
TextureCache::TextureCache()
: mCache(LruCache<uint32_t, Texture*>::kUnlimitedCapacity)
, mSize(0)
- , mMaxSize(Properties::textureCacheSize)
- , mFlushRate(Properties::textureCacheFlushRate) {
+ , mMaxSize(DeviceInfo::multiplyByResolution(4 * 6)) // 6 screen-sized RGBA_8888 bitmaps
+ , mFlushRate(.4f) {
mCache.setOnEntryRemovedListener(this);
-
- glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
- INIT_LOGD(" Maximum texture dimension is %d pixels", mMaxTextureSize);
-
+ mMaxTextureSize = DeviceInfo::get()->maxTextureSize();
mDebugEnabled = Properties::debugLevel & kDebugCaches;
}
diff --git a/libs/hwui/font/FontUtil.h b/libs/hwui/font/FontUtil.h
index 07e8b34ac66f..d4b4ff949f5a 100644
--- a/libs/hwui/font/FontUtil.h
+++ b/libs/hwui/font/FontUtil.h
@@ -25,11 +25,6 @@
// Defines
///////////////////////////////////////////////////////////////////////////////
-#define DEFAULT_TEXT_SMALL_CACHE_WIDTH 1024
-#define DEFAULT_TEXT_SMALL_CACHE_HEIGHT 512
-#define DEFAULT_TEXT_LARGE_CACHE_WIDTH 2048
-#define DEFAULT_TEXT_LARGE_CACHE_HEIGHT 512
-
#ifdef TEXTURE_BORDER_SIZE
#if TEXTURE_BORDER_SIZE != 1
#error TEXTURE_BORDER_SIZE other than 1 is not currently supported
diff --git a/libs/hwui/renderstate/OffscreenBufferPool.cpp b/libs/hwui/renderstate/OffscreenBufferPool.cpp
index 2dfa6d4dc839..ea292d678c67 100644
--- a/libs/hwui/renderstate/OffscreenBufferPool.cpp
+++ b/libs/hwui/renderstate/OffscreenBufferPool.cpp
@@ -17,7 +17,6 @@
#include "OffscreenBufferPool.h"
#include "Caches.h"
-#include "Properties.h"
#include "renderstate/RenderState.h"
#include "utils/FatVector.h"
#include "utils/TraceUtils.h"
@@ -118,7 +117,8 @@ OffscreenBuffer::~OffscreenBuffer() {
///////////////////////////////////////////////////////////////////////////////
OffscreenBufferPool::OffscreenBufferPool()
- : mMaxSize(Properties::layerPoolSize) {
+ // 4 screen-sized RGBA_8888 textures
+ : mMaxSize(DeviceInfo::multiplyByResolution(4 * 4)) {
}
OffscreenBufferPool::~OffscreenBufferPool() {
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp
index 2c92924cc12c..ededffb0f4bb 100644
--- a/libs/hwui/renderstate/RenderState.cpp
+++ b/libs/hwui/renderstate/RenderState.cpp
@@ -53,6 +53,11 @@ void RenderState::onGLContextCreated() {
mScissor = new Scissor();
mStencil = new Stencil();
+ // Deferred because creation needs GL context for texture limits
+ if (!mLayerPool) {
+ mLayerPool = new OffscreenBufferPool();
+ }
+
// This is delayed because the first access of Caches makes GL calls
if (!mCaches) {
mCaches = &Caches::createInstance(*this);
@@ -67,7 +72,7 @@ static void layerLostGlContext(Layer* layer) {
}
void RenderState::onGLContextDestroyed() {
- mLayerPool.clear();
+ mLayerPool->clear();
// TODO: reset all cached state in state objects
std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerLostGlContext);
@@ -100,7 +105,7 @@ static void layerDestroyedVkContext(Layer* layer) {
}
void RenderState::onVkContextDestroyed() {
- mLayerPool.clear();
+ mLayerPool->clear();
std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerDestroyedVkContext);
GpuMemoryTracker::onGpuContextDestroyed();
}
@@ -116,10 +121,10 @@ void RenderState::flush(Caches::FlushMode mode) {
case Caches::FlushMode::Moderate:
// fall through
case Caches::FlushMode::Layers:
- mLayerPool.clear();
+ if (mLayerPool) mLayerPool->clear();
break;
}
- mCaches->flush(mode);
+ if (mCaches) mCaches->flush(mode);
}
void RenderState::onBitmapDestroyed(uint32_t pixelRefId) {
diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h
index 4b7a86580621..df81e864a0b5 100644
--- a/libs/hwui/renderstate/RenderState.h
+++ b/libs/hwui/renderstate/RenderState.h
@@ -113,7 +113,7 @@ public:
Scissor& scissor() { return *mScissor; }
Stencil& stencil() { return *mStencil; }
- OffscreenBufferPool& layerPool() { return mLayerPool; }
+ OffscreenBufferPool& layerPool() { return *mLayerPool; }
GrContext* getGrContext() const;
@@ -136,7 +136,7 @@ private:
Scissor* mScissor = nullptr;
Stencil* mStencil = nullptr;
- OffscreenBufferPool mLayerPool;
+ OffscreenBufferPool* mLayerPool = nullptr;
std::set<Layer*> mActiveLayers;
std::set<DeferredLayerUpdater*> mActiveLayerUpdaters;
diff --git a/libs/hwui/renderstate/Stencil.cpp b/libs/hwui/renderstate/Stencil.cpp
index d25ad514e892..f59442196af1 100644
--- a/libs/hwui/renderstate/Stencil.cpp
+++ b/libs/hwui/renderstate/Stencil.cpp
@@ -47,7 +47,7 @@ uint8_t Stencil::getStencilSize() {
*/
GLenum Stencil::getLayerStencilFormat() {
#if !DEBUG_STENCIL
- const Extensions& extensions = Caches::getInstance().extensions();
+ const Extensions& extensions = DeviceInfo::get()->extensions();
if (extensions.has4BitStencil()) {
return GL_STENCIL_INDEX4_OES;
}
diff --git a/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp b/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
index 919852f6b2d7..308fef303740 100644
--- a/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
+++ b/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
@@ -74,8 +74,8 @@ RENDERTHREAD_TEST(OffscreenBufferPool, construct) {
OffscreenBufferPool pool;
EXPECT_EQ(0u, pool.getCount()) << "pool must be created empty";
EXPECT_EQ(0u, pool.getSize()) << "pool must be created empty";
- EXPECT_EQ((uint32_t) Properties::layerPoolSize, pool.getMaxSize())
- << "pool must read size from Properties";
+ // TODO: Does this really make sense as a test?
+ EXPECT_EQ(DeviceInfo::multiplyByResolution(4 * 4), pool.getMaxSize());
}
RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, getPutClear) {
diff --git a/media/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java
index ece19e46e479..986256406c4c 100644
--- a/media/java/android/media/browse/MediaBrowser.java
+++ b/media/java/android/media/browse/MediaBrowser.java
@@ -485,7 +485,7 @@ public final class MediaBrowser {
sub = new Subscription();
mSubscriptions.put(parentId, sub);
}
- sub.putCallback(options, callback);
+ sub.putCallback(mContext, options, callback);
// If we are connected, tell the service that we are watching. If we aren't connected,
// the service will be told when we connect.
@@ -662,7 +662,8 @@ public final class MediaBrowser {
final Subscription subscription = mSubscriptions.get(parentId);
if (subscription != null) {
// Tell the app.
- SubscriptionCallback subscriptionCallback = subscription.getCallback(options);
+ SubscriptionCallback subscriptionCallback =
+ subscription.getCallback(mContext, options);
if (subscriptionCallback != null) {
List<MediaItem> data = list == null ? null : list.getList();
if (options == null) {
@@ -1132,7 +1133,10 @@ public final class MediaBrowser {
return mCallbacks;
}
- public SubscriptionCallback getCallback(Bundle options) {
+ public SubscriptionCallback getCallback(Context context, Bundle options) {
+ if (options != null) {
+ options.setClassLoader(context.getClassLoader());
+ }
for (int i = 0; i < mOptionsList.size(); ++i) {
if (MediaBrowserUtils.areSameOptions(mOptionsList.get(i), options)) {
return mCallbacks.get(i);
@@ -1141,7 +1145,10 @@ public final class MediaBrowser {
return null;
}
- public void putCallback(Bundle options, SubscriptionCallback callback) {
+ public void putCallback(Context context, Bundle options, SubscriptionCallback callback) {
+ if (options != null) {
+ options.setClassLoader(context.getClassLoader());
+ }
for (int i = 0; i < mOptionsList.size(); ++i) {
if (MediaBrowserUtils.areSameOptions(mOptionsList.get(i), options)) {
mCallbacks.set(i, callback);
diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
index 174789f43229..fdb44c45d249 100644
--- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml
+++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
@@ -56,7 +56,7 @@
<string name="print_select_printer" msgid="7388760939873368698">"Selecionar impressora"</string>
<string name="print_forget_printer" msgid="5035287497291910766">"Esquecer impressora"</string>
<plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
- <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> impressoras encontradas</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> impressoras encontradas</item>
</plurals>
<string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
@@ -76,7 +76,7 @@
<string name="disabled_services_title" msgid="7313253167968363211">"Serviços desativados"</string>
<string name="all_services_title" msgid="5578662754874906455">"Todos os serviços"</string>
<plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138">
- <item quantity="one">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item>
+ <item quantity="one">Instale para detetar <xliff:g id="COUNT_1">%1$s</xliff:g> impressoras</item>
<item quantity="other">Instale para detetar <xliff:g id="COUNT_1">%1$s</xliff:g> impressoras</item>
</plurals>
<string name="printing_notification_title_template" msgid="295903957762447362">"A imprimir <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 5d04cf6974b9..b2f9c7904aed 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Gepasmaak (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hulp en terugvoer"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Kieslys"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"MGT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Voer wagwoord in om fabriekterugstelling in demonstrasiemodus uit te voer"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Volgende"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Wagwoord word benodig"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index b42d26ac3225..a3eab26eb946 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ብጁ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"እገዛ እና ግብረመልስ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ምናሌ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"ጂኤምቲ"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"የፋብሪካ ዳግም ማስጀመር በማሳያ ሁነታ ውስጥ ለማከናወን የይለፍ ቃል ያስገቡ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ቀጣይ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"የይለፍ ቃል ያስፈልጋል"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 2ac6bb502fff..d58fdca1582f 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"مخصص (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"المساعدة والتعليقات"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"القائمة"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"غرينيتش"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"إدخال كلمة المرور لإعادة الضبط بحسب بيانات المصنع في الوضع التجريبي"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"التالي"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"يلزم توفر كلمة مرور"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 494ae00bc966..d276497ea2cd 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Fərdi (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Yardım və rəy"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Demo rejimində sıfırlamaq üçün parol daxil edin"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Növbəti"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Parol tələb olunur"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index fb06a8233c7a..ca2a3905cc9c 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagođeni (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Unesite lozinku da biste obavili resetovanje na fabrička podešavanja u režimu demonstracije"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Dalje"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je lozinka"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index f73fd39f61f4..eeb796896420 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Карыстальніцкі (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Даведка і водгукі"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Каб выканаць скід да заводскіх налад у дэманстрацыйным рэжыме, увядзіце пароль"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Далей"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Патрабуецца пароль"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index aa42ccea3c2a..f66c43f61f30 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Персонализирано (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Помощ и отзиви"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"Средно време по Гринуич (GMT)"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Въведете парола за възст. на фабр. настройки в демонстр. режим"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Напред"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Изисква се парола"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 62deb12fbf94..e425df1e0361 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"কাস্টম (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"সহায়তা ও মতামত"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"মেনু"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ডেমো মোডে ফ্যাক্টরি রিসেট করতে পাসওয়ার্ড দিন"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"পরবর্তী"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"পাসওয়ার্ড আবশ্যক"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index ca187ab573db..3dd172c3092c 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagodi (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Unesite lozinku da izvršite vraćanje na fabričke postavke u načinu demonstracije"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Naprijed"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je lozinka"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 00bb4a98a5ef..9d3cf01e9778 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalitzat (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajuda i suggeriments"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Introdueix la contrasenya per restablir les dades de fàbrica en mode de demostració"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Següent"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Contrasenya obligatòria"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 8dd1c324d08a..a83b3a18cf92 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Vlastní (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Nápověda a zpětná vazba"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Nabídka"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Chcete-li v ukázkovém režimu obnovit zařízení do továrního nastavení, zadejte heslo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Další"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Je třeba zadat heslo"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 143ad9238e9e..d662dec09d7b 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tilpasset (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hjælp og feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Angiv adgangskode for at gendanne fabriksdata i demotilstand"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Næste"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Angiv en adgangskode"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index fda1aa496fe2..c46e5dd1dc18 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Benutzerdefiniert (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hilfe &amp; Feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menü"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Passwort eingeben, um Gerät im Demomodus auf Werkseinstellungen zurückzusetzen"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Weiter"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Passwort erforderlich"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 244af422292e..351cd6a4f575 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Προσαρμοσμένη (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Βοήθεια και σχόλια"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Μενού"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Εισαγάγετε κωδικό πρόσβασης για επαναφορά εργοστασιακών ρυθμίσεων στη λειτουργία επίδειξης"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Επόμενο"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Απαιτείται κωδικός πρόσβασης"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 09ad05cc7a71..adfb8c2aff7f 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Help &amp; feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 09ad05cc7a71..adfb8c2aff7f 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Help &amp; feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 09ad05cc7a71..adfb8c2aff7f 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Help &amp; feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 7e21d6c9ba28..609b66fe8cfb 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ayuda y comentarios"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Ingresa contraseña y restablece en demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Siguiente"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Contraseña obligatoria"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 4a6f12d75f73..efb845de4804 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ayuda y sugerencias"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Escribe una contraseña para restablecer datos de fábrica en modo demostración"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Siguiente"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Contraseña obligatoria"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index f3748f81a797..d988b8a1bef9 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Kohandatud (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Abi ja tagasiside"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menüü"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Sisestage parool, et demorežiimis tehaseseadetele lähtestada"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Järgmine"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Parool on kohustuslik"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 9fd8ad84f7f8..6b7a4de02dd8 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Pertsonalizatua (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Laguntza eta iritziak"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menua"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Idatzi pasahitza jatorrizko ezarpenak demo moduan berrezartzeko"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Hurrengoa"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Pasahitza behar da"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 0430592a47dd..427721a22ef7 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"سفارشی (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"راهنما و بازخورد"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"منو"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"برای انجام بازنشانی کارخانه‌ای در حالت نمایشی، گذرواژه را وارد کنید"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"بعدی"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"وارد کردن گذرواژه الزامی است"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index e3a92e6ad0fa..69a2e3fc8c90 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Muokattu (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ohje ja palaute"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Valikko"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Palauta tehdasasetukset antamalla salasana"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Seuraava"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Salasana vaaditaan"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 99692a65bd70..e52c4db89d76 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personnalisée (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Aide et commentaires"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Entrez m. passe pour réinit. en mode démo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Suivant"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Mot de passe obligatoire"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 2593c16f1242..cde086c7d30e 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personnalisé (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Aide et commentaires"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Saisir mot de passe pour rétablir conf. d\'usine en mode démo."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Suivant"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Veuillez saisir le mot de passe"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 1a6fd39d22fc..a9e0178591e0 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Axuda e comentarios"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Insire contrasinal para restablec. en demostración"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Seguinte"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"O contrasinal é obrigatorio"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 674d4c914d7f..8822d55ffe78 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"કસ્ટમ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"સહાય અને પ્રતિસાદ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"મેનુ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ડેમો મોડમાં ફેક્ટરી રીસેટ પાસવર્ડ દાખલ કરો"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"આગલું"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"પાસવર્ડ આવશ્યક છે"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index dd9ad33dc8bf..2a5b2465794f 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -220,7 +220,7 @@
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"वाई-फ़ाई के सक्रिय रहने पर भी, हमेशा मोबाइल डेटा सक्रिय रखें (तेज़ी से नेटवर्क स्विच करने के लिए)."</string>
<string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"हार्डवेयर त्‍वरण को टेदर करना उपलब्ध होने पर उसका उपयोग करें"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"USB डीबग करने की अनुमति दें?"</string>
- <string name="adb_warning_message" msgid="7316799925425402244">"USB डीबग डीबग करने का उद्देश्‍य केवल विकास है. इसका उपयोग आपके कंप्‍यूटर और आपके डिवाइस के बीच डेटा की प्रतिलिपि बनाने, बिना नोटिफिकेशन के आपके डिवाइस पर ऐप्स इंस्‍टॉल करने और लॉग डेटा पढ़ने के लिए करें."</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"USB डीबग करने का उद्देश्‍य केवल विकास है. इसका इस्तेमाल आपके कंप्‍यूटर और आपके डिवाइस के बीच डेटा को कॉपी करने, बिना नोटिफिकेशन के आपके डिवाइस पर ऐप इंस्‍टॉल करने और लॉग डेटा पढ़ने के लिए करें."</string>
<string name="adb_keys_warning_message" msgid="5659849457135841625">"आपके द्वारा पूर्व में प्राधिकृत सभी कंप्यूटर से USB डीबगिंग की पहुंच निरस्त करें?"</string>
<string name="dev_settings_warning_title" msgid="7244607768088540165">"विकास सेटिंग की अनुमति दें?"</string>
<string name="dev_settings_warning_message" msgid="2298337781139097964">"ये सेटिंग केवल विकास संबंधी उपयोग के प्रयोजन से हैं. वे आपके डिवाइस और उस पर स्‍थित ऐप्स को खराब कर सकती हैं या उनके दुर्व्यवहार का कारण हो सकती हैं."</string>
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"कस्टम (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"सहायता और फ़ीडबैक"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"मेनू"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोड में फ़ैक्टरी रीसेट के लिए पासवर्ड डालें"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"आगे"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"पासवर्ड आवश्यक"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 8ba4034477fb..68c1c94cfca8 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagođeno (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Izbornik"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Unesite zaporku za resetiranje u demo načinu"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Dalje"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je zaporka"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index a544125b98e3..d40c905b4328 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Egyéni (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Súgó és visszajelzés"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menü"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Írja be a jelszót a visszaállításhoz"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Következő"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Jelszó szükséges"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index cb042344b8a8..19414bfced86 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Հատուկ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Օգնություն և հետադարձ կապ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Ընտրացանկ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Մուտքագրեք գաղտնաբառը՝ ցուցադրական ռեժիմում գործարանային վերակայում կատարելու համար"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Հաջորդը"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Պահանջվում է գաղտնաբառ"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index a8dd4c2383c2..e468a6f5432a 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"(<xliff:g id="DENSITYDPI">%d</xliff:g>) khusus"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Bantuan &amp; masukan"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Masukkan sandi untuk mengembalikan ke setelan pabrik dalam mode demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Berikutnya"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Perlu sandi"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 7f541ce8bcfa..3fa95c003d01 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Sérsniðið (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hjálp og ábendingar"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Valmynd"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Sláðu inn aðgangsorð til að framkvæma núllstillingu í sýnisútgáfu"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Áfram"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Aðgangsorðs krafist"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 5598d87d5a24..9551ed265666 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizzato (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Guida e feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Inserisci la password per eseguire il ripristino dei dati di fabbrica in modalità demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Avanti"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password obbligatoria"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 26ce32ebc51f..979db30e059b 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"מותאם אישית (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"עזרה ומשוב"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"תפריט"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"הזן סיסמה כדי לבצע איפוס להגדרות היצרן במצב הדגמה"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"הבא"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"דרושה סיסמה"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 30c72672adbf..13e64f3acd55 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -377,7 +377,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"カスタム(<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ヘルプとフィードバック"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"メニュー"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"デモモードで初期状態にリセットするには、パスワードを入力してください"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"次へ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"パスワード必須"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 553c4a0408cc..09ee2e6c34f7 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"მორგებული (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"დახმარება და გამოხმაურება"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"მენიუ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"შეიყვანეთ პაროლი დემო-რეჟიმში ქარხნულ მდგომარეობაზე დასაბრუნებლად"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"შემდეგი"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"საჭიროა პაროლი"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 27622a1c6492..75ed497353c1 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Арнаулы (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Анықтама және пікір"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Mәзір"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Демо режимде зауыттық мәндерге қайтару үшін құпия сөзді енгізу"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Келесі"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Құпия сөз қажет"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 5f614f64502e..8b41d96b7ba1 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ផ្ទាល់ខ្លួន (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ជំនួយ និងមតិស្ថាបនា"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ម៉ឺនុយ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"បញ្ចូល​ពាក្យ​សម្ងាត់ ដើម្បី​កំណត់ឧបករណ៍​​ឡើង​វិញ​ដូចពេលចេញ​ពី​រោងចក្រ នៅក្នុង​មុខងារ​សាកល្បង"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"បន្ទាប់"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"តម្រូវ​ឲ្យ​មានពាក្យ​សម្ងាត់"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index c74b7bea73e6..b8b8daa60e09 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ಕಸ್ಟಮ್ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ಮೆನು"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್‌ಗೆ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ಮುಂದೆ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index b7cf51577f4f..7b9f354ed79c 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"맞춤(<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"고객센터"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"메뉴"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"데모 모드에서 초기화하려면 비밀번호 입력"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"다음"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"비밀번호 입력 필요"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 1fb4b48959c2..aeece8788f15 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Ыңгайлаштырылган (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Жардам жана пикир билдирүү"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Демо режиминде демейки жөндөөлөргө кайтаруу үчүн сырсөздү киргизиңиз"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Кийинки"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Сырсөз талап кылынат"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 88bdc41002d0..b4dd2be0b24d 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ປັບແຕ່ງເອງ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ຊ່ວຍເຫຼືອ &amp; ຄຳຕິຊົມ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ເມນູ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ຕໍ່ໄປ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"​ຕ້ອງ​ໃສ່​ລະ​ຫັດ​ຜ່ານ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 8ca0d369cf8f..8a3d28c05a9c 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tinkintas (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pagalba ir atsiliepimai"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meniu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Įv. slapt. ir atk. gam. nust. dem. rež."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Kitas"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Būtina nurodyti slaptažodį"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 518eb33753e1..9902b86941bd 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Pielāgots (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Palīdzība un atsauksmes"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Izvēlne"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Iev. paroli, lai atiest. rūpnīcas iest. dem. režīmā"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Tālāk"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Nepieciešama parole"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 3f7ab8c5d0b4..0d21398bbc9e 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Приспособен (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Помош и повратни информации"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Мени"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Внесете лозинка за фаб. ресет. во демо"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Следно"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Потребна е лозинка"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 635d8a44dbb4..cd15513b01cd 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ഇഷ്ടാനുസൃതം ( <xliff:g id="DENSITYDPI">%d</xliff:g> )"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"സഹായവും പ്രതികരണവും"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"മെനു"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ഡെമോ ‌മോഡിൽ ഫാക്ടറി റീസെറ്റിന് പാസ്‌വേഡ് നൽകുക"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"അടുത്തത്"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"പാസ്‌വേഡ് ആവശ്യമാണ്"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 1e864da60a04..a6d16c97e31d 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Тогтмол утга (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Тусламж, санал хүсэлт"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Цэс"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"Гринвичийн цаг"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Үйлдвэрийн тохиргоог демо горимд ажиллуулахын тулд нууц үг оруулна уу"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Дараагийн"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Нууц үг шаардлагатай"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 0d5f90b8fb83..eb6b70d27548 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"सानुकूल करा (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"मदत आणि अभिप्राय"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"मेनू"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोडमध्ये फॅक्टरी रीसेट करण्यासाठी संकेतशब्द प्रविष्ट करा"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"पुढील"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"संकेतशब्द आवश्यक"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index caa07f941fb9..b645116b69bb 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tersuai (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Bantuan &amp; maklum balas"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Mskkn kta laluan utk ttpn sml kilang dlm mod demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Seterusnya"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Kata laluan diperlukan"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index e1f008500135..ba50fad60f50 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"စိတ်ကြိုက် (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"အကူအညီနှင့် အကြံပြုချက်"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"မီနူး"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"ဂရင်းနစ်စံတော်ချိန်"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ဒီမိုမုဒ်၌မူလဆက်တင်ထားရန် စကားဝှက်ထည့်ပါ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ရှေ့သို့"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"စကားဝှက် လိုအပ်သည်"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 004fcf1ed804..f0d01c15300f 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Egendefinert (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hjelp og tilbakemelding"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meny"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Skriv inn passordet for å tilbakestille til fabrikkstandard i demomodus"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Neste"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Passord er obligatorisk"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index eac1e24384dc..89460df2d6f9 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"आफू अनुकूल (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"मद्दत र प्रतिक्रिया"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"मेनु"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोडमा फ्याक्ट्री रिसेट गर्न पासवर्ड प्रविष्ट गर्नुहोस्"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"अर्को"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"पासवर्ड आवश्यक छ"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 9ca3bfd0d7be..bd64e815106a 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Aangepast (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Help en feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Geef wachtwoord op om terug te zetten op fabrieksinstellingen in demomodus"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Volgende"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Wachtwoord vereist"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 084b9ed84b24..7c45b8b45c0e 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ਮਦਦ ਅਤੇ ਪ੍ਰਤੀਕਰਮ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ਮੀਨੂ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ਡੈਮੋ ਮੋਡ \'ਚ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਲਈ ਪਾਸਵਰਡ ਦਿਓ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ਅੱਗੇ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 58454b47a77d..64b4a34a7a56 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Niestandardowe (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoc i opinie"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Wpisz hasło, by przywrócić ustawienia fabryczne w trybie demonstracyjnym"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Dalej"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Wymagane hasło"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index a444b59be6b1..e3f287bb3829 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -190,9 +190,9 @@
</string-array>
<string-array name="animator_duration_scale_entries">
<item msgid="6039901060648228241">"Animação desativada"</item>
- <item msgid="1138649021950863198">"Escala de animação 5x"</item>
+ <item msgid="1138649021950863198">"Escala de animação 0,5x"</item>
<item msgid="4394388961370833040">"Escala de animação 1x"</item>
- <item msgid="8125427921655194973">"Escala de animação 1.5 x"</item>
+ <item msgid="8125427921655194973">"Escala de animação 1,5x"</item>
<item msgid="3334024790739189573">"Escala de animação 2x"</item>
<item msgid="3170120558236848008">"Escala de animação 5x"</item>
<item msgid="1069584980746680398">"Escala de animação 10x"</item>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 3b97a7f8e2a7..d99834fd506d 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizada (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajuda e feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Digite a senha para redef. p/ configuração original em modo demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Próxima"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Senha necessária"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index e2c6b2fe7b48..10535e9a73b4 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajuda e comentários"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Introduzir palavra-passe para efetuar a reposição de fábrica no modo demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Próximo"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Palavra-passe obrigatória"</string>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index a444b59be6b1..e3f287bb3829 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -190,9 +190,9 @@
</string-array>
<string-array name="animator_duration_scale_entries">
<item msgid="6039901060648228241">"Animação desativada"</item>
- <item msgid="1138649021950863198">"Escala de animação 5x"</item>
+ <item msgid="1138649021950863198">"Escala de animação 0,5x"</item>
<item msgid="4394388961370833040">"Escala de animação 1x"</item>
- <item msgid="8125427921655194973">"Escala de animação 1.5 x"</item>
+ <item msgid="8125427921655194973">"Escala de animação 1,5x"</item>
<item msgid="3334024790739189573">"Escala de animação 2x"</item>
<item msgid="3170120558236848008">"Escala de animação 5x"</item>
<item msgid="1069584980746680398">"Escala de animação 10x"</item>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 3b97a7f8e2a7..d99834fd506d 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizada (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajuda e feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Digite a senha para redef. p/ configuração original em modo demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Próxima"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Senha necessária"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index a3a2b47cabf6..38a6e6a3c449 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizat (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajutor și feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meniu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Introduceți parola pentru a reveni la setările din fabrică în modul demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Înainte"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Trebuie să introduceți o parolă"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 905195ad343b..5955c5f03b4d 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Другой (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Справка/отзыв"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Чтобы сбросить настройки в деморежиме, введите пароль."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Далее"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Требуется пароль"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 9c75355424f2..da1c02ea805c 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"අභිරුචි (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"උදව් සහ ප්‍රතිපෝෂණ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"මෙනුව"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ආදර්ශන ප්‍රකාර කර්මාන්තශාලා යළි සැකසීමට මුරපදය ඇ. ක."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ඊළඟ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"මුරපදය අවශ්‍යයි"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 595fd4cf850c..19cceae4a893 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Vlastné (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomocník a spätná väzba"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Ponuka"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Zadajte heslo na obnovenie továrenských nastavení v režime ukážky"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Ďalej"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Vyžaduje sa heslo"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index b8a0514f3700..3cda4e14bc72 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Po meri (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoč in povratne informacije"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Geslo za tovar. nast. v predstav. načinu"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Naprej"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Vnesite geslo"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 34d033364022..edce082bc444 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"I personalizuar (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ndihma dhe komentet"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menyja"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Fut fjalëkalimin për të kryer rivendosje në gjendje fabrike në modalitetin e demonstrimit"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Përpara"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Kërkohet fjalëkalimi"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 2b21d30a6717..c05b0aee4708 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Прилагођени (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Помоћ и повратне информације"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Мени"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Унесите лозинку да бисте обавили ресетовање на фабричка подешавања у режиму демонстрације"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Даље"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Потребна је лозинка"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index d73ec6658bb8..73e441cbf48a 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Anpassad (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hjälp och feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meny"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Ange lösenord och utför fabriksåterställning i demoläge"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Nästa"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Lösenord krävs"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index e1fc468f36ae..699b2132e81b 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Kiwango maalum (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Usaidizi na maoni"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Weka nenosiri ili urejeshe mipangilio ya kiwandani ikiwa katika hali ya onyesho."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Inayofuata"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Nenosiri linahitajika"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index b16a29cd11c4..0fb2225e594e 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"தனிப்பயன் (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"உதவி &amp; கருத்து"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"மெனு"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"டெமோ பயன்முறையில் ஆரம்பநிலை மீட்டமைவைச் செயல்படுத்த, கடவுச்சொல்லை உள்ளிடவும்"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"அடுத்து"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"கடவுச்சொல் தேவை"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 921af6868d0a..4cbf24c62fac 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"అనుకూలం (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"సహాయం &amp; అభిప్రాయం"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"మెను"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"డెమో మోడ్‌లో ఫ్యాక్టరీ రీసెట్‌ను నిర్వహించడానికి పాస్‌వర్డ్‌ను నమోదు చేయండి"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"తదుపరి"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"పాస్‌వర్డ్ అవసరం"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 4f31238d7541..f7b8bf12e43c 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"กำหนดเอง (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ความช่วยเหลือและความคิดเห็น"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"เมนู"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ป้อนรหัสผ่านเพื่อรีเซ็ตค่าในโหมดสาธิต"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ถัดไป"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ต้องป้อนรหัสผ่าน"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 984030d8e7c5..a1537d5a55b1 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Tulong at feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Ilagay ang password upang mag-factory reset sa demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Susunod"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Kinakailangan ang password"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index b0c60f55e562..380e1bd0543a 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Özel (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Yardım ve geri bildirim"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menü"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Demo modunda sıfırlamak için şifreyi girin"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Sonraki"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Şifre gerekli"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 0834d0483bcc..7c87e95d1e94 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Спеціальний масштаб (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Довідка й відгуки"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Введіть пароль, щоб скинути налаштування в демо-режимі"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Далі"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Потрібен пароль"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 3aec6aee145f..9ad7e780ab8c 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"حسب ضرورت (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"مدد اور تاثرات"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"مینو"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ڈیمو موڈ میں فیکٹری ری سیٹ کیلئے پاس ورڈ درج کریں"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"اگلا"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"پاس ورڈ درکار ہے"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 5c4d3bda0f4a..5b686df2eb49 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Moslashtirilgan (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Yordam va fikr-mulohaza"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Demo rejimda zavod holatiga qaytarish uchun parolni kiriting"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Keyingisi"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Parolni kiritish zarur"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index db2b29d5753d..6a261db5b19b 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tùy chỉnh (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Trợ giúp và phản hồi"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Nhập mật khẩu để tiến hành khôi phục cài đặt gốc ở chế độ trình diễn"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Tiếp theo"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Yêu cầu mật khẩu"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 1fe8778295bb..386478319c37 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"自定义 (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"帮助和反馈"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"菜单"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"输入密码即可在演示模式下恢复出厂设置"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"下一步"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"需要输入密码"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 080a417f453f..00e0c9a8cfd9 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"自訂 (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"說明和意見反映"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"選單"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"輸入密碼即可在示範模式下重設原廠設定"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"下一步"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"請輸入密碼"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index b3c52126a5c3..76710b0365db 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"自訂 (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"說明與意見回饋"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"選單"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"如要在示範模式中恢復原廠設定,請輸入密碼"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"下一步"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"請輸入密碼"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index f3c27a13b2cc..5da00bb355e4 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -375,7 +375,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Ngokwezifiso (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Usizo nempendulo"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Imenyu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"I-GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Faka iphasiwedi ukuze wenze ukusetha kwefekthri kumodi yedemo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Okulandelayo"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Iphasiwedi iyadingeka"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 0f8d2f9e3ca7..6086005e7844 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -177,7 +177,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
private Object mTag;
- private int mRankingScore = Integer.MIN_VALUE;
private int mSpeed = Speed.NONE;
private boolean mIsScoredNetworkMetered = false;
@@ -283,7 +282,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
this.mId = that.mId;
this.mSpeed = that.mSpeed;
this.mIsScoredNetworkMetered = that.mIsScoredNetworkMetered;
- this.mRankingScore = that.mRankingScore;
}
/**
@@ -294,7 +292,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
* 1. Active before inactive
* 2. Reachable before unreachable
* 3. Saved before unsaved
- * 4. (Internal only) Network ranking score
+ * 4. Network speed value
* 5. Stronger signal before weaker signal
* 6. SSID alphabetically
*
@@ -315,9 +313,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
if (isSaved() && !other.isSaved()) return -1;
if (!isSaved() && other.isSaved()) return 1;
- // Higher scores go before lower scores
- if (getRankingScore() != other.getRankingScore()) {
- return (getRankingScore() > other.getRankingScore()) ? -1 : 1;
+ // Faster speeds go before slower speeds
+ if (getSpeed() != other.getSpeed()) {
+ return other.getSpeed() - getSpeed();
}
// Sort by signal strength, bucketed by level
@@ -376,9 +374,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
builder.append(',').append(securityToString(security, pskType));
}
builder.append(",level=").append(getLevel());
- if (mRankingScore != Integer.MIN_VALUE) {
- builder.append(",rankingScore=").append(mRankingScore);
- }
if (mSpeed != Speed.NONE) {
builder.append(",speed=").append(mSpeed);
}
@@ -409,9 +404,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
*/
private boolean updateScores(WifiNetworkScoreCache scoreCache) {
int oldSpeed = mSpeed;
- int oldRankingScore = mRankingScore;
mSpeed = Speed.NONE;
- mRankingScore = Integer.MIN_VALUE;
if (isActive() && mInfo != null) {
NetworkKey key = new NetworkKey(new WifiKey(
@@ -419,9 +412,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
ScoredNetwork score = scoreCache.getScoredNetwork(key);
if (score != null) {
mSpeed = score.calculateBadge(mInfo.getRssi());
- if (score.hasRankingScore()) {
- mRankingScore = score.calculateRankingScore(mInfo.getRssi());
- }
}
} else {
for (ScanResult result : mScanResultCache.values()) {
@@ -429,11 +419,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
if (score == null) {
continue;
}
-
- if (score.hasRankingScore()) {
- mRankingScore =
- Math.max(mRankingScore, score.calculateRankingScore(result.level));
- }
// TODO(sghuman): Rename calculateBadge API
mSpeed = Math.max(mSpeed, score.calculateBadge(result.level));
}
@@ -443,7 +428,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
Log.i(TAG, String.format("%s: Set speed to %d", ssid, mSpeed));
}
- return (oldSpeed != mSpeed || oldRankingScore != mRankingScore);
+ return oldSpeed != mSpeed;
}
/**
@@ -764,7 +749,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
if (WifiTracker.sVerboseLogging) {
// Add RSSI/band information for this config, what was seen up to 6 seconds ago
// verbose WiFi Logging is only turned on thru developers settings
- if (mInfo != null && mNetworkInfo != null) { // This is the active connection
+ if (isActive() && mInfo != null) {
summary.append(" f=" + Integer.toString(mInfo.getFrequency()));
}
summary.append(" " + getVisibilityStatus());
@@ -799,12 +784,15 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
}
- // If Speed label is present, use the preference combination to prepend it to the summary.
- if (mSpeed != Speed.NONE) {
+ // If Speed label and summary are both present, use the preference combination to combine
+ // the two, else return the non-null one.
+ if (getSpeedLabel() != null && summary.length() != 0) {
return mContext.getResources().getString(
R.string.preference_summary_default_combination,
getSpeedLabel(),
summary.toString());
+ } else if (getSpeedLabel() != null) {
+ return getSpeedLabel();
} else {
return summary.toString();
}
@@ -826,7 +814,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
long now = System.currentTimeMillis();
- if (mInfo != null) {
+ if (isActive() && mInfo != null) {
bssid = mInfo.getBSSID();
if (bssid != null) {
visibility.append(" ").append(bssid);
@@ -834,9 +822,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
visibility.append(" rssi=").append(mInfo.getRssi());
visibility.append(" ");
visibility.append(" score=").append(mInfo.score);
- if (mRankingScore != Integer.MIN_VALUE) {
- visibility.append(" rankingScore=").append(getRankingScore());
- }
if (mSpeed != Speed.NONE) {
visibility.append(" speed=").append(getSpeedLabel());
}
@@ -1141,10 +1126,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
setRssi(AccessPoint.UNREACHABLE_RSSI);
}
- int getRankingScore() {
- return mRankingScore;
- }
-
int getSpeed() { return mSpeed;}
@Nullable
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
index 46a53a3bb4d4..bb51330fdbcc 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
@@ -23,6 +23,7 @@ import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.os.Bundle;
+import com.android.settingslib.wifi.AccessPoint.Speed;
import java.util.ArrayList;
@@ -40,6 +41,7 @@ public class TestAccessPointBuilder {
// set some sensible defaults
private String mBssid = null;
+ private int mSpeed = Speed.NONE;
private int mRssi = AccessPoint.UNREACHABLE_RSSI;
private int mNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
private String ssid = "TestSsid";
@@ -78,6 +80,7 @@ public class TestAccessPointBuilder {
bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, mScanResultCache);
}
bundle.putInt(AccessPoint.KEY_SECURITY, mSecurity);
+ bundle.putInt(AccessPoint.KEY_SPEED, mSpeed);
AccessPoint ap = new AccessPoint(mContext, bundle);
ap.setRssi(mRssi);
@@ -127,6 +130,11 @@ public class TestAccessPointBuilder {
return this;
}
+ public TestAccessPointBuilder setSpeed(int speed) {
+ mSpeed = speed;
+ return this;
+ }
+
/**
* Set whether the AccessPoint is reachable.
* Side effect: if the signal level was not previously set,
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index c081b350e823..35c730e64ead 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -50,6 +50,7 @@ import android.text.style.TtsSpan;
import com.android.settingslib.R;
+import com.android.settingslib.wifi.AccessPoint.Speed;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -145,7 +146,13 @@ public class AccessPointTest {
assertSortingWorks(savedAp, notSavedAp);
}
- //TODO: add tests for mRankingScore sort order if ranking is exposed
+ @Test
+ public void testCompareTo_GivesHighSpeedBeforeLowSpeed() {
+ AccessPoint fastAp = new TestAccessPointBuilder(mContext).setSpeed(Speed.FAST).build();
+ AccessPoint slowAp = new TestAccessPointBuilder(mContext).setSpeed(Speed.SLOW).build();
+
+ assertSortingWorks(fastAp, slowAp);
+ }
@Test
public void testCompareTo_GivesHighLevelBeforeLowLevel() {
@@ -505,7 +512,7 @@ public class AccessPointTest {
}
/**
- * Assert that the first AccessPoint appears after the second AccessPoint
+ * Assert that the first AccessPoint appears before the second AccessPoint
* once sorting has been completed.
*/
private void assertSortingWorks(AccessPoint first, AccessPoint second) {
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index e6d9a9a39280..244677508894 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -114,6 +114,7 @@
<uses-permission android:name="android.permission.GET_APP_OPS_STATS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
+ <uses-permission android:name="android.permission.ACTIVITY_EMBEDDING" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
<uses-permission android:name="android.permission.MANAGE_AUTO_FILL" />
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index c108d1ef8252..ecd27de498cb 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -110,9 +110,9 @@
<string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"端末の再起動後はパターンの入力が必要となります"</string>
<string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"端末の再起動後は PIN の入力が必要となります"</string>
<string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"端末の再起動後はパスワードの入力が必要となります"</string>
- <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"セキュリティを強化するにはパターンが必要です"</string>
- <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"セキュリティを強化するには PIN が必要です"</string>
- <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"セキュリティを強化するにはパスワードが必要です"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"追加の確認のためパターンが必要です"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"追加の確認のため PIN が必要です"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"追加の確認のためパスワードが必要です"</string>
<string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"プロファイルを切り替えるにはパターンが必要です"</string>
<string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"プロファイルを切り替えるには PIN が必要です"</string>
<string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"プロファイルを切り替えるにはパスワードが必要です"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index f3fa491f50af..a13b3dcd7029 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -93,12 +93,12 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string>
<plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
- <item quantity="one">Incorrect SIM PIN code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
+ <item quantity="one">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item>
<item quantity="other">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item>
</plurals>
<string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Cartão SIM inutilizável. Contacte o seu operador."</string>
<plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
- <item quantity="one">Incorrect SIM PUK code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
+ <item quantity="one">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável.</item>
<item quantity="other">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável.</item>
</plurals>
<string name="kg_password_pin_failed" msgid="8769990811451236223">"Falha ao introduzir o PIN do cartão SIM!"</string>
@@ -119,15 +119,15 @@
<string name="kg_prompt_reason_device_admin" msgid="3452168247888906179">"Dispositivo bloqueado pelo administrador"</string>
<string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"O dispositivo foi bloqueado manualmente"</string>
<plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
- <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item>
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o padrão.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o padrão.</item>
</plurals>
<plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
- <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item>
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o PIN.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o PIN.</item>
</plurals>
<plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
- <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
+ <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a palavra-passe.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a palavra-passe.</item>
</plurals>
<string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index d28d7d37a07d..0b7e8b019d6e 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -214,10 +214,10 @@
<string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Bluetooth conectado."</string>
<string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"O Bluetooth foi desativado."</string>
<string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"O Bluetooth foi ativado."</string>
- <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"Relatório de Localização desativado."</string>
- <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"Relatório de Localização ativado."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"O Relatório de Localização foi desativado."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"O Relatório de Localização foi ativado."</string>
+ <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"Relatório de localização desativado."</string>
+ <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"Relatório de localização ativado."</string>
+ <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"O Relatório de localização foi desativado."</string>
+ <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"O Relatório de localização foi ativado."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_close" msgid="3115847794692516306">"Fechar painel."</string>
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mais tempo."</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 27f859b4e366..c846d25640c6 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -26,7 +26,7 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Os ecrãs recentes aparecem aqui"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignorar aplicações recentes"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d screens in Overview</item>
+ <item quantity="one">%d ecrãs na Vista geral</item>
<item quantity="other">%d ecrãs na Vista geral</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
@@ -252,7 +252,7 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string>
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
- <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> more notifications inside.</item>
+ <item quantity="one">Mais <xliff:g id="NUMBER_1">%s</xliff:g> notificações no grupo.</item>
<item quantity="other">Mais <xliff:g id="NUMBER_1">%s</xliff:g> notificações no grupo.</item>
</plurals>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Definições de notificação"</string>
@@ -556,12 +556,12 @@
<string name="notification_default_channel_desc" msgid="2506053815870808359">"Esta aplicação não tem categorias de notificação"</string>
<string name="notification_unblockable_desc" msgid="3561016061737896906">"Não é possível desativar as notificações desta aplicação"</string>
<plurals name="notification_num_channels_desc" formatted="false" msgid="5492793452274077663">
- <item quantity="one">1 out of <xliff:g id="NUMBER_1">%d</xliff:g> notification categories from this app</item>
+ <item quantity="one">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorias de notificação desta aplicação</item>
<item quantity="other">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorias de notificação desta aplicação</item>
</plurals>
<string name="notification_channels_list_desc_2" msgid="6214732715833946441">"<xliff:g id="CHANNEL_NAME_1">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2">%2$s</xliff:g>"</string>
<plurals name="notification_channels_list_desc_2_and_others" formatted="false" msgid="2747813553355336157">
- <item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, and <xliff:g id="NUMBER_5">%3$d</xliff:g> others</item>
+ <item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> e mais <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> e mais <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
</plurals>
<string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Controlos de notificações da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> abertos"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index d28d7d37a07d..0b7e8b019d6e 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -214,10 +214,10 @@
<string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Bluetooth conectado."</string>
<string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"O Bluetooth foi desativado."</string>
<string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"O Bluetooth foi ativado."</string>
- <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"Relatório de Localização desativado."</string>
- <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"Relatório de Localização ativado."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"O Relatório de Localização foi desativado."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"O Relatório de Localização foi ativado."</string>
+ <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"Relatório de localização desativado."</string>
+ <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"Relatório de localização ativado."</string>
+ <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"O Relatório de localização foi desativado."</string>
+ <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"O Relatório de localização foi ativado."</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_close" msgid="3115847794692516306">"Fechar painel."</string>
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Mais tempo."</string>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
index 9338887098eb..6060134de6da 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
@@ -74,6 +74,15 @@ public class FullscreenUserSwitcher {
automaticallySelectUser();
});
+ // Any interaction with the screen should cancel the timer.
+ mContainer.setOnClickListener(v -> {
+ cancelTimer();
+ });
+ mUserGridView.setOnTouchListener((v, e) -> {
+ cancelTimer();
+ return false;
+ });
+
mSwitchingUsers = mParent.findViewById(R.id.switching_users);
}
@@ -152,6 +161,7 @@ public class FullscreenUserSwitcher {
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
+ mProgressBar.setProgress(0, true /* animate */);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index f59d18ebe6a4..b46e5e54d158 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -164,7 +164,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILIT
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBLE_BEHIND;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.ActivityStackSupervisor.ActivityContainer.FORCE_NEW_TASK_FLAGS;
import static com.android.server.am.ActivityStackSupervisor.CREATE_IF_NEEDED;
import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME;
import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_ONLY;
@@ -211,8 +210,6 @@ import android.app.ApplicationThreadConstants;
import android.app.BroadcastOptions;
import android.app.ContentProviderHolder;
import android.app.Dialog;
-import android.app.IActivityContainer;
-import android.app.IActivityContainerCallback;
import android.app.IActivityController;
import android.app.IActivityManager;
import android.app.IAppTask;
@@ -4122,8 +4119,7 @@ public class ActivityManagerService extends IActivityManager.Stub
ri.activityInfo.packageName, ri.activityInfo.name));
mActivityStarter.startActivityLocked(null, intent, null /*ephemeralIntent*/,
null, ri.activityInfo, null /*rInfo*/, null, null, null, null, 0, 0, 0,
- null, 0, 0, 0, null, false, false, null, null, null,
- "startSetupActivity");
+ null, 0, 0, 0, null, false, false, null, null, "startSetupActivity");
}
}
}
@@ -4461,26 +4457,6 @@ public class ActivityManagerService extends IActivityManager.Stub
UserHandle.getCallingUserId());
}
- final int startActivity(Intent intent, ActivityStackSupervisor.ActivityContainer container) {
- enforceNotIsolatedCaller("ActivityContainer.startActivity");
- final int userId = mUserController.handleIncomingUser(Binder.getCallingPid(),
- Binder.getCallingUid(), mStackSupervisor.mCurrentUser, false,
- ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null);
-
- // TODO: Switch to user app stacks here.
- String mimeType = intent.getType();
- final Uri data = intent.getData();
- if (mimeType == null && data != null && "content".equals(data.getScheme())) {
- mimeType = getProviderMimeType(data, userId);
- }
- container.checkEmbeddedAllowedInner(userId, intent, mimeType);
-
- intent.addFlags(FORCE_NEW_TASK_FLAGS);
- return mActivityStarter.startActivityMayWait(null, -1, null, intent, mimeType, null, null,
- null, null, 0, 0, null, null, null, null, false, userId, container, null,
- "startActivity");
- }
-
@Override
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
@@ -4491,8 +4467,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// TODO: Switch to user app stacks here.
return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
- profilerInfo, null, null, bOptions, false, userId, null, null,
- "startActivityAsUser");
+ profilerInfo, null, null, bOptions, false, userId, null, "startActivityAsUser");
}
@Override
@@ -4555,7 +4530,7 @@ public class ActivityManagerService extends IActivityManager.Stub
try {
int ret = mActivityStarter.startActivityMayWait(null, targetUid, targetPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags, null,
- null, null, bOptions, ignoreTargetSecurity, userId, null, null,
+ null, null, bOptions, ignoreTargetSecurity, userId, null,
"startActivityAsCaller");
return ret;
} catch (SecurityException e) {
@@ -4585,7 +4560,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// TODO: Switch to user app stacks here.
mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType,
null, null, resultTo, resultWho, requestCode, startFlags, profilerInfo, res, null,
- bOptions, false, userId, null, null, "startActivityAndWait");
+ bOptions, false, userId, null, "startActivityAndWait");
return res;
}
@@ -4599,7 +4574,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// TODO: Switch to user app stacks here.
int ret = mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
- null, null, config, bOptions, false, userId, null, null, "startActivityWithConfig");
+ null, null, config, bOptions, false, userId, null, "startActivityWithConfig");
return ret;
}
@@ -4630,7 +4605,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
int ret = pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null,
- resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions, null);
+ resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions);
return ret;
}
@@ -4656,7 +4631,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// TODO: Switch to user app stacks here.
return mActivityStarter.startActivityMayWait(null, callingUid, callingPackage, intent,
resolvedType, session, interactor, null, null, 0, startFlags, profilerInfo, null,
- null, bOptions, false, userId, null, null, "startVoiceActivity");
+ null, bOptions, false, userId, null, "startVoiceActivity");
}
@Override
@@ -4675,7 +4650,7 @@ public class ActivityManagerService extends IActivityManager.Stub
ALLOW_FULL_ONLY, "startAssistantActivity", null);
return mActivityStarter.startActivityMayWait(null, callingUid, callingPackage, intent,
resolvedType, null, null, null, null, 0, 0, null, null, null, bOptions, false,
- userId, null, null, "startAssistantActivity");
+ userId, null, "startAssistantActivity");
}
@Override
@@ -4848,7 +4823,7 @@ public class ActivityManagerService extends IActivityManager.Stub
null /*ephemeralIntent*/, r.resolvedType, aInfo, null /*rInfo*/, null,
null, resultTo != null ? resultTo.appToken : null, resultWho, requestCode, -1,
r.launchedFromUid, r.launchedFromPackage, -1, r.launchedFromUid, 0, options,
- false, false, null, null, null, "startNextMatchingActivity");
+ false, false, null, null, "startNextMatchingActivity");
Binder.restoreCallingIdentity(origId);
r.finishing = wasFinishing;
@@ -4880,16 +4855,15 @@ public class ActivityManagerService extends IActivityManager.Stub
final int startActivityInPackage(int uid, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo,
String resultWho, int requestCode, int startFlags, Bundle bOptions, int userId,
- IActivityContainer container, TaskRecord inTask, String reason) {
+ TaskRecord inTask, String reason) {
userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
userId, false, ALLOW_FULL_ONLY, "startActivityInPackage", null);
// TODO: Switch to user app stacks here.
- int ret = mActivityStarter.startActivityMayWait(null, uid, callingPackage, intent,
+ return mActivityStarter.startActivityMayWait(null, uid, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
- null, null, null, bOptions, false, userId, container, inTask, reason);
- return ret;
+ null, null, null, bOptions, false, userId, inTask, reason);
}
@Override
@@ -10479,44 +10453,25 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public IActivityContainer createVirtualActivityContainer(IBinder parentActivityToken,
- IActivityContainerCallback callback) throws RemoteException {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "createActivityContainer()");
- synchronized (this) {
- if (parentActivityToken == null) {
- throw new IllegalArgumentException("parent token must not be null");
- }
- ActivityRecord r = ActivityRecord.forTokenLocked(parentActivityToken);
- if (r == null) {
- return null;
- }
- if (callback == null) {
- throw new IllegalArgumentException("callback must not be null");
- }
- return mStackSupervisor.createVirtualActivityContainer(r, callback);
- }
- }
-
- @Override
- public IActivityContainer createStackOnDisplay(int displayId) throws RemoteException {
+ public int createStackOnDisplay(int displayId) throws RemoteException {
enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "createStackOnDisplay()");
synchronized (this) {
final int stackId = mStackSupervisor.getNextStackId();
final ActivityStack stack =
mStackSupervisor.createStackOnDisplay(stackId, displayId, true /*onTop*/);
if (stack == null) {
- return null;
+ return INVALID_STACK_ID;
}
- return stack.mActivityContainer;
+ return stack.mStackId;
}
}
@Override
public int getActivityDisplayId(IBinder activityToken) throws RemoteException {
synchronized (this) {
- ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
- if (stack != null && stack.mActivityContainer.isAttachedLocked()) {
- return stack.mActivityContainer.getDisplayId();
+ final ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
+ if (stack != null && stack.mDisplayId != INVALID_DISPLAY) {
+ return stack.mDisplayId;
}
return DEFAULT_DISPLAY;
}
@@ -24364,7 +24319,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
return mActivityStarter.startActivityMayWait(appThread, -1, callingPackage, intent,
resolvedType, null, null, null, null, 0, 0, null, null,
- null, bOptions, false, callingUser, null, tr, "AppTaskImpl");
+ null, bOptions, false, callingUser, tr, "AppTaskImpl");
}
@Override
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 9273b3c49074..45357cb67fd1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -19,7 +19,6 @@ package com.android.server.am;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.AppGlobals;
-import android.app.IActivityContainer;
import android.app.IActivityController;
import android.app.IActivityManager;
import android.app.IStopUserCallback;
@@ -1959,9 +1958,17 @@ final class ActivityManagerShellCommand extends ShellCommand {
throw new RuntimeException(e.getMessage(), e);
}
- IActivityContainer container = mInterface.createStackOnDisplay(displayId);
- if (container != null) {
- container.startActivity(intent);
+ final int stackId = mInterface.createStackOnDisplay(displayId);
+ if (stackId != INVALID_STACK_ID) {
+ // TODO: Need proper support if this is used by test...
+// container.startActivity(intent);
+// ActivityOptions options = ActivityOptions.makeBasic();
+// options.setLaunchDisplayId(displayId);
+// options.setLaunchStackId(stackId);
+// mInterface.startAct
+// mInterface.startActivityAsUser(null, null, intent, mimeType,
+// null, null, 0, mStartFlags, profilerInfo,
+// options != null ? options.toBundle() : null, mUserId);
}
return 0;
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 6f68c7a1df5f..410824e01e35 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -164,7 +164,6 @@ import com.android.internal.util.XmlUtils;
import com.android.server.AttributeCache;
import com.android.server.AttributeCache.Entry;
import com.android.server.am.ActivityStack.ActivityState;
-import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
import com.android.server.wm.AppWindowContainerController;
import com.android.server.wm.AppWindowContainerListener;
import com.android.server.wm.TaskWindowContainerController;
@@ -306,7 +305,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
int launchCount; // count of launches since last state
long lastLaunchTime; // time of last launch of this activity
ComponentName requestedVrComponent; // the requested component for handling VR mode.
- ArrayList<ActivityContainer> mChildContainers = new ArrayList<>();
String stringName; // for caching of toString().
@@ -320,7 +318,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
boolean mTaskOverlay = false; // Task is always on-top of other activities in the task.
boolean mUpdateTaskThumbnailWhenHidden;
- ActivityContainer mInitialActivityContainer;
TaskDescription taskDescription; // the recents information for this activity
boolean mLaunchTaskBehind; // this activity is actively being launched with
@@ -798,8 +795,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
ActivityInfo aInfo, Configuration _configuration,
ActivityRecord _resultTo, String _resultWho, int _reqCode,
boolean _componentSpecified, boolean _rootVoiceInteraction,
- ActivityStackSupervisor supervisor,
- ActivityContainer container, ActivityOptions options, ActivityRecord sourceRecord) {
+ ActivityStackSupervisor supervisor, ActivityOptions options,
+ ActivityRecord sourceRecord) {
service = _service;
appToken = new Token(this);
info = aInfo;
@@ -830,7 +827,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
idle = false;
hasBeenLaunched = false;
mStackSupervisor = supervisor;
- mInitialActivityContainer = container;
mRotationAnimationHint = aInfo.rotationAnimation;
@@ -1184,7 +1180,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
*/
boolean canBeLaunchedOnDisplay(int displayId) {
return service.mStackSupervisor.canPlaceEntityOnDisplay(displayId,
- supportsResizeableMultiWindow());
+ supportsResizeableMultiWindow(), launchedFromPid, launchedFromUid, info);
}
/**
@@ -1595,11 +1591,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
mUpdateTaskThumbnailWhenHidden = false;
}
setVisibility(visible);
- final ArrayList<ActivityContainer> containers = mChildContainers;
- for (int containerNdx = containers.size() - 1; containerNdx >= 0; --containerNdx) {
- final ActivityContainer container = containers.get(containerNdx);
- container.setVisible(visible);
- }
mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = true;
}
@@ -2615,8 +2606,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
startFreezingScreenLocked(app, 0);
- mStackSupervisor.removeChildActivityContainers(this);
-
try {
if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG_SWITCH,
"Moving to " + (andResume ? "RESUMED" : "PAUSED") + " Relaunching " + this
@@ -2795,7 +2784,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
0 /* launchedFromPid */, launchedFromUid, launchedFromPackage, intent, resolvedType,
aInfo, service.getConfiguration(), null /* resultTo */, null /* resultWho */,
0 /* reqCode */, componentSpecified, false /* rootVoiceInteraction */,
- stackSupervisor, null /* container */, null /* options */, null /* sourceRecord */);
+ stackSupervisor, null /* options */, null /* sourceRecord */);
r.persistentState = persistentState;
r.taskDescription = taskDescription;
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index ab76529cf5f6..ce8aa5edad47 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -30,6 +30,7 @@ import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
+import static android.view.Display.INVALID_DISPLAY;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ADD_REMOVE;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_APP;
@@ -124,7 +125,6 @@ import com.android.internal.app.IVoiceInteractor;
import com.android.internal.os.BatteryStatsImpl;
import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerService.ItemMatcher;
-import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
import com.android.server.wm.StackWindowController;
import com.android.server.wm.StackWindowListener;
import com.android.server.wm.WindowManagerService;
@@ -205,7 +205,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
@Override
protected ConfigurationContainer getParent() {
- return mActivityContainer.mActivityDisplay;
+ return getDisplay();
}
@Override
@@ -336,8 +336,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
int mCurrentUser;
final int mStackId;
- final ActivityContainer mActivityContainer;
/** The other stacks, in order, on the attached display. Updated at attach/detach time. */
+ // TODO: This list doesn't belong here...
ArrayList<ActivityStack> mStacks;
/** The attached Display's unique identifier, or -1 if detached */
int mDisplayId;
@@ -447,24 +447,21 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
return count;
}
- ActivityStack(ActivityStackSupervisor.ActivityContainer activityContainer,
- RecentTasks recentTasks, boolean onTop) {
- mActivityContainer = activityContainer;
- mStackSupervisor = activityContainer.getOuter();
- mService = mStackSupervisor.mService;
+ ActivityStack(ActivityStackSupervisor.ActivityDisplay display, int stackId,
+ ActivityStackSupervisor supervisor, RecentTasks recentTasks, boolean onTop) {
+ mStackSupervisor = supervisor;
+ mService = supervisor.mService;
mHandler = new ActivityStackHandler(mService.mHandler.getLooper());
mWindowManager = mService.mWindowManager;
- mStackId = activityContainer.mStackId;
+ mStackId = stackId;
mCurrentUser = mService.mUserController.getCurrentUserIdLocked();
mRecentTasks = recentTasks;
mTaskPositioner = mStackId == FREEFORM_WORKSPACE_STACK_ID
? new LaunchingTaskPositioner() : null;
- final ActivityStackSupervisor.ActivityDisplay display = mActivityContainer.mActivityDisplay;
mTmpRect2.setEmpty();
mWindowContainerController = createStackWindowController(display.mDisplayId, onTop,
mTmpRect2);
- activityContainer.mStack = this;
- mStackSupervisor.mActivityContainers.put(mStackId, activityContainer);
+ mStackSupervisor.mStacks.put(mStackId, this);
postAddToDisplay(display, mTmpRect2.isEmpty() ? null : mTmpRect2, onTop);
}
@@ -521,7 +518,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
* either destroyed completely or re-parented.
*/
private void removeFromDisplay() {
- mDisplayId = Display.INVALID_DISPLAY;
+ final ActivityStackSupervisor.ActivityDisplay display = getDisplay();
+ if (display != null) {
+ display.detachStack(this);
+ }
+ mDisplayId = INVALID_DISPLAY;
mStacks = null;
if (mTaskPositioner != null) {
mTaskPositioner.reset();
@@ -537,14 +538,18 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
/** Removes the stack completely. Also calls WindowManager to do the same on its side. */
void remove() {
removeFromDisplay();
- mStackSupervisor.deleteActivityContainerRecord(mStackId);
+ mStackSupervisor.mStacks.remove(mStackId);
mWindowContainerController.removeContainer();
mWindowContainerController = null;
onParentChanged();
}
+ ActivityStackSupervisor.ActivityDisplay getDisplay() {
+ return mStackSupervisor.getActivityDisplay(mDisplayId);
+ }
+
void getDisplaySize(Point out) {
- mActivityContainer.mActivityDisplay.mDisplay.getSize(out);
+ getDisplay().mDisplay.getSize(out);
}
/**
@@ -829,8 +834,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
final boolean isOnHomeDisplay() {
- return isAttached() &&
- mActivityContainer.mActivityDisplay.mDisplayId == DEFAULT_DISPLAY;
+ return isAttached() && mDisplayId == DEFAULT_DISPLAY;
}
void moveToFront(String reason) {
@@ -1257,12 +1261,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
return false;
}
- if (mActivityContainer.mParentActivity == null) {
- // Top level stack, not a child. Look for child stacks.
- mStackSupervisor.pauseChildStacks(prev, userLeaving, uiSleeping, resuming,
- pauseImmediately);
- }
-
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSING: " + prev);
else if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Start pausing: " + prev);
mResumedActivity = null;
@@ -1965,8 +1963,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
* {@link Display#FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD} applied.
*/
private boolean canShowWithInsecureKeyguard() {
- final ActivityStackSupervisor.ActivityDisplay activityDisplay
- = mActivityContainer.mActivityDisplay;
+ final ActivityStackSupervisor.ActivityDisplay activityDisplay = getDisplay();
if (activityDisplay == null) {
throw new IllegalStateException("Stack is not attached to any display, stackId="
+ mStackId);
@@ -2108,7 +2105,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
* occurred and the activity will be notified immediately.
*/
void notifyActivityDrawnLocked(ActivityRecord r) {
- mActivityContainer.setDrawn();
if ((r == null)
|| (mUndrawnActivitiesBelowTopTranslucent.remove(r) &&
mUndrawnActivitiesBelowTopTranslucent.isEmpty())) {
@@ -2236,12 +2232,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
final boolean hasRunningActivity = next != null;
- final ActivityRecord parent = mActivityContainer.mParentActivity;
- final boolean isParentNotResumed = parent != null && parent.state != ActivityState.RESUMED;
- if (hasRunningActivity
- && (isParentNotResumed || !mActivityContainer.isAttachedLocked())) {
- // Do not resume this stack if its parent is not resumed.
- // TODO: If in a loop, make sure that parent stack resumeTopActivity is called 1st.
+ // TODO: Maybe this entire condition can get removed?
+ if (hasRunningActivity && getDisplay() == null) {
return false;
}
@@ -3809,7 +3801,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
}
if (noActivitiesInStack) {
- mActivityContainer.onTaskListEmptyLocked();
+ remove();
}
}
@@ -3920,7 +3912,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
destIntent, null /*ephemeralIntent*/, null, aInfo, null /*rInfo*/, null,
null, parent.appToken, null, 0, -1, parent.launchedFromUid,
parent.launchedFromPackage, -1, parent.launchedFromUid, 0, null,
- false, true, null, null, null, "navigateUpTo");
+ false, true, null, null, "navigateUpTo");
foundParentInTask = res == ActivityManager.START_SUCCESS;
} catch (RemoteException e) {
foundParentInTask = false;
@@ -4005,7 +3997,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
private void removeActivityFromHistoryLocked(ActivityRecord r, String reason) {
- mStackSupervisor.removeChildActivityContainers(r);
finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
r.makeFinishingLocked();
if (DEBUG_ADD_REMOVE) Slog.i(TAG_ADD_REMOVE,
@@ -4620,7 +4611,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
* focus may be on another display.
*/
private ActivityStack getTopStackOnDisplay() {
- final ArrayList<ActivityStack> stacks = mActivityContainer.mActivityDisplay.mStacks;
+ final ArrayList<ActivityStack> stacks = getDisplay().mStacks;
return stacks.isEmpty() ? null : stacks.get(stacks.size() - 1);
}
@@ -5097,7 +5088,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
mStacks.add(0, this);
}
if (!isHomeOrRecentsStack()) {
- mActivityContainer.onTaskListEmptyLocked();
+ remove();
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 90d9149a2f66..2ef220c82bbb 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -17,7 +17,6 @@
package com.android.server.am;
import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
-import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
import static android.Manifest.permission.START_ANY_ACTIVITY;
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED;
@@ -36,8 +35,6 @@ import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static android.app.ActivityManager.StackId.RECENTS_STACK_ID;
import static android.app.ITaskStackListener.FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY;
import static android.app.ITaskStackListener.FORCED_RESIZEABLE_REASON_SPLIT_SCREEN;
-import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Process.SYSTEM_UID;
import static android.os.PowerManager.PARTIAL_WAKE_LOCK;
@@ -50,7 +47,6 @@ import static android.view.Display.TYPE_VIRTUAL;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_PICTURE_IN_PICTURE_EXPANDED_TO_FULLSCREEN;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONTAINERS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IDLE;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK;
@@ -72,7 +68,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STATES;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_TASKS;
-import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBLE_BEHIND;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.ActivityManagerService.ANIMATE;
@@ -112,7 +107,6 @@ import android.app.ActivityManager.StackId;
import android.app.ActivityManager.StackInfo;
import android.app.ActivityOptions;
import android.app.AppOpsManager;
-import android.app.IActivityContainerCallback;
import android.app.ProfilerInfo;
import android.app.ResultInfo;
import android.app.StatusBarManager;
@@ -120,7 +114,6 @@ import android.app.WaitResult;
import android.app.admin.IDevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
-import android.content.IIntentSender;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
@@ -132,10 +125,7 @@ import android.content.res.Configuration;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
-import android.hardware.display.DisplayManagerGlobal;
import android.hardware.display.DisplayManagerInternal;
-import android.hardware.display.VirtualDisplay;
-import android.hardware.input.InputManager;
import android.hardware.input.InputManagerInternal;
import android.os.Binder;
import android.os.Bundle;
@@ -151,7 +141,6 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.Trace;
-import android.os.TransactionTooLargeException;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.WorkSource;
@@ -168,9 +157,8 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.Display;
-import android.view.InputEvent;
-import android.view.Surface;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.content.ReferrerIntent;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.os.TransferPipe;
@@ -194,7 +182,6 @@ import java.util.Set;
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_AM;
- private static final String TAG_CONTAINERS = TAG + POSTFIX_CONTAINERS;
private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
private static final String TAG_IDLE = TAG + POSTFIX_IDLE;
private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
@@ -205,7 +192,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
private static final String TAG_STATES = TAG + POSTFIX_STATES;
private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
static final String TAG_TASKS = TAG + POSTFIX_TASKS;
- private static final String TAG_VISIBLE_BEHIND = TAG + POSTFIX_VISIBLE_BEHIND;
/** How long we wait until giving up on the last activity telling us it is idle. */
static final int IDLE_TIMEOUT = 10 * 1000;
@@ -224,10 +210,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5;
static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6;
static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7;
- static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8;
static final int LOCK_TASK_START_MSG = FIRST_SUPERVISOR_STACK_MSG + 9;
static final int LOCK_TASK_END_MSG = FIRST_SUPERVISOR_STACK_MSG + 10;
- static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 11;
static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_STACK_MSG + 12;
static final int SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG = FIRST_SUPERVISOR_STACK_MSG + 13;
static final int REPORT_MULTI_WINDOW_MODE_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 14;
@@ -414,7 +398,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// TODO: Add listener for removal of references.
/** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
- SparseArray<ActivityContainer> mActivityContainers = new SparseArray<>();
+ SparseArray<ActivityStack> mStacks = new SparseArray<>();
// TODO: There should be an ActivityDisplayController coordinating am/wm interaction.
/** Mapping from displayId to display current state */
@@ -491,9 +475,27 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
/** Check if placing task or activity on specified display is allowed. */
- boolean canPlaceEntityOnDisplay(int displayId, boolean resizeable) {
- return displayId == DEFAULT_DISPLAY || (mService.mSupportsMultiDisplay
- && (resizeable || displayConfigMatchesGlobal(displayId)));
+ boolean canPlaceEntityOnDisplay(int displayId, boolean resizeable, int callingPid,
+ int callingUid, ActivityInfo activityInfo) {
+ if (displayId == DEFAULT_DISPLAY) {
+ // No restrictions for the default display.
+ return true;
+ }
+ if (!mService.mSupportsMultiDisplay) {
+ // Can't launch on secondary displays if feature is not supported.
+ return false;
+ }
+ if (!resizeable && !displayConfigMatchesGlobal(displayId)) {
+ // Can't apply wrong configuration to non-resizeable activities.
+ return false;
+ }
+ if (!isCallerAllowedToLaunchOnDisplay(callingPid, callingUid, displayId, activityInfo)) {
+ // Can't place activities to a display that has restricted launch rules.
+ // In this case the request should be made by explicitly adding target display id and
+ // by caller with corresponding permissions. See #isCallerAllowedToLaunchOnDisplay().
+ return false;
+ }
+ return true;
}
/**
@@ -680,31 +682,15 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
boolean isFocusedStack(ActivityStack stack) {
- if (stack == null) {
- return false;
- }
-
- final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
- if (parent != null) {
- stack = parent.getStack();
- }
- return stack == mFocusedStack;
+ return stack != null && stack == mFocusedStack;
}
/** The top most stack on its display. */
boolean isFrontStackOnDisplay(ActivityStack stack) {
- return isFrontOfStackList(stack, stack.mActivityContainer.mActivityDisplay.mStacks);
+ return isFrontOfStackList(stack, stack.getDisplay().mStacks);
}
private boolean isFrontOfStackList(ActivityStack stack, List<ActivityStack> stackList) {
- if (stack == null) {
- return false;
- }
-
- final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
- if (parent != null) {
- stack = parent.getStack();
- }
return stack == stackList.get((stackList.size() - 1));
}
@@ -1097,21 +1083,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
return pausing;
}
- void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping,
- ActivityRecord resuming, boolean dontWait) {
- // TODO: Put all stacks in supervisor and iterate through them instead.
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
- for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = stacks.get(stackNdx);
- if (stack.mResumedActivity != null &&
- stack.mActivityContainer.mParentActivity == parent) {
- stack.startPausingLocked(userLeaving, uiSleeping, resuming, dontWait);
- }
- }
- }
- }
-
void cancelInitializingActivities() {
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
@@ -1679,8 +1650,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Check if someone tries to launch an activity on a private display with a different
// owner.
final int launchDisplayId = options.getLaunchDisplayId();
- if (launchDisplayId != INVALID_DISPLAY
- && !isCallerAllowedToLaunchOnDisplay(callingPid, callingUid, launchDisplayId)) {
+ if (launchDisplayId != INVALID_DISPLAY && !isCallerAllowedToLaunchOnDisplay(callingPid,
+ callingUid, launchDisplayId, aInfo)) {
final String msg = "Permission Denial: starting " + intent.toString()
+ " from " + callerApp + " (pid=" + callingPid
+ ", uid=" + callingUid + ") with launchDisplayId="
@@ -1694,17 +1665,24 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
/** Check if caller is allowed to launch activities on specified display. */
- boolean isCallerAllowedToLaunchOnDisplay(int callingPid, int callingUid, int launchDisplayId) {
+ boolean isCallerAllowedToLaunchOnDisplay(int callingPid, int callingUid, int launchDisplayId,
+ ActivityInfo aInfo) {
if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check: displayId=" + launchDisplayId
+ " callingPid=" + callingPid + " callingUid=" + callingUid);
+ if (callingPid == -1 && callingUid == -1) {
+ if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check: no caller info, skip check");
+ return true;
+ }
+
final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(launchDisplayId);
if (activityDisplay == null) {
Slog.w(TAG, "Launch on display check: display not found");
return false;
}
- // Check if the caller can manage activity stacks.
+ // Check if the caller has enough privileges to embed activities and launch to private
+ // displays.
final int startAnyPerm = mService.checkPermission(INTERNAL_SYSTEM_WINDOW, callingPid,
callingUid);
if (startAnyPerm == PERMISSION_GRANTED) {
@@ -1714,12 +1692,15 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
if (activityDisplay.mDisplay.getType() == TYPE_VIRTUAL
- && activityDisplay.mDisplay.getOwnerUid() != SYSTEM_UID) {
+ && activityDisplay.mDisplay.getOwnerUid() != SYSTEM_UID
+ && activityDisplay.mDisplay.getOwnerUid() != aInfo.applicationInfo.uid) {
// Limit launching on virtual displays, because their contents can be read from Surface
// by apps that created them.
- if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:"
- + " disallow launch on virtual display for not-embedded activity");
- return false;
+ if ((aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) {
+ if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:"
+ + " disallow launch on virtual display for not-embedded activity.");
+ return false;
+ }
}
if (!activityDisplay.isPrivate()) {
@@ -2210,9 +2191,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
protected <T extends ActivityStack> T getStack(int stackId, boolean createStaticStackIfNeeded,
boolean createOnTop) {
- final ActivityContainer activityContainer = mActivityContainers.get(stackId);
- if (activityContainer != null) {
- return (T) activityContainer.mStack;
+ final ActivityStack stack = mStacks.get(stackId);
+ if (stack != null) {
+ return (T) stack;
}
if (!createStaticStackIfNeeded || !StackId.isStaticStack(stackId)) {
return null;
@@ -2355,33 +2336,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
(StackId.isResizeableByDockedStack(stackId) && getStack(DOCKED_STACK_ID) != null);
}
- ActivityContainer createVirtualActivityContainer(ActivityRecord parentActivity,
- IActivityContainerCallback callback) {
- ActivityContainer activityContainer =
- new VirtualActivityContainer(parentActivity, callback);
- mActivityContainers.put(activityContainer.mStackId, activityContainer);
- if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS,
- "createActivityContainer: " + activityContainer);
- parentActivity.mChildContainers.add(activityContainer);
- return activityContainer;
- }
-
- void removeChildActivityContainers(ActivityRecord parentActivity) {
- final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers;
- for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) {
- ActivityContainer container = childStacks.remove(containerNdx);
- if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, "removeChildActivityContainers: removing "
- + container);
- container.release();
- }
- }
-
- void deleteActivityContainerRecord(int stackId) {
- if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS,
- "deleteActivityContainerRecord: callers=" + Debug.getCallers(4));
- mActivityContainers.remove(stackId);
- }
-
void resizeStackLocked(int stackId, Rect bounds, Rect tempTaskBounds, Rect tempTaskInsetBounds,
boolean preserveWindows, boolean allowResizeInDockedMode, boolean deferResume) {
if (stackId == DOCKED_STACK_ID) {
@@ -2646,12 +2600,18 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
if (activityDisplay == null) {
return null;
}
+ return createStack(stackId, activityDisplay, onTop);
- final ActivityContainer activityContainer =
- new ActivityContainer(stackId, activityDisplay, onTop);
- return activityContainer.mStack;
}
+ ActivityStack createStack(int stackId, ActivityDisplay display, boolean onTop) {
+ switch (stackId) {
+ case PINNED_STACK_ID:
+ return new PinnedActivityStack(display, stackId, this, mRecentTasks, onTop);
+ default:
+ return new ActivityStack(display, stackId, this, mRecentTasks, onTop);
+ }
+ }
void removeStackInSurfaceTransaction(int stackId) {
final ActivityStack stack = getStack(stackId);
@@ -2879,23 +2839,24 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
throw new IllegalArgumentException("moveStackToDisplayLocked: Unknown displayId="
+ displayId);
}
- final ActivityContainer activityContainer = mActivityContainers.get(stackId);
- if (activityContainer != null) {
- if (activityContainer.isAttachedLocked()) {
- if (activityContainer.getDisplayId() == displayId) {
- throw new IllegalArgumentException("Trying to move stackId=" + stackId
- + " to its current displayId=" + displayId);
- }
-
- activityContainer.moveToDisplayLocked(activityDisplay, onTop);
- } else {
- throw new IllegalStateException("moveStackToDisplayLocked: Stack with stackId="
- + stackId + " is not attached to any display.");
- }
- } else {
+ final ActivityStack stack = mStacks.get(stackId);
+ if (stack == null) {
throw new IllegalArgumentException("moveStackToDisplayLocked: Unknown stackId="
+ stackId);
}
+
+ final ActivityDisplay currentDisplay = stack.getDisplay();
+ if (currentDisplay == null) {
+ throw new IllegalStateException("moveStackToDisplayLocked: Stack with stack=" + stack
+ + " is not attached to any display.");
+ }
+
+ if (currentDisplay.mDisplayId == displayId) {
+ throw new IllegalArgumentException("Trying to move stack=" + stack
+ + " to its current displayId=" + displayId);
+ }
+
+ stack.reparent(activityDisplay, onTop);
// TODO(multi-display): resize stacks properly if moved from split-screen.
}
@@ -2923,7 +2884,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Ensure that we're not moving a task to a dynamic stack if device doesn't support
// multi-display.
// TODO(multi-display): Support non-dynamic stacks on secondary displays.
- // TODO: Check ActivityView after fixing b/35349678.
if (StackId.isDynamicStack(stackId) && !mService.mSupportsMultiDisplay) {
throw new IllegalArgumentException("Device doesn't support multi-display, can not"
+ " reparent task=" + task + " to stackId=" + stackId);
@@ -3107,11 +3067,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
+ stack);
continue;
}
- if (!stack.mActivityContainer.isEligibleForNewTasks()) {
- if (DEBUG_TASKS) Slog.d(TAG_TASKS,
- "Skipping stack: (new task not allowed) " + stack);
- continue;
- }
stack.findTaskLocked(r, mTmpFindTaskResult);
// It is possible to have tasks in multiple stacks with the same root affinity, so
// we should keep looking after finding an affinity match to see if there is a
@@ -3626,7 +3581,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
pw.print(prefix);
pw.println("mCurTaskIdForUser=" + mCurTaskIdForUser);
pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
- pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers);
+ pw.print(prefix); pw.println("mStacks=" + mStacks);
pw.print(prefix); pw.print("mLockTaskModeState=" + lockTaskModeToString());
final SparseArray<String[]> packages = mService.mLockTaskPackages;
if (packages.size() > 0) {
@@ -3920,6 +3875,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
return getActivityDisplayOrCreateLocked(displayId) != null;
}
+ ActivityDisplay getActivityDisplay(int displayId) {
+ return mActivityDisplays.get(displayId);
+ }
+
/**
* Get an existing instance of {@link ActivityDisplay} or create new if there is a
* corresponding record in display manager.
@@ -4481,16 +4440,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
case HANDLE_DISPLAY_REMOVED: {
handleDisplayRemoved(msg.arg1);
} break;
- case CONTAINER_CALLBACK_VISIBILITY: {
- final ActivityContainer container = (ActivityContainer) msg.obj;
- final IActivityContainerCallback callback = container.mCallback;
- if (callback != null) {
- try {
- callback.setVisible(container.asBinder(), msg.arg1 == 1);
- } catch (RemoteException e) {
- }
- }
- } break;
case LOCK_TASK_START_MSG: {
// When lock task starts, we disable the status bars.
try {
@@ -4563,16 +4512,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
mLockTaskNotify.showToast(LOCK_TASK_MODE_PINNED);
} break;
- case CONTAINER_CALLBACK_TASK_LIST_EMPTY: {
- final ActivityContainer container = (ActivityContainer) msg.obj;
- final IActivityContainerCallback callback = container.mCallback;
- if (callback != null) {
- try {
- callback.onAllActivitiesComplete(container.asBinder());
- } catch (RemoteException e) {
- }
- }
- } break;
case LAUNCH_TASK_BEHIND_COMPLETE: {
synchronized (mService) {
ActivityRecord r = ActivityRecord.forTokenLocked((IBinder) msg.obj);
@@ -4586,340 +4525,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
}
- class ActivityContainer extends android.app.IActivityContainer.Stub {
- final static int FORCE_NEW_TASK_FLAGS = FLAG_ACTIVITY_NEW_TASK |
- FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION;
- final int mStackId;
- IActivityContainerCallback mCallback = null;
- ActivityStack mStack;
- ActivityRecord mParentActivity = null;
- String mIdString;
-
- boolean mVisible = true;
-
- /** Display this ActivityStack is currently on. Null if not attached to a Display. */
- ActivityDisplay mActivityDisplay;
-
- final static int CONTAINER_STATE_HAS_SURFACE = 0;
- final static int CONTAINER_STATE_NO_SURFACE = 1;
- final static int CONTAINER_STATE_FINISHING = 2;
- int mContainerState = CONTAINER_STATE_HAS_SURFACE;
-
- ActivityContainer(int stackId, ActivityDisplay activityDisplay, boolean onTop) {
- synchronized (mService) {
- mStackId = stackId;
- mActivityDisplay = activityDisplay;
- mIdString = "ActivtyContainer{" + mStackId + "}";
-
- createStack(stackId, onTop);
- if (DEBUG_STACK) Slog.d(TAG_STACK, "Creating " + this);
- }
- }
-
- protected void createStack(int stackId, boolean onTop) {
- switch (stackId) {
- case PINNED_STACK_ID:
- new PinnedActivityStack(this, mRecentTasks, onTop);
- break;
- default:
- new ActivityStack(this, mRecentTasks, onTop);
- break;
- }
- }
-
- /**
- * Adds the stack to specified display. Also calls WindowManager to do the same from
- * {@link ActivityStack#reparent(ActivityDisplay, boolean)}.
- * @param activityDisplay The display to add the stack to.
- */
- void addToDisplayLocked(ActivityDisplay activityDisplay) {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "addToDisplayLocked: " + this
- + " to display=" + activityDisplay);
- if (mActivityDisplay != null) {
- throw new IllegalStateException("ActivityContainer is already attached, " +
- "displayId=" + mActivityDisplay.mDisplayId);
- }
- mActivityDisplay = activityDisplay;
- mStack.reparent(activityDisplay, true /* onTop */);
- }
-
- @Override
- public void addToDisplay(int displayId) {
- synchronized (mService) {
- final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
- if (activityDisplay == null) {
- return;
- }
- addToDisplayLocked(activityDisplay);
- }
- }
-
- @Override
- public int getDisplayId() {
- synchronized (mService) {
- if (mActivityDisplay != null) {
- return mActivityDisplay.mDisplayId;
- }
- }
- return -1;
- }
-
- @Override
- public int getStackId() {
- synchronized (mService) {
- return mStackId;
- }
- }
-
- @Override
- public boolean injectEvent(InputEvent event) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (mService) {
- if (mActivityDisplay != null) {
- return mInputManagerInternal.injectInputEvent(event,
- mActivityDisplay.mDisplayId,
- InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
- }
- }
- return false;
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public void release() {
- synchronized (mService) {
- if (mContainerState == CONTAINER_STATE_FINISHING) {
- return;
- }
- mContainerState = CONTAINER_STATE_FINISHING;
-
- long origId = Binder.clearCallingIdentity();
- try {
- mStack.finishAllActivitiesLocked(false);
- mService.mActivityStarter.removePendingActivityLaunchesLocked(mStack);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- /**
- * Remove the stack completely. Must be called only when there are no tasks left in it,
- * as this method does not finish running activities.
- */
- void removeLocked() {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "removeLocked: " + this + " from display="
- + mActivityDisplay + " Callers=" + Debug.getCallers(2));
- if (mActivityDisplay != null) {
- removeFromDisplayLocked();
- }
- mStack.remove();
- }
-
- /**
- * Remove the stack from its current {@link ActivityDisplay}, so it can be either destroyed
- * completely or re-parented.
- */
- private void removeFromDisplayLocked() {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "removeFromDisplayLocked: " + this
- + " current displayId=" + mActivityDisplay.mDisplayId);
-
- mActivityDisplay.detachStack(mStack);
- mActivityDisplay = null;
- }
-
- /**
- * Move the stack to specified display.
- * @param activityDisplay Target display to move the stack to.
- * @param onTop Indicates whether container should be place on top or on bottom.
- */
- void moveToDisplayLocked(ActivityDisplay activityDisplay, boolean onTop) {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "moveToDisplayLocked: " + this + " from display="
- + mActivityDisplay + " to display=" + activityDisplay
- + " Callers=" + Debug.getCallers(2));
-
- removeFromDisplayLocked();
-
- mActivityDisplay = activityDisplay;
- mStack.reparent(activityDisplay, onTop);
- }
-
- @Override
- public final int startActivity(Intent intent) {
- return mService.startActivity(intent, this);
- }
-
- @Override
- public final int startActivityIntentSender(IIntentSender intentSender)
- throws TransactionTooLargeException {
- mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender");
-
- if (!(intentSender instanceof PendingIntentRecord)) {
- throw new IllegalArgumentException("Bad PendingIntent object");
- }
-
- final int userId = mService.mUserController.handleIncomingUser(Binder.getCallingPid(),
- Binder.getCallingUid(), mCurrentUser, false,
- ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null);
-
- final PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender;
- checkEmbeddedAllowedInner(userId, pendingIntent.key.requestIntent,
- pendingIntent.key.requestResolvedType);
-
- return pendingIntent.sendInner(0, null, null, null, null, null, null, null, 0,
- FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this);
- }
-
- void checkEmbeddedAllowedInner(int userId, Intent intent, String resolvedType) {
- ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId);
- if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) {
- throw new SecurityException(
- "Attempt to embed activity that has not set allowEmbedded=\"true\"");
- }
- }
-
- @Override
- public IBinder asBinder() {
- return this;
- }
-
- @Override
- public void setSurface(Surface surface, int width, int height, int density) {
- mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface");
- }
-
- ActivityStackSupervisor getOuter() {
- return ActivityStackSupervisor.this;
- }
-
- boolean isAttachedLocked() {
- return mActivityDisplay != null;
- }
-
- // TODO: Make sure every change to ActivityRecord.visible results in a call to this.
- void setVisible(boolean visible) {
- if (mVisible != visible) {
- mVisible = visible;
- if (mCallback != null) {
- mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0,
- 0 /* unused */, this).sendToTarget();
- }
- }
- }
-
- void setDrawn() {
- }
-
- // You can always start a new task on a regular ActivityStack.
- boolean isEligibleForNewTasks() {
- return true;
- }
-
- void onTaskListEmptyLocked() {
- removeLocked();
- mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget();
- }
-
- @Override
- public String toString() {
- return mIdString + (mActivityDisplay == null ? "N" : "A");
- }
- }
-
- private class VirtualActivityContainer extends ActivityContainer {
- Surface mSurface;
- boolean mDrawn = false;
-
- VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) {
- super(getNextStackId(), parent.getStack().mActivityContainer.mActivityDisplay,
- true /* onTop */);
- mParentActivity = parent;
- mCallback = callback;
- mContainerState = CONTAINER_STATE_NO_SURFACE;
- mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}";
- }
-
- @Override
- public void setSurface(Surface surface, int width, int height, int density) {
- super.setSurface(surface, width, height, density);
-
- synchronized (mService) {
- final long origId = Binder.clearCallingIdentity();
- try {
- setSurfaceLocked(surface, width, height, density);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- private void setSurfaceLocked(Surface surface, int width, int height, int density) {
- if (mContainerState == CONTAINER_STATE_FINISHING) {
- return;
- }
- VirtualActivityDisplay virtualActivityDisplay =
- (VirtualActivityDisplay) mActivityDisplay;
- if (virtualActivityDisplay == null) {
- virtualActivityDisplay =
- new VirtualActivityDisplay(width, height, density);
- mActivityDisplay = virtualActivityDisplay;
- mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay);
- addToDisplayLocked(virtualActivityDisplay);
- }
-
- if (mSurface != null) {
- mSurface.release();
- }
-
- mSurface = surface;
- if (surface != null) {
- resumeFocusedStackTopActivityLocked();
- } else {
- mContainerState = CONTAINER_STATE_NO_SURFACE;
- ((VirtualActivityDisplay) mActivityDisplay).setSurface(null);
- if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
- mStack.startPausingLocked(false, true, null, false);
- }
- }
-
- setSurfaceIfReadyLocked();
-
- if (DEBUG_STACK) Slog.d(TAG_STACK,
- "setSurface: " + this + " to display=" + virtualActivityDisplay);
- }
-
- @Override
- boolean isAttachedLocked() {
- return mSurface != null && super.isAttachedLocked();
- }
-
- @Override
- void setDrawn() {
- synchronized (mService) {
- mDrawn = true;
- setSurfaceIfReadyLocked();
- }
- }
-
- // Never start a new task on an ActivityView if it isn't explicitly specified.
- @Override
- boolean isEligibleForNewTasks() {
- return false;
- }
-
- private void setSurfaceIfReadyLocked() {
- if (DEBUG_STACK) Slog.v(TAG_STACK, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn +
- " mContainerState=" + mContainerState + " mSurface=" + mSurface);
- if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) {
- ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface);
- mContainerState = CONTAINER_STATE_HAS_SURFACE;
- }
- }
- }
-
+ // TODO: Move to its own file.
/** Exactly one of these classes per Display in the system. Capable of holding zero or more
* attached {@link ActivityStack}s */
class ActivityDisplay extends ConfigurationContainer {
@@ -4934,7 +4540,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
/** Array of all UIDs that are present on the display. */
private IntArray mDisplayAccessUIDs = new IntArray();
+ @VisibleForTesting
ActivityDisplay() {
+ mActivityDisplays.put(mDisplayId, this);
}
// After instantiation, check that mDisplay is not null before using this. The alternative
@@ -5011,43 +4619,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
}
- class VirtualActivityDisplay extends ActivityDisplay {
- VirtualDisplay mVirtualDisplay;
-
- VirtualActivityDisplay(int width, int height, int density) {
- DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
- mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, null /* projection */,
- VIRTUAL_DISPLAY_BASE_NAME, width, height, density, null /* surface */,
- DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
- DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, null /* callback */,
- null /* handler */, null /* uniqueId */);
-
- init(mVirtualDisplay.getDisplay());
-
- mWindowManager.onDisplayAdded(mDisplayId);
- }
-
- void setSurface(Surface surface) {
- if (mVirtualDisplay != null) {
- mVirtualDisplay.setSurface(surface);
- }
- }
-
- @Override
- void detachStack(ActivityStack stack) {
- super.detachStack(stack);
- if (mVirtualDisplay != null) {
- mVirtualDisplay.release();
- mVirtualDisplay = null;
- }
- }
-
- @Override
- public String toString() {
- return "VirtualActivityDisplay={" + mDisplayId + "}";
- }
- }
-
ActivityStack findStackBehind(ActivityStack stack) {
// TODO(multi-display): We are only looking for stacks on the default display.
final ActivityDisplay display = mActivityDisplays.get(DEFAULT_DISPLAY);
@@ -5154,7 +4725,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
userId = task.userId;
int result = mService.startActivityInPackage(callingUid, callingPackage, intent, null,
- null, null, 0, 0, bOptions, userId, null, task, "startActivityFromRecents");
+ null, null, 0, 0, bOptions, userId, task, "startActivityFromRecents");
if (launchStackId == DOCKED_STACK_ID) {
setResizingDuringAnimation(task);
}
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 4f04066c6076..f58c768300ac 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -90,12 +90,10 @@ import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.AppGlobals;
-import android.app.IActivityContainer;
import android.app.IApplicationThread;
import android.app.PendingIntent;
import android.app.ProfilerInfo;
import android.app.WaitResult;
-import android.content.ComponentName;
import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentSender;
@@ -260,8 +258,7 @@ class ActivityStarter {
IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
- ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
- TaskRecord inTask, String reason) {
+ ActivityRecord[] outActivity, TaskRecord inTask, String reason) {
if (TextUtils.isEmpty(reason)) {
throw new IllegalArgumentException("Need to specify a reason.");
@@ -274,7 +271,7 @@ class ActivityStarter {
aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
- container, inTask);
+ inTask);
if (outActivity != null) {
// mLastStartActivityRecord[0] is set in the call to startActivity above.
@@ -292,8 +289,7 @@ class ActivityStarter {
IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
- ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
- TaskRecord inTask) {
+ ActivityRecord[] outActivity, TaskRecord inTask) {
int err = ActivityManager.START_SUCCESS;
// Pull the optional Ephemeral Installer-only bundle out of the options early.
final Bundle verificationBundle
@@ -505,10 +501,8 @@ class ActivityStarter {
if (DEBUG_PERMISSIONS_REVIEW) {
Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true,
true, false) + "} from uid " + callingUid + " on display "
- + (container == null ? (mSupervisor.mFocusedStack == null ?
- DEFAULT_DISPLAY : mSupervisor.mFocusedStack.mDisplayId) :
- (container.mActivityDisplay == null ? DEFAULT_DISPLAY :
- container.mActivityDisplay.mDisplayId)));
+ + (mSupervisor.mFocusedStack == null
+ ? DEFAULT_DISPLAY : mSupervisor.mFocusedStack.mDisplayId));
}
}
}
@@ -530,7 +524,7 @@ class ActivityStarter {
ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
- mSupervisor, container, options, sourceRecord);
+ mSupervisor, options, sourceRecord);
if (outActivity != null) {
outActivity[0] = r;
}
@@ -649,7 +643,7 @@ class ActivityStarter {
null /*callingPackage*/, 0 /*realCallingPid*/, 0 /*realCallingUid*/,
0 /*startFlags*/, null /*options*/, false /*ignoreTargetSecurity*/,
false /*componentSpecified*/, mLastHomeActivityStartRecord /*outActivity*/,
- null /*container*/, null /*inTask*/, "startHomeActivity: " + reason);
+ null /*inTask*/, "startHomeActivity: " + reason);
if (mSupervisor.inResumeTopActivity) {
// If we are in resume section already, home activity will be initialized, but not
// resumed (to avoid recursive resume) and will stay that way until something pokes it
@@ -674,7 +668,7 @@ class ActivityStarter {
IBinder resultTo, String resultWho, int requestCode, int startFlags,
ProfilerInfo profilerInfo, WaitResult outResult,
Configuration globalConfig, Bundle bOptions, boolean ignoreTargetSecurity, int userId,
- IActivityContainer iContainer, TaskRecord inTask, String reason) {
+ TaskRecord inTask, String reason) {
// Refuse possible leaked file descriptors
if (intent != null && intent.hasFileDescriptors()) {
throw new IllegalArgumentException("File descriptors passed in Intent");
@@ -727,14 +721,7 @@ class ActivityStarter {
ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);
ActivityOptions options = ActivityOptions.fromBundle(bOptions);
- ActivityStackSupervisor.ActivityContainer container =
- (ActivityStackSupervisor.ActivityContainer)iContainer;
synchronized (mService) {
- if (container != null && container.mParentActivity != null &&
- container.mParentActivity.state != RESUMED) {
- // Cannot start a child activity if the parent is not resumed.
- return ActivityManager.START_CANCELED;
- }
final int realCallingPid = Binder.getCallingPid();
final int realCallingUid = Binder.getCallingUid();
int callingPid;
@@ -747,12 +734,7 @@ class ActivityStarter {
callingPid = callingUid = -1;
}
- final ActivityStack stack;
- if (container == null || container.mStack.isOnHomeDisplay()) {
- stack = mSupervisor.mFocusedStack;
- } else {
- stack = container.mStack;
- }
+ final ActivityStack stack = mSupervisor.mFocusedStack;
stack.mConfigWillChange = globalConfig != null
&& mService.getGlobalConfiguration().diff(globalConfig) != 0;
if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
@@ -828,8 +810,8 @@ class ActivityStarter {
aInfo, rInfo, voiceSession, voiceInteractor,
resultTo, resultWho, requestCode, callingPid,
callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
- options, ignoreTargetSecurity, componentSpecified, outRecord, container,
- inTask, reason);
+ options, ignoreTargetSecurity, componentSpecified, outRecord, inTask,
+ reason);
Binder.restoreCallingIdentity(origId);
@@ -954,7 +936,7 @@ class ActivityStarter {
resolvedTypes[i], aInfo, null /*rInfo*/, null, null, resultTo, null, -1,
callingPid, callingUid, callingPackage,
realCallingPid, realCallingUid, 0,
- options, false, componentSpecified, outActivity, null, null, reason);
+ options, false, componentSpecified, outActivity, null, reason);
if (res < 0) {
return res;
}
@@ -1851,13 +1833,30 @@ class ActivityStarter {
final TaskRecord sourceTask = mSourceRecord.getTask();
final ActivityStack sourceStack = mSourceRecord.getStack();
- // We only want to allow changing stack if the target task is not the top one,
- // otherwise we would move the launching task to the other side, rather than show
- // two side by side.
- final boolean moveStackAllowed = sourceStack.topTask() != sourceTask;
+ // We only want to allow changing stack in two cases:
+ // 1. If the target task is not the top one. Otherwise we would move the launching task to
+ // the other side, rather than show two side by side.
+ // 2. If activity is not allowed on target display.
+ final int targetDisplayId = mTargetStack != null ? mTargetStack.mDisplayId
+ : sourceStack.mDisplayId;
+ final boolean moveStackAllowed = sourceStack.topTask() != sourceTask
+ || !mStartActivity.canBeLaunchedOnDisplay(targetDisplayId);
if (moveStackAllowed) {
mTargetStack = getLaunchStack(mStartActivity, mLaunchFlags, mStartActivity.getTask(),
mOptions);
+ // If target stack is not found now - we can't just rely on the source stack, as it may
+ // be not suitable. Let's check other displays.
+ if (mTargetStack == null && targetDisplayId != sourceStack.mDisplayId) {
+ // Can't use target display, lets find a stack on the source display.
+ mTargetStack = mService.mStackSupervisor.getValidLaunchStackOnDisplay(
+ sourceStack.mDisplayId, mStartActivity);
+ }
+ if (mTargetStack == null) {
+ // There are no suitable stacks on the target and source display(s). Look on all
+ // displays.
+ mTargetStack = mService.mStackSupervisor.getNextValidLaunchStackLocked(
+ mStartActivity, -1 /* currentFocus */);
+ }
}
if (mTargetStack == null) {
@@ -2069,13 +2068,6 @@ class ActivityStarter {
return currentStack;
}
- final ActivityStackSupervisor.ActivityContainer container = r.mInitialActivityContainer;
- if (container != null) {
- // The first time put it on the desired stack, after this put on task stack.
- r.mInitialActivityContainer = null;
- return container.mStack;
- }
-
if (canLaunchIntoFocusedStack(r, newTask)) {
if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS,
"computeStackFocus: Have a focused stack=" + mSupervisor.mFocusedStack);
@@ -2140,13 +2132,11 @@ class ActivityStarter {
default:
// Dynamic stacks behave similarly to the fullscreen stack and can contain any
// resizeable task.
- // TODO: Check ActivityView after fixing b/35349678.
canUseFocusedStack = isDynamicStack(focusedStackId)
&& r.canBeLaunchedOnDisplay(focusedStack.mDisplayId);
}
- return canUseFocusedStack
- && (!newTask || focusedStack.mActivityContainer.isEligibleForNewTasks())
+ return canUseFocusedStack && !newTask
// We strongly prefer to launch activities on the same display as their source.
&& (mSourceDisplayId == focusedStack.mDisplayId);
}
@@ -2212,9 +2202,7 @@ class ActivityStarter {
// The parent activity doesn't want to launch the activity on top of itself, but
// instead tries to put it onto other side in side-by-side mode.
- final ActivityStack parentStack = task != null ? task.getStack()
- : r.mInitialActivityContainer != null ? r.mInitialActivityContainer.mStack
- : mSupervisor.mFocusedStack;
+ final ActivityStack parentStack = task != null ? task.getStack(): mSupervisor.mFocusedStack;
if (parentStack != mSupervisor.mFocusedStack) {
// If task's parent stack is not focused - use it during adjacent launch.
@@ -2265,7 +2253,6 @@ class ActivityStarter {
case ASSISTANT_STACK_ID:
return r.isAssistantActivity();
default:
- // TODO: Check ActivityView after fixing b/35349678.
if (StackId.isDynamicStack(stackId)) {
return r.canBeLaunchedOnDisplay(displayId);
}
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 0d1c579f2b81..fc03db1203bd 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -409,10 +409,9 @@ class AppErrors {
final Set<String> cats = task.intent.getCategories();
if (cats != null && cats.contains(Intent.CATEGORY_LAUNCHER)) {
mService.startActivityInPackage(task.mCallingUid,
- task.mCallingPackage, task.intent,
- null, null, null, 0, 0,
- ActivityOptions.makeBasic().toBundle(),
- task.userId, null, null, "AppErrors");
+ task.mCallingPackage, task.intent, null, null, null, 0, 0,
+ ActivityOptions.makeBasic().toBundle(), task.userId, null,
+ "AppErrors");
}
}
}
diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index cad5dcf6b565..ee593866da68 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -20,7 +20,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import android.app.ActivityManager;
-import android.app.IActivityContainer;
import android.content.IIntentSender;
import android.content.IIntentReceiver;
import android.app.PendingIntent;
@@ -37,7 +36,6 @@ import android.util.Slog;
import android.util.TimeUtils;
import com.android.internal.os.IResultReceiver;
-import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
@@ -234,30 +232,23 @@ final class PendingIntentRecord extends IIntentSender.Stub {
public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken,
IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) {
sendInner(code, intent, resolvedType, whitelistToken, finishedReceiver,
- requiredPermission, null, null, 0, 0, 0, options, null);
+ requiredPermission, null, null, 0, 0, 0, options);
}
public int sendWithResult(int code, Intent intent, String resolvedType, IBinder whitelistToken,
IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) {
return sendInner(code, intent, resolvedType, whitelistToken, finishedReceiver,
- requiredPermission, null, null, 0, 0, 0, options, null);
+ requiredPermission, null, null, 0, 0, 0, options);
}
int sendInner(int code, Intent intent, String resolvedType, IBinder whitelistToken,
IIntentReceiver finishedReceiver,
String requiredPermission, IBinder resultTo, String resultWho, int requestCode,
- int flagsMask, int flagsValues, Bundle options, IActivityContainer container) {
+ int flagsMask, int flagsValues, Bundle options) {
if (intent != null) intent.setDefusable(true);
if (options != null) options.setDefusable(true);
synchronized (owner) {
- final ActivityContainer activityContainer = (ActivityContainer)container;
- if (activityContainer != null && activityContainer.mParentActivity != null &&
- activityContainer.mParentActivity.state
- != ActivityStack.ActivityState.RESUMED) {
- // Cannot start a child activity if the parent is not resumed.
- return ActivityManager.START_CANCELED;
- }
if (!canceled) {
sent = true;
if ((key.flags&PendingIntent.FLAG_ONE_SHOT) != 0) {
@@ -346,7 +337,7 @@ final class PendingIntentRecord extends IIntentSender.Stub {
} else {
owner.startActivityInPackage(uid, key.packageName, finalIntent,
resolvedType, resultTo, resultWho, requestCode, 0,
- options, userId, container, null, "PendingIntentRecord");
+ options, userId, null, "PendingIntentRecord");
}
} catch (RuntimeException e) {
Slog.w(TAG, "Unable to send startActivity intent", e);
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index 2010c24000e8..392fbb29d091 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -20,7 +20,6 @@ import android.app.RemoteAction;
import android.content.res.Configuration;
import android.graphics.Rect;
-import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
import com.android.server.wm.PinnedStackWindowController;
import com.android.server.wm.PinnedStackWindowListener;
@@ -33,9 +32,9 @@ import java.util.List;
class PinnedActivityStack extends ActivityStack<PinnedStackWindowController>
implements PinnedStackWindowListener {
- PinnedActivityStack(ActivityContainer activityContainer,
- RecentTasks recentTasks, boolean onTop) {
- super(activityContainer, recentTasks, onTop);
+ PinnedActivityStack(ActivityStackSupervisor.ActivityDisplay display, int stackId,
+ ActivityStackSupervisor supervisor, RecentTasks recentTasks, boolean onTop) {
+ super(display, stackId, supervisor, recentTasks, onTop);
}
@Override
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 96d857354f1a..5753fbc5a92d 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -1045,8 +1045,7 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta
}
// We need to provide the current orientation of the display on which this task resides,
// not the orientation of the task.
- final int orientation =
- getStack().mActivityContainer.mActivityDisplay.getConfiguration().orientation;
+ final int orientation = getStack().getDisplay().getConfiguration().orientation;
return setLastThumbnailLocked(thumbnail, taskWidth, taskHeight, orientation);
}
@@ -1582,7 +1581,8 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta
*/
boolean canBeLaunchedOnDisplay(int displayId) {
return mService.mStackSupervisor.canPlaceEntityOnDisplay(displayId,
- isResizeable(false /* checkSupportsPip */));
+ isResizeable(false /* checkSupportsPip */), -1 /* don't check PID */,
+ -1 /* don't check UID */, null /* activityInfo */);
}
/**
diff --git a/services/core/java/com/android/server/input/InputForwarder.java b/services/core/java/com/android/server/input/InputForwarder.java
new file mode 100644
index 000000000000..bebbc93e9ea5
--- /dev/null
+++ b/services/core/java/com/android/server/input/InputForwarder.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 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.server.input;
+
+import android.app.IInputForwarder;
+import android.hardware.input.InputManagerInternal;
+import android.view.InputEvent;
+import android.os.Binder;
+
+import com.android.server.LocalServices;
+
+import static android.hardware.input.InputManager.INJECT_INPUT_EVENT_MODE_ASYNC;
+
+/**
+ * Basic implementation of {@link IInputForwarder}.
+ */
+class InputForwarder extends IInputForwarder.Stub {
+
+ private final InputManagerInternal mInputManagerInternal;
+ private final int mDisplayId;
+
+ InputForwarder(int displayId) {
+ mDisplayId = displayId;
+ mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
+ }
+
+ @Override
+ public boolean forwardEvent(InputEvent event) {
+ return mInputManagerInternal.injectInputEvent(event, mDisplayId,
+ INJECT_INPUT_EVENT_MODE_ASYNC);
+ }
+} \ No newline at end of file
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 717efbf714db..fa9b1078e8ad 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -37,6 +37,7 @@ import com.android.server.Watchdog;
import org.xmlpull.v1.XmlPullParser;
import android.Manifest;
+import android.app.IInputForwarder;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -57,6 +58,7 @@ import android.content.res.Resources.NotFoundException;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.database.ContentObserver;
+import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayViewport;
import android.hardware.input.IInputDevicesChangedListener;
import android.hardware.input.IInputManager;
@@ -85,6 +87,7 @@ import android.text.TextUtils;
import android.util.Slog;
import android.util.SparseArray;
import android.util.Xml;
+import android.view.Display;
import android.view.IInputFilter;
import android.view.IInputFilterHost;
import android.view.IWindow;
@@ -1862,6 +1865,29 @@ public class InputManagerService extends IInputManager.Stub
nativeMonitor(mPtr);
}
+ // Binder call
+ @Override
+ public IInputForwarder createInputForwarder(int displayId) throws RemoteException {
+ if (!checkCallingPermission(android.Manifest.permission.INJECT_EVENTS,
+ "createInputForwarder()")) {
+ throw new SecurityException("Requires INJECT_EVENTS permission");
+ }
+ final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
+ final Display display = displayManager.getDisplay(displayId);
+ if (display == null) {
+ throw new IllegalArgumentException(
+ "Can't create input forwarder for non-existent displayId: " + displayId);
+ }
+ final int callingUid = Binder.getCallingUid();
+ final int displayOwnerUid = display.getOwnerUid();
+ if (callingUid != displayOwnerUid) {
+ throw new SecurityException(
+ "Only owner of the display can forward input events to it.");
+ }
+
+ return new InputForwarder(displayId);
+ }
+
// Native callback.
private void notifyConfigurationChanged(long whenNanos) {
mWindowManagerCallbacks.notifyConfigurationChanged();
diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java
index 5cc14b5ed520..3444ef3ec2fa 100644
--- a/services/core/java/com/android/server/notification/ConditionProviders.java
+++ b/services/core/java/com/android/server/notification/ConditionProviders.java
@@ -35,6 +35,7 @@ import android.util.ArraySet;
import android.util.Slog;
import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.server.notification.NotificationManagerService.DumpFilter;
import java.io.PrintWriter;
@@ -43,7 +44,8 @@ import java.util.Arrays;
public class ConditionProviders extends ManagedServices {
- private static final String TAG_ENABLED_DND_APPS = "dnd_apps";
+ @VisibleForTesting
+ static final String TAG_ENABLED_DND_APPS = "dnd_apps";
private final ArrayList<ConditionRecord> mRecords = new ArrayList<>();
private final ArraySet<String> mSystemConditionProviderNames;
@@ -84,7 +86,7 @@ public class ConditionProviders extends ManagedServices {
c.caption = "condition provider";
c.serviceInterface = ConditionProviderService.SERVICE_INTERFACE;
c.secureSettingName = Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES;
- c.managedServiceTypeTag = TAG_ENABLED_DND_APPS;
+ c.xmlTag = TAG_ENABLED_DND_APPS;
c.secondarySettingName = Settings.Secure.ENABLED_NOTIFICATION_LISTENERS;
c.bindPermission = android.Manifest.permission.BIND_CONDITION_PROVIDER_SERVICE;
c.settingsAction = Settings.ACTION_CONDITION_PROVIDER_SETTINGS;
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 2f88740cd01b..80878131ae44 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -52,6 +52,7 @@ import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
+import com.android.internal.util.XmlUtils;
import com.android.server.notification.NotificationManagerService.DumpFilter;
import org.xmlpull.v1.XmlPullParser;
@@ -226,7 +227,7 @@ abstract public class ManagedServices {
}
public void writeXml(XmlSerializer out, boolean forBackup) throws IOException {
- out.startTag(null, getConfig().managedServiceTypeTag);
+ out.startTag(null, getConfig().xmlTag);
if (forBackup) {
trimApprovedListsAccordingToInstalledServices();
@@ -241,7 +242,7 @@ abstract public class ManagedServices {
for (int j = 0; j < M; j++) {
final boolean isPrimary = approvedByType.keyAt(j);
final Set<String> approved = approvedByType.valueAt(j);
- if (approved != null && approved.size() > 0) {
+ if (approved != null) {
String allowedItems = String.join(ENABLED_SERVICES_SEPARATOR, approved);
out.startTag(null, TAG_MANAGED_SERVICES);
out.attribute(null, ATT_APPROVED_LIST, allowedItems);
@@ -260,43 +261,34 @@ abstract public class ManagedServices {
}
}
- out.endTag(null, getConfig().managedServiceTypeTag);
+ out.endTag(null, getConfig().xmlTag);
}
- /**
- * @return false if modifications were made to the data on load that requires the xml file
- * to be re-written
- */
- public boolean readXml(XmlPullParser parser)
+ protected void migrateToXml() {
+ loadAllowedComponentsFromSettings();
+ }
+
+ public void readXml(XmlPullParser parser)
throws XmlPullParserException, IOException {
- boolean rewriteXml = false;
- int type = parser.getEventType();
- String tag = parser.getName();
- if (type != XmlPullParser.START_TAG || !getConfig().managedServiceTypeTag.equals(tag)) {
- // xml empty/invalid - read from setting instead
- loadAllowedComponentsFromSettings();
- rewriteXml = true;
- } else {
- while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
- tag = parser.getName();
- if (type == XmlPullParser.END_TAG
- && getConfig().managedServiceTypeTag.equals(tag)) {
- break;
- }
- if (type == XmlPullParser.START_TAG) {
- if (TAG_MANAGED_SERVICES.equals(tag)) {
- final String approved = XmlUtils.safeString(parser, ATT_APPROVED_LIST, "");
- final int userId = XmlUtils.safeInt(parser, ATT_USER_ID, 0);
- final boolean isPrimary = XmlUtils.safeBool(parser, ATT_IS_PRIMARY, true);
- addApprovedList(approved, userId, isPrimary);
- }
+ int type;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ String tag = parser.getName();
+ if (type == XmlPullParser.END_TAG
+ && getConfig().xmlTag.equals(tag)) {
+ break;
+ }
+ if (type == XmlPullParser.START_TAG) {
+ if (TAG_MANAGED_SERVICES.equals(tag)) {
+ final String approved = XmlUtils.readStringAttribute(parser, ATT_APPROVED_LIST);
+ final int userId = XmlUtils.readIntAttribute(parser, ATT_USER_ID, 0);
+ final boolean isPrimary =
+ XmlUtils.readBooleanAttribute(parser, ATT_IS_PRIMARY, true);
+ addApprovedList(approved, userId, isPrimary);
+ mUseXml = true;
}
}
- mUseXml = true;
}
rebindServices(false);
-
- return rewriteXml;
}
private void loadAllowedComponentsFromSettings() {
@@ -1119,7 +1111,7 @@ abstract public class ManagedServices {
public String serviceInterface;
public String secureSettingName;
public String secondarySettingName;
- public String managedServiceTypeTag;
+ public String xmlTag;
public String bindPermission;
public String settingsAction;
public int clientLabel;
diff --git a/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java b/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
index 12b29cff5c13..91fee4669846 100644
--- a/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
@@ -16,14 +16,14 @@
package com.android.server.notification;
-import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.net.Uri;
-import android.service.notification.NotificationListenerService;
import android.util.Log;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
+
/**
* This {@link com.android.server.notification.NotificationSignalExtractor} notices noisy
* notifications and marks them to get a temporary ranking bump.
@@ -34,7 +34,8 @@ public class NotificationIntrusivenessExtractor implements NotificationSignalExt
/** Length of time (in milliseconds) that an intrusive or noisy notification will stay at
the top of the ranking order, before it falls back to its natural position. */
- private static final long HANG_TIME_MS = 10000;
+ @VisibleForTesting
+ static final long HANG_TIME_MS = 10000;
public void initialize(Context ctx, NotificationUsageStats usageStats) {
if (DBG) Slog.d(TAG, "Initializing " + getClass().getSimpleName() + ".");
@@ -46,7 +47,8 @@ public class NotificationIntrusivenessExtractor implements NotificationSignalExt
return null;
}
- if (record.getImportance() >= NotificationManager.IMPORTANCE_DEFAULT) {
+ if (record.getFreshnessMs(System.currentTimeMillis()) < HANG_TIME_MS
+ && record.getImportance() >= NotificationManager.IMPORTANCE_DEFAULT) {
if (record.getSound() != null && record.getSound() != Uri.EMPTY) {
record.setRecentlyIntrusive(true);
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index c04124a4b8a0..fb391f885874 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -55,7 +55,6 @@ import static android.service.notification.NotificationListenerService.TRIM_LIGH
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
-import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import android.Manifest;
import android.annotation.NonNull;
@@ -162,6 +161,7 @@ import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.XmlUtils;
import com.android.server.DeviceIdleController;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
@@ -342,7 +342,7 @@ public class NotificationManagerService extends SystemService {
private final UserProfiles mUserProfiles = new UserProfiles();
private NotificationListeners mListeners;
- private NotificationAssistants mNotificationAssistants;
+ private NotificationAssistants mAssistants;
private ConditionProviders mConditionProviders;
private NotificationUsageStats mUsageStats;
@@ -441,24 +441,38 @@ public class NotificationManagerService extends SystemService {
}
}
- private void readPolicyXml(InputStream stream, boolean forRestore)
+ void readPolicyXml(InputStream stream, boolean forRestore)
throws XmlPullParserException, NumberFormatException, IOException {
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(stream, StandardCharsets.UTF_8.name());
-
- boolean saveXml = false;
- while (parser.next() != END_DOCUMENT) {
- mZenModeHelper.readXml(parser, forRestore);
- mRankingHelper.readXml(parser, forRestore);
+ XmlUtils.beginDocument(parser, TAG_NOTIFICATION_POLICY);
+ boolean migratedManagedServices = false;
+ int outerDepth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, outerDepth)) {
+ if (ZenModeConfig.ZEN_TAG.equals(parser.getName())) {
+ mZenModeHelper.readXml(parser, forRestore);
+ } else if (RankingHelper.TAG_RANKING.equals(parser.getName())){
+ mRankingHelper.readXml(parser, forRestore);
+ }
// No non-system managed services are allowed on low ram devices
if (!ActivityManager.isLowRamDeviceStatic()) {
- saveXml |= mListeners.readXml(parser);
- saveXml |= mNotificationAssistants.readXml(parser);
- saveXml |= mConditionProviders.readXml(parser);
+ if (mListeners.getConfig().xmlTag.equals(parser.getName())) {
+ mListeners.readXml(parser);
+ migratedManagedServices = true;
+ } else if (mAssistants.getConfig().xmlTag.equals(parser.getName())) {
+ mAssistants.readXml(parser);
+ migratedManagedServices = true;
+ } else if (mConditionProviders.getConfig().xmlTag.equals(parser.getName())) {
+ mConditionProviders.readXml(parser);
+ migratedManagedServices = true;
+ }
}
}
- if (saveXml) {
+ if (!migratedManagedServices) {
+ mListeners.migrateToXml();
+ mAssistants.migrateToXml();
+ mConditionProviders.migrateToXml();
savePolicyFile();
}
}
@@ -467,7 +481,7 @@ public class NotificationManagerService extends SystemService {
if (DBG) Slog.d(TAG, "loadPolicyFile");
synchronized (mPolicyFile) {
- FileInputStream infile = null;
+ InputStream infile = null;
try {
infile = mPolicyFile.openRead();
readPolicyXml(infile, false /*forRestore*/);
@@ -523,7 +537,7 @@ public class NotificationManagerService extends SystemService {
mZenModeHelper.writeXml(out, forBackup);
mRankingHelper.writeXml(out, forBackup);
mListeners.writeXml(out, forBackup);
- mNotificationAssistants.writeXml(out, forBackup);
+ mAssistants.writeXml(out, forBackup);
mConditionProviders.writeXml(out, forBackup);
out.endTag(null, TAG_NOTIFICATION_POLICY);
out.endDocument();
@@ -898,7 +912,7 @@ public class NotificationManagerService extends SystemService {
}
}
mListeners.onPackagesChanged(removingPackage, pkgList, uidList);
- mNotificationAssistants.onPackagesChanged(removingPackage, pkgList, uidList);
+ mAssistants.onPackagesChanged(removingPackage, pkgList, uidList);
mConditionProviders.onPackagesChanged(removingPackage, pkgList, uidList);
mRankingHelper.onPackagesChanged(removingPackage, changeUserId, pkgList, uidList);
savePolicyFile();
@@ -970,7 +984,7 @@ public class NotificationManagerService extends SystemService {
// Refresh managed services
mConditionProviders.onUserSwitched(user);
mListeners.onUserSwitched(user);
- mNotificationAssistants.onUserSwitched(user);
+ mAssistants.onUserSwitched(user);
mZenModeHelper.onUserSwitched(user);
} else if (action.equals(Intent.ACTION_USER_ADDED)) {
mUserProfiles.updateCache(context);
@@ -983,7 +997,7 @@ public class NotificationManagerService extends SystemService {
final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
mConditionProviders.onUserUnlocked(user);
mListeners.onUserUnlocked(user);
- mNotificationAssistants.onUserUnlocked(user);
+ mAssistants.onUserUnlocked(user);
mZenModeHelper.onUserUnlocked(user);
}
}
@@ -1231,7 +1245,7 @@ public class NotificationManagerService extends SystemService {
mListeners = notificationListeners;
// This is a MangedServices object that keeps track of the assistant.
- mNotificationAssistants = notificationAssistants;
+ mAssistants = notificationAssistants;
mPolicyFile = policyFile;
loadPolicyFile();
@@ -1400,7 +1414,7 @@ public class NotificationManagerService extends SystemService {
// bind to listener services.
mSettingsObserver.observe();
mListeners.onBootPhaseAppsCanStart();
- mNotificationAssistants.onBootPhaseAppsCanStart();
+ mAssistants.onBootPhaseAppsCanStart();
mConditionProviders.onBootPhaseAppsCanStart();
}
}
@@ -1569,7 +1583,6 @@ public class NotificationManagerService extends SystemService {
Slog.e(TAG, "Not doing toast. pkg=" + pkg + " callback=" + callback);
return ;
}
-
final boolean isSystemToast = isCallerSystemOrPhone() || ("android".equals(pkg));
final boolean isPackageSuspended =
isPackageSuspendedForUser(pkg, Binder.getCallingUid());
@@ -1928,7 +1941,7 @@ public class NotificationManagerService extends SystemService {
// Listener & assistant
mListeners.onPackagesChanged(true, packages, uids);
- mNotificationAssistants.onPackagesChanged(true, packages, uids);
+ mAssistants.onPackagesChanged(true, packages, uids);
// Zen
mConditionProviders.onPackagesChanged(true, packages, uids);
@@ -2134,8 +2147,8 @@ public class NotificationManagerService extends SystemService {
long identity = Binder.clearCallingIdentity();
try {
ManagedServices manager =
- mNotificationAssistants.isComponentEnabledForCurrentProfiles(component)
- ? mNotificationAssistants
+ mAssistants.isComponentEnabledForCurrentProfiles(component)
+ ? mAssistants
: mListeners;
manager.setComponentState(component, true);
} finally {
@@ -2255,7 +2268,7 @@ public class NotificationManagerService extends SystemService {
try {
synchronized (mNotificationLock) {
final ManagedServiceInfo info =
- mNotificationAssistants.checkServiceTokenLocked(token);
+ mAssistants.checkServiceTokenLocked(token);
unsnoozeNotificationInt(key, info);
}
} finally {
@@ -2788,7 +2801,7 @@ public class NotificationManagerService extends SystemService {
public boolean isNotificationAssistantAccessGranted(ComponentName assistant) {
Preconditions.checkNotNull(assistant);
checkCallerIsSystemOrSameApp(assistant.getPackageName());
- return mNotificationAssistants.isPackageOrComponentAllowed(assistant.flattenToString(),
+ return mAssistants.isPackageOrComponentAllowed(assistant.flattenToString(),
getCallingUserHandle().getIdentifier());
}
@@ -2835,7 +2848,7 @@ public class NotificationManagerService extends SystemService {
if (!mActivityManager.isLowRamDevice()) {
mConditionProviders.setPackageOrComponentEnabled(assistant.flattenToString(),
userId, false, granted);
- mNotificationAssistants.setPackageOrComponentEnabled(assistant.flattenToString(),
+ mAssistants.setPackageOrComponentEnabled(assistant.flattenToString(),
userId, true, granted);
getContext().sendBroadcastAsUser(new Intent(
@@ -2854,7 +2867,7 @@ public class NotificationManagerService extends SystemService {
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mNotificationLock) {
- mNotificationAssistants.checkServiceTokenLocked(token);
+ mAssistants.checkServiceTokenLocked(token);
int N = mEnqueuedNotifications.size();
for (int i = 0; i < N; i++) {
final NotificationRecord n = mEnqueuedNotifications.get(i);
@@ -2876,7 +2889,7 @@ public class NotificationManagerService extends SystemService {
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mNotificationLock) {
- mNotificationAssistants.checkServiceTokenLocked(token);
+ mAssistants.checkServiceTokenLocked(token);
NotificationRecord n = mNotificationsByKey.get(adjustment.getKey());
applyAdjustment(n, adjustment);
}
@@ -2893,7 +2906,7 @@ public class NotificationManagerService extends SystemService {
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mNotificationLock) {
- mNotificationAssistants.checkServiceTokenLocked(token);
+ mAssistants.checkServiceTokenLocked(token);
for (Adjustment adjustment : adjustments) {
NotificationRecord n = mNotificationsByKey.get(adjustment.getKey());
applyAdjustment(n, adjustment);
@@ -2989,9 +3002,11 @@ public class NotificationManagerService extends SystemService {
if (r == null) {
return;
}
- addAutoGroupAdjustment(r, GroupHelper.AUTOGROUP_KEY);
- EventLogTags.writeNotificationAutogrouped(key);
- mRankingHandler.requestSort();
+ if (r.sbn.getOverrideGroupKey() == null) {
+ addAutoGroupAdjustment(r, GroupHelper.AUTOGROUP_KEY);
+ EventLogTags.writeNotificationAutogrouped(key);
+ mRankingHandler.requestSort();
+ }
}
@GuardedBy("mNotificationLock")
@@ -3000,9 +3015,11 @@ public class NotificationManagerService extends SystemService {
if (r == null) {
return;
}
- addAutoGroupAdjustment(r, null);
- EventLogTags.writeNotificationUnautogrouped(key);
- mRankingHandler.requestSort();
+ if (r.sbn.getOverrideGroupKey() != null) {
+ addAutoGroupAdjustment(r, null);
+ EventLogTags.writeNotificationUnautogrouped(key);
+ mRankingHandler.requestSort();
+ }
}
private void addAutoGroupAdjustment(NotificationRecord r, String overrideGroupKey) {
@@ -3273,7 +3290,7 @@ public class NotificationManagerService extends SystemService {
}
pw.println(')');
pw.println("\n Notification assistant services:");
- mNotificationAssistants.dump(pw, filter);
+ mAssistants.dump(pw, filter);
}
if (!filter.filtered || zenOnly) {
@@ -3664,7 +3681,7 @@ public class NotificationManagerService extends SystemService {
cancelNotificationLocked(r, false, REASON_SNOOZED, wasPosted);
updateLightsLocked();
if (mSnoozeCriterionId != null) {
- mNotificationAssistants.notifyAssistantSnoozedLocked(r.sbn, mSnoozeCriterionId);
+ mAssistants.notifyAssistantSnoozedLocked(r.sbn, mSnoozeCriterionId);
mSnoozeHelper.snooze(r);
} else {
mSnoozeHelper.snooze(r, mDuration);
@@ -3728,8 +3745,8 @@ public class NotificationManagerService extends SystemService {
mRankingHelper.extractSignals(r);
// tell the assistant service about the notification
- if (mNotificationAssistants.isEnabled()) {
- mNotificationAssistants.onNotificationEnqueued(r);
+ if (mAssistants.isEnabled()) {
+ mAssistants.onNotificationEnqueued(r);
mHandler.postDelayed(new PostNotificationRunnable(r.getKey()),
DELAY_FOR_ASSISTANT_TIME);
} else {
@@ -5238,7 +5255,7 @@ public class NotificationManagerService extends SystemService {
Config c = new Config();
c.caption = "notification assistant service";
c.serviceInterface = NotificationAssistantService.SERVICE_INTERFACE;
- c.managedServiceTypeTag = TAG_ENABLED_NOTIFICATION_ASSISTANTS;
+ c.xmlTag = TAG_ENABLED_NOTIFICATION_ASSISTANTS;
c.secureSettingName = Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT;
c.bindPermission = Manifest.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE;
c.settingsAction = Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS;
@@ -5350,7 +5367,7 @@ public class NotificationManagerService extends SystemService {
Config c = new Config();
c.caption = "notification listener";
c.serviceInterface = NotificationListenerService.SERVICE_INTERFACE;
- c.managedServiceTypeTag = TAG_ENABLED_NOTIFICATION_LISTENERS;
+ c.xmlTag = TAG_ENABLED_NOTIFICATION_LISTENERS;
c.secureSettingName = Settings.Secure.ENABLED_NOTIFICATION_LISTENERS;
c.bindPermission = android.Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
c.settingsAction = Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS;
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 0d5cc2c112d5..9622a24a2d4d 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -20,6 +20,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.XmlUtils;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -64,7 +65,7 @@ public class RankingHelper implements RankingConfig {
private static final int XML_VERSION = 1;
- private static final String TAG_RANKING = "ranking";
+ static final String TAG_RANKING = "ranking";
private static final String TAG_PACKAGE = "package";
private static final String TAG_CHANNEL = "channel";
private static final String TAG_GROUP = "channelGroup";
@@ -169,7 +170,7 @@ public class RankingHelper implements RankingConfig {
}
if (type == XmlPullParser.START_TAG) {
if (TAG_PACKAGE.equals(tag)) {
- int uid = XmlUtils.safeInt(parser, ATT_UID, Record.UNKNOWN_UID);
+ int uid = XmlUtils.readIntAttribute(parser, ATT_UID, Record.UNKNOWN_UID);
String name = parser.getAttributeValue(null, ATT_NAME);
if (!TextUtils.isEmpty(name)) {
if (forRestore) {
@@ -182,14 +183,21 @@ public class RankingHelper implements RankingConfig {
}
Record r = getOrCreateRecord(name, uid,
- XmlUtils.safeInt(parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE),
- XmlUtils.safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
- XmlUtils.safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
- XmlUtils.safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE));
- r.importance = XmlUtils.safeInt(parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
- r.priority = XmlUtils.safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY);
- r.visibility = XmlUtils.safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
- r.showBadge = XmlUtils.safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
+ XmlUtils.readIntAttribute(
+ parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE),
+ XmlUtils.readIntAttribute(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
+ XmlUtils.readIntAttribute(
+ parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
+ XmlUtils.readBooleanAttribute(
+ parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE));
+ r.importance = XmlUtils.readIntAttribute(
+ parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
+ r.priority = XmlUtils.readIntAttribute(
+ parser, ATT_PRIORITY, DEFAULT_PRIORITY);
+ r.visibility = XmlUtils.readIntAttribute(
+ parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
+ r.showBadge = XmlUtils.readBooleanAttribute(
+ parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
final int innerDepth = parser.getDepth();
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -214,7 +222,7 @@ public class RankingHelper implements RankingConfig {
if (TAG_CHANNEL.equals(tagName)) {
String id = parser.getAttributeValue(null, ATT_ID);
String channelName = parser.getAttributeValue(null, ATT_NAME);
- int channelImportance = XmlUtils.safeInt(
+ int channelImportance = XmlUtils.readIntAttribute(
parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
if (!TextUtils.isEmpty(id) && !TextUtils.isEmpty(channelName)) {
NotificationChannel channel = new NotificationChannel(id,
@@ -419,8 +427,7 @@ public class RankingHelper implements RankingConfig {
record.setAuthoritativeRank(i);
final String groupKey = record.getGroupKey();
NotificationRecord existingProxy = mProxyByGroupTmp.get(groupKey);
- if (existingProxy == null
- || record.getImportance() > existingProxy.getImportance()) {
+ if (existingProxy == null) {
mProxyByGroupTmp.put(groupKey, record);
}
}
diff --git a/services/core/java/com/android/server/notification/XmlUtils.java b/services/core/java/com/android/server/notification/XmlUtils.java
deleted file mode 100644
index 831d03970fe3..000000000000
--- a/services/core/java/com/android/server/notification/XmlUtils.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Copyright (c) 2017, 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.server.notification;
-
-import android.annotation.NonNull;
-import android.text.TextUtils;
-
-import org.xmlpull.v1.XmlPullParser;
-
-class XmlUtils {
-
- static @NonNull String safeString(XmlPullParser parser, String att, String defValue) {
- final String value = parser.getAttributeValue(null, att);
- if (value == null) return defValue;
- return value;
- }
-
- static @NonNull boolean safeBool(XmlPullParser parser, String att, boolean defValue) {
- final String value = parser.getAttributeValue(null, att);
- if (TextUtils.isEmpty(value)) return defValue;
- return Boolean.parseBoolean(value);
- }
-
- static @NonNull int safeInt(XmlPullParser parser, String att, int defValue) {
- final String val = parser.getAttributeValue(null, att);
- return tryParseInt(val, defValue);
- }
-
- private static int tryParseInt(String value, int defValue) {
- if (TextUtils.isEmpty(value)) return defValue;
- try {
- return Integer.parseInt(value);
- } catch (NumberFormatException e) {
- return defValue;
- }
- }
-
-}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 9b8d1a7c1c0c..847e7d2c88ab 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -3584,7 +3584,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
private void updateCircularDisplayMaskIfNeeded() {
- // we're fullscreen and not hosted in an ActivityView
if (mContext.getResources().getConfiguration().isScreenRound()
&& mContext.getResources().getBoolean(
com.android.internal.R.bool.config_windowShowCircularMask)) {
diff --git a/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java
index ffbd8d493899..bd65f571d20b 100644
--- a/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java
@@ -170,7 +170,7 @@ public class ManagedServicesTest extends NotificationTestCase {
null);
writeExpectedValuesToSettings(approvalLevel);
- assertTrue(service.readXml(parser));
+ service.migrateToXml();
verifyExpectedApprovedEntries(service);
}
@@ -182,7 +182,7 @@ public class ManagedServicesTest extends NotificationTestCase {
ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
mIpm, approvalLevel);
- assertFalse(loadXml(service));
+ loadXml(service);
verifyExpectedApprovedEntries(service);
}
@@ -239,7 +239,7 @@ public class ManagedServicesTest extends NotificationTestCase {
parser.setInput(new BufferedInputStream(
new ByteArrayInputStream(baos.toByteArray())), null);
parser.nextTag();
- assertFalse(service.readXml(parser));
+ service.readXml(parser);
verifyExpectedApprovedEntries(service);
assertFalse(service.isPackageOrComponentAllowed("this.is.a.package.name", 0));
@@ -341,11 +341,8 @@ public class ManagedServicesTest extends NotificationTestCase {
for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
mIpm, approvalLevel);
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(new BufferedInputStream(new ByteArrayInputStream(new byte[]{})),
- null);
writeExpectedValuesToSettings(approvalLevel);
- service.readXml(parser);
+ service.migrateToXml();
mExpectedPrimaryPackages.put(0, "another.package");
mExpectedPrimaryComponentNames.put(0, "another.package/B1");
@@ -360,11 +357,8 @@ public class ManagedServicesTest extends NotificationTestCase {
for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
mIpm, approvalLevel);
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(new BufferedInputStream(new ByteArrayInputStream(new byte[]{})),
- null);
writeExpectedValuesToSettings(approvalLevel);
- service.readXml(parser);
+ service.migrateToXml();
mExpectedSecondaryComponentNames.put(10, "component/2");
mExpectedSecondaryPackages.put(10, "component");
@@ -516,9 +510,9 @@ public class ManagedServicesTest extends NotificationTestCase {
assertEquals(0, service.getAllowedComponents(10).size());
}
- private boolean loadXml(ManagedServices service) throws Exception {
+ private void loadXml(ManagedServices service) throws Exception {
final StringBuffer xml = new StringBuffer();
- xml.append("<" + service.getConfig().managedServiceTypeTag + ">\n");
+ xml.append("<" + service.getConfig().xmlTag + ">\n");
for (int userId : mExpectedPrimary.get(service.mApprovalLevel).keySet()) {
xml.append(getXmlEntry(
mExpectedPrimary.get(service.mApprovalLevel).get(userId), userId, true));
@@ -527,13 +521,13 @@ public class ManagedServicesTest extends NotificationTestCase {
xml.append(getXmlEntry(
mExpectedSecondary.get(service.mApprovalLevel).get(userId), userId, false));
}
- xml.append("</" + service.getConfig().managedServiceTypeTag + ">");
+ xml.append("</" + service.getConfig().xmlTag + ">");
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new BufferedInputStream(
new ByteArrayInputStream(xml.toString().getBytes())), null);
parser.nextTag();
- return service.readXml(parser);
+ service.readXml(parser);
}
private void addExpectedServices(final ManagedServices service, final List<String> packages,
@@ -674,7 +668,7 @@ public class ManagedServicesTest extends NotificationTestCase {
@Override
protected Config getConfig() {
final Config c = new Config();
- c.managedServiceTypeTag= "test";
+ c.xmlTag = "test";
c.secureSettingName = SETTING;
c.secondarySettingName = SECONDARY_SETTING;
c.bindPermission = "permission";
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java b/services/tests/notification/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java
index d2f608e63e53..85852f90c281 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java
@@ -19,6 +19,9 @@ package com.android.server.notification;
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static com.android.server.notification.NotificationIntrusivenessExtractor.HANG_TIME_MS;
+
+import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
@@ -59,9 +62,29 @@ public class NotificationIntrusivenessExtractorTest extends NotificationTestCase
Notification n = builder.build();
StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
- 0, n, UserHandle.ALL, null, System.currentTimeMillis());
+ 0, n, UserHandle.ALL, null,
+ System.currentTimeMillis());
NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
assertNotNull(new NotificationIntrusivenessExtractor().process(r));
}
+
+ @Test
+ public void testOldNotificationsNotIntrusive() {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_DEFAULT);
+ final Notification.Builder builder = new Notification.Builder(getContext())
+ .setContentTitle("foo")
+ .setFullScreenIntent(PendingIntent.getActivity(
+ getContext(), 0, new Intent(""), 0), true)
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+
+ Notification n = builder.build();
+ StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+ 0, n, UserHandle.ALL, null,
+ System.currentTimeMillis() - HANG_TIME_MS);
+
+ NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+ assertNull(new NotificationIntrusivenessExtractor().process(r));
+ assertFalse(r.isRecentlyIntrusive());
+ }
}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
index d462c2ff1a6a..09af1e2fd7d4 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -20,9 +20,6 @@ import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
-import static com.android.server.notification.NotificationManagerService
- .MESSAGE_SEND_RANKING_UPDATE;
-
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
@@ -34,12 +31,10 @@ import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -60,35 +55,34 @@ import android.content.pm.ParceledListSlice;
import android.graphics.Color;
import android.media.AudioManager;
import android.os.Binder;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
import android.os.Process;
import android.os.UserHandle;
import android.provider.Settings.Secure;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
+import android.service.notification.ZenModeConfig;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.util.ArrayMap;
import android.util.AtomicFile;
-import android.util.Log;
-import android.util.Slog;
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
+import com.android.server.notification.NotificationManagerService.NotificationAssistants;
+import com.android.server.notification.NotificationManagerService.NotificationListeners;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.stubbing.Answer;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -115,7 +109,6 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
private TestableLooper mTestableLooper;
@Mock
private RankingHelper mRankingHelper;
- @Mock
AtomicFile mPolicyFile;
File mFile;
@Mock
@@ -129,8 +122,8 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
private NotificationChannel mTestNotificationChannel = new NotificationChannel(
TEST_CHANNEL_ID, TEST_CHANNEL_ID, NotificationManager.IMPORTANCE_DEFAULT);
@Mock
- private NotificationManagerService.NotificationListeners mNotificationListeners;
- @Mock private NotificationManagerService.NotificationAssistants mNotificationAssistants;
+ private NotificationListeners mListeners;
+ @Mock private NotificationAssistants mAssistants;
@Mock private ConditionProviders mConditionProviders;
private ManagedServices.ManagedServiceInfo mListener;
@Mock private ICompanionDeviceManager mCompanionMgr;
@@ -182,18 +175,34 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
when(mockLightsManager.getLight(anyInt())).thenReturn(mock(Light.class));
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
+ // write to a test file; the system file isn't readable from tests
mFile = new File(mContext.getCacheDir(), "test.xml");
mFile.createNewFile();
- when(mPolicyFile.openRead()).thenReturn(new FileInputStream(mFile));
- when(mPolicyFile.startWrite()).thenReturn(new FileOutputStream(mFile));
-
- mListener = mNotificationListeners.new ManagedServiceInfo(
+ final String preupgradeXml = "<notification-policy></notification-policy>";
+ mPolicyFile = new AtomicFile(mFile);
+ FileOutputStream fos = mPolicyFile.startWrite();
+ fos.write(preupgradeXml.getBytes());
+ mPolicyFile.finishWrite(fos);
+ FileInputStream fStream = new FileInputStream(mFile);
+
+ // Setup managed services
+ mListener = mListeners.new ManagedServiceInfo(
null, new ComponentName(PKG, "test_class"), mUid, true, null, 0);
- when(mNotificationListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ ManagedServices.Config listenerConfig = new ManagedServices.Config();
+ listenerConfig.xmlTag = NotificationListeners.TAG_ENABLED_NOTIFICATION_LISTENERS;
+ when(mListeners.getConfig()).thenReturn(listenerConfig);
+ ManagedServices.Config assistantConfig = new ManagedServices.Config();
+ assistantConfig.xmlTag = NotificationAssistants.TAG_ENABLED_NOTIFICATION_ASSISTANTS;
+ when(mAssistants.getConfig()).thenReturn(assistantConfig);
+ ManagedServices.Config dndConfig = new ManagedServices.Config();
+ dndConfig.xmlTag = ConditionProviders.TAG_ENABLED_DND_APPS;
+ when(mConditionProviders.getConfig()).thenReturn(dndConfig);
+
try {
mNotificationManagerService.init(mTestableLooper.getLooper(),
mPackageManager, mPackageManagerClient, mockLightsManager,
- mNotificationListeners, mNotificationAssistants, mConditionProviders,
+ mListeners, mAssistants, mConditionProviders,
mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager,
mGroupHelper);
} catch (SecurityException e) {
@@ -827,13 +836,13 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
eq(channel2.getId()), anyBoolean()))
.thenReturn(channel2);
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.createNotificationChannels(PKG,
new ParceledListSlice(Arrays.asList(mTestNotificationChannel, channel2)));
- verify(mNotificationListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
- verify(mNotificationListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(channel2),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
}
@@ -847,13 +856,13 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
NotificationChannelGroup group1 = new NotificationChannelGroup("a", "b");
NotificationChannelGroup group2 = new NotificationChannelGroup("n", "m");
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.createNotificationChannelGroups(PKG,
new ParceledListSlice(Arrays.asList(group1, group2)));
- verify(mNotificationListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
eq(Process.myUserHandle()), eq(group1),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
- verify(mNotificationListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
eq(Process.myUserHandle()), eq(group2),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
}
@@ -869,9 +878,9 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.updateNotificationChannelForPackage(PKG, 0, mTestNotificationChannel);
- verify(mNotificationListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -885,9 +894,9 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.deleteNotificationChannel(PKG, mTestNotificationChannel.getId());
- verify(mNotificationListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_DELETED));
}
@@ -901,9 +910,9 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
mNotificationManagerService.setRankingHelper(mRankingHelper);
when(mRankingHelper.getNotificationChannelGroup(eq(ncg.getId()), eq(PKG), anyInt()))
.thenReturn(ncg);
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.deleteNotificationChannelGroup(PKG, ncg.getId());
- verify(mNotificationListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
eq(Process.myUserHandle()), eq(ncg),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_DELETED));
}
@@ -920,7 +929,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
verify(mRankingHelper, times(1)).updateNotificationChannel(anyString(), anyInt(), any());
- verify(mNotificationListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -941,7 +950,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
verify(mRankingHelper, never()).updateNotificationChannel(anyString(), anyInt(), any());
- verify(mNotificationListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -955,7 +964,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
mListener = mock(ManagedServices.ManagedServiceInfo.class);
mListener.component = new ComponentName(PKG, PKG);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
- when(mNotificationListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
try {
mBinderService.updateNotificationChannelFromPrivilegedListener(
@@ -967,7 +976,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
verify(mRankingHelper, never()).updateNotificationChannel(anyString(), anyInt(), any());
- verify(mNotificationListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -1012,7 +1021,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
- when(mNotificationListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
try {
mBinderService.getNotificationChannelsFromPrivilegedListener(
@@ -1063,7 +1072,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
- when(mNotificationListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
try {
mBinderService.getNotificationChannelGroupsFromPrivilegedListener(
@@ -1232,11 +1241,11 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
}
}
- verify(mNotificationListeners, times(1)).setPackageOrComponentEnabled(
+ verify(mListeners, times(1)).setPackageOrComponentEnabled(
c.flattenToString(), 0, true, true);
verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
c.flattenToString(), 0, false, true);
- verify(mNotificationAssistants, never()).setPackageOrComponentEnabled(
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
any(), anyInt(), anyBoolean(), anyBoolean());
}
@@ -1251,11 +1260,11 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
}
}
- verify(mNotificationAssistants, times(1)).setPackageOrComponentEnabled(
+ verify(mAssistants, times(1)).setPackageOrComponentEnabled(
c.flattenToString(), 0, true, true);
verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
c.flattenToString(), 0, false, true);
- verify(mNotificationListeners, never()).setPackageOrComponentEnabled(
+ verify(mListeners, never()).setPackageOrComponentEnabled(
any(), anyInt(), anyBoolean(), anyBoolean());
}
@@ -1272,9 +1281,9 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
c.getPackageName(), 0, true, true);
- verify(mNotificationAssistants, never()).setPackageOrComponentEnabled(
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
any(), anyInt(), anyBoolean(), anyBoolean());
- verify(mNotificationListeners, never()).setPackageOrComponentEnabled(
+ verify(mListeners, never()).setPackageOrComponentEnabled(
any(), anyInt(), anyBoolean(), anyBoolean());
}
@@ -1284,11 +1293,11 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
ComponentName c = ComponentName.unflattenFromString("package/Component");
mBinderService.setNotificationListenerAccessGranted(c, true);
- verify(mNotificationListeners, never()).setPackageOrComponentEnabled(
+ verify(mListeners, never()).setPackageOrComponentEnabled(
c.flattenToString(), 0, true, true);
verify(mConditionProviders, never()).setPackageOrComponentEnabled(
c.flattenToString(), 0, false, true);
- verify(mNotificationAssistants, never()).setPackageOrComponentEnabled(
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
any(), anyInt(), anyBoolean(), anyBoolean());
}
@@ -1299,11 +1308,11 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
mBinderService.setNotificationAssistantAccessGranted(c, true);
- verify(mNotificationListeners, never()).setPackageOrComponentEnabled(
+ verify(mListeners, never()).setPackageOrComponentEnabled(
c.flattenToString(), 0, true, true);
verify(mConditionProviders, never()).setPackageOrComponentEnabled(
c.flattenToString(), 0, false, true);
- verify(mNotificationAssistants, never()).setPackageOrComponentEnabled(
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
any(), anyInt(), anyBoolean(), anyBoolean());
}
@@ -1313,11 +1322,11 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
ComponentName c = ComponentName.unflattenFromString("package/Component");
mBinderService.setNotificationPolicyAccessGranted(c.getPackageName(), true);
- verify(mNotificationListeners, never()).setPackageOrComponentEnabled(
+ verify(mListeners, never()).setPackageOrComponentEnabled(
c.flattenToString(), 0, true, true);
verify(mConditionProviders, never()).setPackageOrComponentEnabled(
c.flattenToString(), 0, false, true);
- verify(mNotificationAssistants, never()).setPackageOrComponentEnabled(
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
any(), anyInt(), anyBoolean(), anyBoolean());
}
@@ -1425,16 +1434,41 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
}
@Test
- public void testModifyAutogroup_requestsSort() throws Exception {
+ public void testAddAutogroup_requestsSort() throws Exception {
RankingHandler rh = mock(RankingHandler.class);
mNotificationManagerService.setRankingHandler(rh);
final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
mNotificationManagerService.addNotification(r);
mNotificationManagerService.addAutogroupKeyLocked(r.getKey());
+
+ verify(rh, times(1)).requestSort();
+ }
+
+ @Test
+ public void testRemoveAutogroup_requestsSort() throws Exception {
+ RankingHandler rh = mock(RankingHandler.class);
+ mNotificationManagerService.setRankingHandler(rh);
+
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ r.setOverrideGroupKey("TEST");
+ mNotificationManagerService.addNotification(r);
mNotificationManagerService.removeAutogroupKeyLocked(r.getKey());
- verify(rh, times(2)).requestSort();
+ verify(rh, times(1)).requestSort();
+ }
+
+ @Test
+ public void testReaddAutogroup_noSort() throws Exception {
+ RankingHandler rh = mock(RankingHandler.class);
+ mNotificationManagerService.setRankingHandler(rh);
+
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ r.setOverrideGroupKey("TEST");
+ mNotificationManagerService.addNotification(r);
+ mNotificationManagerService.addAutogroupKeyLocked(r.getKey());
+
+ verify(rh, never()).requestSort();
}
@Test
@@ -1470,4 +1504,50 @@ public class NotificationManagerServiceTest extends NotificationTestCase {
mNotificationManagerService.handleRankingSort();
verify(handler, never()).scheduleSendRankingUpdate();
}
+
+ @Test
+ public void testReadPolicyXml_readApprovedServicesFromXml() throws Exception {
+ final String preupgradeXml = "<notification-policy version=\"1\">"
+ + "<zen></zen>"
+ + "<ranking></ranking>"
+ + "<enabled_listeners>"
+ + "<service_listing approved=\"test\" user=\"0\" primary=\"true\" />"
+ + "</enabled_listeners>"
+ + "<enabled_assistants>"
+ + "<service_listing approved=\"test\" user=\"0\" primary=\"true\" />"
+ + "</enabled_assistants>"
+ + "<dnd_apps>"
+ + "<service_listing approved=\"test\" user=\"0\" primary=\"true\" />"
+ + "</dnd_apps>"
+ + "</notification-policy>";
+ mNotificationManagerService.readPolicyXml(
+ new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())), false);
+ verify(mListeners, times(1)).readXml(any());
+ verify(mConditionProviders, times(1)).readXml(any());
+ verify(mAssistants, times(1)).readXml(any());
+
+ // numbers are inflated for setup
+ verify(mListeners, times(1)).migrateToXml();
+ verify(mConditionProviders, times(1)).migrateToXml();
+ verify(mAssistants, times(1)).migrateToXml();
+ }
+
+ @Test
+ public void testReadPolicyXml_readApprovedServicesFromSettings() throws Exception {
+ final String preupgradeXml = "<notification-policy version=\"1\">"
+ + "<zen></zen>"
+ + "<ranking></ranking>"
+ + "</notification-policy>";
+ mNotificationManagerService.readPolicyXml(
+ new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())), false);
+ verify(mListeners, never()).readXml(any());
+ verify(mConditionProviders, never()).readXml(any());
+ verify(mAssistants, never()).readXml(any());
+
+ // numbers are inflated for setup
+ verify(mListeners, times(2)).migrateToXml();
+ verify(mConditionProviders, times(2)).migrateToXml();
+ verify(mAssistants, times(2)).migrateToXml();
+ }
+
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index 16bc011f97b5..04b5bdebdca1 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -16,6 +16,7 @@
package com.android.server.am;
+import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.any;
@@ -78,7 +79,7 @@ public class ActivityTestsBase {
int stackId, int displayId, boolean onTop) {
if (service.mStackSupervisor instanceof TestActivityStackSupervisor) {
return ((TestActivityStackSupervisor) service.mStackSupervisor)
- .createTestStack(service, stackId, onTop);
+ .createTestStack(stackId, onTop);
}
return null;
@@ -96,8 +97,7 @@ public class ActivityTestsBase {
0 /* launchedFromPid */, 0, null, intent, null,
aInfo /*aInfo*/, new Configuration(), null /* resultTo */, null /* resultWho */,
0 /* reqCode */, false /*componentSpecified*/, false /* rootVoiceInteraction */,
- service.mStackSupervisor, null /* container */, null /* options */,
- null /* sourceRecord */);
+ service.mStackSupervisor, null /* options */, null /* sourceRecord */);
activity.mWindowContainerController = mock(AppWindowContainerController.class);
if (task != null) {
@@ -187,12 +187,24 @@ public class ActivityTestsBase {
boolean preserveWindows) {
}
- public <T extends ActivityStack> T createTestStack(ActivityManagerService service,
- int stackId, boolean onTop) {
- final TestActivityContainer container =
- new TestActivityContainer(service, stackId, mDisplay, onTop);
- mActivityContainers.put(stackId, container);
- return (T) container.getStack();
+ <T extends ActivityStack> T createTestStack(int stackId, boolean onTop) {
+ return (T) createStack(stackId, mDisplay, onTop);
+ }
+
+ @Override
+ ActivityStack createStack(int stackId, ActivityDisplay display, boolean onTop) {
+ final RecentTasks recents =
+ new RecentTasks(mService, mService.mStackSupervisor);
+ if (stackId == PINNED_STACK_ID) {
+ return new PinnedActivityStack(display, stackId, this, recents, onTop) {
+ @Override
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
+ return new Rect(50, 50, 100, 100);
+ }
+ };
+ } else {
+ return new TestActivityStack(display, stackId, this, recents, onTop);
+ }
}
@Override
@@ -204,49 +216,7 @@ public class ActivityTestsBase {
return stack;
}
- return createTestStack(mService, stackId, createOnTop);
- }
-
- private class TestActivityContainer extends ActivityContainer {
- private final ActivityManagerService mService;
-
- private boolean mOnTop;
- private int mStackId;
- private ActivityStack mStack;
-
- TestActivityContainer(ActivityManagerService service, int stackId,
- ActivityDisplay activityDisplay, boolean onTop) {
- super(stackId, activityDisplay, onTop);
- mService = service;
- }
-
- @Override
- protected void createStack(int stackId, boolean onTop) {
- // normally stack creation is done here. However we need to do it on demand since
- // we cannot set {@link mService} by the time the super constructor calling this
- // method is invoked.
- mOnTop = onTop;
- mStackId = stackId;
- }
-
- public ActivityStack getStack() {
- if (mStack == null) {
- final RecentTasks recents =
- new RecentTasks(mService, mService.mStackSupervisor);
- if (mStackId == ActivityManager.StackId.PINNED_STACK_ID) {
- mStack = new PinnedActivityStack(this, recents, mOnTop) {
- @Override
- Rect getDefaultPictureInPictureBounds(float aspectRatio) {
- return new Rect(50, 50, 100, 100);
- }
- };
- } else {
- mStack = new TestActivityStack(this, recents, mOnTop);
- }
- }
-
- return mStack;
- }
+ return createTestStack(stackId, createOnTop);
}
}
@@ -277,9 +247,9 @@ public class ActivityTestsBase {
extends ActivityStack<T> implements ActivityStackReporter {
private int mOnActivityRemovedFromStackCount = 0;
private T mContainerController;
- TestActivityStack(ActivityStackSupervisor.ActivityContainer activityContainer,
- RecentTasks recentTasks, boolean onTop) {
- super(activityContainer, recentTasks, onTop);
+ TestActivityStack(ActivityStackSupervisor.ActivityDisplay display, int stackId,
+ ActivityStackSupervisor supervisor, RecentTasks recentTasks, boolean onTop) {
+ super(display, stackId, supervisor, recentTasks, onTop);
}
@Override