Merge "Pause and resume ActivityView when visibility changes" into klp-modular-dev

This commit is contained in:
Craig Mautner
2014-05-05 20:58:15 +00:00
committed by Android (Google) Code Review
2 changed files with 32 additions and 3 deletions

View File

@@ -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);
}

View File

@@ -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) {