Add compose megaphone stuff to MainBottomChrome composable.

This commit is contained in:
Alex Hart
2025-04-08 12:47:17 -03:00
committed by Michelle Tang
parent 65e7c4c053
commit b0cd27e203

View File

@@ -8,38 +8,27 @@ package org.thoughtcrime.securesms.main
import android.app.Activity
import android.content.Intent
import android.content.res.Configuration
import android.view.LayoutInflater
import android.widget.FrameLayout
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.fragment.app.DialogFragment
import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.SignalPreview
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.megaphone.Megaphone
import org.thoughtcrime.securesms.megaphone.MegaphoneActionController
import org.thoughtcrime.securesms.megaphone.MegaphoneViewBuilder
import org.thoughtcrime.securesms.megaphone.MegaphoneComponent
import org.thoughtcrime.securesms.megaphone.Megaphones
import org.thoughtcrime.securesms.util.visible
data class MainMegaphoneState(
val megaphone: Megaphone = Megaphone.NONE,
val isDisplayingArchivedChats: Boolean = false,
val isSearchOpen: Boolean = false,
val isInActionMode: Boolean = false
)
private val isSearchOpen: Boolean = false,
private val isInActionMode: Boolean = false
) {
fun isVisible(): Boolean = !isDisplayingArchivedChats && !isSearchOpen && !isInActionMode
}
object EmptyMegaphoneActionController : MegaphoneActionController {
override fun onMegaphoneNavigationRequested(intent: Intent) = Unit
@@ -61,41 +50,22 @@ fun MainMegaphoneContainer(
onMegaphoneVisible: (Megaphone) -> Unit
) {
val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE
val visible = remember(isLandscape, state.isDisplayingArchivedChats, state.isSearchOpen, state.isInActionMode, state.megaphone) {
!(state.megaphone == Megaphone.NONE || state.megaphone.style == Megaphone.Style.FULLSCREEN || state.isDisplayingArchivedChats || isLandscape || state.isSearchOpen || state.isInActionMode)
val visible = remember(isLandscape, state) {
!isLandscape && state.isVisible()
}
AnimatedVisibility(visible = visible) {
if (LocalInspectionMode.current) {
Box(
modifier = Modifier
.background(color = Color.Red)
.fillMaxWidth()
.height(80.dp)
MegaphoneComponent(
megaphone = state.megaphone,
megaphoneActionController = controller
)
} else {
AndroidView(factory = { context ->
LayoutInflater.from(context).inflate(R.layout.conversation_list_megaphone_container, null, false) as FrameLayout
}) { megaphoneContainer ->
val view = requireNotNull(MegaphoneViewBuilder.build(megaphoneContainer.context, state.megaphone, controller))
megaphoneContainer.removeAllViews()
megaphoneContainer.addView(view)
megaphoneContainer.visible = true
}
}
}
LaunchedEffect(state.megaphone, state.isDisplayingArchivedChats, isLandscape) {
if (state.megaphone == Megaphone.NONE || state.isDisplayingArchivedChats || isLandscape) {
return@LaunchedEffect
}
if (state.megaphone.style == Megaphone.Style.FULLSCREEN) {
state.megaphone.onVisibleListener?.onEvent(state.megaphone, controller)
}
if (!(state.megaphone == Megaphone.NONE || state.isDisplayingArchivedChats || isLandscape)) {
onMegaphoneVisible(state.megaphone)
}
}
}
@SignalPreview
@@ -103,7 +73,9 @@ fun MainMegaphoneContainer(
private fun MainMegaphoneContainerPreview() {
Previews.Preview {
MainMegaphoneContainer(
state = MainMegaphoneState(),
state = MainMegaphoneState(
megaphone = Megaphone.Builder(Megaphones.Event.ONBOARDING, Megaphone.Style.ONBOARDING).build()
),
controller = EmptyMegaphoneActionController,
onMegaphoneVisible = {}
)