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

Commit 8f757990 authored by Eric Lin's avatar Eric Lin
Browse files

Remove ResumeActivityItem object pooling (5/n).

Remove the use of ObjectPool in the creation and management of
ResumeActivityItem object. Instead of being obtained from the pool,
these objects are now directly instantiated, simplifying their handling
and aligning with the broader removal of the object pooling mechanism.

Bug: 311089192
Test: atest FrameworksCoreTests:ActivityThreadTest
Test: atest FrameworksCoreTests:ObjectPoolTests
Test: atest FrameworksCoreTests:TransactionParcelTests
Test: atest WmTests:ActivityRefresherTests
Test: atest WmTests:CameraCompatFreeformPolicyTests
Test: atest WmTests:DisplayRotationCompatPolicyTests
Flag: EXEMPT removing com.android.window.flags.disable_object_pool
Change-Id: I959904ca72c70ba1c4b0b54ddb203ea99e971dde
parent d015121d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4623,7 +4623,7 @@ public final class ActivityThread extends ClientTransactionHandler

    private void scheduleResume(ActivityClientRecord r) {
        final ClientTransaction transaction = new ClientTransaction(mAppThread);
        final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(r.token,
        final ResumeActivityItem resumeActivityItem = new ResumeActivityItem(r.token,
                /* isForward */ false, /* shouldSendCompatFakeFocus */ false);
        transaction.addTransactionItem(resumeActivityItem);
        executeTransaction(transaction);
+25 −61
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityClient;
import android.app.ActivityManager;
import android.app.ActivityManager.ProcessState;
import android.app.ActivityThread.ActivityClientRecord;
import android.app.ClientTransactionHandler;
import android.os.IBinder;
@@ -30,22 +31,37 @@ import android.os.Trace;

/**
 * Request to move an activity to resumed state.
 *
 * @hide
 */
public class ResumeActivityItem extends ActivityLifecycleItem {

    private static final String TAG = "ResumeActivityItem";
    @ProcessState
    private final int mProcState;

    private final boolean mIsForward;

    private int mProcState;
    private boolean mUpdateProcState;
    private boolean mIsForward;
    // Whether we should send compat fake focus when the activity is resumed. This is needed
    // because some game engines wait to get focus before drawing the content of the app.
    private boolean mShouldSendCompatFakeFocus;
    private final boolean mShouldSendCompatFakeFocus;

    public ResumeActivityItem(@NonNull IBinder activityToken, boolean isForward,
            boolean shouldSendCompatFakeFocus) {
        this(activityToken, ActivityManager.PROCESS_STATE_UNKNOWN, isForward,
                shouldSendCompatFakeFocus);
    }

    public ResumeActivityItem(@NonNull IBinder activityToken, @ProcessState int procState,
            boolean isForward, boolean shouldSendCompatFakeFocus) {
        super(activityToken);
        mProcState = procState;
        mIsForward = isForward;
        mShouldSendCompatFakeFocus = shouldSendCompatFakeFocus;
    }

    @Override
    public void preExecute(@NonNull ClientTransactionHandler client) {
        if (mUpdateProcState) {
        if (mProcState != ActivityManager.PROCESS_STATE_UNKNOWN) {
            client.updateProcessState(mProcState, false);
        }
    }
@@ -72,71 +88,21 @@ public class ResumeActivityItem extends ActivityLifecycleItem {
        return ON_RESUME;
    }

    // ObjectPoolItem implementation

    private ResumeActivityItem() {}

    /** Obtain an instance initialized with provided params. */
    @NonNull
    public static ResumeActivityItem obtain(@NonNull IBinder activityToken, int procState,
            boolean isForward, boolean shouldSendCompatFakeFocus) {
        ResumeActivityItem instance = ObjectPool.obtain(ResumeActivityItem.class);
        if (instance == null) {
            instance = new ResumeActivityItem();
        }
        instance.setActivityToken(activityToken);
        instance.mProcState = procState;
        instance.mUpdateProcState = true;
        instance.mIsForward = isForward;
        instance.mShouldSendCompatFakeFocus = shouldSendCompatFakeFocus;

        return instance;
    }

    /** Obtain an instance initialized with provided params. */
    @NonNull
    public static ResumeActivityItem obtain(@NonNull IBinder activityToken, boolean isForward,
            boolean shouldSendCompatFakeFocus) {
        ResumeActivityItem instance = ObjectPool.obtain(ResumeActivityItem.class);
        if (instance == null) {
            instance = new ResumeActivityItem();
        }
        instance.setActivityToken(activityToken);
        instance.mProcState = ActivityManager.PROCESS_STATE_UNKNOWN;
        instance.mUpdateProcState = false;
        instance.mIsForward = isForward;
        instance.mShouldSendCompatFakeFocus = shouldSendCompatFakeFocus;

        return instance;
    }

    @Override
    public void recycle() {
        super.recycle();
        mProcState = ActivityManager.PROCESS_STATE_UNKNOWN;
        mUpdateProcState = false;
        mIsForward = false;
        mShouldSendCompatFakeFocus = false;
        ObjectPool.recycle(this);
    }

    // Parcelable implementation

    /** Write to Parcel. */
    /** Writes to Parcel. */
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeInt(mProcState);
        dest.writeBoolean(mUpdateProcState);
        dest.writeBoolean(mIsForward);
        dest.writeBoolean(mShouldSendCompatFakeFocus);
    }

    /** Read from Parcel. */
    /** Reads from Parcel. */
    private ResumeActivityItem(@NonNull Parcel in) {
        super(in);
        mProcState = in.readInt();
        mUpdateProcState = in.readBoolean();
        mIsForward = in.readBoolean();
        mShouldSendCompatFakeFocus = in.readBoolean();
    }
@@ -160,7 +126,7 @@ public class ResumeActivityItem extends ActivityLifecycleItem {
            return false;
        }
        final ResumeActivityItem other = (ResumeActivityItem) o;
        return mProcState == other.mProcState && mUpdateProcState == other.mUpdateProcState
        return mProcState == other.mProcState
                && mIsForward == other.mIsForward
                && mShouldSendCompatFakeFocus == other.mShouldSendCompatFakeFocus;
    }
@@ -170,7 +136,6 @@ public class ResumeActivityItem extends ActivityLifecycleItem {
        int result = 17;
        result = 31 * result + super.hashCode();
        result = 31 * result + mProcState;
        result = 31 * result + (mUpdateProcState ? 1 : 0);
        result = 31 * result + (mIsForward ? 1 : 0);
        result = 31 * result + (mShouldSendCompatFakeFocus ? 1 : 0);
        return result;
@@ -180,7 +145,6 @@ public class ResumeActivityItem extends ActivityLifecycleItem {
    public String toString() {
        return "ResumeActivityItem{" + super.toString()
                + ",procState=" + mProcState
                + ",updateProcState=" + mUpdateProcState
                + ",isForward=" + mIsForward
                + ",shouldSendCompatFakeFocus=" + mShouldSendCompatFakeFocus + "}";
    }
+2 −1
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import java.util.List;

/**
 * Helper class for {@link TransactionExecutor} that contains utils for lifecycle path resolution.
 *
 * @hide
 */
public class TransactionExecutorHelper {
@@ -203,7 +204,7 @@ public class TransactionExecutorHelper {
                lifecycleItem = StopActivityItem.obtain(r.token);
                break;
            default:
                lifecycleItem = ResumeActivityItem.obtain(r.token, false /* isForward */,
                lifecycleItem = new ResumeActivityItem(r.token, false /* isForward */,
                        false /* shouldSendCompatFakeFocus */);
                break;
        }
+2 −2
Original line number Diff line number Diff line
@@ -983,7 +983,7 @@ public class ActivityThreadTest {
                new MergedConfiguration(currentConfig, currentConfig),
                false /* preserveWindow */, activityWindowInfo);
        final ResumeActivityItem resumeStateRequest =
                ResumeActivityItem.obtain(activity.getActivityToken(), true /* isForward */,
                new ResumeActivityItem(activity.getActivityToken(), true /* isForward */,
                        false /* shouldSendCompatFakeFocus*/);

        final ClientTransaction transaction = newTransaction(activity);
@@ -996,7 +996,7 @@ public class ActivityThreadTest {
    @NonNull
    private static ClientTransaction newResumeTransaction(@NonNull Activity activity) {
        final ResumeActivityItem resumeStateRequest =
                ResumeActivityItem.obtain(activity.getActivityToken(), true /* isForward */,
                new ResumeActivityItem(activity.getActivityToken(), true /* isForward */,
                        false /* shouldSendCompatFakeFocus */);

        final ClientTransaction transaction = newTransaction(activity);
+39 −0
Original line number Diff line number Diff line
@@ -21,13 +21,17 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.ClientTransactionHandler;
import android.content.res.Configuration;
@@ -133,6 +137,41 @@ public class ClientTransactionItemTest {
                eq(false) /* getNonConfigInstance */, any());
    }

    @Test
    public void testResumeActivityItem_preExecute_withProcState_updatesProcessState() {
        final ResumeActivityItem item = new ResumeActivityItem(mActivityToken,
                ActivityManager.PROCESS_STATE_TOP /* procState */,
                true /* isForward */,
                false /* shouldSendCompatFakeFocus*/);

        item.preExecute(mHandler);

        verify(mHandler).updateProcessState(ActivityManager.PROCESS_STATE_TOP, false);
    }

    @Test
    public void testResumeActivityItem_preExecute_withUnknownProcState_skipsProcessStateUpdate() {
        final ResumeActivityItem item = new ResumeActivityItem(mActivityToken,
                ActivityManager.PROCESS_STATE_UNKNOWN /* procState */,
                true /* isForward */,
                false /* shouldSendCompatFakeFocus*/);

        item.preExecute(mHandler);

        verify(mHandler, never()).updateProcessState(anyInt(), anyBoolean());
    }

    @Test
    public void testResumeActivityItem_preExecute_withoutProcState_skipsProcessStateUpdate() {
        final ResumeActivityItem item = new ResumeActivityItem(mActivityToken,
                true /* isForward */,
                false /* shouldSendCompatFakeFocus*/);

        item.preExecute(mHandler);

        verify(mHandler, never()).updateProcessState(anyInt(), anyBoolean());
    }

    @Test
    public void testWindowContextInfoChangeItem_execute() {
        final WindowContextInfoChangeItem item = WindowContextInfoChangeItem
Loading