blob: 7d16e147d29377aabd1689035718e624bac240d7 [file] [log] [blame]
/*
* 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<WindowInfo> CREATOR =
new Parcelable.Creator<WindowInfo>() {
public WindowInfo createFromParcel(Parcel parcel) {
WindowInfo info = WindowInfo.obtain();
info.initFromParcel(parcel);
return info;
}
public WindowInfo[] newArray(int size) {
return new WindowInfo[size];
}
};
}