blob: 2139ad02e4f3f27308c56a9afe2db46f3ded3adb [file] [log] [blame]
/*
* Copyright (C) 2015 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 com.android.internal.statusbar;
import android.os.Message;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import java.util.ArrayDeque;
import java.util.Collection;
public class NotificationVisibility implements Parcelable {
private static final String TAG = "NoViz";
private static final int MAX_POOL_SIZE = 25;
private static ArrayDeque<NotificationVisibility> sPool = new ArrayDeque<>(MAX_POOL_SIZE);
private static int sNexrId = 0;
public String key;
public int rank;
public boolean visible = true;
/*package*/ int id;
private NotificationVisibility() {
id = sNexrId++;
}
private NotificationVisibility(String key, int rank, boolean visibile) {
this();
this.key = key;
this.rank = rank;
this.visible = visibile;
}
@Override
public String toString() {
return "NotificationVisibility(id=" + id
+ "key=" + key
+ " rank=" + rank
+ (visible?" visible":"")
+ " )";
}
@Override
public NotificationVisibility clone() {
return obtain(this.key, this.rank, this.visible);
}
@Override
public int hashCode() {
// allow lookups by key, which _should_ never be null.
return key == null ? 0 : key.hashCode();
}
@Override
public boolean equals(Object that) {
// allow lookups by key, which _should_ never be null.
if (that instanceof NotificationVisibility) {
NotificationVisibility thatViz = (NotificationVisibility) that;
return (key == null && thatViz.key == null) || key.equals(thatViz.key);
}
return false;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(this.key);
out.writeInt(this.rank);
out.writeInt(this.visible ? 1 : 0);
}
private void readFromParcel(Parcel in) {
this.key = in.readString();
this.rank = in.readInt();
this.visible = in.readInt() != 0;
}
/**
* Return a new NotificationVisibility instance from the global pool. Allows us to
* avoid allocating new objects in many cases.
*/
public static NotificationVisibility obtain(String key, int rank, boolean visible) {
NotificationVisibility vo = obtain();
vo.key = key;
vo.rank = rank;
vo.visible = visible;
return vo;
}
private static NotificationVisibility obtain(Parcel in) {
NotificationVisibility vo = obtain();
vo.readFromParcel(in);
return vo;
}
private static NotificationVisibility obtain() {
synchronized (sPool) {
if (!sPool.isEmpty()) {
return sPool.poll();
}
}
return new NotificationVisibility();
}
/**
* Return a NotificationVisibility instance to the global pool.
* <p>
* You MUST NOT touch the NotificationVisibility after calling this function because it has
* effectively been freed.
* </p>
*/
public void recycle() {
if (key == null) {
// do nothing on multiple recycles
return;
}
key = null;
if (sPool.size() < MAX_POOL_SIZE) {
synchronized (sPool) {
sPool.offer(this);
}
}
}
/**
* Parcelable.Creator that instantiates NotificationVisibility objects
*/
public static final Parcelable.Creator<NotificationVisibility> CREATOR
= new Parcelable.Creator<NotificationVisibility>()
{
public NotificationVisibility createFromParcel(Parcel parcel)
{
return obtain(parcel);
}
public NotificationVisibility[] newArray(int size)
{
return new NotificationVisibility[size];
}
};
}