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

Commit cfe4b593 authored by Robert Shih's avatar Robert Shih
Browse files

MediaController does not check for cancelled motions in onTouchEvent, causing

nested invocations of WindowManagerGlobal.addView. Sample stack trace below.

android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:228)
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
android.widget.MediaController.show(MediaController.java:346)
android.widget.MediaController.onTouchEvent(MediaController.java:445)
android.view.View.dispatchTouchEvent(View.java:7690)
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2184)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2186)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2186)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2186)
android.view.ViewGroup.cancelAndClearTouchTargets(ViewGroup.java:2049)
android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2567)
android.view.ViewRootImpl.dispatchDetachedFromWindow(ViewRootImpl.java:2836)
android.view.ViewRootImpl.doDie(ViewRootImpl.java:5259)
android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:233)
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
android.widget.MediaController.show(MediaController.java:346)

Duplicated views are consequently added to WindowManagerGlobal.mViews.
Subsequent calls to WindowManagerGlobal.removeView does not remove the
duplicated entry. Another subsequent call to WindowManagerGlobal.addView
detects the extra entry and fails.

Bug: 11399773
Change-Id: I1e07fcaf341fbae1b0f93bed0f42645801b9df2d
parent 431b4359
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -442,7 +442,19 @@ public class MediaController extends FrameLayout {

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        show(sDefaultTimeout);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                show(0); // show until hide is called
                break;
            case MotionEvent.ACTION_UP:
                show(sDefaultTimeout); // start timeout
                break;
            case MotionEvent.ACTION_CANCEL:
                hide();
                break;
            default:
                break;
        }
        return true;
    }