Loading packages/CarSystemUI/res/values/config.xml +9 −0 Original line number Diff line number Diff line Loading @@ -154,4 +154,13 @@ <!-- The Activity name for the Rear View Camera, if empty, the feature will be disabled. --> <string name="config_rearViewCameraActivity" translatable="false"></string> <!-- Whether the Notification Panel should be inset by the top system bar. --> <bool name="config_notif_panel_inset_by_top_systembar" translatable="false">false</bool> <!-- Whether the Notification Panel should be inset by the bottom system bar. --> <bool name="config_notif_panel_inset_by_bottom_systembar" translatable="false">true</bool> <!-- Whether the Notification Panel should be inset by the left system bar. --> <bool name="config_notif_panel_inset_by_left_systembar" translatable="false">false</bool> <!-- Whether the Notification Panel should be inset by the right system bar. --> <bool name="config_notif_panel_inset_by_right_systembar" translatable="false">false</bool> </resources> packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +35 −2 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.systemui.R; import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.CarServiceProvider; import com.android.systemui.car.window.OverlayPanelViewController; import com.android.systemui.car.window.OverlayViewController; import com.android.systemui.car.window.OverlayViewGlobalStateController; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; Loading Loading @@ -84,6 +85,11 @@ public class NotificationPanelViewController extends OverlayPanelViewController private final boolean mEnableHeadsUpNotificationWhenNotificationShadeOpen; private final NotificationVisibilityLogger mNotificationVisibilityLogger; private final boolean mFitTopSystemBarInset; private final boolean mFitBottomSystemBarInset; private final boolean mFitLeftSystemBarInset; private final boolean mFitRightSystemBarInset; private float mInitialBackgroundAlpha; private float mBackgroundAlphaDiff; Loading Loading @@ -164,6 +170,15 @@ public class NotificationPanelViewController extends OverlayPanelViewController mEnableHeadsUpNotificationWhenNotificationShadeOpen = mResources.getBoolean( com.android.car.notification.R.bool .config_enableHeadsUpNotificationWhenNotificationShadeOpen); mFitTopSystemBarInset = mResources.getBoolean( R.bool.config_notif_panel_inset_by_top_systembar); mFitBottomSystemBarInset = mResources.getBoolean( R.bool.config_notif_panel_inset_by_bottom_systembar); mFitLeftSystemBarInset = mResources.getBoolean( R.bool.config_notif_panel_inset_by_left_systembar); mFitRightSystemBarInset = mResources.getBoolean( R.bool.config_notif_panel_inset_by_right_systembar); } // CommandQueue.Callbacks Loading Loading @@ -215,8 +230,26 @@ public class NotificationPanelViewController extends OverlayPanelViewController } @Override protected int getInsetTypesToFit() { return WindowInsets.Type.navigationBars(); protected int getInsetSidesToFit() { int insetSidesToFit = OverlayViewController.NO_INSET_SIDE; if (mFitTopSystemBarInset) { insetSidesToFit = insetSidesToFit | WindowInsets.Side.TOP; } if (mFitBottomSystemBarInset) { insetSidesToFit = insetSidesToFit | WindowInsets.Side.BOTTOM; } if (mFitLeftSystemBarInset) { insetSidesToFit = insetSidesToFit | WindowInsets.Side.LEFT; } if (mFitRightSystemBarInset) { insetSidesToFit = insetSidesToFit | WindowInsets.Side.RIGHT; } return insetSidesToFit; } @Override Loading packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java +27 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,9 @@ import android.view.WindowInsets; * Owns a {@link View} that is present in SystemUIOverlayWindow. */ public class OverlayViewController { protected static final int INVALID_INSET_SIDE = -1; protected static final int NO_INSET_SIDE = 0; private final int mStubId; private final OverlayViewGlobalStateController mOverlayViewGlobalStateController; Loading Loading @@ -188,4 +191,28 @@ public class OverlayViewController { protected int getInsetTypesToFit() { return statusBars(); } /** * Optionally returns the sides of enabled system bar insets to fit to the sysui overlay window * when this {@link OverlayViewController} is in the foreground. * * For example, if the bottom and left system bars are enabled and this method returns * WindowInsets.Side.LEFT, then the inset from the bottom system bar will be ignored. * * NOTE: By default, this method returns {@link #INVALID_INSET_SIDE}, so insets to fit are * defined by {@link #getInsetTypesToFit()}, and not by this method, unless it is overridden * by subclasses. * * NOTE: {@link #NO_INSET_SIDE} signifies no insets from any system bars will be honored. Each * {@link OverlayViewController} can first take this value and add sides of the system bar * insets to honor to it. * * NOTE: If getInsetSidesToFit is overridden to return {@link WindowInsets.Side}, it always * takes precedence over {@link #getInsetTypesToFit()}. That is, the return value of {@link * #getInsetTypesToFit()} will be ignored. */ @WindowInsets.Side.InsetsSide protected int getInsetSidesToFit() { return INVALID_INSET_SIDE; } } packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java +26 −4 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ import static android.view.WindowInsets.Type.statusBars; import android.annotation.Nullable; import android.util.Log; import android.view.WindowInsets; import android.view.WindowInsets.Side.InsetsSide; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsController; Loading Loading @@ -119,7 +121,7 @@ public class OverlayViewGlobalStateController { updateInternalsWhenShowingView(viewController); refreshUseStableInsets(); refreshInsetTypesToFit(); refreshInsetsToFit(); refreshWindowFocus(); refreshNavigationBarVisibility(); refreshStatusBarVisibility(); Loading Loading @@ -193,7 +195,7 @@ public class OverlayViewGlobalStateController { mZOrderVisibleSortedMap.remove(mZOrderMap.get(viewController)); refreshHighestZOrderWhenHidingView(viewController); refreshUseStableInsets(); refreshInsetTypesToFit(); refreshInsetsToFit(); refreshWindowFocus(); refreshNavigationBarVisibility(); refreshStatusBarVisibility(); Loading Loading @@ -255,13 +257,27 @@ public class OverlayViewGlobalStateController { mHighestZOrder == null ? false : mHighestZOrder.shouldUseStableInsets()); } private void refreshInsetTypesToFit() { /** * Refreshes the insets to fit (or honor) either by {@link InsetsType} or {@link InsetsSide}. * * By default, the insets to fit are defined by the {@link InsetsType}. But if an * {@link OverlayViewController} overrides {@link OverlayViewController#getInsetSidesToFit()} to * return an {@link InsetsSide}, then that takes precedence over {@link InsetsType}. */ private void refreshInsetsToFit() { if (mZOrderVisibleSortedMap.isEmpty()) { setFitInsetsTypes(statusBars()); } else { if (mHighestZOrder.getInsetSidesToFit() != OverlayViewController.INVALID_INSET_SIDE) { // First fit all system bar insets as setFitInsetsSide defines which sides of system // bar insets to actually honor. setFitInsetsTypes(WindowInsets.Type.systemBars()); setFitInsetsSides(mHighestZOrder.getInsetSidesToFit()); } else { setFitInsetsTypes(mHighestZOrder.getInsetTypesToFit()); } } } /** Returns {@code true} is the window is visible. */ public boolean isWindowVisible() { Loading @@ -272,10 +288,16 @@ public class OverlayViewGlobalStateController { mSystemUIOverlayWindowController.setWindowVisible(visible); } /** Sets the insets to fit based on the {@link InsetsType} */ private void setFitInsetsTypes(@InsetsType int types) { mSystemUIOverlayWindowController.setFitInsetsTypes(types); } /** Sets the insets to fit based on the {@link InsetsSide} */ private void setFitInsetsSides(@InsetsSide int sides) { mSystemUIOverlayWindowController.setFitInsetsSides(sides); } /** * Sets the {@link android.view.WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM} flag of the * sysui overlay window. Loading packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java +7 −0 Original line number Diff line number Diff line Loading @@ -120,6 +120,13 @@ public class SystemUIOverlayWindowController implements updateWindow(); } /** Sets the sides of system bar insets to fit. Note: This should be rarely used. */ public void setFitInsetsSides(@WindowInsets.Side.InsetsSide int sides) { mLpChanged.setFitInsetsSides(sides); mLpChanged.setFitInsetsIgnoringVisibility(mUsingStableInsets); updateWindow(); } /** Sets the window to the visible state. */ public void setWindowVisible(boolean visible) { mVisible = visible; Loading Loading
packages/CarSystemUI/res/values/config.xml +9 −0 Original line number Diff line number Diff line Loading @@ -154,4 +154,13 @@ <!-- The Activity name for the Rear View Camera, if empty, the feature will be disabled. --> <string name="config_rearViewCameraActivity" translatable="false"></string> <!-- Whether the Notification Panel should be inset by the top system bar. --> <bool name="config_notif_panel_inset_by_top_systembar" translatable="false">false</bool> <!-- Whether the Notification Panel should be inset by the bottom system bar. --> <bool name="config_notif_panel_inset_by_bottom_systembar" translatable="false">true</bool> <!-- Whether the Notification Panel should be inset by the left system bar. --> <bool name="config_notif_panel_inset_by_left_systembar" translatable="false">false</bool> <!-- Whether the Notification Panel should be inset by the right system bar. --> <bool name="config_notif_panel_inset_by_right_systembar" translatable="false">false</bool> </resources>
packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +35 −2 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.systemui.R; import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.CarServiceProvider; import com.android.systemui.car.window.OverlayPanelViewController; import com.android.systemui.car.window.OverlayViewController; import com.android.systemui.car.window.OverlayViewGlobalStateController; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; Loading Loading @@ -84,6 +85,11 @@ public class NotificationPanelViewController extends OverlayPanelViewController private final boolean mEnableHeadsUpNotificationWhenNotificationShadeOpen; private final NotificationVisibilityLogger mNotificationVisibilityLogger; private final boolean mFitTopSystemBarInset; private final boolean mFitBottomSystemBarInset; private final boolean mFitLeftSystemBarInset; private final boolean mFitRightSystemBarInset; private float mInitialBackgroundAlpha; private float mBackgroundAlphaDiff; Loading Loading @@ -164,6 +170,15 @@ public class NotificationPanelViewController extends OverlayPanelViewController mEnableHeadsUpNotificationWhenNotificationShadeOpen = mResources.getBoolean( com.android.car.notification.R.bool .config_enableHeadsUpNotificationWhenNotificationShadeOpen); mFitTopSystemBarInset = mResources.getBoolean( R.bool.config_notif_panel_inset_by_top_systembar); mFitBottomSystemBarInset = mResources.getBoolean( R.bool.config_notif_panel_inset_by_bottom_systembar); mFitLeftSystemBarInset = mResources.getBoolean( R.bool.config_notif_panel_inset_by_left_systembar); mFitRightSystemBarInset = mResources.getBoolean( R.bool.config_notif_panel_inset_by_right_systembar); } // CommandQueue.Callbacks Loading Loading @@ -215,8 +230,26 @@ public class NotificationPanelViewController extends OverlayPanelViewController } @Override protected int getInsetTypesToFit() { return WindowInsets.Type.navigationBars(); protected int getInsetSidesToFit() { int insetSidesToFit = OverlayViewController.NO_INSET_SIDE; if (mFitTopSystemBarInset) { insetSidesToFit = insetSidesToFit | WindowInsets.Side.TOP; } if (mFitBottomSystemBarInset) { insetSidesToFit = insetSidesToFit | WindowInsets.Side.BOTTOM; } if (mFitLeftSystemBarInset) { insetSidesToFit = insetSidesToFit | WindowInsets.Side.LEFT; } if (mFitRightSystemBarInset) { insetSidesToFit = insetSidesToFit | WindowInsets.Side.RIGHT; } return insetSidesToFit; } @Override Loading
packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java +27 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,9 @@ import android.view.WindowInsets; * Owns a {@link View} that is present in SystemUIOverlayWindow. */ public class OverlayViewController { protected static final int INVALID_INSET_SIDE = -1; protected static final int NO_INSET_SIDE = 0; private final int mStubId; private final OverlayViewGlobalStateController mOverlayViewGlobalStateController; Loading Loading @@ -188,4 +191,28 @@ public class OverlayViewController { protected int getInsetTypesToFit() { return statusBars(); } /** * Optionally returns the sides of enabled system bar insets to fit to the sysui overlay window * when this {@link OverlayViewController} is in the foreground. * * For example, if the bottom and left system bars are enabled and this method returns * WindowInsets.Side.LEFT, then the inset from the bottom system bar will be ignored. * * NOTE: By default, this method returns {@link #INVALID_INSET_SIDE}, so insets to fit are * defined by {@link #getInsetTypesToFit()}, and not by this method, unless it is overridden * by subclasses. * * NOTE: {@link #NO_INSET_SIDE} signifies no insets from any system bars will be honored. Each * {@link OverlayViewController} can first take this value and add sides of the system bar * insets to honor to it. * * NOTE: If getInsetSidesToFit is overridden to return {@link WindowInsets.Side}, it always * takes precedence over {@link #getInsetTypesToFit()}. That is, the return value of {@link * #getInsetTypesToFit()} will be ignored. */ @WindowInsets.Side.InsetsSide protected int getInsetSidesToFit() { return INVALID_INSET_SIDE; } }
packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java +26 −4 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ import static android.view.WindowInsets.Type.statusBars; import android.annotation.Nullable; import android.util.Log; import android.view.WindowInsets; import android.view.WindowInsets.Side.InsetsSide; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsController; Loading Loading @@ -119,7 +121,7 @@ public class OverlayViewGlobalStateController { updateInternalsWhenShowingView(viewController); refreshUseStableInsets(); refreshInsetTypesToFit(); refreshInsetsToFit(); refreshWindowFocus(); refreshNavigationBarVisibility(); refreshStatusBarVisibility(); Loading Loading @@ -193,7 +195,7 @@ public class OverlayViewGlobalStateController { mZOrderVisibleSortedMap.remove(mZOrderMap.get(viewController)); refreshHighestZOrderWhenHidingView(viewController); refreshUseStableInsets(); refreshInsetTypesToFit(); refreshInsetsToFit(); refreshWindowFocus(); refreshNavigationBarVisibility(); refreshStatusBarVisibility(); Loading Loading @@ -255,13 +257,27 @@ public class OverlayViewGlobalStateController { mHighestZOrder == null ? false : mHighestZOrder.shouldUseStableInsets()); } private void refreshInsetTypesToFit() { /** * Refreshes the insets to fit (or honor) either by {@link InsetsType} or {@link InsetsSide}. * * By default, the insets to fit are defined by the {@link InsetsType}. But if an * {@link OverlayViewController} overrides {@link OverlayViewController#getInsetSidesToFit()} to * return an {@link InsetsSide}, then that takes precedence over {@link InsetsType}. */ private void refreshInsetsToFit() { if (mZOrderVisibleSortedMap.isEmpty()) { setFitInsetsTypes(statusBars()); } else { if (mHighestZOrder.getInsetSidesToFit() != OverlayViewController.INVALID_INSET_SIDE) { // First fit all system bar insets as setFitInsetsSide defines which sides of system // bar insets to actually honor. setFitInsetsTypes(WindowInsets.Type.systemBars()); setFitInsetsSides(mHighestZOrder.getInsetSidesToFit()); } else { setFitInsetsTypes(mHighestZOrder.getInsetTypesToFit()); } } } /** Returns {@code true} is the window is visible. */ public boolean isWindowVisible() { Loading @@ -272,10 +288,16 @@ public class OverlayViewGlobalStateController { mSystemUIOverlayWindowController.setWindowVisible(visible); } /** Sets the insets to fit based on the {@link InsetsType} */ private void setFitInsetsTypes(@InsetsType int types) { mSystemUIOverlayWindowController.setFitInsetsTypes(types); } /** Sets the insets to fit based on the {@link InsetsSide} */ private void setFitInsetsSides(@InsetsSide int sides) { mSystemUIOverlayWindowController.setFitInsetsSides(sides); } /** * Sets the {@link android.view.WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM} flag of the * sysui overlay window. Loading
packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java +7 −0 Original line number Diff line number Diff line Loading @@ -120,6 +120,13 @@ public class SystemUIOverlayWindowController implements updateWindow(); } /** Sets the sides of system bar insets to fit. Note: This should be rarely used. */ public void setFitInsetsSides(@WindowInsets.Side.InsetsSide int sides) { mLpChanged.setFitInsetsSides(sides); mLpChanged.setFitInsetsIgnoringVisibility(mUsingStableInsets); updateWindow(); } /** Sets the window to the visible state. */ public void setWindowVisible(boolean visible) { mVisible = visible; Loading