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.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 = {}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user