Merge "Fix overflow not receiving onBackPress events" into sc-dev

This commit is contained in:
Mady Mellor
2021-05-22 01:05:06 +00:00
committed by Android (Google) Code Review
3 changed files with 43 additions and 12 deletions

View File

@@ -613,6 +613,18 @@ public class BubbleController {
}
}
/** For the overflow to be focusable & receive key events the flags must be update. **/
void updateWindowFlagsForOverflow(boolean showingOverflow) {
if (mStackView != null && mAddedToWindowManager) {
mWmLayoutParams.flags = showingOverflow
? 0
: WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
mWmLayoutParams.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
mWindowManager.updateViewLayout(mStackView, mWmLayoutParams);
}
}
/** Removes the BubbleStackView from the WindowManager if it's there. */
private void removeFromWindowManagerMaybe() {
if (!mAddedToWindowManager) {

View File

@@ -28,6 +28,7 @@ import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -62,6 +63,15 @@ public class BubbleOverflowContainerView extends LinearLayout {
private RecyclerView mRecyclerView;
private List<Bubble> mOverflowBubbles = new ArrayList<>();
private View.OnKeyListener mKeyListener = (view, i, keyEvent) -> {
if (keyEvent.getAction() == KeyEvent.ACTION_UP
&& keyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK) {
mController.collapseStack();
return true;
}
return false;
};
private class OverflowGridLayoutManager extends GridLayoutManager {
OverflowGridLayoutManager(Context context, int columns) {
super(context, columns);
@@ -104,6 +114,7 @@ public class BubbleOverflowContainerView extends LinearLayout {
public BubbleOverflowContainerView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
setFocusableInTouchMode(true);
}
public void setBubbleController(BubbleController controller) {
@@ -111,14 +122,10 @@ public class BubbleOverflowContainerView extends LinearLayout {
}
public void show() {
setVisibility(View.VISIBLE);
requestFocus();
updateOverflow();
}
public void hide() {
setVisibility(View.INVISIBLE);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
@@ -130,6 +137,25 @@ public class BubbleOverflowContainerView extends LinearLayout {
mEmptyStateImage = findViewById(R.id.bubble_overflow_empty_state_image);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (mController != null) {
// For the overflow to get key events (e.g. back press) we need to adjust the flags
mController.updateWindowFlagsForOverflow(true);
}
setOnKeyListener(mKeyListener);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mController != null) {
mController.updateWindowFlagsForOverflow(false);
}
setOnKeyListener(null);
}
void updateOverflow() {
Resources res = getResources();
final int columns = res.getInteger(R.integer.bubbles_overflow_columns);

View File

@@ -2167,13 +2167,6 @@ public class BubbleStackView extends FrameLayout
}
}
/**
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() != MotionEvent.ACTION_DOWN && ev.getActionIndex() != mPointerIndexDown) {