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; 248e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 258e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport java.util.ArrayList; 268e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport java.util.List; 278e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 288e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav/** 298e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * This class represents information about a window from the 308e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * window manager to another part of the system. 318e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * 328e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * @hide 338e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav */ 348e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavpublic class WindowInfo implements Parcelable { 358e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav private static final int MAX_POOL_SIZE = 10; 368e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 378e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav private static final Pools.SynchronizedPool<WindowInfo> sPool = 388e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav new Pools.SynchronizedPool<WindowInfo>(MAX_POOL_SIZE); 398e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 408e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public int type; 418e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public int layer; 428e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public IBinder token; 438e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public IBinder parentToken; 448e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public boolean focused; 458e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public final Rect boundsInScreen = new Rect(); 468e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public List<IBinder> childTokens; 478e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 488e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav private WindowInfo() { 498e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav /* do nothing - hide constructor */ 508e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 518e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 528e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public static WindowInfo obtain() { 538e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav WindowInfo window = sPool.acquire(); 548e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav if (window == null) { 558e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window = new WindowInfo(); 568e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 578e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav return window; 588e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 598e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 608e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public static WindowInfo obtain(WindowInfo other) { 618e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav WindowInfo window = obtain(); 628e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window.type = other.type; 638e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window.layer = other.layer; 648e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window.token = other.token; 658e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window.parentToken = other.parentToken; 668e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window.focused = other.focused; 678e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window.boundsInScreen.set(other.boundsInScreen); 688e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 698e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav if (other.childTokens != null && !other.childTokens.isEmpty()) { 708e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav if (window.childTokens == null) { 718e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window.childTokens = new ArrayList<IBinder>(other.childTokens); 728e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } else { 738e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window.childTokens.addAll(other.childTokens); 748e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 758e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 768e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 778e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav return window; 788e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 798e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 808e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public void recycle() { 818e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav clear(); 828e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav sPool.release(this); 838e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 848e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 858e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav @Override 868e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public int describeContents() { 878e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav return 0; 888e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 898e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 908e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav @Override 918e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public void writeToParcel(Parcel parcel, int flags) { 928e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parcel.writeInt(type); 938e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parcel.writeInt(layer); 948e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parcel.writeStrongBinder(token); 958e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parcel.writeStrongBinder(parentToken); 968e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parcel.writeInt(focused ? 1 : 0); 978e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav boundsInScreen.writeToParcel(parcel, flags); 988e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 998e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav if (childTokens != null && !childTokens.isEmpty()) { 1008e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parcel.writeInt(1); 1018e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parcel.writeBinderList(childTokens); 1028e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } else { 1038e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parcel.writeInt(0); 1048e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1058e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1068e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 1078e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav @Override 1088e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public String toString() { 1098e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav StringBuilder builder = new StringBuilder(); 1108e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav builder.append("WindowInfo["); 1118e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav builder.append("type=").append(type); 1128e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav builder.append(", layer=").append(layer); 1138e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav builder.append(", token=").append(token); 114f7174e87b6007000777b0124de9cef70d8618788Svetoslav builder.append(", bounds=").append(boundsInScreen); 1158e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav builder.append(", parent=").append(parentToken); 1168e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav builder.append(", focused=").append(focused); 1178e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav builder.append(", children=").append(childTokens); 1188e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav builder.append(']'); 1198e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav return builder.toString(); 1208e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1218e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 1228e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav private void initFromParcel(Parcel parcel) { 1238e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav type = parcel.readInt(); 1248e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav layer = parcel.readInt(); 1258e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav token = parcel.readStrongBinder(); 1268e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parentToken = parcel.readStrongBinder(); 1278e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav focused = (parcel.readInt() == 1); 1288e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav boundsInScreen.readFromParcel(parcel); 1298e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 1308e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav final boolean hasChildren = (parcel.readInt() == 1); 1318e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav if (hasChildren) { 1328e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav if (childTokens == null) { 1338e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav childTokens = new ArrayList<IBinder>(); 1348e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1358e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parcel.readBinderList(childTokens); 1368e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1378e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1388e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 1398e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav private void clear() { 1408e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav type = 0; 1418e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav layer = 0; 1428e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav token = null; 1438e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav parentToken = null; 1448e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav focused = false; 1458e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav boundsInScreen.setEmpty(); 1468e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav if (childTokens != null) { 1478e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav childTokens.clear(); 1488e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1498e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1508e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 1518e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public static final Parcelable.Creator<WindowInfo> CREATOR = 1528e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav new Creator<WindowInfo>() { 1538e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav @Override 1548e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public WindowInfo createFromParcel(Parcel parcel) { 1558e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav WindowInfo window = obtain(); 1568e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav window.initFromParcel(parcel); 1578e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav return window; 1588e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1598e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav 1608e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav @Override 1618e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav public WindowInfo[] newArray(int size) { 1628e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav return new WindowInfo[size]; 1638e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav } 1648e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav }; 1658e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav} 166