11cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov/* 21cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * Copyright (C) 2012 The Android Open Source Project 31cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * 41cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 51cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * you may not use this file except in compliance with the License. 61cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * You may obtain a copy of the License at 71cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * 81cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 91cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * 101cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * Unless required by applicable law or agreed to in writing, software 111cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 121cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * See the License for the specific language governing permissions and 141cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * limitations under the License. 151cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov */ 161cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 171cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganovpackage android.view; 181cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 191cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganovimport android.graphics.Rect; 201cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganovimport android.os.IBinder; 211cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganovimport android.os.Parcel; 221cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganovimport android.os.Parcelable; 231cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 241cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov/** 251cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * Information the state of a window. 261cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * 271cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * @hide 281cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov */ 291cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganovpublic class WindowInfo implements Parcelable { 301cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 311cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private static final int MAX_POOL_SIZE = 20; 321cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 331cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private static int UNDEFINED = -1; 341cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 351cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private static Object sPoolLock = new Object(); 361cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private static WindowInfo sPool; 371cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private static int sPoolSize; 381cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 391cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private WindowInfo mNext; 401cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private boolean mInPool; 411cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 421cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public IBinder token; 431cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 441cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public final Rect frame = new Rect(); 451cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 461cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public final Rect touchableRegion = new Rect(); 471cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 489b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov public int type = UNDEFINED; 491cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 509b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov public float compatibilityScale = UNDEFINED; 511cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 521cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public boolean visible; 531cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 549b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov public int displayId = UNDEFINED; 559b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov 569b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov public int layer = UNDEFINED; 571cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 581cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private WindowInfo() { 591cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov /* do nothing - reduce visibility */ 601cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 611cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 621cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov @Override 631cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public int describeContents() { 641cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov return 0; 651cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 661cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 671cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov @Override 681cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public void writeToParcel(Parcel parcel, int flags) { 691cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov parcel.writeStrongBinder(token); 701cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov parcel.writeParcelable(frame, 0); 711cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov parcel.writeParcelable(touchableRegion, 0); 721cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov parcel.writeInt(type); 731cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov parcel.writeFloat(compatibilityScale); 741cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov parcel.writeInt(visible ? 1 : 0); 751cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov parcel.writeInt(displayId); 769b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov parcel.writeInt(layer); 771cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov recycle(); 781cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 791cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 801cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private void initFromParcel(Parcel parcel) { 811cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov token = parcel.readStrongBinder(); 821cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov frame.set((Rect) parcel.readParcelable(null)); 831cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov touchableRegion.set((Rect) parcel.readParcelable(null)); 841cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov type = parcel.readInt(); 851cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov compatibilityScale = parcel.readFloat(); 861cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov visible = (parcel.readInt() == 1); 871cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov displayId = parcel.readInt(); 889b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov layer = parcel.readInt(); 891cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 901cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 911cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public static WindowInfo obtain(WindowInfo other) { 921cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov WindowInfo info = obtain(); 931cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov info.token = other.token; 941cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov info.frame.set(other.frame); 951cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov info.touchableRegion.set(other.touchableRegion); 961cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov info.type = other.type; 971cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov info.compatibilityScale = other.compatibilityScale; 981cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov info.visible = other.visible; 999b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov info.displayId = other.displayId; 1009b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov info.layer = other.layer; 1011cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov return info; 1021cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1031cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1041cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public static WindowInfo obtain() { 1051cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov synchronized (sPoolLock) { 1061cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (sPoolSize > 0) { 1071cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov WindowInfo info = sPool; 1081cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov sPool = info.mNext; 1091cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov info.mNext = null; 1101cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov info.mInPool = false; 1111cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov sPoolSize--; 1121cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov return info; 1131cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } else { 1141cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov return new WindowInfo(); 1151cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1161cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1171cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1181cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1191cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public void recycle() { 1201cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (mInPool) { 1211cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov throw new IllegalStateException("Already recycled."); 1221cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1231cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov clear(); 1241cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov synchronized (sPoolLock) { 1251cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov if (sPoolSize < MAX_POOL_SIZE) { 1261cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mNext = sPool; 1271cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov sPool = this; 1281cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov mInPool = true; 1291cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov sPoolSize++; 1301cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1311cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1321cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1331cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1341cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov private void clear() { 1351cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov token = null; 1361cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov frame.setEmpty(); 1371cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov touchableRegion.setEmpty(); 1381cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov type = UNDEFINED; 1399b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov compatibilityScale = UNDEFINED; 1401cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov visible = false; 1419b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov displayId = UNDEFINED; 1429b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov layer = UNDEFINED; 1439b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov } 1449b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov 1459b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov @Override 1469b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov public String toString() { 1479b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov StringBuilder builder = new StringBuilder(); 1489b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov builder.append("Window [token:").append((token != null) ? token.hashCode() : null); 1499b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov builder.append(", displayId:").append(displayId); 1509b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov builder.append(", type:").append(type); 1519b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov builder.append(", visible:").append(visible); 1529b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov builder.append(", layer:").append(layer); 1539b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov builder.append(", compatibilityScale:").append(compatibilityScale); 1549b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov builder.append(", frame:").append(frame); 1559b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov builder.append(", touchableRegion:").append(touchableRegion); 1569b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov builder.append("]"); 1579b4125e435b6bc8f8bd2f6e569d9b0b296ab16efSvetoslav Ganov return builder.toString(); 1581cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1591cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1601cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov /** 1611cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov * @see Parcelable.Creator 1621cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov */ 1631cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public static final Parcelable.Creator<WindowInfo> CREATOR = 1641cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov new Parcelable.Creator<WindowInfo>() { 1651cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public WindowInfo createFromParcel(Parcel parcel) { 1661cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov WindowInfo info = WindowInfo.obtain(); 1671cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov info.initFromParcel(parcel); 1681cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov return info; 1691cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1701cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov 1711cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov public WindowInfo[] newArray(int size) { 1721cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov return new WindowInfo[size]; 1731cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov } 1741cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov }; 1751cf70bbf96930662cab0e699d70b62865766ff52Svetoslav Ganov} 176