mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-23 12:38:33 +00:00
Add compose megaphone stuff to MainBottomChrome composable.
This commit is contained in:
@@ -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,49 +50,32 @@ 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
|
||||
@Composable
|
||||
private fun MainMegaphoneContainerPreview() {
|
||||
Previews.Preview {
|
||||
MainMegaphoneContainer(
|
||||
state = MainMegaphoneState(),
|
||||
state = MainMegaphoneState(
|
||||
megaphone = Megaphone.Builder(Megaphones.Event.ONBOARDING, Megaphone.Style.ONBOARDING).build()
|
||||
),
|
||||
controller = EmptyMegaphoneActionController,
|
||||
onMegaphoneVisible = {}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user