Merge "Add NavigationBarOverlayController."

This commit is contained in:
Peiyong Lin
2021-01-13 17:54:11 +00:00
committed by Android (Google) Code Review
9 changed files with 141 additions and 6 deletions

View File

@@ -49,6 +49,7 @@ import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.NavigationBarController;
import com.android.systemui.navigationbar.NavigationBarOverlayController;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.DarkIconDispatcher;
@@ -340,6 +341,7 @@ public class Dependency {
@Inject Lazy<ProtoTracer> mProtoTracer;
@Inject Lazy<MediaOutputDialogFactory> mMediaOutputDialogFactory;
@Inject Lazy<DeviceConfigProxy> mDeviceConfigProxy;
@Inject Lazy<NavigationBarOverlayController> mNavbarButtonsControllerLazy;
@Inject
public Dependency() {
@@ -536,6 +538,8 @@ public class Dependency {
mProviders.put(MediaOutputDialogFactory.class, mMediaOutputDialogFactory::get);
mProviders.put(NavigationBarOverlayController.class, mNavbarButtonsControllerLazy::get);
Dependency.setInstance(this);
}

View File

@@ -56,6 +56,7 @@ import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.NavigationBarController;
import com.android.systemui.navigationbar.NavigationBarOverlayController;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.plugins.PluginInitializerImpl;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -81,8 +82,8 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.theme.ThemeOverlayApplier;
import com.android.systemui.util.leak.LeakDetector;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import java.util.Optional;
import java.util.concurrent.Executor;
@@ -221,6 +222,7 @@ public class DependencyProvider {
SystemActions systemActions,
@Main Handler mainHandler,
UiEventLogger uiEventLogger,
NavigationBarOverlayController navBarOverlayController,
ConfigurationController configurationController) {
return new NavigationBarController(context,
windowManager,
@@ -244,6 +246,7 @@ public class DependencyProvider {
systemActions,
mainHandler,
uiEventLogger,
navBarOverlayController,
configurationController);
}

View File

@@ -136,8 +136,8 @@ import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import java.io.PrintWriter;
import java.util.List;
@@ -185,6 +185,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private final Optional<Recents> mRecentsOptional;
private final SystemActions mSystemActions;
private final Handler mHandler;
private final NavigationBarOverlayController mNavbarOverlayController;
private final UiEventLogger mUiEventLogger;
private Bundle mSavedState;
@@ -415,6 +416,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
NotificationRemoteInputManager notificationRemoteInputManager,
SystemActions systemActions,
@Main Handler mainHandler,
NavigationBarOverlayController navbarOverlayController,
UiEventLogger uiEventLogger) {
mContext = context;
mWindowManager = windowManager;
@@ -438,6 +440,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mRecentsOptional = recentsOptional;
mSystemActions = systemActions;
mHandler = mainHandler;
mNavbarOverlayController = navbarOverlayController;
mUiEventLogger = uiEventLogger;
}
@@ -862,6 +865,13 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
rotationButtonController.onRotationProposal(rotation, winRotation, isValid);
}
@Override
public void onRecentsAnimationStateChanged(boolean running) {
if (running) {
mNavbarOverlayController.setButtonState(/* visible */false, /* force */true);
}
}
/** Restores the appearance and the transient saved state to {@link NavigationBar}. */
public void restoreAppearanceAndTransientState() {
final int barMode = barMode(mTransientShown, mAppearance);

View File

@@ -64,8 +64,8 @@ import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -107,6 +107,7 @@ public class NavigationBarController implements Callbacks,
private final UiEventLogger mUiEventLogger;
private final Handler mHandler;
private final DisplayManager mDisplayManager;
private final NavigationBarOverlayController mNavBarOverlayController;
/** A displayId - nav bar maps. */
@VisibleForTesting
@@ -141,6 +142,7 @@ public class NavigationBarController implements Callbacks,
SystemActions systemActions,
@Main Handler mainHandler,
UiEventLogger uiEventLogger,
NavigationBarOverlayController navBarOverlayController,
ConfigurationController configurationController) {
mContext = context;
mWindowManager = windowManager;
@@ -168,6 +170,7 @@ public class NavigationBarController implements Callbacks,
commandQueue.addCallback(this);
configurationController.addCallback(this);
mConfigChanges.applyNewConfig(mContext.getResources());
mNavBarOverlayController = navBarOverlayController;
}
@Override
@@ -290,6 +293,7 @@ public class NavigationBarController implements Callbacks,
mNotificationRemoteInputManager,
mSystemActions,
mHandler,
mNavBarOverlayController,
mUiEventLogger);
View navigationBarView = navBar.createView(savedState);

View File

@@ -0,0 +1,88 @@
/*
* Copyright (C) 2021 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.navigationbar;
import android.annotation.ColorInt;
import android.content.Context;
import android.view.View;
import com.android.systemui.dagger.SysUISingleton;
import java.util.function.Consumer;
import javax.inject.Inject;
/** Contains logic that deals with showing buttons with navigation bar. */
@SysUISingleton
public class NavigationBarOverlayController {
protected final Context mContext;
@Inject
public NavigationBarOverlayController(Context context) {
mContext = context;
}
public Context getContext() {
return mContext;
}
/**
* Initialize the controller with visibility change callback and light/dark icon color.
*/
public void init(Consumer<Boolean> visibilityChangeCallback, @ColorInt int lightIconColor,
@ColorInt int darkIconColor) {}
/**
* Set whether the view can be shown.
*/
public void setCanShow(boolean canShow) {}
/**
* Set the buttons visibility.
*/
public void setButtonState(boolean visible, boolean force) {}
/**
* Register necessary listeners, called when NavigationBarView is attached to window.
*/
public void registerListeners() {}
/**
* Unregister listeners, called when navigationBarView is detached from window.
*/
public void unregisterListeners() {}
/**
* Set the dark intensity for all drawables.
*/
public void setDarkIntensity(float darkIntensity) {}
/**
* Return the current view.
*/
public View getCurrentView() {
return null;
}
/**
* Return the visibility of the view.
*/
public boolean isVisible() {
return false;
}
}

View File

@@ -192,6 +192,7 @@ public final class NavigationBarTransitions extends BarTransitions implements
buttonDispatchers.valueAt(i).setDarkIntensity(darkIntensity);
}
mView.getRotationButtonController().setDarkIntensity(darkIntensity);
Dependency.get(NavigationBarOverlayController.class).setDarkIntensity(darkIntensity);
for (DarkIntensityListener listener : mDarkIntensityListeners) {
listener.onDarkIntensity(darkIntensity);
}

View File

@@ -92,8 +92,8 @@ import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.LightBarTransitionsController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import java.io.PrintWriter;
import java.util.function.Consumer;
@@ -287,6 +287,13 @@ public class NavigationBarView extends FrameLayout implements
notifyActiveTouchRegions();
};
private final Consumer<Boolean> mNavbarOverlayVisibilityChangeCallback = (visible) -> {
if (visible) {
mAutoHideController.touchAutoHide();
}
notifyActiveTouchRegions();
};
public NavigationBarView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -327,6 +334,9 @@ public class NavigationBarView extends FrameLayout implements
isGesturalMode ? mFloatingRotationButton : rotateSuggestionButton,
mRotationButtonListener);
Dependency.get(NavigationBarOverlayController.class).init(
mNavbarOverlayVisibilityChangeCallback, mLightIconColor, mDarkIconColor);
mConfiguration = new Configuration();
mTmpLastConfiguration = new Configuration();
mConfiguration.updateFrom(context.getResources().getConfiguration());
@@ -413,6 +423,11 @@ public class NavigationBarView extends FrameLayout implements
void onTransientStateChanged(boolean isTransient) {
mEdgeBackGestureHandler.onNavBarTransientStateChanged(isTransient);
// The visibility of the navigation bar buttons is dependent on the transient state of
// the navigation bar.
Dependency.get(NavigationBarOverlayController.class).setButtonState(
isTransient, /* force */ false);
}
void onBarTransition(int newMode) {
@@ -642,6 +657,7 @@ public class NavigationBarView extends FrameLayout implements
}
mImeVisible = visible;
mRotationButtonController.getRotationButton().setCanShowRotationButton(!mImeVisible);
Dependency.get(NavigationBarOverlayController.class).setCanShow(!mImeVisible);
}
public void setDisabledFlags(int disabledFlags) {
@@ -965,6 +981,11 @@ public class NavigationBarView extends FrameLayout implements
} else {
updateButtonLocation(getRotateSuggestionButton(), inScreenSpace);
}
final NavigationBarOverlayController navBarButtonsController =
Dependency.get(NavigationBarOverlayController.class);
if (navBarButtonsController.isVisible()) {
updateButtonLocation(navBarButtonsController.getCurrentView(), inScreenSpace);
}
return mTmpRegion;
}
@@ -1185,6 +1206,7 @@ public class NavigationBarView extends FrameLayout implements
if (mRotationButtonController != null) {
mRotationButtonController.registerListeners();
}
Dependency.get(NavigationBarOverlayController.class).registerListeners();
getViewTreeObserver().addOnComputeInternalInsetsListener(mOnComputeInternalInsetsListener);
}
@@ -1200,6 +1222,7 @@ public class NavigationBarView extends FrameLayout implements
if (mRotationButtonController != null) {
mRotationButtonController.unregisterListeners();
}
Dependency.get(NavigationBarOverlayController.class).unregisterListeners();
mEdgeBackGestureHandler.onNavBarDetached();
getViewTreeObserver().removeOnComputeInternalInsetsListener(

View File

@@ -59,8 +59,8 @@ import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import org.junit.After;
import org.junit.Before;
@@ -106,6 +106,7 @@ public class NavigationBarControllerTest extends SysuiTestCase {
mock(SystemActions.class),
Dependency.get(Dependency.MAIN_HANDLER),
mock(UiEventLogger.class),
mock(NavigationBarOverlayController.class),
mock(ConfigurationController.class)));
initializeNavigationBars();
}

View File

@@ -76,8 +76,8 @@ import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import org.junit.Before;
import org.junit.Rule;
@@ -232,6 +232,7 @@ public class NavigationBarTest extends SysuiTestCase {
mock(NotificationRemoteInputManager.class),
mock(SystemActions.class),
mHandler,
mock(NavigationBarOverlayController.class),
mUiEventLogger));
}