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

Commit dd9ce628 authored by Craig Mautner's avatar Craig Mautner Committed by Android (Google) Code Review
Browse files

Merge "Clean up activities and displays when done" into klp-modular-dev

parents 41c684a7 95da1087
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