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

Commit d13a5583 authored by Craig Mautner's avatar Craig Mautner
Browse files

Pause and resume ActivityView when visibility changes

Once a Surface has been established the activity in an ActivityView
must be paused and resumed as the view goes in and out of visibility
= View.GONE.

Fixes bug 14034658.

Change-Id: Icab43678053c225db70f051dceacd4d024df2153
parent 1edfd835
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.view.MotionEvent;
import android.view.Surface;
import android.view.TextureView;
import android.view.TextureView.SurfaceTextureListener;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import dalvik.system.CloseGuard;
@@ -51,6 +52,7 @@ public class ActivityView extends ViewGroup {
    private int mWidth;
    private int mHeight;
    private Surface mSurface;
    private int mLastVisibility;

    // Only one IIntentSender or Intent may be queued at a time. Most recent one wins.
    IIntentSender mQueuedPendingIntent;
@@ -95,6 +97,8 @@ public class ActivityView extends ViewGroup {
        mMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(mMetrics);

        mLastVisibility = getVisibility();

        if (DEBUG) Log.v(TAG, "ctor()");
    }

@@ -103,6 +107,26 @@ public class ActivityView extends ViewGroup {
        mTextureView.layout(0, 0, r - l, b - t);
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);

        if (mSurface != null) {
            try {
                if (visibility == View.GONE) {
                    mActivityContainer.setSurface(null, mWidth, mHeight, mMetrics.densityDpi);
                } else if (mLastVisibility == View.GONE) {
                    // Don't change surface when going between View.VISIBLE and View.INVISIBLE.
                    mActivityContainer.setSurface(mSurface, mWidth, mHeight, mMetrics.densityDpi);
                }
            } catch (RemoteException e) {
                throw new RuntimeException(
                        "ActivityView: Unable to set surface of ActivityContainer. " + e);
            }
        }
        mLastVisibility = visibility;
    }

    private boolean injectInputEvent(InputEvent event) {
        return mActivityContainer != null && mActivityContainer.injectEvent(event);
    }
+8 −3
Original line number Diff line number Diff line
@@ -3187,9 +3187,9 @@ public final class ActivityStackSupervisor implements DisplayListener {
            } else {
                mContainerState = CONTAINER_STATE_NO_SURFACE;
                ((VirtualActivityDisplay) mActivityDisplay).setSurface(null);
//                if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
//                    mStack.startPausingLocked(false, true);
//                }
                if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
                    mStack.startPausingLocked(false, true);
                }
            }

            setSurfaceIfReady();
@@ -3198,6 +3198,11 @@ public final class ActivityStackSupervisor implements DisplayListener {
                    + virtualActivityDisplay);
        }

        @Override
        boolean isAttached() {
            return mSurface != null && super.isAttached();
        }

        @Override
        void setDrawn() {
            synchronized (mService) {