1d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren/*
2d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren * Copyright (C) 2015 The Android Open Source Project
3d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren *
4d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren * Licensed under the Apache License, Version 2.0 (the "License");
5d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren * you may not use this file except in compliance with the License.
6d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren * You may obtain a copy of the License at
7d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren *
8d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren *      http://www.apache.org/licenses/LICENSE-2.0
9d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren *
10d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren * Unless required by applicable law or agreed to in writing, software
11d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren * distributed under the License is distributed on an "AS IS" BASIS,
12d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren * See the License for the specific language governing permissions and
14d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren * limitations under the License.
15d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren */
16d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
17d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wrenpackage com.android.internal.statusbar;
18d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
19d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wrenimport android.os.Message;
20d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wrenimport android.os.Parcel;
21d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wrenimport android.os.Parcelable;
22d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wrenimport android.util.Log;
23d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
24d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wrenimport java.util.ArrayDeque;
25d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wrenimport java.util.Collection;
26d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
27d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wrenpublic class NotificationVisibility implements Parcelable {
28d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    private static final String TAG = "NoViz";
29d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    private static final int MAX_POOL_SIZE = 25;
30d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    private static ArrayDeque<NotificationVisibility> sPool = new ArrayDeque<>(MAX_POOL_SIZE);
31d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    private static int sNexrId = 0;
32d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
33d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public String key;
34d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public int rank;
35d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public boolean visible = true;
36d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    /*package*/ int id;
37d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
38d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    private NotificationVisibility() {
39d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        id = sNexrId++;
40d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
41d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
42d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    private NotificationVisibility(String key, int rank, boolean visibile) {
43d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        this();
44d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        this.key = key;
45d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        this.rank = rank;
46d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        this.visible = visibile;
47d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
48d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
49d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    @Override
50d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public String toString() {
51d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        return "NotificationVisibility(id=" + id
52d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren                + "key=" + key
53d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren                + " rank=" + rank
54d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren                + (visible?" visible":"")
55d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren                + " )";
56d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
57d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
58d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    @Override
59d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public NotificationVisibility clone() {
60d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        return obtain(this.key, this.rank, this.visible);
61d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
62d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
63d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    @Override
64d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public int hashCode() {
65d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        // allow lookups by key, which _should_ never be null.
66d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        return key == null ? 0 : key.hashCode();
67d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
68d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
69d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    @Override
70d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public boolean equals(Object that) {
71d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        // allow lookups by key, which _should_ never be null.
72d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        if (that instanceof NotificationVisibility) {
73d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            NotificationVisibility thatViz = (NotificationVisibility) that;
74d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            return (key == null && thatViz.key == null) || key.equals(thatViz.key);
75d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        }
76d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        return false;
77d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
78d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
79d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    @Override
80d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public int describeContents() {
81d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        return 0;
82d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
83d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
84d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    @Override
85d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public void writeToParcel(Parcel out, int flags) {
86d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        out.writeString(this.key);
87d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        out.writeInt(this.rank);
88d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        out.writeInt(this.visible ? 1 : 0);
89d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
90d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
91d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    private void readFromParcel(Parcel in) {
92d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        this.key = in.readString();
93d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        this.rank = in.readInt();
94d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        this.visible = in.readInt() != 0;
95d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
96d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
97d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    /**
98d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     * Return a new NotificationVisibility instance from the global pool. Allows us to
99d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     * avoid allocating new objects in many cases.
100d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     */
101d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public static NotificationVisibility obtain(String key, int rank, boolean visible) {
102d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        NotificationVisibility vo = obtain();
103d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        vo.key = key;
104d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        vo.rank = rank;
105d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        vo.visible = visible;
106d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        return vo;
107d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
108d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
109d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    private static NotificationVisibility obtain(Parcel in) {
110d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        NotificationVisibility vo = obtain();
111d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        vo.readFromParcel(in);
112d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        return vo;
113d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
114d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
115d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    private static NotificationVisibility obtain() {
116d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        synchronized (sPool) {
117d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            if (!sPool.isEmpty()) {
118d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren                return sPool.poll();
119d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            }
120d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        }
121d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        return new NotificationVisibility();
122d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
123d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
124d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    /**
125d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     * Return a NotificationVisibility instance to the global pool.
126d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     * <p>
127d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     * You MUST NOT touch the NotificationVisibility after calling this function because it has
128d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     * effectively been freed.
129d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     * </p>
130d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     */
131d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public void recycle() {
132d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        if (key == null) {
133d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            // do nothing on multiple recycles
134d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            return;
135d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        }
136d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        key = null;
137d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        if (sPool.size() < MAX_POOL_SIZE) {
138d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            synchronized (sPool) {
139d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren                sPool.offer(this);
140d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            }
141d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        }
142d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    }
143d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
144d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    /**
145d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     * Parcelable.Creator that instantiates NotificationVisibility objects
146d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren     */
147d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    public static final Parcelable.Creator<NotificationVisibility> CREATOR
148d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            = new Parcelable.Creator<NotificationVisibility>()
149d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    {
150d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        public NotificationVisibility createFromParcel(Parcel parcel)
151d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        {
152d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            return obtain(parcel);
153d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        }
154d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
155d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        public NotificationVisibility[] newArray(int size)
156d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        {
157d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren            return new NotificationVisibility[size];
158d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren        }
159d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren    };
160d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren}
161d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren
162