diff options
16 files changed, 344 insertions, 30 deletions
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index e93a7854f1cd..65bec0e405ea 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -33,6 +33,7 @@ import android.view.InsetsVisibilities; import com.android.internal.statusbar.IAddTileResultCallback; import com.android.internal.statusbar.IUndoMediaTransferCallback; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.view.AppearanceRegion; @@ -202,10 +203,12 @@ oneway interface IStatusBar * @param behavior the behavior of the focused window. * @param requestedVisibilities the collection of the requested visibilities of system insets. * @param packageName the package name of the focused app. + * @param letterboxDetails a set of letterbox details of apps visible on the screen. */ void onSystemBarAttributesChanged(int displayId, int appearance, in AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - int behavior, in InsetsVisibilities requestedVisibilities, String packageName); + int behavior, in InsetsVisibilities requestedVisibilities, String packageName, + in LetterboxDetails[] letterboxDetails); /** * Notifies System UI to show transient bars. The transient bars are system bars, e.g., status diff --git a/core/java/com/android/internal/statusbar/LetterboxDetails.aidl b/core/java/com/android/internal/statusbar/LetterboxDetails.aidl new file mode 100644 index 000000000000..7875796cd3ba --- /dev/null +++ b/core/java/com/android/internal/statusbar/LetterboxDetails.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 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.statusbar; + +parcelable LetterboxDetails; diff --git a/core/java/com/android/internal/statusbar/LetterboxDetails.java b/core/java/com/android/internal/statusbar/LetterboxDetails.java new file mode 100644 index 000000000000..5d14ee347482 --- /dev/null +++ b/core/java/com/android/internal/statusbar/LetterboxDetails.java @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2022 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.statusbar; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.graphics.Rect; +import android.os.Parcel; +import android.os.Parcelable; +import android.view.InsetsFlags; +import android.view.ViewDebug; +import android.view.WindowInsetsController.Appearance; + +import com.android.internal.util.DataClass; + +/** + * Details about the letterbox state of an app. + */ +@DataClass( + genParcelable = true, + genAidl = true, + genToString = true, + genGetters = false, + genEqualsHashCode = true +) +public class LetterboxDetails implements Parcelable { + + @NonNull + private final Rect mLetterboxInnerBounds; + @NonNull + private final Rect mLetterboxFullBounds; + private final int mAppAppearance; + + /** + * Returns the bounds of the inner letterbox (app content). + * + * <p>When an app is letterboxed, it is not using the full bounds of its window. Here we return + * the bounds that are being used for the app content. + * + * <pre> + * +-------+---------+-------+ + * | | | | + * | | | | + * | Outer | Inner | Outer | + * | | | | + * | | | | + * +-------+-------- +-------+ + * <pre> + */ + @NonNull + public Rect getLetterboxInnerBounds() { + return mLetterboxInnerBounds; + } + + /** + * Returns the full bounds of the letterbox. + * + * <p>These are the entire bounds of the window where the app is placed. We cannot assume that + * the full bounds are the bounds of the screen, as the app can be in split-screen, or can have + * some margin due to display cutouts. + * + * <pre> + * ---- Full bounds width ---- + * +-------+---------+-------+ | + * | | | | | + * | | | | | + * | Outer | Inner | Outer | + Full bounds height + * | | | | | + * | | | | | + * +-------+-------- +-------+ | + * </pre> + */ + @NonNull + public Rect getLetterboxFullBounds() { + return mLetterboxFullBounds; + } + + /** + * Returns the {@link Appearance} of the inner letterbox (app content). + */ + @Appearance + public int getAppAppearance() { + return mAppAppearance; + } + + /** Returns a string representation of the {@link #getAppAppearance()} property. */ + public String appAppearanceToString() { + return ViewDebug.flagsToString(InsetsFlags.class, "appearance", mAppAppearance); + } + + + + // Code below generated by codegen v1.0.23. + // + // DO NOT MODIFY! + // CHECKSTYLE:OFF Generated code + // + // To regenerate run: + // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/com/android/internal/statusbar/LetterboxDetails.java + // + // To exclude the generated code from IntelliJ auto-formatting enable (one-time): + // Settings > Editor > Code Style > Formatter Control + //@formatter:off + + + @DataClass.Generated.Member + public LetterboxDetails( + @NonNull Rect letterboxInnerBounds, + @NonNull Rect letterboxFullBounds, + int appAppearance) { + this.mLetterboxInnerBounds = letterboxInnerBounds; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mLetterboxInnerBounds); + this.mLetterboxFullBounds = letterboxFullBounds; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mLetterboxFullBounds); + this.mAppAppearance = appAppearance; + + // onConstructed(); // You can define this method to get a callback + } + + @Override + @DataClass.Generated.Member + public String toString() { + // You can override field toString logic by defining methods like: + // String fieldNameToString() { ... } + + return "LetterboxDetails { " + + "letterboxInnerBounds = " + mLetterboxInnerBounds + ", " + + "letterboxFullBounds = " + mLetterboxFullBounds + ", " + + "appAppearance = " + appAppearanceToString() + + " }"; + } + + @Override + @DataClass.Generated.Member + public boolean equals(@Nullable Object o) { + // You can override field equality logic by defining either of the methods like: + // boolean fieldNameEquals(LetterboxDetails other) { ... } + // boolean fieldNameEquals(FieldType otherValue) { ... } + + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + @SuppressWarnings("unchecked") + LetterboxDetails that = (LetterboxDetails) o; + //noinspection PointlessBooleanExpression + return true + && java.util.Objects.equals(mLetterboxInnerBounds, that.mLetterboxInnerBounds) + && java.util.Objects.equals(mLetterboxFullBounds, that.mLetterboxFullBounds) + && mAppAppearance == that.mAppAppearance; + } + + @Override + @DataClass.Generated.Member + public int hashCode() { + // You can override field hashCode logic by defining methods like: + // int fieldNameHashCode() { ... } + + int _hash = 1; + _hash = 31 * _hash + java.util.Objects.hashCode(mLetterboxInnerBounds); + _hash = 31 * _hash + java.util.Objects.hashCode(mLetterboxFullBounds); + _hash = 31 * _hash + mAppAppearance; + return _hash; + } + + @Override + @DataClass.Generated.Member + public void writeToParcel(@NonNull Parcel dest, int flags) { + // You can override field parcelling by defining methods like: + // void parcelFieldName(Parcel dest, int flags) { ... } + + dest.writeTypedObject(mLetterboxInnerBounds, flags); + dest.writeTypedObject(mLetterboxFullBounds, flags); + dest.writeInt(mAppAppearance); + } + + @Override + @DataClass.Generated.Member + public int describeContents() { return 0; } + + /** @hide */ + @SuppressWarnings({"unchecked", "RedundantCast"}) + @DataClass.Generated.Member + protected LetterboxDetails(@NonNull Parcel in) { + // You can override field unparcelling by defining methods like: + // static FieldType unparcelFieldName(Parcel in) { ... } + + Rect letterboxInnerBounds = (Rect) in.readTypedObject(Rect.CREATOR); + Rect letterboxFullBounds = (Rect) in.readTypedObject(Rect.CREATOR); + int appAppearance = in.readInt(); + + this.mLetterboxInnerBounds = letterboxInnerBounds; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mLetterboxInnerBounds); + this.mLetterboxFullBounds = letterboxFullBounds; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mLetterboxFullBounds); + this.mAppAppearance = appAppearance; + + // onConstructed(); // You can define this method to get a callback + } + + @DataClass.Generated.Member + public static final @NonNull Parcelable.Creator<LetterboxDetails> CREATOR + = new Parcelable.Creator<LetterboxDetails>() { + @Override + public LetterboxDetails[] newArray(int size) { + return new LetterboxDetails[size]; + } + + @Override + public LetterboxDetails createFromParcel(@NonNull Parcel in) { + return new LetterboxDetails(in); + } + }; + + @DataClass.Generated( + time = 1656941109526L, + codegenVersion = "1.0.23", + sourceFile = "frameworks/base/core/java/com/android/internal/statusbar/LetterboxDetails.java", + inputSignatures = "private final @android.annotation.NonNull android.graphics.Rect mLetterboxInnerBounds\nprivate final @android.annotation.NonNull android.graphics.Rect mLetterboxFullBounds\nprivate final int mAppAppearance\npublic @android.annotation.NonNull android.graphics.Rect getLetterboxInnerBounds()\npublic @android.annotation.NonNull android.graphics.Rect getLetterboxFullBounds()\npublic @android.view.WindowInsetsController.Appearance int getAppAppearance()\npublic java.lang.String appAppearanceToString()\nclass LetterboxDetails extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genParcelable=true, genAidl=true, genToString=true, genGetters=false, genEqualsHashCode=true)") + @Deprecated + private void __metadata() {} + + + //@formatter:on + // End of generated code + +} diff --git a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java index 4dcc82e2e572..8b898f01554f 100644 --- a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java +++ b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java @@ -43,12 +43,14 @@ public final class RegisterStatusBarResult implements Parcelable { public final InsetsVisibilities mRequestedVisibilities; public final String mPackageName; public final int[] mTransientBarTypes; + public final LetterboxDetails[] mLetterboxDetails; public RegisterStatusBarResult(ArrayMap<String, StatusBarIcon> icons, int disabledFlags1, int appearance, AppearanceRegion[] appearanceRegions, int imeWindowVis, int imeBackDisposition, boolean showImeSwitcher, int disabledFlags2, IBinder imeToken, boolean navbarColorManagedByIme, int behavior, InsetsVisibilities requestedVisibilities, - String packageName, @NonNull int[] transientBarTypes) { + String packageName, @NonNull int[] transientBarTypes, + LetterboxDetails[] letterboxDetails) { mIcons = new ArrayMap<>(icons); mDisabledFlags1 = disabledFlags1; mAppearance = appearance; @@ -63,6 +65,7 @@ public final class RegisterStatusBarResult implements Parcelable { mRequestedVisibilities = requestedVisibilities; mPackageName = packageName; mTransientBarTypes = transientBarTypes; + mLetterboxDetails = letterboxDetails; } @Override @@ -86,6 +89,7 @@ public final class RegisterStatusBarResult implements Parcelable { dest.writeTypedObject(mRequestedVisibilities, 0); dest.writeString(mPackageName); dest.writeIntArray(mTransientBarTypes); + dest.writeParcelableArray(mLetterboxDetails, flags); } /** @@ -112,10 +116,13 @@ public final class RegisterStatusBarResult implements Parcelable { source.readTypedObject(InsetsVisibilities.CREATOR); final String packageName = source.readString(); final int[] transientBarTypes = source.createIntArray(); + final LetterboxDetails[] letterboxDetails = + source.readParcelableArray(null, LetterboxDetails.class); return new RegisterStatusBarResult(icons, disabledFlags1, appearance, appearanceRegions, imeWindowVis, imeBackDisposition, showImeSwitcher, disabledFlags2, imeToken, navbarColorManagedByIme, behavior, - requestedVisibilities, packageName, transientBarTypes); + requestedVisibilities, packageName, transientBarTypes, + letterboxDetails); } @Override diff --git a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java index 0f05be06bff6..c53fb23ba948 100644 --- a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java +++ b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java @@ -20,6 +20,7 @@ import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_B import static com.google.common.truth.Truth.assertThat; +import android.graphics.Rect; import android.os.Binder; import android.os.Parcel; import android.os.UserHandle; @@ -48,7 +49,11 @@ public class RegisterStatusBarResultTest { final ArrayMap<String, StatusBarIcon> iconMap = new ArrayMap<>(); iconMap.put(dumyIconKey, new StatusBarIcon("com.android.internal.statusbar.test", UserHandle.of(100), 123, 1, 2, "dummyIconDescription")); - + final LetterboxDetails letterboxDetails = new LetterboxDetails( + /* letterboxInnerBounds= */ new Rect(1, 2, 3, 4), + /* letterboxFullBounds= */ new Rect(5, 6, 7, 8), + /* appAppearance= */ 321 + ); final RegisterStatusBarResult original = new RegisterStatusBarResult(iconMap, 0x2 /* disabledFlags1 */, 0x4 /* appearance */, @@ -62,7 +67,8 @@ public class RegisterStatusBarResultTest { BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, new InsetsVisibilities() /* requestedVisibilities */, "test" /* packageName */, - new int[0] /* transientBarTypes */); + new int[0] /* transientBarTypes */, + new LetterboxDetails[] {letterboxDetails}); final RegisterStatusBarResult copy = clone(original); @@ -84,6 +90,7 @@ public class RegisterStatusBarResultTest { assertThat(copy.mRequestedVisibilities).isEqualTo(original.mRequestedVisibilities); assertThat(copy.mPackageName).isEqualTo(original.mPackageName); assertThat(copy.mTransientBarTypes).isEqualTo(original.mTransientBarTypes); + assertThat(copy.mLetterboxDetails).isEqualTo(original.mLetterboxDetails); } private RegisterStatusBarResult clone(RegisterStatusBarResult original) { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 730f88ab9f8f..5f52485a5481 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -105,6 +105,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.util.LatencyTracker; import com.android.internal.view.AppearanceRegion; import com.android.systemui.Gefingerpoken; @@ -1069,7 +1070,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements @Override public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName) { + @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName, + LetterboxDetails[] letterboxDetails) { if (displayId != mDisplayId) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index 1abf9903c08d..9e0c49641e72 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -57,6 +57,7 @@ import android.view.WindowInsetsController.Behavior; import androidx.annotation.NonNull; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.view.AppearanceRegion; import com.android.systemui.Dumpable; import com.android.systemui.dagger.SysUISingleton; @@ -357,7 +358,8 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, @Override public void onSystemBarAttributesChanged(int displayId, int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, int behavior, - InsetsVisibilities requestedVisibilities, String packageName) { + InsetsVisibilities requestedVisibilities, String packageName, + LetterboxDetails[] letterboxDetails) { mOverviewProxyService.onSystemBarAttributesChanged(displayId, behavior); boolean nbModeChanged = false; if (mAppearance != appearance) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index cc3121ddc0e9..e99244048fd6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -66,6 +66,7 @@ import com.android.internal.os.SomeArgs; import com.android.internal.statusbar.IAddTileResultCallback; import com.android.internal.statusbar.IStatusBar; import com.android.internal.statusbar.IUndoMediaTransferCallback; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.GcUtils; import com.android.internal.view.AppearanceRegion; @@ -361,7 +362,7 @@ public class CommandQueue extends IStatusBar.Stub implements default void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, @Behavior int behavior, InsetsVisibilities requestedVisibilities, - String packageName) { } + String packageName, LetterboxDetails[] letterboxDetails) { } /** * @see IStatusBar#showTransient(int, int[], boolean). @@ -1090,7 +1091,8 @@ public class CommandQueue extends IStatusBar.Stub implements @Override public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName) { + @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName, + LetterboxDetails[] letterboxDetails) { synchronized (mLock) { SomeArgs args = SomeArgs.obtain(); args.argi1 = displayId; @@ -1100,6 +1102,7 @@ public class CommandQueue extends IStatusBar.Stub implements args.argi4 = behavior; args.arg2 = requestedVisibilities; args.arg3 = packageName; + args.arg4 = letterboxDetails; mHandler.obtainMessage(MSG_SYSTEM_BAR_CHANGED, args).sendToTarget(); } } @@ -1561,7 +1564,8 @@ public class CommandQueue extends IStatusBar.Stub implements for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).onSystemBarAttributesChanged(args.argi1, args.argi2, (AppearanceRegion[]) args.arg1, args.argi3 == 1, args.argi4, - (InsetsVisibilities) args.arg2, (String) args.arg3); + (InsetsVisibilities) args.arg2, (String) args.arg3, + (LetterboxDetails[]) args.arg4); } args.recycle(); break; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java index 38c37f03f643..cb9afe887ab7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java @@ -45,6 +45,7 @@ import android.view.WindowInsetsController.Behavior; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.view.AppearanceRegion; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; @@ -463,7 +464,8 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba @Override public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName) { + @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName, + LetterboxDetails[] letterboxDetails) { if (displayId != mDisplayId) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index f01fd1f26ad2..2daa4759457d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -974,7 +974,7 @@ public class CentralSurfacesImpl extends CoreStartable implements } mCommandQueueCallbacks.onSystemBarAttributesChanged(mDisplayId, result.mAppearance, result.mAppearanceRegions, result.mNavbarColorManagedByIme, result.mBehavior, - result.mRequestedVisibilities, result.mPackageName); + result.mRequestedVisibilities, result.mPackageName, result.mLetterboxDetails); // StatusBarManagerService has a back up of IME token and it's restored here. mCommandQueueCallbacks.setImeWindowStatus(mDisplayId, result.mImeToken, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java index c61510cce10e..6e98c49e6d43 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java @@ -32,6 +32,7 @@ import android.view.animation.AccelerateInterpolator; import androidx.lifecycle.Observer; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.view.AppearanceRegion; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.notification.collection.NotifLiveDataStore; @@ -144,7 +145,7 @@ public class LightsOutNotifController extends ViewController<View> { public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, @Behavior int behavior, InsetsVisibilities requestedVisibilities, - String packageName) { + String packageName, LetterboxDetails[] letterboxDetails) { if (displayId != mDisplayId) { return; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index fc4d9c42eb49..cf7f8dd26647 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -41,6 +41,7 @@ import android.view.WindowInsetsController.Behavior; import androidx.test.filters.SmallTest; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.view.AppearanceRegion; import com.android.systemui.SysuiTestCase; @@ -53,6 +54,13 @@ import org.junit.Test; @SmallTest public class CommandQueueTest extends SysuiTestCase { + private static final LetterboxDetails[] TEST_LETTERBOX_DETAILS = new LetterboxDetails[] { + new LetterboxDetails( + /* letterboxInnerBounds= */ new Rect(100, 0, 200, 500), + /* letterboxFullBounds= */ new Rect(0, 0, 500, 100), + /* appAppearance= */ 123) + }; + private CommandQueue mCommandQueue; private Callbacks mCallbacks; private static final int SECONDARY_DISPLAY = 1; @@ -127,25 +135,27 @@ public class CommandQueueTest extends SysuiTestCase { public void testOnSystemBarAttributesChanged() { doTestOnSystemBarAttributesChanged(DEFAULT_DISPLAY, 1, new AppearanceRegion[]{new AppearanceRegion(2, new Rect())}, false, - BEHAVIOR_DEFAULT, new InsetsVisibilities(), "test"); + BEHAVIOR_DEFAULT, new InsetsVisibilities(), "test", TEST_LETTERBOX_DETAILS); } @Test public void testOnSystemBarAttributesChangedForSecondaryDisplay() { doTestOnSystemBarAttributesChanged(SECONDARY_DISPLAY, 1, new AppearanceRegion[]{new AppearanceRegion(2, new Rect())}, false, - BEHAVIOR_DEFAULT, new InsetsVisibilities(), "test"); + BEHAVIOR_DEFAULT, new InsetsVisibilities(), "test", TEST_LETTERBOX_DETAILS); } private void doTestOnSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName) { + @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName, + LetterboxDetails[] letterboxDetails) { mCommandQueue.onSystemBarAttributesChanged(displayId, appearance, appearanceRegions, - navbarColorManagedByIme, behavior, requestedVisibilities, packageName); + navbarColorManagedByIme, behavior, requestedVisibilities, packageName, + letterboxDetails); waitForIdleSync(); verify(mCallbacks).onSystemBarAttributesChanged(eq(displayId), eq(appearance), eq(appearanceRegions), eq(navbarColorManagedByIme), eq(behavior), - eq(requestedVisibilities), eq(packageName)); + eq(requestedVisibilities), eq(packageName), eq(letterboxDetails)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java index 9664035e1e1b..fca9771648ea 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java @@ -108,7 +108,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, null /* requestedVisibilities */, - null /* packageName */); + null /* packageName */, + null /* letterboxDetails */); assertTrue(mLightsOutNotifController.areLightsOut()); } @@ -121,7 +122,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, null /* requestedVisibilities */, - null /* packageName */); + null /* packageName */, + null /* letterboxDetails */); assertFalse(mLightsOutNotifController.areLightsOut()); } @@ -152,7 +154,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, null /* requestedVisibilities */, - null /* packageName */); + null /* packageName */, + null /* letterboxDetails */); // THEN we should show dot assertTrue(mLightsOutNotifController.shouldShowDot()); @@ -172,7 +175,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, null /* requestedVisibilities */, - null /* packageName */); + null /* packageName */, + null /* letterboxDetails */); // THEN we shouldn't show the dot assertFalse(mLightsOutNotifController.shouldShowDot()); @@ -192,7 +196,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, null /* requestedVisibilities */, - null /* packageName */); + null /* packageName */, + null /* letterboxDetails */); // THEN we shouldn't show the dot assertFalse(mLightsOutNotifController.shouldShowDot()); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index b00d8b47906a..53b8b53e2b6c 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -27,6 +27,7 @@ import android.view.InsetsVisibilities; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.view.AppearanceRegion; import com.android.server.notification.NotificationDelegate; @@ -133,7 +134,8 @@ public interface StatusBarManagerInternal { /** @see com.android.internal.statusbar.IStatusBar#onSystemBarAttributesChanged */ void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName); + @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName, + LetterboxDetails[] letterboxDetails); /** @see com.android.internal.statusbar.IStatusBar#showTransient */ void showTransient(int displayId, @InternalInsetsType int[] types, diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 46e7574e1c8a..71b1bc2e24bc 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -96,6 +96,7 @@ import com.android.internal.statusbar.ISessionListener; import com.android.internal.statusbar.IStatusBar; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.IUndoMediaTransferCallback; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.statusbar.NotificationVisibility; import com.android.internal.statusbar.RegisterStatusBarResult; import com.android.internal.statusbar.StatusBarIcon; @@ -596,13 +597,15 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, @Behavior int behavior, InsetsVisibilities requestedVisibilities, - String packageName) { + String packageName, LetterboxDetails[] letterboxDetails) { getUiState(displayId).setBarAttributes(appearance, appearanceRegions, - navbarColorManagedByIme, behavior, requestedVisibilities, packageName); + navbarColorManagedByIme, behavior, requestedVisibilities, packageName, + letterboxDetails); if (mBar != null) { try { mBar.onSystemBarAttributesChanged(displayId, appearance, appearanceRegions, - navbarColorManagedByIme, behavior, requestedVisibilities, packageName); + navbarColorManagedByIme, behavior, requestedVisibilities, packageName, + letterboxDetails); } catch (RemoteException ex) { } } } @@ -1204,17 +1207,20 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private int mImeBackDisposition = 0; private boolean mShowImeSwitcher = false; private IBinder mImeToken = null; + private LetterboxDetails[] mLetterboxDetails; private void setBarAttributes(@Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, @Behavior int behavior, InsetsVisibilities requestedVisibilities, - String packageName) { + String packageName, + LetterboxDetails[] letterboxDetails) { mAppearance = appearance; mAppearanceRegions = appearanceRegions; mNavbarColorManagedByIme = navbarColorManagedByIme; mBehavior = behavior; mRequestedVisibilities = requestedVisibilities; mPackageName = packageName; + mLetterboxDetails = letterboxDetails; } private void showTransient(@InternalInsetsType int[] types) { @@ -1341,7 +1347,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D state.mImeBackDisposition, state.mShowImeSwitcher, gatherDisableActionsLocked(mCurrentUserId, 2), state.mImeToken, state.mNavbarColorManagedByIme, state.mBehavior, state.mRequestedVisibilities, - state.mPackageName, transientBarTypes); + state.mPackageName, transientBarTypes, state.mLetterboxDetails); } } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index cff8b93ac947..2b359cadb377 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -145,6 +145,7 @@ import com.android.internal.policy.GestureNavigationSettingsObserver; import com.android.internal.policy.ScreenDecorationsUtils; import com.android.internal.policy.SystemBarUtils; import com.android.internal.protolog.common.ProtoLog; +import com.android.internal.statusbar.LetterboxDetails; import com.android.internal.util.ScreenshotHelper; import com.android.internal.util.function.TriConsumer; import com.android.internal.view.AppearanceRegion; @@ -2399,7 +2400,7 @@ public class DisplayPolicy { mLastStatusBarAppearanceRegions = statusBarAppearanceRegions; callStatusBarSafely(statusBar -> statusBar.onSystemBarAttributesChanged(displayId, appearance, statusBarAppearanceRegions, isNavbarColorManagedByIme, behavior, - requestedVisibilities, focusedApp)); + requestedVisibilities, focusedApp, new LetterboxDetails[]{})); } private void callStatusBarSafely(Consumer<StatusBarManagerInternal> consumer) { |