Loading core/java/android/app/ActivityThread.java +13 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. * Loading core/java/android/app/ClientTransactionHandler.java +7 −0 Original line number Diff line number Diff line Loading @@ -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); Loading core/java/android/app/servertransaction/WindowContextConfigurationChangeItem.java 0 → 100644 +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 + "}"; } } core/java/android/app/servertransaction/WindowContextWindowRemovalItem.java 0 → 100644 +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 + "}"; } } core/java/android/app/servertransaction/WindowTokenClientController.java +35 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading @@ -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; } Loading Loading @@ -90,7 +92,7 @@ public class WindowTokenClientController { if (configuration == null) { return false; } onWindowContainerTokenAttached(client, displayId, configuration); onWindowContextTokenAttached(client, displayId, configuration); return true; } Loading @@ -116,7 +118,7 @@ public class WindowTokenClientController { if (configuration == null) { return false; } onWindowContainerTokenAttached(client, displayId, configuration); onWindowContextTokenAttached(client, displayId, configuration); return true; } Loading Loading @@ -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); Loading @@ -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
core/java/android/app/ActivityThread.java +13 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. * Loading
core/java/android/app/ClientTransactionHandler.java +7 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
core/java/android/app/servertransaction/WindowContextConfigurationChangeItem.java 0 → 100644 +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 + "}"; } }
core/java/android/app/servertransaction/WindowContextWindowRemovalItem.java 0 → 100644 +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 + "}"; } }
core/java/android/app/servertransaction/WindowTokenClientController.java +35 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading @@ -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; } Loading Loading @@ -90,7 +92,7 @@ public class WindowTokenClientController { if (configuration == null) { return false; } onWindowContainerTokenAttached(client, displayId, configuration); onWindowContextTokenAttached(client, displayId, configuration); return true; } Loading @@ -116,7 +118,7 @@ public class WindowTokenClientController { if (configuration == null) { return false; } onWindowContainerTokenAttached(client, displayId, configuration); onWindowContextTokenAttached(client, displayId, configuration); return true; } Loading Loading @@ -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); Loading @@ -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; } }