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.app.Activity
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.view.LayoutInflater
import android.widget.FrameLayout
import androidx.compose.animation.AnimatedVisibility 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.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember 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.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 androidx.fragment.app.DialogFragment
import org.signal.core.ui.compose.Previews import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.SignalPreview import org.signal.core.ui.compose.SignalPreview
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.megaphone.Megaphone import org.thoughtcrime.securesms.megaphone.Megaphone
import org.thoughtcrime.securesms.megaphone.MegaphoneActionController 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.megaphone.Megaphones
import org.thoughtcrime.securesms.util.visible
data class MainMegaphoneState( data class MainMegaphoneState(
val megaphone: Megaphone = Megaphone.NONE, val megaphone: Megaphone = Megaphone.NONE,
val isDisplayingArchivedChats: Boolean = false, val isDisplayingArchivedChats: Boolean = false,
val isSearchOpen: Boolean = false, private val isSearchOpen: Boolean = false,
val isInActionMode: Boolean = false private val isInActionMode: Boolean = false
) ) {
fun isVisible(): Boolean = !isDisplayingArchivedChats && !isSearchOpen && !isInActionMode
}
object EmptyMegaphoneActionController : MegaphoneActionController { object EmptyMegaphoneActionController : MegaphoneActionController {
override fun onMegaphoneNavigationRequested(intent: Intent) = Unit override fun onMegaphoneNavigationRequested(intent: Intent) = Unit
@@ -61,40 +50,21 @@ fun MainMegaphoneContainer(
onMegaphoneVisible: (Megaphone) -> Unit onMegaphoneVisible: (Megaphone) -> Unit
) { ) {
val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE
val visible = remember(isLandscape, state.isDisplayingArchivedChats, state.isSearchOpen, state.isInActionMode, state.megaphone) { val visible = remember(isLandscape, state) {
!(state.megaphone == Megaphone.NONE || state.megaphone.style == Megaphone.Style.FULLSCREEN || state.isDisplayingArchivedChats || isLandscape || state.isSearchOpen || state.isInActionMode) !isLandscape && state.isVisible()
} }
AnimatedVisibility(visible = visible) { AnimatedVisibility(visible = visible) {
if (LocalInspectionMode.current) { MegaphoneComponent(
Box( megaphone = state.megaphone,
modifier = Modifier megaphoneActionController = controller
.background(color = Color.Red) )
.fillMaxWidth()
.height(80.dp)
)
} 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) { LaunchedEffect(state.megaphone, state.isDisplayingArchivedChats, isLandscape) {
if (state.megaphone == Megaphone.NONE || state.isDisplayingArchivedChats || isLandscape) { if (!(state.megaphone == Megaphone.NONE || state.isDisplayingArchivedChats || isLandscape)) {
return@LaunchedEffect onMegaphoneVisible(state.megaphone)
} }
if (state.megaphone.style == Megaphone.Style.FULLSCREEN) {
state.megaphone.onVisibleListener?.onEvent(state.megaphone, controller)
}
onMegaphoneVisible(state.megaphone)
} }
} }
@@ -103,7 +73,9 @@ fun MainMegaphoneContainer(
private fun MainMegaphoneContainerPreview() { private fun MainMegaphoneContainerPreview() {
Previews.Preview { Previews.Preview {
MainMegaphoneContainer( MainMegaphoneContainer(
state = MainMegaphoneState(), state = MainMegaphoneState(
megaphone = Megaphone.Builder(Megaphones.Event.ONBOARDING, Megaphone.Style.ONBOARDING).build()
),
controller = EmptyMegaphoneActionController, controller = EmptyMegaphoneActionController,
onMegaphoneVisible = {} onMegaphoneVisible = {}
) )