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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user