/* * Copyright (C) 2024 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.view; import static java.util.Objects.requireNonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; import android.util.MergedConfiguration; import android.window.ActivityWindowInfo; import android.window.ClientWindowFrames; /** * Stores information to pass to {@link IWindowSession#relayout} as AIDL out type. * @hide */ public final class WindowRelayoutResult implements Parcelable { /** The window frames used by the client side for layout. */ @NonNull public final ClientWindowFrames frames; /** * New config container that holds global, override and merged config for window, if it is now * becoming visible and the merged config has changed since it was last displayed. */ @NonNull public final MergedConfiguration mergedConfiguration; /** Object in which is placed the new display surface. */ @NonNull public final SurfaceControl surfaceControl; /** The current insets state in the system. */ @NonNull public final InsetsState insetsState; /** Objects which allow controlling {@link InsetsSource}s. */ @NonNull public final InsetsSourceControl.Array activeControls; /** The latest sync seq id for the relayout configuration. */ public int syncSeqId; /** * The latest {@link ActivityWindowInfo} if this relayout window is an Activity window. * {@code null} if this is not an Activity window. */ @Nullable public ActivityWindowInfo activityWindowInfo; public WindowRelayoutResult() { this(new ClientWindowFrames(), new MergedConfiguration(), new SurfaceControl(), new InsetsState(), new InsetsSourceControl.Array()); } /** * Stores information to pass for {@link IWindowSession#relayout}. * * @param frames The window frames used by the client side for layout. * @param mergedConfiguration New config container that holds global, override and merged * config for window, if it is now becoming visible and the merged * config has changed since it was last displayed. * @param surfaceControl Object in which is placed the new display surface. * @param insetsState The current insets state in the system. * @param activeControls Objects which allow controlling {@link InsetsSource}s. */ public WindowRelayoutResult(@NonNull ClientWindowFrames frames, @NonNull MergedConfiguration mergedConfiguration, @NonNull SurfaceControl surfaceControl, @NonNull InsetsState insetsState, @NonNull InsetsSourceControl.Array activeControls) { this.frames = requireNonNull(frames); this.mergedConfiguration = requireNonNull(mergedConfiguration); this.surfaceControl = requireNonNull(surfaceControl); this.insetsState = requireNonNull(insetsState); this.activeControls = requireNonNull(activeControls); } private WindowRelayoutResult(@NonNull Parcel in) { this(); readFromParcel(in); } /** Needed for IBinder out parameter. */ public void readFromParcel(@NonNull Parcel in) { frames.readFromParcel(in); mergedConfiguration.readFromParcel(in); surfaceControl.readFromParcel(in); insetsState.readFromParcel(in); activeControls.readFromParcel(in); syncSeqId = in.readInt(); activityWindowInfo = in.readTypedObject(ActivityWindowInfo.CREATOR); } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { frames.writeToParcel(dest, flags); mergedConfiguration.writeToParcel(dest, flags); surfaceControl.writeToParcel(dest, flags); insetsState.writeToParcel(dest, flags); activeControls.writeToParcel(dest, flags); dest.writeInt(syncSeqId); dest.writeTypedObject(activityWindowInfo, flags); } @NonNull public static final Creator CREATOR = new Creator<>() { @Override public WindowRelayoutResult createFromParcel(@NonNull Parcel in) { return new WindowRelayoutResult(in); } @Override public WindowRelayoutResult[] newArray(int size) { return new WindowRelayoutResult[size]; } }; @Override public int describeContents() { return 0; } }