/*
|
* Copyright (C) 2014 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.server.notification;
|
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* Represents future work required to extract signals from notifications for ranking.
|
*
|
* {@hide}
|
*/
|
public abstract class RankingReconsideration implements Runnable {
|
private static final long IMMEDIATE = 0l;
|
|
private static final int START = 0;
|
private static final int RUNNING = 1;
|
private static final int DONE = 2;
|
private static final int CANCELLED = 3;
|
|
private int mState;
|
private long mDelay;
|
protected String mKey;
|
|
public RankingReconsideration(String key) {
|
this(key, IMMEDIATE);
|
}
|
|
public RankingReconsideration(String key, long delay) {
|
mDelay = delay;
|
mKey = key;
|
mState = START;
|
}
|
|
public String getKey() {
|
return mKey;
|
}
|
|
public void run() {
|
if (mState == START) {
|
mState = RUNNING;
|
|
work();
|
|
mState = DONE;
|
synchronized (this) {
|
notifyAll();
|
}
|
}
|
}
|
|
public long getDelay(TimeUnit unit) {
|
return unit.convert(mDelay, TimeUnit.MILLISECONDS);
|
}
|
|
public boolean cancel(boolean mayInterruptIfRunning) {
|
if (mState == START) { // can't cancel if running or done
|
mState = CANCELLED;
|
return true;
|
}
|
return false;
|
}
|
|
public boolean isCancelled() {
|
return mState == CANCELLED;
|
}
|
|
public boolean isDone() {
|
return mState == DONE;
|
}
|
|
/**
|
* Analyse the notification. This will be called on a worker thread. To
|
* avoid concurrency issues, do not use held references to modify the
|
* {@link NotificationRecord}.
|
*/
|
public abstract void work();
|
|
/**
|
* Apply any computed changes to the notification record. This method will be
|
* called on the main service thread, synchronized on he mNotificationList.
|
* @param record The locked record to be updated.
|
*/
|
public abstract void applyChangesLocked(NotificationRecord record);
|
}
|