Revert "Close ActivityView and ActivityContainer cleanly."

This reverts commit 4a9f129874.

Conflicts:
	services/core/java/com/android/server/am/ActivityStackSupervisor.java

Change-Id: Ic1f4df7f4cb644de7ddebcdc8ce632b46c5ba8f2
This commit is contained in:
Justin Koh
2014-06-13 09:55:09 -07:00
parent 374013f4db
commit dd5c947170
3 changed files with 41 additions and 88 deletions

View File

@@ -354,11 +354,9 @@ public class ActivityView extends ViewGroup {
private static class ActivityContainerWrapper { private static class ActivityContainerWrapper {
private final IActivityContainer mIActivityContainer; private final IActivityContainer mIActivityContainer;
private final CloseGuard mGuard = CloseGuard.get(); private final CloseGuard mGuard = CloseGuard.get();
boolean mOpened; // Protected by mGuard.
ActivityContainerWrapper(IActivityContainer container) { ActivityContainerWrapper(IActivityContainer container) {
mIActivityContainer = container; mIActivityContainer = container;
mOpened = true;
mGuard.open("release"); mGuard.open("release");
} }
@@ -426,16 +424,11 @@ public class ActivityView extends ViewGroup {
} }
void release() { void release() {
synchronized (mGuard) { if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: release called");
if (mOpened) { try {
if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: release called"); mIActivityContainer.release();
try { mGuard.close();
mIActivityContainer.release(); } catch (RemoteException e) {
mGuard.close();
} catch (RemoteException e) {
}
mOpened = false;
}
} }
} }

View File

@@ -32,11 +32,12 @@ import static com.android.server.am.ActivityManagerService.VALIDATE_TOKENS;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_ADD_REMOVE; import static com.android.server.am.ActivityStackSupervisor.DEBUG_ADD_REMOVE;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_APP; import static com.android.server.am.ActivityStackSupervisor.DEBUG_APP;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_CONTAINERS;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_SAVED_STATE; import static com.android.server.am.ActivityStackSupervisor.DEBUG_SAVED_STATE;
import static com.android.server.am.ActivityStackSupervisor.DEBUG_STATES; import static com.android.server.am.ActivityStackSupervisor.DEBUG_STATES;
import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID; import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
import static com.android.server.am.ActivityStackSupervisor.ActivityContainer.CONTAINER_STATE_HAS_SURFACE;
import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.BatteryStatsImpl;
import com.android.server.Watchdog; import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerService.ItemMatcher; import com.android.server.am.ActivityManagerService.ItemMatcher;
@@ -1274,7 +1275,7 @@ final class ActivityStack {
ActivityRecord parent = mActivityContainer.mParentActivity; ActivityRecord parent = mActivityContainer.mParentActivity;
if ((parent != null && parent.state != ActivityState.RESUMED) || if ((parent != null && parent.state != ActivityState.RESUMED) ||
!mActivityContainer.isAttachedLocked()) { !mActivityContainer.isAttached()) {
// Do not resume this stack if its parent is not resumed. // 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. // TODO: If in a loop, make sure that parent stack resumeTopActivity is called 1st.
return false; return false;
@@ -2538,14 +2539,11 @@ final class ActivityStack {
|| prevState == ActivityState.INITIALIZING) { || prevState == ActivityState.INITIALIZING) {
// If this activity is already stopped, we can just finish // If this activity is already stopped, we can just finish
// it right now. // it right now.
r.makeFinishing(); boolean activityRemoved = destroyActivityLocked(r, true,
boolean activityRemoved = destroyActivityLocked(r, true, oomAdj, "finish-imm"); oomAdj, "finish-imm");
if (activityRemoved) { if (activityRemoved) {
mStackSupervisor.resumeTopActivitiesLocked(); mStackSupervisor.resumeTopActivitiesLocked();
} }
if (DEBUG_CONTAINERS) Slog.d(TAG,
"destroyActivityLocked: finishCurrentActivityLocked r=" + r +
" destroy returned removed=" + activityRemoved);
return activityRemoved ? null : r; return activityRemoved ? null : r;
} }
@@ -2914,7 +2912,6 @@ final class ActivityStack {
if (r != null) { if (r != null) {
mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r); mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
} }
if (DEBUG_CONTAINERS) Slog.d(TAG, "activityDestroyedLocked: r=" + r);
if (isInStackLocked(token) != null) { if (isInStackLocked(token) != null) {
if (r.state == ActivityState.DESTROYING) { if (r.state == ActivityState.DESTROYING) {
@@ -3672,7 +3669,7 @@ final class ActivityStack {
mStacks.remove(this); mStacks.remove(this);
mStacks.add(0, this); mStacks.add(0, this);
} }
mActivityContainer.onTaskListEmptyLocked(); mActivityContainer.onTaskListEmpty();
} }
} }

View File

@@ -105,7 +105,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
static final boolean DEBUG_SAVED_STATE = DEBUG || false; static final boolean DEBUG_SAVED_STATE = DEBUG || false;
static final boolean DEBUG_STATES = DEBUG || false; static final boolean DEBUG_STATES = DEBUG || false;
static final boolean DEBUG_IDLE = DEBUG || false; static final boolean DEBUG_IDLE = DEBUG || false;
static final boolean DEBUG_CONTAINERS = DEBUG || false;
public static final int HOME_STACK_ID = 0; public static final int HOME_STACK_ID = 0;
@@ -128,7 +127,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7; static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7;
static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8; static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8;
static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 9; static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 9;
static final int CONTAINER_TASK_LIST_EMPTY_TIMEOUT = FIRST_SUPERVISOR_STACK_MSG + 10;
private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay"; private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay";
@@ -226,7 +224,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
// TODO: Add listener for removal of references. // TODO: Add listener for removal of references.
/** Mapping from (ActivityStack/TaskStack).mStackId to their current state */ /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>(); SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>();
/** Mapping from displayId to display current state */ /** Mapping from displayId to display current state */
private final SparseArray<ActivityDisplay> mActivityDisplays = private final SparseArray<ActivityDisplay> mActivityDisplays =
@@ -2163,10 +2161,8 @@ public final class ActivityStackSupervisor implements DisplayListener {
ActivityContainer createActivityContainer(ActivityRecord parentActivity, ActivityContainer createActivityContainer(ActivityRecord parentActivity,
IActivityContainerCallback callback) { IActivityContainerCallback callback) {
ActivityContainer activityContainer = ActivityContainer activityContainer = new VirtualActivityContainer(parentActivity, callback);
new VirtualActivityContainer(parentActivity, callback);
mActivityContainers.put(activityContainer.mStackId, activityContainer); mActivityContainers.put(activityContainer.mStackId, activityContainer);
if (DEBUG_CONTAINERS) Slog.d(TAG, "createActivityContainer: " + activityContainer);
parentActivity.mChildContainers.add(activityContainer); parentActivity.mChildContainers.add(activityContainer);
return activityContainer; return activityContainer;
} }
@@ -2175,8 +2171,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers; final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers;
for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) { for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) {
ActivityContainer container = childStacks.remove(containerNdx); ActivityContainer container = childStacks.remove(containerNdx);
if (DEBUG_CONTAINERS) Slog.d(TAG, "removeChildActivityContainers: removing " +
container);
container.release(); container.release();
} }
} }
@@ -2184,8 +2178,11 @@ public final class ActivityStackSupervisor implements DisplayListener {
void deleteActivityContainer(IActivityContainer container) { void deleteActivityContainer(IActivityContainer container) {
ActivityContainer activityContainer = (ActivityContainer)container; ActivityContainer activityContainer = (ActivityContainer)container;
if (activityContainer != null) { if (activityContainer != null) {
if (DEBUG_CONTAINERS) Slog.d(TAG, "deleteActivityContainer: ", activityContainer.mStack.finishAllActivitiesLocked();
new RuntimeException("here").fillInStackTrace()); final ActivityRecord parent = activityContainer.mParentActivity;
if (parent != null) {
parent.mChildContainers.remove(activityContainer);
}
final int stackId = activityContainer.mStackId; final int stackId = activityContainer.mStackId;
mActivityContainers.remove(stackId); mActivityContainers.remove(stackId);
mWindowManager.removeStack(stackId); mWindowManager.removeStack(stackId);
@@ -2768,19 +2765,16 @@ public final class ActivityStackSupervisor implements DisplayListener {
@Override @Override
public void onDisplayAdded(int displayId) { public void onDisplayAdded(int displayId) {
Slog.v(TAG, "Display added displayId=" + displayId);
mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0)); mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0));
} }
@Override @Override
public void onDisplayRemoved(int displayId) { public void onDisplayRemoved(int displayId) {
Slog.v(TAG, "Display removed displayId=" + displayId);
mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0)); mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0));
} }
@Override @Override
public void onDisplayChanged(int displayId) { public void onDisplayChanged(int displayId) {
Slog.v(TAG, "Display changed displayId=" + displayId);
mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0)); mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0));
} }
@@ -2956,13 +2950,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
} }
} }
} break; } break;
case CONTAINER_TASK_LIST_EMPTY_TIMEOUT: {
synchronized (mService) {
Slog.w(TAG, "Timeout waiting for all activities in task to finish. " +
msg.obj);
((ActivityContainer) msg.obj).onTaskListEmptyLocked();
}
} break;
} }
} }
} }
@@ -3019,10 +3006,8 @@ public final class ActivityStackSupervisor implements DisplayListener {
@Override @Override
public int getDisplayId() { public int getDisplayId() {
synchronized (mService) { if (mActivityDisplay != null) {
if (mActivityDisplay != null) { return mActivityDisplay.mDisplayId;
return mActivityDisplay.mDisplayId;
}
} }
return -1; return -1;
} }
@@ -3031,12 +3016,10 @@ public final class ActivityStackSupervisor implements DisplayListener {
public boolean injectEvent(InputEvent event) { public boolean injectEvent(InputEvent event) {
final long origId = Binder.clearCallingIdentity(); final long origId = Binder.clearCallingIdentity();
try { try {
synchronized (mService) { if (mActivityDisplay != null) {
if (mActivityDisplay != null) { return mInputManagerInternal.injectInputEvent(event,
return mInputManagerInternal.injectInputEvent(event, mActivityDisplay.mDisplayId,
mActivityDisplay.mDisplayId, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
}
} }
return false; return false;
} finally { } finally {
@@ -3046,23 +3029,10 @@ public final class ActivityStackSupervisor implements DisplayListener {
@Override @Override
public void release() { public void release() {
synchronized (mService) { mContainerState = CONTAINER_STATE_FINISHING;
if (mContainerState == CONTAINER_STATE_FINISHING) { mStack.finishAllActivitiesLocked();
return; detachLocked();
} mWindowManager.removeStack(mStackId);
mContainerState = CONTAINER_STATE_FINISHING;
final Message msg =
mHandler.obtainMessage(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this);
mHandler.sendMessageDelayed(msg, 1000);
long origId = Binder.clearCallingIdentity();
try {
mStack.finishAllActivitiesLocked();
} finally {
Binder.restoreCallingIdentity(origId);
}
}
} }
private void detachLocked() { private void detachLocked() {
@@ -3153,17 +3123,15 @@ public final class ActivityStackSupervisor implements DisplayListener {
return ActivityStackSupervisor.this; return ActivityStackSupervisor.this;
} }
boolean isAttachedLocked() { boolean isAttached() {
return mActivityDisplay != null; return mActivityDisplay != null;
} }
void getBounds(Point outBounds) { void getBounds(Point outBounds) {
synchronized (mService) { if (mActivityDisplay != null) {
if (mActivityDisplay != null) { mActivityDisplay.getBounds(outBounds);
mActivityDisplay.getBounds(outBounds); } else {
} else { outBounds.set(0, 0);
outBounds.set(0, 0);
}
} }
} }
@@ -3186,12 +3154,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
return true; return true;
} }
void onTaskListEmptyLocked() { void onTaskListEmpty() {
mHandler.removeMessages(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this);
if (!mStack.isHomeStack()) {
detachLocked();
deleteActivityContainer(this);
}
mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget(); mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget();
} }
@@ -3210,7 +3173,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
mParentActivity = parent; mParentActivity = parent;
mCallback = callback; mCallback = callback;
mContainerState = CONTAINER_STATE_NO_SURFACE; mContainerState = CONTAINER_STATE_NO_SURFACE;
mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}"; mIdString = "VirtualActivtyContainer{" + mStackId + ", parent=" + mParentActivity + "}";
} }
@Override @Override
@@ -3256,22 +3219,22 @@ public final class ActivityStackSupervisor implements DisplayListener {
} }
} }
setSurfaceIfReadyLocked(); setSurfaceIfReady();
if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display=" if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display="
+ virtualActivityDisplay); + virtualActivityDisplay);
} }
@Override @Override
boolean isAttachedLocked() { boolean isAttached() {
return mSurface != null && super.isAttachedLocked(); return mSurface != null && super.isAttached();
} }
@Override @Override
void setDrawn() { void setDrawn() {
synchronized (mService) { synchronized (mService) {
mDrawn = true; mDrawn = true;
setSurfaceIfReadyLocked(); setSurfaceIfReady();
} }
} }
@@ -3281,8 +3244,8 @@ public final class ActivityStackSupervisor implements DisplayListener {
return false; return false;
} }
private void setSurfaceIfReadyLocked() { private void setSurfaceIfReady() {
if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn + if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReady: mDrawn=" + mDrawn +
" mContainerState=" + mContainerState + " mSurface=" + mSurface); " mContainerState=" + mContainerState + " mSurface=" + mSurface);
if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) { if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) {
((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface); ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface);