blob: 920bbe96b33b2d10443093a9301a73cae037e633 [file] [log] [blame]
/*
* Copyright (C) 2023 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.systemui.statusbar.notification.interruption
import com.android.systemui.statusbar.notification.collection.NotificationEntry
/**
* Decides whether a notification should visually interrupt the user in various ways.
*
* These include displaying the notification as heads-up (peeking while the device is awake or
* pulsing while the device is dozing), displaying the notification as a bubble, and launching a
* full-screen intent for the notification.
*/
interface VisualInterruptionDecisionProvider {
/**
* Represents the decision to visually interrupt or not.
*
* Used for heads-up and bubble decisions; subclassed by [FullScreenIntentDecision] for
* full-screen intent decisions.
*
* @property[shouldInterrupt] whether a visual interruption should be triggered
* @property[logReason] a log-friendly string explaining the reason for the decision; should be
* used *only* for logging, not decision-making
*/
interface Decision {
val shouldInterrupt: Boolean
val logReason: String
}
/**
* Represents the decision to launch a full-screen intent for a notification or not.
*
* @property[wouldInterruptWithoutDnd] whether a full-screen intent should not be launched only
* because Do Not Disturb has suppressed it
*/
interface FullScreenIntentDecision : Decision {
val wouldInterruptWithoutDnd: Boolean
}
/**
* Adds a [component][suppressor] that can suppress visual interruptions.
*
* This class may call suppressors in any order.
*
* @param[suppressor] the suppressor to add
*/
fun addLegacySuppressor(suppressor: NotificationInterruptSuppressor)
/**
* Removes a [component][suppressor] that can suppress visual interruptions.
*
* @param[suppressor] the suppressor to remove
*/
fun removeLegacySuppressor(suppressor: NotificationInterruptSuppressor)
/**
* Decides whether a [notification][entry] should display as heads-up or not, but does not log
* that decision.
*
* @param[entry] the notification that this decision is about
* @return the decision to display that notification as heads-up or not
*/
fun makeUnloggedHeadsUpDecision(entry: NotificationEntry): Decision
/**
* Decides whether a [notification][entry] should display as heads-up or not, and logs that
* decision.
*
* If the device is awake, the decision will consider whether the notification should "peek"
* (slide in from the top of the screen over the current activity).
*
* If the device is dozing, the decision will consider whether the notification should "pulse"
* (wake the screen up and display the ambient view of the notification).
*
* @see[makeUnloggedHeadsUpDecision]
*
* @param[entry] the notification that this decision is about
* @return the decision to display that notification as heads-up or not
*/
fun makeAndLogHeadsUpDecision(entry: NotificationEntry): Decision
/**
* Decides whether a [notification][entry] should launch a full-screen intent or not, but does
* not log that decision.
*
* The returned decision can be logged by passing it to [logFullScreenIntentDecision].
*
* @see[makeAndLogHeadsUpDecision]
*
* @param[entry] the notification that this decision is about
* @return the decision to launch a full-screen intent for that notification or not
*/
fun makeUnloggedFullScreenIntentDecision(entry: NotificationEntry): FullScreenIntentDecision
/**
* Logs a previous [decision] to launch a full-screen intent or not.
*
* @param[decision] the decision to log
*/
fun logFullScreenIntentDecision(decision: FullScreenIntentDecision)
/**
* Decides whether a [notification][entry] should display as a bubble or not.
*
* @param[entry] the notification that this decision is about
* @return the decision to display that notification as a bubble or not
*/
fun makeAndLogBubbleDecision(entry: NotificationEntry): Decision
}