18e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav/*
28e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * Copyright (C) 2014 The Android Open Source Project
38e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *
48e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * Licensed under the Apache License, Version 2.0 (the "License");
58e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * you may not use this file except in compliance with the License.
68e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * You may obtain a copy of the License at
78e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *
88e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *      http://www.apache.org/licenses/LICENSE-2.0
98e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *
108e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * Unless required by applicable law or agreed to in writing, software
118e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * distributed under the License is distributed on an "AS IS" BASIS,
128e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * See the License for the specific language governing permissions and
148e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * limitations under the License.
158e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav */
168e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
178e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavpackage android.view;
188e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
198e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.graphics.Rect;
208e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.os.IBinder;
218e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.os.Parcel;
228e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.os.Parcelable;
238e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.util.Pools;
248583ae8a6af11bedbb00a4eb9efd2565da2fecbbPhil Weaverimport android.view.accessibility.AccessibilityNodeInfo;
258e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
268e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport java.util.ArrayList;
278e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport java.util.List;
288e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
298e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav/**
308e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * This class represents information about a window from the
318e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * window manager to another part of the system.
328e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *
338e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * @hide
348e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav */
358e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavpublic class WindowInfo implements Parcelable {
368e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private static final int MAX_POOL_SIZE = 10;
378e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
388e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private static final Pools.SynchronizedPool<WindowInfo> sPool =
398e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            new Pools.SynchronizedPool<WindowInfo>(MAX_POOL_SIZE);
408e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
418e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public int type;
428e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public int layer;
438e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public IBinder token;
448e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public IBinder parentToken;
455dc3ebcec692174e2f0593c934b7b56eeae5e249Phil Weaver    public IBinder activityToken;
468e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public boolean focused;
478e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public final Rect boundsInScreen = new Rect();
488e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public List<IBinder> childTokens;
49396d549113bc633f719acc643c7dfc5f2a8fae4ePhil Weaver    public CharSequence title;
508583ae8a6af11bedbb00a4eb9efd2565da2fecbbPhil Weaver    public long accessibilityIdOfAnchor = AccessibilityNodeInfo.UNDEFINED_NODE_ID;
51f00cd14f17c0acd6bffe78947d32ea0a2900d139Phil Weaver    public boolean inPictureInPicture;
528e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
538e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private WindowInfo() {
548e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        /* do nothing - hide constructor */
558e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
568e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
578e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public static WindowInfo obtain() {
588e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        WindowInfo window = sPool.acquire();
598e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (window == null) {
608e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            window = new WindowInfo();
618e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
628e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        return window;
638e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
648e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
658e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public static WindowInfo obtain(WindowInfo other) {
668e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        WindowInfo window = obtain();
678e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.type = other.type;
688e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.layer = other.layer;
698e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.token = other.token;
708e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.parentToken = other.parentToken;
715dc3ebcec692174e2f0593c934b7b56eeae5e249Phil Weaver        window.activityToken = other.activityToken;
728e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.focused = other.focused;
738e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.boundsInScreen.set(other.boundsInScreen);
74396d549113bc633f719acc643c7dfc5f2a8fae4ePhil Weaver        window.title = other.title;
75396d549113bc633f719acc643c7dfc5f2a8fae4ePhil Weaver        window.accessibilityIdOfAnchor = other.accessibilityIdOfAnchor;
76f00cd14f17c0acd6bffe78947d32ea0a2900d139Phil Weaver        window.inPictureInPicture = other.inPictureInPicture;
778e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
788e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (other.childTokens != null && !other.childTokens.isEmpty()) {
798e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            if (window.childTokens == null) {
808e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav                window.childTokens = new ArrayList<IBinder>(other.childTokens);
818e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            } else {
828e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav                window.childTokens.addAll(other.childTokens);
838e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            }
848e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
858e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
868e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        return window;
878e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
888e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
898e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public void recycle() {
908e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        clear();
918e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        sPool.release(this);
928e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
938e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
948e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    @Override
958e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public int describeContents() {
968e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        return 0;
978e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
988e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
998e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    @Override
1008e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public void writeToParcel(Parcel parcel, int flags) {
1018e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeInt(type);
1028e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeInt(layer);
1038e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeStrongBinder(token);
1048e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeStrongBinder(parentToken);
1055dc3ebcec692174e2f0593c934b7b56eeae5e249Phil Weaver        parcel.writeStrongBinder(activityToken);
1068e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeInt(focused ? 1 : 0);
1078e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        boundsInScreen.writeToParcel(parcel, flags);
108396d549113bc633f719acc643c7dfc5f2a8fae4ePhil Weaver        parcel.writeCharSequence(title);
1098583ae8a6af11bedbb00a4eb9efd2565da2fecbbPhil Weaver        parcel.writeLong(accessibilityIdOfAnchor);
110f00cd14f17c0acd6bffe78947d32ea0a2900d139Phil Weaver        parcel.writeInt(inPictureInPicture ? 1 : 0);
1118e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1128e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (childTokens != null && !childTokens.isEmpty()) {
1138e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            parcel.writeInt(1);
1148e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            parcel.writeBinderList(childTokens);
1158e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        } else {
1168e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            parcel.writeInt(0);
1178e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
1188e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
1198e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1208e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    @Override
1218e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public String toString() {
1228e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        StringBuilder builder = new StringBuilder();
1238e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append("WindowInfo[");
124396d549113bc633f719acc643c7dfc5f2a8fae4ePhil Weaver        builder.append("title=").append(title);
125396d549113bc633f719acc643c7dfc5f2a8fae4ePhil Weaver        builder.append(", type=").append(type);
1268e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", layer=").append(layer);
1278e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", token=").append(token);
128f7174e87b6007000777b0124de9cef70d8618788Svetoslav        builder.append(", bounds=").append(boundsInScreen);
1298e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", parent=").append(parentToken);
1308e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", focused=").append(focused);
1318e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", children=").append(childTokens);
132396d549113bc633f719acc643c7dfc5f2a8fae4ePhil Weaver        builder.append(", accessibility anchor=").append(accessibilityIdOfAnchor);
1338e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(']');
1348e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        return builder.toString();
1358e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
1368e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1378e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private void initFromParcel(Parcel parcel) {
1388e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        type = parcel.readInt();
1398e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        layer = parcel.readInt();
1408e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        token = parcel.readStrongBinder();
1418e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parentToken = parcel.readStrongBinder();
1425dc3ebcec692174e2f0593c934b7b56eeae5e249Phil Weaver        activityToken = parcel.readStrongBinder();
1438e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        focused = (parcel.readInt() == 1);
1448e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        boundsInScreen.readFromParcel(parcel);
145396d549113bc633f719acc643c7dfc5f2a8fae4ePhil Weaver        title = parcel.readCharSequence();
1468583ae8a6af11bedbb00a4eb9efd2565da2fecbbPhil Weaver        accessibilityIdOfAnchor = parcel.readLong();
147f00cd14f17c0acd6bffe78947d32ea0a2900d139Phil Weaver        inPictureInPicture = (parcel.readInt() == 1);
1488e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1498e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        final boolean hasChildren = (parcel.readInt() == 1);
1508e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (hasChildren) {
1518e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            if (childTokens == null) {
1528e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav                childTokens = new ArrayList<IBinder>();
1538e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            }
1548e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            parcel.readBinderList(childTokens);
1558e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
1568e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
1578e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1588e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private void clear() {
1598e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        type = 0;
1608e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        layer = 0;
1618e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        token = null;
1628e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parentToken = null;
1635dc3ebcec692174e2f0593c934b7b56eeae5e249Phil Weaver        activityToken = null;
1648e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        focused = false;
1658e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        boundsInScreen.setEmpty();
1668e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (childTokens != null) {
1678e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            childTokens.clear();
1688e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
169f00cd14f17c0acd6bffe78947d32ea0a2900d139Phil Weaver        inPictureInPicture = false;
1708e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
1718e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1728e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public static final Parcelable.Creator<WindowInfo> CREATOR =
1738e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            new Creator<WindowInfo>() {
1748e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        @Override
1758e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        public WindowInfo createFromParcel(Parcel parcel) {
1768e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            WindowInfo window = obtain();
1778e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            window.initFromParcel(parcel);
1788e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            return window;
1798e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
1808e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1818e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        @Override
1828e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        public WindowInfo[] newArray(int size) {
1838e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            return new WindowInfo[size];
1848e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
1858e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    };
1868e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav}
187