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

Commit 92c1571f authored by Jim Miller's avatar Jim Miller
Browse files

Fix 2584857: Reset grabbed state when SlidingTab visibility changes

This fixes a case where the widget is hidden while the grabbed
state is set. The result is that the host of the widget is never
informed that the grabbed state changed.

Change-Id: I78b41cff0e31e982a3b46f0319260ba59815092c
parent 11ec99c0
Loading
Loading
Loading
Loading
+29 −15
Original line number Diff line number Diff line
@@ -17,10 +17,8 @@
package com.android.internal.widget;

import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Vibrator;
@@ -38,6 +36,7 @@ import android.view.animation.Animation.AnimationListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ImageView.ScaleType;

import com.android.internal.R;

/**
@@ -69,21 +68,21 @@ public class SlidingTab extends ViewGroup {
    private int mGrabbedState = OnTriggerListener.NO_HANDLE;
    private boolean mTriggered = false;
    private Vibrator mVibrator;
    private float mDensity; // used to scale dimensions for bitmaps.
    private final float mDensity; // used to scale dimensions for bitmaps.

    /**
     * Either {@link #HORIZONTAL} or {@link #VERTICAL}.
     */
    private int mOrientation;
    private final int mOrientation;

    private Slider mLeftSlider;
    private Slider mRightSlider;
    private final Slider mLeftSlider;
    private final Slider mRightSlider;
    private Slider mCurrentSlider;
    private boolean mTracking;
    private float mThreshold;
    private Slider mOtherSlider;
    private boolean mAnimating;
    private Rect mTmpRect;
    private final Rect mTmpRect;

    /**
     * Listener used to reset the view when the current animation completes.
@@ -608,6 +607,15 @@ public class SlidingTab extends ViewGroup {

                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    cancelGrab();
                    break;
            }
        }

        return mTracking || super.onTouchEvent(event);
    }

    private void cancelGrab() {
        mTracking = false;
        mTriggered = false;
        mOtherSlider.show(true);
@@ -616,11 +624,6 @@ public class SlidingTab extends ViewGroup {
        mCurrentSlider = null;
        mOtherSlider = null;
        setGrabbedState(OnTriggerListener.NO_HANDLE);
                    break;
            }
        }

        return mTracking || super.onTouchEvent(event);
    }

    void startAnimating(final boolean holdAfter) {
@@ -832,6 +835,17 @@ public class SlidingTab extends ViewGroup {
        }
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        // When visibility changes and the user has a tab selected, unselect it and
        // make sure their callback gets called.
        if (changedView == this && visibility != VISIBLE
                && mGrabbedState != OnTriggerListener.NO_HANDLE) {
            cancelGrab();
        }
    }

    /**
     * Sets the current grabbed state, and dispatches a grabbed state change
     * event to our listener.