Merge "Create API for WM to send letterbox info to SysUI." into tm-qpr-dev

This commit is contained in:
Christian Göllner
2022-07-05 07:30:40 +00:00
committed by Android (Google) Code Review
16 changed files with 344 additions and 30 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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
}

View File

@@ -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

View File

@@ -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) {

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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());

View File

@@ -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,

View File

@@ -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);
}
}

View File

@@ -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) {