Add predictive back animation for 3-button-nav

Bug: 373544911
Flag: com.android.window.flags.predictive_back_three_button_nav
Test: OverviewProxyServiceTest
Test: TaskbarNavButtonControllerTest
Test: TaskbarScrimViewControllerTest
Change-Id: I04cadc660f38e2d4541b06fcda950098a0768492
This commit is contained in:
Johannes Gallmann
2024-10-29 18:28:18 +01:00
parent 127eb0b44d
commit bc4936fb6b
6 changed files with 60 additions and 16 deletions
@@ -49,6 +49,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_Q
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SHORTCUT_HELPER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING;
import static com.android.window.flags.Flags.predictiveBackThreeButtonNav;
import static com.android.wm.shell.Flags.enableBubbleBarInPersistentTaskBar;
import android.animation.Animator;
@@ -71,8 +72,10 @@ import android.graphics.drawable.PaintDrawable;
import android.graphics.drawable.RotateDrawable;
import android.inputmethodservice.InputMethodService;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Property;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
@@ -843,12 +846,43 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
buttonView.setImageResource(drawableId);
buttonView.setContentDescription(parent.getContext().getString(
navButtonController.getButtonContentDescription(buttonType)));
buttonView.setOnClickListener(view -> navButtonController.onButtonClick(buttonType, view));
buttonView.setOnLongClickListener(view ->
navButtonController.onButtonLongClick(buttonType, view));
if (predictiveBackThreeButtonNav() && buttonType == BUTTON_BACK) {
// set up special touch listener for back button to support predictive back
setBackButtonTouchListener(buttonView, navButtonController);
} else {
buttonView.setOnClickListener(view ->
navButtonController.onButtonClick(buttonType, view));
buttonView.setOnLongClickListener(view ->
navButtonController.onButtonLongClick(buttonType, view));
}
return buttonView;
}
private void setBackButtonTouchListener(View buttonView,
TaskbarNavButtonController navButtonController) {
buttonView.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_MOVE) return false;
long time = SystemClock.uptimeMillis();
int action = event.getAction();
KeyEvent keyEvent = new KeyEvent(time, time,
action == MotionEvent.ACTION_DOWN ? KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP,
KeyEvent.KEYCODE_BACK, 0);
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
keyEvent.cancel();
}
navButtonController.executeBack(keyEvent);
if (action == MotionEvent.ACTION_UP) {
buttonView.performClick();
}
return false;
});
buttonView.setOnLongClickListener((view) -> {
navButtonController.onButtonLongClick(BUTTON_BACK, view);
return false;
});
}
private ImageView addButton(ViewGroup parent, @IdRes int id, @LayoutRes int layoutId) {
ImageView buttonView = (ImageView) mContext.getLayoutInflater()
.inflate(layoutId, parent, false);