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

Commit 7b4be942 authored by Chris Li's avatar Chris Li Committed by Android (Google) Code Review
Browse files

Merge "Migrate WindowContext#onConfigurationChanged to ClientTransaction (2/n)" into main

parents fe1503a2 7ba782a8
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ import android.app.servertransaction.PendingTransactionActions.StopInfo;
import android.app.servertransaction.ResumeActivityItem;
import android.app.servertransaction.TransactionExecutor;
import android.app.servertransaction.TransactionExecutorHelper;
import android.app.servertransaction.WindowTokenClientController;
import android.bluetooth.BluetoothFrameworkInitializer;
import android.companion.virtual.VirtualDeviceManager;
import android.compat.annotation.UnsupportedAppUsage;
@@ -6221,6 +6222,18 @@ public final class ActivityThread extends ClientTransactionHandler
                false /* clearPending */);
    }

    @Override
    public void handleWindowContextConfigurationChanged(@NonNull IBinder clientToken,
            @NonNull Configuration configuration, int displayId) {
        WindowTokenClientController.getInstance().onWindowContextConfigurationChanged(clientToken,
                configuration, displayId);
    }

    @Override
    public void handleWindowContextWindowRemoval(@NonNull IBinder clientToken) {
        WindowTokenClientController.getInstance().onWindowContextWindowRemoved(clientToken);
    }

    /**
     * Sends windowing mode change callbacks to {@link Activity} if applicable.
     *
+7 −0
Original line number Diff line number Diff line
@@ -163,6 +163,13 @@ public abstract class ClientTransactionHandler {
    public abstract void handleActivityConfigurationChanged(@NonNull ActivityClientRecord r,
            Configuration overrideConfig, int displayId);

    /** Deliver {@link android.window.WindowContext} configuration change. */
    public abstract void handleWindowContextConfigurationChanged(@NonNull IBinder clientToken,
            @NonNull Configuration configuration, int displayId);

    /** Deliver {@link android.window.WindowContext} window removal event. */
    public abstract void handleWindowContextWindowRemoval(@NonNull IBinder clientToken);

    /** Deliver result from another activity. */
    public abstract void handleSendResult(
            @NonNull ActivityClientRecord r, List<ResultInfo> results, String reason);
+135 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.view.Display.INVALID_DISPLAY;

import static java.util.Objects.requireNonNull;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ClientTransactionHandler;
import android.content.res.Configuration;
import android.os.IBinder;
import android.os.Parcel;

import java.util.Objects;

/**
 * {@link android.window.WindowContext} configuration change message.
 * @hide
 */
public class WindowContextConfigurationChangeItem extends ClientTransactionItem {

    @Nullable
    private IBinder mClientToken;
    @Nullable
    private Configuration mConfiguration;
    private int mDisplayId;

    @Override
    public void execute(@NonNull ClientTransactionHandler client, @NonNull IBinder token,
            @NonNull PendingTransactionActions pendingActions) {
        client.handleWindowContextConfigurationChanged(mClientToken, mConfiguration, mDisplayId);
    }

    // ObjectPoolItem implementation

    private WindowContextConfigurationChangeItem() {}

    /** Obtains an instance initialized with provided params. */
    public static WindowContextConfigurationChangeItem obtain(
            @NonNull IBinder clientToken, @NonNull Configuration config, int displayId) {
        WindowContextConfigurationChangeItem instance =
                ObjectPool.obtain(WindowContextConfigurationChangeItem.class);
        if (instance == null) {
            instance = new WindowContextConfigurationChangeItem();
        }
        instance.mClientToken = requireNonNull(clientToken);
        instance.mConfiguration = requireNonNull(config);
        instance.mDisplayId = displayId;

        return instance;
    }

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

    // Parcelable implementation

    /** Writes to Parcel. */
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeStrongBinder(mClientToken);
        dest.writeTypedObject(mConfiguration, flags);
        dest.writeInt(mDisplayId);
    }

    /** Reads from Parcel. */
    private WindowContextConfigurationChangeItem(@NonNull Parcel in) {
        mClientToken = in.readStrongBinder();
        mConfiguration = in.readTypedObject(Configuration.CREATOR);
        mDisplayId = in.readInt();
    }

    public static final @NonNull Creator<WindowContextConfigurationChangeItem> CREATOR =
            new Creator<>() {
                public WindowContextConfigurationChangeItem createFromParcel(Parcel in) {
                    return new WindowContextConfigurationChangeItem(in);
                }

                public WindowContextConfigurationChangeItem[] newArray(int size) {
                    return new WindowContextConfigurationChangeItem[size];
                }
    };

    @Override
    public boolean equals(@Nullable Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        final WindowContextConfigurationChangeItem other = (WindowContextConfigurationChangeItem) o;
        return Objects.equals(mClientToken, other.mClientToken)
                && Objects.equals(mConfiguration, other.mConfiguration)
                && mDisplayId == other.mDisplayId;
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + Objects.hashCode(mClientToken);
        result = 31 * result + Objects.hashCode(mConfiguration);
        result = 31 * result + mDisplayId;
        return result;
    }

    @Override
    public String toString() {
        return "WindowContextConfigurationChangeItem{clientToken=" + mClientToken
                + ", config=" + mConfiguration
                + ", displayId=" + mDisplayId
                + "}";
    }
}
+112 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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 java.util.Objects.requireNonNull;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ClientTransactionHandler;
import android.os.IBinder;
import android.os.Parcel;

import java.util.Objects;

/**
 * {@link android.window.WindowContext} window removal message.
 * @hide
 */
public class WindowContextWindowRemovalItem extends ClientTransactionItem {

    @Nullable
    private IBinder mClientToken;

    @Override
    public void execute(@NonNull ClientTransactionHandler client, @NonNull IBinder token,
            @NonNull PendingTransactionActions pendingActions) {
        client.handleWindowContextWindowRemoval(mClientToken);
    }

    // ObjectPoolItem implementation

    private WindowContextWindowRemovalItem() {}

    /** Obtains an instance initialized with provided params. */
    public static WindowContextWindowRemovalItem obtain(@NonNull IBinder clientToken) {
        WindowContextWindowRemovalItem instance =
                ObjectPool.obtain(WindowContextWindowRemovalItem.class);
        if (instance == null) {
            instance = new WindowContextWindowRemovalItem();
        }
        instance.mClientToken = requireNonNull(clientToken);

        return instance;
    }

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

    // Parcelable implementation

    /** Writes to Parcel. */
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeStrongBinder(mClientToken);
    }

    /** Reads from Parcel. */
    private WindowContextWindowRemovalItem(@NonNull Parcel in) {
        mClientToken = in.readStrongBinder();
    }

    public static final @NonNull Creator<WindowContextWindowRemovalItem> CREATOR = new Creator<>() {
        public WindowContextWindowRemovalItem createFromParcel(Parcel in) {
            return new WindowContextWindowRemovalItem(in);
        }

        public WindowContextWindowRemovalItem[] newArray(int size) {
            return new WindowContextWindowRemovalItem[size];
        }
    };

    @Override
    public boolean equals(@Nullable Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        final WindowContextWindowRemovalItem other = (WindowContextWindowRemovalItem) o;
        return Objects.equals(mClientToken, other.mClientToken);
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + Objects.hashCode(mClientToken);
        return result;
    }

    @Override
    public String toString() {
        return "WindowContextWindowRemovalItem{clientToken=" + mClientToken + "}";
    }
}
+35 −4
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.ArrayMap;
import android.util.Log;
import android.view.IWindowManager;
import android.window.WindowContext;
import android.window.WindowTokenClient;
@@ -41,6 +42,7 @@ import com.android.internal.annotations.VisibleForTesting;
 */
public class WindowTokenClientController {

    private static final String TAG = WindowTokenClientController.class.getSimpleName();
    private static WindowTokenClientController sController;

    private final Object mLock = new Object();
@@ -61,7 +63,7 @@ public class WindowTokenClientController {

    /** Overrides the {@link #getInstance()} for test only. */
    @VisibleForTesting
    public static void overrideInstance(@NonNull WindowTokenClientController controller) {
    public static void overrideForTesting(@NonNull WindowTokenClientController controller) {
        synchronized (WindowTokenClientController.class) {
            sController = controller;
        }
@@ -90,7 +92,7 @@ public class WindowTokenClientController {
        if (configuration == null) {
            return false;
        }
        onWindowContainerTokenAttached(client, displayId, configuration);
        onWindowContextTokenAttached(client, displayId, configuration);
        return true;
    }

@@ -116,7 +118,7 @@ public class WindowTokenClientController {
        if (configuration == null) {
            return false;
        }
        onWindowContainerTokenAttached(client, displayId, configuration);
        onWindowContextTokenAttached(client, displayId, configuration);
        return true;
    }

@@ -153,7 +155,7 @@ public class WindowTokenClientController {
        }
    }

    private void onWindowContainerTokenAttached(@NonNull WindowTokenClient client, int displayId,
    private void onWindowContextTokenAttached(@NonNull WindowTokenClient client, int displayId,
            @NonNull Configuration configuration) {
        synchronized (mLock) {
            mWindowTokenClientMap.put(client.asBinder(), client);
@@ -161,4 +163,33 @@ public class WindowTokenClientController {
        client.onConfigurationChanged(configuration, displayId,
                false /* shouldReportConfigChange */);
    }

    /** Called when receives {@link WindowContextConfigurationChangeItem}. */
    public void onWindowContextConfigurationChanged(@NonNull IBinder clientToken,
            @NonNull Configuration configuration, int displayId) {
        final WindowTokenClient windowTokenClient = getWindowTokenClient(clientToken);
        if (windowTokenClient != null) {
            windowTokenClient.onConfigurationChanged(configuration, displayId);
        }
    }

    /** Called when receives {@link WindowContextWindowRemovalItem}. */
    public void onWindowContextWindowRemoved(@NonNull IBinder clientToken) {
        final WindowTokenClient windowTokenClient = getWindowTokenClient(clientToken);
        if (windowTokenClient != null) {
            windowTokenClient.onWindowTokenRemoved();
        }
    }

    @Nullable
    private WindowTokenClient getWindowTokenClient(@NonNull IBinder clientToken) {
        final WindowTokenClient windowTokenClient;
        synchronized (mLock) {
            windowTokenClient = mWindowTokenClientMap.get(clientToken);
        }
        if (windowTokenClient == null) {
            Log.w(TAG, "Can't find attached WindowTokenClient for " + clientToken);
        }
        return windowTokenClient;
    }
}
Loading