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

Commit 95da1087 authored by Craig Mautner's avatar Craig Mautner
Browse files

Clean up activities and displays when done

More maintenance fixes.

Fix bug 13157352.

Change-Id: Ic86d39a84452a1cf1dc1762cec517b419ad0a852
parent 12ff7391
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -2036,6 +2036,15 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            return true;
        }

        case DELETE_ACTIVITY_CONTAINER_TRANSACTION:  {
            data.enforceInterface(IActivityManager.descriptor);
            IActivityContainer activityContainer =
                    IActivityContainer.Stub.asInterface(data.readStrongBinder());
            deleteActivityContainer(activityContainer);
            reply.writeNoException();
            return true;
        }

        case GET_ACTIVITY_CONTAINER_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            IBinder activityToken = data.readStrongBinder();
@@ -4692,6 +4701,18 @@ class ActivityManagerProxy implements IActivityManager
        return res;
    }

    public void deleteActivityContainer(IActivityContainer activityContainer)
            throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeStrongBinder(activityContainer.asBinder());
        mRemote.transact(DELETE_ACTIVITY_CONTAINER_TRANSACTION, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
    }

    public IActivityContainer getEnclosingActivityContainer(IBinder activityToken)
            throws RemoteException {
        Parcel data = Parcel.obtain();
+5 −1
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;

/** @hide */
public class ActivityView extends ViewGroup {
    private final String TAG = "ActivityView";
    private final boolean DEBUG = false;
@@ -107,6 +108,10 @@ public class ActivityView extends ViewGroup {
        super.onDetachedFromWindow();
        if (mActivityContainer != null) {
            detach();
            try {
                ActivityManagerNative.getDefault().deleteActivityContainer(mActivityContainer);
            } catch (RemoteException e) {
            }
            mActivityContainer = null;
        }
    }
@@ -122,7 +127,6 @@ public class ActivityView extends ViewGroup {
            case  View.INVISIBLE:
                break;
            case View.GONE:
                detach();
                break;
        }
    }
+5 −0
Original line number Diff line number Diff line
@@ -407,9 +407,13 @@ public interface IActivityManager extends IInterface {

    public void performIdleMaintenance() throws RemoteException;

    /** @hide */
    public IActivityContainer createActivityContainer(IBinder parentActivityToken,
            IActivityContainerCallback callback) throws RemoteException;

    /** @hide */
    public void deleteActivityContainer(IActivityContainer container) throws RemoteException;

    public IActivityContainer getEnclosingActivityContainer(IBinder activityToken)
            throws RemoteException;

@@ -703,4 +707,5 @@ public interface IActivityManager extends IInterface {
    int APP_NOT_RESPONDING_VIA_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+182;
    int GET_HOME_ACTIVITY_TOKEN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+183;
    int GET_ACTIVITY_CONTAINER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+184;
    int DELETE_ACTIVITY_CONTAINER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+185;
}
+9 −0
Original line number Diff line number Diff line
@@ -7081,6 +7081,15 @@ public final class ActivityManagerService extends ActivityManagerNative
        }
    }
    @Override
    public void deleteActivityContainer(IActivityContainer container) throws RemoteException {
        enforceCallingPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS,
                "deleteActivityContainer()");
        synchronized (this) {
            mStackSupervisor.deleteActivityContainer(container);
        }
    }
    @Override
    public IActivityContainer getEnclosingActivityContainer(IBinder activityToken)
            throws RemoteException {
+17 −1
Original line number Diff line number Diff line
@@ -2179,13 +2179,28 @@ public final class ActivityStackSupervisor implements DisplayListener {
            ActivityRecord top = stack.topRunningNonDelayedActivityLocked(null);
            if (top != null) {
                // TODO: Make sure the next activity doesn't start up when top is destroyed.
                stack.destroyActivityLocked(top, true, true, "stack removal");
                stack.destroyActivityLocked(top, true, true, "stack parent destroyed");
            }
            mActivityContainers.removeAt(ndx);
            container.detachLocked();
        }
    }

    void deleteActivityContainer(IActivityContainer container) {
        ActivityContainer activityContainer = (ActivityContainer)container;
        if (activityContainer != null) {
            activityContainer.mStack.destroyActivitiesLocked(null, true,
                    "deleteActivityContainer");
            final ActivityRecord parent = activityContainer.mParentActivity;
            if (parent != null) {
                parent.mChildContainers.remove(activityContainer);
            }
            final int stackId = activityContainer.mStackId;
            mActivityContainers.remove(stackId);
            mWindowManager.removeStack(stackId);
        }
    }

    private int createStackOnDisplay(ActivityRecord parentActivity, int stackId, int displayId) {
        ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
        if (activityDisplay == null) {
@@ -2556,6 +2571,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
        pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout);
        pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId);
        pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
        pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers);
    }

    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
Loading