diff options
| author | 2018-11-08 06:43:07 +0000 | |
|---|---|---|
| committer | 2018-11-08 06:43:07 +0000 | |
| commit | 4353cd61938628722a343c8616f6256a417cdc78 (patch) | |
| tree | 7442fed6c0ceb7d1f25d76657537fdd724135f0d | |
| parent | 481e21cac6e656ad897d4959f9e4eb6b91f3f1c6 (diff) | |
| parent | 3ddd7def01f65fdf26596f8836efeb04471d8de6 (diff) | |
Merge "Show navigation bar on external displays"
3 files changed, 119 insertions, 10 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index c35e1da1cd0c..bc3638e24af4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -21,6 +21,7 @@ import android.car.drivingstate.CarDrivingStateEvent; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.util.Log; +import android.view.Display; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -35,7 +36,6 @@ import com.android.systemui.R; import com.android.systemui.classifier.FalsingLog; import com.android.systemui.classifier.FalsingManager; import com.android.systemui.fragments.FragmentHostManager; -import com.android.systemui.recents.Recents; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.statusbar.StatusBarState; @@ -268,6 +268,14 @@ public class CarStatusBar extends StatusBar implements buildNavBarWindows(); buildNavBarContent(); attachNavBarWindows(); + + // Add external navigation bars if more than one displays exist. + final Display[] displays = mDisplayManager.getDisplays(); + + for (Display display : displays) { + // TODO(115978725): Add phone navigationBar for now + addExternalNavigationBar(display); + } } private void buildNavBarContent() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index 329a33d91b1b..4406b1495b2c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -55,7 +55,8 @@ import android.provider.Settings; import android.telecom.TelecomManager; import android.text.TextUtils; import android.util.Log; -import android.view.IRotationWatcher.Stub; +import android.view.Display; +import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -74,12 +75,12 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.LatencyTracker; import com.android.systemui.Dependency; -import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.R; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.assist.AssistManager; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; +import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.stackdivider.Divider; @@ -419,8 +420,12 @@ public class NavigationBarFragment extends Fragment implements Callbacks { } checkNavBarModes(); mStatusBar.touchAutoHide(); - mLightBarController.onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */, - true /* nbModeChanged */, mNavigationBarMode); + + // TODO(115978725): Support light bar controller on external nav bars. + if (mLightBarController != null) { + mLightBarController.onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */, + true /* nbModeChanged */, mNavigationBarMode); + } } @Override @@ -452,8 +457,11 @@ public class NavigationBarFragment extends Fragment implements Callbacks { } } - mLightBarController.onNavigationVisibilityChanged(vis, mask, nbModeChanged, - mNavigationBarMode); + // TODO(115978725): Support light bar controller on external nav bars. + if (mLightBarController != null) { + mLightBarController.onNavigationVisibilityChanged(vis, mask, nbModeChanged, + mNavigationBarMode); + } } @Override @@ -840,9 +848,17 @@ public class NavigationBarFragment extends Fragment implements Callbacks { }; public static View create(Context context, FragmentListener listener) { + final int displayId = context.getDisplay().getDisplayId(); + final boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); + final int height = isDefaultDisplay + ? LayoutParams.MATCH_PARENT + : context.getResources().getDimensionPixelSize(R.dimen.navigation_bar_height); WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.TYPE_NAVIGATION_BAR, + LayoutParams.MATCH_PARENT, height, + // TODO(b/117478341): Resolve one status bar/ navigation bar assumption + isDefaultDisplay + ? WindowManager.LayoutParams.TYPE_NAVIGATION_BAR + : WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL @@ -851,9 +867,13 @@ public class NavigationBarFragment extends Fragment implements Callbacks { | WindowManager.LayoutParams.FLAG_SLIPPERY, PixelFormat.TRANSLUCENT); lp.token = new Binder(); - lp.setTitle("NavigationBar"); + lp.setTitle("NavigationBar" + displayId); lp.accessibilityTitle = context.getString(R.string.nav_bar); lp.windowAnimations = 0; + if (!isDefaultDisplay) { + lp.flags |= LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR; + lp.gravity = Gravity.BOTTOM; + } View navigationBarView = LayoutInflater.from(context).inflate( R.layout.navigation_bar_window, null); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 6279d50a5952..966a34682937 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -22,6 +22,7 @@ import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.app.StatusBarManager.windowStateToString; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY; +import static android.view.Display.DEFAULT_DISPLAY; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_AWAKE; @@ -70,6 +71,8 @@ import android.content.res.Resources; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; +import android.hardware.display.DisplayManager; +import android.hardware.display.DisplayManager.DisplayListener; import android.media.AudioAttributes; import android.metrics.LogMaker; import android.net.Uri; @@ -96,6 +99,7 @@ import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Log; import android.util.Slog; +import android.util.SparseArray; import android.view.Display; import android.view.IWindowManager; import android.view.KeyEvent; @@ -558,8 +562,37 @@ public class StatusBar extends SystemUI implements DemoMode, } }; + protected DisplayManager mDisplayManager; + private NavigationBarFragment mNavigationBar; private View mNavigationBarView; + + /** A displayId - nav bar mapping */ + private SparseArray<NavigationBarFragment> mExternalNavigationBarMap = new SparseArray<>(); + + // TODO(b/115978725): Move it to DisplayNavigationBarController + private final DisplayListener mDisplayListener = new DisplayListener() { + @Override + public void onDisplayAdded(int displayId) { + final Display display = mDisplayManager.getDisplay(displayId); + addExternalNavigationBar(display); + } + + @Override + public void onDisplayRemoved(int displayId) { + final NavigationBarFragment navBar = mExternalNavigationBarMap.get(displayId); + if (navBar != null) { + final View navigationView = navBar.getView().getRootView(); + WindowManagerGlobal.getInstance().removeView(navigationView, true); + mExternalNavigationBarMap.remove(displayId); + } + } + + @Override + public void onDisplayChanged(int displayId) { + } + }; + private HeadsUpAppearanceController mHeadsUpAppearanceController; private boolean mVibrateOnOpening; private VibratorHelper mVibratorHelper; @@ -617,6 +650,9 @@ public class StatusBar extends SystemUI implements DemoMode, mDisplay = mWindowManager.getDefaultDisplay(); updateDisplaySize(); + // get display service to detect display status + mDisplayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); + Resources res = mContext.getResources(); mVibrateOnOpening = mContext.getResources().getBoolean( R.bool.config_vibrateOnIconAnimation); @@ -659,6 +695,7 @@ public class StatusBar extends SystemUI implements DemoMode, // If the system process isn't there we're doomed anyway. } + mDisplayManager.registerDisplayListener(mDisplayListener, mHandler); createAndAddWindows(); // Make sure we always have the most current wallpaper info. @@ -863,6 +900,7 @@ public class StatusBar extends SystemUI implements DemoMode, } }); + // TODO(115978725): Support light bar controller on external nav bars. mLightBarController = Dependency.get(LightBarController.class); if (mNavigationBar != null) { mNavigationBar.setLightBarController(mLightBarController); @@ -1046,6 +1084,33 @@ public class StatusBar extends SystemUI implements DemoMode, } mNavigationBar.setCurrentSysuiVisibility(mSystemUiVisibility); }); + + // Add external navigation bars if more than one displays exist. + final Display[] displays = mDisplayManager.getDisplays(); + for (Display display : displays) { + addExternalNavigationBar(display); + } + } + + /** + * Add a phone navigation bar on an external display if the display supports system decorations. + * + * @param display the display to add navigation bar on + */ + protected void addExternalNavigationBar(Display display) { + if (display == null || display.getDisplayId() == DEFAULT_DISPLAY + || !display.supportsSystemDecorations()) { + return; + } + + final int displayId = display.getDisplayId(); + final Context externalDisplayContext = mContext.createDisplayContext(display); + NavigationBarFragment.create(externalDisplayContext, + (tag, fragment) -> { + final NavigationBarFragment navBar = (NavigationBarFragment) fragment; + navBar.setCurrentSysuiVisibility(mSystemUiVisibility); + mExternalNavigationBarMap.append(displayId, navBar); + }); } /** @@ -2066,6 +2131,7 @@ public class StatusBar extends SystemUI implements DemoMode, } } + // TODO(115978725): Support auto hide on external nav bars. void touchAutoHide() { // update transient bar autohide if (mStatusBarMode == MODE_SEMI_TRANSPARENT || (mNavigationBar != null @@ -2105,6 +2171,7 @@ public class StatusBar extends SystemUI implements DemoMode, : MODE_OPAQUE; } + // TODO(115978725): Support animations on external nav bars. void checkBarModes() { if (mDemoMode) return; if (mStatusBarView != null) checkBarMode(mStatusBarMode, mStatusBarWindowState, @@ -2124,6 +2191,7 @@ public class StatusBar extends SystemUI implements DemoMode, transitions.transitionTo(mode, anim); } + // TODO(115978725): Support animations on external nav bars. private void finishBarAnimations() { if (mStatusBarView != null) { mStatusBarView.getBarTransitions().finishAnimations(); @@ -2857,6 +2925,16 @@ public class StatusBar extends SystemUI implements DemoMode, mWindowManager.removeViewImmediate(mNavigationBarView); mNavigationBarView = null; } + mDisplayManager.unregisterDisplayListener(mDisplayListener); + if (mExternalNavigationBarMap.size() > 0) { + for (int i = 0; i < mExternalNavigationBarMap.size(); i++) { + final View navigationWindow = mExternalNavigationBarMap.valueAt(i) + .getView().getRootView(); + WindowManagerGlobal.getInstance() + .removeView(navigationWindow, true /* immediate */); + } + mExternalNavigationBarMap.clear(); + } mContext.unregisterReceiver(mBroadcastReceiver); mContext.unregisterReceiver(mDemoReceiver); mAssistManager.destroy(); @@ -2925,6 +3003,7 @@ public class StatusBar extends SystemUI implements DemoMode, "transparent".equals(mode) ? MODE_TRANSPARENT : "warning".equals(mode) ? MODE_WARNING : -1; + // TODO(115978725): Support external nav bar transitions if (barMode != -1) { boolean animate = true; if (mStatusBarView != null) { @@ -3158,6 +3237,7 @@ public class StatusBar extends SystemUI implements DemoMode, mDraggedDownRow = null; } + // TODO(115978725): Support animations on external nav bars. // Disable layout transitions in navbar for this transition because the load is just // too heavy for the CPU and GPU on any device. if (mNavigationBar != null) { @@ -4415,6 +4495,7 @@ public class StatusBar extends SystemUI implements DemoMode, } // End Extra BaseStatusBarMethods. + // TODO(115978725): Handle dimming for external nav bars private final Runnable mAutoDim = () -> { if (mNavigationBar != null) { mNavigationBar.getBarTransitions().setAutoDim(true); |