diff options
4 files changed, 138 insertions, 81 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index b7844bc6395e..fbcf0680f185 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -44,14 +44,15 @@ import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.PluginDependencyProvider; import com.android.systemui.plugins.PluginInitializerImpl; -import com.android.systemui.recents.OverviewProxyService; -import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.shared.plugins.PluginManagerImpl; import com.android.systemui.plugins.VolumeDialogController; import com.android.systemui.power.EnhancedEstimates; import com.android.systemui.power.EnhancedEstimatesImpl; import com.android.systemui.power.PowerNotificationWarnings; import com.android.systemui.power.PowerUI; +import com.android.systemui.recents.OverviewProxyService; +import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManagerImpl; +import com.android.systemui.statusbar.DisplayNavigationBarController; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.notification.NotificationData.KeyguardEnvironment; @@ -362,6 +363,9 @@ public class Dependency extends SystemUI { mProviders.put(AppOpsController.class, () -> new AppOpsControllerImpl(mContext, getDependency(BG_LOOPER))); + mProviders.put(DisplayNavigationBarController.class, () -> + new DisplayNavigationBarController(mContext, getDependency(MAIN_HANDLER))); + // Put all dependencies above here so the factory can override them if it wants. SystemUIFactory.getInstance().injectDependencies(mProviders, mContext); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DisplayNavigationBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/DisplayNavigationBarController.java new file mode 100644 index 000000000000..3b611a3199d6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DisplayNavigationBarController.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar; + +import static android.view.Display.DEFAULT_DISPLAY; + +import android.content.Context; +import android.hardware.display.DisplayManager; +import android.hardware.display.DisplayManager.DisplayListener; +import android.os.Handler; +import android.util.SparseArray; +import android.view.Display; +import android.view.View; +import android.view.WindowManagerGlobal; + +import com.android.systemui.statusbar.phone.NavigationBarFragment; + +/** + * A controller to handle external navigation bars + */ +public class DisplayNavigationBarController implements DisplayListener { + + private final Context mContext; + private final Handler mHandler; + private final DisplayManager mDisplayManager; + + /** A displayId - nav bar mapping */ + private SparseArray<NavigationBarFragment> mExternalNavigationBarMap = new SparseArray<>(); + + public DisplayNavigationBarController(Context context, Handler handler) { + mContext = context; + mHandler = handler; + mDisplayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); + + registerListener(); + } + + @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) { + } + + /** Create external navigation bars when car/status bar initializes */ + public void createNavigationBars() { + // Add external navigation bars if more than one displays exist. + final Display[] displays = mDisplayManager.getDisplays(); + for (Display display : displays) { + addExternalNavigationBar(display); + } + } + + /** remove external navigation bars and unset everything related to external navigation bars */ + public void destroy() { + unregisterListener(); + 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(); + } + } + + private void registerListener() { + mDisplayManager.registerDisplayListener(this, mHandler); + } + + private void unregisterListener() { + mDisplayManager.unregisterDisplayListener(this); + } + + /** + * Add a phone navigation bar on an external display if the display supports system decorations. + * + * @param display the display to add navigation bar on + */ + private 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; + // TODO(b/115978725): handle external nav bars sysuiVisibility + navBar.setCurrentSysuiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + mExternalNavigationBarMap.append(displayId, navBar); + } + ); + } +} 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 bc3638e24af4..4bff5ba3de7f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -21,7 +21,6 @@ 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; @@ -269,13 +268,7 @@ public class CarStatusBar extends StatusBar implements 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); - } + mNavigationBarController.createNavigationBars(); } private void buildNavBarContent() { 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 966a34682937..12fbf2d979f4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -22,7 +22,6 @@ 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; @@ -72,7 +71,6 @@ 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; @@ -99,7 +97,6 @@ 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; @@ -172,6 +169,7 @@ import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.BackDropView; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CrossFadeHelper; +import com.android.systemui.statusbar.DisplayNavigationBarController; import com.android.systemui.statusbar.EmptyShadeView; import com.android.systemui.statusbar.GestureRecorder; import com.android.systemui.statusbar.KeyboardShortcuts; @@ -567,32 +565,6 @@ public class StatusBar extends SystemUI implements DemoMode, 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; @@ -639,6 +611,7 @@ public class StatusBar extends SystemUI implements DemoMode, mKeyguardViewMediator = getComponent(KeyguardViewMediator.class); mColorExtractor = Dependency.get(SysuiColorExtractor.class); mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); + mNavigationBarController = Dependency.get(DisplayNavigationBarController.class); mColorExtractor.addOnColorsChangedListener(this); mStatusBarStateController.addListener(this, StatusBarStateController.RANK_STATUS_BAR); @@ -650,9 +623,6 @@ 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); @@ -695,7 +665,6 @@ 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. @@ -1084,33 +1053,6 @@ 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); - }); } /** @@ -2925,16 +2867,7 @@ 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(); - } + mNavigationBarController.destroy(); mContext.unregisterReceiver(mBroadcastReceiver); mContext.unregisterReceiver(mDemoReceiver); mAssistManager.destroy(); @@ -4179,6 +4112,8 @@ public class StatusBar extends SystemUI implements DemoMode, private DeviceProvisionedController mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); + protected DisplayNavigationBarController mNavigationBarController; + // UI-specific methods protected WindowManager mWindowManager; |