Merge "Pin bubbles to the bottom right on tablets for the prototype" into tm-qpr-dev am: 938281a014
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20197655 Change-Id: I1cc3e7550b689b09aef338fd06c58d16a714056d Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -28,10 +28,6 @@ import static com.android.wm.shell.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_CONTRO
|
|||||||
import static com.android.wm.shell.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_GESTURE;
|
import static com.android.wm.shell.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_GESTURE;
|
||||||
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES;
|
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES;
|
||||||
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
|
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
|
||||||
import static com.android.wm.shell.bubbles.BubblePositioner.TASKBAR_POSITION_BOTTOM;
|
|
||||||
import static com.android.wm.shell.bubbles.BubblePositioner.TASKBAR_POSITION_LEFT;
|
|
||||||
import static com.android.wm.shell.bubbles.BubblePositioner.TASKBAR_POSITION_NONE;
|
|
||||||
import static com.android.wm.shell.bubbles.BubblePositioner.TASKBAR_POSITION_RIGHT;
|
|
||||||
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_BLOCKED;
|
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_BLOCKED;
|
||||||
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_GROUP_CANCELLED;
|
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_GROUP_CANCELLED;
|
||||||
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_INVALID_INTENT;
|
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_INVALID_INTENT;
|
||||||
@@ -41,6 +37,7 @@ import static com.android.wm.shell.bubbles.Bubbles.DISMISS_NO_LONGER_BUBBLE;
|
|||||||
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_PACKAGE_REMOVED;
|
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_PACKAGE_REMOVED;
|
||||||
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_SHORTCUT_REMOVED;
|
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_SHORTCUT_REMOVED;
|
||||||
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_USER_CHANGED;
|
import static com.android.wm.shell.bubbles.Bubbles.DISMISS_USER_CHANGED;
|
||||||
|
import static com.android.wm.shell.floating.FloatingTasksController.SHOW_FLOATING_TASKS_AS_BUBBLES;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.UserIdInt;
|
import android.annotation.UserIdInt;
|
||||||
@@ -59,10 +56,8 @@ import android.content.pm.ShortcutInfo;
|
|||||||
import android.content.pm.UserInfo;
|
import android.content.pm.UserInfo;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.PixelFormat;
|
import android.graphics.PixelFormat;
|
||||||
import android.graphics.PointF;
|
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
@@ -126,18 +121,6 @@ public class BubbleController implements ConfigurationChangeListener {
|
|||||||
|
|
||||||
private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleController" : TAG_BUBBLES;
|
private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleController" : TAG_BUBBLES;
|
||||||
|
|
||||||
// TODO(b/173386799) keep in sync with Launcher3, not hooked up to anything
|
|
||||||
public static final String EXTRA_TASKBAR_CREATED = "taskbarCreated";
|
|
||||||
public static final String EXTRA_BUBBLE_OVERFLOW_OPENED = "bubbleOverflowOpened";
|
|
||||||
public static final String EXTRA_TASKBAR_VISIBLE = "taskbarVisible";
|
|
||||||
public static final String EXTRA_TASKBAR_POSITION = "taskbarPosition";
|
|
||||||
public static final String EXTRA_TASKBAR_ICON_SIZE = "taskbarIconSize";
|
|
||||||
public static final String EXTRA_TASKBAR_BUBBLE_XY = "taskbarBubbleXY";
|
|
||||||
public static final String EXTRA_TASKBAR_SIZE = "taskbarSize";
|
|
||||||
public static final String LEFT_POSITION = "Left";
|
|
||||||
public static final String RIGHT_POSITION = "Right";
|
|
||||||
public static final String BOTTOM_POSITION = "Bottom";
|
|
||||||
|
|
||||||
// Should match with PhoneWindowManager
|
// Should match with PhoneWindowManager
|
||||||
private static final String SYSTEM_DIALOG_REASON_KEY = "reason";
|
private static final String SYSTEM_DIALOG_REASON_KEY = "reason";
|
||||||
private static final String SYSTEM_DIALOG_REASON_GESTURE_NAV = "gestureNav";
|
private static final String SYSTEM_DIALOG_REASON_GESTURE_NAV = "gestureNav";
|
||||||
@@ -470,52 +453,6 @@ public class BubbleController implements ConfigurationChangeListener {
|
|||||||
mBubbleData.setExpanded(true);
|
mBubbleData.setExpanded(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called when any taskbar state changes (e.g. visibility, position, sizes). */
|
|
||||||
private void onTaskbarChanged(Bundle b) {
|
|
||||||
if (b == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
boolean isVisible = b.getBoolean(EXTRA_TASKBAR_VISIBLE, false /* default */);
|
|
||||||
String position = b.getString(EXTRA_TASKBAR_POSITION, RIGHT_POSITION /* default */);
|
|
||||||
@BubblePositioner.TaskbarPosition int taskbarPosition = TASKBAR_POSITION_NONE;
|
|
||||||
switch (position) {
|
|
||||||
case LEFT_POSITION:
|
|
||||||
taskbarPosition = TASKBAR_POSITION_LEFT;
|
|
||||||
break;
|
|
||||||
case RIGHT_POSITION:
|
|
||||||
taskbarPosition = TASKBAR_POSITION_RIGHT;
|
|
||||||
break;
|
|
||||||
case BOTTOM_POSITION:
|
|
||||||
taskbarPosition = TASKBAR_POSITION_BOTTOM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
int[] itemPosition = b.getIntArray(EXTRA_TASKBAR_BUBBLE_XY);
|
|
||||||
int iconSize = b.getInt(EXTRA_TASKBAR_ICON_SIZE);
|
|
||||||
int taskbarSize = b.getInt(EXTRA_TASKBAR_SIZE);
|
|
||||||
Log.w(TAG, "onTaskbarChanged:"
|
|
||||||
+ " isVisible: " + isVisible
|
|
||||||
+ " position: " + position
|
|
||||||
+ " itemPosition: " + itemPosition[0] + "," + itemPosition[1]
|
|
||||||
+ " iconSize: " + iconSize);
|
|
||||||
PointF point = new PointF(itemPosition[0], itemPosition[1]);
|
|
||||||
mBubblePositioner.setPinnedLocation(isVisible ? point : null);
|
|
||||||
mBubblePositioner.updateForTaskbar(iconSize, taskbarPosition, isVisible, taskbarSize);
|
|
||||||
if (mStackView != null) {
|
|
||||||
if (isVisible && b.getBoolean(EXTRA_TASKBAR_CREATED, false /* default */)) {
|
|
||||||
// If taskbar was created, add and remove the window so that bubbles display on top
|
|
||||||
removeFromWindowManagerMaybe();
|
|
||||||
addToWindowManagerMaybe();
|
|
||||||
}
|
|
||||||
mStackView.updateStackPosition();
|
|
||||||
mBubbleIconFactory = new BubbleIconFactory(mContext);
|
|
||||||
mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext);
|
|
||||||
mStackView.onDisplaySizeChanged();
|
|
||||||
}
|
|
||||||
if (b.getBoolean(EXTRA_BUBBLE_OVERFLOW_OPENED, false)) {
|
|
||||||
openBubbleOverflow();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the status bar has become visible or invisible (either permanently or
|
* Called when the status bar has become visible or invisible (either permanently or
|
||||||
* temporarily).
|
* temporarily).
|
||||||
@@ -654,6 +591,11 @@ public class BubbleController implements ConfigurationChangeListener {
|
|||||||
}
|
}
|
||||||
mStackView.setUnbubbleConversationCallback(mSysuiProxy::onUnbubbleConversation);
|
mStackView.setUnbubbleConversationCallback(mSysuiProxy::onUnbubbleConversation);
|
||||||
}
|
}
|
||||||
|
if (SHOW_FLOATING_TASKS_AS_BUBBLES && mBubblePositioner.isLargeScreen()) {
|
||||||
|
mBubblePositioner.setUsePinnedLocation(true);
|
||||||
|
} else {
|
||||||
|
mBubblePositioner.setUsePinnedLocation(false);
|
||||||
|
}
|
||||||
|
|
||||||
addToWindowManagerMaybe();
|
addToWindowManagerMaybe();
|
||||||
}
|
}
|
||||||
@@ -1731,13 +1673,6 @@ public class BubbleController implements ConfigurationChangeListener {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTaskbarChanged(Bundle b) {
|
|
||||||
mMainExecutor.execute(() -> {
|
|
||||||
BubbleController.this.onTaskbarChanged(b);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean handleDismissalInterception(BubbleEntry entry,
|
public boolean handleDismissalInterception(BubbleEntry entry,
|
||||||
@Nullable List<BubbleEntry> children, IntConsumer removeCallback,
|
@Nullable List<BubbleEntry> children, IntConsumer removeCallback,
|
||||||
|
|||||||
@@ -713,6 +713,9 @@ public class BubblePositioner {
|
|||||||
* is being shown.
|
* is being shown.
|
||||||
*/
|
*/
|
||||||
public PointF getDefaultStartPosition() {
|
public PointF getDefaultStartPosition() {
|
||||||
|
if (mPinLocation != null) {
|
||||||
|
return mPinLocation;
|
||||||
|
}
|
||||||
// Start on the left if we're in LTR, right otherwise.
|
// Start on the left if we're in LTR, right otherwise.
|
||||||
final boolean startOnLeft =
|
final boolean startOnLeft =
|
||||||
mContext.getResources().getConfiguration().getLayoutDirection()
|
mContext.getResources().getConfiguration().getLayoutDirection()
|
||||||
@@ -766,11 +769,18 @@ public class BubblePositioner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* In some situations bubbles will be pinned to a specific onscreen location. This sets the
|
* In some situations bubbles will be pinned to a specific onscreen location. This sets whether
|
||||||
* location to anchor the stack to.
|
* bubbles should be pinned or not.
|
||||||
*/
|
*/
|
||||||
public void setPinnedLocation(PointF point) {
|
public void setUsePinnedLocation(boolean usePinnedLocation) {
|
||||||
mPinLocation = point;
|
if (usePinnedLocation) {
|
||||||
|
mShowingInTaskbar = true;
|
||||||
|
mPinLocation = new PointF(mPositionRect.right - mBubbleSize,
|
||||||
|
mPositionRect.bottom - mBubbleSize);
|
||||||
|
} else {
|
||||||
|
mPinLocation = null;
|
||||||
|
mShowingInTaskbar = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -613,16 +613,11 @@ public class BubbleStackView extends FrameLayout
|
|||||||
mBubbleContainer.setActiveController(mStackAnimationController);
|
mBubbleContainer.setActiveController(mStackAnimationController);
|
||||||
hideFlyoutImmediate();
|
hideFlyoutImmediate();
|
||||||
|
|
||||||
if (mPositioner.showingInTaskbar()) {
|
// Save the magnetized stack so we can dispatch touch events to it.
|
||||||
// In taskbar, the stack isn't draggable so we shouldn't dispatch touch events.
|
mMagnetizedObject = mStackAnimationController.getMagnetizedStack();
|
||||||
mMagnetizedObject = null;
|
mMagnetizedObject.clearAllTargets();
|
||||||
} else {
|
mMagnetizedObject.addTarget(mMagneticTarget);
|
||||||
// Save the magnetized stack so we can dispatch touch events to it.
|
mMagnetizedObject.setMagnetListener(mStackMagnetListener);
|
||||||
mMagnetizedObject = mStackAnimationController.getMagnetizedStack();
|
|
||||||
mMagnetizedObject.clearAllTargets();
|
|
||||||
mMagnetizedObject.addTarget(mMagneticTarget);
|
|
||||||
mMagnetizedObject.setMagnetListener(mStackMagnetListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
mIsDraggingStack = true;
|
mIsDraggingStack = true;
|
||||||
|
|
||||||
@@ -641,10 +636,7 @@ public class BubbleStackView extends FrameLayout
|
|||||||
public void onMove(@NonNull View v, @NonNull MotionEvent ev, float viewInitialX,
|
public void onMove(@NonNull View v, @NonNull MotionEvent ev, float viewInitialX,
|
||||||
float viewInitialY, float dx, float dy) {
|
float viewInitialY, float dx, float dy) {
|
||||||
// If we're expanding or collapsing, ignore all touch events.
|
// If we're expanding or collapsing, ignore all touch events.
|
||||||
if (mIsExpansionAnimating
|
if (mIsExpansionAnimating || mShowedUserEducationInTouchListenerActive) {
|
||||||
// Also ignore events if we shouldn't be draggable.
|
|
||||||
|| (mPositioner.showingInTaskbar() && !mIsExpanded)
|
|
||||||
|| mShowedUserEducationInTouchListenerActive) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -661,7 +653,7 @@ public class BubbleStackView extends FrameLayout
|
|||||||
// bubble since it's stuck to the target.
|
// bubble since it's stuck to the target.
|
||||||
if (!passEventToMagnetizedObject(ev)) {
|
if (!passEventToMagnetizedObject(ev)) {
|
||||||
updateBubbleShadows(true /* showForAllBubbles */);
|
updateBubbleShadows(true /* showForAllBubbles */);
|
||||||
if (mBubbleData.isExpanded() || mPositioner.showingInTaskbar()) {
|
if (mBubbleData.isExpanded()) {
|
||||||
mExpandedAnimationController.dragBubbleOut(
|
mExpandedAnimationController.dragBubbleOut(
|
||||||
v, viewInitialX + dx, viewInitialY + dy);
|
v, viewInitialX + dx, viewInitialY + dy);
|
||||||
} else {
|
} else {
|
||||||
@@ -678,9 +670,7 @@ public class BubbleStackView extends FrameLayout
|
|||||||
public void onUp(@NonNull View v, @NonNull MotionEvent ev, float viewInitialX,
|
public void onUp(@NonNull View v, @NonNull MotionEvent ev, float viewInitialX,
|
||||||
float viewInitialY, float dx, float dy, float velX, float velY) {
|
float viewInitialY, float dx, float dy, float velX, float velY) {
|
||||||
// If we're expanding or collapsing, ignore all touch events.
|
// If we're expanding or collapsing, ignore all touch events.
|
||||||
if (mIsExpansionAnimating
|
if (mIsExpansionAnimating) {
|
||||||
// Also ignore events if we shouldn't be draggable.
|
|
||||||
|| (mPositioner.showingInTaskbar() && !mIsExpanded)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (mShowedUserEducationInTouchListenerActive) {
|
if (mShowedUserEducationInTouchListenerActive) {
|
||||||
@@ -696,6 +686,8 @@ public class BubbleStackView extends FrameLayout
|
|||||||
|
|
||||||
// Re-show the expanded view if we hid it.
|
// Re-show the expanded view if we hid it.
|
||||||
showExpandedViewIfNeeded();
|
showExpandedViewIfNeeded();
|
||||||
|
} else if (mPositioner.showingInTaskbar()) {
|
||||||
|
mStackAnimationController.snapStackBack();
|
||||||
} else {
|
} else {
|
||||||
// Fling the stack to the edge, and save whether or not it's going to end up on
|
// Fling the stack to the edge, and save whether or not it's going to end up on
|
||||||
// the left side of the screen.
|
// the left side of the screen.
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import static java.lang.annotation.RetentionPolicy.SOURCE;
|
|||||||
|
|
||||||
import android.app.NotificationChannel;
|
import android.app.NotificationChannel;
|
||||||
import android.content.pm.UserInfo;
|
import android.content.pm.UserInfo;
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.service.notification.NotificationListenerService;
|
import android.service.notification.NotificationListenerService;
|
||||||
import android.service.notification.NotificationListenerService.RankingMap;
|
import android.service.notification.NotificationListenerService.RankingMap;
|
||||||
@@ -114,9 +113,6 @@ public interface Bubbles {
|
|||||||
@Nullable
|
@Nullable
|
||||||
Bubble getBubbleWithShortcutId(String shortcutId);
|
Bubble getBubbleWithShortcutId(String shortcutId);
|
||||||
|
|
||||||
/** Called for any taskbar changes. */
|
|
||||||
void onTaskbarChanged(Bundle b);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* We intercept notification entries (including group summaries) dismissed by the user when
|
* We intercept notification entries (including group summaries) dismissed by the user when
|
||||||
* there is an active bubble associated with it. We do this so that developers can still
|
* there is an active bubble associated with it. We do this so that developers can still
|
||||||
|
|||||||
@@ -416,6 +416,17 @@ public class StackAnimationController extends
|
|||||||
return destinationRelativeX;
|
return destinationRelativeX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Snaps the stack back to the previous resting position.
|
||||||
|
*/
|
||||||
|
public void snapStackBack() {
|
||||||
|
if (mLayout == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PointF p = getStackPositionAlongNearestHorizontalEdge();
|
||||||
|
springStackAfterFling(p.x, p.y);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Where the stack would be if it were snapped to the nearest horizontal edge (left or right).
|
* Where the stack would be if it were snapped to the nearest horizontal edge (left or right).
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user