blob: 24bb789c3cc59f6fcdb44bbd7f844432b1e86bb7 [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 com.android.internal.logging.nano.MetricsProto.MetricsEvent;
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 int sNexrId = 0;
public String key;
public int rank;
public int count;
public boolean visible = true;
/** The visible location of the notification, could be e.g. notification shade or HUN. */
public NotificationLocation location;
/*package*/ int id;
/**
* The UI location of the notification.
*
* There is a one-to-one mapping between this enum and
* MetricsProto.MetricsEvent.NotificationLocation.
*/
public enum NotificationLocation {
LOCATION_UNKNOWN(MetricsEvent.LOCATION_UNKNOWN),
LOCATION_FIRST_HEADS_UP(MetricsEvent.LOCATION_FIRST_HEADS_UP), // visible heads-up
LOCATION_HIDDEN_TOP(MetricsEvent.LOCATION_HIDDEN_TOP), // hidden/scrolled away on the top
LOCATION_MAIN_AREA(MetricsEvent.LOCATION_MAIN_AREA), // visible in the shade
// in the bottom stack, and peeking
LOCATION_BOTTOM_STACK_PEEKING(MetricsEvent.LOCATION_BOTTOM_STACK_PEEKING),
// in the bottom stack, and hidden
LOCATION_BOTTOM_STACK_HIDDEN(MetricsEvent.LOCATION_BOTTOM_STACK_HIDDEN),
LOCATION_GONE(MetricsEvent.LOCATION_GONE); // the view isn't laid out at all
private final int mMetricsEventNotificationLocation;
NotificationLocation(int metricsEventNotificationLocation) {
mMetricsEventNotificationLocation = metricsEventNotificationLocation;
}
/**
* Returns the field from MetricsEvent.NotificationLocation that corresponds to this object.
*/
public int toMetricsEventEnum() {
return mMetricsEventNotificationLocation;
}
}
private NotificationVisibility() {
id = sNexrId++;
}
private NotificationVisibility(String key, int rank, int count, boolean visible,
NotificationLocation location) {
this();
this.key = key;
this.rank = rank;
this.count = count;
this.visible = visible;
this.location = location;
}
@Override
public String toString() {
return "NotificationVisibility(id=" + id
+ " key=" + key
+ " rank=" + rank
+ " count=" + count
+ (visible?" visible":"")
+ " location=" + location.name()
+ " )";
}
@Override
public NotificationVisibility clone() {
return obtain(this.key, this.rank, this.count, this.visible, this.location);
}
@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.count);
out.writeInt(this.visible ? 1 : 0);
out.writeString(this.location.name());
}
private void readFromParcel(Parcel in) {
this.key = in.readString();
this.rank = in.readInt();
this.count = in.readInt();
this.visible = in.readInt() != 0;
this.location = NotificationLocation.valueOf(in.readString());
}
/**
* Create a new NotificationVisibility object.
*/
public static NotificationVisibility obtain(String key, int rank, int count, boolean visible) {
return obtain(key, rank, count, visible,
NotificationVisibility.NotificationLocation.LOCATION_UNKNOWN);
}
/**
* Create a new NotificationVisibility object.
*/
public static NotificationVisibility obtain(String key, int rank, int count, boolean visible,
NotificationLocation location) {
NotificationVisibility vo = obtain();
vo.key = key;
vo.rank = rank;
vo.count = count;
vo.visible = visible;
vo.location = location;
return vo;
}
private static NotificationVisibility obtain(Parcel in) {
NotificationVisibility vo = obtain();
vo.readFromParcel(in);
return vo;
}
private static NotificationVisibility obtain() {
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() {
// With a modern GC, this is no longer useful for objects this small.
}
/**
* 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];
}
};
}