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