Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 67d56654 authored by Jason Chang's avatar Jason Chang
Browse files

Fix one-handed-tutorial-overlay connection is permanently present

Ensure Tutorial window only exising when OHM enabled & triggered.

Bug: 172670809

Test: manual
Test: atest WMShellUnitTests
Change-Id: I8cb848a4da09a1c6676db4f7e6da2da580c8c986
parent 0f3b7c08
Loading
Loading
Loading
Loading
+47 −23
Original line number Diff line number Diff line
@@ -63,6 +63,16 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
    private String mStartOneHandedDescription;
    private String mStopOneHandedDescription;

    private enum ONE_HANDED_TRIGGER_STATE {
        UNSET, ENTERING, EXITING
    }
    /**
     * Current One-Handed trigger state.
     * Note: This is a dynamic state, whenever last state has been confirmed
     * (i.e. onStartFinished() or onStopFinished()), the state should be set "UNSET" at final.
     */
    private ONE_HANDED_TRIGGER_STATE mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET;

    /**
     * Container of the tutorial panel showing at outside region when one handed starting
     */
@@ -74,6 +84,21 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
        public void onTutorialAnimationUpdate(int offset) {
            mUpdateHandler.post(() -> onAnimationUpdate(offset));
        }

        @Override
        public void onOneHandedAnimationStart(
                OneHandedAnimationController.OneHandedTransitionAnimator animator) {
            mUpdateHandler.post(() -> {
                final Rect startValue = (Rect) animator.getStartValue();
                if (mTriggerState == ONE_HANDED_TRIGGER_STATE.UNSET) {
                    mTriggerState = (startValue.top == 0)
                            ? ONE_HANDED_TRIGGER_STATE.ENTERING : ONE_HANDED_TRIGGER_STATE.EXITING;
                    if (mCanShowTutorial && mTriggerState == ONE_HANDED_TRIGGER_STATE.ENTERING) {
                        createTutorialTarget();
                    }
                }
            });
        }
    };

    public OneHandedTutorialHandler(Context context) {
@@ -100,9 +125,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
                R.string.accessibility_action_start_one_handed);
        mStopOneHandedDescription = context.getResources().getString(
                R.string.accessibility_action_stop_one_handed);
        if (mCanShowTutorial) {
            createOrUpdateTutorialTarget();
        }
    }

    @Override
@@ -111,6 +133,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
            updateFinished(View.VISIBLE, 0f);
            updateTutorialCount();
            announcementForScreenReader(true);
            mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET;
        });
    }

@@ -119,6 +142,8 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
        mUpdateHandler.post(() -> {
            updateFinished(View.INVISIBLE, -mTargetViewContainer.getHeight());
            announcementForScreenReader(false);
            removeTutorialFromWindowManager();
            mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET;
        });
    }

@@ -126,7 +151,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
        if (!canShowTutorial()) {
            return;
        }

        mTargetViewContainer.setVisibility(visible);
        mTargetViewContainer.setTranslationY(finalPosition);
    }
@@ -155,11 +179,8 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
     * Adds the tutorial target view to the WindowManager and update its layout, so it's ready
     * to be animated in.
     */
    private void createOrUpdateTutorialTarget() {
        mUpdateHandler.post(() -> {
    private void createTutorialTarget() {
        if (!mTargetViewContainer.isAttachedToWindow()) {
                mTargetViewContainer.setVisibility(View.INVISIBLE);

            try {
                mWindowManager.addView(mTargetViewContainer, getTutorialTargetLayoutParams());
            } catch (IllegalStateException e) {
@@ -168,11 +189,13 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
                mWindowManager.updateViewLayout(
                        mTargetViewContainer, getTutorialTargetLayoutParams());
            }
            } else {
                mWindowManager.updateViewLayout(mTargetViewContainer,
                        getTutorialTargetLayoutParams());
        }
        });
    }

    private void removeTutorialFromWindowManager() {
        if (mTargetViewContainer.isAttachedToWindow()) {
            mWindowManager.removeViewImmediate(mTargetViewContainer);
        }
    }

    OneHandedAnimationCallback getAnimationCallback() {
@@ -193,7 +216,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
        lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
        lp.setFitInsetsTypes(0 /* types */);
        lp.setTitle("one-handed-tutorial-overlay");

        return lp;
    }

@@ -206,10 +228,12 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {

    private boolean canShowTutorial() {
        if (!mCanShowTutorial) {
            // Since canSHowTutorial() will be called in onAnimationUpdate() and we still need to
            // hide Tutorial text in the period of continuously onAnimationUpdate() API call,
            // so we have to hide mTargetViewContainer here.
            mTargetViewContainer.setVisibility(View.GONE);
            return false;
        }

        return true;
    }