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

Commit b6f318ce authored by Eric Lin's avatar Eric Lin
Browse files

Remove ConfigurationChangeItem pooling (17/n).

Remove the use of ObjectPool in the creation and management of
ConfigurationChangeItem 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:TransactionParcelTests
Flag: EXEMPT removing com.android.window.flags.disable_object_pool
Change-Id: I41b8161591264eb56b3f01ba778a1fa79d198ae6
parent 7080a7ab
Loading
Loading
Loading
Loading
+24 −38
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.app.servertransaction;

import static java.util.Objects.requireNonNull;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ClientTransactionHandler;
@@ -27,12 +29,20 @@ import java.util.Objects;

/**
 * App configuration change message.
 *
 * @hide
 */
public class ConfigurationChangeItem extends ClientTransactionItem {

    private Configuration mConfiguration;
    private int mDeviceId;
    @NonNull
    private final Configuration mConfiguration;

    private final int mDeviceId;

    public ConfigurationChangeItem(@NonNull Configuration config, int deviceId) {
        mConfiguration = new Configuration(config);
        mDeviceId = deviceId;
    }

    @Override
    public void preExecute(@NonNull ClientTransactionHandler client) {
@@ -46,47 +56,23 @@ public class ConfigurationChangeItem extends ClientTransactionItem {
        client.handleConfigurationChanged(mConfiguration, mDeviceId);
    }

    // ObjectPoolItem implementation

    private ConfigurationChangeItem() {}

    /** Obtain an instance initialized with provided params. */
    public static ConfigurationChangeItem obtain(@NonNull Configuration config, int deviceId) {
        ConfigurationChangeItem instance = ObjectPool.obtain(ConfigurationChangeItem.class);
        if (instance == null) {
            instance = new ConfigurationChangeItem();
        }
        instance.mConfiguration = new Configuration(config);
        instance.mDeviceId = deviceId;

        return instance;
    }

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


    // Parcelable implementation

    /** Write to Parcel. */
    /** Writes to Parcel. */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeTypedObject(mConfiguration, flags);
        dest.writeInt(mDeviceId);
    }

    /** Read from Parcel. */
    /** Reads from Parcel. */
    private ConfigurationChangeItem(Parcel in) {
        mConfiguration = in.readTypedObject(Configuration.CREATOR);
        mConfiguration = requireNonNull(in.readTypedObject(Configuration.CREATOR));
        mDeviceId = in.readInt();
    }

    public static final @android.annotation.NonNull Creator<ConfigurationChangeItem> CREATOR =
            new Creator<ConfigurationChangeItem>() {
            new Creator<>() {
                public ConfigurationChangeItem createFromParcel(Parcel in) {
                    return new ConfigurationChangeItem(in);
                }
+6 −6
Original line number Diff line number Diff line
@@ -254,8 +254,8 @@ public class ActivityThreadTest {
        try {
            // Send process level config change.
            ClientTransaction transaction = newTransaction(activityThread);
            transaction.addTransactionItem(ConfigurationChangeItem.obtain(
                    newConfig, DEVICE_ID_INVALID));
            transaction.addTransactionItem(
                    new ConfigurationChangeItem(newConfig, DEVICE_ID_INVALID));
            appThread.scheduleTransaction(transaction);
            InstrumentationRegistry.getInstrumentation().waitForIdleSync();

@@ -474,15 +474,15 @@ public class ActivityThreadTest {
        activity.mTestLatch = new CountDownLatch(1);

        ClientTransaction transaction = newTransaction(activityThread);
        transaction.addTransactionItem(ConfigurationChangeItem.obtain(
                processConfigLandscape, DEVICE_ID_INVALID));
        transaction.addTransactionItem(
                new ConfigurationChangeItem(processConfigLandscape, DEVICE_ID_INVALID));
        appThread.scheduleTransaction(transaction);

        transaction = newTransaction(activityThread);
        transaction.addTransactionItem(new ActivityConfigurationChangeItem(
                activity.getActivityToken(), activityConfigLandscape, new ActivityWindowInfo()));
        transaction.addTransactionItem(ConfigurationChangeItem.obtain(
                processConfigPortrait, DEVICE_ID_INVALID));
        transaction.addTransactionItem(
                new ConfigurationChangeItem(processConfigPortrait, DEVICE_ID_INVALID));
        transaction.addTransactionItem(new ActivityConfigurationChangeItem(
                activity.getActivityToken(), activityConfigPortrait, new ActivityWindowInfo()));
        appThread.scheduleTransaction(transaction);
+0 −81
Original line number Diff line number Diff line
/*
 * Copyright 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.app.servertransaction;

import static android.app.servertransaction.TestUtils.config;

import static org.junit.Assert.assertNotSame;

import android.annotation.NonNull;
import android.os.IBinder;
import android.platform.test.annotations.Presubmit;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

import java.util.function.Supplier;

/**
 * Tests for {@link ObjectPool}.
 *
 * <p>Build/Install/Run:
 *  atest FrameworksCoreTests:ObjectPoolTests
 *
 * <p>This test class is a part of Window Manager Service tests and specified in
 * {@link com.android.server.wm.test.filters.FrameworksTestsFilter}.
 */
@RunWith(AndroidJUnit4.class)
@SmallTest
@Presubmit
public class ObjectPoolTests {

    @Rule
    public final MockitoRule mocks = MockitoJUnit.rule();

    @Mock
    private IBinder mActivityToken;

    // 1. Check if two obtained objects from pool are not the same.
    // 2. Check if the state of the object is cleared after recycling.
    // 3. Check if the same object is obtained from pool after recycling.

    @Test
    public void testRecycleConfigurationChangeItem() {
        testRecycle(() -> ConfigurationChangeItem.obtain(config(), 1));
    }

    private void testRecycle(@NonNull Supplier<? extends ObjectPoolItem> obtain) {
        // Reuse the same object after recycle.
        final ObjectPoolItem item = obtain.get();
        item.recycle();
        final ObjectPoolItem item2 = obtain.get();

        assertNotSame(item, item2);  // Different instance.

        // Create new object when the pool is empty.
        final ObjectPoolItem item3 = obtain.get();

        assertNotSame(item, item3);
    }
}
+4 −2
Original line number Diff line number Diff line
@@ -74,11 +74,13 @@ public class TransactionParcelTests {
    @Test
    public void testConfigurationChange() {
        // Write to parcel
        ConfigurationChangeItem item = ConfigurationChangeItem.obtain(config(), 1 /* deviceId */);
        final ConfigurationChangeItem item =
                new ConfigurationChangeItem(config(), 1 /* deviceId */);
        writeAndPrepareForReading(item);

        // Read from parcel and assert
        ConfigurationChangeItem result = ConfigurationChangeItem.CREATOR.createFromParcel(mParcel);
        final ConfigurationChangeItem result =
                ConfigurationChangeItem.CREATOR.createFromParcel(mParcel);

        assertEquals(item.hashCode(), result.hashCode());
        assertEquals(item, result);
+3 −3
Original line number Diff line number Diff line
@@ -437,7 +437,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
            final ConfigurationChangeItem configurationChangeItem;
            synchronized (mLastReportedConfiguration) {
                onConfigurationChangePreScheduled(mLastReportedConfiguration);
                configurationChangeItem = ConfigurationChangeItem.obtain(
                configurationChangeItem = new ConfigurationChangeItem(
                        mLastReportedConfiguration, mLastTopActivityDeviceId);
            }
            // Schedule immediately to make sure the app component (e.g. receiver, service) can get
@@ -1721,8 +1721,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
        }

        onConfigurationChangePreScheduled(config);
        scheduleClientTransactionItem(thread, ConfigurationChangeItem.obtain(
                config, mLastTopActivityDeviceId));
        scheduleClientTransactionItem(
                thread, new ConfigurationChangeItem(config, mLastTopActivityDeviceId));
    }

    private void onConfigurationChangePreScheduled(@NonNull Configuration config) {