Merge "Update language to comply with Android's inclusive language guidance" into main am: 3e78552ea3
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2717545
Change-Id: I606094f4ecbc2bb9df7b9d5066e2c4de88fcdbd0
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/api/StubLibraries.bp b/api/StubLibraries.bp
index dc17a78..9a0053f 100644
--- a/api/StubLibraries.bp
+++ b/api/StubLibraries.bp
@@ -572,147 +572,6 @@
},
}
-//
-// Java API defaults and libraries for single tree build
-//
-
-java_defaults {
- name: "stub-annotation-defaults",
- libs: [
- "stub-annotations",
- ],
- static_libs: [
- // stub annotations do not contribute to the API surfaces but are statically
- // linked in the stubs for API surfaces (see frameworks/base/StubLibraries.bp).
- // This is because annotation processors insist on loading the classes for any
- // annotations found, thus should exist inside android.jar.
- "private-stub-annotations-jar",
- ],
-}
-
-// Listing of API domains contribution and dependencies per API surfaces
-java_defaults {
- name: "android_test_stubs_current_contributions",
- api_surface: "test",
- api_contributions: [
- "test-api-stubs-docs-non-updatable.api.contribution",
- "framework-virtualization.stubs.source.test.api.contribution",
- ],
-}
-
-java_defaults {
- name: "android_module_lib_stubs_current_contributions",
- api_surface: "module-lib",
- api_contributions: [
- "api-stubs-docs-non-updatable.api.contribution",
- "system-api-stubs-docs-non-updatable.api.contribution",
- "module-lib-api-stubs-docs-non-updatable.api.contribution",
- "art.module.public.api.stubs.source.api.contribution",
- "art.module.public.api.stubs.source.system.api.contribution",
- "art.module.public.api.stubs.source.module_lib.api.contribution",
- "i18n.module.public.api.stubs.source.api.contribution",
- "i18n.module.public.api.stubs.source.system.api.contribution",
- "i18n.module.public.api.stubs.source.module_lib.api.contribution",
- ],
-}
-
-// Java API library definitions per API surface
-java_api_library {
- name: "android_stubs_current.from-text",
- api_surface: "public",
- defaults: [
- // This module is dynamically created at frameworks/base/api/api.go
- // instead of being written out, in order to minimize edits in the codebase
- // when there is a change in the list of modules.
- // that contributes to an api surface.
- "android_stubs_current_contributions",
- "stub-annotation-defaults",
- ],
- api_contributions: [
- "api-stubs-docs-non-updatable.api.contribution",
- ],
- visibility: ["//visibility:public"],
-}
-
-java_api_library {
- name: "android_system_stubs_current.from-text",
- api_surface: "system",
- defaults: [
- "android_stubs_current_contributions",
- "android_system_stubs_current_contributions",
- "stub-annotation-defaults",
- ],
- api_contributions: [
- "api-stubs-docs-non-updatable.api.contribution",
- "system-api-stubs-docs-non-updatable.api.contribution",
- ],
- visibility: ["//visibility:public"],
-}
-
-java_api_library {
- name: "android_test_stubs_current.from-text",
- api_surface: "test",
- defaults: [
- "android_stubs_current_contributions",
- "android_system_stubs_current_contributions",
- "android_test_stubs_current_contributions",
- "stub-annotation-defaults",
- ],
- api_contributions: [
- "api-stubs-docs-non-updatable.api.contribution",
- "system-api-stubs-docs-non-updatable.api.contribution",
- ],
- visibility: ["//visibility:public"],
-}
-
-java_api_library {
- name: "android_module_lib_stubs_current_full.from-text",
- api_surface: "module-lib",
- defaults: [
- "android_stubs_current_contributions",
- "android_system_stubs_current_contributions",
- "android_module_lib_stubs_current_contributions_full",
- ],
- libs: [
- "stub-annotations",
- ],
- api_contributions: [
- "api-stubs-docs-non-updatable.api.contribution",
- "system-api-stubs-docs-non-updatable.api.contribution",
- "module-lib-api-stubs-docs-non-updatable.api.contribution",
- ],
- visibility: ["//visibility:public"],
-}
-
-java_api_library {
- name: "android_module_lib_stubs_current.from-text",
- api_surface: "module-lib",
- defaults: [
- "android_module_lib_stubs_current_contributions",
- ],
- libs: [
- "android_module_lib_stubs_current_full.from-text",
- "stub-annotations",
- ],
- visibility: ["//visibility:public"],
-}
-
-java_api_library {
- name: "android_system_server_stubs_current.from-text",
- api_surface: "system-server",
- api_contributions: [
- "services-non-updatable-stubs.api.contribution",
- ],
- libs: [
- "android_module_lib_stubs_current.from-text",
- "stub-annotations",
- ],
- static_libs: [
- "android_module_lib_stubs_current.from-text",
- ],
- visibility: ["//visibility:public"],
-}
-
////////////////////////////////////////////////////////////////////////
// api-versions.xml generation, for public and system. This API database
// also contains the android.test.* APIs.
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 6706091..53e0a05 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -21,8 +21,6 @@
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
-import static android.content.Intent.FLAG_RECEIVER_FOREGROUND;
import static android.view.Display.INVALID_DISPLAY;
import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED;
@@ -1758,9 +1756,7 @@
* @hide
*/
public int getPendingIntentLaunchFlags() {
- // b/243794108: Ignore all flags except the new task flag, to be reconsidered in b/254490217
- return mPendingIntentLaunchFlags &
- (FLAG_ACTIVITY_NEW_TASK | FLAG_RECEIVER_FOREGROUND);
+ return mPendingIntentLaunchFlags;
}
/**
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index a4a3fdb..90e3e9d 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -2857,17 +2857,6 @@
if (person != null) {
visitor.accept(person.getIconUri());
}
-
- final RemoteInputHistoryItem[] history = (RemoteInputHistoryItem[])
- extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
- if (history != null) {
- for (int i = 0; i < history.length; i++) {
- RemoteInputHistoryItem item = history[i];
- if (item.getUri() != null) {
- visitor.accept(item.getUri());
- }
- }
- }
}
if (isStyle(MessagingStyle.class) && extras != null) {
@@ -2898,14 +2887,6 @@
}
}
- if (isStyle(CallStyle.class) & extras != null) {
- Person callPerson = extras.getParcelable(EXTRA_CALL_PERSON);
- if (callPerson != null) {
- visitor.accept(callPerson.getIconUri());
- }
- visitIconUri(visitor, extras.getParcelable(EXTRA_VERIFICATION_ICON));
- }
-
if (mBubbleMetadata != null) {
visitIconUri(visitor, mBubbleMetadata.getIcon());
}
diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java
index b85ea36..295df5c 100644
--- a/core/java/android/content/pm/ShortcutInfo.java
+++ b/core/java/android/content/pm/ShortcutInfo.java
@@ -285,12 +285,6 @@
*/
public static final int DISABLED_REASON_OTHER_RESTORE_ISSUE = 103;
- /**
- * The maximum length of Shortcut ID. IDs will be truncated at this limit.
- * @hide
- */
- public static final int MAX_ID_LENGTH = 1000;
-
/** @hide */
@IntDef(prefix = { "DISABLED_REASON_" }, value = {
DISABLED_REASON_NOT_DISABLED,
@@ -483,7 +477,8 @@
private ShortcutInfo(Builder b) {
mUserId = b.mContext.getUserId();
- mId = getSafeId(Preconditions.checkStringNotEmpty(b.mId, "Shortcut ID must be provided"));
+
+ mId = Preconditions.checkStringNotEmpty(b.mId, "Shortcut ID must be provided");
// Note we can't do other null checks here because SM.updateShortcuts() takes partial
// information.
@@ -589,14 +584,6 @@
return ret;
}
- @NonNull
- private static String getSafeId(@NonNull String id) {
- if (id.length() > MAX_ID_LENGTH) {
- return id.substring(0, MAX_ID_LENGTH);
- }
- return id;
- }
-
/**
* Throws if any of the mandatory fields is not set.
*
@@ -2355,8 +2342,7 @@
final ClassLoader cl = getClass().getClassLoader();
mUserId = source.readInt();
- mId = getSafeId(Preconditions.checkStringNotEmpty(source.readString8(),
- "Shortcut ID must be provided"));
+ mId = source.readString8();
mPackageName = source.readString8();
mActivity = source.readParcelable(cl, android.content.ComponentName.class);
mFlags = source.readInt();
diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl
index 45dad98..6a93b35 100644
--- a/core/java/android/permission/IPermissionManager.aidl
+++ b/core/java/android/permission/IPermissionManager.aidl
@@ -77,7 +77,8 @@
List<SplitPermissionInfoParcelable> getSplitPermissions();
void startOneTimePermissionSession(String packageName, int userId, long timeout,
- long revokeAfterKilledDelay);
+ long revokeAfterKilledDelay, int importanceToResetTimer,
+ int importanceToKeepSessionAlive);
void stopOneTimePermissionSession(String packageName, int userId);
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index 6769954..6b540d7 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -1371,7 +1371,8 @@
@ActivityManager.RunningAppProcessInfo.Importance int importanceToKeepSessionAlive) {
try {
mPermissionManager.startOneTimePermissionSession(packageName, mContext.getUserId(),
- timeoutMillis, revokeAfterKilledDelayMillis);
+ timeoutMillis, revokeAfterKilledDelayMillis, importanceToResetTimer,
+ importanceToKeepSessionAlive);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index d67a476..033f726 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -877,7 +877,7 @@
* <application>
* <property
* android:name=
- * "android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
+ * "android.window.PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
* android:value="false"/>
* </application>
* </pre>
@@ -885,8 +885,8 @@
* @hide
*/
// TODO(b/274924641): Make this public API.
- String PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED =
- "android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED";
+ String PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED =
+ "android.window.PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED";
/**
* Application level {@link android.content.pm.PackageManager.Property PackageManager
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index c985ae8..a339062 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -726,12 +726,6 @@
mActions.get(i).visitUris(visitor);
}
}
- if (mLandscape != null) {
- mLandscape.visitUris(visitor);
- }
- if (mPortrait != null) {
- mPortrait.visitUris(visitor);
- }
}
private static void visitIconUri(Icon icon, @NonNull Consumer<Uri> visitor) {
diff --git a/core/tests/coretests/src/android/widget/RemoteViewsTest.java b/core/tests/coretests/src/android/widget/RemoteViewsTest.java
index ed2a32b..bbf9f3c 100644
--- a/core/tests/coretests/src/android/widget/RemoteViewsTest.java
+++ b/core/tests/coretests/src/android/widget/RemoteViewsTest.java
@@ -24,10 +24,6 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
import android.app.ActivityOptions;
import android.app.PendingIntent;
@@ -37,8 +33,6 @@
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.net.Uri;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Looper;
@@ -64,7 +58,6 @@
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
-import java.util.function.Consumer;
/**
* Tests for RemoteViews.
@@ -700,61 +693,4 @@
return null;
}
}
-
- @Test
- public void visitUris() {
- RemoteViews views = new RemoteViews(mPackage, R.layout.remote_views_test);
-
- final Uri imageUri = Uri.parse("content://media/image");
- final Icon icon1 = Icon.createWithContentUri("content://media/icon1");
- final Icon icon2 = Icon.createWithContentUri("content://media/icon2");
- final Icon icon3 = Icon.createWithContentUri("content://media/icon3");
- final Icon icon4 = Icon.createWithContentUri("content://media/icon4");
- views.setImageViewUri(R.id.image, imageUri);
- views.setTextViewCompoundDrawables(R.id.text, icon1, icon2, icon3, icon4);
-
- Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
- views.visitUris(visitor);
- verify(visitor, times(1)).accept(eq(imageUri));
- verify(visitor, times(1)).accept(eq(icon1.getUri()));
- verify(visitor, times(1)).accept(eq(icon2.getUri()));
- verify(visitor, times(1)).accept(eq(icon3.getUri()));
- verify(visitor, times(1)).accept(eq(icon4.getUri()));
- }
-
- @Test
- public void visitUris_separateOrientation() {
- final RemoteViews landscape = new RemoteViews(mPackage, R.layout.remote_views_test);
- final Uri imageUriL = Uri.parse("content://landscape/image");
- final Icon icon1L = Icon.createWithContentUri("content://landscape/icon1");
- final Icon icon2L = Icon.createWithContentUri("content://landscape/icon2");
- final Icon icon3L = Icon.createWithContentUri("content://landscape/icon3");
- final Icon icon4L = Icon.createWithContentUri("content://landscape/icon4");
- landscape.setImageViewUri(R.id.image, imageUriL);
- landscape.setTextViewCompoundDrawables(R.id.text, icon1L, icon2L, icon3L, icon4L);
-
- final RemoteViews portrait = new RemoteViews(mPackage, 33);
- final Uri imageUriP = Uri.parse("content://portrait/image");
- final Icon icon1P = Icon.createWithContentUri("content://portrait/icon1");
- final Icon icon2P = Icon.createWithContentUri("content://portrait/icon2");
- final Icon icon3P = Icon.createWithContentUri("content://portrait/icon3");
- final Icon icon4P = Icon.createWithContentUri("content://portrait/icon4");
- portrait.setImageViewUri(R.id.image, imageUriP);
- portrait.setTextViewCompoundDrawables(R.id.text, icon1P, icon2P, icon3P, icon4P);
-
- RemoteViews views = new RemoteViews(landscape, portrait);
-
- Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
- views.visitUris(visitor);
- verify(visitor, times(1)).accept(eq(imageUriL));
- verify(visitor, times(1)).accept(eq(icon1L.getUri()));
- verify(visitor, times(1)).accept(eq(icon2L.getUri()));
- verify(visitor, times(1)).accept(eq(icon3L.getUri()));
- verify(visitor, times(1)).accept(eq(icon4L.getUri()));
- verify(visitor, times(1)).accept(eq(imageUriP));
- verify(visitor, times(1)).accept(eq(icon1P.getUri()));
- verify(visitor, times(1)).accept(eq(icon2P.getUri()));
- verify(visitor, times(1)).accept(eq(icon3P.getUri()));
- verify(visitor, times(1)).accept(eq(icon4P.getUri()));
- }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java
index 4c2e0da..bdf0ac2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java
@@ -164,10 +164,6 @@
t.remove(mGapBackgroundLeash);
mGapBackgroundLeash = null;
}
- if (mScreenshot != null) {
- t.remove(mScreenshot);
- mScreenshot = null;
- }
mHostLeash = null;
mIcon = null;
mResizingIconView = null;
@@ -327,8 +323,6 @@
if (!mShown && mIsResizing && !mOldBounds.equals(mResizingBounds)) {
if (mScreenshotAnimator != null && mScreenshotAnimator.isRunning()) {
mScreenshotAnimator.cancel();
- } else if (mScreenshot != null) {
- t.remove(mScreenshot);
}
mTempRect.set(mOldBounds);
@@ -345,8 +339,6 @@
if (!mShown && mIsResizing && !mOldBounds.equals(mResizingBounds)) {
if (mScreenshotAnimator != null && mScreenshotAnimator.isRunning()) {
mScreenshotAnimator.cancel();
- } else if (mScreenshot != null) {
- t.remove(mScreenshot);
}
mScreenshot = screenshot;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index 7da7502..c4b5470 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -73,6 +73,7 @@
import android.window.TaskSnapshot;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
+import android.window.WindowContainerTransactionCallback;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.common.ProtoLog;
@@ -144,6 +145,23 @@
protected final ShellTaskOrganizer mTaskOrganizer;
protected final ShellExecutor mMainExecutor;
+ // the runnable to execute after WindowContainerTransactions is applied to finish resizing pip
+ private Runnable mPipFinishResizeWCTRunnable;
+
+ private final WindowContainerTransactionCallback mPipFinishResizeWCTCallback =
+ new WindowContainerTransactionCallback() {
+ @Override
+ public void onTransactionReady(int id, SurfaceControl.Transaction t) {
+ t.apply();
+
+ // execute the runnable if non-null after WCT is applied to finish resizing pip
+ if (mPipFinishResizeWCTRunnable != null) {
+ mPipFinishResizeWCTRunnable.run();
+ mPipFinishResizeWCTRunnable = null;
+ }
+ }
+ };
+
// These callbacks are called on the update thread
private final PipAnimationController.PipAnimationCallback mPipAnimationCallback =
new PipAnimationController.PipAnimationCallback() {
@@ -1260,8 +1278,23 @@
/**
* Animates resizing of the pinned stack given the duration and start bounds.
* This is used when the starting bounds is not the current PiP bounds.
+ *
+ * @param pipFinishResizeWCTRunnable callback to run after window updates are complete
*/
public void scheduleAnimateResizePip(Rect fromBounds, Rect toBounds, int duration,
+ float startingAngle, Consumer<Rect> updateBoundsCallback,
+ Runnable pipFinishResizeWCTRunnable) {
+ mPipFinishResizeWCTRunnable = pipFinishResizeWCTRunnable;
+ if (mPipFinishResizeWCTRunnable != null) {
+ ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+ "mPipFinishResizeWCTRunnable is set to be called once window updates");
+ }
+
+ scheduleAnimateResizePip(fromBounds, toBounds, duration, startingAngle,
+ updateBoundsCallback);
+ }
+
+ private void scheduleAnimateResizePip(Rect fromBounds, Rect toBounds, int duration,
float startingAngle, Consumer<Rect> updateBoundsCallback) {
if (mWaitForFixedRotation) {
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
@@ -1566,7 +1599,7 @@
mSplitScreenOptional.ifPresent(splitScreenController ->
splitScreenController.enterSplitScreen(mTaskInfo.taskId, wasPipTopLeft, wct));
} else {
- mTaskOrganizer.applyTransaction(wct);
+ mTaskOrganizer.applySyncTransaction(wct, mPipFinishResizeWCTCallback);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
index 41ff0b3..3e83c5f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java
@@ -580,8 +580,16 @@
final float snapFraction = mPipBoundsAlgorithm.getSnapFraction(
mLastResizeBounds, movementBounds);
mPipBoundsAlgorithm.applySnapFraction(mLastResizeBounds, snapFraction);
+
+ // disable the pinch resizing until the final bounds are updated
+ final boolean prevEnablePinchResize = mEnablePinchResize;
+ mEnablePinchResize = false;
+
mPipTaskOrganizer.scheduleAnimateResizePip(startBounds, mLastResizeBounds,
- PINCH_RESIZE_SNAP_DURATION, mAngle, mUpdateResizeBoundsCallback);
+ PINCH_RESIZE_SNAP_DURATION, mAngle, mUpdateResizeBoundsCallback, () -> {
+ // reset the pinch resizing to its default state
+ mEnablePinchResize = prevEnablePinchResize;
+ });
} else {
mPipTaskOrganizer.scheduleFinishResizePip(mLastResizeBounds,
PipAnimationController.TRANSITION_DIRECTION_USER_RESIZE,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java
index c7b9eb3..5f356c9 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java
@@ -155,7 +155,7 @@
mPipResizeGestureHandler.onPinchResize(upEvent);
verify(mPipTaskOrganizer, times(1))
- .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any());
+ .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any(), any());
assertTrue("The new size should be bigger than the original PiP size.",
mPipResizeGestureHandler.getLastResizeBounds().width()
@@ -194,7 +194,7 @@
mPipResizeGestureHandler.onPinchResize(upEvent);
verify(mPipTaskOrganizer, times(1))
- .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any());
+ .scheduleAnimateResizePip(any(), any(), anyInt(), anyFloat(), any(), any());
assertTrue("The new size should be smaller than the original PiP size.",
mPipResizeGestureHandler.getLastResizeBounds().width()
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt
index 83e44b6..f0a8211 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt
@@ -18,10 +18,8 @@
import android.graphics.fonts.Font
import android.graphics.fonts.FontVariationAxis
-import android.util.LruCache
import android.util.MathUtils
import android.util.MathUtils.abs
-import androidx.annotation.VisibleForTesting
import java.lang.Float.max
import java.lang.Float.min
@@ -36,10 +34,6 @@
private const val FONT_ITALIC_ANIMATION_STEP = 0.1f
private const val FONT_ITALIC_DEFAULT_VALUE = 0f
-// Benchmarked via Perfetto, difference between 10 and 50 entries is about 0.3ms in
-// frame draw time on a Pixel 6.
-@VisibleForTesting const val FONT_CACHE_MAX_ENTRIES = 10
-
/** Provide interpolation of two fonts by adjusting font variation settings. */
class FontInterpolator {
@@ -87,8 +81,8 @@
// Font interpolator has two level caches: one for input and one for font with different
// variation settings. No synchronization is needed since FontInterpolator is not designed to be
// thread-safe and can be used only on UI thread.
- private val interpCache = LruCache<InterpKey, Font>(FONT_CACHE_MAX_ENTRIES)
- private val verFontCache = LruCache<VarFontKey, Font>(FONT_CACHE_MAX_ENTRIES)
+ private val interpCache = hashMapOf<InterpKey, Font>()
+ private val verFontCache = hashMapOf<VarFontKey, Font>()
// Mutable keys for recycling.
private val tmpInterpKey = InterpKey(null, null, 0f)
@@ -158,7 +152,7 @@
tmpVarFontKey.set(start, newAxes)
val axesCachedFont = verFontCache[tmpVarFontKey]
if (axesCachedFont != null) {
- interpCache.put(InterpKey(start, end, progress), axesCachedFont)
+ interpCache[InterpKey(start, end, progress)] = axesCachedFont
return axesCachedFont
}
@@ -166,8 +160,8 @@
// Font.Builder#build won't throw IOException since creating fonts from existing fonts will
// not do any IO work.
val newFont = Font.Builder(start).setFontVariationSettings(newAxes.toTypedArray()).build()
- interpCache.put(InterpKey(start, end, progress), newFont)
- verFontCache.put(VarFontKey(start, newAxes), newFont)
+ interpCache[InterpKey(start, end, progress)] = newFont
+ verFontCache[VarFontKey(start, newAxes)] = newFont
return newFont
}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt
index 3ee97be..9e9929e 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt
@@ -24,10 +24,8 @@
import android.graphics.Typeface
import android.graphics.fonts.Font
import android.text.Layout
-import android.util.LruCache
private const val DEFAULT_ANIMATION_DURATION: Long = 300
-private const val TYPEFACE_CACHE_MAX_ENTRIES = 5
typealias GlyphCallback = (TextAnimator.PositionedGlyph, Float) -> Unit
/**
@@ -116,7 +114,7 @@
private val fontVariationUtils = FontVariationUtils()
- private val typefaceCache = LruCache<String, Typeface>(TYPEFACE_CACHE_MAX_ENTRIES)
+ private val typefaceCache = HashMap<String, Typeface?>()
fun updateLayout(layout: Layout) {
textInterpolator.layout = layout
@@ -220,12 +218,12 @@
}
if (!fvar.isNullOrBlank()) {
- textInterpolator.targetPaint.typeface = typefaceCache.get(fvar) ?: run {
- textInterpolator.targetPaint.fontVariationSettings = fvar
- textInterpolator.targetPaint.typeface?.also {
+ textInterpolator.targetPaint.typeface =
+ typefaceCache.getOrElse(fvar) {
+ textInterpolator.targetPaint.fontVariationSettings = fvar
typefaceCache.put(fvar, textInterpolator.targetPaint.typeface)
+ textInterpolator.targetPaint.typeface
}
- }
}
if (color != null) {
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index adc4c55..3faacf2 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -396,7 +396,7 @@
<dimen name="navigation_key_width">70dp</dimen>
<!-- The width/height of the icon of a navigation button -->
- <dimen name="navigation_icon_size">24dp</dimen>
+ <dimen name="navigation_icon_size">32dp</dimen>
<!-- The padding on the side of the navigation bar. Must be greater than or equal to
navigation_extra_key_width -->
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index 16299c7..061bab8 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -752,7 +752,7 @@
case SimPuk:
// Shortcut for SIM PIN/PUK to go to directly to user's security screen or home
SecurityMode securityMode = mSecurityModel.getSecurityMode(targetUserId);
- if (securityMode == SecurityMode.None || mLockPatternUtils.isLockScreenDisabled(
+ if (securityMode == SecurityMode.None && mLockPatternUtils.isLockScreenDisabled(
KeyguardUpdateMonitor.getCurrentUser())) {
finish = true;
eventSubtype = BOUNCER_DISMISS_SIM;
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java
index a2872e3..a475653 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java
@@ -182,10 +182,6 @@
* Returns collection of present {@link Complication}.
*/
public Collection<Complication> getComplications(boolean filterByAvailability) {
- if (isLowLightActive()) {
- // Don't show complications on low light.
- return Collections.emptyList();
- }
return Collections.unmodifiableCollection(filterByAvailability
? mComplications
.stream()
@@ -197,8 +193,7 @@
if (mShouldShowComplications) {
return (requiredTypes & getAvailableComplicationTypes()) == requiredTypes;
}
- final int typesToAlwaysShow = mSupportedTypes & getAvailableComplicationTypes();
- return (requiredTypes & typesToAlwaysShow) == requiredTypes;
+ return (requiredTypes & mSupportedTypes) == requiredTypes;
})
.collect(Collectors.toCollection(HashSet::new))
: mComplications);
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
index ddce516..5770f3e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
@@ -47,7 +47,6 @@
duration = TO_LOCKSCREEN_DURATION,
onStep = { value -> -translatePx + value * translatePx },
interpolator = EMPHASIZED_DECELERATE,
- onCancel = { 0f },
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java b/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java
index ef0fa01..a4f1ef4f 100644
--- a/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java
+++ b/packages/SystemUI/src/com/android/systemui/touch/TouchInsetManager.java
@@ -90,9 +90,6 @@
final Region cumulativeRegion = Region.obtain();
mTrackedViews.stream().forEach(view -> {
- if (!view.isAttachedToWindow()) {
- return;
- }
final Rect boundaries = new Rect();
view.getDrawingRect(boundaries);
((ViewGroup) view.getRootView()).offsetDescendantRectToMyCoords(view, boundaries);
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
index 3b3df23..d492758 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
@@ -163,6 +163,8 @@
@Captor
private ArgumentCaptor<KeyguardSecurityContainer.SwipeListener> mSwipeListenerArgumentCaptor;
+ private Configuration mConfiguration;
+
private KeyguardSecurityContainerController mKeyguardSecurityContainerController;
private KeyguardPasswordViewController mKeyguardPasswordViewController;
private KeyguardPasswordView mKeyguardPasswordView;
@@ -170,12 +172,12 @@
@Before
public void setup() {
+ mConfiguration = new Configuration();
+ mConfiguration.setToDefaults(); // Defaults to ORIENTATION_UNDEFINED.
mTestableResources = mContext.getOrCreateTestableResources();
- mTestableResources.getResources().getConfiguration().orientation =
- Configuration.ORIENTATION_UNDEFINED;
when(mView.getContext()).thenReturn(mContext);
- when(mView.getResources()).thenReturn(mTestableResources.getResources());
+ when(mView.getResources()).thenReturn(mContext.getResources());
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(/* width= */ 0, /* height= */
0);
lp.gravity = 0;
@@ -252,8 +254,6 @@
@Test
public void onResourcesUpdate_callsThroughOnRotationChange() {
- clearInvocations(mView);
-
// Rotation is the same, shouldn't cause an update
mKeyguardSecurityContainerController.updateResources();
verify(mView, never()).initMode(eq(MODE_DEFAULT), eq(mGlobalSettings), eq(mFalsingManager),
@@ -579,12 +579,12 @@
// Set initial gravity
mTestableResources.addOverride(R.integer.keyguard_host_view_gravity,
Gravity.CENTER);
- mTestableResources.addOverride(
- R.bool.can_use_one_handed_bouncer, false);
// Kick off the initial pass...
mKeyguardSecurityContainerController.onInit();
- verify(mView).setLayoutParams(any());
+ verify(mView).setLayoutParams(argThat(
+ (ArgumentMatcher<FrameLayout.LayoutParams>) argument ->
+ argument.gravity == Gravity.CENTER));
clearInvocations(mView);
// Now simulate a config change
@@ -592,7 +592,9 @@
Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
mKeyguardSecurityContainerController.updateResources();
- verify(mView).setLayoutParams(any());
+ verify(mView).setLayoutParams(argThat(
+ (ArgumentMatcher<FrameLayout.LayoutParams>) argument ->
+ argument.gravity == (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM)));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt
index 57a355f..8a5c5b5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt
@@ -106,29 +106,4 @@
val reversedFont = interp.lerp(endFont, startFont, 0.5f)
assertThat(resultFont).isSameInstanceAs(reversedFont)
}
-
- @Test
- fun testCacheMaxSize() {
- val interp = FontInterpolator()
-
- val startFont = Font.Builder(sFont)
- .setFontVariationSettings("'wght' 100")
- .build()
- val endFont = Font.Builder(sFont)
- .setFontVariationSettings("'wght' 1")
- .build()
- val resultFont = interp.lerp(startFont, endFont, 0.5f)
- for (i in 0..FONT_CACHE_MAX_ENTRIES + 1) {
- val f1 = Font.Builder(sFont)
- .setFontVariationSettings("'wght' ${i * 100}")
- .build()
- val f2 = Font.Builder(sFont)
- .setFontVariationSettings("'wght' $i")
- .build()
- interp.lerp(f1, f2, 0.5f)
- }
-
- val cachedFont = interp.lerp(startFont, endFont, 0.5f)
- assertThat(resultFont).isNotSameInstanceAs(cachedFont)
- }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java
index d0c1c4d..34fa76f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java
@@ -235,23 +235,6 @@
}
@Test
- public void testComplicationsNotShownForLowLight() {
- final Complication complication = Mockito.mock(Complication.class);
- final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
-
- // Add a complication and verify it's returned in getComplications.
- stateController.addComplication(complication);
- mExecutor.runAllReady();
- assertThat(stateController.getComplications().contains(complication))
- .isTrue();
-
- stateController.setLowLightActive(true);
- mExecutor.runAllReady();
-
- assertThat(stateController.getComplications()).isEmpty();
- }
-
- @Test
public void testNotifyLowLightChanged() {
final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
@@ -353,34 +336,6 @@
}
}
- @Test
- public void testHomeControlsDoNotShowIfNotAvailable_featureEnabled() {
- when(mFeatureFlags.isEnabled(Flags.ALWAYS_SHOW_HOME_CONTROLS_ON_DREAMS)).thenReturn(true);
-
- final DreamOverlayStateController stateController = getDreamOverlayStateController(true);
- stateController.setShouldShowComplications(true);
-
- final Complication homeControlsComplication = Mockito.mock(Complication.class);
- when(homeControlsComplication.getRequiredTypeAvailability())
- .thenReturn(Complication.COMPLICATION_TYPE_HOME_CONTROLS);
-
- stateController.addComplication(homeControlsComplication);
-
- final DreamOverlayStateController.Callback callback =
- Mockito.mock(DreamOverlayStateController.Callback.class);
-
- stateController.addCallback(callback);
- mExecutor.runAllReady();
-
- // No home controls since it is not available.
- assertThat(stateController.getComplications()).doesNotContain(homeControlsComplication);
-
- stateController.setAvailableComplicationTypes(Complication.COMPLICATION_TYPE_HOME_CONTROLS
- | Complication.COMPLICATION_TYPE_WEATHER);
- mExecutor.runAllReady();
- assertThat(stateController.getComplications()).contains(homeControlsComplication);
- }
-
private DreamOverlayStateController getDreamOverlayStateController(boolean overlayEnabled) {
return new DreamOverlayStateController(mExecutor, overlayEnabled, mFeatureFlags);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt
index efa5f0c..0c4e845 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt
@@ -92,21 +92,6 @@
job.cancel()
}
- @Test
- fun lockscreenTranslationYResettedAfterJobCancelled() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
-
- val pixels = 100
- val job =
- underTest.lockscreenTranslationY(pixels).onEach { values.add(it) }.launchIn(this)
- repository.sendTransitionStep(step(0.5f, TransitionState.CANCELED))
-
- assertThat(values.last()).isEqualTo(0f)
-
- job.cancel()
- }
-
private fun step(
value: Float,
state: TransitionState = TransitionState.RUNNING
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 4c234a0..89a55e1 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -2254,8 +2254,8 @@
synchronized (VolumeStreamState.class) {
mStreamStates[AudioSystem.STREAM_DTMF]
.setAllIndexes(mStreamStates[dtmfStreamAlias], caller);
- mStreamStates[AudioSystem.STREAM_ACCESSIBILITY].setSettingName(
- System.VOLUME_SETTINGS_INT[a11yStreamAlias]);
+ mStreamStates[AudioSystem.STREAM_ACCESSIBILITY].mVolumeIndexSettingName =
+ System.VOLUME_SETTINGS_INT[a11yStreamAlias];
mStreamStates[AudioSystem.STREAM_ACCESSIBILITY].setAllIndexes(
mStreamStates[a11yStreamAlias], caller);
}
@@ -7518,7 +7518,7 @@
private int mPublicStreamType = AudioSystem.STREAM_MUSIC;
private AudioAttributes mAudioAttributes = AudioProductStrategy.getDefaultAttributes();
private boolean mIsMuted = false;
- private String mSettingName;
+ private final String mSettingName;
// No API in AudioSystem to get a device from strategy or from attributes.
// Need a valid public stream type to use current API getDeviceForStream
@@ -7847,19 +7847,15 @@
}
private void persistVolumeGroup(int device) {
- // No need to persist the index if the volume group is backed up
- // by a public stream type as this is redundant
- if (mUseFixedVolume || mHasValidStreamType) {
+ if (mUseFixedVolume) {
return;
}
if (DEBUG_VOL) {
Log.v(TAG, "persistVolumeGroup: storing index " + getIndex(device) + " for group "
+ mAudioVolumeGroup.name()
+ ", device " + AudioSystem.getOutputDeviceName(device)
- + " and User=" + getCurrentUserId()
- + " mSettingName: " + mSettingName);
+ + " and User=" + getCurrentUserId());
}
-
boolean success = mSettings.putSystemIntForUser(mContentResolver,
getSettingNameForDevice(device),
getIndex(device),
@@ -7922,14 +7918,6 @@
return mSettingName + "_" + AudioSystem.getOutputDeviceName(device);
}
- void setSettingName(String settingName) {
- mSettingName = settingName;
- }
-
- String getSettingName() {
- return mSettingName;
- }
-
private void dump(PrintWriter pw) {
pw.println("- VOLUME GROUP " + mAudioVolumeGroup.name() + ":");
pw.print(" Muted: ");
@@ -8054,9 +8042,6 @@
*/
public void setVolumeGroupState(VolumeGroupState volumeGroupState) {
mVolumeGroupState = volumeGroupState;
- if (mVolumeGroupState != null) {
- mVolumeGroupState.setSettingName(mVolumeIndexSettingName);
- }
}
/**
* Update the minimum index that can be used without MODIFY_AUDIO_SETTINGS permission
@@ -8127,17 +8112,6 @@
return (mVolumeIndexSettingName != null && !mVolumeIndexSettingName.isEmpty());
}
- void setSettingName(String settingName) {
- mVolumeIndexSettingName = settingName;
- if (mVolumeGroupState != null) {
- mVolumeGroupState.setSettingName(mVolumeIndexSettingName);
- }
- }
-
- String getSettingName() {
- return mVolumeIndexSettingName;
- }
-
public void readSettings() {
synchronized (mSettingsLock) {
synchronized (VolumeStreamState.class) {
@@ -8786,7 +8760,7 @@
if (streamState.hasValidSettingsName()) {
mSettings.putSystemIntForUser(mContentResolver,
streamState.getSettingNameForDevice(device),
- (streamState.getIndex(device) + 5) / 10,
+ (streamState.getIndex(device) + 5)/ 10,
UserHandle.USER_CURRENT);
}
}
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 703ae11..fa115a5 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -2095,25 +2095,9 @@
// The caller explicitly specified INSTALL_ALL_USERS flag.
// Thus, updating the settings to install the app for all users.
for (int currentUserId : allUsers) {
- // If the app is already installed for the currentUser,
- // keep it as installed as we might be updating the app at this place.
- // If not currently installed, check if the currentUser is restricted by
- // DISALLOW_INSTALL_APPS or DISALLOW_DEBUGGING_FEATURES device policy.
- // Install / update the app if the user isn't restricted. Skip otherwise.
- final boolean installedForCurrentUser = ArrayUtils.contains(
- installedForUsers, currentUserId);
- final boolean restrictedByPolicy =
- mPm.isUserRestricted(currentUserId,
- UserManager.DISALLOW_INSTALL_APPS)
- || mPm.isUserRestricted(currentUserId,
- UserManager.DISALLOW_DEBUGGING_FEATURES);
- if (installedForCurrentUser || !restrictedByPolicy) {
- ps.setInstalled(true, currentUserId);
- ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, currentUserId,
- installerPackageName);
- } else {
- ps.setInstalled(false, currentUserId);
- }
+ ps.setInstalled(true, currentUserId);
+ ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, userId,
+ installerPackageName);
}
}
diff --git a/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java b/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java
index d28048c..881f870 100644
--- a/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java
+++ b/services/core/java/com/android/server/pm/permission/OneTimePermissionUserManager.java
@@ -16,26 +16,23 @@
package com.android.server.pm.permission;
+import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED;
+
import android.annotation.NonNull;
import android.app.ActivityManager;
-import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
-import android.app.IActivityManager;
-import android.app.IUidObserver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Handler;
-import android.os.RemoteException;
import android.permission.PermissionControllerManager;
import android.provider.DeviceConfig;
import android.util.Log;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
-import com.android.server.LocalServices;
/**
* Class that handles one-time permissions for a user
@@ -50,8 +47,7 @@
"one_time_permissions_killed_delay_millis";
private final @NonNull Context mContext;
- private final @NonNull IActivityManager mIActivityManager;
- private final @NonNull ActivityManagerInternal mActivityManagerInternal;
+ private final @NonNull ActivityManager mActivityManager;
private final @NonNull AlarmManager mAlarmManager;
private final @NonNull PermissionControllerManager mPermissionControllerManager;
@@ -81,15 +77,49 @@
OneTimePermissionUserManager(@NonNull Context context) {
mContext = context;
- mIActivityManager = ActivityManager.getService();
- mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
+ mActivityManager = context.getSystemService(ActivityManager.class);
mAlarmManager = context.getSystemService(AlarmManager.class);
mPermissionControllerManager = context.getSystemService(PermissionControllerManager.class);
mHandler = context.getMainThreadHandler();
}
+ /**
+ * Starts a one-time permission session for a given package. A one-time permission session is
+ * ended if app becomes inactive. Inactivity is defined as the package's uid importance level
+ * staying > importanceToResetTimer for timeoutMillis milliseconds. If the package's uid
+ * importance level goes <= importanceToResetTimer then the timer is reset and doesn't start
+ * until going > importanceToResetTimer.
+ * <p>
+ * When this timeoutMillis is reached if the importance level is <= importanceToKeepSessionAlive
+ * then the session is extended until either the importance goes above
+ * importanceToKeepSessionAlive which will end the session or <= importanceToResetTimer which
+ * will continue the session and reset the timer.
+ * </p>
+ * <p>
+ * Importance levels are defined in {@link android.app.ActivityManager.RunningAppProcessInfo}.
+ * </p>
+ * <p>
+ * Once the session ends PermissionControllerService#onNotifyOneTimePermissionSessionTimeout
+ * is invoked.
+ * </p>
+ * <p>
+ * Note that if there is currently an active session for a package a new one isn't created and
+ * the existing one isn't changed.
+ * </p>
+ * @param packageName The package to start a one-time permission session for
+ * @param timeoutMillis Number of milliseconds for an app to be in an inactive state
+ * @param revokeAfterKilledDelayMillis Number of milliseconds to wait after the process dies
+ * before ending the session. Set to -1 to use default value
+ * for the device.
+ * @param importanceToResetTimer The least important level to uid must be to reset the timer
+ * @param importanceToKeepSessionAlive The least important level the uid must be to keep the
+ * session alive
+ *
+ * @hide
+ */
void startPackageOneTimeSession(@NonNull String packageName, long timeoutMillis,
- long revokeAfterKilledDelayMillis) {
+ long revokeAfterKilledDelayMillis, int importanceToResetTimer,
+ int importanceToKeepSessionAlive) {
int uid;
try {
uid = mContext.getPackageManager().getPackageUid(packageName, 0);
@@ -101,11 +131,13 @@
synchronized (mLock) {
PackageInactivityListener listener = mListeners.get(uid);
if (listener != null) {
- listener.updateSessionParameters(timeoutMillis, revokeAfterKilledDelayMillis);
+ listener.updateSessionParameters(timeoutMillis, revokeAfterKilledDelayMillis,
+ importanceToResetTimer, importanceToKeepSessionAlive);
return;
}
listener = new PackageInactivityListener(uid, packageName, timeoutMillis,
- revokeAfterKilledDelayMillis);
+ revokeAfterKilledDelayMillis, importanceToResetTimer,
+ importanceToKeepSessionAlive);
mListeners.put(uid, listener);
}
}
@@ -150,58 +182,34 @@
private static final long TIMER_INACTIVE = -1;
- private static final int STATE_GONE = 0;
- private static final int STATE_TIMER = 1;
- private static final int STATE_ACTIVE = 2;
-
private final int mUid;
private final @NonNull String mPackageName;
private long mTimeout;
private long mRevokeAfterKilledDelay;
+ private int mImportanceToResetTimer;
+ private int mImportanceToKeepSessionAlive;
private boolean mIsAlarmSet;
private boolean mIsFinished;
private long mTimerStart = TIMER_INACTIVE;
+ private final ActivityManager.OnUidImportanceListener mStartTimerListener;
+ private final ActivityManager.OnUidImportanceListener mSessionKillableListener;
+ private final ActivityManager.OnUidImportanceListener mGoneListener;
+
private final Object mInnerLock = new Object();
private final Object mToken = new Object();
- private final IUidObserver.Stub mObserver = new IUidObserver.Stub() {
- @Override
- public void onUidGone(int uid, boolean disabled) {
- if (uid == mUid) {
- PackageInactivityListener.this.updateUidState(STATE_GONE);
- }
- }
-
- @Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq,
- int capability) {
- if (uid == mUid) {
- if (procState > ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
- && procState != ActivityManager.PROCESS_STATE_NONEXISTENT) {
- PackageInactivityListener.this.updateUidState(STATE_TIMER);
- } else {
- PackageInactivityListener.this.updateUidState(STATE_ACTIVE);
- }
- }
- }
-
- public void onUidActive(int uid) {
- }
- public void onUidIdle(int uid, boolean disabled) {
- }
- public void onUidProcAdjChanged(int uid) {
- }
- public void onUidCachedChanged(int uid, boolean cached) {
- }
- };
private PackageInactivityListener(int uid, @NonNull String packageName, long timeout,
- long revokeAfterkilledDelay) {
+ long revokeAfterkilledDelay, int importanceToResetTimer,
+ int importanceToKeepSessionAlive) {
+
Log.i(LOG_TAG,
"Start tracking " + packageName + ". uid=" + uid + " timeout=" + timeout
- + " killedDelay=" + revokeAfterkilledDelay);
+ + " killedDelay=" + revokeAfterkilledDelay
+ + " importanceToResetTimer=" + importanceToResetTimer
+ + " importanceToKeepSessionAlive=" + importanceToKeepSessionAlive);
mUid = uid;
mPackageName = packageName;
@@ -211,24 +219,27 @@
DeviceConfig.NAMESPACE_PERMISSIONS, PROPERTY_KILLED_DELAY_CONFIG_KEY,
DEFAULT_KILLED_DELAY_MILLIS)
: revokeAfterkilledDelay;
+ mImportanceToResetTimer = importanceToResetTimer;
+ mImportanceToKeepSessionAlive = importanceToKeepSessionAlive;
- try {
- mIActivityManager.registerUidObserver(mObserver,
- ActivityManager.UID_OBSERVER_GONE | ActivityManager.UID_OBSERVER_PROCSTATE,
- ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE,
- null);
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Couldn't check uid proc state", e);
- // Can't register uid observer, just revoke immediately
- synchronized (mInnerLock) {
- onPackageInactiveLocked();
- }
- }
+ mStartTimerListener =
+ (changingUid, importance) -> onImportanceChanged(changingUid, importance);
+ mSessionKillableListener =
+ (changingUid, importance) -> onImportanceChanged(changingUid, importance);
+ mGoneListener =
+ (changingUid, importance) -> onImportanceChanged(changingUid, importance);
- updateUidState();
+ mActivityManager.addOnUidImportanceListener(mStartTimerListener,
+ importanceToResetTimer);
+ mActivityManager.addOnUidImportanceListener(mSessionKillableListener,
+ importanceToKeepSessionAlive);
+ mActivityManager.addOnUidImportanceListener(mGoneListener, IMPORTANCE_CACHED);
+
+ onImportanceChanged(mUid, mActivityManager.getPackageImportance(packageName));
}
- public void updateSessionParameters(long timeoutMillis, long revokeAfterKilledDelayMillis) {
+ public void updateSessionParameters(long timeoutMillis, long revokeAfterKilledDelayMillis,
+ int importanceToResetTimer, int importanceToKeepSessionAlive) {
synchronized (mInnerLock) {
mTimeout = Math.min(mTimeout, timeoutMillis);
mRevokeAfterKilledDelay = Math.min(mRevokeAfterKilledDelay,
@@ -237,74 +248,63 @@
DeviceConfig.NAMESPACE_PERMISSIONS,
PROPERTY_KILLED_DELAY_CONFIG_KEY, DEFAULT_KILLED_DELAY_MILLIS)
: revokeAfterKilledDelayMillis);
+ mImportanceToResetTimer = Math.min(importanceToResetTimer, mImportanceToResetTimer);
+ mImportanceToKeepSessionAlive = Math.min(importanceToKeepSessionAlive,
+ mImportanceToKeepSessionAlive);
Log.v(LOG_TAG,
"Updated params for " + mPackageName + ". timeout=" + mTimeout
- + " killedDelay=" + mRevokeAfterKilledDelay);
- updateUidState();
+ + " killedDelay=" + mRevokeAfterKilledDelay
+ + " importanceToResetTimer=" + mImportanceToResetTimer
+ + " importanceToKeepSessionAlive=" + mImportanceToKeepSessionAlive);
+ onImportanceChanged(mUid, mActivityManager.getPackageImportance(mPackageName));
}
}
- private int getCurrentState() {
- return getStateFromProcState(mActivityManagerInternal.getUidProcessState(mUid));
- }
-
- private int getStateFromProcState(int procState) {
- if (procState == ActivityManager.PROCESS_STATE_NONEXISTENT) {
- return STATE_GONE;
- } else {
- if (procState > ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
- return STATE_TIMER;
- } else {
- return STATE_ACTIVE;
- }
+ private void onImportanceChanged(int uid, int importance) {
+ if (uid != mUid) {
+ return;
}
- }
- private void updateUidState() {
- updateUidState(getCurrentState());
- }
-
- private void updateUidState(int state) {
- Log.v(LOG_TAG, "Updating state for " + mPackageName + " (" + mUid + ")."
- + " state=" + state);
+ Log.v(LOG_TAG, "Importance changed for " + mPackageName + " (" + mUid + ")."
+ + " importance=" + importance);
synchronized (mInnerLock) {
// Remove any pending inactivity callback
mHandler.removeCallbacksAndMessages(mToken);
- if (state == STATE_GONE) {
+ if (importance > IMPORTANCE_CACHED) {
if (mRevokeAfterKilledDelay == 0) {
onPackageInactiveLocked();
return;
}
// Delay revocation in case app is restarting
mHandler.postDelayed(() -> {
- int currentState;
- synchronized (mInnerLock) {
- currentState = getCurrentState();
- if (currentState == STATE_GONE) {
- onPackageInactiveLocked();
- return;
+ int imp = mActivityManager.getUidImportance(mUid);
+ if (imp > IMPORTANCE_CACHED) {
+ onPackageInactiveLocked();
+ } else {
+ if (DEBUG) {
+ Log.d(LOG_TAG, "No longer gone after delayed revocation. "
+ + "Rechecking for " + mPackageName + " (" + mUid + ").");
}
+ onImportanceChanged(mUid, imp);
}
- if (DEBUG) {
- Log.d(LOG_TAG, "No longer gone after delayed revocation. "
- + "Rechecking for " + mPackageName + " (" + mUid
- + ").");
- }
- updateUidState(currentState);
}, mToken, mRevokeAfterKilledDelay);
return;
- } else if (state == STATE_TIMER) {
+ }
+ if (importance > mImportanceToResetTimer) {
if (mTimerStart == TIMER_INACTIVE) {
if (DEBUG) {
Log.d(LOG_TAG, "Start the timer for "
+ mPackageName + " (" + mUid + ").");
}
mTimerStart = System.currentTimeMillis();
- setAlarmLocked();
}
- } else if (state == STATE_ACTIVE) {
+ } else {
mTimerStart = TIMER_INACTIVE;
+ }
+ if (importance > mImportanceToKeepSessionAlive) {
+ setAlarmLocked();
+ } else {
cancelAlarmLocked();
}
}
@@ -318,9 +318,19 @@
mIsFinished = true;
cancelAlarmLocked();
try {
- mIActivityManager.unregisterUidObserver(mObserver);
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Unable to unregister uid observer.", e);
+ mActivityManager.removeOnUidImportanceListener(mStartTimerListener);
+ } catch (IllegalArgumentException e) {
+ Log.e(LOG_TAG, "Could not remove start timer listener", e);
+ }
+ try {
+ mActivityManager.removeOnUidImportanceListener(mSessionKillableListener);
+ } catch (IllegalArgumentException e) {
+ Log.e(LOG_TAG, "Could not remove session killable listener", e);
+ }
+ try {
+ mActivityManager.removeOnUidImportanceListener(mGoneListener);
+ } catch (IllegalArgumentException e) {
+ Log.e(LOG_TAG, "Could not remove gone listener", e);
}
}
}
@@ -384,11 +394,9 @@
mPermissionControllerManager.notifyOneTimePermissionSessionTimeout(
mPackageName);
});
- try {
- mIActivityManager.unregisterUidObserver(mObserver);
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Unable to unregister uid observer.", e);
- }
+ mActivityManager.removeOnUidImportanceListener(mStartTimerListener);
+ mActivityManager.removeOnUidImportanceListener(mSessionKillableListener);
+ mActivityManager.removeOnUidImportanceListener(mGoneListener);
synchronized (mLock) {
mListeners.remove(mUid);
}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 9ebe6b4..1c2603c 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -386,7 +386,8 @@
@Override
public void startOneTimePermissionSession(String packageName, @UserIdInt int userId,
- long timeoutMillis, long revokeAfterKilledDelayMillis) {
+ long timeoutMillis, long revokeAfterKilledDelayMillis, int importanceToResetTimer,
+ int importanceToKeepSessionAlive) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS,
"Must hold " + Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS
@@ -396,7 +397,8 @@
final long token = Binder.clearCallingIdentity();
try {
getOneTimePermissionUserManager(userId).startPackageOneTimeSession(packageName,
- timeoutMillis, revokeAfterKilledDelayMillis);
+ timeoutMillis, revokeAfterKilledDelayMillis, importanceToResetTimer,
+ importanceToKeepSessionAlive);
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java
index 684e787..4b2cb7d 100644
--- a/services/core/java/com/android/server/wm/LetterboxUiController.java
+++ b/services/core/java/com/android/server/wm/LetterboxUiController.java
@@ -48,9 +48,9 @@
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH;
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE;
-import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE;
import static android.view.WindowManager.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS;
+import static android.view.WindowManager.PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
import static android.view.WindowManager.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION;
import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__BOTTOM;
@@ -241,7 +241,7 @@
private final Boolean mBooleanPropertyIgnoreRequestedOrientation;
@Nullable
- private final Boolean mBooleanPropertyAllowIgnoringOrientationRequestWhenLoopDetected;
+ private final Boolean mBooleanPropertyIgnoreOrientationRequestWhenLoopDetected;
@Nullable
private final Boolean mBooleanPropertyFakeFocus;
@@ -264,10 +264,10 @@
readComponentProperty(packageManager, mActivityRecord.packageName,
mLetterboxConfiguration::isPolicyForIgnoringRequestedOrientationEnabled,
PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION);
- mBooleanPropertyAllowIgnoringOrientationRequestWhenLoopDetected =
+ mBooleanPropertyIgnoreOrientationRequestWhenLoopDetected =
readComponentProperty(packageManager, mActivityRecord.packageName,
mLetterboxConfiguration::isPolicyForIgnoringRequestedOrientationEnabled,
- PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED);
+ PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED);
mBooleanPropertyFakeFocus =
readComponentProperty(packageManager, mActivityRecord.packageName,
mLetterboxConfiguration::isCompatFakeFocusEnabled,
@@ -453,7 +453,7 @@
/* gatingCondition */ mLetterboxConfiguration
::isPolicyForIgnoringRequestedOrientationEnabled,
mIsOverrideEnableCompatIgnoreOrientationRequestWhenLoopDetectedEnabled,
- mBooleanPropertyAllowIgnoringOrientationRequestWhenLoopDetected)) {
+ mBooleanPropertyIgnoreOrientationRequestWhenLoopDetected)) {
return false;
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 95fea0e..2d21e71 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -2053,16 +2053,19 @@
/**
* Like isOnScreen(), but we don't return true if the window is part
- * of a transition that has not yet been started.
+ * of a transition but has not yet started animating.
*/
boolean isReadyForDisplay() {
- if (mToken.waitingToShow && getDisplayContent().mAppTransition.isTransitionSet()) {
+ if (!mHasSurface || mDestroying || !isVisibleByPolicy()) {
+ return false;
+ }
+ if (mToken.waitingToShow && getDisplayContent().mAppTransition.isTransitionSet()
+ && !isAnimating(TRANSITION | PARENTS, ANIMATION_TYPE_APP_TRANSITION)) {
return false;
}
final boolean parentAndClientVisible = !isParentWindowHidden()
&& mViewVisibility == View.VISIBLE && mToken.isVisible();
- return mHasSurface && isVisibleByPolicy() && !mDestroying
- && (parentAndClientVisible || isAnimating(TRANSITION | PARENTS));
+ return parentAndClientVisible || isAnimating(TRANSITION | PARENTS, ANIMATION_TYPE_ALL);
}
boolean isFullyTransparent() {
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index 86d4655..c786784 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -228,15 +228,6 @@
});
}
- public void testShortcutIdTruncated() {
- ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(),
- "s".repeat(Short.MAX_VALUE)).build();
-
- assertTrue(
- "id must be truncated to MAX_ID_LENGTH",
- si.getId().length() <= ShortcutInfo.MAX_ID_LENGTH);
- }
-
public void testShortcutInfoParcel() {
setCaller(CALLING_PACKAGE_1, USER_10);
ShortcutInfo si = parceled(new ShortcutInfo.Builder(mClientContext)
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 8f8b1c5..874846d 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -128,7 +128,6 @@
import android.app.PendingIntent;
import android.app.Person;
import android.app.RemoteInput;
-import android.app.RemoteInputHistoryItem;
import android.app.StatsManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.usage.UsageStatsManagerInternal;
@@ -5374,36 +5373,10 @@
public void testVisitUris() throws Exception {
final Uri audioContents = Uri.parse("content://com.example/audio");
final Uri backgroundImage = Uri.parse("content://com.example/background");
- final Icon personIcon1 = Icon.createWithContentUri("content://media/person1");
- final Icon personIcon2 = Icon.createWithContentUri("content://media/person2");
- final Icon personIcon3 = Icon.createWithContentUri("content://media/person3");
- final Person person1 = new Person.Builder()
- .setName("Messaging Person")
- .setIcon(personIcon1)
- .build();
- final Person person2 = new Person.Builder()
- .setName("People List Person 1")
- .setIcon(personIcon2)
- .build();
- final Person person3 = new Person.Builder()
- .setName("People List Person 2")
- .setIcon(personIcon3)
- .build();
- final Uri historyUri1 = Uri.parse("content://com.example/history1");
- final Uri historyUri2 = Uri.parse("content://com.example/history2");
- final RemoteInputHistoryItem historyItem1 = new RemoteInputHistoryItem(null, historyUri1,
- "a");
- final RemoteInputHistoryItem historyItem2 = new RemoteInputHistoryItem(null, historyUri2,
- "b");
Bundle extras = new Bundle();
extras.putParcelable(Notification.EXTRA_AUDIO_CONTENTS_URI, audioContents);
extras.putString(Notification.EXTRA_BACKGROUND_IMAGE_URI, backgroundImage.toString());
- extras.putParcelable(Notification.EXTRA_MESSAGING_PERSON, person1);
- extras.putParcelableArrayList(Notification.EXTRA_PEOPLE_LIST,
- new ArrayList<>(Arrays.asList(person2, person3)));
- extras.putParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS,
- new RemoteInputHistoryItem[]{historyItem1, historyItem2});
Notification n = new Notification.Builder(mContext, "a")
.setContentTitle("notification with uris")
@@ -5415,34 +5388,6 @@
n.visitUris(visitor);
verify(visitor, times(1)).accept(eq(audioContents));
verify(visitor, times(1)).accept(eq(backgroundImage));
- verify(visitor, times(1)).accept(eq(personIcon1.getUri()));
- verify(visitor, times(1)).accept(eq(personIcon2.getUri()));
- verify(visitor, times(1)).accept(eq(personIcon3.getUri()));
- verify(visitor, times(1)).accept(eq(historyUri1));
- verify(visitor, times(1)).accept(eq(historyUri2));
- }
-
- @Test
- public void testVisitUris_callStyle() {
- Icon personIcon = Icon.createWithContentUri("content://media/person");
- Icon verificationIcon = Icon.createWithContentUri("content://media/verification");
- Person callingPerson = new Person.Builder().setName("Someone")
- .setIcon(personIcon)
- .build();
- PendingIntent hangUpIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
- PendingIntent.FLAG_IMMUTABLE);
- Notification n = new Notification.Builder(mContext, "a")
- .setStyle(Notification.CallStyle.forOngoingCall(callingPerson, hangUpIntent)
- .setVerificationIcon(verificationIcon))
- .setContentTitle("Calling...")
- .setSmallIcon(android.R.drawable.sym_def_app_icon)
- .build();
-
- Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
- n.visitUris(visitor);
-
- verify(visitor, times(1)).accept(eq(personIcon.getUri()));
- verify(visitor, times(1)).accept(eq(verificationIcon.getUri()));
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
index 4ffd18a..b277283 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
@@ -39,9 +39,9 @@
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH;
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE;
-import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE;
import static android.view.WindowManager.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS;
+import static android.view.WindowManager.PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED;
import static android.view.WindowManager.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -206,7 +206,7 @@
throws Exception {
doReturn(true).when(mLetterboxConfiguration)
.isPolicyForIgnoringRequestedOrientationEnabled();
- mockThatProperty(PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED,
+ mockThatProperty(PROPERTY_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED,
/* value */ false);
doReturn(false).when(mActivity).isLetterboxedForFixedOrientationAndAspectRatio();