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

Commit 9c5ea9c1 authored by Andrii Kulian's avatar Andrii Kulian
Browse files

Implement object pool for lifecycler

Lifecycler currently creates a lot of extra objects for transactions
and transaction items. This change adds an object pool, so that all
objects that are used in lifecycler will be reused as soon as a
transaction is scheduled.

This also fixes parcelling/unparcelling of IVoiceInteractor in launch
activity transaction item.

Bug: 64797980
Bug: 69977460
Test: android.app.servertransaction.ObjectPoolTests
Change-Id: I49125e28447f3565338b61dab6de843fcc1ca9cd
parent 33203ffd
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2557,8 +2557,8 @@ public final class ActivityThread extends ClientTransactionHandler {
                + " req=" + requestCode + " res=" + resultCode + " data=" + data);
        ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
        list.add(new ResultInfo(id, requestCode, resultCode, data));
        final ClientTransaction clientTransaction = new ClientTransaction(mAppThread, token);
        clientTransaction.addCallback(new ActivityResultItem(list));
        final ClientTransaction clientTransaction = ClientTransaction.obtain(mAppThread, token);
        clientTransaction.addCallback(ActivityResultItem.obtain(list));
        try {
            mAppThread.scheduleTransaction(clientTransaction);
        } catch (RemoteException e) {
+27 −6
Original line number Diff line number Diff line
@@ -25,17 +25,15 @@ import android.os.IBinder;
import android.os.Parcel;
import android.os.Trace;

import java.util.Objects;

/**
 * Activity configuration changed callback.
 * @hide
 */
public class ActivityConfigurationChangeItem extends ClientTransactionItem {

    private final Configuration mConfiguration;

    public ActivityConfigurationChangeItem(Configuration configuration) {
        mConfiguration = configuration;
    }
    private Configuration mConfiguration;

    @Override
    public void execute(ClientTransactionHandler client, IBinder token,
@@ -47,6 +45,29 @@ public class ActivityConfigurationChangeItem extends ClientTransactionItem {
    }


    // ObjectPoolItem implementation

    private ActivityConfigurationChangeItem() {}

    /** Obtain an instance initialized with provided params. */
    public static ActivityConfigurationChangeItem obtain(Configuration config) {
        ActivityConfigurationChangeItem instance =
                ObjectPool.obtain(ActivityConfigurationChangeItem.class);
        if (instance == null) {
            instance = new ActivityConfigurationChangeItem();
        }
        instance.mConfiguration = config;

        return instance;
    }

    @Override
    public void recycle() {
        mConfiguration = null;
        ObjectPool.recycle(this);
    }


    // Parcelable implementation

    /** Write to Parcel. */
@@ -80,7 +101,7 @@ public class ActivityConfigurationChangeItem extends ClientTransactionItem {
            return false;
        }
        final ActivityConfigurationChangeItem other = (ActivityConfigurationChangeItem) o;
        return mConfiguration.equals(other.mConfiguration);
        return Objects.equals(mConfiguration, other.mConfiguration);
    }

    @Override
+25 −6
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.os.Parcelable;
import android.os.Trace;

import java.util.List;
import java.util.Objects;

/**
 * Activity result delivery callback.
@@ -34,11 +35,7 @@ import java.util.List;
 */
public class ActivityResultItem extends ClientTransactionItem {

    private final List<ResultInfo> mResultInfoList;

    public ActivityResultItem(List<ResultInfo> resultInfos) {
        mResultInfoList = resultInfos;
    }
    private List<ResultInfo> mResultInfoList;

    @Override
    public int getPreExecutionState() {
@@ -54,6 +51,28 @@ public class ActivityResultItem extends ClientTransactionItem {
    }


    // ObjectPoolItem implementation

    private ActivityResultItem() {}

    /** Obtain an instance initialized with provided params. */
    public static ActivityResultItem obtain(List<ResultInfo> resultInfoList) {
        ActivityResultItem instance = ObjectPool.obtain(ActivityResultItem.class);
        if (instance == null) {
            instance = new ActivityResultItem();
        }
        instance.mResultInfoList = resultInfoList;

        return instance;
    }

    @Override
    public void recycle() {
        mResultInfoList = null;
        ObjectPool.recycle(this);
    }


    // Parcelable implementation

    /** Write to Parcel. */
@@ -87,7 +106,7 @@ public class ActivityResultItem extends ClientTransactionItem {
            return false;
        }
        final ActivityResultItem other = (ActivityResultItem) o;
        return mResultInfoList.equals(other.mResultInfoList);
        return Objects.equals(mResultInfoList, other.mResultInfoList);
    }

    @Override
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ import android.os.IBinder;
 * Each of them can be prepared before scheduling and, eventually, executed.
 * @hide
 */
public interface BaseClientRequest {
public interface BaseClientRequest extends ObjectPoolItem {

    /**
     * Prepare the client request before scheduling.
+36 −6
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ import java.util.Objects;
 * @see ActivityLifecycleItem
 * @hide
 */
public class ClientTransaction implements Parcelable {
public class ClientTransaction implements Parcelable, ObjectPoolItem {

    /** A list of individual callbacks to a client. */
    private List<ClientTransactionItem> mActivityCallbacks;
@@ -54,11 +54,6 @@ public class ClientTransaction implements Parcelable {
    /** Target client activity. Might be null if the entire transaction is targeting an app. */
    private IBinder mActivityToken;

    public ClientTransaction(IApplicationThread client, IBinder activityToken) {
        mClient = client;
        mActivityToken = activityToken;
    }

    /**
     * Add a message to the end of the sequence of callbacks.
     * @param activityCallback A single message that can contain a lifecycle request/callback.
@@ -127,6 +122,41 @@ public class ClientTransaction implements Parcelable {
    }


    // ObjectPoolItem implementation

    private ClientTransaction() {}

    /** Obtain an instance initialized with provided params. */
    public static ClientTransaction obtain(IApplicationThread client, IBinder activityToken) {
        ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);
        if (instance == null) {
            instance = new ClientTransaction();
        }
        instance.mClient = client;
        instance.mActivityToken = activityToken;

        return instance;
    }

    @Override
    public void recycle() {
        if (mActivityCallbacks != null) {
            int size = mActivityCallbacks.size();
            for (int i = 0; i < size; i++) {
                mActivityCallbacks.get(i).recycle();
            }
            mActivityCallbacks.clear();
        }
        if (mLifecycleStateRequest != null) {
            mLifecycleStateRequest.recycle();
            mLifecycleStateRequest = null;
        }
        mClient = null;
        mActivityToken = null;
        ObjectPool.recycle(this);
    }


    // Parcelable implementation

    /** Write to Parcel. */
Loading