summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Charles Chen <charlesccchen@google.com> 2018-11-08 06:43:07 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-11-08 06:43:07 +0000
commit4353cd61938628722a343c8616f6256a417cdc78 (patch)
tree7442fed6c0ceb7d1f25d76657537fdd724135f0d
parent481e21cac6e656ad897d4959f9e4eb6b91f3f1c6 (diff)
parent3ddd7def01f65fdf26596f8836efeb04471d8de6 (diff)
Merge "Show navigation bar on external displays"
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java38
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java81
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);