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