summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/NavigationEdgeBackPlugin.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java47
3 files changed, 55 insertions, 0 deletions
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/NavigationEdgeBackPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/NavigationEdgeBackPlugin.java
index bd86407222bc..12372593b62f 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/NavigationEdgeBackPlugin.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/NavigationEdgeBackPlugin.java
@@ -22,6 +22,8 @@ import android.view.WindowManager;
import com.android.systemui.plugins.annotations.ProvidesInterface;
+import java.io.PrintWriter;
+
/** Plugin to handle navigation edge gestures for Back. */
@ProvidesInterface(
action = NavigationEdgeBackPlugin.ACTION,
@@ -49,6 +51,9 @@ public interface NavigationEdgeBackPlugin extends Plugin {
/** Updates the UI based on the motion events passed in device coordinates. */
void onMotionEvent(MotionEvent motionEvent);
+ /** Dumps info about the back gesture plugin. */
+ void dump(PrintWriter pw);
+
/** Callback to let the system react to the detected back gestures. */
interface BackCallback {
/** Indicates that a Back gesture was recognized and the system should go back. */
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
index ff5d0b157c80..a695ae60706c 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
@@ -919,6 +919,9 @@ public class EdgeBackGestureHandler extends CurrentUserTracker
pw.println(" mGestureLogInsideInsets=" + String.join("\n", mGestureLogInsideInsets));
pw.println(" mGestureLogOutsideInsets=" + String.join("\n", mGestureLogOutsideInsets));
pw.println(" mEdgeBackPlugin=" + mEdgeBackPlugin);
+ if (mEdgeBackPlugin != null) {
+ mEdgeBackPlugin.dump(pw);
+ }
}
private boolean isGestureBlockingActivityRunning() {
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
index 9c82989531aa..7fdb79eae2a9 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
@@ -30,6 +30,7 @@ import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.Rect;
+import android.os.Handler;
import android.os.SystemClock;
import android.os.VibrationEffect;
import android.util.Log;
@@ -56,13 +57,18 @@ import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.NavigationEdgeBackPlugin;
import com.android.systemui.statusbar.VibratorHelper;
+import java.io.PrintWriter;
+
public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPlugin {
private static final String TAG = "NavigationBarEdgePanel";
+ private static final boolean ENABLE_FAILSAFE = true;
+
private static final long COLOR_ANIMATION_DURATION_MS = 120;
private static final long DISAPPEAR_FADE_ANIMATION_DURATION_MS = 80;
private static final long DISAPPEAR_ARROW_ANIMATION_DURATION_MS = 100;
+ private static final long FAILSAFE_DELAY_MS = 200;
/**
* The time required since the first vibration effect to automatically trigger a click
@@ -215,6 +221,9 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl
private long mVibrationTime;
private int mScreenSize;
+ private final Handler mHandler = new Handler();
+ private final Runnable mFailsafeRunnable = this::onFailsafe;
+
private DynamicAnimation.OnAnimationEndListener mSetGoneEndListener
= new DynamicAnimation.OnAnimationEndListener() {
@Override
@@ -364,6 +373,7 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl
@Override
public void onDestroy() {
+ cancelFailsafe();
mWindowManager.removeView(this);
mRegionSamplingHelper.stop();
mRegionSamplingHelper = null;
@@ -635,6 +645,8 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl
animate().alpha(0f).setDuration(DISAPPEAR_FADE_ANIMATION_DURATION_MS)
.withEndAction(() -> setVisibility(GONE));
mArrowDisappearAnimation.start();
+ // Schedule failsafe in case alpha end callback is not called
+ scheduleFailsafe();
};
if (mTranslationAnimation.isRunning()) {
mTranslationAnimation.addEndListener(new DynamicAnimation.OnAnimationEndListener() {
@@ -648,6 +660,8 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl
}
}
});
+ // Schedule failsafe in case mTranslationAnimation end callback is not called
+ scheduleFailsafe();
} else {
translationEnd.run();
}
@@ -658,6 +672,8 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl
if (mTranslationAnimation.isRunning()) {
mTranslationAnimation.addEndListener(mSetGoneEndListener);
+ // Schedule failsafe in case mTranslationAnimation end callback is not called
+ scheduleFailsafe();
} else {
setVisibility(GONE);
}
@@ -683,6 +699,7 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl
mTotalTouchDelta = 0;
mVibrationTime = 0;
setDesiredVerticalTransition(0, false /* animated */);
+ cancelFailsafe();
}
private void handleMoveEvent(MotionEvent event) {
@@ -867,7 +884,37 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl
invalidate();
}
+ private void scheduleFailsafe() {
+ if (!ENABLE_FAILSAFE) {
+ return;
+ }
+ cancelFailsafe();
+ mHandler.postDelayed(mFailsafeRunnable, FAILSAFE_DELAY_MS);
+ }
+
+ private void cancelFailsafe() {
+ mHandler.removeCallbacks(mFailsafeRunnable);
+ }
+
+ private void onFailsafe() {
+ setVisibility(GONE);
+ }
+
private float dp(float dp) {
return mDensity * dp;
}
+
+ @Override
+ public void dump(PrintWriter pw) {
+ pw.println("NavigationBarEdgePanel:");
+ pw.println(" mIsLeftPanel=" + mIsLeftPanel);
+ pw.println(" mTriggerBack=" + mTriggerBack);
+ pw.println(" mDragSlopPassed=" + mDragSlopPassed);
+ pw.println(" mCurrentAngle=" + mCurrentAngle);
+ pw.println(" mDesiredAngle=" + mDesiredAngle);
+ pw.println(" mCurrentTranslation=" + mCurrentTranslation);
+ pw.println(" mDesiredTranslation=" + mDesiredTranslation);
+ pw.println(" mTranslationAnimation running=" + mTranslationAnimation.isRunning());
+ mRegionSamplingHelper.dump(pw);
+ }
}