1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.view; 18 19 import android.app.ActivityTaskManager; 20 import android.graphics.Matrix; 21 import android.graphics.Region; 22 import android.os.IBinder; 23 import android.os.Parcel; 24 import android.os.Parcelable; 25 import android.util.Pools; 26 import android.view.accessibility.AccessibilityNodeInfo; 27 28 import java.util.ArrayList; 29 import java.util.List; 30 31 /** 32 * This class represents information about a window from the 33 * window manager to another part of the system. 34 * 35 * @hide 36 */ 37 public class WindowInfo implements Parcelable { 38 private static final int MAX_POOL_SIZE = 10; 39 40 private static final Pools.SynchronizedPool<WindowInfo> sPool = 41 new Pools.SynchronizedPool<WindowInfo>(MAX_POOL_SIZE); 42 43 public int type; 44 public int layer; 45 public IBinder token; 46 public IBinder parentToken; 47 public IBinder activityToken; 48 public boolean focused; 49 public Region regionInScreen = new Region(); 50 public List<IBinder> childTokens; 51 public CharSequence title; 52 public long accessibilityIdOfAnchor = AccessibilityNodeInfo.UNDEFINED_NODE_ID; 53 public boolean inPictureInPicture; 54 public boolean hasFlagWatchOutsideTouch; 55 public int displayId = Display.INVALID_DISPLAY; 56 public int taskId = ActivityTaskManager.INVALID_TASK_ID; 57 // The matrix applied to the bounds in window coordinate to get the corresponding values in 58 // screen coordinates. 59 public float[] mTransformMatrix = new float[9]; 60 61 public MagnificationSpec mMagnificationSpec = new MagnificationSpec(); 62 WindowInfo()63 private WindowInfo() { 64 /* do nothing - hide constructor */ 65 } 66 obtain()67 public static WindowInfo obtain() { 68 WindowInfo window = sPool.acquire(); 69 if (window == null) { 70 window = new WindowInfo(); 71 } 72 return window; 73 } 74 obtain(WindowInfo other)75 public static WindowInfo obtain(WindowInfo other) { 76 WindowInfo window = obtain(); 77 window.displayId = other.displayId; 78 window.taskId = other.taskId; 79 window.type = other.type; 80 window.layer = other.layer; 81 window.token = other.token; 82 window.parentToken = other.parentToken; 83 window.activityToken = other.activityToken; 84 window.focused = other.focused; 85 window.regionInScreen.set(other.regionInScreen); 86 window.title = other.title; 87 window.accessibilityIdOfAnchor = other.accessibilityIdOfAnchor; 88 window.inPictureInPicture = other.inPictureInPicture; 89 window.hasFlagWatchOutsideTouch = other.hasFlagWatchOutsideTouch; 90 for (int i = 0; i < window.mTransformMatrix.length; i++) { 91 window.mTransformMatrix[i] = other.mTransformMatrix[i]; 92 } 93 94 if (other.childTokens != null && !other.childTokens.isEmpty()) { 95 if (window.childTokens == null) { 96 window.childTokens = new ArrayList<IBinder>(other.childTokens); 97 } else { 98 window.childTokens.addAll(other.childTokens); 99 } 100 } 101 window.mMagnificationSpec.setTo(other.mMagnificationSpec); 102 return window; 103 } 104 recycle()105 public void recycle() { 106 clear(); 107 sPool.release(this); 108 } 109 110 @Override describeContents()111 public int describeContents() { 112 return 0; 113 } 114 115 @Override writeToParcel(Parcel parcel, int flags)116 public void writeToParcel(Parcel parcel, int flags) { 117 parcel.writeInt(displayId); 118 parcel.writeInt(taskId); 119 parcel.writeInt(type); 120 parcel.writeInt(layer); 121 parcel.writeStrongBinder(token); 122 parcel.writeStrongBinder(parentToken); 123 parcel.writeStrongBinder(activityToken); 124 parcel.writeInt(focused ? 1 : 0); 125 regionInScreen.writeToParcel(parcel, flags); 126 parcel.writeCharSequence(title); 127 parcel.writeLong(accessibilityIdOfAnchor); 128 parcel.writeInt(inPictureInPicture ? 1 : 0); 129 parcel.writeInt(hasFlagWatchOutsideTouch ? 1 : 0); 130 parcel.writeFloatArray(mTransformMatrix); 131 132 if (childTokens != null && !childTokens.isEmpty()) { 133 parcel.writeInt(1); 134 parcel.writeBinderList(childTokens); 135 } else { 136 parcel.writeInt(0); 137 } 138 mMagnificationSpec.writeToParcel(parcel, flags); 139 } 140 141 @Override toString()142 public String toString() { 143 StringBuilder builder = new StringBuilder(); 144 builder.append("WindowInfo["); 145 builder.append("title=").append(title); 146 builder.append(", displayId=").append(displayId); 147 builder.append(", taskId=").append(taskId); 148 builder.append(", type=").append(type); 149 builder.append(", layer=").append(layer); 150 builder.append(", token=").append(token); 151 builder.append(", region=").append(regionInScreen); 152 builder.append(", bounds=").append(regionInScreen.getBounds()); 153 builder.append(", parent=").append(parentToken); 154 builder.append(", focused=").append(focused); 155 builder.append(", children=").append(childTokens); 156 builder.append(", accessibility anchor=").append(accessibilityIdOfAnchor); 157 builder.append(", pictureInPicture=").append(inPictureInPicture); 158 builder.append(", watchOutsideTouch=").append(hasFlagWatchOutsideTouch); 159 Matrix matrix = new Matrix(); 160 matrix.setValues(mTransformMatrix); 161 builder.append(", mTransformMatrix=").append(matrix); 162 builder.append(", mMagnificationSpec=").append(mMagnificationSpec); 163 builder.append(']'); 164 return builder.toString(); 165 } 166 initFromParcel(Parcel parcel)167 private void initFromParcel(Parcel parcel) { 168 displayId = parcel.readInt(); 169 taskId = parcel.readInt(); 170 type = parcel.readInt(); 171 layer = parcel.readInt(); 172 token = parcel.readStrongBinder(); 173 parentToken = parcel.readStrongBinder(); 174 activityToken = parcel.readStrongBinder(); 175 focused = (parcel.readInt() == 1); 176 regionInScreen = Region.CREATOR.createFromParcel(parcel); 177 title = parcel.readCharSequence(); 178 accessibilityIdOfAnchor = parcel.readLong(); 179 inPictureInPicture = (parcel.readInt() == 1); 180 hasFlagWatchOutsideTouch = (parcel.readInt() == 1); 181 parcel.readFloatArray(mTransformMatrix); 182 final boolean hasChildren = (parcel.readInt() == 1); 183 if (hasChildren) { 184 if (childTokens == null) { 185 childTokens = new ArrayList<IBinder>(); 186 } 187 parcel.readBinderList(childTokens); 188 } 189 mMagnificationSpec = MagnificationSpec.CREATOR.createFromParcel(parcel); 190 } 191 clear()192 private void clear() { 193 displayId = Display.INVALID_DISPLAY; 194 taskId = ActivityTaskManager.INVALID_TASK_ID; 195 type = 0; 196 layer = 0; 197 token = null; 198 parentToken = null; 199 activityToken = null; 200 focused = false; 201 regionInScreen.setEmpty(); 202 if (childTokens != null) { 203 childTokens.clear(); 204 } 205 inPictureInPicture = false; 206 hasFlagWatchOutsideTouch = false; 207 for (int i = 0; i < mTransformMatrix.length; i++) { 208 mTransformMatrix[i] = 0; 209 } 210 mMagnificationSpec.clear(); 211 } 212 213 public static final @android.annotation.NonNull Parcelable.Creator<WindowInfo> CREATOR = 214 new Creator<WindowInfo>() { 215 @Override 216 public WindowInfo createFromParcel(Parcel parcel) { 217 WindowInfo window = obtain(); 218 window.initFromParcel(parcel); 219 return window; 220 } 221 222 @Override 223 public WindowInfo[] newArray(int size) { 224 return new WindowInfo[size]; 225 } 226 }; 227 } 228