18e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav/*
28e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * Copyright (C) 2014 The Android Open Source Project
38e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *
48e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * Licensed under the Apache License, Version 2.0 (the "License");
58e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * you may not use this file except in compliance with the License.
68e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * You may obtain a copy of the License at
78e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *
88e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *      http://www.apache.org/licenses/LICENSE-2.0
98e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *
108e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * Unless required by applicable law or agreed to in writing, software
118e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * distributed under the License is distributed on an "AS IS" BASIS,
128e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * See the License for the specific language governing permissions and
148e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * limitations under the License.
158e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav */
168e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
178e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavpackage android.view;
188e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
198e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.graphics.Rect;
208e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.os.IBinder;
218e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.os.Parcel;
228e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.os.Parcelable;
238e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport android.util.Pools;
248e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
258e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport java.util.ArrayList;
268e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavimport java.util.List;
278e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
288e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav/**
298e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * This class represents information about a window from the
308e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * window manager to another part of the system.
318e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav *
328e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav * @hide
338e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav */
348e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslavpublic class WindowInfo implements Parcelable {
358e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private static final int MAX_POOL_SIZE = 10;
368e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
378e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private static final Pools.SynchronizedPool<WindowInfo> sPool =
388e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            new Pools.SynchronizedPool<WindowInfo>(MAX_POOL_SIZE);
398e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
408e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public int type;
418e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public int layer;
428e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public IBinder token;
438e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public IBinder parentToken;
448e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public boolean focused;
458e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public final Rect boundsInScreen = new Rect();
468e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public List<IBinder> childTokens;
478e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
488e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private WindowInfo() {
498e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        /* do nothing - hide constructor */
508e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
518e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
528e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public static WindowInfo obtain() {
538e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        WindowInfo window = sPool.acquire();
548e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (window == null) {
558e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            window = new WindowInfo();
568e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
578e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        return window;
588e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
598e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
608e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public static WindowInfo obtain(WindowInfo other) {
618e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        WindowInfo window = obtain();
628e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.type = other.type;
638e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.layer = other.layer;
648e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.token = other.token;
658e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.parentToken = other.parentToken;
668e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.focused = other.focused;
678e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        window.boundsInScreen.set(other.boundsInScreen);
688e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
698e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (other.childTokens != null && !other.childTokens.isEmpty()) {
708e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            if (window.childTokens == null) {
718e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav                window.childTokens = new ArrayList<IBinder>(other.childTokens);
728e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            } else {
738e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav                window.childTokens.addAll(other.childTokens);
748e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            }
758e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
768e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
778e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        return window;
788e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
798e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
808e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public void recycle() {
818e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        clear();
828e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        sPool.release(this);
838e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
848e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
858e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    @Override
868e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public int describeContents() {
878e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        return 0;
888e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
898e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
908e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    @Override
918e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public void writeToParcel(Parcel parcel, int flags) {
928e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeInt(type);
938e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeInt(layer);
948e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeStrongBinder(token);
958e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeStrongBinder(parentToken);
968e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parcel.writeInt(focused ? 1 : 0);
978e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        boundsInScreen.writeToParcel(parcel, flags);
988e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
998e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (childTokens != null && !childTokens.isEmpty()) {
1008e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            parcel.writeInt(1);
1018e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            parcel.writeBinderList(childTokens);
1028e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        } else {
1038e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            parcel.writeInt(0);
1048e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
1058e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
1068e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1078e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    @Override
1088e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public String toString() {
1098e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        StringBuilder builder = new StringBuilder();
1108e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append("WindowInfo[");
1118e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append("type=").append(type);
1128e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", layer=").append(layer);
1138e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", token=").append(token);
114f7174e87b6007000777b0124de9cef70d8618788Svetoslav        builder.append(", bounds=").append(boundsInScreen);
1158e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", parent=").append(parentToken);
1168e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", focused=").append(focused);
1178e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(", children=").append(childTokens);
1188e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        builder.append(']');
1198e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        return builder.toString();
1208e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
1218e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1228e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private void initFromParcel(Parcel parcel) {
1238e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        type = parcel.readInt();
1248e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        layer = parcel.readInt();
1258e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        token = parcel.readStrongBinder();
1268e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parentToken = parcel.readStrongBinder();
1278e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        focused = (parcel.readInt() == 1);
1288e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        boundsInScreen.readFromParcel(parcel);
1298e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1308e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        final boolean hasChildren = (parcel.readInt() == 1);
1318e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (hasChildren) {
1328e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            if (childTokens == null) {
1338e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav                childTokens = new ArrayList<IBinder>();
1348e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            }
1358e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            parcel.readBinderList(childTokens);
1368e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
1378e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
1388e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1398e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    private void clear() {
1408e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        type = 0;
1418e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        layer = 0;
1428e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        token = null;
1438e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        parentToken = null;
1448e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        focused = false;
1458e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        boundsInScreen.setEmpty();
1468e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        if (childTokens != null) {
1478e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            childTokens.clear();
1488e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
1498e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    }
1508e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1518e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    public static final Parcelable.Creator<WindowInfo> CREATOR =
1528e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            new Creator<WindowInfo>() {
1538e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        @Override
1548e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        public WindowInfo createFromParcel(Parcel parcel) {
1558e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            WindowInfo window = obtain();
1568e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            window.initFromParcel(parcel);
1578e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            return window;
1588e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
1598e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav
1608e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        @Override
1618e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        public WindowInfo[] newArray(int size) {
1628e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav            return new WindowInfo[size];
1638e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav        }
1648e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav    };
1658e3feb15c5aec2c72b0ef120a1da325e1e8f0ddaSvetoslav}
166