am 43c6a98f: am 6985badc: Fix black ActivityView
* commit '43c6a98f0ffe079429735a485acaa81841740fac':
Fix black ActivityView
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index f6c4c8e..edf21dd 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -83,7 +83,7 @@
ActivityManagerNative.getDefault().createActivityContainer(
mActivity.getActivityToken(), new ActivityContainerCallback(this)));
} catch (RemoteException e) {
- throw new IllegalStateException("ActivityView: Unable to create ActivityContainer. "
+ throw new RuntimeException("ActivityView: Unable to create ActivityContainer. "
+ e);
}
@@ -122,6 +122,18 @@
return super.onGenericMotionEvent(event);
}
+ @Override
+ public void onAttachedToWindow() {
+ if (DEBUG) Log.v(TAG, "onAttachedToWindow(): mActivityContainer=" + mActivityContainer +
+ " mSurface=" + mSurface);
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ if (DEBUG) Log.v(TAG, "onDetachedFromWindow(): mActivityContainer=" + mActivityContainer +
+ " mSurface=" + mSurface);
+ }
+
public boolean isAttachedToDisplay() {
return mSurface != null;
}
@@ -171,7 +183,8 @@
}
public void release() {
- if (DEBUG) Log.v(TAG, "release()");
+ if (DEBUG) Log.v(TAG, "release() mActivityContainer=" + mActivityContainer +
+ " mSurface=" + mSurface);
if (mActivityContainer == null) {
Log.e(TAG, "Duplicate call to release");
return;
@@ -200,14 +213,13 @@
} catch (RemoteException e) {
mSurface.release();
mSurface = null;
- throw new RuntimeException(
- "ActivityView: Unable to create ActivityContainer. " + e);
+ throw new RuntimeException("ActivityView: Unable to create ActivityContainer. " + e);
}
if (DEBUG) Log.v(TAG, "attachToSurfaceWhenReady: " + (mQueuedIntent != null ||
mQueuedPendingIntent != null ? "" : "no") + " queued intent");
if (mQueuedIntent != null) {
- startActivity(mQueuedIntent);
+ mActivityContainer.startActivity(mQueuedIntent);
mQueuedIntent = null;
} else if (mQueuedPendingIntent != null) {
mActivityContainer.startActivityIntentSender(mQueuedPendingIntent);
@@ -301,7 +313,7 @@
try {
return mIActivityContainer.startActivity(intent);
} catch (RemoteException e) {
- throw new IllegalStateException("ActivityView: Unable to startActivity. " + e);
+ throw new RuntimeException("ActivityView: Unable to startActivity. " + e);
}
}
@@ -309,7 +321,7 @@
try {
return mIActivityContainer.startActivityIntentSender(intentSender);
} catch (RemoteException e) {
- throw new IllegalStateException(
+ throw new RuntimeException(
"ActivityView: Unable to startActivity from IntentSender. " + e);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index e586ec3..0acde09 100755
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1272,6 +1272,7 @@
* occurred and the activity will be notified immediately.
*/
void notifyActivityDrawnLocked(ActivityRecord r) {
+ mActivityContainer.setDrawn();
if ((r == null)
|| (mUndrawnActivitiesBelowTopTranslucent.remove(r) &&
mUndrawnActivitiesBelowTopTranslucent.isEmpty())) {
@@ -1339,7 +1340,7 @@
ActivityRecord parent = mActivityContainer.mParentActivity;
if ((parent != null && parent.state != ActivityState.RESUMED) ||
- mActivityContainer.mContainerState != CONTAINER_STATE_HAS_SURFACE) {
+ !mActivityContainer.isAttached()) {
// Do not resume this stack if its parent is not resumed.
// TODO: If in a loop, make sure that parent stack resumeTopActivity is called 1st.
return false;
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index fa8e5c9..111f010 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -3143,6 +3143,7 @@
}
}
+ // TODO: Make sure every change to ActivityRecord.visible results in a call to this.
void setVisible(boolean visible) {
if (mVisible != visible) {
mVisible = visible;
@@ -3153,6 +3154,9 @@
}
}
+ void setDrawn() {
+ }
+
@Override
public String toString() {
return mIdString + (mActivityDisplay == null ? "N" : "A");
@@ -3161,6 +3165,7 @@
private class VirtualActivityContainer extends ActivityContainer {
Surface mSurface;
+ boolean mDrawn = false;
VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) {
super(getNextStackId());
@@ -3192,7 +3197,7 @@
(VirtualActivityDisplay) mActivityDisplay;
if (virtualActivityDisplay == null) {
virtualActivityDisplay =
- new VirtualActivityDisplay(surface, width, height, density);
+ new VirtualActivityDisplay(width, height, density);
mActivityDisplay = virtualActivityDisplay;
mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay);
attachToDisplayLocked(virtualActivityDisplay);
@@ -3200,23 +3205,40 @@
if (mSurface != null) {
mSurface.release();
- mSurface = null;
}
+ mSurface = surface;
if (surface != null) {
- mContainerState = CONTAINER_STATE_HAS_SURFACE;
- mSurface = surface;
mStack.resumeTopActivityLocked(null);
} else {
mContainerState = CONTAINER_STATE_NO_SURFACE;
- if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
- mStack.startPausingLocked(false, true);
- }
+ ((VirtualActivityDisplay) mActivityDisplay).setSurface(null);
+// if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
+// mStack.startPausingLocked(false, true);
+// }
}
+
+ setSurfaceIfReady();
+
if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display="
+ virtualActivityDisplay);
+ }
- virtualActivityDisplay.setSurface(surface);
+ @Override
+ void setDrawn() {
+ synchronized (mService) {
+ mDrawn = true;
+ setSurfaceIfReady();
+ }
+ }
+
+ private void setSurfaceIfReady() {
+ if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReady: mDrawn=" + mDrawn +
+ " mContainerState=" + mContainerState + " mSurface=" + mSurface);
+ if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) {
+ ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface);
+ mContainerState = CONTAINER_STATE_HAS_SURFACE;
+ }
}
}
@@ -3272,10 +3294,10 @@
class VirtualActivityDisplay extends ActivityDisplay {
VirtualDisplay mVirtualDisplay;
- VirtualActivityDisplay(Surface surface, int width, int height, int density) {
+ VirtualActivityDisplay(int width, int height, int density) {
DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, VIRTUAL_DISPLAY_BASE_NAME,
- width, height, density, surface, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
+ width, height, density, null, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY);
init(mVirtualDisplay.getDisplay());