1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package com.android.systemui.statusbar.notification.collection.coordinator
18 
19 import com.android.systemui.statusbar.notification.collection.ListEntry
20 import com.android.systemui.statusbar.notification.collection.NotifPipeline
21 import com.android.systemui.statusbar.notification.collection.NotificationEntry
22 import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
23 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter
24 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
25 import com.android.systemui.statusbar.notification.collection.render.NodeController
26 import com.android.systemui.statusbar.notification.dagger.PeopleHeader
27 import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier
28 import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON
29 import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE
30 import javax.inject.Inject
31 
32 /**
33  * A Conversation/People Coordinator that:
34  * - Elevates important conversation notifications
35  * - Puts conversations into its own people section. @see [NotifCoordinators] for section ordering.
36  */
37 @CoordinatorScope
38 class ConversationCoordinator @Inject constructor(
39     private val peopleNotificationIdentifier: PeopleNotificationIdentifier,
40     @PeopleHeader peopleHeaderController: NodeController
41 ) : Coordinator {
42 
43     private val notificationPromoter = object : NotifPromoter(TAG) {
44         override fun shouldPromoteToTopLevel(entry: NotificationEntry): Boolean {
45             return entry.channel?.isImportantConversation == true
46         }
47     }
48 
49     val sectioner = object : NotifSectioner("People", BUCKET_PEOPLE) {
50         override fun isInSection(entry: ListEntry): Boolean =
51                 isConversation(entry.representativeEntry!!)
52         override fun getHeaderNodeController() =
53                 // TODO: remove SHOW_ALL_SECTIONS, this redundant method, and peopleHeaderController
54                 if (RankingCoordinator.SHOW_ALL_SECTIONS) peopleHeaderController else null
55     }
56 
57     override fun attach(pipeline: NotifPipeline) {
58         pipeline.addPromoter(notificationPromoter)
59     }
60 
61     private fun isConversation(entry: NotificationEntry): Boolean =
62         peopleNotificationIdentifier.getPeopleNotificationType(entry) != TYPE_NON_PERSON
63 
64     companion object {
65         private const val TAG = "ConversationCoordinator"
66     }
67 }
68