blob: 3ef5b665d7785e16d7048d0ca58af5941e7a6415 [file] [log] [blame]
/*
* Copyright (C) 2020 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.row.wrapper
import android.content.Context
import android.view.View
import android.view.ViewGroup
import com.android.internal.widget.CachingIconView
import com.android.internal.widget.ConversationLayout
import com.android.internal.widget.MessagingLinearLayout
import com.android.systemui.R
import com.android.systemui.statusbar.notification.NotificationUtils
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.row.wrapper.NotificationMessagingTemplateViewWrapper.setCustomImageMessageTransform
/**
* Wraps a notification containing a conversation template
*/
class NotificationConversationTemplateViewWrapper constructor(
ctx: Context,
view: View,
row: ExpandableNotificationRow
) : NotificationTemplateViewWrapper(ctx, view, row) {
private val minHeightWithActions: Int = NotificationUtils.getFontScaledHeight(
ctx,
R.dimen.notification_messaging_actions_min_height
)
private val conversationLayout: ConversationLayout = view as ConversationLayout
private lateinit var conversationIconView: CachingIconView
private lateinit var conversationBadgeBg: View
private lateinit var expandBtn: View
private lateinit var expandBtnContainer: View
private lateinit var imageMessageContainer: ViewGroup
private lateinit var messagingLinearLayout: MessagingLinearLayout
private lateinit var conversationTitleView: View
private lateinit var importanceRing: View
private lateinit var appName: View
private var facePileBottomBg: View? = null
private var facePileBottom: View? = null
private var facePileTop: View? = null
private fun resolveViews() {
messagingLinearLayout = conversationLayout.messagingLinearLayout
imageMessageContainer = conversationLayout.imageMessageContainer
with(conversationLayout) {
conversationIconView = requireViewById(com.android.internal.R.id.conversation_icon)
conversationBadgeBg =
requireViewById(com.android.internal.R.id.conversation_icon_badge_bg)
expandBtn = requireViewById(com.android.internal.R.id.expand_button)
expandBtnContainer = requireViewById(com.android.internal.R.id.expand_button_container)
importanceRing = requireViewById(com.android.internal.R.id.conversation_icon_badge_ring)
appName = requireViewById(com.android.internal.R.id.app_name_text)
conversationTitleView = requireViewById(com.android.internal.R.id.conversation_text)
facePileTop = findViewById(com.android.internal.R.id.conversation_face_pile_top)
facePileBottom = findViewById(com.android.internal.R.id.conversation_face_pile_bottom)
facePileBottomBg =
findViewById(com.android.internal.R.id.conversation_face_pile_bottom_background)
}
}
override fun onContentUpdated(row: ExpandableNotificationRow) {
// Reinspect the notification. Before the super call, because the super call also updates
// the transformation types and we need to have our values set by then.
resolveViews()
super.onContentUpdated(row)
}
override fun updateTransformedTypes() {
// This also clears the existing types
super.updateTransformedTypes()
mTransformationHelper.addTransformedView(TRANSFORMING_VIEW_TITLE, conversationTitleView)
addTransformedViews(
messagingLinearLayout,
appName
)
setCustomImageMessageTransform(mTransformationHelper, imageMessageContainer)
addViewsTransformingToSimilar(
conversationIconView,
conversationBadgeBg,
expandBtn,
importanceRing,
facePileTop,
facePileBottom,
facePileBottomBg
)
}
override fun getShelfTransformationTarget(): View? =
if (conversationLayout.isImportantConversation)
if (conversationIconView.visibility != View.GONE)
conversationIconView
else
// A notification with a fallback icon was set to important. Currently
// the transformation doesn't work for these and needs to be fixed.
// In the meantime those are using the icon.
super.getShelfTransformationTarget()
else
super.getShelfTransformationTarget()
override fun setRemoteInputVisible(visible: Boolean) =
conversationLayout.showHistoricMessages(visible)
override fun updateExpandability(
expandable: Boolean,
onClickListener: View.OnClickListener,
requestLayout: Boolean
) = conversationLayout.updateExpandability(expandable, onClickListener)
override fun disallowSingleClick(x: Float, y: Float): Boolean {
val isOnExpandButton = expandBtnContainer.visibility == View.VISIBLE &&
isOnView(expandBtnContainer, x, y)
return isOnExpandButton || super.disallowSingleClick(x, y)
}
override fun getMinLayoutHeight(): Int =
if (mActionsContainer != null && mActionsContainer.visibility != View.GONE)
minHeightWithActions
else
super.getMinLayoutHeight()
}