Window Manager Flag Migration (5/n)

Completely remove the system UI visibility from the SystemUI side.

Bug: 118118435
Test: atest InsetsSourceProviderTest InsetsStateControllerTest
            InsetsPolicyTest WindowStateTests CommandQueueTest
            RegisterStatusBarResultTest InsetsFlagsTest
            LightBarControllerTest RegisterStatusBarResultTest
Test: build on specific target
Change-Id: Ibc866c5fbb35582dad8fd1a90376ce47dc501377
This commit is contained in:
Tiger Huang
2019-10-26 00:24:22 +08:00
parent 9f4153da71
commit 0dbd5376ea
12 changed files with 169 additions and 261 deletions

View File

@@ -38,25 +38,6 @@ oneway interface IStatusBar
void showWirelessChargingAnimation(int batteryLevel);
/**
* Notifies System UI side of a visibility flag change on the specified display.
*
* @param displayId the id of the display to notify
* @param vis the visibility flags except SYSTEM_UI_FLAG_LIGHT_STATUS_BAR which will be reported
* separately in fullscreenStackVis and dockedStackVis
* @param fullscreenStackVis the flags which only apply in the region of the fullscreen stack,
* which is currently only SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
* @param dockedStackVis the flags that only apply in the region of the docked stack, which is
* currently only SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
* @param mask which flags to change
* @param fullscreenBounds the current bounds of the fullscreen stack, in screen coordinates
* @param dockedBounds the current bounds of the docked stack, in screen coordinates
* @param navbarColorManagedByIme {@code true} if navigation bar color is managed by IME.
*/
void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, int dockedStackVis,
int mask, in Rect fullscreenBounds, in Rect dockedBounds,
boolean navbarColorManagedByIme);
void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive);
void setImeWindowStatus(int displayId, in IBinder token, int vis, int backDisposition,
boolean showImeSwitcher, boolean isMultiClientImeEnabled);

View File

@@ -76,7 +76,6 @@ interface IStatusBarService
void onNotificationSmartReplySent(in String key, in int replyIndex, in CharSequence reply,
in int notificationLocation, boolean modifiedBeforeSending);
void onNotificationSettingsViewed(String key);
void setSystemUiVisibility(int displayId, int vis, int mask, String cause);
void onNotificationBubbleChanged(String key, boolean isBubble);
void grantInlineReplyUriPermission(String key, in Uri uri);

View File

@@ -16,53 +16,50 @@
package com.android.internal.statusbar;
import android.graphics.Rect;
import android.annotation.NonNull;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArrayMap;
import com.android.internal.view.AppearanceRegion;
/**
* An immutable data object to return a set of values from StatusBarManagerService to its clients.
*/
public final class RegisterStatusBarResult implements Parcelable {
public final ArrayMap<String, StatusBarIcon> mIcons;
public final int mDisabledFlags1; // switch[0]
public final int mSystemUiVisibility; // switch[1]
public final int mImeWindowVis; // switch[3]
public final int mImeBackDisposition; // switch[4]
public final boolean mShowImeSwitcher; // switch[5]
public final int mDisabledFlags2; // switch[6]
public final int mFullscreenStackSysUiVisibility; // switch[7]
public final int mDockedStackSysUiVisibility; // switch[8]
public final int mDisabledFlags1; // switch[0]
public final int mAppearance; // switch[1]
public final AppearanceRegion[] mAppearanceRegions; // switch[2]
public final int mImeWindowVis; // switch[3]
public final int mImeBackDisposition; // switch[4]
public final boolean mShowImeSwitcher; // switch[5]
public final int mDisabledFlags2; // switch[6]
public final IBinder mImeToken;
public final Rect mFullscreenStackBounds;
public final Rect mDockedStackBounds;
public final boolean mNavbarColorManagedByIme;
public final boolean mAppFullscreen;
public final boolean mAppImmersive;
public final int[] mTransientBarTypes;
public RegisterStatusBarResult(ArrayMap<String, StatusBarIcon> icons, int disabledFlags1,
int systemUiVisibility, int imeWindowVis, int imeBackDisposition,
boolean showImeSwitcher, int disabledFlags2, int fullscreenStackSysUiVisibility,
int dockedStackSysUiVisibility, IBinder imeToken, Rect fullscreenStackBounds,
Rect dockedStackBounds, boolean navbarColorManagedByIme, boolean appFullscreen,
boolean appImmersive) {
int appearance, AppearanceRegion[] appearanceRegions, int imeWindowVis,
int imeBackDisposition, boolean showImeSwitcher, int disabledFlags2, IBinder imeToken,
boolean navbarColorManagedByIme, boolean appFullscreen, boolean appImmersive,
@NonNull int[] transientBarTypes) {
mIcons = new ArrayMap<>(icons);
mDisabledFlags1 = disabledFlags1;
mSystemUiVisibility = systemUiVisibility;
mAppearance = appearance;
mAppearanceRegions = appearanceRegions;
mImeWindowVis = imeWindowVis;
mImeBackDisposition = imeBackDisposition;
mShowImeSwitcher = showImeSwitcher;
mDisabledFlags2 = disabledFlags2;
mFullscreenStackSysUiVisibility = fullscreenStackSysUiVisibility;
mDockedStackSysUiVisibility = dockedStackSysUiVisibility;
mImeToken = imeToken;
mFullscreenStackBounds = fullscreenStackBounds;
mDockedStackBounds = dockedStackBounds;
mNavbarColorManagedByIme = navbarColorManagedByIme;
mAppFullscreen = appFullscreen;
mAppImmersive = appImmersive;
mTransientBarTypes = transientBarTypes;
}
@Override
@@ -74,19 +71,17 @@ public final class RegisterStatusBarResult implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedArrayMap(mIcons, flags);
dest.writeInt(mDisabledFlags1);
dest.writeInt(mSystemUiVisibility);
dest.writeInt(mAppearance);
dest.writeParcelableArray(mAppearanceRegions, 0);
dest.writeInt(mImeWindowVis);
dest.writeInt(mImeBackDisposition);
dest.writeBoolean(mShowImeSwitcher);
dest.writeInt(mDisabledFlags2);
dest.writeInt(mFullscreenStackSysUiVisibility);
dest.writeInt(mDockedStackSysUiVisibility);
dest.writeStrongBinder(mImeToken);
dest.writeTypedObject(mFullscreenStackBounds, flags);
dest.writeTypedObject(mDockedStackBounds, flags);
dest.writeBoolean(mNavbarColorManagedByIme);
dest.writeBoolean(mAppFullscreen);
dest.writeBoolean(mAppImmersive);
dest.writeIntArray(mTransientBarTypes);
}
/**
@@ -99,24 +94,22 @@ public final class RegisterStatusBarResult implements Parcelable {
final ArrayMap<String, StatusBarIcon> icons =
source.createTypedArrayMap(StatusBarIcon.CREATOR);
final int disabledFlags1 = source.readInt();
final int systemUiVisibility = source.readInt();
final int appearance = source.readInt();
final AppearanceRegion[] appearanceRegions =
source.readParcelableArray(null, AppearanceRegion.class);
final int imeWindowVis = source.readInt();
final int imeBackDisposition = source.readInt();
final boolean showImeSwitcher = source.readBoolean();
final int disabledFlags2 = source.readInt();
final int fullscreenStackSysUiVisibility = source.readInt();
final int dockedStackSysUiVisibility = source.readInt();
final IBinder imeToken = source.readStrongBinder();
final Rect fullscreenStackBounds = source.readTypedObject(Rect.CREATOR);
final Rect dockedStackBounds = source.readTypedObject(Rect.CREATOR);
final boolean navbarColorManagedByIme = source.readBoolean();
final boolean appFullscreen = source.readBoolean();
final boolean appImmersive = source.readBoolean();
return new RegisterStatusBarResult(icons, disabledFlags1, systemUiVisibility,
imeWindowVis, imeBackDisposition, showImeSwitcher, disabledFlags2,
fullscreenStackSysUiVisibility, dockedStackSysUiVisibility, imeToken,
fullscreenStackBounds, dockedStackBounds, navbarColorManagedByIme,
appFullscreen, appImmersive);
final int[] transientBarTypes = source.createIntArray();
return new RegisterStatusBarResult(icons, disabledFlags1, appearance,
appearanceRegions, imeWindowVis, imeBackDisposition, showImeSwitcher,
disabledFlags2, imeToken, navbarColorManagedByIme, appFullscreen,
appImmersive, transientBarTypes);
}
@Override

View File

@@ -18,7 +18,6 @@ package com.android.internal.statusbar;
import static com.google.common.truth.Truth.assertThat;
import android.graphics.Rect;
import android.os.Binder;
import android.os.Parcel;
import android.os.UserHandle;
@@ -27,6 +26,8 @@ import android.util.ArrayMap;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import com.android.internal.view.AppearanceRegion;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -47,19 +48,17 @@ public class RegisterStatusBarResultTest {
final RegisterStatusBarResult original = new RegisterStatusBarResult(iconMap,
0x2 /* disabledFlags1 */,
0x4 /* systemUiVisibility */,
0x4 /* appearance */,
new AppearanceRegion[0] /* appearanceRegions */,
0x8 /* imeWindowVis */,
0x10 /* imeBackDisposition */,
false /* showImeSwitcher */,
0x20 /* disabledFlags2 */,
0x40 /* fullscreenStackSysUiVisibility */,
0x80 /* dockedStackSysUiVisibility */,
new Binder() /* imeToken */,
new Rect(0x100, 0x200, 0x400, 0x800) /* fullscreenStackBounds */,
new Rect(0x1000, 0x2000, 0x4000, 0x8000) /* dockedStackBounds */,
true /* navbarColorManagedByIme */,
true /* appFullscreen */,
true /* appImmersive */);
true /* appImmersive */,
new int[0] /* transientBarTypes */);
final RegisterStatusBarResult copy = clone(original);
@@ -69,21 +68,17 @@ public class RegisterStatusBarResultTest {
.isEqualTo(original.mIcons.get(dumyIconKey).user);
assertThat(copy.mDisabledFlags1).isEqualTo(original.mDisabledFlags1);
assertThat(copy.mSystemUiVisibility).isEqualTo(original.mSystemUiVisibility);
assertThat(copy.mAppearance).isEqualTo(original.mAppearance);
assertThat(copy.mAppearanceRegions).isEqualTo(original.mAppearanceRegions);
assertThat(copy.mImeWindowVis).isEqualTo(original.mImeWindowVis);
assertThat(copy.mImeBackDisposition).isEqualTo(original.mImeBackDisposition);
assertThat(copy.mShowImeSwitcher).isEqualTo(original.mShowImeSwitcher);
assertThat(copy.mDisabledFlags2).isEqualTo(original.mDisabledFlags2);
assertThat(copy.mFullscreenStackSysUiVisibility)
.isEqualTo(original.mFullscreenStackSysUiVisibility);
assertThat(copy.mDockedStackSysUiVisibility)
.isEqualTo(original.mDockedStackSysUiVisibility);
assertThat(copy.mImeToken).isSameAs(original.mImeToken);
assertThat(copy.mFullscreenStackBounds).isEqualTo(original.mFullscreenStackBounds);
assertThat(copy.mDockedStackBounds).isEqualTo(original.mDockedStackBounds);
assertThat(copy.mNavbarColorManagedByIme).isEqualTo(original.mNavbarColorManagedByIme);
assertThat(copy.mAppFullscreen).isEqualTo(original.mAppFullscreen);
assertThat(copy.mAppImmersive).isEqualTo(original.mAppImmersive);
assertThat(copy.mTransientBarTypes).isEqualTo(original.mTransientBarTypes);
}
private RegisterStatusBarResult clone(RegisterStatusBarResult original) {

View File

@@ -22,8 +22,6 @@ import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEF
import static android.inputmethodservice.InputMethodService.IME_INVISIBLE;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
import static android.view.InsetsState.TYPE_TOP_BAR;
import static com.android.systemui.statusbar.phone.StatusBar.ONLY_CORE_APPS;
@@ -34,7 +32,6 @@ import android.app.StatusBarManager.WindowType;
import android.app.StatusBarManager.WindowVisibleState;
import android.content.ComponentName;
import android.content.Context;
import android.graphics.Rect;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
import android.hardware.display.DisplayManager;
import android.inputmethodservice.InputMethodService.BackDispositionMode;
@@ -45,9 +42,7 @@ import android.os.Looper;
import android.os.Message;
import android.util.Pair;
import android.util.SparseArray;
import android.view.InsetsFlags;
import android.view.InsetsState.InternalInsetType;
import android.view.View;
import android.view.WindowInsetsController.Appearance;
import androidx.annotation.VisibleForTesting;
@@ -470,42 +465,6 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
}
}
// TODO(b/118118435): Remove this function after migration
@Override
public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
boolean navbarColorManagedByIme) {
synchronized (mLock) {
final boolean hasDockedStack = !dockedStackBounds.isEmpty();
final boolean transientStatus = (vis & View.STATUS_BAR_TRANSIENT) != 0;
final boolean transientNavigation = (vis & View.NAVIGATION_BAR_TRANSIENT) != 0;
if (transientStatus && transientNavigation) {
showTransient(displayId, new int[]{TYPE_TOP_BAR, TYPE_NAVIGATION_BAR});
} else if (transientStatus) {
showTransient(displayId, new int[]{TYPE_TOP_BAR});
abortTransient(displayId, new int[]{TYPE_NAVIGATION_BAR});
} else if (transientNavigation) {
showTransient(displayId, new int[]{TYPE_NAVIGATION_BAR});
abortTransient(displayId, new int[]{TYPE_TOP_BAR});
} else {
abortTransient(displayId, new int[]{TYPE_TOP_BAR, TYPE_NAVIGATION_BAR});
}
SomeArgs args = SomeArgs.obtain();
args.argi1 = displayId;
args.argi2 = InsetsFlags.getAppearance(vis);
args.argi3 = navbarColorManagedByIme ? 1 : 0;
final int fullscreenAppearance = InsetsFlags.getAppearance(fullscreenStackVis);
final int dockedAppearance = InsetsFlags.getAppearance(dockedStackVis);
args.arg1 = hasDockedStack
? new AppearanceRegion[]{
new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds),
new AppearanceRegion(dockedAppearance, dockedStackBounds)}
: new AppearanceRegion[]{
new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds)};
mHandler.obtainMessage(MSG_SYSTEM_BAR_APPEARANCE_CHANGED, args).sendToTarget();
}
}
@Override
public void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) {
synchronized (mLock) {

View File

@@ -247,7 +247,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("LightBarController: ");
pw.print(" mAppearance=0x"); pw.println(ViewDebug.flagsToString(
pw.print(" mAppearance="); pw.println(ViewDebug.flagsToString(
InsetsFlags.class, "appearance", mAppearance));
final int numStacks = mAppearanceRegions.length;
for (int i = 0; i < numStacks; i++) {

View File

@@ -24,7 +24,6 @@ import static android.app.StatusBarManager.WindowType;
import static android.app.StatusBarManager.WindowVisibleState;
import static android.app.StatusBarManager.windowStateToString;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
import static android.view.InsetsFlags.getAppearance;
import static android.view.InsetsState.TYPE_TOP_BAR;
import static android.view.InsetsState.containsType;
import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
@@ -857,19 +856,11 @@ public class StatusBar extends SystemUI implements DemoMode,
// Set up the initial notification state. This needs to happen before CommandQueue.disable()
setUpPresenter();
if ((result.mSystemUiVisibility & View.STATUS_BAR_TRANSIENT) != 0) {
if (containsType(result.mTransientBarTypes, TYPE_TOP_BAR)) {
showTransientUnchecked();
}
final int fullscreenAppearance = getAppearance(result.mFullscreenStackSysUiVisibility);
final int dockedAppearance = getAppearance(result.mDockedStackSysUiVisibility);
final AppearanceRegion[] appearanceRegions = result.mDockedStackBounds.isEmpty()
? new AppearanceRegion[]{
new AppearanceRegion(fullscreenAppearance, result.mFullscreenStackBounds)}
: new AppearanceRegion[]{
new AppearanceRegion(fullscreenAppearance, result.mFullscreenStackBounds),
new AppearanceRegion(dockedAppearance, result.mDockedStackBounds)};
onSystemBarAppearanceChanged(mDisplayId, getAppearance(result.mSystemUiVisibility),
appearanceRegions, result.mNavbarColorManagedByIme);
onSystemBarAppearanceChanged(mDisplayId, result.mAppearance, result.mAppearanceRegions,
result.mNavbarColorManagedByIme);
mAppFullscreen = result.mAppFullscreen;
mAppImmersive = result.mAppImmersive;
@@ -889,7 +880,7 @@ public class StatusBar extends SystemUI implements DemoMode,
"init: icons=%d disabled=0x%08x lights=0x%08x imeButton=0x%08x",
numIcons,
result.mDisabledFlags1,
result.mSystemUiVisibility,
result.mAppearance,
result.mImeWindowVis));
}

View File

@@ -16,7 +16,6 @@
package com.android.server.statusbar;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.InsetsState.InternalInsetType;
import android.view.WindowInsetsController.Appearance;
@@ -79,9 +78,7 @@ public interface StatusBarManagerInternal {
void startAssist(Bundle args);
void onCameraLaunchGestureDetected(int source);
void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive);
void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, int dockedStackVis,
int mask, Rect fullscreenBounds, Rect dockedBounds, boolean isNavbarColorManagedByIme,
String cause);
void setDisableFlags(int displayId, int flags, String cause);
void toggleSplitScreen();
void appTransitionFinished(int displayId);

View File

@@ -25,7 +25,6 @@ import android.app.Notification;
import android.app.StatusBarManager;
import android.content.ComponentName;
import android.content.Context;
import android.graphics.Rect;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
@@ -43,10 +42,11 @@ import android.os.UserHandle;
import android.service.notification.NotificationStats;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
import android.util.ArraySet;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import android.view.InsetsState.InternalInsetType;
import android.view.WindowInsetsController.Appearance;
import com.android.internal.R;
@@ -263,12 +263,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
@Override
public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
int dockedStackVis, int mask, Rect fullscreenBounds, Rect dockedBounds,
boolean isNavbarColorManagedByIme, String cause) {
StatusBarManagerService.this.setSystemUiVisibility(displayId, vis, fullscreenStackVis,
dockedStackVis, mask, fullscreenBounds, dockedBounds, isNavbarColorManagedByIme,
cause);
public void setDisableFlags(int displayId, int flags, String cause) {
StatusBarManagerService.this.setDisableFlags(displayId, flags, cause);
}
@Override
@@ -473,7 +469,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
@Override
public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
// TODO (b/118118435): save the information to UiState
final UiState state = getUiState(displayId);
if (!state.appearanceEquals(appearance, appearanceRegions, navbarColorManagedByIme)) {
state.setAppearance(appearance, appearanceRegions, navbarColorManagedByIme);
}
if (mBar != null) {
try {
mBar.onSystemBarAppearanceChanged(displayId, appearance, appearanceRegions,
@@ -483,7 +482,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
@Override
public void showTransient(int displayId, int[] types) {
public void showTransient(int displayId, @InternalInsetType int[] types) {
getUiState(displayId).showTransient(types);
if (mBar != null) {
try {
mBar.showTransient(displayId, types);
@@ -492,7 +492,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
@Override
public void abortTransient(int displayId, int[] types) {
public void abortTransient(int displayId, @InternalInsetType int[] types) {
getUiState(displayId).clearTransient(types);
if (mBar != null) {
try {
mBar.abortTransient(displayId, types);
@@ -896,54 +897,20 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
}
@Override
public void setSystemUiVisibility(int displayId, int vis, int mask, String cause) {
final UiState state = getUiState(displayId);
setSystemUiVisibility(displayId, vis, 0, 0, mask,
state.mFullscreenStackBounds, state.mDockedStackBounds,
state.mNavbarColorManagedByIme, cause);
}
private void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
int dockedStackVis, int mask, Rect fullscreenBounds, Rect dockedBounds,
boolean isNavbarColorManagedByIme, String cause) {
private void setDisableFlags(int displayId, int flags, String cause) {
// also allows calls from window manager which is in this process.
enforceStatusBarService();
if (SPEW) Slog.d(TAG, "setSystemUiVisibility(0x" + Integer.toHexString(vis) + ")");
final int unknownFlags = flags & ~StatusBarManager.DISABLE_MASK;
if (unknownFlags != 0) {
Slog.e(TAG, "Unknown disable flags: 0x" + Integer.toHexString(unknownFlags),
new RuntimeException());
}
if (SPEW) Slog.d(TAG, "setDisableFlags(0x" + Integer.toHexString(flags) + ")");
synchronized (mLock) {
updateUiVisibilityLocked(displayId, vis, fullscreenStackVis, dockedStackVis, mask,
fullscreenBounds, dockedBounds, isNavbarColorManagedByIme);
disableLocked(
displayId,
mCurrentUserId,
vis & StatusBarManager.DISABLE_MASK,
mSysUiVisToken,
cause, 1);
}
}
private void updateUiVisibilityLocked(final int displayId, final int vis,
final int fullscreenStackVis, final int dockedStackVis, final int mask,
final Rect fullscreenBounds, final Rect dockedBounds,
final boolean isNavbarColorManagedByIme) {
final UiState state = getUiState(displayId);
if (!state.systemUiStateEquals(vis, fullscreenStackVis, dockedStackVis,
fullscreenBounds, dockedBounds, isNavbarColorManagedByIme)) {
state.setSystemUiState(vis, fullscreenStackVis, dockedStackVis, fullscreenBounds,
dockedBounds, isNavbarColorManagedByIme);
mHandler.post(() -> {
if (mBar != null) {
try {
mBar.setSystemUiVisibility(displayId, vis, fullscreenStackVis,
dockedStackVis, mask, fullscreenBounds, dockedBounds,
isNavbarColorManagedByIme);
} catch (RemoteException ex) {
Log.w(TAG, "Can not get StatusBar!");
}
}
});
disableLocked(displayId, mCurrentUserId, flags, mSysUiVisToken, cause, 1);
}
}
@@ -965,11 +932,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
private class UiState {
private int mSystemUiVisibility = 0;
private int mFullscreenStackSysUiVisibility = 0;
private int mDockedStackSysUiVisibility = 0;
private final Rect mFullscreenStackBounds = new Rect();
private final Rect mDockedStackBounds = new Rect();
private @Appearance int mAppearance = 0;
private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0];
private ArraySet<Integer> mTransientBarTypes = new ArraySet<>();
private boolean mNavbarColorManagedByIme = false;
private boolean mFullscreen = false;
private boolean mImmersive = false;
private int mDisabled1 = 0;
@@ -978,7 +944,47 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
private int mImeBackDisposition = 0;
private boolean mShowImeSwitcher = false;
private IBinder mImeToken = null;
private boolean mNavbarColorManagedByIme = false;
private void setAppearance(@Appearance int appearance,
AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
mAppearance = appearance;
mAppearanceRegions = appearanceRegions;
mNavbarColorManagedByIme = navbarColorManagedByIme;
}
private boolean appearanceEquals(@Appearance int appearance,
AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
if (mAppearance != appearance || mAppearanceRegions.length != appearanceRegions.length
|| mNavbarColorManagedByIme != navbarColorManagedByIme) {
return false;
}
for (int i = appearanceRegions.length - 1; i >= 0; i--) {
if (!mAppearanceRegions[i].equals(appearanceRegions[i])) {
return false;
}
}
return true;
}
private void showTransient(@InternalInsetType int[] types) {
for (int type : types) {
mTransientBarTypes.add(type);
}
}
private void clearTransient(@InternalInsetType int[] types) {
for (int type : types) {
mTransientBarTypes.remove(type);
}
}
private void setFullscreen(boolean isFullscreen) {
mFullscreen = isFullscreen;
}
private void setImmersive(boolean isImmersive) {
mImmersive = isImmersive;
}
private int getDisabled1() {
return mDisabled1;
@@ -993,40 +999,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
mDisabled2 = disabled2;
}
private void setFullscreen(boolean isFullscreen) {
mFullscreen = isFullscreen;
}
private void setImmersive(boolean immersive) {
mImmersive = immersive;
}
private boolean disableEquals(int disabled1, int disabled2) {
return mDisabled1 == disabled1 && mDisabled2 == disabled2;
}
private void setSystemUiState(final int vis, final int fullscreenStackVis,
final int dockedStackVis, final Rect fullscreenBounds, final Rect dockedBounds,
final boolean navbarColorManagedByIme) {
mSystemUiVisibility = vis;
mFullscreenStackSysUiVisibility = fullscreenStackVis;
mDockedStackSysUiVisibility = dockedStackVis;
mFullscreenStackBounds.set(fullscreenBounds);
mDockedStackBounds.set(dockedBounds);
mNavbarColorManagedByIme = navbarColorManagedByIme;
}
private boolean systemUiStateEquals(final int vis, final int fullscreenStackVis,
final int dockedStackVis, final Rect fullscreenBounds, final Rect dockedBounds,
final boolean navbarColorManagedByIme) {
return mSystemUiVisibility == vis
&& mFullscreenStackSysUiVisibility == fullscreenStackVis
&& mDockedStackSysUiVisibility == dockedStackVis
&& mFullscreenStackBounds.equals(fullscreenBounds)
&& mDockedStackBounds.equals(dockedBounds)
&& mNavbarColorManagedByIme == navbarColorManagedByIme;
}
private void setImeWindowState(final int vis, final int backDisposition,
final boolean showImeSwitcher, final IBinder token) {
mImeWindowVis = vis;
@@ -1084,13 +1060,16 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
// TODO(b/118592525): Currently, status bar only works on the default display.
// Make it aware of multi-display if needed.
final UiState state = mDisplayUiState.get(DEFAULT_DISPLAY);
final int[] transientBarTypes = new int[state.mTransientBarTypes.size()];
for (int i = 0; i < transientBarTypes.length; i++) {
transientBarTypes[i] = state.mTransientBarTypes.valueAt(i);
}
return new RegisterStatusBarResult(icons, gatherDisableActionsLocked(mCurrentUserId, 1),
state.mSystemUiVisibility, state.mImeWindowVis,
state.mAppearance, state.mAppearanceRegions, state.mImeWindowVis,
state.mImeBackDisposition, state.mShowImeSwitcher,
gatherDisableActionsLocked(mCurrentUserId, 2),
state.mFullscreenStackSysUiVisibility, state.mDockedStackSysUiVisibility,
state.mImeToken, state.mFullscreenStackBounds, state.mDockedStackBounds,
state.mNavbarColorManagedByIme, state.mFullscreen, state.mImmersive);
gatherDisableActionsLocked(mCurrentUserId, 2), state.mImeToken,
state.mNavbarColorManagedByIme, state.mFullscreen, state.mImmersive,
transientBarTypes);
}
}

View File

@@ -144,13 +144,16 @@ import android.view.InputChannel;
import android.view.InputDevice;
import android.view.InputEvent;
import android.view.InputEventReceiver;
import android.view.InsetsFlags;
import android.view.InsetsState;
import android.view.InsetsState.InternalInsetType;
import android.view.MotionEvent;
import android.view.PointerIcon;
import android.view.Surface;
import android.view.View;
import android.view.ViewRootImpl;
import android.view.WindowInsets;
import android.view.WindowInsetsController.Appearance;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManagerGlobal;
@@ -332,8 +335,6 @@ public class DisplayPolicy {
private int mResettingSystemUiFlags = 0;
// Bits that we are currently always keeping cleared.
private int mForceClearedSystemUiFlags = 0;
private int mLastFullscreenStackSysUiFlags;
private int mLastDockedStackSysUiFlags;
private int mLastAppearance;
private int mLastFullscreenAppearance;
private int mLastDockedAppearance;
@@ -3172,11 +3173,6 @@ public class DisplayPolicy {
&= ~PolicyControl.adjustClearableFlags(win, View.SYSTEM_UI_CLEARABLE_FLAGS);
}
final int appearance = win.mAttrs.insetsFlags.appearance;
final int fullscreenVisibility = updateLightStatusBarLw(0 /* vis */,
mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState);
final int dockedVisibility = updateLightStatusBarLw(0 /* vis */,
mTopDockedOpaqueWindowState, mTopDockedOpaqueOrDimmingWindowState);
final int fullscreenAppearance = updateLightStatusBarAppearanceLw(0 /* vis */,
mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState);
final int dockedAppearance = updateLightStatusBarAppearanceLw(0 /* vis */,
@@ -3190,9 +3186,9 @@ public class DisplayPolicy {
final Pair<Integer, Boolean> result =
updateSystemBarsLw(win, mLastSystemUiFlags, tmpVisibility);
final int visibility = result.first;
final int appearance = win.mAttrs.insetsFlags.appearance
| InsetsFlags.getAppearance(visibility);
final int diff = visibility ^ mLastSystemUiFlags;
final int fullscreenDiff = fullscreenVisibility ^ mLastFullscreenStackSysUiFlags;
final int dockedDiff = dockedVisibility ^ mLastDockedStackSysUiFlags;
final InsetsPolicy insetsPolicy = getInsetsPolicy();
final boolean isFullscreen = (visibility & (View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)) != 0
@@ -3205,7 +3201,7 @@ public class DisplayPolicy {
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)) != 0
|| behavior == BEHAVIOR_SHOW_BARS_BY_SWIPE
|| behavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
if (diff == 0 && fullscreenDiff == 0 && dockedDiff == 0
if (diff == 0
&& mLastAppearance == appearance
&& mLastFullscreenAppearance == fullscreenAppearance
&& mLastDockedAppearance == dockedAppearance
@@ -3216,9 +3212,12 @@ public class DisplayPolicy {
&& mLastDockedStackBounds.equals(mDockedStackBounds)) {
return 0;
}
// Obtains which types should show transient and which types should abort transient.
// If there is no transient state change, this pair will contain two empty arrays.
final Pair<int[], int[]> transientState = getTransientState(visibility, mLastSystemUiFlags);
mLastSystemUiFlags = visibility;
mLastFullscreenStackSysUiFlags = fullscreenVisibility;
mLastDockedStackSysUiFlags = dockedVisibility;
mLastAppearance = appearance;
mLastFullscreenAppearance = fullscreenAppearance;
mLastDockedAppearance = dockedAppearance;
@@ -3240,14 +3239,16 @@ public class DisplayPolicy {
StatusBarManagerInternal statusBar = getStatusBarManagerInternal();
if (statusBar != null) {
final int displayId = getDisplayId();
// TODO(b/118118435): disabled flags only
statusBar.setSystemUiVisibility(displayId, visibility, fullscreenVisibility,
dockedVisibility, 0xffffffff, fullscreenStackBounds,
dockedStackBounds, isNavbarColorManagedByIme, win.toString());
if (ViewRootImpl.sNewInsetsMode == NEW_INSETS_MODE_FULL) {
statusBar.onSystemBarAppearanceChanged(displayId, appearance,
appearanceRegions, isNavbarColorManagedByIme);
statusBar.setDisableFlags(displayId, visibility & StatusBarManager.DISABLE_MASK,
win.toString());
if (transientState.first.length > 0) {
statusBar.showTransient(displayId, transientState.first);
}
if (transientState.second.length > 0) {
statusBar.abortTransient(displayId, transientState.second);
}
statusBar.onSystemBarAppearanceChanged(displayId, appearance,
appearanceRegions, isNavbarColorManagedByIme);
statusBar.topAppWindowChanged(displayId, isFullscreen, isImmersive);
// TODO(b/118118435): Remove this after removing system UI visibilities.
@@ -3258,23 +3259,28 @@ public class DisplayPolicy {
return diff;
}
private int updateLightStatusBarLw(int vis, WindowState opaque, WindowState opaqueOrDimming) {
final boolean onKeyguard = isStatusBarKeyguard() && !isKeyguardOccluded();
final WindowState statusColorWin = onKeyguard ? mStatusBar : opaqueOrDimming;
if (statusColorWin != null && (statusColorWin == opaque || onKeyguard)) {
// If the top fullscreen-or-dimming window is also the top fullscreen, respect
// its light flag.
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
vis |= PolicyControl.getSystemUiVisibility(statusColorWin, null)
& View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
} else if (statusColorWin != null && statusColorWin.isDimming()) {
// Otherwise if it's dimming, clear the light flag.
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
return vis;
private static Pair<int[], int[]> getTransientState(int vis, int oldVis) {
final IntArray typesToShow = new IntArray(0);
final IntArray typesToAbort = new IntArray(0);
updateTransientState(vis, oldVis, View.STATUS_BAR_TRANSIENT, TYPE_TOP_BAR, typesToShow,
typesToAbort);
updateTransientState(vis, oldVis, View.NAVIGATION_BAR_TRANSIENT,
InsetsState.TYPE_NAVIGATION_BAR, typesToShow, typesToAbort);
return Pair.create(typesToShow.toArray(), typesToAbort.toArray());
}
private int updateLightStatusBarAppearanceLw(int appearance, WindowState opaque,
private static void updateTransientState(int vis, int oldVis, int transientFlag,
@InternalInsetType int type, IntArray typesToShow, IntArray typesToAbort) {
final boolean wasTransient = (oldVis & transientFlag) != 0;
final boolean isTransient = (vis & transientFlag) != 0;
if (!wasTransient && isTransient) {
typesToShow.add(type);
} else if (wasTransient && !isTransient) {
typesToAbort.add(type);
}
}
private int updateLightStatusBarAppearanceLw(@Appearance int appearance, WindowState opaque,
WindowState opaqueOrDimming) {
final boolean onKeyguard = isStatusBarKeyguard() && !isKeyguardOccluded();
final WindowState statusColorWin = onKeyguard ? mStatusBar : opaqueOrDimming;
@@ -3282,7 +3288,10 @@ public class DisplayPolicy {
// If the top fullscreen-or-dimming window is also the top fullscreen, respect
// its light flag.
appearance &= ~APPEARANCE_LIGHT_TOP_BAR;
appearance |= statusColorWin.mAttrs.insetsFlags.appearance & APPEARANCE_LIGHT_TOP_BAR;
final int legacyAppearance = InsetsFlags.getAppearance(
PolicyControl.getSystemUiVisibility(statusColorWin, null));
appearance |= (statusColorWin.mAttrs.insetsFlags.appearance | legacyAppearance)
& APPEARANCE_LIGHT_TOP_BAR;
} else if (statusColorWin != null && statusColorWin.isDimming()) {
// Otherwise if it's dimming, clear the light flag.
appearance &= ~APPEARANCE_LIGHT_TOP_BAR;

View File

@@ -638,7 +638,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
private boolean mIsDimming = false;
private @Nullable InsetsSourceProvider mControllableInsetProvider;
private InsetsState mClientInsetsState = new InsetsState();
private InsetsState mClientInsetsState;
private static final float DEFAULT_DIM_AMOUNT_DEAD_WINDOW = 0.5f;
private KeyInterceptionInfo mKeyInterceptionInfo;
@@ -767,6 +767,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mSeq = seq;
mPowerManagerWrapper = powerManagerWrapper;
mForceSeamlesslyRotate = token.mRoundedCornerOverlay;
mClientInsetsState =
getDisplayContent().getInsetsStateController().getInsetsForDispatch(this);
if (DEBUG) {
Slog.v(TAG, "Window " + this + " client=" + c.asBinder()
+ " token=" + token + " (" + mAttrs.token + ")" + " params=" + a);

View File

@@ -178,11 +178,14 @@ public class InsetsPolicyTest extends WindowTestsBase {
@Test
public void testShowTransientBars_topCanBeTransient_appGetsTopFakeControl() {
// Adding app window before setting source visibility is to prevent the visibility from
// being cleared by InsetsSourceProvider.updateVisibility.
final WindowState app = addWindow(TYPE_APPLICATION, "app");
addWindow(TYPE_STATUS_BAR, "topBar")
.getControllableInsetProvider().getSource().setVisible(false);
addWindow(TYPE_NAVIGATION_BAR, "navBar")
.getControllableInsetProvider().getSource().setVisible(true);
final WindowState app = addWindow(TYPE_APPLICATION, "app");
final InsetsPolicy policy = mDisplayContent.getInsetsPolicy();
policy.updateBarControlTarget(app);