summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java4
-rw-r--r--core/java/android/animation/AnimationHandler.java3
-rw-r--r--core/java/android/app/Activity.java1
-rw-r--r--core/java/android/app/ActivityOptions.java28
-rw-r--r--core/java/android/app/ApplicationPackageManager.java4
-rw-r--r--core/java/android/app/Notification.java2
-rw-r--r--core/java/android/app/job/JobInfo.java45
-rw-r--r--core/java/android/app/usage/IStorageStatsManager.aidl1
-rw-r--r--core/java/android/app/usage/StorageStatsManager.java18
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl4
-rw-r--r--core/java/android/nfc/IAppCallback.aidl4
-rw-r--r--core/java/android/os/BatteryStats.java138
-rw-r--r--core/java/android/os/storage/StorageManager.java11
-rwxr-xr-xcore/java/android/provider/Settings.java42
-rw-r--r--core/java/android/util/proto/ProtoOutputStream.java6
-rw-r--r--core/java/android/view/AppTransitionAnimationSpec.java15
-rw-r--r--core/java/android/view/IPinnedStackController.aidl8
-rw-r--r--core/java/android/view/IWindowManager.aidl5
-rw-r--r--core/java/android/view/SurfaceView.java23
-rw-r--r--core/java/android/view/ViewRootImpl.java22
-rw-r--r--core/java/android/view/WindowManagerInternal.java3
-rw-r--r--core/java/android/view/autofill/AutofillManager.java36
-rw-r--r--core/java/com/android/internal/app/IBatteryStats.aidl2
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java292
-rw-r--r--core/java/com/android/internal/util/DumpUtils.java2
-rw-r--r--core/jni/AndroidRuntime.cpp4
-rw-r--r--core/jni/android_hardware_Radio.cpp4
-rw-r--r--core/proto/android/providers/settings.proto6
-rw-r--r--core/res/res/values-ar/strings.xml2
-rw-r--r--core/res/res/values-bs/strings.xml12
-rw-r--r--core/res/res/values-ca/strings.xml2
-rw-r--r--core/res/res/values-ko/strings.xml4
-rw-r--r--core/res/res/values-ru/strings.xml2
-rw-r--r--core/res/res/values-th/strings.xml24
-rw-r--r--core/tests/coretests/src/android/content/pm/AppCacheTest.java4
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java6
-rw-r--r--core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java39
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java148
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java16
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java7
-rw-r--r--graphics/java/android/graphics/Paint.java7
-rw-r--r--graphics/java/android/graphics/Typeface.java6
-rw-r--r--libs/hwui/pipeline/skia/RenderNodeDrawable.cpp13
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java5
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java16
-rw-r--r--packages/SystemUI/res/layout/qs_footer.xml1
-rw-r--r--packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml9
-rw-r--r--packages/SystemUI/res/values-af/strings.xml2
-rw-r--r--packages/SystemUI/res/values-am/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml2
-rw-r--r--packages/SystemUI/res/values-az/strings.xml2
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml2
-rw-r--r--packages/SystemUI/res/values-be/strings.xml2
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml2
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml2
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml2
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml2
-rw-r--r--packages/SystemUI/res/values-da/strings.xml2
-rw-r--r--packages/SystemUI/res/values-de/strings.xml2
-rw-r--r--packages/SystemUI/res/values-el/strings.xml2
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml2
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml2
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml2
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml2
-rw-r--r--packages/SystemUI/res/values-es/strings.xml2
-rw-r--r--packages/SystemUI/res/values-et/strings.xml2
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml2
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml2
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml2
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml2
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml2
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml2
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml2
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml2
-rw-r--r--packages/SystemUI/res/values-hy/strings_tv.xml2
-rw-r--r--packages/SystemUI/res/values-in/strings.xml2
-rw-r--r--packages/SystemUI/res/values-is/strings.xml2
-rw-r--r--packages/SystemUI/res/values-it/strings.xml2
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml4
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml2
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml2
-rw-r--r--packages/SystemUI/res/values-km/strings.xml2
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml2
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml2
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml2
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml2
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml2
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml2
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml2
-rw-r--r--packages/SystemUI/res/values-my/strings.xml2
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml2
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml26
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml2
-rw-r--r--packages/SystemUI/res/values-si/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml2
-rw-r--r--packages/SystemUI/res/values-te/strings.xml2
-rw-r--r--packages/SystemUI/res/values-th/strings.xml14
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml2
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml4
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml6
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooter.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFragment.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java37
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java58
-rw-r--r--packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java33
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/Utils.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java15
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java56
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java8
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java10
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java11
-rw-r--r--services/core/java/com/android/server/EventLogTags.logtags10
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java35
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java8
-rw-r--r--services/core/java/com/android/server/am/ActivityRecord.java13
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java2
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java4
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java39
-rw-r--r--services/core/java/com/android/server/am/KeyguardController.java9
-rw-r--r--services/core/java/com/android/server/am/PinnedActivityStack.java4
-rw-r--r--services/core/java/com/android/server/am/ProcessStatsService.java3
-rw-r--r--services/core/java/com/android/server/am/TaskRecord.java8
-rw-r--r--services/core/java/com/android/server/notification/ManagedServices.java4
-rw-r--r--services/core/java/com/android/server/pm/Installer.java5
-rw-r--r--services/core/java/com/android/server/pm/InstantAppRegistry.java221
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java138
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java18
-rw-r--r--services/core/java/com/android/server/policy/WindowOrientationListener.java58
-rw-r--r--services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java2
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java5
-rw-r--r--services/core/java/com/android/server/storage/DeviceStorageMonitorService.java753
-rw-r--r--services/core/java/com/android/server/vr/VrManagerService.java3
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java21
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java7
-rw-r--r--services/core/java/com/android/server/wm/PinnedStackController.java40
-rw-r--r--services/core/java/com/android/server/wm/PinnedStackWindowController.java41
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java10
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotController.java20
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerDebugConfig.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java37
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfacePlacer.java18
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java3
-rw-r--r--services/usage/java/com/android/server/usage/StorageStatsService.java43
-rw-r--r--tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java5
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java24
-rw-r--r--wifi/tests/src/android/net/wifi/WifiManagerTest.java9
187 files changed, 2160 insertions, 1091 deletions
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index b60aed68ba1c..d71573f7ca50 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -63,6 +63,7 @@ import android.os.ShellCallback;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
+import android.os.storage.StorageManager;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
@@ -1471,7 +1472,8 @@ public final class Pm {
}
ClearDataObserver obs = new ClearDataObserver();
try {
- mPm.freeStorageAndNotify(volumeUuid, sizeVal, obs);
+ mPm.freeStorageAndNotify(volumeUuid, sizeVal,
+ StorageManager.FLAG_ALLOCATE_DEFY_RESERVED, obs);
synchronized (obs) {
while (!obs.finished) {
try {
diff --git a/core/java/android/animation/AnimationHandler.java b/core/java/android/animation/AnimationHandler.java
index e2e5a8f66288..260323fe2d10 100644
--- a/core/java/android/animation/AnimationHandler.java
+++ b/core/java/android/animation/AnimationHandler.java
@@ -136,7 +136,8 @@ public class AnimationHandler {
private void doAnimationFrame(long frameTime) {
long currentTime = SystemClock.uptimeMillis();
- for (int i = 0; i < mAnimationCallbacks.size(); i++) {
+ final int size = mAnimationCallbacks.size();
+ for (int i = 0; i < size; i++) {
final AnimationFrameCallback callback = mAnimationCallbacks.get(i);
if (callback == null) {
continue;
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index b439c1dc02c4..b360c82374d0 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -6142,6 +6142,7 @@ public class Activity extends ContextThemeWrapper
*
* @param action the action to run on the UI thread
*/
+ @Override
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 53608fbdd4bb..c4d51168d20c 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -25,6 +25,8 @@ import android.annotation.TestApi;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
@@ -826,7 +828,11 @@ public class ActivityOptions {
case ANIM_THUMBNAIL_SCALE_DOWN:
case ANIM_THUMBNAIL_ASPECT_SCALE_UP:
case ANIM_THUMBNAIL_ASPECT_SCALE_DOWN:
- mThumbnail = (Bitmap) opts.getParcelable(KEY_ANIM_THUMBNAIL);
+ // Unpackage the GraphicBuffer from the parceled thumbnail
+ final GraphicBuffer buffer = opts.getParcelable(KEY_ANIM_THUMBNAIL);
+ if (buffer != null) {
+ mThumbnail = Bitmap.createHardwareBitmap(buffer);
+ }
mStartX = opts.getInt(KEY_ANIM_START_X, 0);
mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
mWidth = opts.getInt(KEY_ANIM_WIDTH, 0);
@@ -919,9 +925,14 @@ public class ActivityOptions {
return mCustomInPlaceResId;
}
- /** @hide */
- public Bitmap getThumbnail() {
- return mThumbnail;
+ /**
+ * The thumbnail is copied into a hardware bitmap when it is bundled and sent to the system, so
+ * it should always be backed by a GraphicBuffer on the other end.
+ *
+ * @hide
+ */
+ public GraphicBuffer getThumbnail() {
+ return mThumbnail.createGraphicBufferHandle();
}
/** @hide */
@@ -1230,7 +1241,14 @@ public class ActivityOptions {
case ANIM_THUMBNAIL_SCALE_DOWN:
case ANIM_THUMBNAIL_ASPECT_SCALE_UP:
case ANIM_THUMBNAIL_ASPECT_SCALE_DOWN:
- b.putParcelable(KEY_ANIM_THUMBNAIL, mThumbnail);
+ // Once we parcel the thumbnail for transfering over to the system, create a copy of
+ // the bitmap to a hardware bitmap and pass through the GraphicBuffer
+ if (mThumbnail == null) {
+ b.putParcelable(KEY_ANIM_THUMBNAIL, null);
+ } else {
+ final Bitmap hwBitmap = mThumbnail.copy(Config.HARDWARE, true /* immutable */);
+ b.putParcelable(KEY_ANIM_THUMBNAIL, hwBitmap.createGraphicBufferHandle());
+ }
b.putInt(KEY_ANIM_START_X, mStartX);
b.putInt(KEY_ANIM_START_Y, mStartY);
b.putInt(KEY_ANIM_WIDTH, mWidth);
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 525b15113855..e5c420876c8a 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -2108,7 +2108,7 @@ public class ApplicationPackageManager extends PackageManager {
public void freeStorageAndNotify(String volumeUuid, long idealStorageSize,
IPackageDataObserver observer) {
try {
- mPM.freeStorageAndNotify(volumeUuid, idealStorageSize, observer);
+ mPM.freeStorageAndNotify(volumeUuid, idealStorageSize, 0, observer);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2117,7 +2117,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public void freeStorage(String volumeUuid, long freeStorageSize, IntentSender pi) {
try {
- mPM.freeStorage(volumeUuid, freeStorageSize, pi);
+ mPM.freeStorage(volumeUuid, freeStorageSize, 0, pi);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index c626ae9630b8..31f52dbea548 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -1168,7 +1168,7 @@ public class Notification implements Parcelable
*/
public static final int GROUP_ALERT_CHILDREN = 2;
- private int mGroupAlertBehavior = GROUP_ALERT_ALL;
+ private int mGroupAlertBehavior = GROUP_ALERT_CHILDREN;
/**
* If this notification is being shown as a badge, always show as a number.
diff --git a/core/java/android/app/job/JobInfo.java b/core/java/android/app/job/JobInfo.java
index 3cb59f27bfaf..87e516cabba5 100644
--- a/core/java/android/app/job/JobInfo.java
+++ b/core/java/android/app/job/JobInfo.java
@@ -35,6 +35,7 @@ import android.util.Log;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Objects;
/**
@@ -501,7 +502,7 @@ public class JobInfo implements Parcelable {
if (constraintFlags != j.constraintFlags) {
return false;
}
- if (!Objects.deepEquals(triggerContentUris, j.triggerContentUris)) {
+ if (!Arrays.equals(triggerContentUris, j.triggerContentUris)) {
return false;
}
if (triggerContentUpdateDelay != j.triggerContentUpdateDelay) {
@@ -556,37 +557,37 @@ public class JobInfo implements Parcelable {
public int hashCode() {
int hashCode = jobId;
if (extras != null) {
- hashCode = 31*hashCode + extras.hashCode();
+ hashCode = 31 * hashCode + extras.hashCode();
}
if (transientExtras != null) {
- hashCode = 31*hashCode + transientExtras.hashCode();
+ hashCode = 31 * hashCode + transientExtras.hashCode();
}
if (clipData != null) {
- hashCode = 31*hashCode + clipData.hashCode();
+ hashCode = 31 * hashCode + clipData.hashCode();
}
hashCode = 31*hashCode + clipGrantFlags;
if (service != null) {
- hashCode = 31*hashCode + service.hashCode();
+ hashCode = 31 * hashCode + service.hashCode();
}
- hashCode = 31*hashCode + constraintFlags;
+ hashCode = 31 * hashCode + constraintFlags;
if (triggerContentUris != null) {
- hashCode = 31*hashCode + triggerContentUris.hashCode();
+ hashCode = 31 * hashCode + Arrays.hashCode(triggerContentUris);
}
- hashCode = 31*hashCode + Long.hashCode(triggerContentUpdateDelay);
- hashCode = 31*hashCode + Long.hashCode(triggerContentMaxDelay);
- hashCode = 31*hashCode + Boolean.hashCode(hasEarlyConstraint);
- hashCode = 31*hashCode + Boolean.hashCode(hasLateConstraint);
- hashCode = 31*hashCode + networkType;
- hashCode = 31*hashCode + Long.hashCode(minLatencyMillis);
- hashCode = 31*hashCode + Long.hashCode(maxExecutionDelayMillis);
- hashCode = 31*hashCode + Boolean.hashCode(isPeriodic);
- hashCode = 31*hashCode + Boolean.hashCode(isPersisted);
- hashCode = 31*hashCode + Long.hashCode(intervalMillis);
- hashCode = 31*hashCode + Long.hashCode(flexMillis);
- hashCode = 31*hashCode + Long.hashCode(initialBackoffMillis);
- hashCode = 31*hashCode + backoffPolicy;
- hashCode = 31*hashCode + priority;
- hashCode = 31*hashCode + flags;
+ hashCode = 31 * hashCode + Long.hashCode(triggerContentUpdateDelay);
+ hashCode = 31 * hashCode + Long.hashCode(triggerContentMaxDelay);
+ hashCode = 31 * hashCode + Boolean.hashCode(hasEarlyConstraint);
+ hashCode = 31 * hashCode + Boolean.hashCode(hasLateConstraint);
+ hashCode = 31 * hashCode + networkType;
+ hashCode = 31 * hashCode + Long.hashCode(minLatencyMillis);
+ hashCode = 31 * hashCode + Long.hashCode(maxExecutionDelayMillis);
+ hashCode = 31 * hashCode + Boolean.hashCode(isPeriodic);
+ hashCode = 31 * hashCode + Boolean.hashCode(isPersisted);
+ hashCode = 31 * hashCode + Long.hashCode(intervalMillis);
+ hashCode = 31 * hashCode + Long.hashCode(flexMillis);
+ hashCode = 31 * hashCode + Long.hashCode(initialBackoffMillis);
+ hashCode = 31 * hashCode + backoffPolicy;
+ hashCode = 31 * hashCode + priority;
+ hashCode = 31 * hashCode + flags;
return hashCode;
}
diff --git a/core/java/android/app/usage/IStorageStatsManager.aidl b/core/java/android/app/usage/IStorageStatsManager.aidl
index 5d1550f1a557..15e5ea5f44ff 100644
--- a/core/java/android/app/usage/IStorageStatsManager.aidl
+++ b/core/java/android/app/usage/IStorageStatsManager.aidl
@@ -24,6 +24,7 @@ interface IStorageStatsManager {
boolean isQuotaSupported(String volumeUuid, String callingPackage);
long getTotalBytes(String volumeUuid, String callingPackage);
long getFreeBytes(String volumeUuid, String callingPackage);
+ long getCacheBytes(String volumeUuid, String callingPackage);
long getCacheQuotaBytes(String volumeUuid, int uid, String callingPackage);
StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId, String callingPackage);
StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage);
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index d9d958c0653c..0b2b1900c4e0 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -142,6 +142,24 @@ public class StorageStatsManager {
return getFreeBytes(convert(uuid));
}
+ /** {@hide} */
+ public @BytesLong long getCacheBytes(@NonNull UUID storageUuid) throws IOException {
+ try {
+ return mService.getCacheBytes(convert(storageUuid), mContext.getOpPackageName());
+ } catch (ParcelableException e) {
+ e.maybeRethrow(IOException.class);
+ throw new RuntimeException(e);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /** {@hide} */
+ @Deprecated
+ public long getCacheBytes(String uuid) throws IOException {
+ return getCacheBytes(convert(uuid));
+ }
+
/**
* Return storage statistics for a specific package on the requested storage
* volume.
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 7aaf453e404d..2ebfa8fb3ac2 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -360,7 +360,7 @@ interface IPackageManager {
* the operation is completed
*/
void freeStorageAndNotify(in String volumeUuid, in long freeStorageSize,
- IPackageDataObserver observer);
+ int storageFlags, IPackageDataObserver observer);
/**
* Free storage by deleting LRU sorted list of cache files across
@@ -384,7 +384,7 @@ interface IPackageManager {
* to indicate that no call back is desired.
*/
void freeStorage(in String volumeUuid, in long freeStorageSize,
- in IntentSender pi);
+ int storageFlags, in IntentSender pi);
/**
* Delete all the cache files in an applications cache directory
diff --git a/core/java/android/nfc/IAppCallback.aidl b/core/java/android/nfc/IAppCallback.aidl
index c027d54647bd..133146de2aa1 100644
--- a/core/java/android/nfc/IAppCallback.aidl
+++ b/core/java/android/nfc/IAppCallback.aidl
@@ -25,6 +25,6 @@ import android.nfc.Tag;
interface IAppCallback
{
BeamShareData createBeamShareData(byte peerLlcpVersion);
- void onNdefPushComplete(byte peerLlcpVersion);
- void onTagDiscovered(in Tag tag);
+ oneway void onNdefPushComplete(byte peerLlcpVersion);
+ oneway void onTagDiscovered(in Tag tag);
}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 499d6bbdf535..ecc4dec47af7 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -162,6 +162,11 @@ public abstract class BatteryStats implements Parcelable {
public static final int AGGREGATED_WAKE_TYPE_PARTIAL = 20;
/**
+ * A constant indicating a bluetooth scan timer for unoptimized scans.
+ */
+ public static final int BLUETOOTH_UNOPTIMIZED_SCAN_ON = 21;
+
+ /**
* Include all of the data in the stats, including previously saved data.
*/
public static final int STATS_SINCE_CHARGED = 0;
@@ -191,8 +196,12 @@ public abstract class BatteryStats implements Parcelable {
* New in version 21:
* - Actual (not just apportioned) Wakelock time is also recorded.
* - Aggregated partial wakelock time (per uid, instead of per wakelock) is recorded.
+ * - BLE scan result count
+ * - CPU frequency time per uid
+ * New in version 22:
+ * - BLE scan result background count, BLE unoptimized scan time
*/
- static final String CHECKIN_VERSION = "21";
+ static final String CHECKIN_VERSION = "22";
/**
* Old version, we hit 9 and ran out of room, need to remove.
@@ -217,9 +226,10 @@ public abstract class BatteryStats implements Parcelable {
private static final String STATE_TIME_DATA = "st";
// wl line is:
// BATTERY_STATS_CHECKIN_VERSION, uid, which, "wl", name,
- // full totalTime, 'f', count, current duration, max duration, total duration,
- // partial totalTime, 'p', count, current duration, max duration, total duration,
- // window totalTime, 'w', count, current duration, max duration, total duration
+ // full totalTime, 'f', count, current duration, max duration, total duration,
+ // partial totalTime, 'p', count, current duration, max duration, total duration,
+ // bg partial totalTime, 'bp', count, current duration, max duration, total duration,
+ // window totalTime, 'w', count, current duration, max duration, total duration
// [Currently, full and window wakelocks have durations current = max = total = -1]
private static final String WAKELOCK_DATA = "wl";
// awl line is:
@@ -565,7 +575,10 @@ public abstract class BatteryStats implements Parcelable {
public abstract Timer getForegroundActivityTimer();
public abstract Timer getBluetoothScanTimer();
public abstract Timer getBluetoothScanBackgroundTimer();
+ public abstract Timer getBluetoothUnoptimizedScanTimer();
+ public abstract Timer getBluetoothUnoptimizedScanBackgroundTimer();
public abstract Counter getBluetoothScanResultCounter();
+ public abstract Counter getBluetoothScanResultBgCounter();
public abstract long[] getCpuFreqTimes(int which);
public abstract long[] getScreenOffCpuFreqTimes(int which);
@@ -3429,10 +3442,29 @@ public abstract class BatteryStats implements Parcelable {
final long actualTime = bleTimer.getTotalDurationMsLocked(rawRealtimeMs);
final long actualTimeBg = bleTimerBg != null ?
bleTimerBg.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ // Result counters
final int resultCount = u.getBluetoothScanResultCounter() != null ?
u.getBluetoothScanResultCounter().getCountLocked(which) : 0;
+ final int resultCountBg = u.getBluetoothScanResultBgCounter() != null ?
+ u.getBluetoothScanResultBgCounter().getCountLocked(which) : 0;
+ // Unoptimized scan timer. Unpooled and since reset (regardless of 'which').
+ final Timer unoptimizedScanTimer = u.getBluetoothUnoptimizedScanTimer();
+ final long unoptimizedScanTotalTime = unoptimizedScanTimer != null ?
+ unoptimizedScanTimer.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ final long unoptimizedScanMaxTime = unoptimizedScanTimer != null ?
+ unoptimizedScanTimer.getMaxDurationMsLocked(rawRealtimeMs) : 0;
+ // Unoptimized bg scan timer. Unpooled and since reset (regardless of 'which').
+ final Timer unoptimizedScanTimerBg =
+ u.getBluetoothUnoptimizedScanBackgroundTimer();
+ final long unoptimizedScanTotalTimeBg = unoptimizedScanTimerBg != null ?
+ unoptimizedScanTimerBg.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ final long unoptimizedScanMaxTimeBg = unoptimizedScanTimerBg != null ?
+ unoptimizedScanTimerBg.getMaxDurationMsLocked(rawRealtimeMs) : 0;
+
dumpLine(pw, uid, category, BLUETOOTH_MISC_DATA, totalTime, count,
- countBg, actualTime, actualTimeBg, resultCount);
+ countBg, actualTime, actualTimeBg, resultCount, resultCountBg,
+ unoptimizedScanTotalTime, unoptimizedScanTotalTimeBg,
+ unoptimizedScanMaxTime, unoptimizedScanMaxTimeBg);
}
}
@@ -3469,8 +3501,11 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL),
rawRealtime, "f", which, linePrefix);
- linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL),
+ final Timer pTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
+ linePrefix = printWakeLockCheckin(sb, pTimer,
rawRealtime, "p", which, linePrefix);
+ linePrefix = printWakeLockCheckin(sb, pTimer != null ? pTimer.getSubTimer() : null,
+ rawRealtime, "bp", which, linePrefix);
linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW),
rawRealtime, "w", which, linePrefix);
@@ -4625,34 +4660,94 @@ public abstract class BatteryStats implements Parcelable {
final long actualTimeMs = bleTimer.getTotalDurationMsLocked(rawRealtimeMs);
final long actualTimeMsBg = bleTimerBg != null ?
bleTimerBg.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ // Result counters
final int resultCount = u.getBluetoothScanResultCounter() != null ?
u.getBluetoothScanResultCounter().getCountLocked(which) : 0;
+ final int resultCountBg = u.getBluetoothScanResultBgCounter() != null ?
+ u.getBluetoothScanResultBgCounter().getCountLocked(which) : 0;
+ // Unoptimized scan timer. Unpooled and since reset (regardless of 'which').
+ final Timer unoptimizedScanTimer = u.getBluetoothUnoptimizedScanTimer();
+ final long unoptimizedScanTotalTime = unoptimizedScanTimer != null ?
+ unoptimizedScanTimer.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ final long unoptimizedScanMaxTime = unoptimizedScanTimer != null ?
+ unoptimizedScanTimer.getMaxDurationMsLocked(rawRealtimeMs) : 0;
+ // Unoptimized bg scan timer. Unpooled and since reset (regardless of 'which').
+ final Timer unoptimizedScanTimerBg =
+ u.getBluetoothUnoptimizedScanBackgroundTimer();
+ final long unoptimizedScanTotalTimeBg = unoptimizedScanTimerBg != null ?
+ unoptimizedScanTimerBg.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ final long unoptimizedScanMaxTimeBg = unoptimizedScanTimerBg != null ?
+ unoptimizedScanTimerBg.getMaxDurationMsLocked(rawRealtimeMs) : 0;
sb.setLength(0);
- sb.append(prefix);
- sb.append(" ");
- sb.append("Bluetooth Scan");
- sb.append(": ");
if (actualTimeMs != totalTimeMs) {
+ sb.append(prefix);
+ sb.append(" Bluetooth Scan (total blamed realtime): ");
formatTimeMs(sb, totalTimeMs);
- sb.append("blamed realtime, ");
+ sb.append(" (");
+ sb.append(count);
+ sb.append(" times)");
+ if (bleTimer.isRunningLocked()) {
+ sb.append(" (currently running)");
+ }
+ sb.append("\n");
}
- formatTimeMs(sb, actualTimeMs); // since reset, regardless of 'which'
- sb.append("realtime (");
+
+ sb.append(prefix);
+ sb.append(" Bluetooth Scan (total actual realtime): ");
+ formatTimeMs(sb, actualTimeMs); // since reset, ignores 'which'
+ sb.append(" (");
sb.append(count);
sb.append(" times)");
if (bleTimer.isRunningLocked()) {
- sb.append(" (running)");
+ sb.append(" (currently running)");
}
- if (actualTimeMsBg != 0 || countBg > 0) {
- sb.append(", ");
- formatTimeMs(sb, actualTimeMsBg); // since reset, regardless of 'which'
- sb.append("background (");
+ sb.append("\n");
+ if (actualTimeMsBg > 0 || countBg > 0) {
+ sb.append(prefix);
+ sb.append(" Bluetooth Scan (background realtime): ");
+ formatTimeMs(sb, actualTimeMsBg); // since reset, ignores 'which'
+ sb.append(" (");
sb.append(countBg);
sb.append(" times)");
+ if (bleTimerBg != null && bleTimerBg.isRunningLocked()) {
+ sb.append(" (currently running in background)");
+ }
+ sb.append("\n");
}
- sb.append("; Results count ");
+
+ sb.append(prefix);
+ sb.append(" Bluetooth Scan Results: ");
sb.append(resultCount);
+ sb.append(" (");
+ sb.append(resultCountBg);
+ sb.append(" in background)");
+
+ if (unoptimizedScanTotalTime > 0 || unoptimizedScanTotalTimeBg > 0) {
+ sb.append("\n");
+ sb.append(prefix);
+ sb.append(" Unoptimized Bluetooth Scan (realtime): ");
+ formatTimeMs(sb, unoptimizedScanTotalTime); // since reset, ignores 'which'
+ sb.append(" (max ");
+ formatTimeMs(sb, unoptimizedScanMaxTime); // since reset, ignores 'which'
+ sb.append(")");
+ if (unoptimizedScanTimer != null
+ && unoptimizedScanTimer.isRunningLocked()) {
+ sb.append(" (currently running unoptimized)");
+ }
+ if (unoptimizedScanTimerBg != null && unoptimizedScanTotalTimeBg > 0) {
+ sb.append("\n");
+ sb.append(prefix);
+ sb.append(" Unoptimized Bluetooth Scan (background realtime): ");
+ formatTimeMs(sb, unoptimizedScanTotalTimeBg); // since reset
+ sb.append(" (max ");
+ formatTimeMs(sb, unoptimizedScanMaxTimeBg); // since reset
+ sb.append(")");
+ if (unoptimizedScanTimerBg.isRunningLocked()) {
+ sb.append(" (currently running unoptimized in background)");
+ }
+ }
+ }
pw.println(sb.toString());
uidActivity = true;
}
@@ -4696,8 +4791,11 @@ public abstract class BatteryStats implements Parcelable {
sb.append(wakelocks.keyAt(iw));
linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), rawRealtime,
"full", which, linePrefix);
- linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), rawRealtime,
+ final Timer pTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
+ linePrefix = printWakeLock(sb, pTimer, rawRealtime,
"partial", which, linePrefix);
+ linePrefix = printWakeLock(sb, pTimer != null ? pTimer.getSubTimer() : null,
+ rawRealtime, "background partial", which, linePrefix);
linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), rawRealtime,
"window", which, linePrefix);
linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_DRAW), rawRealtime,
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index f361c549f016..d81ee4ef9843 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -1642,11 +1642,20 @@ public class StorageManager {
*/
@RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE)
@SystemApi
- public static final int FLAG_ALLOCATE_AGGRESSIVE = 1;
+ public static final int FLAG_ALLOCATE_AGGRESSIVE = 1 << 0;
+
+ /**
+ * Flag indicating that a disk space allocation request should defy any
+ * reserved disk space.
+ *
+ * @hide
+ */
+ public static final int FLAG_ALLOCATE_DEFY_RESERVED = 1 << 1;
/** @hide */
@IntDef(flag = true, value = {
FLAG_ALLOCATE_AGGRESSIVE,
+ FLAG_ALLOCATE_DEFY_RESERVED,
})
@Retention(RetentionPolicy.SOURCE)
public @interface AllocateFlags {}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 3cd54b8af39e..6a17ed1500bd 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -9817,13 +9817,49 @@ public final class Settings {
public static final String ENABLE_EPHEMERAL_FEATURE = "enable_ephemeral_feature";
/**
- * The duration for caching uninstalled instant apps.
+ * The min period for caching installed instant apps in milliseconds.
* <p>
* Type: long
* @hide
*/
- public static final String UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS =
- "uninstalled_instant_app_cache_duration_millis";
+ public static final String INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD =
+ "installed_instant_app_min_cache_period";
+
+ /**
+ * The max period for caching installed instant apps in milliseconds.
+ * <p>
+ * Type: long
+ * @hide
+ */
+ public static final String INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD =
+ "installed_instant_app_max_cache_period";
+
+ /**
+ * The min period for caching uninstalled instant apps in milliseconds.
+ * <p>
+ * Type: long
+ * @hide
+ */
+ public static final String UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD =
+ "uninstalled_instant_app_min_cache_period";
+
+ /**
+ * The max period for caching uninstalled instant apps in milliseconds.
+ * <p>
+ * Type: long
+ * @hide
+ */
+ public static final String UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD =
+ "uninstalled_instant_app_max_cache_period";
+
+ /**
+ * The min period for caching unused static shared libs in milliseconds.
+ * <p>
+ * Type: long
+ * @hide
+ */
+ public static final String UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD =
+ "unused_static_shared_lib_min_cache_period";
/**
* Allows switching users when system user is locked.
diff --git a/core/java/android/util/proto/ProtoOutputStream.java b/core/java/android/util/proto/ProtoOutputStream.java
index adf49387a05d..480abc1482a3 100644
--- a/core/java/android/util/proto/ProtoOutputStream.java
+++ b/core/java/android/util/proto/ProtoOutputStream.java
@@ -1593,7 +1593,7 @@ public final class ProtoOutputStream {
assertNotCompacted();
final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_FIXED64);
- writeRepeatedFixed64(id, val);
+ writeRepeatedFixed64Impl(id, val);
}
private void writeRepeatedFixed64Impl(int id, long val) {
@@ -1720,7 +1720,7 @@ public final class ProtoOutputStream {
assertNotCompacted();
final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SFIXED64);
- writeRepeatedSFixed64(id, val);
+ writeRepeatedSFixed64Impl(id, val);
}
private void writeRepeatedSFixed64Impl(int id, long val) {
@@ -1785,7 +1785,7 @@ public final class ProtoOutputStream {
assertNotCompacted();
final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_BOOL);
- writeRepeatedBool(id, val);
+ writeRepeatedBoolImpl(id, val);
}
private void writeRepeatedBoolImpl(int id, boolean val) {
diff --git a/core/java/android/view/AppTransitionAnimationSpec.java b/core/java/android/view/AppTransitionAnimationSpec.java
index c6e1989e8b55..86a5fb761355 100644
--- a/core/java/android/view/AppTransitionAnimationSpec.java
+++ b/core/java/android/view/AppTransitionAnimationSpec.java
@@ -1,6 +1,6 @@
package android.view;
-import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
@@ -15,19 +15,19 @@ import android.os.Parcelable;
*/
public class AppTransitionAnimationSpec implements Parcelable {
public final int taskId;
- public final Bitmap bitmap;
+ public final GraphicBuffer buffer;
public final Rect rect;
- public AppTransitionAnimationSpec(int taskId, Bitmap bitmap, Rect rect) {
+ public AppTransitionAnimationSpec(int taskId, GraphicBuffer buffer, Rect rect) {
this.taskId = taskId;
- this.bitmap = bitmap;
this.rect = rect;
+ this.buffer = buffer;
}
public AppTransitionAnimationSpec(Parcel in) {
taskId = in.readInt();
- bitmap = in.readParcelable(null);
rect = in.readParcelable(null);
+ buffer = in.readParcelable(null);
}
@Override
@@ -38,9 +38,8 @@ public class AppTransitionAnimationSpec implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(taskId);
- dest.writeParcelable(bitmap, 0 /* flags */);
dest.writeParcelable(rect, 0 /* flags */);
-
+ dest.writeParcelable(buffer, 0);
}
public static final Parcelable.Creator<AppTransitionAnimationSpec> CREATOR
@@ -56,6 +55,6 @@ public class AppTransitionAnimationSpec implements Parcelable {
@Override
public String toString() {
- return "{taskId: " + taskId + ", bitmap: " + bitmap + ", rect: " + rect + "}";
+ return "{taskId: " + taskId + ", buffer: " + buffer + ", rect: " + rect + "}";
}
}
diff --git a/core/java/android/view/IPinnedStackController.aidl b/core/java/android/view/IPinnedStackController.aidl
index dbeb747adfba..d2dcb568ef6c 100644
--- a/core/java/android/view/IPinnedStackController.aidl
+++ b/core/java/android/view/IPinnedStackController.aidl
@@ -30,6 +30,14 @@ interface IPinnedStackController {
oneway void setIsMinimized(boolean isMinimized);
/**
+ * Notifies the controller of the current min edge size, this is needed to allow the system to
+ * properly calculate the aspect ratio of the expanded PIP. The given {@param minEdgeSize} is
+ * always bounded to be larger than the default minEdgeSize, so the caller can call this method
+ * with 0 to reset to the default size.
+ */
+ oneway void setMinEdgeSize(int minEdgeSize);
+
+ /**
* @return what WM considers to be the current device rotation.
*/
int getDisplayRotation();
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index a2ff4f787b61..58a6a5e78803 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -26,6 +26,7 @@ import com.android.internal.policy.IShortcutService;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
@@ -96,9 +97,9 @@ interface IWindowManager
int startHeight);
void overridePendingAppTransitionClipReveal(int startX, int startY,
int startWidth, int startHeight);
- void overridePendingAppTransitionThumb(in Bitmap srcThumb, int startX, int startY,
+ void overridePendingAppTransitionThumb(in GraphicBuffer srcThumb, int startX, int startY,
IRemoteCallback startedCallback, boolean scaleUp);
- void overridePendingAppTransitionAspectScaledThumb(in Bitmap srcThumb, int startX,
+ void overridePendingAppTransitionAspectScaledThumb(in GraphicBuffer srcThumb, int startX,
int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
boolean scaleUp);
/**
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 435675ba01e5..b57ac66e10cc 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -264,6 +264,22 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
updateSurface();
}
+ private void performDrawFinished() {
+ if (mPendingReportDraws > 0) {
+ mDrawFinished = true;
+ if (mAttachedToWindow) {
+ mParent.requestTransparentRegion(SurfaceView.this);
+
+ notifyDrawFinished();
+ invalidate();
+ }
+ } else {
+ Log.e(TAG, System.identityHashCode(this) + "finished drawing"
+ + " but no pending report draw (extra call"
+ + " to draw completion runnable?)");
+ }
+ }
+
void notifyDrawFinished() {
ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot != null) {
@@ -729,12 +745,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
}
runOnUiThread(() -> {
- mDrawFinished = true;
- if (mAttachedToWindow) {
- mParent.requestTransparentRegion(SurfaceView.this);
- notifyDrawFinished();
- invalidate();
- }
+ performDrawFinished();
});
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 28ded55c54fa..a720aae0d1be 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -2330,7 +2330,7 @@ public final class ViewRootImpl implements ViewParent,
// Remember if we must report the next draw.
if ((relayoutResult & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0) {
- mReportNextDraw = true;
+ reportNextDraw();
}
boolean cancelDraw = mAttachInfo.mTreeObserver.dispatchOnPreDraw() || !isViewVisible;
@@ -2731,11 +2731,8 @@ public final class ViewRootImpl implements ViewParent,
/**
* A count of the number of calls to pendingDrawFinished we
* require to notify the WM drawing is complete.
- *
- * This starts at 1, for the ViewRootImpl surface itself.
- * Subsurfaces may debt the value with drawPending.
*/
- int mDrawsNeededToReport = 1;
+ int mDrawsNeededToReport = 0;
/**
* Delay notifying WM of draw finished until
@@ -2761,7 +2758,7 @@ public final class ViewRootImpl implements ViewParent,
private void reportDrawFinished() {
try {
- mDrawsNeededToReport = 1;
+ mDrawsNeededToReport = 0;
mWindowSession.finishDrawing(mWindow);
} catch (RemoteException e) {
// Have fun!
@@ -3772,13 +3769,12 @@ public final class ViewRootImpl implements ViewParent,
args.recycle();
if (msg.what == MSG_RESIZED_REPORT) {
- mReportNextDraw = true;
+ reportNextDraw();
}
if (mView != null && framesChanged) {
forceLayout(mView);
}
-
requestLayout();
}
break;
@@ -7343,6 +7339,14 @@ public final class ViewRootImpl implements ViewParent,
return false;
}
+
+ private void reportNextDraw() {
+ if (mReportNextDraw == false) {
+ drawPending();
+ }
+ mReportNextDraw = true;
+ }
+
/**
* Force the window to report its next draw.
* <p>
@@ -7352,7 +7356,7 @@ public final class ViewRootImpl implements ViewParent,
* @hide
*/
public void setReportNextDraw() {
- mReportNextDraw = true;
+ reportNextDraw();
invalidate();
}
diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java
index bf0e10f993ad..55aed529037d 100644
--- a/core/java/android/view/WindowManagerInternal.java
+++ b/core/java/android/view/WindowManagerInternal.java
@@ -225,6 +225,9 @@ public abstract class WindowManagerInternal {
*/
public abstract boolean isKeyguardLocked();
+ /** @return {@code true} if the keyguard is going away. */
+ public abstract boolean isKeyguardGoingAway();
+
/**
* Gets the frame of a window given its token.
*
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index a2aff931ccff..02ecc501ea39 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -258,6 +258,11 @@ public final class AutofillManager {
* @return The view, or {@code null} if not found
*/
@Nullable View findViewByAccessibilityIdTraversal(int viewId);
+
+ /**
+ * Runs the specified action on the UI thread.
+ */
+ void runOnUiThread(Runnable action);
}
/**
@@ -1233,6 +1238,15 @@ public final class AutofillManager {
return mService != null;
}
+ private void post(Runnable runnable) {
+ final AutofillClient client = getClientLocked();
+ if (client == null) {
+ if (sVerbose) Log.v(TAG, "ignoring post() because client is null");
+ return;
+ }
+ client.runOnUiThread(runnable);
+ }
+
/**
* View tracking information. Once all tracked views become invisible the session is finished.
*/
@@ -1516,8 +1530,7 @@ public final class AutofillManager {
public void setState(boolean enabled, boolean resetSession, boolean resetClient) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.setState(enabled, resetSession, resetClient));
+ afm.post(() -> afm.setState(enabled, resetSession, resetClient));
}
}
@@ -1525,8 +1538,7 @@ public final class AutofillManager {
public void autofill(int sessionId, List<AutofillId> ids, List<AutofillValue> values) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.autofill(sessionId, ids, values));
+ afm.post(() -> afm.autofill(sessionId, ids, values));
}
}
@@ -1535,8 +1547,7 @@ public final class AutofillManager {
Intent fillInIntent) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.authenticate(sessionId, authenticationId, intent, fillInIntent));
+ afm.post(() -> afm.authenticate(sessionId, authenticationId, intent, fillInIntent));
}
}
@@ -1545,9 +1556,8 @@ public final class AutofillManager {
Rect anchorBounds, IAutofillWindowPresenter presenter) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.requestShowFillUi(sessionId, id, width, height, anchorBounds,
- presenter));
+ afm.post(() -> afm.requestShowFillUi(sessionId, id, width, height, anchorBounds,
+ presenter));
}
}
@@ -1555,7 +1565,7 @@ public final class AutofillManager {
public void requestHideFillUi(int sessionId, AutofillId id) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(() -> afm.requestHideFillUi(id));
+ afm.post(() -> afm.requestHideFillUi(id));
}
}
@@ -1563,7 +1573,7 @@ public final class AutofillManager {
public void notifyNoFillUi(int sessionId, AutofillId id) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(() -> afm.notifyNoFillUi(sessionId, id));
+ afm.post(() -> afm.notifyNoFillUi(sessionId, id));
}
}
@@ -1571,7 +1581,7 @@ public final class AutofillManager {
public void startIntentSender(IntentSender intentSender) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(() -> {
+ afm.post(() -> {
try {
afm.mContext.startIntentSender(intentSender, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
@@ -1586,7 +1596,7 @@ public final class AutofillManager {
boolean saveOnAllViewsInvisible, AutofillId[] fillableIds) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(() ->
+ afm.post(() ->
afm.setTrackedViews(sessionId, ids, saveOnAllViewsInvisible, fillableIds)
);
}
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 78566dfc458e..04f7c76c8e74 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -129,7 +129,7 @@ interface IBatteryStats {
long getAwakeTimeBattery();
long getAwakeTimePlugged();
- void noteBleScanStarted(in WorkSource ws);
+ void noteBleScanStarted(in WorkSource ws, boolean isUnoptimized);
void noteBleScanStopped(in WorkSource ws);
void noteResetBleScan();
void noteBleScanResults(in WorkSource ws, int numNewResults);
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 31064ac73dff..3f7e6be161b8 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -116,7 +116,7 @@ public class BatteryStatsImpl extends BatteryStats {
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 158 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 159 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -862,21 +862,19 @@ public class BatteryStatsImpl extends BatteryStats {
final AtomicInteger mCount = new AtomicInteger();
final TimeBase mTimeBase;
int mLoadedCount;
- int mLastCount;
int mUnpluggedCount;
int mPluggedCount;
- Counter(TimeBase timeBase, Parcel in) {
+ public Counter(TimeBase timeBase, Parcel in) {
mTimeBase = timeBase;
mPluggedCount = in.readInt();
mCount.set(mPluggedCount);
mLoadedCount = in.readInt();
- mLastCount = 0;
mUnpluggedCount = in.readInt();
timeBase.add(this);
}
- Counter(TimeBase timeBase) {
+ public Counter(TimeBase timeBase) {
mTimeBase = timeBase;
timeBase.add(this);
}
@@ -887,11 +885,12 @@ public class BatteryStatsImpl extends BatteryStats {
out.writeInt(mUnpluggedCount);
}
+ @Override
public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
mUnpluggedCount = mPluggedCount;
- mCount.set(mPluggedCount);
}
+ @Override
public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
mPluggedCount = mCount.get();
}
@@ -926,17 +925,22 @@ public class BatteryStatsImpl extends BatteryStats {
public void logState(Printer pw, String prefix) {
pw.println(prefix + "mCount=" + mCount.get()
- + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
+ + " mLoadedCount=" + mLoadedCount
+ " mUnpluggedCount=" + mUnpluggedCount
+ " mPluggedCount=" + mPluggedCount);
}
- void stepAtomic() {
- mCount.incrementAndGet();
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public void stepAtomic() {
+ if (mTimeBase.isRunning()) {
+ mCount.incrementAndGet();
+ }
}
void addAtomic(int delta) {
- mCount.addAndGet(delta);
+ if (mTimeBase.isRunning()) {
+ mCount.addAndGet(delta);
+ }
}
/**
@@ -944,7 +948,7 @@ public class BatteryStatsImpl extends BatteryStats {
*/
void reset(boolean detachIfReset) {
mCount.set(0);
- mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
+ mLoadedCount = mPluggedCount = mUnpluggedCount = 0;
if (detachIfReset) {
detach();
}
@@ -954,15 +958,16 @@ public class BatteryStatsImpl extends BatteryStats {
mTimeBase.remove(this);
}
- void writeSummaryFromParcelLocked(Parcel out) {
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public void writeSummaryFromParcelLocked(Parcel out) {
int count = mCount.get();
out.writeInt(count);
}
- void readSummaryFromParcelLocked(Parcel in) {
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public void readSummaryFromParcelLocked(Parcel in) {
mLoadedCount = in.readInt();
mCount.set(mLoadedCount);
- mLastCount = 0;
mUnpluggedCount = mPluggedCount = mLoadedCount;
}
}
@@ -998,7 +1003,6 @@ public class BatteryStatsImpl extends BatteryStats {
@Override
public void onTimeStarted(long elapsedRealTime, long baseUptime, long baseRealtime) {
mUnpluggedCounts = copyArray(mPluggedCounts, mUnpluggedCounts);
- mCounts = copyArray(mPluggedCounts, mCounts);
}
@Override
@@ -1029,11 +1033,13 @@ public class BatteryStatsImpl extends BatteryStats {
if (counts == null) {
return;
}
- if (mCounts == null) {
- mCounts = new long[counts.length];
- }
- for (int i = 0; i < counts.length; ++i) {
- mCounts[i] += counts[i];
+ if (mTimeBase.isRunning()) {
+ if (mCounts == null) {
+ mCounts = new long[counts.length];
+ }
+ for (int i = 0; i < counts.length; ++i) {
+ mCounts[i] += counts[i];
+ }
}
}
@@ -1104,13 +1110,13 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
- private void fillArray(long[] a, long val) {
+ private static void fillArray(long[] a, long val) {
if (a != null) {
Arrays.fill(a, val);
}
}
- private void subtract(@NonNull long[] val, long[] toSubtract) {
+ private static void subtract(@NonNull long[] val, long[] toSubtract) {
if (toSubtract == null) {
return;
}
@@ -1119,7 +1125,7 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
- private long[] copyArray(long[] src, long[] dest) {
+ private static long[] copyArray(long[] src, long[] dest) {
if (src == null) {
return null;
} else {
@@ -1162,7 +1168,6 @@ public class BatteryStatsImpl extends BatteryStats {
@Override
public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
mUnpluggedCount = mPluggedCount;
- mCount = mPluggedCount;
}
@Override
@@ -1189,7 +1194,9 @@ public class BatteryStatsImpl extends BatteryStats {
}
void addCountLocked(long count) {
- mCount += count;
+ if (mTimeBase.isRunning()) {
+ mCount += count;
+ }
}
/**
@@ -4821,7 +4828,7 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
- private void noteBluetoothScanStartedLocked(int uid) {
+ private void noteBluetoothScanStartedLocked(int uid, boolean isUnoptimized) {
uid = mapUid(uid);
final long elapsedRealtime = mClocks.elapsedRealtime();
final long uptime = mClocks.uptimeMillis();
@@ -4833,13 +4840,13 @@ public class BatteryStatsImpl extends BatteryStats {
mBluetoothScanTimer.startRunningLocked(elapsedRealtime);
}
mBluetoothScanNesting++;
- getUidStatsLocked(uid).noteBluetoothScanStartedLocked(elapsedRealtime);
+ getUidStatsLocked(uid).noteBluetoothScanStartedLocked(elapsedRealtime, isUnoptimized);
}
- public void noteBluetoothScanStartedFromSourceLocked(WorkSource ws) {
+ public void noteBluetoothScanStartedFromSourceLocked(WorkSource ws, boolean isUnoptimized) {
final int N = ws.size();
for (int i = 0; i < N; i++) {
- noteBluetoothScanStartedLocked(ws.get(i));
+ noteBluetoothScanStartedLocked(ws.get(i), isUnoptimized);
}
}
@@ -5611,7 +5618,9 @@ public class BatteryStatsImpl extends BatteryStats {
/** Total time spent by the uid holding any partial wakelocks. */
DualTimer mAggregatedPartialWakelockTimer;
DualTimer mBluetoothScanTimer;
+ DualTimer mBluetoothUnoptimizedScanTimer;
Counter mBluetoothScanResultCounter;
+ Counter mBluetoothScanResultBgCounter;
int mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT;
StopwatchTimer[] mProcessStateTimer;
@@ -6096,20 +6105,41 @@ public class BatteryStatsImpl extends BatteryStats {
return mBluetoothScanTimer;
}
- public void noteBluetoothScanStartedLocked(long elapsedRealtimeMs) {
+ public DualTimer createBluetoothUnoptimizedScanTimerLocked() {
+ if (mBluetoothUnoptimizedScanTimer == null) {
+ mBluetoothUnoptimizedScanTimer = new DualTimer(mBsi.mClocks, Uid.this,
+ BLUETOOTH_UNOPTIMIZED_SCAN_ON, null,
+ mBsi.mOnBatteryTimeBase, mOnBatteryBackgroundTimeBase);
+ }
+ return mBluetoothUnoptimizedScanTimer;
+ }
+
+ public void noteBluetoothScanStartedLocked(long elapsedRealtimeMs, boolean isUnoptimized) {
createBluetoothScanTimerLocked().startRunningLocked(elapsedRealtimeMs);
+ if (isUnoptimized) {
+ createBluetoothUnoptimizedScanTimerLocked().startRunningLocked(elapsedRealtimeMs);
+ }
}
public void noteBluetoothScanStoppedLocked(long elapsedRealtimeMs) {
if (mBluetoothScanTimer != null) {
mBluetoothScanTimer.stopRunningLocked(elapsedRealtimeMs);
}
+ // In the ble code, a scan cannot change types and nested starts are not possible.
+ // So if an unoptimizedScan is running, it is now being stopped.
+ if (mBluetoothUnoptimizedScanTimer != null
+ && mBluetoothUnoptimizedScanTimer.isRunningLocked()) {
+ mBluetoothUnoptimizedScanTimer.stopRunningLocked(elapsedRealtimeMs);
+ }
}
public void noteResetBluetoothScanLocked(long elapsedRealtimeMs) {
if (mBluetoothScanTimer != null) {
mBluetoothScanTimer.stopAllRunningLocked(elapsedRealtimeMs);
}
+ if (mBluetoothUnoptimizedScanTimer != null) {
+ mBluetoothUnoptimizedScanTimer.stopAllRunningLocked(elapsedRealtimeMs);
+ }
}
public Counter createBluetoothScanResultCounterLocked() {
@@ -6119,8 +6149,17 @@ public class BatteryStatsImpl extends BatteryStats {
return mBluetoothScanResultCounter;
}
+ public Counter createBluetoothScanResultBgCounterLocked() {
+ if (mBluetoothScanResultBgCounter == null) {
+ mBluetoothScanResultBgCounter = new Counter(mOnBatteryBackgroundTimeBase);
+ }
+ return mBluetoothScanResultBgCounter;
+ }
+
public void noteBluetoothScanResultsLocked(int numNewResults) {
createBluetoothScanResultCounterLocked().addAtomic(numNewResults);
+ // Uses background timebase, so the count will only be incremented if uid in background.
+ createBluetoothScanResultBgCounterLocked().addAtomic(numNewResults);
}
@Override
@@ -6277,10 +6316,28 @@ public class BatteryStatsImpl extends BatteryStats {
}
@Override
+ public Timer getBluetoothUnoptimizedScanTimer() {
+ return mBluetoothUnoptimizedScanTimer;
+ }
+
+ @Override
+ public Timer getBluetoothUnoptimizedScanBackgroundTimer() {
+ if (mBluetoothUnoptimizedScanTimer == null) {
+ return null;
+ }
+ return mBluetoothUnoptimizedScanTimer.getSubTimer();
+ }
+
+ @Override
public Counter getBluetoothScanResultCounter() {
return mBluetoothScanResultCounter;
}
+ @Override
+ public Counter getBluetoothScanResultBgCounter() {
+ return mBluetoothScanResultBgCounter;
+ }
+
void makeProcessState(int i, Parcel in) {
if (i < 0 || i >= NUM_PROCESS_STATE) return;
@@ -6531,9 +6588,13 @@ public class BatteryStatsImpl extends BatteryStats {
active |= !resetTimerIfNotNull(mForegroundActivityTimer, false);
active |= !resetTimerIfNotNull(mAggregatedPartialWakelockTimer, false);
active |= !resetTimerIfNotNull(mBluetoothScanTimer, false);
+ active |= !resetTimerIfNotNull(mBluetoothUnoptimizedScanTimer, false);
if (mBluetoothScanResultCounter != null) {
mBluetoothScanResultCounter.reset(false);
}
+ if (mBluetoothScanResultBgCounter != null) {
+ mBluetoothScanResultBgCounter.reset(false);
+ }
if (mProcessStateTimer != null) {
for (int i = 0; i < NUM_PROCESS_STATE; i++) {
@@ -6731,10 +6792,18 @@ public class BatteryStatsImpl extends BatteryStats {
mBluetoothScanTimer.detach();
mBluetoothScanTimer = null;
}
+ if (mBluetoothUnoptimizedScanTimer != null) {
+ mBluetoothUnoptimizedScanTimer.detach();
+ mBluetoothUnoptimizedScanTimer = null;
+ }
if (mBluetoothScanResultCounter != null) {
mBluetoothScanResultCounter.detach();
mBluetoothScanResultCounter = null;
}
+ if (mBluetoothScanResultBgCounter != null) {
+ mBluetoothScanResultBgCounter.detach();
+ mBluetoothScanResultBgCounter = null;
+ }
if (mUserActivityCounters != null) {
for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
mUserActivityCounters[i].detach();
@@ -6919,12 +6988,24 @@ public class BatteryStatsImpl extends BatteryStats {
} else {
out.writeInt(0);
}
+ if (mBluetoothUnoptimizedScanTimer != null) {
+ out.writeInt(1);
+ mBluetoothUnoptimizedScanTimer.writeToParcel(out, elapsedRealtimeUs);
+ } else {
+ out.writeInt(0);
+ }
if (mBluetoothScanResultCounter != null) {
out.writeInt(1);
mBluetoothScanResultCounter.writeToParcel(out);
} else {
out.writeInt(0);
}
+ if (mBluetoothScanResultBgCounter != null) {
+ out.writeInt(1);
+ mBluetoothScanResultBgCounter.writeToParcel(out);
+ } else {
+ out.writeInt(0);
+ }
for (int i = 0; i < NUM_PROCESS_STATE; i++) {
if (mProcessStateTimer[i] != null) {
out.writeInt(1);
@@ -7033,7 +7114,8 @@ public class BatteryStatsImpl extends BatteryStats {
for (int j = 0; j < numWakelocks; j++) {
String wakelockName = in.readString();
Uid.Wakelock wakelock = new Wakelock(mBsi, this);
- wakelock.readFromParcelLocked(timeBase, screenOffTimeBase, in);
+ wakelock.readFromParcelLocked(
+ timeBase, screenOffTimeBase, mOnBatteryScreenOffBackgroundTimeBase, in);
mWakelockStats.add(wakelockName, wakelock);
}
@@ -7168,10 +7250,22 @@ public class BatteryStatsImpl extends BatteryStats {
mBluetoothScanTimer = null;
}
if (in.readInt() != 0) {
+ mBluetoothUnoptimizedScanTimer = new DualTimer(mBsi.mClocks, Uid.this,
+ BLUETOOTH_UNOPTIMIZED_SCAN_ON, null,
+ mBsi.mOnBatteryTimeBase, mOnBatteryBackgroundTimeBase, in);
+ } else {
+ mBluetoothUnoptimizedScanTimer = null;
+ }
+ if (in.readInt() != 0) {
mBluetoothScanResultCounter = new Counter(mBsi.mOnBatteryTimeBase, in);
} else {
mBluetoothScanResultCounter = null;
}
+ if (in.readInt() != 0) {
+ mBluetoothScanResultBgCounter = new Counter(mOnBatteryBackgroundTimeBase, in);
+ } else {
+ mBluetoothScanResultBgCounter = null;
+ }
mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT;
for (int i = 0; i < NUM_PROCESS_STATE; i++) {
if (in.readInt() != 0) {
@@ -7298,8 +7392,9 @@ public class BatteryStatsImpl extends BatteryStats {
/**
* How long (in ms) this uid has been keeping the device partially awake.
+ * Tracks both the total time and the time while the app was in the background.
*/
- DurationTimer mTimerPartial;
+ DualTimer mTimerPartial;
/**
* How long (in ms) this uid has been keeping the device fully awake.
@@ -7344,13 +7439,13 @@ public class BatteryStatsImpl extends BatteryStats {
* @param in the Parcel to be read from.
* return a new Timer, or null.
*/
- private DurationTimer readDurationTimerFromParcel(int type,
- ArrayList<StopwatchTimer> pool, TimeBase timeBase, Parcel in) {
+ private DualTimer readDualTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
+ TimeBase timeBase, TimeBase bgTimeBase, Parcel in) {
if (in.readInt() == 0) {
return null;
}
- return new DurationTimer(mBsi.mClocks, mUid, type, pool, timeBase, in);
+ return new DualTimer(mBsi.mClocks, mUid, type, pool, timeBase, bgTimeBase, in);
}
boolean reset() {
@@ -7388,9 +7483,10 @@ public class BatteryStatsImpl extends BatteryStats {
return !wlactive;
}
- void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) {
- mTimerPartial = readDurationTimerFromParcel(WAKE_TYPE_PARTIAL,
- mBsi.mPartialTimers, screenOffTimeBase, in);
+ void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase,
+ TimeBase screenOffBgTimeBase, Parcel in) {
+ mTimerPartial = readDualTimerFromParcel(WAKE_TYPE_PARTIAL,
+ mBsi.mPartialTimers, screenOffTimeBase, screenOffBgTimeBase, in);
mTimerFull = readStopwatchTimerFromParcel(WAKE_TYPE_FULL,
mBsi.mFullTimers, timeBase, in);
mTimerWindow = readStopwatchTimerFromParcel(WAKE_TYPE_WINDOW,
@@ -7416,49 +7512,6 @@ public class BatteryStatsImpl extends BatteryStats {
default: throw new IllegalArgumentException("type = " + type);
}
}
-
- public StopwatchTimer getStopwatchTimer(int type) {
- switch (type) {
- case WAKE_TYPE_PARTIAL: {
- DurationTimer t = mTimerPartial;
- if (t == null) {
- t = new DurationTimer(mBsi.mClocks, mUid, WAKE_TYPE_PARTIAL,
- mBsi.mPartialTimers, mBsi.mOnBatteryScreenOffTimeBase);
- mTimerPartial = t;
- }
- return t;
- }
- case WAKE_TYPE_FULL: {
- StopwatchTimer t = mTimerFull;
- if (t == null) {
- t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_FULL,
- mBsi.mFullTimers, mBsi.mOnBatteryTimeBase);
- mTimerFull = t;
- }
- return t;
- }
- case WAKE_TYPE_WINDOW: {
- StopwatchTimer t = mTimerWindow;
- if (t == null) {
- t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_WINDOW,
- mBsi.mWindowTimers, mBsi.mOnBatteryTimeBase);
- mTimerWindow = t;
- }
- return t;
- }
- case WAKE_TYPE_DRAW: {
- StopwatchTimer t = mTimerDraw;
- if (t == null) {
- t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_DRAW,
- mBsi.mDrawTimers, mBsi.mOnBatteryTimeBase);
- mTimerDraw = t;
- }
- return t;
- }
- default:
- throw new IllegalArgumentException("type=" + type);
- }
- }
}
public static class Sensor extends BatteryStats.Uid.Sensor {
@@ -8351,16 +8404,16 @@ public class BatteryStatsImpl extends BatteryStats {
Wakelock wl = new Wakelock(mBsi, this);
mWakelockStats.add(wlName, wl);
if (in.readInt() != 0) {
- wl.getStopwatchTimer(WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
+ getWakelockTimerLocked(wl, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
- wl.getStopwatchTimer(WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
+ getWakelockTimerLocked(wl, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
- wl.getStopwatchTimer(WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
+ getWakelockTimerLocked(wl, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
- wl.getStopwatchTimer(WAKE_TYPE_DRAW).readSummaryFromParcelLocked(in);
+ getWakelockTimerLocked(wl, WAKE_TYPE_DRAW).readSummaryFromParcelLocked(in);
}
}
@@ -8416,10 +8469,57 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
+ public StopwatchTimer getWakelockTimerLocked(Wakelock wl, int type) {
+ if (wl == null) {
+ return null;
+ }
+ switch (type) {
+ case WAKE_TYPE_PARTIAL: {
+ DualTimer t = wl.mTimerPartial;
+ if (t == null) {
+ t = new DualTimer(mBsi.mClocks, this, WAKE_TYPE_PARTIAL,
+ mBsi.mPartialTimers, mBsi.mOnBatteryScreenOffTimeBase,
+ mOnBatteryScreenOffBackgroundTimeBase);
+ wl.mTimerPartial = t;
+ }
+ return t;
+ }
+ case WAKE_TYPE_FULL: {
+ StopwatchTimer t = wl.mTimerFull;
+ if (t == null) {
+ t = new StopwatchTimer(mBsi.mClocks, this, WAKE_TYPE_FULL,
+ mBsi.mFullTimers, mBsi.mOnBatteryTimeBase);
+ wl.mTimerFull = t;
+ }
+ return t;
+ }
+ case WAKE_TYPE_WINDOW: {
+ StopwatchTimer t = wl.mTimerWindow;
+ if (t == null) {
+ t = new StopwatchTimer(mBsi.mClocks, this, WAKE_TYPE_WINDOW,
+ mBsi.mWindowTimers, mBsi.mOnBatteryTimeBase);
+ wl.mTimerWindow = t;
+ }
+ return t;
+ }
+ case WAKE_TYPE_DRAW: {
+ StopwatchTimer t = wl.mTimerDraw;
+ if (t == null) {
+ t = new StopwatchTimer(mBsi.mClocks, this, WAKE_TYPE_DRAW,
+ mBsi.mDrawTimers, mBsi.mOnBatteryTimeBase);
+ wl.mTimerDraw = t;
+ }
+ return t;
+ }
+ default:
+ throw new IllegalArgumentException("type=" + type);
+ }
+ }
+
public void noteStartWakeLocked(int pid, String name, int type, long elapsedRealtimeMs) {
Wakelock wl = mWakelockStats.startObject(name);
if (wl != null) {
- wl.getStopwatchTimer(type).startRunningLocked(elapsedRealtimeMs);
+ getWakelockTimerLocked(wl, type).startRunningLocked(elapsedRealtimeMs);
}
if (type == WAKE_TYPE_PARTIAL) {
createAggregatedPartialWakelockTimerLocked().startRunningLocked(elapsedRealtimeMs);
@@ -8435,7 +8535,7 @@ public class BatteryStatsImpl extends BatteryStats {
public void noteStopWakeLocked(int pid, String name, int type, long elapsedRealtimeMs) {
Wakelock wl = mWakelockStats.stopObject(name);
if (wl != null) {
- wl.getStopwatchTimer(type).stopRunningLocked(elapsedRealtimeMs);
+ getWakelockTimerLocked(wl, type).stopRunningLocked(elapsedRealtimeMs);
}
if (type == WAKE_TYPE_PARTIAL) {
if (mAggregatedPartialWakelockTimer != null) {
@@ -11380,8 +11480,14 @@ public class BatteryStatsImpl extends BatteryStats {
u.createBluetoothScanTimerLocked().readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
+ u.createBluetoothUnoptimizedScanTimerLocked().readSummaryFromParcelLocked(in);
+ }
+ if (in.readInt() != 0) {
u.createBluetoothScanResultCounterLocked().readSummaryFromParcelLocked(in);
}
+ if (in.readInt() != 0) {
+ u.createBluetoothScanResultBgCounterLocked().readSummaryFromParcelLocked(in);
+ }
u.mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT;
for (int i = 0; i < Uid.NUM_PROCESS_STATE; i++) {
if (in.readInt() != 0) {
@@ -11789,12 +11895,24 @@ public class BatteryStatsImpl extends BatteryStats {
} else {
out.writeInt(0);
}
+ if (u.mBluetoothUnoptimizedScanTimer != null) {
+ out.writeInt(1);
+ u.mBluetoothUnoptimizedScanTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
+ } else {
+ out.writeInt(0);
+ }
if (u.mBluetoothScanResultCounter != null) {
out.writeInt(1);
u.mBluetoothScanResultCounter.writeSummaryFromParcelLocked(out);
} else {
out.writeInt(0);
}
+ if (u.mBluetoothScanResultBgCounter != null) {
+ out.writeInt(1);
+ u.mBluetoothScanResultBgCounter.writeSummaryFromParcelLocked(out);
+ } else {
+ out.writeInt(0);
+ }
for (int i = 0; i < Uid.NUM_PROCESS_STATE; i++) {
if (u.mProcessStateTimer[i] != null) {
out.writeInt(1);
diff --git a/core/java/com/android/internal/util/DumpUtils.java b/core/java/com/android/internal/util/DumpUtils.java
index ce89501c970a..66b777e8e8e6 100644
--- a/core/java/com/android/internal/util/DumpUtils.java
+++ b/core/java/com/android/internal/util/DumpUtils.java
@@ -31,7 +31,7 @@ import java.io.StringWriter;
*/
public final class DumpUtils {
private static final String TAG = "DumpUtils";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private DumpUtils() {
}
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 369bb7f7b157..785fd2c4dd4f 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -16,7 +16,7 @@
#define ATRACE_TAG ATRACE_TAG_DALVIK
#define LOG_TAG "AndroidRuntime"
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 1
#include <android_runtime/AndroidRuntime.h>
#include <binder/IBinder.h>
@@ -661,7 +661,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
checkJni = true;
}
}
- ALOGD("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
+ ALOGV("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
if (checkJni) {
/* extended JNI checking */
addOption("-Xcheck:jni");
diff --git a/core/jni/android_hardware_Radio.cpp b/core/jni/android_hardware_Radio.cpp
index b6b1ac75f0e9..18cf8caa9672 100644
--- a/core/jni/android_hardware_Radio.cpp
+++ b/core/jni/android_hardware_Radio.cpp
@@ -15,7 +15,7 @@
** limitations under the License.
*/
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 1
#define LOG_TAG "Radio-JNI"
#include <utils/Log.h>
@@ -955,7 +955,7 @@ int register_android_hardware_Radio(JNIEnv *env)
int ret = RegisterMethodsOrDie(env, kRadioModuleClassPathName, gModuleMethods, NELEM(gModuleMethods));
- ALOGI("%s DONE", __FUNCTION__);
+ ALOGV("%s DONE", __FUNCTION__);
return ret;
}
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index 8b73daf47f0f..e212c432558c 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -310,7 +310,7 @@ message GlobalSettingsProto {
SettingProto lte_service_forced = 265;
SettingProto ephemeral_cookie_max_size_bytes = 266;
SettingProto enable_ephemeral_feature = 267;
- SettingProto uninstalled_ephemeral_app_cache_duration_millis = 268;
+ SettingProto installed_instant_app_min_cache_period = 268;
SettingProto allow_user_switching_when_system_user_locked = 269;
SettingProto boot_count = 270;
SettingProto safe_boot_disallowed = 271;
@@ -331,6 +331,10 @@ message GlobalSettingsProto {
SettingProto network_recommendations_package = 286;
SettingProto bluetooth_a2dp_supports_optional_codecs_prefix = 287;
SettingProto bluetooth_a2dp_optional_codecs_enabled_prefix = 288;
+ SettingProto installed_instant_app_max_cache_period = 289;
+ SettingProto uninstalled_instant_app_min_cache_period = 290;
+ SettingProto uninstalled_instant_app_max_cache_period = 291;
+ SettingProto unused_static_shared_lib_min_cache_period = 292;
}
message SecureSettingsProto {
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 3c42334be445..7e5a0816cba8 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -703,7 +703,7 @@
<string name="relationTypeFriend" msgid="7313106762483391262">"صديق"</string>
<string name="relationTypeManager" msgid="6365677861610137895">"مدير"</string>
<string name="relationTypeMother" msgid="4578571352962758304">"أم"</string>
- <string name="relationTypeParent" msgid="4755635567562925226">"الأبوان"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"الوالدان"</string>
<string name="relationTypePartner" msgid="7266490285120262781">"شريك"</string>
<string name="relationTypeReferredBy" msgid="101573059844135524">"جهة الإحالة"</string>
<string name="relationTypeRelative" msgid="1799819930085610271">"قريب"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 649cadd400d4..06e60202d231 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -28,15 +28,15 @@
<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="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dana"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> sati"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> sat"</string>
+ <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d i <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
+ <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d i <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
<string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> sati"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> sat <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> sat <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
+ <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h i <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
+ <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h i <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
<string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
+ <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min i <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
+ <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min i <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
<string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</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 c644866b7e7a..c5774cf3e1a7 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1116,7 +1116,7 @@
<string name="wifi_no_internet" msgid="8451173622563841546">"La Wi-Fi no té accés a Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca per veure les opcions"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Actualment en ús: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
- <string name="network_switch_metered_detail" msgid="5325661434777870353">"El dispositiu utilitza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> en cas que <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tingui accés a Internet. És possible que s\'apliquin càrrecs."</string>
+ <string name="network_switch_metered_detail" msgid="5325661434777870353">"El dispositiu utilitza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> en cas que <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tingui accés a Internet. És possible que s\'hi apliquin càrrecs."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Abans es feia servir la xarxa <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>; ara s\'utilitza <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
<string-array name="network_switch_type_name">
<item msgid="3979506840912951943">"dades mòbils"</item>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index e7f9a7f2cdf4..d2f8ecf1778c 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -291,7 +291,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"사진 및 동영상 촬영"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"전화"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"전화 걸기 및 관리"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"신체 센서"</string>
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"인체 감지 센서"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"생체 신호에 관한 센서 데이터에 액세스"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"창 콘텐츠 가져오기"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
@@ -381,7 +381,7 @@
<string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"앱에서 수신 및 발신 통화 데이터를 포함하여 태블릿의 통화 기록을 수정할 수 있도록 허용합니다. 이 경우 악성 앱이 통화 기록을 지우거나 수정할 수 있습니다."</string>
<string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"앱에서 수신 및 발신 통화 데이터를 포함하여 TV의 통화 기록을 수정할 수 있도록 허용합니다. 이 경우 악성 앱이 통화 기록을 삭제하거나 수정할 수도 있습니다."</string>
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"앱에서 수신 및 발신 통화 데이터를 포함하여 휴대전화의 통화 기록을 수정할 수 있도록 허용합니다. 이 경우 악성 앱이 통화 기록을 지우거나 수정할 수 있습니다."</string>
- <string name="permlab_bodySensors" msgid="4683341291818520277">"신체 센서(예: 심박수 모니터)에 액세스"</string>
+ <string name="permlab_bodySensors" msgid="4683341291818520277">"인체 감지 센서(예: 심박수 모니터)에 액세스"</string>
<string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"앱이 심박수와 같은 신체 상태를 확인하는 센서의 데이터에 접근하도록 허용합니다."</string>
<string name="permlab_readCalendar" msgid="6716116972752441641">"캘린더 일정 및 세부정보 읽기"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"이 앱은 태블릿에 저장된 모든 캘린더 일정을 읽고 캘린더 데이터를 공유하거나 저장할 수 있습니다."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 69fe42f642e7..0d5f04ac3b70 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -213,7 +213,7 @@
<string name="reboot_to_update_prepare" msgid="6305853831955310890">"Подготовка обновлений…"</string>
<string name="reboot_to_update_package" msgid="3871302324500927291">"Обработка обновлений…"</string>
<string name="reboot_to_update_reboot" msgid="6428441000951565185">"Перезагрузка…"</string>
- <string name="reboot_to_reset_title" msgid="4142355915340627490">"Сбросить все данные"</string>
+ <string name="reboot_to_reset_title" msgid="4142355915340627490">"Сброс к заводским настройкам"</string>
<string name="reboot_to_reset_message" msgid="2432077491101416345">"Перезагрузка…"</string>
<string name="shutdown_progress" msgid="2281079257329981203">"Выключение..."</string>
<string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Планшетный ПК будет отключен."</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 51d932d16560..eb9994aed9de 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -152,8 +152,8 @@
<string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> หลังผ่านไป <xliff:g id="TIME_DELAY">{2}</xliff:g> วินาที"</string>
<string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ไม่ได้โอนสาย"</string>
<string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ไม่ได้โอนสาย"</string>
- <string name="fcComplete" msgid="3118848230966886575">"รหัสคุณลักษณะเสร็จสมบูรณ์"</string>
- <string name="fcError" msgid="3327560126588500777">"พบปัญหาในการเชื่อมต่อหรือรหัสคุณลักษณะไม่ถูกต้อง"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"รหัสฟีเจอร์เสร็จสมบูรณ์"</string>
+ <string name="fcError" msgid="3327560126588500777">"พบปัญหาในการเชื่อมต่อหรือรหัสฟีเจอร์ไม่ถูกต้อง"</string>
<string name="httpErrorOk" msgid="1191919378083472204">"ตกลง"</string>
<string name="httpError" msgid="7956392511146698522">"เกิดข้อผิดพลาดของเครือข่าย"</string>
<string name="httpErrorLookup" msgid="4711687456111963163">"ไม่พบ URL"</string>
@@ -414,7 +414,7 @@
<string name="permlab_accessImsCallService" msgid="3574943847181793918">"เข้าถึงบริการโทร IMS"</string>
<string name="permdesc_accessImsCallService" msgid="8992884015198298775">"อนุญาตให้แอปใช้บริการ IMS เพื่อโทรออกโดยคุณไม่ต้องดำเนินการใดๆ เลย"</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"อ่านสถานะและข้อมูลระบุตัวตนของโทรศัพท์"</string>
- <string name="permdesc_readPhoneState" msgid="1639212771826125528">"อนุญาตให้แอปพลิเคชันเข้าถึงคุณลักษณะโทรศัพท์ของอุปกรณ์ การอนุญาตนี้ทำให้แอปพลิเคชันสามารถตรวจสอบหมายเลขโทรศัพท์และรหัสอุปกรณ์ ตรวจสอบว่ามีการโทรที่ทำงานอยู่หรือไม่ และตรวจสอบหมายเลขระยะไกลที่เชื่อมต่อด้วยการโทร"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"อนุญาตให้แอปพลิเคชันเข้าถึงฟีเจอร์โทรศัพท์ของอุปกรณ์ การอนุญาตนี้ทำให้แอปพลิเคชันสามารถตรวจสอบหมายเลขโทรศัพท์และรหัสอุปกรณ์ ตรวจสอบว่ามีการโทรที่ทำงานอยู่หรือไม่ และตรวจสอบหมายเลขระยะไกลที่เชื่อมต่อด้วยการโทร"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"กำหนดเส้นทางการโทรผ่านระบบ"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"อนุญาตให้แอปกำหนดเส้นทางการโทรของแอปผ่านระบบเพื่อปรับปรุงประสบการณ์ในการโทร"</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"อ่านหมายเลขโทรศัพท์"</string>
@@ -586,8 +586,8 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ข้อมูลของแอปพลิเคชันที่จัดเก็บต้องมีการเข้ารหัส"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"ปิดใช้งานกล้องถ่ายรูป"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"ป้องกันการใช้กล้องถ่ายรูปของอุปกรณ์ทั้งหมด"</string>
- <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"ปิดคุณลักษณะล็อกหน้าจอบางอย่าง"</string>
- <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"ป้องกันการใช้คุณลักษณะบางอย่างของการล็อกหน้าจอ"</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"ปิดฟีเจอร์ล็อกหน้าจอบางอย่าง"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"ป้องกันการใช้ฟีเจอร์บางอย่างของการล็อกหน้าจอ"</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"บ้าน"</item>
<item msgid="869923650527136615">"มือถือ"</item>
@@ -722,7 +722,7 @@
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ถูกต้อง!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"ลองอีกครั้ง"</string>
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"ลองอีกครั้ง"</string>
- <string name="lockscreen_storage_locked" msgid="9167551160010625200">"ปลดล็อกคุณลักษณะและข้อมูลทั้งหมด"</string>
+ <string name="lockscreen_storage_locked" msgid="9167551160010625200">"ปลดล็อกฟีเจอร์และข้อมูลทั้งหมด"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"มีความพยายามที่จะใช้ Face Unlock เกินขีดจำกัด"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ไม่มีซิมการ์ด"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ไม่มีซิมการ์ดในแท็บเล็ต"</string>
@@ -842,7 +842,7 @@
<string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"อนุญาตให้แอปแก้ไขประวัติของเบราว์เซอร์หรือบุ๊กมาร์กที่เก็บไว้ในทีวี ซึ่งอาจอนุญาตให้แอปลบหรือแก้ไขข้อมูลเบราว์เซอร์ หมายเหตุ: สิทธิ์นี้ไม่สามารถใช้ได้กับเบราว์เซอร์ของบุคคลที่สามหรือแอปพลิเคชันอื่นที่สามารถท่องเว็บได้"</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"อนุญาตให้แอปพลิเคชันเปลี่ยนแปลงประวัติหรือบุ๊กมาร์กของเบราว์เซอร์ที่จัดเก็บไว้ในโทรศัพท์ ซึ่งทำให้แอปพลิเคชันสามารถลบหรือเปลี่ยนข้อมูลเบราว์เซอร์ได้ หมายเหตุ: การอนุญาตนี้อาจไม่สามารถใช้งานได้กับเบราว์เซอร์ของบุคคลที่สามหรือแอปพลิเคชันอื่นๆ ที่มีความสามารถในการเรียกดูบนเว็บ"</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"ตั้งปลุก"</string>
- <string name="permdesc_setAlarm" msgid="316392039157473848">"อนุญาตให้แอปพลิเคชันตั้งเวลาปลุกในแอปพลิเคชันนาฬิกาปลุกที่ติดตั้ง แอปพลิเคชันนาฬิกาปลุกบางรายการอาจไม่ใช้คุณลักษณะนี้"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"อนุญาตให้แอปพลิเคชันตั้งเวลาปลุกในแอปพลิเคชันนาฬิกาปลุกที่ติดตั้ง แอปพลิเคชันนาฬิกาปลุกบางรายการอาจไม่ใช้ฟีเจอร์นี้"</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"เพิ่มข้อวามเสียง"</string>
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"อนุญาตให้แอปพลิเคชันเพิ่มข้อความลงในกล่องข้อความเสียงของคุณ"</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"แก้ไขการอนุญาตเกี่ยวกับการระบุตำแหน่งทางภูมิศาสตร์ของเบราว์เซอร์"</string>
@@ -1206,7 +1206,7 @@
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> แสดงทับแอปอื่นๆ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> กำลังแสดงทับแอปอื่นๆ"</string>
- <string name="alert_windows_notification_message" msgid="8917232109522912560">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้คุณลักษณะนี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดคุณลักษณะ"</string>
+ <string name="alert_windows_notification_message" msgid="8917232109522912560">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ปิด"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"กำลังเตรียม <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"กำลังตรวจหาข้อผิดพลาด"</string>
@@ -1480,13 +1480,13 @@
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ลบ"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"นี่เป็นการเพิ่มระดับเสียงเกินระดับที่แนะนำ\n\nการฟังเสียงดังเป็นเวลานานอาจทำให้การได้ยินของคุณบกพร่องได้"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"ใช้ทางลัดการเข้าถึงพิเศษไหม"</string>
- <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"เมื่อทางลัดเปิดอยู่ การกดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มเป็นเวลา 3 วินาทีจะเริ่มคุณลักษณะการเข้าถึงพิเศษ\n\n คุณลักษณะการเข้าถึงพิเศษปัจจุบัน:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n คุณสามารถเปลี่ยนคุณลักษณะในการตั้งค่า &gt; การเข้าถึงพิเศษ"</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"เมื่อทางลัดเปิดอยู่ การกดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มเป็นเวลา 3 วินาทีจะเริ่มฟีเจอร์การเข้าถึงพิเศษ\n\n ฟีเจอร์การเข้าถึงพิเศษปัจจุบัน:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n คุณสามารถเปลี่ยนฟีเจอร์ในการตั้งค่า &gt; การเข้าถึงพิเศษ"</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"ปิดทางลัด"</string>
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"ใช้ทางลัด"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ทางลัดการเข้าถึงเปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ทางลัดการเข้าถึงปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string>
- <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"เลือกคุณลักษณะที่จะใช้เมื่อคุณแตะปุ่ม \"การเข้าถึงพิเศษ\":"</string>
- <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"หากต้องการเปลี่ยนคุณลักษณะ ให้แตะปุ่ม \"การเข้าถึงพิเศษ\" ค้างไว้"</string>
+ <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"เลือกฟีเจอร์ที่จะใช้เมื่อคุณแตะปุ่ม \"การเข้าถึงพิเศษ\":"</string>
+ <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"หากต้องการเปลี่ยนฟีเจอร์ ให้แตะปุ่ม \"การเข้าถึงพิเศษ\" ค้างไว้"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"การขยาย"</string>
<string name="user_switched" msgid="3768006783166984410">"ผู้ใช้ปัจจุบัน <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="2871009331809089783">"กำลังเปลี่ยนเป็น <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -1708,7 +1708,7 @@
<string name="region_picker_section_all" msgid="8966316787153001779">"ภูมิภาคทั้งหมด"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ค้นหา"</string>
<string name="work_mode_off_title" msgid="2615362773958585967">"เปิดโหมดงานไหม"</string>
- <string name="work_mode_off_message" msgid="2961559609199223594">"การดำเนินการนี้จะเปิดโปรไฟล์งานของคุณ รวมถึงแอป การซิงค์ในพื้นหลัง และคุณลักษณะที่เกี่ยวข้อง"</string>
+ <string name="work_mode_off_message" msgid="2961559609199223594">"การดำเนินการนี้จะเปิดโปรไฟล์งานของคุณ รวมถึงแอป การซิงค์ในพื้นหลัง และฟีเจอร์ที่เกี่ยวข้อง"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"เปิด"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"คุณมีข้อความใหม่"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"เปิดแอป SMS เพื่อดู"</string>
diff --git a/core/tests/coretests/src/android/content/pm/AppCacheTest.java b/core/tests/coretests/src/android/content/pm/AppCacheTest.java
index 15dbddff54df..59aa50ae1445 100644
--- a/core/tests/coretests/src/android/content/pm/AppCacheTest.java
+++ b/core/tests/coretests/src/android/content/pm/AppCacheTest.java
@@ -492,7 +492,7 @@ public class AppCacheTest extends AndroidTestCase {
PackageDataObserver observer = new PackageDataObserver();
//wait on observer
synchronized(observer) {
- getPm().freeStorageAndNotify(null, idealStorageSize, observer);
+ getPm().freeStorageAndNotify(null, idealStorageSize, 0, observer);
long waitTime = 0;
while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
observer.wait(WAIT_TIME_INCR);
@@ -517,7 +517,7 @@ public class AppCacheTest extends AndroidTestCase {
try {
// Spin lock waiting for call back
synchronized(r) {
- getPm().freeStorage(null, idealStorageSize, pi.getIntentSender());
+ getPm().freeStorage(null, idealStorageSize, 0, pi.getIntentSender());
long waitTime = 0;
while(!r.isDone() && (waitTime < MAX_WAIT_TIME)) {
r.wait(WAIT_TIME_INCR);
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 54d5285e3224..d875ed4e5ec5 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -334,7 +334,11 @@ public class SettingsBackupTest {
Settings.Global.TRUSTED_SOUND,
Settings.Global.TZINFO_UPDATE_CONTENT_URL,
Settings.Global.TZINFO_UPDATE_METADATA_URL,
- Settings.Global.UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS,
+ Settings.Global.INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ Settings.Global.INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ Settings.Global.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ Settings.Global.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ Settings.Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD,
Settings.Global.UNLOCK_SOUND,
Settings.Global.USE_GOOGLE_MAIL,
Settings.Global.VT_IMS_ENABLED,
diff --git a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
index fd57baa217b0..115af5e0ea5d 100644
--- a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
@@ -180,7 +180,9 @@ public class SparseMappingTableTest extends TestCase {
try {
table.getValue(key);
- throw new Exception("Exception not thrown after mismatched reset calls.");
+ // Turn off this assertion because the check in SparseMappingTable.assertConsistency
+ // is also turned off.
+ //throw new Exception("Exception not thrown after mismatched reset calls.");
} catch (RuntimeException ex) {
// Good
}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
index 9aabdbb2c8f0..c539f789ff60 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
@@ -205,9 +205,9 @@ public class BatteryStatsBackgroundStatsTest extends TestCase {
// App in foreground
bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
- // Start timer
+ // Start timer (optimized)
curr = 1000 * (clocks.realtime = clocks.uptime = 202);
- bi.noteBluetoothScanStartedFromSourceLocked(ws);
+ bi.noteBluetoothScanStartedFromSourceLocked(ws, false);
// Move to background
curr = 1000 * (clocks.realtime = clocks.uptime = 254);
@@ -221,21 +221,44 @@ public class BatteryStatsBackgroundStatsTest extends TestCase {
curr = 1000 * (clocks.realtime = clocks.uptime = 409);
bi.noteBluetoothScanStoppedFromSourceLocked(ws);
+ // Start timer (unoptimized)
+ curr = 1000 * (clocks.realtime = clocks.uptime = 1000);
+ bi.noteBluetoothScanStartedFromSourceLocked(ws, true);
+
+ // On battery
+ curr = 1000 * (clocks.realtime = clocks.uptime = 2001);
+ bi.updateTimeBasesLocked(true, false, curr, curr); // on battery
+
+ // Move to foreground
+ curr = 1000 * (clocks.realtime = clocks.uptime = 3004);
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP);
+
+ // Stop timer
+ curr = 1000 * (clocks.realtime = clocks.uptime = 4008);
+ bi.noteBluetoothScanStoppedFromSourceLocked(ws);
+
// Test
- curr = 1000 * (clocks.realtime = clocks.uptime = 657);
+ curr = 1000 * (clocks.realtime = clocks.uptime = 5000);
BatteryStats.Timer timer = bi.getUidStats().get(UID).getBluetoothScanTimer();
BatteryStats.Timer bgTimer = bi.getUidStats().get(UID).getBluetoothScanBackgroundTimer();
+ BatteryStats.Timer badTimer = bi.getUidStats().get(UID).getBluetoothUnoptimizedScanTimer();
+ BatteryStats.Timer badBgTimer = bi.getUidStats().get(UID)
+ .getBluetoothUnoptimizedScanBackgroundTimer();
long time = timer.getTotalTimeLocked(curr, STATS_SINCE_CHARGED);
int count = timer.getCountLocked(STATS_SINCE_CHARGED);
int bgCount = bgTimer.getCountLocked(STATS_SINCE_CHARGED);
long actualTime = timer.getTotalDurationMsLocked(clocks.realtime) * 1000;
long bgTime = bgTimer.getTotalDurationMsLocked(clocks.realtime) * 1000;
- assertEquals((305 - 202) * 1000, time);
- assertEquals(1, count);
- assertEquals(0, bgCount);
- assertEquals((305 - 202) * 1000, actualTime);
- assertEquals((305 - 254) * 1000, bgTime);
+ long badTime = badTimer.getTotalDurationMsLocked(clocks.realtime) * 1000;
+ long badBgTime = badBgTimer.getTotalDurationMsLocked(clocks.realtime) * 1000;
+ assertEquals((305 - 202 + 4008 - 2001) * 1000, time);
+ assertEquals(1, count); // second scan starts off-battery
+ assertEquals(0, bgCount); // first scan starts in fg, second starts off-battery
+ assertEquals((305 - 202 + 4008 - 2001) * 1000, actualTime);
+ assertEquals((305 - 254 + 3004 - 2001) * 1000, bgTime);
+ assertEquals((4008 - 2001) * 1000, badTime);
+ assertEquals((3004 - 2001) * 1000, badBgTime);
}
@SmallTest
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java
new file mode 100644
index 000000000000..08f8dd146516
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java
@@ -0,0 +1,148 @@
+/*
+ * 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.internal.os;
+
+import android.os.BatteryStats;
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+
+import junit.framework.TestCase;
+
+/**
+ * Test BatteryStatsImpl.Counter.
+ */
+public class BatteryStatsCounterTest extends TestCase {
+
+ @SmallTest
+ public void testCounter() throws Exception {
+ final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
+ final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase();
+ timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime());
+
+ final BatteryStatsImpl.Counter counter = new BatteryStatsImpl.Counter(timeBase);
+
+ // timeBase off (i.e. plugged in)
+ timeBase.setRunning(false, 1, 1);
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ assertEquals(0, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(0, counter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(0, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 2, 2);
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase off (i.e. plugged in)
+ timeBase.setRunning(false, 3, 3);
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 4, 4);
+ counter.stepAtomic();
+ counter.stepAtomic();
+ assertEquals(6, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(6, counter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(2, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+ }
+
+
+ @SmallTest
+ public void testParceling() throws Exception {
+ final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
+ final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase();
+ timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime());
+
+ final BatteryStatsImpl.Counter origCounter = new BatteryStatsImpl.Counter(timeBase);
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 1, 1);
+ origCounter.stepAtomic(); origCounter.stepAtomic(); origCounter.stepAtomic(); // three times
+ assertEquals(3, origCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(3, origCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(3, origCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // Test summary parcelling (from origCounter)
+ final Parcel summaryParcel = Parcel.obtain();
+ origCounter.writeSummaryFromParcelLocked(summaryParcel);
+ summaryParcel.setDataPosition(0);
+ final BatteryStatsImpl.Counter summaryCounter = new BatteryStatsImpl.Counter(timeBase);
+ summaryCounter.stepAtomic(); // occurs before reading the summary, so must not count later
+ summaryCounter.readSummaryFromParcelLocked(summaryParcel);
+
+ // timeBase still on (i.e. unplugged)
+ summaryCounter.stepAtomic(); // once
+ assertEquals(4, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase off (i.e. plugged in)
+ timeBase.setRunning(false, 3, 3);
+ summaryCounter.stepAtomic(); summaryCounter.stepAtomic(); // twice
+ assertEquals(4, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 4, 4);
+ summaryCounter.stepAtomic(); summaryCounter.stepAtomic(); // twice
+ assertEquals(6, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(3, summaryCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(2, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+
+ // Test full parcelling (from summaryCounter)
+ final Parcel fullParcel = Parcel.obtain();
+ summaryCounter.writeToParcel(fullParcel);
+ fullParcel.setDataPosition(0);
+ final BatteryStatsImpl.Counter fullParcelCounter
+ = new BatteryStatsImpl.Counter(timeBase, fullParcel);
+
+ // timeBase still on (i.e. unplugged)
+ fullParcelCounter.stepAtomic(); // once
+ assertEquals(7, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(4, fullParcelCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(3, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase off (i.e. plugged in)
+ timeBase.setRunning(false, 5, 5);
+ fullParcelCounter.stepAtomic(); fullParcelCounter.stepAtomic(); // twice
+ assertEquals(7, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(4, fullParcelCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(3, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 6, 6);
+ fullParcelCounter.stepAtomic(); fullParcelCounter.stepAtomic(); // twice
+ assertEquals(9, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(6, fullParcelCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(2, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
index 06ca18d072e7..4e8ab316e1c9 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
@@ -37,12 +37,28 @@ public class BatteryStatsNoteTest extends TestCase{
public void testNoteBluetoothScanResultLocked() throws Exception {
MockBatteryStatsImpl bi = new MockBatteryStatsImpl(new MockClocks());
bi.updateTimeBasesLocked(true, true, 0, 0);
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP);
bi.noteBluetoothScanResultsFromSourceLocked(WS, 1);
bi.noteBluetoothScanResultsFromSourceLocked(WS, 100);
assertEquals(101,
bi.getUidStats().get(UID).getBluetoothScanResultCounter()
.getCountLocked(STATS_SINCE_CHARGED));
+ // TODO: remove next line when Counter misreporting values when plugged-in bug is fixed.
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+ BatteryStats.Counter bgCntr = bi.getUidStats().get(UID).getBluetoothScanResultBgCounter();
+ if (bgCntr != null) {
+ assertEquals(0, bgCntr.getCountLocked(STATS_SINCE_CHARGED));
+ }
+
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+ bi.noteBluetoothScanResultsFromSourceLocked(WS, 17);
+ assertEquals(101 + 17,
+ bi.getUidStats().get(UID).getBluetoothScanResultCounter()
+ .getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(17,
+ bi.getUidStats().get(UID).getBluetoothScanResultBgCounter()
+ .getCountLocked(STATS_SINCE_CHARGED));
}
/** Test BatteryStatsImpl.Uid.noteStartWakeLocked. */
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
index 3a16fcff38a2..1412d3e7df59 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -5,17 +5,18 @@ import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
+ BatteryStatsBackgroundStatsTest.class,
+ BatteryStatsCounterTest.class,
BatteryStatsDualTimerTest.class,
BatteryStatsDurationTimerTest.class,
+ BatteryStatsNoteTest.class,
BatteryStatsSamplingTimerTest.class,
+ BatteryStatsSensorTest.class,
BatteryStatsServTest.class,
BatteryStatsStopwatchTimerTest.class,
BatteryStatsTimeBaseTest.class,
BatteryStatsTimerTest.class,
BatteryStatsUidTest.class,
- BatteryStatsSensorTest.class,
- BatteryStatsBackgroundStatsTest.class,
- BatteryStatsNoteTest.class,
})
public class BatteryStatsTests {
}
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index b5b9fdbee878..e3b47405e0d4 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -1596,10 +1596,13 @@ public class Paint {
return true;
}
+ // The null typeface is valid and it is equivalent to Typeface.DEFAULT.
+ // To call isSupportedAxes method, use Typeface.DEFAULT instance.
+ Typeface targetTypeface = mTypeface == null ? Typeface.DEFAULT : mTypeface;
FontVariationAxis[] axes = FontVariationAxis.fromFontVariationSettings(settings);
final ArrayList<FontVariationAxis> filteredAxes = new ArrayList<FontVariationAxis>();
for (final FontVariationAxis axis : axes) {
- if (mTypeface.isSupportedAxes(axis.getOpenTypeTagValue())) {
+ if (targetTypeface.isSupportedAxes(axis.getOpenTypeTagValue())) {
filteredAxes.add(axis);
}
}
@@ -1607,7 +1610,7 @@ public class Paint {
return false;
}
mFontVariationSettings = settings;
- setTypeface(Typeface.createFromTypefaceWithVariation(mTypeface, filteredAxes));
+ setTypeface(Typeface.createFromTypefaceWithVariation(targetTypeface, filteredAxes));
return true;
}
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 5a56f5335373..c4b56c333c64 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -725,8 +725,8 @@ public class Typeface {
}
/** @hide */
- public static Typeface createFromTypefaceWithVariation(Typeface family,
- List<FontVariationAxis> axes) {
+ public static Typeface createFromTypefaceWithVariation(@Nullable Typeface family,
+ @NonNull List<FontVariationAxis> axes) {
final long ni = family == null ? 0 : family.native_instance;
return new Typeface(nativeCreateFromTypefaceWithVariation(ni, axes));
}
@@ -1056,7 +1056,7 @@ public class Typeface {
}
}
}
- return Arrays.binarySearch(mSupportedAxes, axis) > 0;
+ return Arrays.binarySearch(mSupportedAxes, axis) >= 0;
}
private static native long nativeCreateFromTypeface(long native_instance, int style);
diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
index 39f11b8e6bfe..4ee47afe87fd 100644
--- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
+++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
@@ -61,8 +61,17 @@ void RenderNodeDrawable::drawBackwardsProjectedNodes(SkCanvas* canvas, const Ski
static void clipOutline(const Outline& outline, SkCanvas* canvas, const SkRect* pendingClip) {
Rect possibleRect;
float radius;
- LOG_ALWAYS_FATAL_IF(!outline.getAsRoundRect(&possibleRect, &radius),
- "clipping outlines should be at most roundedRects");
+
+ /* To match the existing HWUI behavior we only supports rectangles or
+ * rounded rectangles; passing in a more complicated outline fails silently.
+ */
+ if (!outline.getAsRoundRect(&possibleRect, &radius)) {
+ if (pendingClip) {
+ canvas->clipRect(*pendingClip);
+ }
+ return;
+ }
+
SkRect rect = possibleRect.toSkRect();
if (radius != 0.0f) {
if (pendingClip && !pendingClip->contains(rect)) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java b/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
index 34fdc9ddd99d..a8f6f025b6d5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
@@ -63,15 +63,17 @@ public class StorageStatsSource {
public long audioBytes;
public long videoBytes;
public long imageBytes;
+ public long appBytes;
/** Convenience method for testing. */
@VisibleForTesting
public ExternalStorageStats(
- long totalBytes, long audioBytes, long videoBytes, long imageBytes) {
+ long totalBytes, long audioBytes, long videoBytes, long imageBytes, long appBytes) {
this.totalBytes = totalBytes;
this.audioBytes = audioBytes;
this.videoBytes = videoBytes;
this.imageBytes = imageBytes;
+ this.appBytes = appBytes;
}
/**
@@ -84,6 +86,7 @@ public class StorageStatsSource {
audioBytes = stats.getAudioBytes();
videoBytes = stats.getVideoBytes();
imageBytes = stats.getImageBytes();
+ appBytes = stats.getAppBytes();
}
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 930935914967..b328933cd1c5 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -888,8 +888,20 @@ class SettingsProtoDumpUtil {
Settings.Global.ENABLE_EPHEMERAL_FEATURE,
GlobalSettingsProto.ENABLE_EPHEMERAL_FEATURE);
dumpSetting(s, p,
- Settings.Global.UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS,
- GlobalSettingsProto.UNINSTALLED_EPHEMERAL_APP_CACHE_DURATION_MILLIS);
+ Settings.Global.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ GlobalSettingsProto.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD);
+ dumpSetting(s, p,
+ Settings.Global.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ GlobalSettingsProto.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD);
+ dumpSetting(s, p,
+ Settings.Global.INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ GlobalSettingsProto.INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD);
+ dumpSetting(s, p,
+ Settings.Global.INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ GlobalSettingsProto.INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD);
+ dumpSetting(s, p,
+ Settings.Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD,
+ GlobalSettingsProto.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD);
dumpSetting(s, p,
Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED,
GlobalSettingsProto.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED);
diff --git a/packages/SystemUI/res/layout/qs_footer.xml b/packages/SystemUI/res/layout/qs_footer.xml
index 577be2fd684b..871d1f361dd0 100644
--- a/packages/SystemUI/res/layout/qs_footer.xml
+++ b/packages/SystemUI/res/layout/qs_footer.xml
@@ -27,6 +27,7 @@
android:clipChildren="false"
android:clipToPadding="false"
android:paddingTop="0dp"
+ android:background="#00000000"
android:gravity="center_vertical"
android:orientation="horizontal">
diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
index 005e9552a554..66c5dd5b5275 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -29,7 +29,6 @@
android:clickable="false"
android:clipChildren="false"
android:clipToPadding="false"
- android:paddingBottom="48dp"
android:paddingTop="0dp"
android:paddingEnd="0dp"
android:paddingStart="0dp">
@@ -83,10 +82,9 @@
<com.android.systemui.qs.QuickQSPanel
android:id="@+id/quick_qs_panel"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="48dp"
android:layout_alignParentEnd="true"
- android:layout_marginTop="36dp"
- android:layout_marginBottom="8dp"
+ android:layout_marginTop="31dp"
android:layout_alignParentTop="true"
android:accessibilityTraversalAfter="@+id/date_time_group"
android:accessibilityTraversalBefore="@id/expand_indicator"
@@ -95,8 +93,7 @@
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:focusable="true"
- android:importantForAccessibility="yes"
- android:paddingTop="0dp"/>
+ android:importantForAccessibility="yes" />
<com.android.systemui.statusbar.AlphaOptimizedImageView
android:id="@+id/qs_detail_header_progress"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 36ceff57544f..3fce776e2e11 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minute"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minute"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 uur"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ONTDOEN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Sluimer vir <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batterygebruik"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index f9edd7c7b54f..a217d3cd8ee9 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 ደቂቃዎች"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 ደቂቃዎች"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ሰዓት"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ቀልብስ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ለ<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> አሸልቧል"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"የባትሪ አጠቃቀም"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 4ab49a026a91..1c1fbbce444c 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -589,6 +589,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"١٥ دقيقة"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"٣۰ دقيقة"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"ساعة واحدة"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"تراجع"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"تم تأجيل الإشعار لمدة <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"استخدام البطارية"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index aca6a3b31e07..24b71e7d5515 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 dəqiqə"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 dəqiqə"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 saat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"GERİ QAYTARIN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> üçün təxirə salınıb"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batareya istifadəsi"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 29a5e194c472..f4607300ce5d 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -577,6 +577,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuta"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuta"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 sat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"OPOZOVI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odloženo je za <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Potrošnja baterije"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 15f1d86db22a..dfad96ca84e1 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 хвілін"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 хвілін"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 гадзіна"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"АДРАБІЦЬ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Адкладзена на <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Выкарыстанне зараду"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index b77cc9e5b3ea..be327135046e 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минути"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минути"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 час"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ОТМЯНА"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Отложено за <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Ползв. на батерията"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index b9fa325880d7..822652ba8ad1 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"১৫ মিনিট"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"৩০ মিনিট"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"১ ঘণ্টা"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"পূর্বাবস্থায় ফিরুন"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> পরে আবার মনে করানো হবে"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ব্যাটারির ব্যবহার"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 11450ae820cc..e4e02d7410d9 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -579,6 +579,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuta"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuta"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 sat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"OPOZOVI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odgođeno za <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Potrošnja baterije"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 16f2a32185f5..c9254ef85cf3 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuts"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuts"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESFÉS"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"S\'ha posposat <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Ús de la bateria"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index f4a45c2f2645..2ad9dbaa28b3 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minut"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minut"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hodina"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"VRÁTIT ZPĚT"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odloženo o <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Využití baterie"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 55b39d56dfe4..e2852dd4bada 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutter"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutter"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 time"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"FORTRYD"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Udsat i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batteriforbrug"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index bc7f1d5ffb60..b0b4323593ab 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 Minuten"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 Minuten"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 Stunde"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"RÜCKGÄNGIG"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Erinnerung in <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akkunutzung"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index bbefef459a7d..5d8703492bb2 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 λεπτά"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 λεπτά"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ώρα"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ΑΝΑΙΡΕΣΗ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Σε αφύπνιση για <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Χρήση της μπαταρίας"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 2561d29ecb76..05c413091c1f 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hour"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 2561d29ecb76..05c413091c1f 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hour"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 2561d29ecb76..05c413091c1f 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hour"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 64a4bfebed4f..07b564d9e8ee 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESHACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Posponer <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso de la batería"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 8d9f8a58f853..3bf6a8cc003a 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESHACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Volverá a mostrarse en <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso de la batería"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 604d266623aa..26b460319789 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutit"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutit"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"Üks tund"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"VÕTA TAGASI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Edasi lükatud <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akukasutus"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 2c83e5b8ff62..86fd3b24efa5 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutu"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutu"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ordu"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESEGIN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>z atzeratu da"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Bateriaren erabilera"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 1f49e9894262..5570f9edf7de 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"۱۵ دقیقه"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"۳۰ دقیقه"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"۱ ساعت"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"واگرد"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> به تعویق افتاد"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"مصرف باتری"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index f5b0b6b96f8e..c60c4c45aa55 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuuttia"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuuttia"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 tunti"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"KUMOA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Torkku: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akun käyttö"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index e615ff427574..10b0cba8a0a5 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 heure"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANNULER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Reporté pour <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utilisation de la pile"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 811b16ce37bf..862d13fb748b 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 heure"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANNULER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Répétée après <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utilisation batterie"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 7481d1aea66d..0cb91b454b21 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESFACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiouse <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso de batería"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index ca7a779e7f1c..7f718d98b1f6 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 મિનિટ"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 મિનિટ"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 કલાક"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"પૂર્વવત્ કરો"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> માટે સ્નૂઝ કરો"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"બૅટરી વપરાશ"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 92bc82e033d0..613d8d302eb7 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 मिनट"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 मिनट"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 घंटा"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"पहले जैसा करें"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> के लिए याद दिलाया गया"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"बैटरी उपयोग"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 2065b8c42101..e716f5dfa98d 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -577,6 +577,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuta"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuta"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 sat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"PONIŠTI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odgođeno <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Potrošnja baterije"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index d1e85d91710c..fe1b12b19b54 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 perc"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 perc"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 óra"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"VISSZAVONÁS"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Elhalasztva: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akkumulátorhasználat"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 1189b0535af6..bdceafe86670 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 րոպե"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 րոպե"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ժամ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ՀԵՏԱՐԿԵԼ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Հետաձգվել է <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ով"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Մարտկոցի օգտագործում"</string>
diff --git a/packages/SystemUI/res/values-hy/strings_tv.xml b/packages/SystemUI/res/values-hy/strings_tv.xml
index ac7711b39ecc..0493584e39a7 100644
--- a/packages/SystemUI/res/values-hy/strings_tv.xml
+++ b/packages/SystemUI/res/values-hy/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Նկարը նկարի մեջ"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Նկար նկարի մեջ"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Առանց վերնագրի ծրագիր)"</string>
<string name="pip_close" msgid="3480680679023423574">"Փակել PIP-ն"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Լիէկրան"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 25a2a14b0afa..2853d9d291dd 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 menit"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 menit"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 jam"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"URUNG"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Ditunda selama <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Pemakaian baterai"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index d2b97872344f..f56720ae1d35 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 mínútur"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 mínútur"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 klukkustund"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"AFTURKALLA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Þaggað í <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Rafhlöðunotkun"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 01b2464ed938..cfe5deb3e6e5 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuti"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuti"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANNULLA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Posticipato di <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utilizzo batteria"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index b7e950819f02..4b1236e5758b 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -581,6 +581,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 דקות"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 דקות"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"שעה אחת"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ביטול"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"נדחה לטיפול בעוד <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"שימוש בסוללה"</string>
@@ -638,7 +640,7 @@
<string name="headset" msgid="4534219457597457353">"אוזניות"</string>
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"אוזניות מחוברות"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"אוזניות מחוברות"</string>
- <string name="data_saver" msgid="5037565123367048522">"‏חוסך הנתונים&lt;br&gt;(Data Saver)"</string>
+ <string name="data_saver" msgid="5037565123367048522">"‏חוסך הנתונים (Data Saver)"</string>
<string name="accessibility_data_saver_on" msgid="8454111686783887148">"‏חוסך הנתונים (Data Saver) פועל"</string>
<string name="accessibility_data_saver_off" msgid="8841582529453005337">"‏חוסך הנתונים (Data Saver) כבוי"</string>
<string name="switch_bar_on" msgid="1142437840752794229">"פועל"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 15fccc618d4e..4c7c85e43570 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15分"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30分"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1時間"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"元に戻す"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"スヌーズ: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"電池の使用状況"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 17320ef7eaf0..d8cbc199ad5b 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 წუთი"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 წუთი"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 საათი"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"მოქმედების გაუქმება"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ჩაჩუმებული იქნება <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ბატარეის მოხმარება"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 724af886ebce..f71601eb9b21 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минут"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минут"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 сағат"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"КЕРІ ҚАЙТАРУ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> кідіртілді"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Батареяны пайдалану"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 229e345f82ed..9aed68928016 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 នាទី"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 នាទី"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ម៉ោង"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"មិន​ធ្វើវិញ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"បាន​ផ្អាក​រយៈពេល <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ការប្រើប្រាស់ថ្ម"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 9c87cf7fd0bd..cd85f749d288 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 ನಿಮಿಷಗಳು"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 ನಿಮಿಷಗಳು"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ಗಂಟೆ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ರದ್ದುಮಾಡಿ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ಗೆ ಸ್ನೂಜ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ಬ್ಯಾಟರಿ ಬಳಕೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 273b39051fcb..a237ba9926b7 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15분"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30분"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1시간"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"실행취소"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> 동안 일시 중지됨"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"배터리 사용량"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 209d38d80263..1127c24c0b10 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 мүнөт"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 мүнөт"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 саат"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"КАЙТАРУУ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> тындырылды"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Батарея колдонулушу"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 536958370d53..42baec6d95ca 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 ນາທີ"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 ນາທີ"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ຊົ່ວໂມງ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ຍົກເລີກ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ເລື່ອນໄປ <xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ນາທີແລ້ວ"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ການໃຊ້ແບັດເຕີຣີ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index cc123cf179d9..ce403ef8c6cb 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -581,6 +581,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 min."</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 min."</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 val."</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANULIUOTI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Nustatyta snausti <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akum. energ. vartoj."</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 9bd3c65bf260..28758ca7609b 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -577,6 +577,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minūtes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minūtes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 stunda"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ATSAUKT"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Atlikts: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akumulatora lietojums"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 519cfac30323..3355090c121f 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минути"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минути"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 час"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ВРАТИ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Одложено за <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Користење батерија"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index a7aa20a401e0..a41e305eea55 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 മിനിറ്റ്"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 മിനിറ്റ്"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"ഒരു മണിക്കൂർ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"പഴയപടിയാക്കുക"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> സമയത്തേക്ക് സ്‌നൂസ് ‌ചെയ്‌തു"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ബാറ്ററി ഉപയോഗം"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 7144c2849406..3a33cd6cb01f 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минут"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минут"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 цаг"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"БУЦААХ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>-д түр хойшлуулсан"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Тэжээл ашиглалт"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index f7360c9d6944..ad107d8390f2 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 मिनिटे"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 मिनिटे"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 तास"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"पूर्ववत करा"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> साठी स्नूझ करा"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"बॅटरी वापर"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index a05dd2b4984c..898cdfc849f2 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minit"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minit"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 jam"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"BUAT ASAL"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Ditunda selama <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Penggunaan bateri"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 797aa977c8d5..346bbe245e32 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"၁၅ မိနစ်"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"၃၀ မိနစ်"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"၁ နာရီ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"တစ်ဆင့် နောက်ပြန်ပြန်ပါ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ဆိုင်းငံ့ရန်"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ဘက်ထရီ အသုံးပြုမှု"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index f59367fcedaa..a13c09745958 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutter"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutter"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 time"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANGRE"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Slumrer i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batteribruk"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index fb49b17bee2a..c8cd38384b7b 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"१५ मिनेट"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"३० मिनेट"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"१ घन्टा"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"अनडू गर्नुहोस्"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> का लागि स्नुज गरियो"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ब्याट्री उपयोग"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index b708e6631789..78077e973050 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuten"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuten"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 uur"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ONGEDAAN MAKEN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozefunctie <xliff:g id="TIME_AMOUNT">%1$s</xliff:g> actief"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Accugebruik"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 1039e3407678..07a0e8222e07 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 ਮਿੰਟ"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 ਮਿੰਟ"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ਘੰਟਾ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ਅਣਕੀਤਾ ਕਰੋ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ਲਈ ਸਨੂਜ਼ ਕੀਤਾ ਗਿਆ"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ਬੈਟਰੀ ਵਰਤੋਂ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 91a7c09c5752..03b5ed9e9acd 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -581,6 +581,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 min"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 min"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 godz."</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"COFNIJ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odłożono na <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Wykorzystanie baterii"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index ab705e7f58fb..8ef330b7a447 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"Uma hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESFAZER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiada para <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso da bateria"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 74089b2982cf..49f14804ea58 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -444,29 +444,29 @@
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"A sua entidade instalou uma autoridade de certificação no seu perfil de trabalho. O tráfego da sua rede segura pode ser monitorizado ou alterado."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Está instalada uma autoridade de certificação neste dispositivo. O tráfego da sua rede segura pode ser monitorizado ou alterado."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"O administrador ativou os registos de rede, que monitorizam o tráfego no seu dispositivo."</string>
- <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Está ligado às redes <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"O seu perfil de trabalho está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"O seu perfil pessoal está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Está ligado às redes <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"O seu perfil de trabalho está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"O seu perfil pessoal está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"O seu dispositivo é gerido pelo <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
<string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"A <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> utiliza o <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> para gerir o seu dispositivo."</string>
<string name="monitoring_description_do_body" msgid="3639594537660975895">"O administ. pode monitorizar e gerir definições, acesso empresarial, aplic. e dados associados ao dispositivo, bem como inf. de localiz. do disp."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
<string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Saiba mais"</string>
- <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
+ <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string>
<string name="monitoring_description_vpn_settings" msgid="8869300202410505143">"Abrir as definições de VPN"</string>
<string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
<string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Abrir credenciais fidedignas"</string>
<string name="monitoring_description_network_logging" msgid="7223505523384076027">"O seu administrador ativou os registos de rede, que monitorizam o tráfego no seu dispositivo.\n\nPara obter mais informações, contacte o administrador."</string>
- <string name="monitoring_description_vpn" msgid="4445150119515393526">"Concedeu autorização a uma aplicação para configurar uma ligação VPN.\n\nEsta aplicação pode monitorizar a atividade do dispositivo e da rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu administrador tem a capacidade de monitorizar a sua atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador.\n\nAlém disso, está ligado a uma VPN, que pode monitorizar a sua atividade da rede."</string>
+ <string name="monitoring_description_vpn" msgid="4445150119515393526">"Concedeu autorização a uma aplicação para configurar uma ligação VPN.\n\nEsta aplicação pode monitorizar a atividade do dispositivo e da rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu administrador tem a capacidade de monitorizar a sua atividade da rede, incluindo emails, aplicações e Sites.\n\nPara obter mais informações, contacte o administrador.\n\nAlém disso, está ligado a uma VPN, que pode monitorizar a sua atividade da rede."</string>
<string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string>
- <string name="monitoring_description_app" msgid="1828472472674709532">"Está associado à aplicação <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_app_personal" msgid="484599052118316268">"Está ligado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites."</string>
- <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Está ligado ao <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_app_work" msgid="4612997849787922906">"O seu perfil de trabalho é gerido pela <xliff:g id="ORGANIZATION">%1$s</xliff:g>. O perfil está associado à aplicação <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nContacte o administrador para obter mais informações."</string>
- <string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"O seu perfil de trabalho é gerido pela <xliff:g id="ORGANIZATION">%1$s</xliff:g>. O perfil está associado à aplicação <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nTambém está associado à aplicação <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorizar a atividade da rede pessoal."</string>
+ <string name="monitoring_description_app" msgid="1828472472674709532">"Está associado à aplicação <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_app_personal" msgid="484599052118316268">"Está ligado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Sites."</string>
+ <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Está ligado ao <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_app_work" msgid="4612997849787922906">"O seu perfil de trabalho é gerido pela <xliff:g id="ORGANIZATION">%1$s</xliff:g>. O perfil está associado à aplicação <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Sites.\n\nContacte o administrador para obter mais informações."</string>
+ <string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"O seu perfil de trabalho é gerido pela <xliff:g id="ORGANIZATION">%1$s</xliff:g>. O perfil está associado à aplicação <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Sites.\n\nTambém está associado à aplicação <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorizar a atividade da rede pessoal."</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"O dispositivo permanecerá bloqueado até ser desbloqueado manualmente"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"Receber notificações mais rapidamente"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"Ver antes de desbloquear"</string>
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANULAR"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Suspensa por <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utiliz. da bateria"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index ab705e7f58fb..8ef330b7a447 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"Uma hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESFAZER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiada para <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso da bateria"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index cadce25ee1ec..29bc5bf22584 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -579,6 +579,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minute"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 de minute"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 oră"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANULAȚI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Amânată <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utilizarea bateriei"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 34939b58fec4..e593f89d6961 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минут"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минут"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 час"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ОТМЕНИТЬ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Отложено на <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Уровень заряда"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 7065c83b8aa2..991be52d2a14 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"මිනිත්තු 15"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"මිනිත්තු 30"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"පැය 1"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"අස් කරන්න"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ක් මදක් නතර කරන ලදී"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"බැටරි භාවිතය"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 6e4c33bb3b1e..33793ce7795f 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minút"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minút"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hod."</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"SPÄŤ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Stlmené na <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Využitie batérie"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index b0e770fbdd6c..9e03e425dcd4 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minut"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minut"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ura"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"RAZVELJAVI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Preloženo za <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Poraba akumulatorja"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index a68ec872ebb7..cbdb5b21ddbe 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuta"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuta"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 orë"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ZHBËJ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"U shty për <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Përdorimi i baterisë"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index f4b488422d66..5c4790762b00 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -577,6 +577,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минута"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минута"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 сат"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ОПОЗОВИ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Одложено је за <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Потрошња батерије"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 685c0a445a83..967e3a5a4aa0 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuter"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuter"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 timme"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ÅNGRA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozad i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batteriförbrukning"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 9a52d9b1e39e..82220748a875 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"Dakika 15"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"Dakika 30"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"Saa 1"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"TENDUA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Imeahirishwa kwa <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Matumizi ya betri"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 1c4b7de301f2..eb672e18e30e 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 நிமிடங்கள்"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 நிமிடங்கள்"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 மணிநேரம்"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"செயல்தவிர்"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"உறக்கநிலையில் வைத்திருந்த நேரம்: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"பேட்டரி உபயோகம்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 2bdabd2bcc83..b5470e75101f 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 నిమిషాలు"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 నిమిషాలు"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 గంట"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"చర్య రద్దు చేయి"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> వరకు తాత్కాలికంగా ఆపివేయబడింది"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"బ్యాటరీ వినియోగం"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 8077d1432642..f47cfa9b6b7f 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -64,7 +64,7 @@
<string name="usb_debugging_message" msgid="2220143855912376496">"ลายนิ้วมือหลัก RSA ของคอมพิวเตอร์คือ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"อนุญาตจากคอมพิวเตอร์เครื่องนี้เสมอ"</string>
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB"</string>
- <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์นี้อยู่ในขณะนี้ไม่สามารถเปิดการแก้ปัญหาผ่าน USB ได้ หากต้องการใช้คุณลักษณะนี้ โปรดเปลี่ยนไปเป็นผู้ใช้ที่เป็นผู้ดูแลระบบ"</string>
+ <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์นี้อยู่ในขณะนี้ไม่สามารถเปิดการแก้ปัญหาผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ โปรดเปลี่ยนไปเป็นผู้ใช้ที่เป็นผู้ดูแลระบบ"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"ขยายจนเต็มหน้าจอ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ยืดจนเต็มหน้าจอ"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"กำลังบันทึกภาพหน้าจอ..."</string>
@@ -524,12 +524,12 @@
<string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ฮอตสปอต"</string>
<string name="accessibility_managed_profile" msgid="6613641363112584120">"โปรไฟล์งาน"</string>
<string name="tuner_warning_title" msgid="7094689930793031682">"เพลิดเพลินกับบางส่วนแต่ไม่ใช่ทั้งหมด"</string>
- <string name="tuner_warning" msgid="8730648121973575701">"ตัวรับสัญญาณ UI ระบบช่วยให้คุณมีวิธีพิเศษในการปรับแต่งและกำหนดค่าส่วนติดต่อผู้ใช้ Android คุณลักษณะรุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string>
- <string name="tuner_persistent_warning" msgid="8597333795565621795">"คุณลักษณะรุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string>
+ <string name="tuner_warning" msgid="8730648121973575701">"ตัวรับสัญญาณ UI ระบบช่วยให้คุณมีวิธีพิเศษในการปรับแต่งและกำหนดค่าส่วนติดต่อผู้ใช้ Android ฟีเจอร์รุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string>
+ <string name="tuner_persistent_warning" msgid="8597333795565621795">"ฟีเจอร์รุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string>
<string name="got_it" msgid="2239653834387972602">"รับทราบ"</string>
<string name="tuner_toast" msgid="603429811084428439">"ยินดีด้วย! เพิ่มตัวรับสัญญาณ UI ระบบไปยังการตั้งค่าแล้ว"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"นำออกจากการตั้งค่า"</string>
- <string name="remove_from_settings_prompt" msgid="6069085993355887748">"นำตัวรับสัญญาณ UI ระบบออกจากการตั้งค่าและหยุดใช้คุณลักษณะทั้งหมดของตัวรับสัญญาณใช่ไหม"</string>
+ <string name="remove_from_settings_prompt" msgid="6069085993355887748">"นำตัวรับสัญญาณ UI ระบบออกจากการตั้งค่าและหยุดใช้ฟีเจอร์ทั้งหมดของตัวรับสัญญาณใช่ไหม"</string>
<string name="activity_not_found" msgid="348423244327799974">"ยังไม่ได้ติดตั้งแอปพลิเคชันบนอุปกรณ์ของคุณ"</string>
<string name="clock_seconds" msgid="7689554147579179507">"แสดงวินาทีของนาฬิกา"</string>
<string name="clock_seconds_desc" msgid="6282693067130470675">"แสดงวินาทีของนาฬิกาในแถบสถานะ อาจส่งผลต่ออายุแบตเตอรี"</string>
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 นาที"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 นาที"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ชั่วโมง"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"เลิกทำ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ปิดเสียงเตือนชั่วคราวไว้เป็นเวลา <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"การใช้งานแบตเตอรี่"</string>
@@ -719,7 +721,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ลากลงเพื่อปิด"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"เมนูการแสดงผลหลายแหล่งพร้อมกัน"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ใช้การแสดงผลหลายแหล่งพร้อมกัน"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้คุณลักษณะนี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดคุณลักษณะ"</string>
+ <string name="pip_notification_message" msgid="4171698133469539591">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string>
<string name="pip_play" msgid="1417176722760265888">"เล่น"</string>
<string name="pip_pause" msgid="8881063404466476571">"หยุดชั่วคราว"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ข้ามไปรายการถัดไป"</string>
@@ -728,7 +730,7 @@
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ขณะนี้โทรศัพท์ทำงานเป็นปกติ"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"โทรศัพท์ร้อนเกินไปจึงปิดเครื่องเพื่อให้เย็นลง ขณะนี้โทรศัพท์ทำงานเป็นปกติ\n\nโทรศัพท์อาจร้อนเกินไปหากคุณ\n • ใช้แอปที่ใช้ทรัพยากรมาก (เช่น เกม วิดีโอ หรือแอปการนำทาง)\n • ดาวน์โหลดหรืออัปโหลดไฟล์ขนาดใหญ่\n • ใช้โทรศัพท์ในอุณหภูมิที่สูง"</string>
<string name="high_temp_title" msgid="4589508026407318374">"โทรศัพท์เริ่มเครื่องร้อน"</string>
- <string name="high_temp_notif_message" msgid="5642466103153429279">"คุณลักษณะบางอย่างจะใช้งานได้จำกัดขณะโทรศัพท์ลดอุณหภูมิลง"</string>
+ <string name="high_temp_notif_message" msgid="5642466103153429279">"ฟีเจอร์บางอย่างจะใช้งานได้จำกัดขณะโทรศัพท์ลดอุณหภูมิลง"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"โทรศัพท์จะพยายามลดอุณหภูมิลงโดยอัตโนมัติ คุณยังสามารถใช้โทรศัพท์ได้ แต่โทรศัพท์อาจทำงานช้าลง\n\nโทรศัพท์จะทำงานตามปกติเมื่อเย็นลงแล้ว"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ทางลัดทางซ้าย"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ทางลัดทางขวา"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 194b16186de6..3304ab71c7ac 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuto"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuto"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 oras"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"I-UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Na-snooze ng <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Paggamit ng baterya"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 7f1d8ff71d68..944316cc7d77 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 dakika"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 dakika"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 saat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"GERİ AL"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> süreyle ertelendi"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Pil kullanımı"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 1006eae3a18d..5636a8725fc6 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 хвилин"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 хвилин"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 годину"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ВІДМІНИТИ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Відкладено на <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Використання заряду"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 9f284942c011..7a5f1c7fba7b 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 منٹ"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 منٹ"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 گھنٹہ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"کالعدم کریں"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> کیلئے اسنوز کیا گیا"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"بیٹری کا استعمال"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 02f7c43b4045..262225c10761 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -201,7 +201,7 @@
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Parvoz rejimi o‘chirildi."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Parvoz rejimi yoqildi."</string>
<string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"“Bezovta qilinmasin” funksiyasi yoqilgan, faqat muhim bildirishnomalar ko‘rsatiladi."</string>
- <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Bezovta qilinmasin, tinchlik saqlansin"</string>
+ <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Bezovta qilinmasin, jimjitlik."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Bezovta qilinmasin, faqat signallar"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Bezovta qilinmasin."</string>
<string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"“Bezovta qilinmasin” funksiyasi o‘chirilgan."</string>
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 daqiqa"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 daqiqa"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 soat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"BEKOR QILISH"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> muddatga kechiktirildi"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batareya sarfi"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 167d0a1eeed0..1d125f6d9336 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 phút"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 phút"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 giờ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"HOÀN TÁC"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Báo lại sau <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Mức sử dụng pin"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index cf9b7d2b421c..600e17d4d029 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 分钟"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 分钟"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 小时"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"撤消"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"已延后 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"电池使用情况"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index d123c930c2ca..109c33e93572 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 分鐘"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 分鐘"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 小時"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"復原"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"已延後 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"電池用量"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index af7ed48ca93f..353d98590243 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -268,7 +268,7 @@
<string name="ethernet_label" msgid="7967563676324087464">"乙太網路"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"零打擾"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"僅限優先通知"</string>
- <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"僅允許鬧鐘"</string>
+ <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"僅限鬧鐘"</string>
<string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"完全靜音"</string>
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"藍牙"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"藍牙 (<xliff:g id="NUMBER">%d</xliff:g> 個裝置)"</string>
@@ -369,7 +369,7 @@
<string name="interruption_level_none_with_warning" msgid="5114872171614161084">"完全靜音。這也會關閉螢幕閱讀器的音訊。"</string>
<string name="interruption_level_none" msgid="6000083681244492992">"完全靜音"</string>
<string name="interruption_level_priority" msgid="6426766465363855505">"僅限優先通知"</string>
- <string name="interruption_level_alarms" msgid="5226306993448328896">"僅允許鬧鐘"</string>
+ <string name="interruption_level_alarms" msgid="5226306993448328896">"僅限鬧鐘"</string>
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"完全\n靜音"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"僅允許\n優先通知"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"僅允許\n鬧鐘"</string>
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 分鐘"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 分鐘"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 小時"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"復原"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"已延後 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"電池用量"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index c1765c692520..d81c32084b8e 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 amaminithi"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 amaminithi"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ihora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"HLEHLISA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Kusnuzwe u-<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Ukusetshenziswa kwebhethri"</string>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index f0ff22dc45c7..db1e8a9c112e 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -147,8 +147,10 @@ public class KeyguardStatusView extends GridLayout {
mClockView.setLayoutParams(layoutParams);
mDateView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getResources().getDimensionPixelSize(R.dimen.widget_label_font_size));
- mOwnerInfo.setTextSize(TypedValue.COMPLEX_UNIT_PX,
- getResources().getDimensionPixelSize(R.dimen.widget_label_font_size));
+ if (mOwnerInfo != null) {
+ mOwnerInfo.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+ getResources().getDimensionPixelSize(R.dimen.widget_label_font_size));
+ }
}
public void refreshTime() {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index c35fdd5c5781..854696ee313d 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -716,9 +716,15 @@ public class PipTouchHandler {
* Updates the current movement bounds based on whether the menu is currently visible.
*/
private void updateMovementBounds(int menuState) {
- mMovementBounds = menuState == MENU_STATE_FULL
+ boolean isMenuExpanded = menuState == MENU_STATE_FULL;
+ mMovementBounds = isMenuExpanded
? mExpandedMovementBounds
: mNormalMovementBounds;
+ try {
+ mPinnedStackController.setMinEdgeSize(isMenuExpanded ? mExpandedShortestEdgeSize : 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not set minimized state", e);
+ }
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 149b5ccd7b1a..0d74b7a85ad1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -58,6 +58,16 @@ public class QSContainerImpl extends FrameLayout {
mBackground = findViewById(R.id.qs_background);
mGutterHeight = getContext().getResources().getDimensionPixelSize(R.dimen.qs_gutter_height);
mFullElevation = mQSPanel.getElevation();
+
+ setClickable(true);
+ setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
+ }
+
+ @Override
+ public boolean performClick() {
+ // Want to receive clicks so missing QQS tiles doesn't cause collapse, but
+ // don't want to do anything with them.
+ return true;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
index 87b042d61147..682c56c0ef24 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
@@ -101,6 +101,8 @@ public class QSFooter extends FrameLayout implements
private boolean mShowEditIcon;
private TouchAnimator mAnimator;
private View mDateTimeGroup;
+ private boolean mKeyguardShowing;
+ private TouchAnimator mAlarmAnimator;
public QSFooter(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -163,13 +165,14 @@ public class QSFooter extends FrameLayout implements
int remaining = (width - numTiles * size) / (numTiles - 1);
int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space);
- final Builder builder = new Builder()
+ mAnimator = new Builder()
.addFloat(mSettingsContainer, "translationX", -(remaining - defSpace), 0)
.addFloat(mSettingsButton, "rotation", -120, 0)
- .addFloat(mAlarmStatus, "alpha", 0, 1);
+ .build();
if (mAlarmShowing) {
- builder.addFloat(mDate, "alpha", 1, 0)
+ mAlarmAnimator = new Builder().addFloat(mDate, "alpha", 1, 0)
.addFloat(mDateTimeGroup, "translationX", 0, -mDate.getWidth())
+ .addFloat(mAlarmStatus, "alpha", 0, 1)
.setListener(new ListenerAdapter() {
@Override
public void onAnimationAtStart() {
@@ -180,13 +183,13 @@ public class QSFooter extends FrameLayout implements
public void onAnimationStarted() {
mAlarmStatus.setVisibility(View.VISIBLE);
}
- });
+ }).build();
} else {
+ mAlarmAnimator = null;
mAlarmStatus.setVisibility(View.GONE);
mDate.setAlpha(1);
mDateTimeGroup.setTranslationX(0);
}
- mAnimator = builder.build();
setExpansion(mExpansionAmount);
}
@@ -248,6 +251,11 @@ public class QSFooter extends FrameLayout implements
return animatorBuilder.build();
}
+ public void setKeyguardShowing(boolean keyguardShowing) {
+ mKeyguardShowing = keyguardShowing;
+ setExpansion(mExpansionAmount);
+ }
+
public void setExpanded(boolean expanded) {
if (mExpanded == expanded) return;
mExpanded = expanded;
@@ -275,6 +283,8 @@ public class QSFooter extends FrameLayout implements
public void setExpansion(float headerExpansionFraction) {
mExpansionAmount = headerExpansionFraction;
if (mAnimator != null) mAnimator.setPosition(headerExpansionFraction);
+ if (mAlarmAnimator != null) mAlarmAnimator.setPosition(
+ mKeyguardShowing ? 0 : headerExpansionFraction);
if (mSettingsAlpha != null) {
mSettingsAlpha.setPosition(headerExpansionFraction);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 61fd6244b700..c9c3a7f9e147 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -222,6 +222,7 @@ public class QSFragment extends Fragment implements QS {
mQSAnimator.setOnKeyguard(keyguardShowing);
}
+ mFooter.setKeyguardShowing(keyguardShowing);
updateQsState();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 8539cb9d5473..00b883a541db 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -60,6 +60,12 @@ public class QuickQSPanel extends QSPanel {
mTileLayout = new HeaderTileLayout(context);
mTileLayout.setListening(mListening);
addView((View) mTileLayout, 0 /* Between brightness and footer */);
+ super.setPadding(0, 0, 0, 0);
+ }
+
+ @Override
+ public void setPadding(int left, int top, int right, int bottom) {
+ // Always have no padding.
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 1afce64539d2..76f6e7d7d243 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -353,13 +353,20 @@ public class WifiTile extends QSTileImpl<SignalState> {
private void updateItems() {
if (mItems == null) return;
- if (mSignalCallback.mInfo.enabled) {
- mItems.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
- R.string.quick_settings_wifi_detail_empty_text);
- } else {
+
+ // Wi-Fi is off
+ if (!mSignalCallback.mInfo.enabled) {
mItems.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
R.string.wifi_is_off);
+ mItems.setItems(null);
+ return;
}
+
+ // No available access points
+ mItems.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
+ R.string.quick_settings_wifi_detail_empty_text);
+
+ // Build the list
Item[] items = null;
if (mAccessPoints != null) {
items = new Item[mAccessPoints.length];
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index e2e9b1b7d76f..611169f575c1 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -30,6 +30,7 @@ import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
@@ -239,8 +240,6 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
}
});
- protected Bitmap mThumbTransitionBitmapCache;
-
public RecentsImpl(Context context) {
mContext = context;
mHandler = new Handler();
@@ -775,14 +774,6 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
}
mHeaderBar.layout(0, 0, taskViewWidth, mTaskBarHeight);
}
-
- // Update the transition bitmap to match the new header bar height
- if (mThumbTransitionBitmapCache == null ||
- (mThumbTransitionBitmapCache.getWidth() != taskViewWidth) ||
- (mThumbTransitionBitmapCache.getHeight() != mTaskBarHeight)) {
- mThumbTransitionBitmapCache = Bitmap.createBitmap(taskViewWidth,
- mTaskBarHeight, Bitmap.Config.ARGB_8888);
- }
}
}
@@ -864,8 +855,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
mTmpTransform = stackLayout.getStackTransformScreenCoordinates(task,
stackScroller.getStackScroll(), mTmpTransform, null,
windowOverrideRect);
- Bitmap thumbnail = drawThumbnailTransitionBitmap(task, mTmpTransform,
- mThumbTransitionBitmapCache);
+ GraphicBuffer thumbnail = drawThumbnailTransitionBitmap(task, mTmpTransform);
Rect toTaskRect = new Rect();
mTmpTransform.rect.round(toTaskRect);
specs.add(new AppTransitionAnimationSpec(task.key.id, thumbnail, toTaskRect));
@@ -887,8 +877,8 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
() -> {
Rect rect = new Rect();
toTaskRect.round(rect);
- Bitmap thumbnail = drawThumbnailTransitionBitmap(toTask, toTransform,
- mThumbTransitionBitmapCache);
+ GraphicBuffer thumbnail = drawThumbnailTransitionBitmap(toTask,
+ toTransform);
return Lists.newArrayList(new AppTransitionAnimationSpec(
toTask.key.id, thumbnail, rect));
});
@@ -924,19 +914,19 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
/**
* Draws the header of a task used for the window animation into a bitmap.
*/
- private Bitmap drawThumbnailTransitionBitmap(Task toTask, TaskViewTransform toTransform,
- Bitmap thumbnail) {
+ private GraphicBuffer drawThumbnailTransitionBitmap(Task toTask,
+ TaskViewTransform toTransform) {
SystemServicesProxy ssp = Recents.getSystemServices();
if (toTransform != null && toTask.key != null) {
synchronized (mHeaderBarLock) {
boolean disabledInSafeMode = !toTask.isSystemApp && ssp.isInSafeMode();
- mHeaderBar.onTaskViewSizeChanged((int) toTransform.rect.width(),
- (int) toTransform.rect.height());
+ int width = (int) toTransform.rect.width();
+ int height = (int) toTransform.rect.height();
+ mHeaderBar.onTaskViewSizeChanged(width, height);
if (RecentsDebugFlags.Static.EnableTransitionThumbnailDebugMode) {
- thumbnail.eraseColor(0xFFff0000);
+ return RecentsTransitionHelper.drawViewIntoGraphicBuffer(width, mTaskBarHeight,
+ null, 1f, 0xFFff0000);
} else {
- thumbnail.eraseColor(0);
- Canvas c = new Canvas(thumbnail);
// Workaround for b/27815919, reset the callback so that we do not trigger an
// invalidate on the header bar as a result of updating the icon
Drawable icon = mHeaderBar.getIconView().getDrawable();
@@ -947,11 +937,10 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
disabledInSafeMode);
mHeaderBar.onTaskDataLoaded();
mHeaderBar.setDimAlpha(toTransform.dimAlpha);
- mHeaderBar.draw(c);
- c.setBitmap(null);
+ return RecentsTransitionHelper.drawViewIntoGraphicBuffer(width, mTaskBarHeight,
+ mHeaderBar, 1f, 0);
}
}
- return thumbnail.createAshmemBitmap();
}
return null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
index d7d264e3aa07..21dfe8caf964 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
@@ -30,6 +30,7 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
@@ -37,7 +38,11 @@ import android.os.IRemoteCallback;
import android.os.RemoteException;
import android.util.Log;
import android.view.AppTransitionAnimationSpec;
+import android.view.DisplayListCanvas;
import android.view.IAppTransitionAnimationSpecsFuture;
+import android.view.RenderNode;
+import android.view.ThreadedRenderer;
+import android.view.View;
import com.android.internal.annotations.GuardedBy;
import com.android.systemui.recents.Recents;
@@ -264,8 +269,8 @@ public class RecentsTransitionHelper {
Rect bounds) {
mTmpTransform.fillIn(taskView);
Task task = taskView.getTask();
- Bitmap thumbnail = RecentsTransitionHelper.composeTaskBitmap(taskView, mTmpTransform);
- return Collections.singletonList(new AppTransitionAnimationSpec(task.key.id, thumbnail,
+ GraphicBuffer buffer = RecentsTransitionHelper.composeTaskBitmap(taskView, mTmpTransform);
+ return Collections.singletonList(new AppTransitionAnimationSpec(task.key.id, buffer,
bounds));
}
@@ -346,7 +351,7 @@ public class RecentsTransitionHelper {
return new AppTransitionAnimationSpec(task.key.id, null, taskRect);
}
- public static Bitmap composeTaskBitmap(TaskView taskView, TaskViewTransform transform) {
+ public static GraphicBuffer composeTaskBitmap(TaskView taskView, TaskViewTransform transform) {
float scale = transform.scale;
int fromWidth = (int) (transform.rect.width() * scale);
int fromHeight = (int) (transform.rect.height() * scale);
@@ -354,26 +359,17 @@ public class RecentsTransitionHelper {
Log.e(TAG, "Could not compose thumbnail for task: " + taskView.getTask() +
" at transform: " + transform);
- Bitmap b = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
- b.eraseColor(Color.TRANSPARENT);
- return b;
+ return drawViewIntoGraphicBuffer(1, 1, null, 1f, 0x00ffffff);
} else {
- Bitmap b = Bitmap.createBitmap(fromWidth, fromHeight,
- Bitmap.Config.ARGB_8888);
-
if (RecentsDebugFlags.Static.EnableTransitionThumbnailDebugMode) {
- b.eraseColor(0xFFff0000);
+ return drawViewIntoGraphicBuffer(fromWidth, fromHeight, null, 1f, 0xFFff0000);
} else {
- Canvas c = new Canvas(b);
- c.scale(scale, scale);
- taskView.draw(c);
- c.setBitmap(null);
+ return drawViewIntoGraphicBuffer(fromWidth, fromHeight, taskView, scale, 0);
}
- return b.createAshmemBitmap();
}
}
- private static Bitmap composeHeaderBitmap(TaskView taskView,
+ private static GraphicBuffer composeHeaderBitmap(TaskView taskView,
TaskViewTransform transform) {
float scale = transform.scale;
int headerWidth = (int) (transform.rect.width());
@@ -382,16 +378,30 @@ public class RecentsTransitionHelper {
return null;
}
- Bitmap b = Bitmap.createBitmap(headerWidth, headerHeight, Bitmap.Config.ARGB_8888);
if (RecentsDebugFlags.Static.EnableTransitionThumbnailDebugMode) {
- b.eraseColor(0xFFff0000);
+ return drawViewIntoGraphicBuffer(headerWidth, headerHeight, null, 1f, 0xFFff0000);
} else {
- Canvas c = new Canvas(b);
- c.scale(scale, scale);
- taskView.mHeaderView.draw(c);
- c.setBitmap(null);
+ return drawViewIntoGraphicBuffer(headerWidth, headerHeight, taskView.mHeaderView,
+ scale, 0);
+ }
+ }
+
+ public static GraphicBuffer drawViewIntoGraphicBuffer(int bufferWidth, int bufferHeight,
+ View view, float scale, int eraseColor) {
+ RenderNode node = RenderNode.create("RecentsTransition", null);
+ node.setLeftTopRightBottom(0, 0, bufferWidth, bufferHeight);
+ node.setClipToBounds(false);
+ DisplayListCanvas c = node.start(bufferWidth, bufferHeight);
+ c.scale(scale, scale);
+ if (eraseColor != 0) {
+ c.drawColor(eraseColor);
+ }
+ if (view != null) {
+ view.draw(c);
}
- return b.createAshmemBitmap();
+ node.end(c);
+ return ThreadedRenderer.createHardwareBitmap(node, bufferWidth, bufferHeight)
+ .createGraphicBufferHandle();
}
/**
@@ -399,7 +409,7 @@ public class RecentsTransitionHelper {
*/
private static AppTransitionAnimationSpec composeAnimationSpec(TaskStackView stackView,
TaskView taskView, TaskViewTransform transform, boolean addHeaderBitmap) {
- Bitmap b = null;
+ GraphicBuffer b = null;
if (addHeaderBitmap) {
b = composeHeaderBitmap(taskView, transform);
if (b == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index d01bba86636f..9e2ec571faa8 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -832,7 +832,10 @@ public class DividerView extends FrameLayout implements OnTouchListener,
.setDuration(animDuration)
.start();
mAdjustedForIme = adjustedForIme;
- if (mHomeStackResizable && adjustedForIme) {
+
+ // Only get new position if home stack is resizable, ime is open and not minimized
+ // (including the animation)
+ if (mHomeStackResizable && adjustedForIme && !mIsInMinimizeInteraction) {
mDividerPositionBeforeMinimized = getCurrentPosition();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index b4822ca76065..ab41485793a1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -294,8 +294,8 @@ public class SignalClusterView extends LinearLayout implements NetworkController
mWifiStrengthId = statusIcon.icon;
mWifiBadgeId = statusIcon.iconOverlay;
mWifiDescription = statusIcon.contentDescription;
- mWifiIn = activityIn && mActivityEnabled;
- mWifiOut = activityOut && mActivityEnabled;
+ mWifiIn = activityIn && mActivityEnabled && mWifiVisible;
+ mWifiOut = activityOut && mActivityEnabled && mWifiVisible;
apply();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index c7fbbf956c68..85475b60902f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -179,6 +179,10 @@ public class StatusBarIconView extends AnimatedImageView {
mIconScale = (float)imageBounds / (float)outerBounds;
}
+ public float getIconScaleFullyDark() {
+ return (float) mStatusBarIconDrawingSizeDark / mStatusBarIconDrawingSize;
+ }
+
public float getIconScale() {
return mIconScale;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 9000eb4655d1..f94bb0cdd4f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -267,6 +267,9 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
boolean forceOverflow = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex
&& iconState.iconAppearAmount > 0.0f || i >= maxVisibleIcons;
boolean noOverflowAfter = i == childCount - 1;
+ float drawingScale = mDark && view instanceof StatusBarIconView
+ ? ((StatusBarIconView) view).getIconScaleFullyDark()
+ : 1f;
if (mOpenedAmount != 0.0f) {
noOverflowAfter = noOverflowAfter && !hasAmbient && !forceOverflow;
}
@@ -303,7 +306,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
visualOverflowStart += mVisualOverflowAdaption * (1f - mOpenedAmount);
}
}
- translationX += iconState.iconAppearAmount * view.getWidth();
+ translationX += iconState.iconAppearAmount * view.getWidth() * drawingScale;
}
if (firstOverflowIndex != -1) {
int numDots = 1;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
index e80d3b3a6409..0fd244527540 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -36,11 +36,13 @@ import android.service.notification.Condition;
import android.service.notification.IConditionListener;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeConfig.ZenRule;
+import android.support.annotation.VisibleForTesting;
import android.util.Log;
import android.util.Slog;
import com.android.systemui.qs.GlobalSetting;
import com.android.systemui.settings.CurrentUserTracker;
+import com.android.systemui.util.Utils;
import java.util.ArrayList;
import java.util.LinkedHashMap;
@@ -169,45 +171,32 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode
}
private void fireNextAlarmChanged() {
- for (Callback cb : mCallbacks) {
- cb.onNextAlarmChanged();
- }
+ Utils.safeForeach(mCallbacks, c -> c.onNextAlarmChanged());
}
private void fireEffectsSuppressorChanged() {
- for (Callback cb : mCallbacks) {
- cb.onEffectsSupressorChanged();
- }
+ Utils.safeForeach(mCallbacks, c -> c.onEffectsSupressorChanged());
}
private void fireZenChanged(int zen) {
- for (Callback cb : mCallbacks) {
- cb.onZenChanged(zen);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onZenChanged(zen));
}
private void fireZenAvailableChanged(boolean available) {
- for (Callback cb : mCallbacks) {
- cb.onZenAvailableChanged(available);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onZenAvailableChanged(available));
}
private void fireConditionsChanged(Condition[] conditions) {
- for (Callback cb : mCallbacks) {
- cb.onConditionsChanged(conditions);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onConditionsChanged(conditions));
}
private void fireManualRuleChanged(ZenRule rule) {
- for (Callback cb : mCallbacks) {
- cb.onManualRuleChanged(rule);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onManualRuleChanged(rule));
}
- private void fireConfigChanged(ZenModeConfig config) {
- for (Callback cb : mCallbacks) {
- cb.onConfigChanged(config);
- }
+ @VisibleForTesting
+ protected void fireConfigChanged(ZenModeConfig config) {
+ Utils.safeForeach(mCallbacks, c -> c.onConfigChanged(config));
}
private void updateConditions(Condition[] conditions) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
index 0dbd1d6cc74a..ff06b5b33a05 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
@@ -300,7 +300,7 @@ public class NotificationChildrenContainer extends ViewGroup {
mNotificationHeaderWrapper.notifyContentUpdated(mContainingNotification);
recreateLowPriorityHeader(builder);
recreateAmbientHeader(builder);
- resetHeaderVisibilityIfNeeded(mNotificationHeader, calculateDesiredHeader());
+ updateHeaderVisibility(false /* animate */);
updateChildrenHeaderAppearance();
}
@@ -833,6 +833,11 @@ public class NotificationChildrenContainer extends ViewGroup {
return mNotificationHeaderLowPriority;
}
+ @VisibleForTesting
+ public ViewGroup getCurrentHeaderView() {
+ return mCurrentHeader;
+ }
+
public void notifyShowAmbientChanged() {
updateHeaderVisibility(false);
}
@@ -869,7 +874,12 @@ public class NotificationChildrenContainer extends ViewGroup {
desiredHeader.setVisibility(VISIBLE);
}
if (currentHeader != null) {
- getWrapperForView(currentHeader).setVisible(false);
+ // Wrapper can be null if we were a low priority notification
+ // and just destroyed it by calling setIsLowPriority(false)
+ NotificationViewWrapper wrapper = getWrapperForView(currentHeader);
+ if (wrapper != null) {
+ wrapper.setVisible(false);
+ }
currentHeader.setVisibility(INVISIBLE);
}
}
@@ -878,7 +888,7 @@ public class NotificationChildrenContainer extends ViewGroup {
resetHeaderVisibilityIfNeeded(mNotificationHeaderAmbient, desiredHeader);
resetHeaderVisibilityIfNeeded(mNotificationHeaderLowPriority, desiredHeader);
- mCurrentHeader = currentHeader;
+ mCurrentHeader = desiredHeader;
}
private void resetHeaderVisibilityIfNeeded(View header, View desiredHeader) {
diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java
new file mode 100644
index 000000000000..f4aebae7bdaf
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java
@@ -0,0 +1,31 @@
+/*
+ * 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.systemui.util;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+public class Utils {
+
+ /**
+ * Allows lambda iteration over a list. It is done in reverse order so it is safe
+ * to add or remove items during the iteration.
+ */
+ public static <T> void safeForeach(List<T> list, Consumer<T> c) {
+ for (int i = list.size() - 1; i >= 0; i--) {
+ c.accept(list.get(i));
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
index 51fcdbb92c81..ecdea4f442b2 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
@@ -57,7 +57,6 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Prefs;
import com.android.systemui.R;
-import com.android.systemui.R.string;
import com.android.systemui.statusbar.policy.ZenModeController;
import java.io.FileDescriptor;
@@ -294,11 +293,6 @@ public class ZenModePanel extends FrameLayout {
private void onAttach() {
setExpanded(true);
mAttached = true;
- for (int i = 0; i < mZenRadioGroupContent.getChildCount(); i++) {
- ConditionTag tag = getConditionTagAt(i);
- if (tag != null) tag.rb.setChecked(false);
- mZenRadioGroupContent.getChildAt(i).setTag(null);
- }
mAttachedZen = mController.getZen();
ZenRule manualRule = mController.getManualRule();
mExitCondition = manualRule != null ? manualRule.condition : null;
@@ -311,6 +305,7 @@ public class ZenModePanel extends FrameLayout {
setSessionExitCondition(copy(mExitCondition));
updateWidgets();
setRequestingConditions(!mHidden);
+ ensureSelection();
}
private void onDetach() {
@@ -366,9 +361,6 @@ public class ZenModePanel extends FrameLayout {
if (expanded == mExpanded) return;
if (DEBUG) Log.d(mTag, "setExpanded " + expanded);
mExpanded = expanded;
- if (mExpanded) {
- ensureSelection();
- }
updateWidgets();
fireExpanded();
}
@@ -464,7 +456,8 @@ public class ZenModePanel extends FrameLayout {
ActivityManager.getCurrentUser(), false);
return c;
}
- return null;
+ // If there is a manual rule, but it has no condition listed then it is forever.
+ return forever();
}
private void handleUpdateZen(int zen) {
@@ -491,6 +484,7 @@ public class ZenModePanel extends FrameLayout {
final ConditionTag tag = getConditionTagAt(i);
if (tag != null && sameConditionId(tag.condition, mExitCondition)) {
bind(exitCondition, mZenRadioGroupContent.getChildAt(i), i);
+ tag.rb.setChecked(true);
return;
}
}
@@ -498,6 +492,7 @@ public class ZenModePanel extends FrameLayout {
exitCondition.id)) {
bind(exitCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
COUNTDOWN_CONDITION_INDEX);
+ getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
new file mode 100644
index 000000000000..8124bf39328b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.systemui.statusbar.policy;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.os.Handler;
+import android.service.notification.ZenModeConfig;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.policy.ZenModeController.Callback;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public class ZenModeControllerImplTest extends SysuiTestCase {
+
+ private Callback mCallback;
+
+ @Test
+ public void testRemoveDuringCallback() {
+ ZenModeControllerImpl controller = new ZenModeControllerImpl(mContext, new Handler());
+ mCallback = new Callback() {
+ @Override
+ public void onConfigChanged(ZenModeConfig config) {
+ controller.removeCallback(mCallback);
+ }
+ };
+ controller.addCallback(mCallback);
+ Callback mockCallback = mock(Callback.class);
+ controller.addCallback(mockCallback);
+ controller.fireConfigChanged(null);
+ verify(mockCallback).onConfigChanged(eq(null));
+ }
+
+} \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
index e6c8815b9e21..2dd96b686996 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
@@ -60,4 +60,12 @@ public class NotificationChildrenContainerTest extends SysuiTestCase {
Assert.assertTrue(lowPriorityHeaderView.getParent() == null);
Assert.assertTrue(childrenContainer.getLowPriorityHeaderView() == null);
}
+
+ @Test
+ public void testRecreateNotificationHeader_hasHeader() {
+ NotificationChildrenContainer childrenContainer = mGroup.getChildrenContainer();
+ childrenContainer.recreateNotificationHeader(null);
+ Assert.assertNotNull("Children container must have a header after recreation",
+ childrenContainer.getCurrentHeaderView());
+ }
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 7abaf7ff9922..38b796b316de 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -51,6 +51,7 @@ import android.service.autofill.FillEventHistory.Event;
import android.service.autofill.FillResponse;
import android.service.autofill.IAutoFillService;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.LocalLog;
import android.util.Slog;
import android.util.SparseArray;
@@ -465,10 +466,17 @@ final class AutofillManagerServiceImpl {
if (sVerbose) Slog.v(TAG, "destroyLocked()");
final int numSessions = mSessions.size();
+ final ArraySet<RemoteFillService> remoteFillServices = new ArraySet<>(numSessions);
for (int i = 0; i < numSessions; i++) {
- mSessions.valueAt(i).destroyLocked();
+ final RemoteFillService remoteFillService = mSessions.valueAt(i).destroyLocked();
+ if (remoteFillService != null) {
+ remoteFillServices.add(remoteFillService);
+ }
}
mSessions.clear();
+ for (int i = 0; i < remoteFillServices.size(); i++) {
+ remoteFillServices.valueAt(i).destroy();
+ }
sendStateToClients(true);
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index b7d3d13809e8..980a7d41200f 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -1470,15 +1470,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- void destroyLocked() {
+ RemoteFillService destroyLocked() {
if (mDestroyed) {
- return;
+ return null;
}
- mRemoteFillService.destroy();
hideAllUiIfOwnedByMe();
mUi.clearCallback(this);
mDestroyed = true;
mMetricsLogger.action(MetricsEvent.AUTOFILL_SESSION_FINISHED, mPackageName);
+ return mRemoteFillService;
}
private void hideAllUiIfOwnedByMe() {
@@ -1502,8 +1502,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
+ id + " destroyed");
return;
}
- destroyLocked();
+ final RemoteFillService remoteFillService = destroyLocked();
mService.removeSessionLocked(id);
+ if (remoteFillService != null) {
+ remoteFillService.destroy();
+ }
}
private int getLastResponseIndex() {
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index 6502c012ef5b..68f8c1bb182f 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -41,14 +41,10 @@ option java_package com.android.server
# ---------------------------
# DeviceStorageMonitorService.java
# ---------------------------
-# The disk space free on the /data partition, in bytes
-2744 free_storage_changed (data|2|2)
-# Device low memory notification and disk space free on the /data partition, in bytes at that time
-2745 low_storage (data|2|2)
-# disk space free on the /data, /system, and /cache partitions in bytes
-2746 free_storage_left (data|2|2),(system|2|2),(cache|2|2)
-# file on cache partition was deleted
+# File on cache partition was deleted
2748 cache_file_deleted (path|3)
+# Storage volume state and usable space in bytes
+2749 storage_state (uuid|3),(old_state|1),(new_state|1),(usable|2),(total|2)
# ---------------------------
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index cffb158a3f21..35b452a12e64 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -3296,6 +3296,9 @@ class StorageManagerService extends IStorageManager.Stub
final StorageManager storage = mContext.getSystemService(StorageManager.class);
final StorageStatsManager stats = mContext.getSystemService(StorageStatsManager.class);
+ // Apps can't defy reserved space
+ flags &= ~StorageManager.FLAG_ALLOCATE_DEFY_RESERVED;
+
final boolean aggressive = (flags & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0;
if (aggressive) {
mContext.enforceCallingOrSelfPermission(
@@ -3306,24 +3309,31 @@ class StorageManagerService extends IStorageManager.Stub
try {
// In general, apps can allocate as much space as they want, except
// we never let them eat into either the minimum cache space or into
- // the low disk warning space.
+ // the low disk warning space. To avoid user confusion, this logic
+ // should be kept in sync with getFreeBytes().
final File path = storage.findPathForUuid(volumeUuid);
+
+ final long usable = path.getUsableSpace();
+ final long lowReserved = storage.getStorageLowBytes(path);
+ final long fullReserved = storage.getStorageFullBytes(path);
+
if (stats.isQuotaSupported(volumeUuid)) {
+ final long cacheTotal = stats.getCacheBytes(volumeUuid);
+ final long cacheReserved = storage.getStorageCacheBytes(path);
+ final long cacheClearable = Math.max(0, cacheTotal - cacheReserved);
+
if (aggressive) {
- return Math.max(0,
- stats.getFreeBytes(volumeUuid) - storage.getStorageFullBytes(path));
+ return Math.max(0, (usable + cacheTotal) - fullReserved);
} else {
- return Math.max(0,
- stats.getFreeBytes(volumeUuid) - storage.getStorageLowBytes(path)
- - storage.getStorageCacheBytes(path));
+ return Math.max(0, (usable + cacheClearable) - lowReserved);
}
} else {
// When we don't have fast quota information, we ignore cached
// data and only consider unused bytes.
if (aggressive) {
- return Math.max(0, path.getUsableSpace() - storage.getStorageFullBytes(path));
+ return Math.max(0, usable - fullReserved);
} else {
- return Math.max(0, path.getUsableSpace() - storage.getStorageLowBytes(path));
+ return Math.max(0, usable - lowReserved);
}
}
} catch (IOException e) {
@@ -3337,6 +3347,9 @@ class StorageManagerService extends IStorageManager.Stub
public void allocateBytes(String volumeUuid, long bytes, int flags) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ // Apps can't defy reserved space
+ flags &= ~StorageManager.FLAG_ALLOCATE_DEFY_RESERVED;
+
// This method call will enforce FLAG_ALLOCATE_AGGRESSIVE permissions so
// we don't have to enforce them locally
final long allocatableBytes = getAllocatableBytes(volumeUuid, flags);
@@ -3350,7 +3363,11 @@ class StorageManagerService extends IStorageManager.Stub
// Free up enough disk space to satisfy both the requested allocation
// and our low disk warning space.
final File path = storage.findPathForUuid(volumeUuid);
- bytes += storage.getStorageLowBytes(path);
+ if ((flags & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0) {
+ bytes += storage.getStorageFullBytes(path);
+ } else {
+ bytes += storage.getStorageLowBytes(path);
+ }
mPms.freeStorage(volumeUuid, bytes, flags);
} catch (IOException e) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index fbab26aa0339..68c92a865f70 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -8447,8 +8447,8 @@ public class ActivityManagerService extends IActivityManager.Stub
synchronized (mPidsSelfLocked) {
proc = mPidsSelfLocked.get(callingPid);
}
- if (proc != null && proc.curProcState
- < ActivityManager.PROCESS_STATE_RECEIVER) {
+ if (proc != null &&
+ !ActivityManager.isProcStateBackground(proc.curProcState)) {
// Whoever is instigating this is in the foreground, so we will allow it
// to go through.
return ActivityManager.APP_START_MODE_NORMAL;
@@ -13545,7 +13545,9 @@ public class ActivityManagerService extends IActivityManager.Stub
return;
}
if (pr.hasTopUi != hasTopUi) {
- Slog.i(TAG, "Setting hasTopUi=" + hasTopUi + " for pid=" + pid);
+ if (DEBUG_OOM_ADJ) {
+ Slog.d(TAG, "Setting hasTopUi=" + hasTopUi + " for pid=" + pid);
+ }
pr.hasTopUi = hasTopUi;
changed = true;
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 5636e197aaee..9698a8fa91fd 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -130,6 +130,7 @@ import android.content.pm.ApplicationInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
@@ -1419,19 +1420,17 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
break;
case ANIM_THUMBNAIL_SCALE_UP:
case ANIM_THUMBNAIL_SCALE_DOWN:
- boolean scaleUp = (animationType == ANIM_THUMBNAIL_SCALE_UP);
- service.mWindowManager.overridePendingAppTransitionThumb(
- pendingOptions.getThumbnail(),
+ final boolean scaleUp = (animationType == ANIM_THUMBNAIL_SCALE_UP);
+ final GraphicBuffer buffer = pendingOptions.getThumbnail();
+ service.mWindowManager.overridePendingAppTransitionThumb(buffer,
pendingOptions.getStartX(), pendingOptions.getStartY(),
pendingOptions.getOnAnimationStartListener(),
scaleUp);
if (intent.getSourceBounds() == null) {
intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
pendingOptions.getStartY(),
- pendingOptions.getStartX()
- + pendingOptions.getThumbnail().getWidth(),
- pendingOptions.getStartY()
- + pendingOptions.getThumbnail().getHeight()));
+ pendingOptions.getStartX() + buffer.getWidth(),
+ pendingOptions.getStartY() + buffer.getHeight()));
}
break;
case ANIM_THUMBNAIL_ASPECT_SCALE_UP:
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 93e1ab462945..9db957c427f0 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -244,7 +244,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
static final int REMOVE_TASK_MODE_MOVING = 1;
// Similar to {@link #REMOVE_TASK_MODE_MOVING} and the task will be added to the top of its new
// stack and the new stack will be on top of all stacks.
- private static final int REMOVE_TASK_MODE_MOVING_TO_TOP = 2;
+ static final int REMOVE_TASK_MODE_MOVING_TO_TOP = 2;
// The height/width divide used when fitting a task within a bounds with method
// {@link #fitWithinBounds}.
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index e180aefcd11a..e828d38ef249 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2989,8 +2989,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Calculate the default bounds (don't use existing stack bounds as we may have just created
// the stack, and schedule the start of the animation into PiP (the bounds animator that
// is triggered by this is posted on another thread)
- final Rect destBounds = stack.getPictureInPictureBounds(aspectRatio,
- false /* useExistingStackBounds */);
+ final Rect destBounds = stack.getDefaultPictureInPictureBounds(aspectRatio);
+
stack.animateResizePinnedStack(sourceHintBounds, destBounds, -1 /* animationDuration */,
true /* fromFullscreen */);
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 243906260593..9f29296c251e 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -87,6 +87,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
implements PowerManagerInternal.LowPowerModeListener,
BatteryStatsImpl.PlatformIdleStateCallback {
static final String TAG = "BatteryStatsService";
+ static final boolean DBG = false;
/**
* How long to wait on an individual subsystem to return its stats.
@@ -152,11 +153,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub
case MSG_WRITE_TO_DISK:
updateExternalStatsSync("write", UPDATE_ALL);
- Slog.d(TAG, "begin writeAsyncLocked");
+ if (DBG) Slog.d(TAG, "begin writeAsyncLocked");
synchronized (mStats) {
mStats.writeAsyncLocked();
}
- Slog.d(TAG, "end writeAsyncLocked");
+ if (DBG) Slog.d(TAG, "end writeAsyncLocked");
break;
}
}
@@ -196,7 +197,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
@Override
public String getPlatformLowPowerStats() {
- Slog.d(TAG, "begin getPlatformLowPowerStats");
+ if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
try {
mUtf8BufferStat.clear();
mUtf16BufferStat.clear();
@@ -212,7 +213,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
mUtf16BufferStat.flip();
return mUtf16BufferStat.toString();
} finally {
- Slog.d(TAG, "end getPlatformLowPowerStats");
+ if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats");
}
}
@@ -561,11 +562,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub
public void noteScreenState(int state) {
enforceCallingPermission();
- Slog.d(TAG, "begin noteScreenState");
+ if (DBG) Slog.d(TAG, "begin noteScreenState");
synchronized (mStats) {
mStats.noteScreenStateLocked(state);
}
- Slog.d(TAG, "end noteScreenState");
+ if (DBG) Slog.d(TAG, "end noteScreenState");
}
public void noteScreenBrightness(int brightness) {
@@ -718,11 +719,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub
public void noteStartCamera(int uid) {
enforceCallingPermission();
- Slog.d(TAG, "begin noteStartCamera");
+ if (DBG) Slog.d(TAG, "begin noteStartCamera");
synchronized (mStats) {
mStats.noteCameraOnLocked(uid);
}
- Slog.d(TAG, "end noteStartCamera");
+ if (DBG) Slog.d(TAG, "end noteStartCamera");
}
public void noteStopCamera(int uid) {
@@ -944,10 +945,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
@Override
- public void noteBleScanStarted(WorkSource ws) {
+ public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) {
enforceCallingPermission();
synchronized (mStats) {
- mStats.noteBluetoothScanStartedFromSourceLocked(ws);
+ mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized);
}
}
@@ -1342,23 +1343,23 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
}
}
- Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
+ if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
synchronized (mStats) {
mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
if (writeData) {
mStats.writeAsyncLocked();
}
}
- Slog.d(TAG, "end dumpCheckinLocked");
+ if (DBG) Slog.d(TAG, "end dumpCheckinLocked");
} else {
- Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
+ if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
synchronized (mStats) {
mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
if (writeData) {
mStats.writeAsyncLocked();
}
}
- Slog.d(TAG, "end dumpLocked");
+ if (DBG) Slog.d(TAG, "end dumpLocked");
}
}
@@ -1480,11 +1481,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub
SynchronousResultReceiver bluetoothReceiver = null;
SynchronousResultReceiver modemReceiver = null;
- Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
+ if (DBG) Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
synchronized (mExternalStatsLock) {
if (mContext == null) {
// Don't do any work yet.
- Slog.d(TAG, "end updateExternalStatsSync");
+ if (DBG) Slog.d(TAG, "end updateExternalStatsSync");
return;
}
@@ -1583,7 +1584,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
}
}
- Slog.d(TAG, "end updateExternalStatsSync");
+ if (DBG) Slog.d(TAG, "end updateExternalStatsSync");
}
/**
@@ -1603,7 +1604,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
return getHealthStatsForUidLocked(requestUid);
}
} catch (Exception ex) {
- Slog.d(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
+ Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
throw ex;
} finally {
Binder.restoreCallingIdentity(ident);
@@ -1633,7 +1634,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
return results;
}
} catch (Exception ex) {
- Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
+ if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
+ Arrays.toString(requestUids) + ") i=" + i, ex);
throw ex;
} finally {
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index 144eb11cbf85..2e0ec0b361e2 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -97,7 +97,7 @@ class KeyguardController {
mKeyguardShowing = showing;
dismissDockedStackIfNeeded();
if (showing) {
- mKeyguardGoingAway = false;
+ setKeyguardGoingAway(false);
mDismissalRequested = false;
}
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
@@ -114,7 +114,7 @@ class KeyguardController {
if (mKeyguardShowing) {
mWindowManager.deferSurfaceLayout();
try {
- mKeyguardGoingAway = true;
+ setKeyguardGoingAway(true);
mWindowManager.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY,
false /* alwaysKeepCurrent */, convertTransitFlags(flags),
false /* forceOverride */);
@@ -139,6 +139,11 @@ class KeyguardController {
mWindowManager.dismissKeyguard(callback);
}
+ private void setKeyguardGoingAway(boolean keyguardGoingAway) {
+ mKeyguardGoingAway = keyguardGoingAway;
+ mWindowManager.setKeyguardGoingAway(keyguardGoingAway);
+ }
+
private void failCallback(IKeyguardDismissCallback callback) {
try {
callback.onDismissError();
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index 702bf92c65f8..2010c24000e8 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -44,9 +44,9 @@ class PinnedActivityStack extends ActivityStack<PinnedStackWindowController>
return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds);
}
- Rect getPictureInPictureBounds(float aspectRatio, boolean useExistingStackBounds) {
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
return getWindowContainerController().getPictureInPictureBounds(aspectRatio,
- useExistingStackBounds);
+ null /* currentStackBounds */);
}
void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration,
diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java
index deb3b287d7aa..39aed7cf3d67 100644
--- a/services/core/java/com/android/server/am/ProcessStatsService.java
+++ b/services/core/java/com/android/server/am/ProcessStatsService.java
@@ -233,7 +233,8 @@ public final class ProcessStatsService extends IProcessStats.Stub {
updateFile();
}
mLastWriteTime = SystemClock.uptimeMillis();
- Slog.i(TAG, "Prepared write state in " + (SystemClock.uptimeMillis()-now) + "ms");
+ if (DEBUG) Slog.d(TAG, "Prepared write state in "
+ + (SystemClock.uptimeMillis()-now) + "ms");
if (!sync) {
BackgroundThread.getHandler().post(new Runnable() {
@Override public void run() {
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 7eec945a6cbb..e81e6d7334b3 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -115,6 +115,7 @@ import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.STARTING_WINDOW_SHOWN;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING;
+import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING_TO_TOP;
import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
@@ -673,8 +674,11 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta
mWindowContainerController.reparent(toStack.getWindowContainerController(), position,
moveStackMode == REPARENT_MOVE_STACK_TO_FRONT);
+ final boolean moveStackToFront = moveStackMode == REPARENT_MOVE_STACK_TO_FRONT
+ || (moveStackMode == REPARENT_KEEP_STACK_AT_FRONT && (wasFocused || wasFront));
// Move the task
- sourceStack.removeTask(this, reason, REMOVE_TASK_MODE_MOVING);
+ sourceStack.removeTask(this, reason, moveStackToFront
+ ? REMOVE_TASK_MODE_MOVING_TO_TOP : REMOVE_TASK_MODE_MOVING);
toStack.addTask(this, position, false /* schedulePictureInPictureModeChange */, reason);
if (schedulePictureInPictureModeChange) {
@@ -693,8 +697,6 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta
// If the task had focus before (or we're requested to move focus), move focus to the
// new stack by moving the stack to the front.
- final boolean moveStackToFront = moveStackMode == REPARENT_MOVE_STACK_TO_FRONT
- || (moveStackMode == REPARENT_KEEP_STACK_AT_FRONT && (wasFocused || wasFront));
if (r != null) {
toStack.moveToFrontAndResumeStateIfNeeded(r, moveStackToFront, wasResumed,
wasPaused, reason);
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index b8d633fc666f..73a365b0da72 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -221,7 +221,9 @@ abstract public class ManagedServices {
restoredSettingName(element),
newValue,
userid);
- updateSettingsAccordingToInstalledServices(element, userid);
+ if (mConfig.secureSettingName.equals(element)) {
+ updateSettingsAccordingToInstalledServices(element, userid);
+ }
rebuildRestoredPackages();
}
}
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index e6e461744094..c95b5c557b32 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -395,10 +395,11 @@ public class Installer extends SystemService {
}
}
- public void freeCache(String uuid, long freeStorageSize, int flags) throws InstallerException {
+ public void freeCache(String uuid, long targetFreeBytes, long cacheReservedBytes, int flags)
+ throws InstallerException {
if (!checkBeforeRemote()) return;
try {
- mInstalld.freeCache(uuid, freeStorageSize, flags);
+ mInstalld.freeCache(uuid, targetFreeBytes, cacheReservedBytes, flags);
} catch (Exception e) {
throw InstallerException.from(e);
}
diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java
index b1659841d5ac..211a1c9f3edf 100644
--- a/services/core/java/com/android/server/pm/InstantAppRegistry.java
+++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java
@@ -21,6 +21,7 @@ import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.content.Intent;
import android.content.pm.InstantAppInfo;
+import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
@@ -32,6 +33,8 @@ import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.UserHandle;
+import android.os.storage.StorageManager;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.AtomicFile;
@@ -76,7 +79,16 @@ class InstantAppRegistry {
private static final String LOG_TAG = "InstantAppRegistry";
- private static final long DEFAULT_UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS =
+ static final long DEFAULT_INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD =
+ DEBUG ? 30 * 1000L /* thirty seconds */ : 7 * 24 * 60 * 60 * 1000L; /* one week */
+
+ private static final long DEFAULT_INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD =
+ DEBUG ? 60 * 1000L /* one min */ : 6 * 30 * 24 * 60 * 60 * 1000L; /* six months */
+
+ static final long DEFAULT_UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD =
+ DEBUG ? 30 * 1000L /* thirty seconds */ : 7 * 24 * 60 * 60 * 1000L; /* one week */
+
+ private static final long DEFAULT_UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD =
DEBUG ? 60 * 1000L /* one min */ : 6 * 30 * 24 * 60 * 60 * 1000L; /* six months */
private static final String INSTANT_APPS_FOLDER = "instant";
@@ -535,46 +547,195 @@ class InstantAppRegistry {
}
}
- public void pruneInstantAppsLPw() {
- // For now we prune only state for uninstalled instant apps
- final long maxCacheDurationMillis = Settings.Global.getLong(
+ void pruneInstantApps() {
+ final long maxInstalledCacheDuration = Settings.Global.getLong(
mService.mContext.getContentResolver(),
- Settings.Global.UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS,
- DEFAULT_UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS);
-
- for (int userId : UserManagerService.getInstance().getUserIds()) {
- // Prune in-memory state
- removeUninstalledInstantAppStateLPw((UninstalledInstantAppState state) -> {
- final long elapsedCachingMillis = System.currentTimeMillis() - state.mTimestamp;
- return (elapsedCachingMillis > maxCacheDurationMillis);
- }, userId);
-
- // Prune on-disk state
- File instantAppsDir = getInstantApplicationsDir(userId);
- if (!instantAppsDir.exists()) {
- continue;
+ Settings.Global.INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ DEFAULT_INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD);
+
+ final long maxUninstalledCacheDuration = Settings.Global.getLong(
+ mService.mContext.getContentResolver(),
+ Settings.Global.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ DEFAULT_UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD);
+
+ try {
+ pruneInstantApps(Long.MAX_VALUE,
+ maxInstalledCacheDuration, maxUninstalledCacheDuration);
+ } catch (IOException e) {
+ Slog.e(LOG_TAG, "Error pruning installed and uninstalled instant apps", e);
+ }
+ }
+
+ boolean pruneInstalledInstantApps(long neededSpace, long maxInstalledCacheDuration) {
+ try {
+ return pruneInstantApps(neededSpace, maxInstalledCacheDuration, Long.MAX_VALUE);
+ } catch (IOException e) {
+ Slog.e(LOG_TAG, "Error pruning installed instant apps", e);
+ return false;
+ }
+ }
+
+ boolean pruneUninstalledInstantApps(long neededSpace, long maxUninstalledCacheDuration) {
+ try {
+ return pruneInstantApps(neededSpace, Long.MAX_VALUE, maxUninstalledCacheDuration);
+ } catch (IOException e) {
+ Slog.e(LOG_TAG, "Error pruning uninstalled instant apps", e);
+ return false;
+ }
+ }
+
+ /**
+ * Prunes instant apps until there is enough <code>neededSpace</code>. Both
+ * installed and uninstalled instant apps are pruned that are older than
+ * <code>maxInstalledCacheDuration</code> and <code>maxUninstalledCacheDuration</code>
+ * respectively. All times are in milliseconds.
+ *
+ * @param neededSpace The space to ensure is free.
+ * @param maxInstalledCacheDuration The max duration for caching installed apps in millis.
+ * @param maxUninstalledCacheDuration The max duration for caching uninstalled apps in millis.
+ * @return Whether enough space was freed.
+ *
+ * @throws IOException
+ */
+ private boolean pruneInstantApps(long neededSpace, long maxInstalledCacheDuration,
+ long maxUninstalledCacheDuration) throws IOException {
+ final StorageManager storage = mService.mContext.getSystemService(StorageManager.class);
+ final File file = storage.findPathForUuid(StorageManager.UUID_PRIVATE_INTERNAL);
+
+ if (file.getUsableSpace() >= neededSpace) {
+ return true;
+ }
+
+ List<String> packagesToDelete = null;
+
+ final int[] allUsers;
+ final long now = System.currentTimeMillis();
+
+ // Prune first installed instant apps
+ synchronized (mService.mPackages) {
+ allUsers = PackageManagerService.sUserManager.getUserIds();
+
+ final int packageCount = mService.mPackages.size();
+ for (int i = 0; i < packageCount; i++) {
+ final PackageParser.Package pkg = mService.mPackages.valueAt(i);
+ if (now - pkg.getLatestPackageUseTimeInMills() < maxInstalledCacheDuration) {
+ continue;
+ }
+ if (!(pkg.mExtras instanceof PackageSetting)) {
+ continue;
+ }
+ final PackageSetting ps = (PackageSetting) pkg.mExtras;
+ boolean installedOnlyAsInstantApp = false;
+ for (int userId : allUsers) {
+ if (ps.getInstalled(userId)) {
+ if (ps.getInstantApp(userId)) {
+ installedOnlyAsInstantApp = true;
+ } else {
+ installedOnlyAsInstantApp = false;
+ break;
+ }
+ }
+ }
+ if (installedOnlyAsInstantApp) {
+ if (packagesToDelete == null) {
+ packagesToDelete = new ArrayList<>();
+ }
+ packagesToDelete.add(pkg.packageName);
+ }
}
- File[] files = instantAppsDir.listFiles();
- if (files == null) {
- continue;
+
+ if (packagesToDelete != null) {
+ packagesToDelete.sort((String lhs, String rhs) -> {
+ final PackageParser.Package lhsPkg = mService.mPackages.get(lhs);
+ final PackageParser.Package rhsPkg = mService.mPackages.get(rhs);
+ if (lhsPkg == null && rhsPkg == null) {
+ return 0;
+ } else if (lhsPkg == null) {
+ return -1;
+ } else if (rhsPkg == null) {
+ return 1;
+ } else {
+ if (lhsPkg.getLatestPackageUseTimeInMills() >
+ rhsPkg.getLatestPackageUseTimeInMills()) {
+ return 1;
+ } else if (lhsPkg.getLatestPackageUseTimeInMills() <
+ rhsPkg.getLatestPackageUseTimeInMills()) {
+ return -1;
+ } else {
+ if (lhsPkg.mExtras instanceof PackageSetting
+ && rhsPkg.mExtras instanceof PackageSetting) {
+ final PackageSetting lhsPs = (PackageSetting) lhsPkg.mExtras;
+ final PackageSetting rhsPs = (PackageSetting) rhsPkg.mExtras;
+ if (lhsPs.firstInstallTime > rhsPs.firstInstallTime) {
+ return 1;
+ } else {
+ return -1;
+ }
+ } else {
+ return 0;
+ }
+ }
+ }
+ });
}
- for (File instantDir : files) {
- if (!instantDir.isDirectory()) {
- continue;
+ }
+
+ if (packagesToDelete != null) {
+ final int packageCount = packagesToDelete.size();
+ for (int i = 0; i < packageCount; i++) {
+ final String packageToDelete = packagesToDelete.get(i);
+ if (mService.deletePackageX(packageToDelete, PackageManager.VERSION_CODE_HIGHEST,
+ UserHandle.USER_SYSTEM, PackageManager.DELETE_ALL_USERS)
+ == PackageManager.DELETE_SUCCEEDED) {
+ if (file.getUsableSpace() >= neededSpace) {
+ return true;
+ }
}
+ }
+ }
- File metadataFile = new File(instantDir, INSTANT_APP_METADATA_FILE);
- if (!metadataFile.exists()) {
+ // Prune uninstalled instant apps
+ synchronized (mService.mPackages) {
+ // TODO: Track last used time for uninstalled instant apps for better pruning
+ for (int userId : UserManagerService.getInstance().getUserIds()) {
+ // Prune in-memory state
+ removeUninstalledInstantAppStateLPw((UninstalledInstantAppState state) -> {
+ final long elapsedCachingMillis = System.currentTimeMillis() - state.mTimestamp;
+ return (elapsedCachingMillis > maxUninstalledCacheDuration);
+ }, userId);
+
+ // Prune on-disk state
+ File instantAppsDir = getInstantApplicationsDir(userId);
+ if (!instantAppsDir.exists()) {
+ continue;
+ }
+ File[] files = instantAppsDir.listFiles();
+ if (files == null) {
continue;
}
+ for (File instantDir : files) {
+ if (!instantDir.isDirectory()) {
+ continue;
+ }
+
+ File metadataFile = new File(instantDir, INSTANT_APP_METADATA_FILE);
+ if (!metadataFile.exists()) {
+ continue;
+ }
- final long elapsedCachingMillis = System.currentTimeMillis()
- - metadataFile.lastModified();
- if (elapsedCachingMillis > maxCacheDurationMillis) {
- deleteDir(instantDir);
+ final long elapsedCachingMillis = System.currentTimeMillis()
+ - metadataFile.lastModified();
+ if (elapsedCachingMillis > maxUninstalledCacheDuration) {
+ deleteDir(instantDir);
+ if (file.getUsableSpace() >= neededSpace) {
+ return true;
+ }
+ }
}
}
}
+
+ return false;
}
private @Nullable List<InstantAppInfo> getInstalledInstantApplicationsLPr(
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 782325a941b9..99eda862473b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -875,9 +875,9 @@ public class PackageManagerService extends IPackageManager.Stub
new ParallelPackageParserCallback();
public static final class SharedLibraryEntry {
- public final String path;
- public final String apk;
- public final SharedLibraryInfo info;
+ public final @Nullable String path;
+ public final @Nullable String apk;
+ public final @NonNull SharedLibraryInfo info;
SharedLibraryEntry(String _path, String _apk, String name, int version, int type,
String declaringPackageName, int declaringPackageVersionCode) {
@@ -1312,6 +1312,9 @@ public class PackageManagerService extends IPackageManager.Stub
// Delay time in millisecs
static final int BROADCAST_DELAY = 10 * 1000;
+ private static final long DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD =
+ 2 * 60 * 60 * 1000L; /* two hours */
+
static UserManagerService sUserManager;
// Stores a list of users whose package restrictions file needs to be updated
@@ -4155,13 +4158,13 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public void freeStorageAndNotify(final String volumeUuid, final long freeStorageSize,
- final IPackageDataObserver observer) {
+ final int storageFlags, final IPackageDataObserver observer) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CLEAR_APP_CACHE, null);
mHandler.post(() -> {
boolean success = false;
try {
- freeStorage(volumeUuid, freeStorageSize, 0);
+ freeStorage(volumeUuid, freeStorageSize, storageFlags);
success = true;
} catch (IOException e) {
Slog.w(TAG, e);
@@ -4178,13 +4181,13 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public void freeStorage(final String volumeUuid, final long freeStorageSize,
- final IntentSender pi) {
+ final int storageFlags, final IntentSender pi) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CLEAR_APP_CACHE, TAG);
mHandler.post(() -> {
boolean success = false;
try {
- freeStorage(volumeUuid, freeStorageSize, 0);
+ freeStorage(volumeUuid, freeStorageSize, storageFlags);
success = true;
} catch (IOException e) {
Slog.w(TAG, e);
@@ -4209,10 +4212,14 @@ public class PackageManagerService extends IPackageManager.Stub
if (file.getUsableSpace() >= bytes) return;
if (ENABLE_FREE_CACHE_V2) {
- final boolean aggressive = (storageFlags
- & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0;
final boolean internalVolume = Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL,
volumeUuid);
+ final boolean aggressive = (storageFlags
+ & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0;
+ final boolean defyReserved = (storageFlags
+ & StorageManager.FLAG_ALLOCATE_DEFY_RESERVED) != 0;
+ final long reservedBytes = (aggressive || defyReserved) ? 0
+ : storage.getStorageCacheBytes(file);
// 1. Pre-flight to determine if we have any chance to succeed
// 2. Consider preloaded data (after 1w honeymoon, unless aggressive)
@@ -4230,29 +4237,52 @@ public class PackageManagerService extends IPackageManager.Stub
// 4. Consider cached app data (above quotas)
try {
- mInstaller.freeCache(volumeUuid, bytes, Installer.FLAG_FREE_CACHE_V2);
+ mInstaller.freeCache(volumeUuid, bytes, reservedBytes,
+ Installer.FLAG_FREE_CACHE_V2);
} catch (InstallerException ignored) {
}
if (file.getUsableSpace() >= bytes) return;
- // 5. Consider shared libraries with refcount=0 and age>2h
+ // 5. Consider shared libraries with refcount=0 and age>min cache period
+ if (internalVolume && pruneUnusedStaticSharedLibraries(bytes,
+ android.provider.Settings.Global.getLong(mContext.getContentResolver(),
+ Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD,
+ DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD))) {
+ return;
+ }
+
// 6. Consider dexopt output (aggressive only)
- // 7. Consider ephemeral apps not used in last week
+ // TODO: Implement
+
+ // 7. Consider installed instant apps unused longer than min cache period
+ if (internalVolume && mInstantAppRegistry.pruneInstalledInstantApps(bytes,
+ android.provider.Settings.Global.getLong(mContext.getContentResolver(),
+ Global.INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ InstantAppRegistry.DEFAULT_INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD))) {
+ return;
+ }
// 8. Consider cached app data (below quotas)
try {
- mInstaller.freeCache(volumeUuid, bytes, Installer.FLAG_FREE_CACHE_V2
- | Installer.FLAG_FREE_CACHE_V2_DEFY_QUOTA);
+ mInstaller.freeCache(volumeUuid, bytes, reservedBytes,
+ Installer.FLAG_FREE_CACHE_V2 | Installer.FLAG_FREE_CACHE_V2_DEFY_QUOTA);
} catch (InstallerException ignored) {
}
if (file.getUsableSpace() >= bytes) return;
// 9. Consider DropBox entries
- // 10. Consider ephemeral cookies
+ // TODO: Implement
+ // 10. Consider instant meta-data (uninstalled apps) older that min cache period
+ if (internalVolume && mInstantAppRegistry.pruneUninstalledInstantApps(bytes,
+ android.provider.Settings.Global.getLong(mContext.getContentResolver(),
+ Global.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ InstantAppRegistry.DEFAULT_UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD))) {
+ return;
+ }
} else {
try {
- mInstaller.freeCache(volumeUuid, bytes, 0);
+ mInstaller.freeCache(volumeUuid, bytes, 0, 0);
} catch (InstallerException ignored) {
}
if (file.getUsableSpace() >= bytes) return;
@@ -4261,6 +4291,69 @@ public class PackageManagerService extends IPackageManager.Stub
throw new IOException("Failed to free " + bytes + " on storage device at " + file);
}
+ private boolean pruneUnusedStaticSharedLibraries(long neededSpace, long maxCachePeriod)
+ throws IOException {
+ final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final File volume = storage.findPathForUuid(StorageManager.UUID_PRIVATE_INTERNAL);
+
+ List<VersionedPackage> packagesToDelete = null;
+ final long now = System.currentTimeMillis();
+
+ synchronized (mPackages) {
+ final int[] allUsers = sUserManager.getUserIds();
+ final int libCount = mSharedLibraries.size();
+ for (int i = 0; i < libCount; i++) {
+ final SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.valueAt(i);
+ if (versionedLib == null) {
+ continue;
+ }
+ final int versionCount = versionedLib.size();
+ for (int j = 0; j < versionCount; j++) {
+ SharedLibraryInfo libInfo = versionedLib.valueAt(j).info;
+ // Skip packages that are not static shared libs.
+ if (!libInfo.isStatic()) {
+ break;
+ }
+ // Important: We skip static shared libs used for some user since
+ // in such a case we need to keep the APK on the device. The check for
+ // a lib being used for any user is performed by the uninstall call.
+ final VersionedPackage declaringPackage = libInfo.getDeclaringPackage();
+ // Resolve the package name - we use synthetic package names internally
+ final String internalPackageName = resolveInternalPackageNameLPr(
+ declaringPackage.getPackageName(), declaringPackage.getVersionCode());
+ final PackageSetting ps = mSettings.getPackageLPr(internalPackageName);
+ // Skip unused static shared libs cached less than the min period
+ // to prevent pruning a lib needed by a subsequently installed package.
+ if (ps == null || now - ps.lastUpdateTime < maxCachePeriod) {
+ continue;
+ }
+ if (packagesToDelete == null) {
+ packagesToDelete = new ArrayList<>();
+ }
+ packagesToDelete.add(new VersionedPackage(internalPackageName,
+ declaringPackage.getVersionCode()));
+ }
+ }
+ }
+
+ if (packagesToDelete != null) {
+ final int packageCount = packagesToDelete.size();
+ for (int i = 0; i < packageCount; i++) {
+ final VersionedPackage pkgToDelete = packagesToDelete.get(i);
+ // Delete the package synchronously (will fail of the lib used for any user).
+ if (deletePackageX(pkgToDelete.getPackageName(), pkgToDelete.getVersionCode(),
+ UserHandle.USER_SYSTEM, PackageManager.DELETE_ALL_USERS)
+ == PackageManager.DELETE_SUCCEEDED) {
+ if (volume.getUsableSpace() >= neededSpace) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
/**
* Update given flags based on encryption status of current user.
*/
@@ -10650,8 +10743,7 @@ public class PackageManagerService extends IPackageManager.Stub
final int versionCount = versionedLib.size();
for (int i = 0; i < versionCount; i++) {
SharedLibraryInfo libInfo = versionedLib.valueAt(i).info;
- // TODO: We will change version code to long, so in the new API it is long
- final int libVersionCode = (int) libInfo.getDeclaringPackage()
+ final int libVersionCode = libInfo.getDeclaringPackage()
.getVersionCode();
if (libInfo.getVersion() < pkg.staticSharedLibVersion) {
minVersionCode = Math.max(minVersionCode, libVersionCode + 1);
@@ -15494,7 +15586,7 @@ public class PackageManagerService extends IPackageManager.Stub
origin.resolvedPath, isForwardLocked(), packageAbiOverride);
try {
- mInstaller.freeCache(null, sizeBytes + lowThreshold, 0);
+ mInstaller.freeCache(null, sizeBytes + lowThreshold, 0, 0);
pkgLite = mContainerService.getMinimalPackageInfo(origin.resolvedPath,
installFlags, packageAbiOverride);
} catch (InstallerException e) {
@@ -18488,7 +18580,7 @@ public class PackageManagerService extends IPackageManager.Stub
* persisting settings for later use
* sending a broadcast if necessary
*/
- private int deletePackageX(String packageName, int versionCode, int userId, int deleteFlags) {
+ int deletePackageX(String packageName, int versionCode, int userId, int deleteFlags) {
final PackageRemovedInfo info = new PackageRemovedInfo(this);
final boolean res;
@@ -18531,7 +18623,7 @@ public class PackageManagerService extends IPackageManager.Stub
pkg.staticSharedLibVersion);
if (libEntry != null) {
for (int currUserId : allUsers) {
- if (userId != UserHandle.USER_ALL && userId != currUserId) {
+ if (removeUser != UserHandle.USER_ALL && removeUser != currUserId) {
continue;
}
List<VersionedPackage> libClientPackages = getPackagesUsingSharedLibraryLPr(
@@ -24273,9 +24365,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
@Override
public void pruneInstantApps() {
- synchronized (mPackages) {
- mInstantAppRegistry.pruneInstantAppsLPw();
- }
+ mInstantAppRegistry.pruneInstantApps();
}
@Override
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 908e51711b11..e3bc91971b06 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -60,7 +60,6 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_ST
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT;
@@ -1128,16 +1127,25 @@ public class PhoneWindowManager implements WindowManagerPolicy {
+ ", mOrientationSensorEnabled=" + mOrientationSensorEnabled
+ ", mKeyguardDrawComplete=" + mKeyguardDrawComplete
+ ", mWindowManagerDrawComplete=" + mWindowManagerDrawComplete);
+ final boolean keyguardGoingAway = mWindowManagerInternal.isKeyguardGoingAway();
+
boolean disable = true;
// Note: We postpone the rotating of the screen until the keyguard as well as the
- // window manager have reported a draw complete.
- if (mScreenOnEarly && mAwake &&
- mKeyguardDrawComplete && mWindowManagerDrawComplete) {
+ // window manager have reported a draw complete or the keyguard is going away in dismiss
+ // mode.
+ if (mScreenOnEarly && mAwake && ((mKeyguardDrawComplete && mWindowManagerDrawComplete)
+ || keyguardGoingAway)) {
if (needSensorRunningLp()) {
disable = false;
//enable listener if not already enabled
if (!mOrientationSensorEnabled) {
- mOrientationListener.enable();
+ // Don't clear the current sensor orientation if the keyguard is going away in
+ // dismiss mode. This allows window manager to use the last sensor reading to
+ // determine the orientation vs. falling back to the last known orientation if
+ // the sensor reading was cleared which can cause it to relaunch the app that
+ // will show in the wrong orientation first before correcting leading to app
+ // launch delays.
+ mOrientationListener.enable(!keyguardGoingAway /* clearCurrentRotation */);
if(localLOGV) Slog.v(TAG, "Enabling listeners");
mOrientationSensorEnabled = true;
}
diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java
index 8ef0acbd3808..64f64c0d45d6 100644
--- a/services/core/java/com/android/server/policy/WindowOrientationListener.java
+++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java
@@ -109,24 +109,37 @@ public abstract class WindowOrientationListener {
* {@link #onProposedRotationChanged(int)} when the device orientation changes.
*/
public void enable() {
+ enable(true /* clearCurrentRotation */);
+ }
+
+ /**
+ * Enables the WindowOrientationListener so it will monitor the sensor and call
+ * {@link #onProposedRotationChanged(int)} when the device orientation changes.
+ *
+ * @param clearCurrentRotation True if the current proposed sensor rotation should be cleared as
+ * part of the reset.
+ */
+ public void enable(boolean clearCurrentRotation) {
synchronized (mLock) {
if (mSensor == null) {
Slog.w(TAG, "Cannot detect sensors. Not enabled");
return;
}
- if (mEnabled == false) {
- if (LOG) {
- Slog.d(TAG, "WindowOrientationListener enabled");
- }
- mOrientationJudge.resetLocked();
- if (mSensor.getType() == Sensor.TYPE_ACCELEROMETER) {
- mSensorManager.registerListener(
- mOrientationJudge, mSensor, mRate, DEFAULT_BATCH_LATENCY, mHandler);
- } else {
- mSensorManager.registerListener(mOrientationJudge, mSensor, mRate, mHandler);
- }
- mEnabled = true;
+ if (mEnabled) {
+ return;
}
+ if (LOG) {
+ Slog.d(TAG, "WindowOrientationListener enabled clearCurrentRotation="
+ + clearCurrentRotation);
+ }
+ mOrientationJudge.resetLocked(clearCurrentRotation);
+ if (mSensor.getType() == Sensor.TYPE_ACCELEROMETER) {
+ mSensorManager.registerListener(
+ mOrientationJudge, mSensor, mRate, DEFAULT_BATCH_LATENCY, mHandler);
+ } else {
+ mSensorManager.registerListener(mOrientationJudge, mSensor, mRate, mHandler);
+ }
+ mEnabled = true;
}
}
@@ -278,8 +291,11 @@ public abstract class WindowOrientationListener {
* Resets the state of the judge.
*
* Should only be called when holding WindowOrientationListener lock.
+ *
+ * @param clearCurrentRotation True if the current proposed sensor rotation should be
+ * cleared as part of the reset.
*/
- public abstract void resetLocked();
+ public abstract void resetLocked(boolean clearCurrentRotation);
/**
* Dumps internal state of the orientation judge.
@@ -602,7 +618,7 @@ public abstract class WindowOrientationListener {
if (LOG) {
Slog.v(TAG, "Resetting orientation listener.");
}
- resetLocked();
+ resetLocked(true /* clearCurrentRotation */);
skipSample = true;
} else {
final float alpha = timeDeltaMS / (FILTER_TIME_CONSTANT_MS + timeDeltaMS);
@@ -778,9 +794,11 @@ public abstract class WindowOrientationListener {
}
@Override
- public void resetLocked() {
+ public void resetLocked(boolean clearCurrentRotation) {
mLastFilteredTimestampNanos = Long.MIN_VALUE;
- mProposedRotation = -1;
+ if (clearCurrentRotation) {
+ mProposedRotation = -1;
+ }
mFlatTimestampNanos = Long.MIN_VALUE;
mFlat = false;
mSwingTimestampNanos = Long.MIN_VALUE;
@@ -1015,9 +1033,11 @@ public abstract class WindowOrientationListener {
}
@Override
- public void resetLocked() {
- mProposedRotation = -1;
- mDesiredRotation = -1;
+ public void resetLocked(boolean clearCurrentRotation) {
+ if (clearCurrentRotation) {
+ mProposedRotation = -1;
+ mDesiredRotation = -1;
+ }
mTouching = false;
mTouchEndedTimestampNanos = Long.MIN_VALUE;
unscheduleRotationEvaluationLocked();
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 1b4eaf548809..da90e5adf4c4 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -30,7 +30,7 @@ import java.io.PrintWriter;
*/
public class KeyguardServiceDelegate {
private static final String TAG = "KeyguardServiceDelegate";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private static final int SCREEN_STATE_OFF = 0;
private static final int SCREEN_STATE_TURNING_ON = 1;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index ed98d1cbc5b2..3b5db29de9e0 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -87,6 +87,7 @@ import com.android.server.LockGuard;
import com.android.server.RescueParty;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
+import com.android.server.UiThread;
import com.android.server.Watchdog;
import com.android.server.am.BatteryStatsService;
import com.android.server.lights.Light;
@@ -2729,9 +2730,9 @@ public final class PowerManagerService extends SystemService
};
// ShutdownThread must run on a looper capable of displaying the UI.
- Message msg = Message.obtain(mHandler, runnable);
+ Message msg = Message.obtain(UiThread.getHandler(), runnable);
msg.setAsynchronous(true);
- mHandler.sendMessage(msg);
+ UiThread.getHandler().sendMessage(msg);
// PowerManager.reboot() is documented not to return so just wait for the inevitable.
if (wait) {
diff --git a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
index fbc9e56fabf5..88b6d870afd7 100644
--- a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
+++ b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
@@ -16,71 +16,60 @@
package com.android.server.storage;
-import android.app.NotificationChannel;
-
-import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
-import com.android.internal.notification.SystemNotificationChannels;
-import com.android.internal.util.DumpUtils;
-import com.android.server.EventLogTags;
-import com.android.server.SystemService;
-import com.android.server.pm.InstructionSets;
+import android.annotation.WorkerThread;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.IPackageDataObserver;
-import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.net.TrafficStats;
import android.os.Binder;
import android.os.Environment;
import android.os.FileObserver;
import android.os.Handler;
import android.os.Message;
-import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.ShellCallback;
import android.os.ShellCommand;
-import android.os.StatFs;
-import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.storage.StorageManager;
-import android.provider.Settings;
-import android.text.format.Formatter;
-import android.util.EventLog;
+import android.os.storage.VolumeInfo;
+import android.text.format.DateUtils;
+import android.util.ArrayMap;
import android.util.Slog;
-import android.util.TimeUtils;
+
+import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.internal.notification.SystemNotificationChannels;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.EventLogTags;
+import com.android.server.IoThread;
+import com.android.server.SystemService;
+import com.android.server.pm.InstructionSets;
+import com.android.server.pm.PackageManagerService;
+
+import dalvik.system.VMRuntime;
import java.io.File;
import java.io.FileDescriptor;
+import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Objects;
+import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
-import dalvik.system.VMRuntime;
-
/**
- * This class implements a service to monitor the amount of disk
- * storage space on the device. If the free storage on device is less
- * than a tunable threshold value (a secure settings parameter;
- * default 10%) a low memory notification is displayed to alert the
- * user. If the user clicks on the low memory notification the
- * Application Manager application gets launched to let the user free
- * storage space.
- *
- * Event log events: A low memory event with the free storage on
- * device in bytes is logged to the event log when the device goes low
- * on storage space. The amount of free storage on the device is
- * periodically logged to the event log. The log interval is a secure
- * settings parameter with a default value of 12 hours. When the free
- * storage differential goes below a threshold (again a secure
- * settings parameter with a default value of 2MB), the free memory is
- * logged to the event log.
+ * Service that monitors and maintains free space on storage volumes.
+ * <p>
+ * As the free space on a volume nears the threshold defined by
+ * {@link StorageManager#getStorageLowBytes(File)}, this service will clear out
+ * cached data to keep the disk from entering this low state.
*/
public class DeviceStorageMonitorService extends SystemService {
- static final String TAG = "DeviceStorageMonitorService";
+ private static final String TAG = "DeviceStorageMonitorService";
/**
* Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
@@ -88,68 +77,75 @@ public class DeviceStorageMonitorService extends SystemService {
*/
public static final String EXTRA_SEQUENCE = "seq";
- // TODO: extend to watch and manage caches on all private volumes
+ private static final int MSG_CHECK = 1;
- static final boolean DEBUG = false;
- static final boolean localLOGV = false;
-
- static final int DEVICE_MEMORY_WHAT = 1;
- static final int FORCE_MEMORY_WHAT = 2;
- private static final int MONITOR_INTERVAL = 1; //in minutes
-
- private static final int DEFAULT_FREE_STORAGE_LOG_INTERVAL_IN_MINUTES = 12*60; //in minutes
- private static final long DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD = 2 * 1024 * 1024; // 2MB
- private static final long DEFAULT_CHECK_INTERVAL = MONITOR_INTERVAL*60*1000;
+ private static final long DEFAULT_LOG_DELTA_BYTES = 64 * TrafficStats.MB_IN_BYTES;
+ private static final long DEFAULT_CHECK_INTERVAL = DateUtils.MINUTE_IN_MILLIS;
// com.android.internal.R.string.low_internal_storage_view_text_no_boot
// hard codes 250MB in the message as the storage space required for the
// boot image.
- private static final long BOOT_IMAGE_STORAGE_REQUIREMENT = 250 * 1024 * 1024;
-
- private long mFreeMem; // on /data
- private long mFreeMemAfterLastCacheClear; // on /data
- private long mLastReportedFreeMem;
- private long mLastReportedFreeMemTime;
- boolean mLowMemFlag=false;
- private boolean mMemFullFlag=false;
- private final boolean mIsBootImageOnDisk;
- private final ContentResolver mResolver;
- private final long mTotalMemory; // on /data
- private final StatFs mDataFileStats;
- private final StatFs mSystemFileStats;
- private final StatFs mCacheFileStats;
-
- private static final File DATA_PATH = Environment.getDataDirectory();
- private static final File SYSTEM_PATH = Environment.getRootDirectory();
- private static final File CACHE_PATH = Environment.getDownloadCacheDirectory();
-
- private long mThreadStartTime = -1;
- boolean mUpdatesStopped;
- AtomicInteger mSeq = new AtomicInteger(1);
- boolean mClearSucceeded = false;
- boolean mClearingCache;
- private final Intent mStorageLowIntent;
- private final Intent mStorageOkIntent;
- private final Intent mStorageFullIntent;
- private final Intent mStorageNotFullIntent;
- private CachePackageDataObserver mClearCacheObserver;
+ private static final long BOOT_IMAGE_STORAGE_REQUIREMENT = 250 * TrafficStats.MB_IN_BYTES;
+
+ private NotificationManager mNotifManager;
+
+ /** Sequence number used for testing */
+ private final AtomicInteger mSeq = new AtomicInteger(1);
+ /** Forced level used for testing */
+ private volatile int mForceLevel = State.LEVEL_UNKNOWN;
+
+ /** Map from storage volume UUID to internal state */
+ private final ArrayMap<UUID, State> mStates = new ArrayMap<>();
+
+ /**
+ * State for a specific storage volume, including the current "level" that
+ * we've alerted the user and apps about.
+ */
+ private static class State {
+ private static final int LEVEL_UNKNOWN = -1;
+ private static final int LEVEL_NORMAL = 0;
+ private static final int LEVEL_LOW = 1;
+ private static final int LEVEL_FULL = 2;
+
+ /** Last "level" that we alerted about */
+ public int level = LEVEL_NORMAL;
+ /** Last {@link File#getUsableSpace()} that we logged about */
+ public long lastUsableBytes = Long.MAX_VALUE;
+
+ /**
+ * Test if the given level transition is "entering" a specific level.
+ * <p>
+ * As an example, a transition from {@link #LEVEL_NORMAL} to
+ * {@link #LEVEL_FULL} is considered to "enter" both {@link #LEVEL_LOW}
+ * and {@link #LEVEL_FULL}.
+ */
+ private static boolean isEntering(int level, int oldLevel, int newLevel) {
+ return newLevel >= level && (oldLevel < level || oldLevel == LEVEL_UNKNOWN);
+ }
+
+ /**
+ * Test if the given level transition is "leaving" a specific level.
+ * <p>
+ * As an example, a transition from {@link #LEVEL_FULL} to
+ * {@link #LEVEL_NORMAL} is considered to "leave" both
+ * {@link #LEVEL_FULL} and {@link #LEVEL_LOW}.
+ */
+ private static boolean isLeaving(int level, int oldLevel, int newLevel) {
+ return newLevel < level && (oldLevel >= level || oldLevel == LEVEL_UNKNOWN);
+ }
+
+ private static String levelToString(int level) {
+ switch (level) {
+ case State.LEVEL_UNKNOWN: return "UNKNOWN";
+ case State.LEVEL_NORMAL: return "NORMAL";
+ case State.LEVEL_LOW: return "LOW";
+ case State.LEVEL_FULL: return "FULL";
+ default: return Integer.toString(level);
+ }
+ }
+ }
+
private CacheFileDeletedObserver mCacheFileDeletedObserver;
- private static final int _TRUE = 1;
- private static final int _FALSE = 0;
- // This is the raw threshold that has been set at which we consider
- // storage to be low.
- long mMemLowThreshold;
- // This is the threshold at which we start trying to flush caches
- // to get below the low threshold limit. It is less than the low
- // threshold; we will allow storage to get a bit beyond the limit
- // before flushing and checking if we are actually low.
- private long mMemCacheStartTrimThreshold;
- // This is the threshold that we try to get to when deleting cache
- // files. This is greater than the low threshold so that we will flush
- // more files than absolutely needed, to reduce the frequency that
- // flushing takes place.
- private long mMemCacheTrimToThreshold;
- private long mMemFullThreshold;
/**
* This string is used for ServiceManager access to this class.
@@ -159,244 +155,107 @@ public class DeviceStorageMonitorService extends SystemService {
private static final String TV_NOTIFICATION_CHANNEL_ID = "devicestoragemonitor.tv";
/**
- * Handler that checks the amount of disk space on the device and sends a
- * notification if the device runs low on disk space
- */
- private final Handler mHandler = new Handler() {
+ * Handler that checks the amount of disk space on the device and sends a
+ * notification if the device runs low on disk space
+ */
+ private final Handler mHandler = new Handler(IoThread.get().getLooper()) {
@Override
public void handleMessage(Message msg) {
- //don't handle an invalid message
switch (msg.what) {
- case DEVICE_MEMORY_WHAT:
- checkMemory(msg.arg1 == _TRUE);
- return;
- case FORCE_MEMORY_WHAT:
- forceMemory(msg.arg1, msg.arg2);
- return;
- default:
- Slog.w(TAG, "Will not process invalid message");
+ case MSG_CHECK:
+ check();
return;
}
}
};
- private class CachePackageDataObserver extends IPackageDataObserver.Stub {
- public void onRemoveCompleted(String packageName, boolean succeeded) {
- mClearSucceeded = succeeded;
- mClearingCache = false;
- if(localLOGV) Slog.i(TAG, " Clear succeeded:"+mClearSucceeded
- +", mClearingCache:"+mClearingCache+" Forcing memory check");
- postCheckMemoryMsg(false, 0);
- }
- }
-
- private void restatDataDir() {
- try {
- mDataFileStats.restat(DATA_PATH.getAbsolutePath());
- mFreeMem = (long) mDataFileStats.getAvailableBlocks() *
- mDataFileStats.getBlockSize();
- } catch (IllegalArgumentException e) {
- // use the old value of mFreeMem
- }
- // Allow freemem to be overridden by debug.freemem for testing
- String debugFreeMem = SystemProperties.get("debug.freemem");
- if (!"".equals(debugFreeMem)) {
- mFreeMem = Long.parseLong(debugFreeMem);
- }
- // Read the log interval from secure settings
- long freeMemLogInterval = Settings.Global.getLong(mResolver,
- Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL,
- DEFAULT_FREE_STORAGE_LOG_INTERVAL_IN_MINUTES)*60*1000;
- //log the amount of free memory in event log
- long currTime = SystemClock.elapsedRealtime();
- if((mLastReportedFreeMemTime == 0) ||
- (currTime-mLastReportedFreeMemTime) >= freeMemLogInterval) {
- mLastReportedFreeMemTime = currTime;
- long mFreeSystem = -1, mFreeCache = -1;
- try {
- mSystemFileStats.restat(SYSTEM_PATH.getAbsolutePath());
- mFreeSystem = (long) mSystemFileStats.getAvailableBlocks() *
- mSystemFileStats.getBlockSize();
- } catch (IllegalArgumentException e) {
- // ignore; report -1
- }
- try {
- mCacheFileStats.restat(CACHE_PATH.getAbsolutePath());
- mFreeCache = (long) mCacheFileStats.getAvailableBlocks() *
- mCacheFileStats.getBlockSize();
- } catch (IllegalArgumentException e) {
- // ignore; report -1
- }
- EventLog.writeEvent(EventLogTags.FREE_STORAGE_LEFT,
- mFreeMem, mFreeSystem, mFreeCache);
- }
- // Read the reporting threshold from secure settings
- long threshold = Settings.Global.getLong(mResolver,
- Settings.Global.DISK_FREE_CHANGE_REPORTING_THRESHOLD,
- DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD);
- // If mFree changed significantly log the new value
- long delta = mFreeMem - mLastReportedFreeMem;
- if (delta > threshold || delta < -threshold) {
- mLastReportedFreeMem = mFreeMem;
- EventLog.writeEvent(EventLogTags.FREE_STORAGE_CHANGED, mFreeMem);
- }
- }
-
- private void clearCache() {
- if (mClearCacheObserver == null) {
- // Lazy instantiation
- mClearCacheObserver = new CachePackageDataObserver();
- }
- mClearingCache = true;
- try {
- if (localLOGV) Slog.i(TAG, "Clearing cache");
- IPackageManager.Stub.asInterface(ServiceManager.getService("package")).
- freeStorageAndNotify(null, mMemCacheTrimToThreshold, mClearCacheObserver);
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
- mClearingCache = false;
- mClearSucceeded = false;
+ private State findOrCreateState(UUID uuid) {
+ State state = mStates.get(uuid);
+ if (state == null) {
+ state = new State();
+ mStates.put(uuid, state);
}
+ return state;
}
- void forceMemory(int opts, int seq) {
- if ((opts&OPTION_UPDATES_STOPPED) == 0) {
- if (mUpdatesStopped) {
- mUpdatesStopped = false;
- checkMemory(true);
- }
- } else {
- mUpdatesStopped = true;
- final boolean forceLow = (opts&OPTION_STORAGE_LOW) != 0;
- if (mLowMemFlag != forceLow || (opts&OPTION_FORCE_UPDATE) != 0) {
- mLowMemFlag = forceLow;
- if (forceLow) {
- sendNotification(seq);
- } else {
- cancelNotification(seq);
+ /**
+ * Core logic that checks the storage state of every mounted private volume.
+ * Since this can do heavy I/O, callers should invoke indirectly using
+ * {@link #MSG_CHECK}.
+ */
+ @WorkerThread
+ private void check() {
+ final StorageManager storage = getContext().getSystemService(StorageManager.class);
+ final int seq = mSeq.get();
+
+ // Check every mounted private volume to see if they're low on space
+ for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
+ final File file = vol.getPath();
+ final long fullBytes = storage.getStorageFullBytes(file);
+ final long lowBytes = storage.getStorageLowBytes(file);
+
+ // Automatically trim cached data when nearing the low threshold;
+ // when it's within 150% of the threshold, we try trimming usage
+ // back to 200% of the threshold.
+ if (file.getUsableSpace() < (lowBytes * 3) / 2) {
+ final PackageManagerService pms = (PackageManagerService) ServiceManager
+ .getService("package");
+ try {
+ pms.freeStorage(vol.getFsUuid(), lowBytes * 2, 0);
+ } catch (IOException e) {
+ Slog.w(TAG, e);
}
}
- }
- }
- void checkMemory(boolean checkCache) {
- if (mUpdatesStopped) {
- return;
- }
-
- //if the thread that was started to clear cache is still running do nothing till its
- //finished clearing cache. Ideally this flag could be modified by clearCache
- // and should be accessed via a lock but even if it does this test will fail now and
- //hopefully the next time this flag will be set to the correct value.
- if (mClearingCache) {
- if(localLOGV) Slog.i(TAG, "Thread already running just skip");
- //make sure the thread is not hung for too long
- long diffTime = System.currentTimeMillis() - mThreadStartTime;
- if(diffTime > (10*60*1000)) {
- Slog.w(TAG, "Thread that clears cache file seems to run for ever");
- }
- } else {
- restatDataDir();
- if (localLOGV) Slog.v(TAG, "freeMemory="+mFreeMem);
-
- //post intent to NotificationManager to display icon if necessary
- if (mFreeMem < mMemLowThreshold) {
- if (checkCache) {
- // We are allowed to clear cache files at this point to
- // try to get down below the limit, because this is not
- // the initial call after a cache clear has been attempted.
- // In this case we will try a cache clear if our free
- // space has gone below the cache clear limit.
- if (mFreeMem < mMemCacheStartTrimThreshold) {
- // We only clear the cache if the free storage has changed
- // a significant amount since the last time.
- if ((mFreeMemAfterLastCacheClear-mFreeMem)
- >= ((mMemLowThreshold-mMemCacheStartTrimThreshold)/4)) {
- // See if clearing cache helps
- // Note that clearing cache is asynchronous and so we do a
- // memory check again once the cache has been cleared.
- mThreadStartTime = System.currentTimeMillis();
- mClearSucceeded = false;
- clearCache();
- }
- }
- } else {
- // This is a call from after clearing the cache. Note
- // the amount of free storage at this point.
- mFreeMemAfterLastCacheClear = mFreeMem;
- if (!mLowMemFlag) {
- // We tried to clear the cache, but that didn't get us
- // below the low storage limit. Tell the user.
- Slog.i(TAG, "Running low on memory. Sending notification");
- sendNotification(0);
- mLowMemFlag = true;
- } else {
- if (localLOGV) Slog.v(TAG, "Running low on memory " +
- "notification already sent. do nothing");
- }
- }
+ // Send relevant broadcasts and show notifications based on any
+ // recently noticed state transitions.
+ final UUID uuid = StorageManager.convert(vol.getFsUuid());
+ final State state = findOrCreateState(uuid);
+ final long totalBytes = file.getTotalSpace();
+ final long usableBytes = file.getUsableSpace();
+
+ int oldLevel = state.level;
+ int newLevel;
+ if (mForceLevel != State.LEVEL_UNKNOWN) {
+ // When in testing mode, use unknown old level to force sending
+ // of any relevant broadcasts.
+ oldLevel = State.LEVEL_UNKNOWN;
+ newLevel = mForceLevel;
+ } else if (usableBytes <= fullBytes) {
+ newLevel = State.LEVEL_FULL;
+ } else if (usableBytes <= lowBytes) {
+ newLevel = State.LEVEL_LOW;
+ } else if (StorageManager.UUID_DEFAULT.equals(uuid) && !isBootImageOnDisk()
+ && usableBytes < BOOT_IMAGE_STORAGE_REQUIREMENT) {
+ newLevel = State.LEVEL_LOW;
} else {
- mFreeMemAfterLastCacheClear = mFreeMem;
- if (mLowMemFlag) {
- Slog.i(TAG, "Memory available. Cancelling notification");
- cancelNotification(0);
- mLowMemFlag = false;
- }
+ newLevel = State.LEVEL_NORMAL;
}
- if (!mLowMemFlag && !mIsBootImageOnDisk && mFreeMem < BOOT_IMAGE_STORAGE_REQUIREMENT) {
- Slog.i(TAG, "No boot image on disk due to lack of space. Sending notification");
- sendNotification(0);
- mLowMemFlag = true;
- }
- if (mFreeMem < mMemFullThreshold) {
- if (!mMemFullFlag) {
- sendFullNotification();
- mMemFullFlag = true;
- }
- } else {
- if (mMemFullFlag) {
- cancelFullNotification();
- mMemFullFlag = false;
- }
+
+ // Log whenever we notice drastic storage changes
+ if ((Math.abs(state.lastUsableBytes - usableBytes) > DEFAULT_LOG_DELTA_BYTES)
+ || oldLevel != newLevel) {
+ EventLogTags.writeStorageState(uuid.toString(), oldLevel, newLevel,
+ usableBytes, totalBytes);
+ state.lastUsableBytes = usableBytes;
}
+
+ updateNotifications(vol, oldLevel, newLevel);
+ updateBroadcasts(vol, oldLevel, newLevel, seq);
+
+ state.level = newLevel;
}
- if(localLOGV) Slog.i(TAG, "Posting Message again");
- //keep posting messages to itself periodically
- postCheckMemoryMsg(true, DEFAULT_CHECK_INTERVAL);
- }
- void postCheckMemoryMsg(boolean clearCache, long delay) {
- // Remove queued messages
- mHandler.removeMessages(DEVICE_MEMORY_WHAT);
- mHandler.sendMessageDelayed(mHandler.obtainMessage(DEVICE_MEMORY_WHAT,
- clearCache ?_TRUE : _FALSE, 0),
- delay);
+ // Loop around to check again in future; we don't remove messages since
+ // there might be an immediate request pending.
+ if (!mHandler.hasMessages(MSG_CHECK)) {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CHECK),
+ DEFAULT_CHECK_INTERVAL);
+ }
}
public DeviceStorageMonitorService(Context context) {
super(context);
- mLastReportedFreeMemTime = 0;
- mResolver = context.getContentResolver();
- mIsBootImageOnDisk = isBootImageOnDisk();
- //create StatFs object
- mDataFileStats = new StatFs(DATA_PATH.getAbsolutePath());
- mSystemFileStats = new StatFs(SYSTEM_PATH.getAbsolutePath());
- mCacheFileStats = new StatFs(CACHE_PATH.getAbsolutePath());
- //initialize total storage on device
- mTotalMemory = (long)mDataFileStats.getBlockCount() *
- mDataFileStats.getBlockSize();
- mStorageLowIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_LOW);
- mStorageLowIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
- | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
- | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
- mStorageOkIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_OK);
- mStorageOkIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
- | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
- | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
- mStorageFullIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_FULL);
- mStorageFullIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- mStorageNotFullIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_NOT_FULL);
- mStorageNotFullIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
}
private static boolean isBootImageOnDisk() {
@@ -408,35 +267,20 @@ public class DeviceStorageMonitorService extends SystemService {
return true;
}
- /**
- * Initializes the disk space threshold value and posts an empty message to
- * kickstart the process.
- */
@Override
public void onStart() {
- // cache storage thresholds
- Context context = getContext();
- final StorageManager sm = StorageManager.from(context);
- mMemLowThreshold = sm.getStorageLowBytes(DATA_PATH);
- mMemFullThreshold = sm.getStorageFullBytes(DATA_PATH);
-
- mMemCacheStartTrimThreshold = ((mMemLowThreshold*3)+mMemFullThreshold)/4;
- mMemCacheTrimToThreshold = mMemLowThreshold
- + ((mMemLowThreshold-mMemCacheStartTrimThreshold)*2);
- mFreeMemAfterLastCacheClear = mTotalMemory;
- checkMemory(true);
+ final Context context = getContext();
+ mNotifManager = context.getSystemService(NotificationManager.class);
mCacheFileDeletedObserver = new CacheFileDeletedObserver();
mCacheFileDeletedObserver.startWatching();
// Ensure that the notification channel is set up
- NotificationManager notificationMgr =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
PackageManager packageManager = context.getPackageManager();
boolean isTv = packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK);
if (isTv) {
- notificationMgr.createNotificationChannel(new NotificationChannel(
+ mNotifManager.createNotificationChannel(new NotificationChannel(
TV_NOTIFICATION_CHANNEL_ID,
context.getString(
com.android.internal.R.string.device_storage_monitor_notification_channel),
@@ -445,23 +289,29 @@ public class DeviceStorageMonitorService extends SystemService {
publishBinderService(SERVICE, mRemoteService);
publishLocalService(DeviceStorageMonitorInternal.class, mLocalService);
+
+ // Kick off pass to examine storage state
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
}
private final DeviceStorageMonitorInternal mLocalService = new DeviceStorageMonitorInternal() {
@Override
public void checkMemory() {
- // force an early check
- postCheckMemoryMsg(true, 0);
+ // Kick off pass to examine storage state
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
}
@Override
public boolean isMemoryLow() {
- return mLowMemFlag;
+ return Environment.getDataDirectory().getUsableSpace() < getMemoryLowThreshold();
}
@Override
public long getMemoryLowThreshold() {
- return mMemLowThreshold;
+ return getContext().getSystemService(StorageManager.class)
+ .getStorageLowBytes(Environment.getDataDirectory());
}
};
@@ -494,8 +344,6 @@ public class DeviceStorageMonitorService extends SystemService {
}
static final int OPTION_FORCE_UPDATE = 1<<0;
- static final int OPTION_UPDATES_STOPPED = 1<<1;
- static final int OPTION_STORAGE_LOW = 1<<2;
int parseOptions(Shell shell) {
String opt;
@@ -518,10 +366,11 @@ public class DeviceStorageMonitorService extends SystemService {
int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
+ mForceLevel = State.LEVEL_LOW;
int seq = mSeq.incrementAndGet();
- mHandler.sendMessage(mHandler.obtainMessage(FORCE_MEMORY_WHAT,
- opts | OPTION_UPDATES_STOPPED | OPTION_STORAGE_LOW, seq));
if ((opts & OPTION_FORCE_UPDATE) != 0) {
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
pw.println(seq);
}
} break;
@@ -529,10 +378,11 @@ public class DeviceStorageMonitorService extends SystemService {
int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
+ mForceLevel = State.LEVEL_NORMAL;
int seq = mSeq.incrementAndGet();
- mHandler.sendMessage(mHandler.obtainMessage(FORCE_MEMORY_WHAT,
- opts | OPTION_UPDATES_STOPPED, seq));
if ((opts & OPTION_FORCE_UPDATE) != 0) {
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
pw.println(seq);
}
} break;
@@ -540,10 +390,11 @@ public class DeviceStorageMonitorService extends SystemService {
int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
+ mForceLevel = State.LEVEL_UNKNOWN;
int seq = mSeq.incrementAndGet();
- mHandler.sendMessage(mHandler.obtainMessage(FORCE_MEMORY_WHAT,
- opts, seq));
if ((opts & OPTION_FORCE_UPDATE) != 0) {
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
pw.println(seq);
}
} break;
@@ -568,145 +419,125 @@ public class DeviceStorageMonitorService extends SystemService {
pw.println(" -f: force a storage change broadcast be sent, prints new sequence.");
}
- void dumpImpl(FileDescriptor fd, PrintWriter pw, String[] args) {
+ void dumpImpl(FileDescriptor fd, PrintWriter _pw, String[] args) {
+ final IndentingPrintWriter pw = new IndentingPrintWriter(_pw, " ");
if (args == null || args.length == 0 || "-a".equals(args[0])) {
- final Context context = getContext();
-
- pw.println("Current DeviceStorageMonitor state:");
-
- pw.print(" mFreeMem=");
- pw.print(Formatter.formatFileSize(context, mFreeMem));
- pw.print(" mTotalMemory=");
- pw.println(Formatter.formatFileSize(context, mTotalMemory));
-
- pw.print(" mFreeMemAfterLastCacheClear=");
- pw.println(Formatter.formatFileSize(context, mFreeMemAfterLastCacheClear));
-
- pw.print(" mLastReportedFreeMem=");
- pw.print(Formatter.formatFileSize(context, mLastReportedFreeMem));
- pw.print(" mLastReportedFreeMemTime=");
- TimeUtils.formatDuration(mLastReportedFreeMemTime, SystemClock.elapsedRealtime(), pw);
- pw.println();
-
- if (mUpdatesStopped) {
- pw.print(" mUpdatesStopped=");
- pw.print(mUpdatesStopped);
- pw.print(" mSeq=");
- pw.println(mSeq.get());
- } else {
- pw.print(" mClearSucceeded=");
- pw.print(mClearSucceeded);
- pw.print(" mClearingCache=");
- pw.println(mClearingCache);
+ pw.println("Known volumes:");
+ pw.increaseIndent();
+ for (int i = 0; i < mStates.size(); i++) {
+ final UUID uuid = mStates.keyAt(i);
+ final State state = mStates.valueAt(i);
+ if (StorageManager.UUID_DEFAULT.equals(uuid)) {
+ pw.println("Default:");
+ } else {
+ pw.println(uuid + ":");
+ }
+ pw.increaseIndent();
+ pw.printPair("level", State.levelToString(state.level));
+ pw.printPair("lastUsableBytes", state.lastUsableBytes);
+ pw.println();
+ pw.decreaseIndent();
}
+ pw.decreaseIndent();
+ pw.println();
- pw.print(" mLowMemFlag=");
- pw.print(mLowMemFlag);
- pw.print(" mMemFullFlag=");
- pw.println(mMemFullFlag);
-
- pw.print(" mMemLowThreshold=");
- pw.print(Formatter.formatFileSize(context, mMemLowThreshold));
- pw.print(" mMemFullThreshold=");
- pw.println(Formatter.formatFileSize(context, mMemFullThreshold));
-
- pw.print(" mMemCacheStartTrimThreshold=");
- pw.print(Formatter.formatFileSize(context, mMemCacheStartTrimThreshold));
- pw.print(" mMemCacheTrimToThreshold=");
- pw.println(Formatter.formatFileSize(context, mMemCacheTrimToThreshold));
+ pw.printPair("mSeq", mSeq.get());
+ pw.printPair("mForceState", State.levelToString(mForceLevel));
+ pw.println();
+ pw.println();
- pw.print(" mIsBootImageOnDisk="); pw.println(mIsBootImageOnDisk);
} else {
Shell shell = new Shell();
shell.exec(mRemoteService, null, fd, null, args, null, new ResultReceiver(null));
}
}
- /**
- * This method sends a notification to NotificationManager to display
- * an error dialog indicating low disk space and launch the Installer
- * application
- */
- private void sendNotification(int seq) {
+ private void updateNotifications(VolumeInfo vol, int oldLevel, int newLevel) {
final Context context = getContext();
- if(localLOGV) Slog.i(TAG, "Sending low memory notification");
- //log the event to event log with the amount of free storage(in bytes) left on the device
- EventLog.writeEvent(EventLogTags.LOW_STORAGE, mFreeMem);
- // Pack up the values and broadcast them to everyone
- Intent lowMemIntent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
- lowMemIntent.putExtra("memory", mFreeMem);
- lowMemIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- NotificationManager notificationMgr =
- (NotificationManager)context.getSystemService(
- Context.NOTIFICATION_SERVICE);
- CharSequence title = context.getText(
- com.android.internal.R.string.low_internal_storage_view_title);
- CharSequence details = context.getText(mIsBootImageOnDisk
- ? com.android.internal.R.string.low_internal_storage_view_text
- : com.android.internal.R.string.low_internal_storage_view_text_no_boot);
- PendingIntent intent = PendingIntent.getActivityAsUser(context, 0, lowMemIntent, 0,
- null, UserHandle.CURRENT);
- Notification notification =
- new Notification.Builder(context, SystemNotificationChannels.ALERTS)
- .setSmallIcon(com.android.internal.R.drawable.stat_notify_disk_full)
- .setTicker(title)
- .setColor(context.getColor(
- com.android.internal.R.color.system_notification_accent_color))
- .setContentTitle(title)
- .setContentText(details)
- .setContentIntent(intent)
- .setStyle(new Notification.BigTextStyle()
- .bigText(details))
- .setVisibility(Notification.VISIBILITY_PUBLIC)
- .setCategory(Notification.CATEGORY_SYSTEM)
- .extend(new Notification.TvExtender()
- .setChannelId(TV_NOTIFICATION_CHANNEL_ID))
- .build();
- notification.flags |= Notification.FLAG_NO_CLEAR;
- notificationMgr.notifyAsUser(null, SystemMessage.NOTE_LOW_STORAGE, notification,
- UserHandle.ALL);
- Intent broadcast = new Intent(mStorageLowIntent);
- if (seq != 0) {
- broadcast.putExtra(EXTRA_SEQUENCE, seq);
+ final UUID uuid = StorageManager.convert(vol.getFsUuid());
+
+ if (State.isEntering(State.LEVEL_LOW, oldLevel, newLevel)) {
+ Intent lowMemIntent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
+ lowMemIntent.putExtra(StorageManager.EXTRA_UUID, uuid);
+ lowMemIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ final CharSequence title = context.getText(
+ com.android.internal.R.string.low_internal_storage_view_title);
+
+ final CharSequence details;
+ if (StorageManager.UUID_DEFAULT.equals(uuid)) {
+ details = context.getText(isBootImageOnDisk()
+ ? com.android.internal.R.string.low_internal_storage_view_text
+ : com.android.internal.R.string.low_internal_storage_view_text_no_boot);
+ } else {
+ details = context.getText(
+ com.android.internal.R.string.low_internal_storage_view_text);
+ }
+
+ PendingIntent intent = PendingIntent.getActivityAsUser(context, 0, lowMemIntent, 0,
+ null, UserHandle.CURRENT);
+ Notification notification =
+ new Notification.Builder(context, SystemNotificationChannels.ALERTS)
+ .setSmallIcon(com.android.internal.R.drawable.stat_notify_disk_full)
+ .setTicker(title)
+ .setColor(context.getColor(
+ com.android.internal.R.color.system_notification_accent_color))
+ .setContentTitle(title)
+ .setContentText(details)
+ .setContentIntent(intent)
+ .setStyle(new Notification.BigTextStyle()
+ .bigText(details))
+ .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .setCategory(Notification.CATEGORY_SYSTEM)
+ .extend(new Notification.TvExtender()
+ .setChannelId(TV_NOTIFICATION_CHANNEL_ID))
+ .build();
+ notification.flags |= Notification.FLAG_NO_CLEAR;
+ mNotifManager.notifyAsUser(uuid.toString(), SystemMessage.NOTE_LOW_STORAGE,
+ notification, UserHandle.ALL);
+ } else if (State.isLeaving(State.LEVEL_LOW, oldLevel, newLevel)) {
+ mNotifManager.cancelAsUser(uuid.toString(), SystemMessage.NOTE_LOW_STORAGE,
+ UserHandle.ALL);
}
- context.sendStickyBroadcastAsUser(broadcast, UserHandle.ALL);
}
- /**
- * Cancels low storage notification and sends OK intent.
- */
- private void cancelNotification(int seq) {
- final Context context = getContext();
- if(localLOGV) Slog.i(TAG, "Canceling low memory notification");
- NotificationManager mNotificationMgr =
- (NotificationManager)context.getSystemService(
- Context.NOTIFICATION_SERVICE);
- //cancel notification since memory has been freed
- mNotificationMgr.cancelAsUser(null, SystemMessage.NOTE_LOW_STORAGE, UserHandle.ALL);
-
- context.removeStickyBroadcastAsUser(mStorageLowIntent, UserHandle.ALL);
- Intent broadcast = new Intent(mStorageOkIntent);
- if (seq != 0) {
- broadcast.putExtra(EXTRA_SEQUENCE, seq);
+ private void updateBroadcasts(VolumeInfo vol, int oldLevel, int newLevel, int seq) {
+ if (!Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, vol.getFsUuid())) {
+ // We don't currently send broadcasts for secondary volumes
+ return;
}
- context.sendBroadcastAsUser(broadcast, UserHandle.ALL);
- }
- /**
- * Send a notification when storage is full.
- */
- private void sendFullNotification() {
- if(localLOGV) Slog.i(TAG, "Sending memory full notification");
- getContext().sendStickyBroadcastAsUser(mStorageFullIntent, UserHandle.ALL);
- }
+ final Intent lowIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_LOW)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
+ | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
+ | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS)
+ .putExtra(EXTRA_SEQUENCE, seq);
+ final Intent notLowIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_OK)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
+ | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
+ | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS)
+ .putExtra(EXTRA_SEQUENCE, seq);
+
+ if (State.isEntering(State.LEVEL_LOW, oldLevel, newLevel)) {
+ getContext().sendStickyBroadcastAsUser(lowIntent, UserHandle.ALL);
+ } else if (State.isLeaving(State.LEVEL_LOW, oldLevel, newLevel)) {
+ getContext().removeStickyBroadcastAsUser(lowIntent, UserHandle.ALL);
+ getContext().sendBroadcastAsUser(notLowIntent, UserHandle.ALL);
+ }
- /**
- * Cancels memory full notification and sends "not full" intent.
- */
- private void cancelFullNotification() {
- if(localLOGV) Slog.i(TAG, "Canceling memory full notification");
- getContext().removeStickyBroadcastAsUser(mStorageFullIntent, UserHandle.ALL);
- getContext().sendBroadcastAsUser(mStorageNotFullIntent, UserHandle.ALL);
+ final Intent fullIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_FULL)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT)
+ .putExtra(EXTRA_SEQUENCE, seq);
+ final Intent notFullIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_NOT_FULL)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT)
+ .putExtra(EXTRA_SEQUENCE, seq);
+
+ if (State.isEntering(State.LEVEL_FULL, oldLevel, newLevel)) {
+ getContext().sendStickyBroadcastAsUser(fullIntent, UserHandle.ALL);
+ } else if (State.isLeaving(State.LEVEL_FULL, oldLevel, newLevel)) {
+ getContext().removeStickyBroadcastAsUser(fullIntent, UserHandle.ALL);
+ getContext().sendBroadcastAsUser(notFullIntent, UserHandle.ALL);
+ }
}
private static class CacheFileDeletedObserver extends FileObserver {
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 4044fdb07b0d..b937f9d4c6d8 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -96,6 +96,7 @@ import java.util.Objects;
public class VrManagerService extends SystemService implements EnabledComponentChangeListener{
public static final String TAG = "VrManagerService";
+ static final boolean DBG = false;
private static final int PENDING_STATE_DELAY_MS = 300;
private static final int EVENT_LOG_SIZE = 32;
@@ -157,7 +158,7 @@ public class VrManagerService extends SystemService implements EnabledComponentC
private void setVrModeAllowedLocked(boolean allowed) {
if (mVrModeAllowed != allowed) {
mVrModeAllowed = allowed;
- Slog.i(TAG, "VR mode is " + ((allowed) ? "allowed" : "disallowed"));
+ if (DBG) Slog.d(TAG, "VR mode is " + ((allowed) ? "allowed" : "disallowed"));
if (mVrModeAllowed) {
consumeAndApplyPendingStateLocked();
} else {
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index a38addb1dad0..9d8f1241a7ae 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -52,6 +52,7 @@ import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Path;
import android.graphics.Rect;
import android.os.Binder;
@@ -346,12 +347,12 @@ public class AppTransition implements Dump {
mAppTransitionState = APP_STATE_TIMEOUT;
}
- Bitmap getAppTransitionThumbnailHeader(int taskId) {
+ GraphicBuffer getAppTransitionThumbnailHeader(int taskId) {
AppTransitionAnimationSpec spec = mNextAppTransitionAnimationsSpecs.get(taskId);
if (spec == null) {
spec = mDefaultNextAppTransitionAnimationSpec;
}
- return spec != null ? spec.bitmap : null;
+ return spec != null ? spec.buffer : null;
}
/** Returns whether the next thumbnail transition is aspect scaled up. */
@@ -716,9 +717,9 @@ public class AppTransition implements Dump {
}
private void putDefaultNextAppTransitionCoordinates(int left, int top, int width, int height,
- Bitmap bitmap) {
+ GraphicBuffer buffer) {
mDefaultNextAppTransitionAnimationSpec = new AppTransitionAnimationSpec(-1 /* taskId */,
- bitmap, new Rect(left, top, left + width, top + height));
+ buffer, new Rect(left, top, left + width, top + height));
}
/**
@@ -943,7 +944,7 @@ public class AppTransition implements Dump {
* when a thumbnail is specified with the pending animation override.
*/
Animation createThumbnailAspectScaleAnimationLocked(Rect appRect, @Nullable Rect contentInsets,
- Bitmap thumbnailHeader, final int taskId, int uiMode, int orientation) {
+ GraphicBuffer thumbnailHeader, final int taskId, int uiMode, int orientation) {
Animation a;
final int thumbWidthI = thumbnailHeader.getWidth();
final float thumbWidth = thumbWidthI > 0 ? thumbWidthI : 1;
@@ -1296,7 +1297,7 @@ public class AppTransition implements Dump {
* when a thumbnail is specified with the pending animation override.
*/
Animation createThumbnailScaleAnimationLocked(int appWidth, int appHeight, int transit,
- Bitmap thumbnailHeader) {
+ GraphicBuffer thumbnailHeader) {
Animation a;
getDefaultNextAppTransitionStartRect(mTmpRect);
final int thumbWidthI = thumbnailHeader.getWidth();
@@ -1341,7 +1342,7 @@ public class AppTransition implements Dump {
int transit, int taskId) {
final int appWidth = containingFrame.width();
final int appHeight = containingFrame.height();
- Bitmap thumbnailHeader = getAppTransitionThumbnailHeader(taskId);
+ final GraphicBuffer thumbnailHeader = getAppTransitionThumbnailHeader(taskId);
Animation a;
getDefaultNextAppTransitionStartRect(mTmpRect);
final int thumbWidthI = thumbnailHeader != null ? thumbnailHeader.getWidth() : appWidth;
@@ -1714,7 +1715,7 @@ public class AppTransition implements Dump {
}
}
- void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX, int startY,
+ void overridePendingAppTransitionThumb(GraphicBuffer srcThumb, int startX, int startY,
IRemoteCallback startedCallback, boolean scaleUp) {
if (isTransitionSet()) {
clear();
@@ -1729,7 +1730,7 @@ public class AppTransition implements Dump {
}
}
- void overridePendingAppTransitionAspectScaledThumb(Bitmap srcThumb, int startX, int startY,
+ void overridePendingAppTransitionAspectScaledThumb(GraphicBuffer srcThumb, int startX, int startY,
int targetWidth, int targetHeight, IRemoteCallback startedCallback, boolean scaleUp) {
if (isTransitionSet()) {
clear();
@@ -1763,7 +1764,7 @@ public class AppTransition implements Dump {
// to be set.
Rect rect = spec.rect;
putDefaultNextAppTransitionCoordinates(rect.left, rect.top,
- rect.width(), rect.height(), spec.bitmap);
+ rect.width(), rect.height(), spec.buffer);
}
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 221e7957ef35..b5476d7e056b 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -3492,10 +3492,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
if (win != null) {
final int req = win.mAttrs.screenOrientation;
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, win + " forcing orientation to " + req);
if (policy.isKeyguardHostWindow(win.mAttrs)) {
mLastKeyguardForcedOrientation = req;
+ if (mService.mKeyguardGoingAway) {
+ // Keyguard can't affect the orientation if it is going away...
+ mLastWindowForcedOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
+ return SCREEN_ORIENTATION_UNSET;
+ }
}
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, win + " forcing orientation to " + req);
return (mLastWindowForcedOrientation = req);
}
diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java
index fc4ec2889523..9a9e29a7eb88 100644
--- a/services/core/java/com/android/server/wm/PinnedStackController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackController.java
@@ -92,17 +92,16 @@ class PinnedStackController {
private final Rect mStableInsets = new Rect();
// The size and position information that describes where the pinned stack will go by default.
+ private int mDefaultMinSize;
private int mDefaultStackGravity;
private float mDefaultAspectRatio;
private Point mScreenEdgeInsets;
+ private int mCurrentMinSize;
// The aspect ratio bounds of the PIP.
private float mMinAspectRatio;
private float mMaxAspectRatio;
- // The minimum edge size of the normal PiP bounds.
- private int mMinSize;
-
// Temp vars for calculation
private final DisplayMetrics mTmpMetrics = new DisplayMetrics();
private final Rect mTmpInsets = new Rect();
@@ -124,6 +123,13 @@ class PinnedStackController {
}
@Override
+ public void setMinEdgeSize(int minEdgeSize) {
+ mHandler.post(() -> {
+ mCurrentMinSize = Math.max(mDefaultMinSize, minEdgeSize);
+ });
+ }
+
+ @Override
public int getDisplayRotation() {
synchronized (mService.mWindowMap) {
return mDisplayInfo.rotation;
@@ -160,10 +166,12 @@ class PinnedStackController {
*/
private void reloadResources() {
final Resources res = mService.mContext.getResources();
- mMinSize = res.getDimensionPixelSize(
+ mDefaultMinSize = res.getDimensionPixelSize(
com.android.internal.R.dimen.default_minimal_size_pip_resizable_task);
+ mCurrentMinSize = mDefaultMinSize;
mDefaultAspectRatio = res.getFloat(
com.android.internal.R.dimen.config_pictureInPictureDefaultAspectRatio);
+ mAspectRatio = mDefaultAspectRatio;
final String screenEdgeInsetsDpString = res.getString(
com.android.internal.R.string.config_defaultPictureInPictureScreenEdgeInsets);
final Size screenEdgeInsetsDp = !screenEdgeInsetsDpString.isEmpty()
@@ -212,11 +220,15 @@ class PinnedStackController {
* Returns the current bounds (or the default bounds if there are no current bounds) with the
* specified aspect ratio.
*/
- Rect transformBoundsToAspectRatio(Rect stackBounds, float aspectRatio) {
+ Rect transformBoundsToAspectRatio(Rect stackBounds, float aspectRatio,
+ boolean useCurrentMinEdgeSize) {
// Save the snap fraction, calculate the aspect ratio based on screen size
final float snapFraction = mSnapAlgorithm.getSnapFraction(stackBounds,
getMovementBounds(stackBounds));
- final Size size = getSize(aspectRatio);
+
+ final int minEdgeSize = useCurrentMinEdgeSize ? mCurrentMinSize : mDefaultMinSize;
+ final Size size = mSnapAlgorithm.getSizeForAspectRatio(aspectRatio, minEdgeSize,
+ mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
final int left = (int) (stackBounds.centerX() - size.getWidth() / 2f);
final int top = (int) (stackBounds.centerY() - size.getHeight() / 2f);
stackBounds.set(left, top, left + size.getWidth(), top + size.getHeight());
@@ -228,16 +240,6 @@ class PinnedStackController {
}
/**
- * @return the size of the PIP based on the given {@param aspectRatio}.
- */
- Size getSize(float aspectRatio) {
- synchronized (mService.mWindowMap) {
- return mSnapAlgorithm.getSizeForAspectRatio(aspectRatio, mMinSize,
- mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
- }
- }
-
- /**
* @return the default bounds to show the PIP when there is no active PIP.
*/
Rect getDefaultBounds() {
@@ -246,7 +248,8 @@ class PinnedStackController {
getInsetBounds(insetBounds);
final Rect defaultBounds = new Rect();
- final Size size = getSize(mDefaultAspectRatio);
+ final Size size = mSnapAlgorithm.getSizeForAspectRatio(mDefaultAspectRatio,
+ mDefaultMinSize, mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
Gravity.apply(mDefaultStackGravity, size.getWidth(), size.getHeight(), insetBounds,
0, mIsImeShowing ? mImeHeight : 0, defaultBounds);
return defaultBounds;
@@ -401,7 +404,8 @@ class PinnedStackController {
getInsetBounds(insetBounds);
final Rect normalBounds = getDefaultBounds();
if (isValidPictureInPictureAspectRatio(mAspectRatio)) {
- transformBoundsToAspectRatio(normalBounds, mAspectRatio);
+ transformBoundsToAspectRatio(normalBounds, mAspectRatio,
+ false /* useCurrentMinEdgeSize */);
}
final Rect animatingBounds = mTmpAnimatingBoundsRect;
final TaskStack pinnedStack = mDisplayContent.getStackById(PINNED_STACK_ID);
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
index 0c628acba92c..989e8f23693a 100644
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -17,7 +17,6 @@
package com.android.server.wm;
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
-import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGED_CALLBACKS;
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END;
@@ -36,7 +35,8 @@ import java.util.List;
*/
public class PinnedStackWindowController extends StackWindowController {
- private Rect mTmpBoundsRect = new Rect();
+ private Rect mTmpFromBounds = new Rect();
+ private Rect mTmpToBounds = new Rect();
public PinnedStackWindowController(int stackId, PinnedStackWindowListener listener,
int displayId, boolean onTop, Rect outBounds) {
@@ -44,16 +44,16 @@ public class PinnedStackWindowController extends StackWindowController {
}
/**
- * @param useExistingStackBounds Apply {@param aspectRatio} to the existing target stack bounds
- * if possible
+ * @return the {@param currentStackBounds} transformed to the give {@param aspectRatio}. If
+ * {@param currentStackBounds} is null, then the {@param aspectRatio} is applied to the
+ * default bounds.
*/
- public Rect getPictureInPictureBounds(float aspectRatio, boolean useExistingStackBounds) {
+ public Rect getPictureInPictureBounds(float aspectRatio, Rect stackBounds) {
synchronized (mWindowMap) {
if (!mService.mSupportsPictureInPicture || mContainer == null) {
return null;
}
- final Rect stackBounds;
final DisplayContent displayContent = mContainer.getDisplayContent();
if (displayContent == null) {
return null;
@@ -61,18 +61,14 @@ public class PinnedStackWindowController extends StackWindowController {
final PinnedStackController pinnedStackController =
displayContent.getPinnedStackController();
- if (useExistingStackBounds) {
- // If the stack exists, then use its final bounds to calculate the new aspect ratio
- // bounds
- stackBounds = new Rect();
- mContainer.getAnimationOrCurrentBounds(stackBounds);
- } else {
- // Otherwise, just calculate the aspect ratio bounds from the default bounds
+ if (stackBounds == null) {
+ // Calculate the aspect ratio bounds from the default bounds
stackBounds = pinnedStackController.getDefaultBounds();
}
if (pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)) {
- return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio);
+ return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio,
+ true /* useCurrentMinEdgeSize */);
} else {
return stackBounds;
}
@@ -104,10 +100,10 @@ public class PinnedStackWindowController extends StackWindowController {
}
schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_START;
- mService.getStackBounds(FULLSCREEN_WORKSPACE_STACK_ID, mTmpBoundsRect);
- if (!mTmpBoundsRect.isEmpty()) {
+ mService.getStackBounds(FULLSCREEN_WORKSPACE_STACK_ID, mTmpToBounds);
+ if (!mTmpToBounds.isEmpty()) {
// If there is a fullscreen bounds, use that
- toBounds = new Rect(mTmpBoundsRect);
+ toBounds = new Rect(mTmpToBounds);
} else {
// Otherwise, use the display bounds
toBounds = new Rect();
@@ -142,16 +138,15 @@ public class PinnedStackWindowController extends StackWindowController {
return;
}
- final Rect toBounds = getPictureInPictureBounds(aspectRatio,
- true /* useExistingStackBounds */);
- final Rect targetBounds = new Rect();
- mContainer.getAnimationOrCurrentBounds(targetBounds);
final PinnedStackController pinnedStackController =
mContainer.getDisplayContent().getPinnedStackController();
if (Float.compare(aspectRatio, pinnedStackController.getAspectRatio()) != 0) {
- if (!toBounds.equals(targetBounds)) {
- animateResizePinnedStack(toBounds, null /* sourceHintBounds */,
+ mContainer.getAnimationOrCurrentBounds(mTmpFromBounds);
+ mTmpToBounds.set(mTmpFromBounds);
+ getPictureInPictureBounds(aspectRatio, mTmpToBounds);
+ if (!mTmpToBounds.equals(mTmpFromBounds)) {
+ animateResizePinnedStack(mTmpToBounds, null /* sourceHintBounds */,
-1 /* duration */, false /* fromFullscreen */);
}
pinnedStackController.setAspectRatio(
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 233e75bbfec7..fb500bc256fd 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -858,14 +858,20 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
final int privateflags = attrs.privateFlags;
boolean displayHasContent = false;
+ if (DEBUG_KEEP_SCREEN_ON && (attrFlags & FLAG_KEEP_SCREEN_ON) != 0
+ && w != mService.mLastWakeLockHoldingWindow) {
+ Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w
+ + " has FLAG_KEEP_SCREEN_ON set, hasSurface=" + w.mHasSurface
+ + ", canBeSeen=" + canBeSeen);
+ }
+
if (w.mHasSurface && canBeSeen) {
if ((attrFlags & FLAG_KEEP_SCREEN_ON) != 0) {
mHoldScreen = w.mSession;
mHoldScreenWindow = w;
} else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) {
Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding "
- + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by"
- + Debug.getCallers(10));
+ + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!!");
}
if (!syswin && w.mAttrs.screenBrightness >= 0 && mScreenBrightness < 0) {
mScreenBrightness = w.mAttrs.screenBrightness;
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index b2667781b955..1f7ef5014d36 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -31,6 +31,9 @@ import android.graphics.Rect;
import android.os.Environment;
import android.os.Handler;
import android.util.ArraySet;
+import android.view.DisplayListCanvas;
+import android.view.RenderNode;
+import android.view.ThreadedRenderer;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManagerPolicy.ScreenOffListener;
import android.view.WindowManagerPolicy.StartingSurface;
@@ -238,19 +241,22 @@ class TaskSnapshotController {
final int color = task.getTaskDescription().getBackgroundColor();
final int statusBarColor = task.getTaskDescription().getStatusBarColor();
final int navigationBarColor = task.getTaskDescription().getNavigationBarColor();
- final Bitmap b = Bitmap.createBitmap(mainWindow.getFrameLw().width(),
- mainWindow.getFrameLw().height(), ARGB_8888);
- final Canvas c = new Canvas(b);
- c.drawColor(color);
final LayoutParams attrs = mainWindow.getAttrs();
final SystemBarBackgroundPainter decorPainter = new SystemBarBackgroundPainter(attrs.flags,
attrs.privateFlags, attrs.systemUiVisibility, statusBarColor, navigationBarColor);
+ final int width = mainWindow.getFrameLw().width();
+ final int height = mainWindow.getFrameLw().height();
+
+ final RenderNode node = RenderNode.create("TaskSnapshotController", null);
+ node.setLeftTopRightBottom(0, 0, width, height);
+ node.setClipToBounds(false);
+ final DisplayListCanvas c = node.start(width, height);
+ c.drawColor(color);
decorPainter.setInsets(mainWindow.mContentInsets, mainWindow.mStableInsets);
decorPainter.drawDecors(c, null /* statusBarExcludeFrame */);
+ node.end(c);
+ final Bitmap hwBitmap = ThreadedRenderer.createHardwareBitmap(node, width, height);
- // Flush writer.
- c.setBitmap(null);
- final Bitmap hwBitmap = b.copy(HARDWARE, false /* isMutable */);
return new TaskSnapshot(hwBitmap.createGraphicBufferHandle(),
topChild.getConfiguration().orientation, mainWindow.mStableInsets,
false /* reduced */, 1.0f /* scale */);
diff --git a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java
index 8279b5167766..c080f344c186 100644
--- a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java
+++ b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java
@@ -77,5 +77,5 @@ public class WindowManagerDebugConfig {
static final boolean DEBUG_UNKNOWN_APP_VISIBILITY = false;
static final String TAG_KEEP_SCREEN_ON = "DebugKeepScreenOn";
- static final boolean DEBUG_KEEP_SCREEN_ON = false;
+ static final boolean DEBUG_KEEP_SCREEN_ON = true;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index a15891bc6414..02fdfeeb365d 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -123,6 +123,7 @@ import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.Point;
@@ -349,6 +350,7 @@ public class WindowManagerService extends IWindowManager.Stub
private static final int ANIMATION_DURATION_SCALE = 2;
final private KeyguardDisableHandler mKeyguardDisableHandler;
+ boolean mKeyguardGoingAway;
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
@@ -2629,7 +2631,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
- public void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX,
+ public void overridePendingAppTransitionThumb(GraphicBuffer srcThumb, int startX,
int startY, IRemoteCallback startedCallback, boolean scaleUp) {
synchronized(mWindowMap) {
mAppTransition.overridePendingAppTransitionThumb(srcThumb, startX, startY,
@@ -2638,7 +2640,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
- public void overridePendingAppTransitionAspectScaledThumb(Bitmap srcThumb, int startX,
+ public void overridePendingAppTransitionAspectScaledThumb(GraphicBuffer srcThumb, int startX,
int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
boolean scaleUp) {
synchronized(mWindowMap) {
@@ -2876,6 +2878,12 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ public void setKeyguardGoingAway(boolean keyguardGoingAway) {
+ synchronized (mWindowMap) {
+ mKeyguardGoingAway = keyguardGoingAway;
+ }
+ }
+
// -------------------------------------------------------------
// Misc IWindowSession methods
// -------------------------------------------------------------
@@ -3816,20 +3824,22 @@ public class WindowManagerService extends IWindowManager.Stub
long origId = Binder.clearCallingIdentity();
try {
- final boolean rotationChanged;
// TODO(multi-display): Update rotation for different displays separately.
- final DisplayContent displayContent = getDefaultDisplayContentLocked();
+ final boolean rotationChanged;
+ final int displayId;
synchronized (mWindowMap) {
+ final DisplayContent displayContent = getDefaultDisplayContentLocked();
rotationChanged = displayContent.updateRotationUnchecked(
false /* inTransaction */);
if (!rotationChanged || forceRelayout) {
- getDefaultDisplayContentLocked().setLayoutNeeded();
+ displayContent.setLayoutNeeded();
mWindowPlacerLocked.performSurfacePlacement();
}
+ displayId = displayContent.getDisplayId();
}
if (rotationChanged || alwaysSendConfiguration) {
- sendNewConfiguration(displayContent.getDisplayId());
+ sendNewConfiguration(displayId);
}
} finally {
Binder.restoreCallingIdentity(origId);
@@ -6457,7 +6467,7 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" window="); pw.print(mWindowAnimationScaleSetting);
pw.print(" transition="); pw.print(mTransitionAnimationScaleSetting);
pw.print(" animator="); pw.println(mAnimatorDurationScaleSetting);
- pw.print(" mSkipAppTransitionAnimation=");pw.println(mSkipAppTransitionAnimation);
+ pw.print(" mSkipAppTransitionAnimation=");pw.println(mSkipAppTransitionAnimation);
pw.println(" mLayoutToAnim:");
mAppTransition.dump(pw, " ");
}
@@ -6890,9 +6900,11 @@ public class WindowManagerService extends IWindowManager.Stub
"registerDockedStackListener()")) {
return;
}
- // TODO(multi-display): The listener is registered on the default display only.
- getDefaultDisplayContentLocked().mDividerControllerLocked.registerDockedStackListener(
- listener);
+ synchronized (mWindowMap) {
+ // TODO(multi-display): The listener is registered on the default display only.
+ getDefaultDisplayContentLocked().mDividerControllerLocked.registerDockedStackListener(
+ listener);
+ }
}
@Override
@@ -7173,6 +7185,11 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
+ public boolean isKeyguardGoingAway() {
+ return WindowManagerService.this.mKeyguardGoingAway;
+ }
+
+ @Override
public void showGlobalActions() {
WindowManagerService.this.showGlobalActions();
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 4c86166e6f04..44a867c9b65f 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -3419,7 +3419,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
pw.print(prefix); pw.print("mOrientationChanging=");
pw.print(mOrientationChanging);
pw.print(" mAppFreezing="); pw.print(mAppFreezing);
- pw.print(" mTurnOnScreen="); pw.println(mTurnOnScreen);
+ pw.print(" mTurnOnScreen="); pw.print(mTurnOnScreen);
pw.print(" mReportOrientationChanged="); pw.println(mReportOrientationChanged);
}
if (mLastFreezeDuration != 0) {
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index 4a1a7052a8b0..3c13a1e0691d 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -38,11 +38,9 @@ import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
import android.content.res.Configuration;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
+import android.graphics.GraphicBuffer;
import android.graphics.PixelFormat;
import android.graphics.Rect;
-import android.os.Binder;
import android.os.Debug;
import android.os.Trace;
import android.util.ArraySet;
@@ -675,8 +673,9 @@ class WindowSurfacePlacer {
return;
}
final int taskId = appToken.getTask().mTaskId;
- Bitmap thumbnailHeader = mService.mAppTransition.getAppTransitionThumbnailHeader(taskId);
- if (thumbnailHeader == null || thumbnailHeader.getConfig() == Bitmap.Config.ALPHA_8) {
+ final GraphicBuffer thumbnailHeader =
+ mService.mAppTransition.getAppTransitionThumbnailHeader(taskId);
+ if (thumbnailHeader == null) {
if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId);
return;
}
@@ -694,18 +693,17 @@ class WindowSurfacePlacer {
SurfaceControl surfaceControl = new SurfaceControl(mService.mFxSession,
"thumbnail anim", dirty.width(), dirty.height(),
PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN,
- appToken.windowType, window.mOwnerUid);
+ appToken.windowType,
+ window != null ? window.mOwnerUid : Binder.getCallingUid());
surfaceControl.setLayerStack(display.getLayerStack());
if (SHOW_TRANSACTIONS) {
Slog.i(TAG, " THUMBNAIL " + surfaceControl + ": CREATE");
}
- // Draw the thumbnail onto the surface
+ // Transfer the thumbnail to the surface
Surface drawSurface = new Surface();
drawSurface.copyFrom(surfaceControl);
- Canvas c = drawSurface.lockCanvas(dirty);
- c.drawBitmap(thumbnailHeader, 0, 0, null);
- drawSurface.unlockCanvasAndPost(c);
+ drawSurface.attachAndQueueBuffer(thumbnailHeader);
drawSurface.release();
// Get the thumbnail animation
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 9cfa542da9d1..bac121695ed9 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -235,8 +235,7 @@ public class ActivityTestsBase {
if (mStackId == ActivityManager.StackId.PINNED_STACK_ID) {
mStack = new PinnedActivityStack(this, recents, mOnTop) {
@Override
- Rect getPictureInPictureBounds(float aspectRatio,
- boolean useExistingStackBounds) {
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
return new Rect(50, 50, 100, 100);
}
};
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index 16b73d5515e5..562443f53546 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -62,6 +62,8 @@ import com.android.server.pm.Installer;
import com.android.server.pm.Installer.InstallerException;
import com.android.server.storage.CacheQuotaStrategy;
+import java.io.File;
+import java.io.FileNotFoundException;
import java.io.IOException;
public class StorageStatsService extends IStorageStatsManager.Stub {
@@ -181,29 +183,42 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
public long getFreeBytes(String volumeUuid, String callingPackage) {
// NOTE: No permissions required
- long cacheBytes = 0;
final long token = Binder.clearCallingIdentity();
try {
+ final File path;
+ try {
+ path = mStorage.findPathForUuid(volumeUuid);
+ } catch (FileNotFoundException e) {
+ throw new ParcelableException(e);
+ }
+
+ // Free space is usable bytes plus any cached data that we're
+ // willing to automatically clear. To avoid user confusion, this
+ // logic should be kept in sync with getAllocatableBytes().
if (isQuotaSupported(volumeUuid, callingPackage)) {
- for (UserInfo user : mUser.getUsers()) {
- final StorageStats stats = queryStatsForUser(volumeUuid, user.id, null);
- cacheBytes += stats.cacheBytes;
- }
+ final long cacheTotal = getCacheBytes(volumeUuid, callingPackage);
+ final long cacheReserved = mStorage.getStorageCacheBytes(path);
+ final long cacheClearable = Math.max(0, cacheTotal - cacheReserved);
+
+ return path.getUsableSpace() + cacheClearable;
+ } else {
+ return path.getUsableSpace();
}
} finally {
Binder.restoreCallingIdentity(token);
}
+ }
- if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
- return Environment.getDataDirectory().getFreeSpace() + cacheBytes;
- } else {
- final VolumeInfo vol = mStorage.findVolumeByUuid(volumeUuid);
- if (vol == null) {
- throw new ParcelableException(
- new IOException("Failed to find storage device for UUID " + volumeUuid));
- }
- return vol.getPath().getFreeSpace() + cacheBytes;
+ @Override
+ public long getCacheBytes(String volumeUuid, String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+
+ long cacheBytes = 0;
+ for (UserInfo user : mUser.getUsers()) {
+ final StorageStats stats = queryStatsForUser(volumeUuid, user.id, null);
+ cacheBytes += stats.cacheBytes;
}
+ return cacheBytes;
}
@Override
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 15fd2ceea5fa..deb0e09e6f72 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -18,6 +18,7 @@ package android.view;
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
@@ -210,13 +211,13 @@ public class IWindowManagerImpl implements IWindowManager {
}
@Override
- public void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX, int startY,
+ public void overridePendingAppTransitionThumb(GraphicBuffer srcThumb, int startX, int startY,
IRemoteCallback startedCallback, boolean scaleUp) throws RemoteException {
// TODO Auto-generated method stub
}
@Override
- public void overridePendingAppTransitionAspectScaledThumb(Bitmap srcThumb, int startX,
+ public void overridePendingAppTransitionAspectScaledThumb(GraphicBuffer srcThumb, int startX,
int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
boolean scaleUp) {
// TODO Auto-generated method stub
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 0e0a524e158e..164b7b059183 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -1802,25 +1802,25 @@ public class WifiManager {
}
/**
- * Start AccessPoint mode with the specified
- * configuration. If the radio is already running in
- * AP mode, update the new configuration
- * Note that starting in access point mode disables station
- * mode operation
+ * This call will be deprecated and removed in an upcoming release. It is no longer used to
+ * start WiFi Tethering. Please use {@link ConnectivityManager#startTethering(int, boolean,
+ * ConnectivityManager#OnStartTetheringCallback)} if
+ * the caller has proper permissions. Callers can also use the LocalOnlyHotspot feature for a
+ * hotspot capable of communicating with co-located devices {@link
+ * WifiManager#startLocalOnlyHotspot(LocalOnlyHotspotCallback)}.
+ *
* @param wifiConfig SSID, security and channel details as
* part of WifiConfiguration
- * @return {@code true} if the operation succeeds, {@code false} otherwise
+ * @return {@code false}
*
* @hide
*/
@SystemApi
public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
- try {
- mService.setWifiApEnabled(wifiConfig, enabled);
- return true;
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ String packageName = mContext.getOpPackageName();
+
+ Log.w(TAG, packageName + " attempted call to setWifiApEnabled: enabled = " + enabled);
+ return false;
}
/**
diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
index 84ac1183c897..b235ccc7a89e 100644
--- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
@@ -778,4 +778,13 @@ public class WifiManagerTest {
verify(mWifiService).stopWatchLocalOnlyHotspot();
}
+ /**
+ * Verify that calls to setWifiApEnabled return false.
+ */
+ @Test
+ public void testSetWifiApEnabledReturnsFalse() throws Exception {
+ assertFalse(mWifiManager.setWifiApEnabled(null, true));
+ assertFalse(mWifiManager.setWifiApEnabled(null, false));
+ verify(mWifiService, never()).setWifiApEnabled(any(), anyBoolean());
+ }
}