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