Merge "SysUI: Add method for plugins to keep status bar full screen"

This commit is contained in:
TreeHugger Robot
2017-02-08 17:53:48 +00:00
committed by Android (Google) Code Review
11 changed files with 133 additions and 30 deletions

View File

@@ -27,3 +27,13 @@ LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_JAR_EXCLUDE_FILES := none
include $(BUILD_STATIC_JAVA_LIBRARY)
include $(CLEAR_VARS)
# Dummy to generate .toc files.
LOCAL_PACKAGE_NAME := PluginDummyLib
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := SystemUIPluginLib
include $(BUILD_PACKAGE)

View File

@@ -15,11 +15,14 @@
package com.android.systemui.plugin.testoverlayplugin;
import android.content.Context;
import android.graphics.Rect;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.InternalInsetsInfo;
import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
import com.android.systemui.plugins.OverlayPlugin;
public class SampleOverlayPlugin implements OverlayPlugin {
@@ -28,6 +31,9 @@ public class SampleOverlayPlugin implements OverlayPlugin {
private View mStatusBarView;
private View mNavBarView;
private boolean mInputSetup;
private boolean mCollapseDesired;
private float mStatusBarHeight;
@Override
public int getVersion() {
@@ -43,6 +49,10 @@ public class SampleOverlayPlugin implements OverlayPlugin {
@Override
public void onDestroy() {
if (mInputSetup) {
mStatusBarView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
onComputeInternalInsetsListener);
}
Log.d(TAG, "onDestroy");
if (mStatusBarView != null) {
mStatusBarView.post(
@@ -57,6 +67,9 @@ public class SampleOverlayPlugin implements OverlayPlugin {
public void setup(View statusBar, View navBar) {
Log.d(TAG, "Setup");
int id = mPluginContext.getResources().getIdentifier("status_bar_height", "dimen",
"android");
mStatusBarHeight = mPluginContext.getResources().getDimension(id);
if (statusBar instanceof ViewGroup) {
mStatusBarView = LayoutInflater.from(mPluginContext)
.inflate(R.layout.colored_overlay, (ViewGroup) statusBar, false);
@@ -68,4 +81,28 @@ public class SampleOverlayPlugin implements OverlayPlugin {
((ViewGroup) navBar).addView(mNavBarView);
}
}
@Override
public void setCollapseDesired(boolean collapseDesired) {
mCollapseDesired = collapseDesired;
}
@Override
public boolean holdStatusBarOpen() {
if (!mInputSetup) {
mInputSetup = true;
mStatusBarView.getViewTreeObserver().addOnComputeInternalInsetsListener(
onComputeInternalInsetsListener);
}
return true;
}
final OnComputeInternalInsetsListener onComputeInternalInsetsListener = inoutInfo -> {
inoutInfo.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
if (mCollapseDesired) {
inoutInfo.touchableRegion.set(new Rect(0, 0, 50000, (int) mStatusBarHeight));
} else {
inoutInfo.touchableRegion.set(new Rect(0, 0, 50000, 50000));
}
};
}

View File

@@ -21,4 +21,14 @@ public interface OverlayPlugin extends Plugin {
int VERSION = 1;
void setup(View statusBar, View navBar);
default boolean holdStatusBarOpen() {
return false;
}
/**
* Only called if the plugin has returned true to holdStatusBarOpen().
*/
default void setCollapseDesired(boolean collapseDesired) {
}
}

View File

@@ -27,6 +27,7 @@ import com.android.systemui.assist.AssistManager;
import com.android.systemui.plugins.PluginManager;
import com.android.systemui.statusbar.phone.ManagedProfileController;
import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl;
import com.android.systemui.statusbar.phone.StatusBarWindowManager;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryControllerImpl;
@@ -183,6 +184,9 @@ public class Dependency extends SystemUI {
mProviders.put(TunerService.class.getName(), () ->
new TunerService(mContext));
mProviders.put(StatusBarWindowManager.class.getName(), () ->
new StatusBarWindowManager(mContext));
// Put all dependencies above here so the factory can override them if it wants.
SystemUIFactory.getInstance().injectDependencies(mProviders, mContext);
}

View File

@@ -27,6 +27,7 @@ import android.content.res.Configuration;
import android.os.Process;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.util.ArraySet;
import android.util.Log;
import com.android.systemui.fragments.FragmentService;
@@ -43,6 +44,7 @@ import com.android.systemui.shortcut.ShortcutKeyDispatcher;
import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarWindowManager;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.usb.StorageNotification;
import com.android.systemui.util.NotificationChannels;
@@ -149,7 +151,6 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
* Makes sure that all the SystemUI services are running. If they are already running, this is a
* no-op. This is needed to conditinally start all the services, as we only need to have it in
* the main process.
*
* <p>This method must only be called from the main thread.</p>
*/
public void startServicesIfNeeded() {
@@ -160,7 +161,6 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
* Ensures that all the Secondary user SystemUI services are running. If they are already
* running, this is a no-op. This is needed to conditinally start all the services, as we only
* need to have it in the main process.
*
* <p>This method must only be called from the main thread.</p>
*/
void startSecondaryUserServicesIfNeeded() {
@@ -184,7 +184,7 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
Log.v(TAG, "Starting SystemUI services for user " +
Process.myUserHandle().getIdentifier() + ".");
final int N = services.length;
for (int i=0; i<N; i++) {
for (int i = 0; i < N; i++) {
Class<?> cl = services[i];
if (DEBUG) Log.d(TAG, "loading: " + cl);
try {
@@ -207,15 +207,34 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
}
Dependency.get(PluginManager.class).addPluginListener(OverlayPlugin.ACTION,
new PluginListener<OverlayPlugin>() {
@Override
public void onPluginConnected(OverlayPlugin plugin, Context pluginContext) {
StatusBar statusBar = getComponent(StatusBar.class);
if (statusBar != null) {
plugin.setup(statusBar.getStatusBarWindow(),
statusBar.getNavigationBarView());
}
}
}, OverlayPlugin.VERSION, true /* Allow multiple plugins */);
private ArraySet<OverlayPlugin> mOverlays;
@Override
public void onPluginConnected(OverlayPlugin plugin, Context pluginContext) {
StatusBar statusBar = getComponent(StatusBar.class);
if (statusBar != null) {
plugin.setup(statusBar.getStatusBarWindow(),
statusBar.getNavigationBarView());
}
// Lazy init.
if (mOverlays == null) mOverlays = new ArraySet<>();
if (plugin.holdStatusBarOpen()) {
mOverlays.add(plugin);
Dependency.get(StatusBarWindowManager.class).setStateListener(b ->
mOverlays.forEach(o -> o.setCollapseDesired(b)));
Dependency.get(StatusBarWindowManager.class).setForcePluginOpen(
mOverlays.size() != 0);
}
}
@Override
public void onPluginDisconnected(OverlayPlugin plugin) {
mOverlays.remove(plugin);
Dependency.get(StatusBarWindowManager.class).setForcePluginOpen(
mOverlays.size() != 0);
}
}, OverlayPlugin.VERSION, true /* Allow multiple plugins */);
mServicesStarted = true;
}

View File

@@ -1956,11 +1956,11 @@ public class KeyguardViewMediator extends SystemUI {
}
public StatusBarKeyguardViewManager registerStatusBar(StatusBar statusBar,
ViewGroup container, StatusBarWindowManager statusBarWindowManager,
ViewGroup container,
ScrimController scrimController,
FingerprintUnlockController fingerprintUnlockController) {
mStatusBarKeyguardViewManager.registerStatusBar(statusBar, container,
statusBarWindowManager, scrimController, fingerprintUnlockController,
scrimController, fingerprintUnlockController,
mDismissCallbackRegistry);
return mStatusBarKeyguardViewManager;
}

View File

@@ -17,6 +17,7 @@
package com.android.systemui.statusbar;
import com.android.internal.util.Preconditions;
import com.android.systemui.Dependency;
import com.android.systemui.statusbar.phone.StatusBarWindowManager;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.RemoteInputView;
@@ -39,8 +40,8 @@ public class RemoteInputController {
private final ArrayList<Callback> mCallbacks = new ArrayList<>(3);
private final HeadsUpManager mHeadsUpManager;
public RemoteInputController(StatusBarWindowManager sbwm, HeadsUpManager headsUpManager) {
addCallback(sbwm);
public RemoteInputController(HeadsUpManager headsUpManager) {
addCallback(Dependency.get(StatusBarWindowManager.class));
mHeadsUpManager = headsUpManager;
}

View File

@@ -27,6 +27,7 @@ import com.android.keyguard.KeyguardConstants;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.LatencyTracker;
import com.android.systemui.Dependency;
import com.android.systemui.keyguard.KeyguardViewMediator;
/**
@@ -101,7 +102,6 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
private int mPendingAuthenticatedUserId = -1;
public FingerprintUnlockController(Context context,
StatusBarWindowManager statusBarWindowManager,
DozeScrimController dozeScrimController,
KeyguardViewMediator keyguardViewMediator,
ScrimController scrimController,
@@ -111,7 +111,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
mPowerManager = context.getSystemService(PowerManager.class);
mUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
mUpdateMonitor.registerCallback(this);
mStatusBarWindowManager = statusBarWindowManager;
mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
mDozeScrimController = dozeScrimController;
mKeyguardViewMediator = keyguardViewMediator;
mScrimController = scrimController;

View File

@@ -1434,10 +1434,10 @@ public class StatusBar extends SystemUI implements DemoMode,
Trace.beginSection("StatusBar#startKeyguard");
KeyguardViewMediator keyguardViewMediator = getComponent(KeyguardViewMediator.class);
mFingerprintUnlockController = new FingerprintUnlockController(mContext,
mStatusBarWindowManager, mDozeScrimController, keyguardViewMediator,
mDozeScrimController, keyguardViewMediator,
mScrimController, this, UnlockMethodCache.getInstance(mContext));
mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,
getBouncerContainer(), mStatusBarWindowManager, mScrimController,
getBouncerContainer(), mScrimController,
mFingerprintUnlockController);
mKeyguardIndicationController.setStatusBarKeyguardViewManager(
mStatusBarKeyguardViewManager);
@@ -3384,9 +3384,6 @@ public class StatusBar extends SystemUI implements DemoMode,
pw.print(" status bar gestures: ");
mGestureRec.dump(fd, pw, args);
}
if (mStatusBarWindowManager != null) {
mStatusBarWindowManager.dump(fd, pw, args);
}
if (mHeadsUpManager != null) {
mHeadsUpManager.dump(fd, pw, args);
@@ -3425,9 +3422,8 @@ public class StatusBar extends SystemUI implements DemoMode,
private void addStatusBarWindow() {
makeStatusBarView();
mStatusBarWindowManager = new StatusBarWindowManager(mContext);
mRemoteInputController = new RemoteInputController(mStatusBarWindowManager,
mHeadsUpManager);
mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
mRemoteInputController = new RemoteInputController(mHeadsUpManager);
mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());
}

View File

@@ -32,6 +32,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.DejankUtils;
import com.android.keyguard.LatencyTracker;
import com.android.systemui.Dependency;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.statusbar.CommandQueue;
@@ -67,6 +68,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
private static String TAG = "StatusBarKeyguardViewManager";
protected final Context mContext;
private final StatusBarWindowManager mStatusBarWindowManager;
protected LockPatternUtils mLockPatternUtils;
protected ViewMediatorCallback mViewMediatorCallback;
@@ -75,7 +77,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
private FingerprintUnlockController mFingerprintUnlockController;
private ViewGroup mContainer;
private StatusBarWindowManager mStatusBarWindowManager;
private boolean mDeviceInteractive = false;
private boolean mScreenTurnedOn;
@@ -101,16 +102,16 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mContext = context;
mViewMediatorCallback = callback;
mLockPatternUtils = lockPatternUtils;
mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
}
public void registerStatusBar(StatusBar statusBar,
ViewGroup container, StatusBarWindowManager statusBarWindowManager,
ViewGroup container,
ScrimController scrimController,
FingerprintUnlockController fingerprintUnlockController,
DismissCallbackRegistry dismissCallbackRegistry) {
mStatusBar = statusBar;
mContainer = container;
mStatusBarWindowManager = statusBarWindowManager;
mScrimController = scrimController;
mFingerprintUnlockController = fingerprintUnlockController;
mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,

View File

@@ -32,6 +32,7 @@ import android.view.ViewGroup;
import android.view.WindowManager;
import com.android.keyguard.R;
import com.android.systemui.Dumpable;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.StatusBarState;
@@ -43,7 +44,7 @@ import java.lang.reflect.Field;
/**
* Encapsulates all logic for the status bar window state management.
*/
public class StatusBarWindowManager implements RemoteInputController.Callback {
public class StatusBarWindowManager implements RemoteInputController.Callback, Dumpable {
private static final String TAG = "StatusBarWindowManager";
@@ -59,6 +60,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback {
private final boolean mKeyguardScreenRotation;
private final float mScreenBrightnessDoze;
private final State mCurrentState = new State();
private OtherwisedCollapsedListener mListener;
public StatusBarWindowManager(Context context) {
mContext = context;
@@ -154,6 +156,10 @@ public class StatusBarWindowManager implements RemoteInputController.Callback {
private void applyHeight(State state) {
boolean expanded = isExpanded(state);
if (state.forcePluginOpen) {
mListener.setWouldOtherwiseCollapse(expanded);
expanded = true;
}
if (expanded) {
mLpChanged.height = ViewGroup.LayoutParams.MATCH_PARENT;
} else {
@@ -356,6 +362,15 @@ public class StatusBarWindowManager implements RemoteInputController.Callback {
apply(mCurrentState);
}
public void setForcePluginOpen(boolean forcePluginOpen) {
mCurrentState.forcePluginOpen = forcePluginOpen;
apply(mCurrentState);
}
public void setStateListener(OtherwisedCollapsedListener listener) {
mListener = listener;
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("StatusBarWindowManager state:");
pw.println(mCurrentState);
@@ -388,6 +403,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback {
int statusBarState;
boolean remoteInputActive;
boolean forcePluginOpen;
private boolean isKeyguardShowingAndNotOccluded() {
return keyguardShowing && !keyguardOccluded;
@@ -419,4 +435,13 @@ public class StatusBarWindowManager implements RemoteInputController.Callback {
return result.toString();
}
}
/**
* Custom listener to pipe data back to plugins about whether or not the status bar would be
* collapsed if not for the plugin.
* TODO: Find cleaner way to do this.
*/
public interface OtherwisedCollapsedListener {
void setWouldOtherwiseCollapse(boolean otherwiseCollapse);
}
}