package com.android.systemui.statusbar.phone;
import android.annotation.NonNull;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
import com.android.systemui.doze.DozeHost;
import com.android.systemui.doze.DozeLog;
public class DozeScrimController {
private static final String TAG = "DozeScrimController";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private final DozeParameters mDozeParameters;
private final Handler mHandler = new Handler();
private final ScrimController mScrimController;
private boolean mDozing;
private DozeHost.PulseCallback mPulseCallback;
private int mPulseReason;
private boolean mFullyPulsing;
private final ScrimController.Callback mScrimCallback = new ScrimController.Callback() {
@Override
public void onDisplayBlanked() {
if (DEBUG) {
Log.d(TAG, "Pulse in, mDozing=" + mDozing + " mPulseReason="
+ DozeLog.pulseReasonToString(mPulseReason));
}
if (!mDozing) {
return;
}
pulseStarted();
}
@Override
public void onFinished() {
if (DEBUG) {
Log.d(TAG, "Pulse in finished, mDozing=" + mDozing);
}
if (!mDozing) {
return;
}
mHandler.postDelayed(mPulseOut, mDozeParameters.getPulseVisibleDuration());
mHandler.postDelayed(mPulseOutExtended,
mDozeParameters.getPulseVisibleDurationExtended());
mFullyPulsing = true;
}
@Override
public void onCancelled() {
pulseFinished();
}
};
public DozeScrimController(ScrimController scrimController, Context context,
DozeParameters dozeParameters) {
mScrimController = scrimController;
mDozeParameters = dozeParameters;
}
public void setDozing(boolean dozing) {
if (mDozing == dozing) return;
mDozing = dozing;
if (!mDozing) {
cancelPulsing();
}
}
public void pulse(@NonNull DozeHost.PulseCallback callback, int reason) {
if (callback == null) {
throw new IllegalArgumentException("callback must not be null");
}
if (!mDozing || mPulseCallback != null) {
if (DEBUG) {
Log.d(TAG, "Pulse supressed. Dozing: " + mDozeParameters + " had callback? "
+ (mPulseCallback != null));
}
callback.onPulseFinished();
return;
}
mPulseCallback = callback;
mPulseReason = reason;
mScrimController.transitionTo(ScrimState.PULSING, mScrimCallback);
}
public void pulseOutNow() {
if (mPulseCallback != null && mFullyPulsing) {
mPulseOut.run();
}
}
public boolean isPulsing() {
return mPulseCallback != null;
}
public boolean isDozing() {
return mDozing;
}
public void extendPulse() {
mHandler.removeCallbacks(mPulseOut);
}
private void cancelPulsing() {
if (mPulseCallback != null) {
if (DEBUG) Log.d(TAG, "Cancel pulsing");
mFullyPulsing = false;
mHandler.removeCallbacks(mPulseOut);
mHandler.removeCallbacks(mPulseOutExtended);
pulseFinished();
}
}
private void pulseStarted() {
DozeLog.tracePulseStart(mPulseReason);
if (mPulseCallback != null) {
mPulseCallback.onPulseStarted();
}
}
private void pulseFinished() {
DozeLog.tracePulseFinish();
if (mPulseCallback != null) {
mPulseCallback.onPulseFinished();
mPulseCallback = null;
}
}
private final Runnable mPulseOutExtended = new Runnable() {
@Override
public void run() {
mHandler.removeCallbacks(mPulseOut);
mPulseOut.run();
}
};
private final Runnable mPulseOut = new Runnable() {
@Override
public void run() {
mFullyPulsing = false;
mHandler.removeCallbacks(mPulseOut);
mHandler.removeCallbacks(mPulseOutExtended);
if (DEBUG) Log.d(TAG, "Pulse out, mDozing=" + mDozing);
if (!mDozing) return;
mScrimController.transitionTo(ScrimState.AOD,
new ScrimController.Callback() {
@Override
public void onDisplayBlanked() {
pulseFinished();
}
});
}
};
}