/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.view; import android.graphics.Rect; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; /** * Information the state of a window. * * @hide */ public class WindowInfo implements Parcelable { private static final int MAX_POOL_SIZE = 20; private static int UNDEFINED = -1; private static Object sPoolLock = new Object(); private static WindowInfo sPool; private static int sPoolSize; private WindowInfo mNext; private boolean mInPool; public IBinder token; public final Rect frame = new Rect(); public final Rect touchableRegion = new Rect(); public int type = UNDEFINED; public float compatibilityScale = UNDEFINED; public boolean visible; public int displayId = UNDEFINED; public int layer = UNDEFINED; private WindowInfo() { /* do nothing - reduce visibility */ } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeStrongBinder(token); parcel.writeParcelable(frame, 0); parcel.writeParcelable(touchableRegion, 0); parcel.writeInt(type); parcel.writeFloat(compatibilityScale); parcel.writeInt(visible ? 1 : 0); parcel.writeInt(displayId); parcel.writeInt(layer); recycle(); } private void initFromParcel(Parcel parcel) { token = parcel.readStrongBinder(); frame.set((Rect) parcel.readParcelable(null)); touchableRegion.set((Rect) parcel.readParcelable(null)); type = parcel.readInt(); compatibilityScale = parcel.readFloat(); visible = (parcel.readInt() == 1); displayId = parcel.readInt(); layer = parcel.readInt(); } public static WindowInfo obtain(WindowInfo other) { WindowInfo info = obtain(); info.token = other.token; info.frame.set(other.frame); info.touchableRegion.set(other.touchableRegion); info.type = other.type; info.compatibilityScale = other.compatibilityScale; info.visible = other.visible; info.displayId = other.displayId; info.layer = other.layer; return info; } public static WindowInfo obtain() { synchronized (sPoolLock) { if (sPoolSize > 0) { WindowInfo info = sPool; sPool = info.mNext; info.mNext = null; info.mInPool = false; sPoolSize--; return info; } else { return new WindowInfo(); } } } public void recycle() { if (mInPool) { throw new IllegalStateException("Already recycled."); } clear(); synchronized (sPoolLock) { if (sPoolSize < MAX_POOL_SIZE) { mNext = sPool; sPool = this; mInPool = true; sPoolSize++; } } } private void clear() { token = null; frame.setEmpty(); touchableRegion.setEmpty(); type = UNDEFINED; compatibilityScale = UNDEFINED; visible = false; displayId = UNDEFINED; layer = UNDEFINED; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Window [token:").append((token != null) ? token.hashCode() : null); builder.append(", displayId:").append(displayId); builder.append(", type:").append(type); builder.append(", visible:").append(visible); builder.append(", layer:").append(layer); builder.append(", compatibilityScale:").append(compatibilityScale); builder.append(", frame:").append(frame); builder.append(", touchableRegion:").append(touchableRegion); builder.append("]"); return builder.toString(); } /** * @see Parcelable.Creator */ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public WindowInfo createFromParcel(Parcel parcel) { WindowInfo info = WindowInfo.obtain(); info.initFromParcel(parcel); return info; } public WindowInfo[] newArray(int size) { return new WindowInfo[size]; } }; }