diff options
| author | 2014-06-13 21:48:07 +0000 | |
|---|---|---|
| committer | 2014-06-13 21:09:46 +0000 | |
| commit | 677d4ae6eae38a110ed7d73cf6982c042d80c499 (patch) | |
| tree | 72bb34eaf3ce0d997324e705101c6a5c0e0fb4b3 | |
| parent | 0cb41fd5ad37a1a9aaedb737491fa71310ef2ddc (diff) | |
| parent | 220cad6d9743f134c0d44623fc56cd57467866e7 (diff) | |
Merge "Merge commit '0f3d3dd2'"
3 files changed, 40 insertions, 86 deletions
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index 94ea2c5b4d90..c29d75e516ef 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -354,11 +354,9 @@ public class ActivityView extends ViewGroup { private static class ActivityContainerWrapper { private final IActivityContainer mIActivityContainer; private final CloseGuard mGuard = CloseGuard.get(); - boolean mOpened; // Protected by mGuard. ActivityContainerWrapper(IActivityContainer container) { mIActivityContainer = container; - mOpened = true; mGuard.open("release"); } @@ -426,16 +424,11 @@ public class ActivityView extends ViewGroup { } void release() { - synchronized (mGuard) { - if (mOpened) { - if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: release called"); - try { - mIActivityContainer.release(); - mGuard.close(); - } catch (RemoteException e) { - } - mOpened = false; - } + if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: release called"); + try { + mIActivityContainer.release(); + mGuard.close(); + } catch (RemoteException e) { } } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 03ce5300e863..d7cf7b1251d3 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -32,11 +32,11 @@ 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_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_SCREENSHOTS; 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.ActivityContainer.CONTAINER_STATE_HAS_SURFACE; import com.android.internal.app.IVoiceInteractor; import com.android.internal.os.BatteryStatsImpl; @@ -1406,7 +1406,7 @@ final class ActivityStack { ActivityRecord parent = mActivityContainer.mParentActivity; if ((parent != null && parent.state != ActivityState.RESUMED) || - !mActivityContainer.isAttachedLocked()) { + !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; @@ -2678,14 +2678,11 @@ final class ActivityStack { || prevState == ActivityState.INITIALIZING) { // If this activity is already stopped, we can just finish // it right now. - r.makeFinishing(); - boolean activityRemoved = destroyActivityLocked(r, true, oomAdj, "finish-imm"); + boolean activityRemoved = destroyActivityLocked(r, true, + oomAdj, "finish-imm"); if (activityRemoved) { mStackSupervisor.resumeTopActivitiesLocked(); } - if (DEBUG_CONTAINERS) Slog.d(TAG, - "destroyActivityLocked: finishCurrentActivityLocked r=" + r + - " destroy returned removed=" + activityRemoved); return activityRemoved ? null : r; } @@ -3048,7 +3045,6 @@ final class ActivityStack { if (r != null) { mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r); } - if (DEBUG_CONTAINERS) Slog.d(TAG, "activityDestroyedLocked: r=" + r); if (isInStackLocked(token) != null) { if (r.state == ActivityState.DESTROYING) { @@ -3808,7 +3804,7 @@ final class ActivityStack { mStacks.remove(this); mStacks.add(0, this); } - mActivityContainer.onTaskListEmptyLocked(); + mActivityContainer.onTaskListEmpty(); } } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index d58b97cf9c96..c4cdbd74206d 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -241,7 +241,7 @@ public final class ActivityStackSupervisor implements DisplayListener { // TODO: Add listener for removal of references. /** 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 */ private final SparseArray<ActivityDisplay> mActivityDisplays = @@ -2257,10 +2257,8 @@ public final class ActivityStackSupervisor implements DisplayListener { ActivityContainer createActivityContainer(ActivityRecord parentActivity, IActivityContainerCallback callback) { - ActivityContainer activityContainer = - new VirtualActivityContainer(parentActivity, callback); + ActivityContainer activityContainer = new VirtualActivityContainer(parentActivity, callback); mActivityContainers.put(activityContainer.mStackId, activityContainer); - if (DEBUG_CONTAINERS) Slog.d(TAG, "createActivityContainer: " + activityContainer); parentActivity.mChildContainers.add(activityContainer); return activityContainer; } @@ -2269,8 +2267,6 @@ public final class ActivityStackSupervisor implements DisplayListener { final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers; for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) { ActivityContainer container = childStacks.remove(containerNdx); - if (DEBUG_CONTAINERS) Slog.d(TAG, "removeChildActivityContainers: removing " + - container); container.release(); } } @@ -2278,8 +2274,11 @@ public final class ActivityStackSupervisor implements DisplayListener { void deleteActivityContainer(IActivityContainer container) { ActivityContainer activityContainer = (ActivityContainer)container; if (activityContainer != null) { - if (DEBUG_CONTAINERS) Slog.d(TAG, "deleteActivityContainer: ", - new RuntimeException("here").fillInStackTrace()); + activityContainer.mStack.finishAllActivitiesLocked(); + final ActivityRecord parent = activityContainer.mParentActivity; + if (parent != null) { + parent.mChildContainers.remove(activityContainer); + } final int stackId = activityContainer.mStackId; mActivityContainers.remove(stackId); mWindowManager.removeStack(stackId); @@ -2888,19 +2887,16 @@ public final class ActivityStackSupervisor implements DisplayListener { @Override public void onDisplayAdded(int displayId) { - Slog.v(TAG, "Display added displayId=" + displayId); mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0)); } @Override public void onDisplayRemoved(int displayId) { - Slog.v(TAG, "Display removed displayId=" + displayId); mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0)); } @Override public void onDisplayChanged(int displayId) { - Slog.v(TAG, "Display changed displayId=" + displayId); mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0)); } @@ -3134,13 +3130,6 @@ public final class ActivityStackSupervisor implements DisplayListener { } } } 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; } } } @@ -3197,10 +3186,8 @@ public final class ActivityStackSupervisor implements DisplayListener { @Override public int getDisplayId() { - synchronized (mService) { - if (mActivityDisplay != null) { - return mActivityDisplay.mDisplayId; - } + if (mActivityDisplay != null) { + return mActivityDisplay.mDisplayId; } return -1; } @@ -3209,12 +3196,10 @@ public final class ActivityStackSupervisor implements DisplayListener { public boolean injectEvent(InputEvent event) { final long origId = Binder.clearCallingIdentity(); try { - synchronized (mService) { - if (mActivityDisplay != null) { - return mInputManagerInternal.injectInputEvent(event, - mActivityDisplay.mDisplayId, - InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); - } + if (mActivityDisplay != null) { + return mInputManagerInternal.injectInputEvent(event, + mActivityDisplay.mDisplayId, + InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); } return false; } finally { @@ -3224,23 +3209,10 @@ public final class ActivityStackSupervisor implements DisplayListener { @Override public void release() { - synchronized (mService) { - if (mContainerState == CONTAINER_STATE_FINISHING) { - return; - } - 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); - } - } + mContainerState = CONTAINER_STATE_FINISHING; + mStack.finishAllActivitiesLocked(); + detachLocked(); + mWindowManager.removeStack(mStackId); } private void detachLocked() { @@ -3331,17 +3303,15 @@ public final class ActivityStackSupervisor implements DisplayListener { return ActivityStackSupervisor.this; } - boolean isAttachedLocked() { + boolean isAttached() { return mActivityDisplay != null; } void getBounds(Point outBounds) { - synchronized (mService) { - if (mActivityDisplay != null) { - mActivityDisplay.getBounds(outBounds); - } else { - outBounds.set(0, 0); - } + if (mActivityDisplay != null) { + mActivityDisplay.getBounds(outBounds); + } else { + outBounds.set(0, 0); } } @@ -3364,12 +3334,7 @@ public final class ActivityStackSupervisor implements DisplayListener { return true; } - void onTaskListEmptyLocked() { - mHandler.removeMessages(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this); - if (!mStack.isHomeStack()) { - detachLocked(); - deleteActivityContainer(this); - } + void onTaskListEmpty() { mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget(); } @@ -3388,7 +3353,7 @@ public final class ActivityStackSupervisor implements DisplayListener { mParentActivity = parent; mCallback = callback; mContainerState = CONTAINER_STATE_NO_SURFACE; - mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}"; + mIdString = "VirtualActivtyContainer{" + mStackId + ", parent=" + mParentActivity + "}"; } @Override @@ -3434,22 +3399,22 @@ public final class ActivityStackSupervisor implements DisplayListener { } } - setSurfaceIfReadyLocked(); + setSurfaceIfReady(); if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display=" + virtualActivityDisplay); } @Override - boolean isAttachedLocked() { - return mSurface != null && super.isAttachedLocked(); + boolean isAttached() { + return mSurface != null && super.isAttached(); } @Override void setDrawn() { synchronized (mService) { mDrawn = true; - setSurfaceIfReadyLocked(); + setSurfaceIfReady(); } } @@ -3459,8 +3424,8 @@ public final class ActivityStackSupervisor implements DisplayListener { return false; } - private void setSurfaceIfReadyLocked() { - if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn + + 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); |