session-android/app/src/main/java/org/thoughtcrime/securesms/onboarding/messagenotifications/MessageNotificationsActivit...

169 lines
6.3 KiB
Kotlin

package org.thoughtcrime.securesms.onboarding.messagenotifications
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
import androidx.annotation.StringRes
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedButton
import androidx.compose.material.RadioButton
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import dagger.hilt.android.AndroidEntryPoint
import network.loki.messenger.R
import org.session.libsession.utilities.TextSecurePreferences
import org.thoughtcrime.securesms.ApplicationContext
import org.thoughtcrime.securesms.BaseActionBarActivity
import org.thoughtcrime.securesms.home.HomeActivity
import org.thoughtcrime.securesms.notifications.PushRegistry
import org.thoughtcrime.securesms.ui.AppTheme
import org.thoughtcrime.securesms.ui.OutlineButton
import org.thoughtcrime.securesms.ui.PreviewTheme
import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider
import org.thoughtcrime.securesms.ui.h8
import org.thoughtcrime.securesms.ui.h9
import org.thoughtcrime.securesms.ui.session_accent
import org.thoughtcrime.securesms.ui.small
import org.thoughtcrime.securesms.util.setUpActionBarSessionLogo
import javax.inject.Inject
@AndroidEntryPoint
class MessageNotificationsActivity : BaseActionBarActivity() {
@Inject lateinit var pushRegistry: PushRegistry
private val viewModel: MessageNotificationsViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setUpActionBarSessionLogo(true)
TextSecurePreferences.setHasSeenWelcomeScreen(this, true)
ComposeView(this)
.apply { setContent { MessageNotifications() } }
.let(::setContentView)
}
@Composable
private fun MessageNotifications() {
val state by viewModel.stateFlow.collectAsState()
AppTheme {
MessageNotifications(state, viewModel::setEnabled, ::register)
}
}
private fun register() {
TextSecurePreferences.setPushEnabled(this, viewModel.stateFlow.value.pushEnabled)
ApplicationContext.getInstance(this).startPollingIfNeeded()
pushRegistry.refresh(true)
Intent(this, HomeActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
putExtra(HomeActivity.FROM_ONBOARDING, true)
}.also(::startActivity)
}
}
@Preview
@Composable
fun MessageNotificationsPreview(
@PreviewParameter(ThemeResPreviewParameterProvider::class) themeResId: Int
) {
PreviewTheme(themeResId) {
MessageNotifications()
}
}
@Composable
fun MessageNotifications(
state: MessageNotificationsState = MessageNotificationsState(),
setEnabled: (Boolean) -> Unit = {},
onContinue: () -> Unit = {}
) {
Column(Modifier.padding(horizontal = 32.dp)) {
Spacer(Modifier.weight(1f))
Text("Message notifications", style = MaterialTheme.typography.h4)
Spacer(Modifier.height(16.dp))
Text("There are two ways Session can notify you of new messages.")
Spacer(Modifier.height(16.dp))
NotificationRadioButton(
R.string.activity_pn_mode_fast_mode,
R.string.activity_pn_mode_fast_mode_explanation,
R.string.activity_pn_mode_recommended_option_tag,
selected = state.pushEnabled,
onClick = { setEnabled(true) }
)
Spacer(Modifier.height(16.dp))
NotificationRadioButton(
R.string.activity_pn_mode_slow_mode,
R.string.activity_pn_mode_slow_mode_explanation,
selected = state.pushDisabled,
onClick = { setEnabled(false) }
)
Spacer(Modifier.weight(1f))
OutlineButton(
stringResource(R.string.continue_2),
modifier = Modifier
.align(Alignment.CenterHorizontally)
.width(262.dp),
onClick = onContinue
)
Spacer(modifier = Modifier.height(12.dp))
}
}
@Composable
fun NotificationRadioButton(
@StringRes title: Int,
@StringRes explanation: Int,
@StringRes tag: Int? = null,
selected: Boolean = false,
onClick: () -> Unit = {}
) {
Row {
OutlinedButton(
onClick = onClick,
modifier = Modifier.weight(1f),
colors = ButtonDefaults.outlinedButtonColors(backgroundColor = MaterialTheme.colors.background, contentColor = Color.White),
border = if (selected) BorderStroke(ButtonDefaults.OutlinedBorderSize, session_accent) else ButtonDefaults.outlinedBorder,
shape = RoundedCornerShape(8.dp)
) {
Column(
verticalArrangement = Arrangement.spacedBy(6.dp)
) {
Text(stringResource(title), style = MaterialTheme.typography.h8)
Text(stringResource(explanation), style = MaterialTheme.typography.small)
tag?.let { Text(stringResource(it), color = session_accent, style = MaterialTheme.typography.h9) }
}
}
RadioButton(selected = selected, modifier = Modifier.align(Alignment.CenterVertically), onClick = onClick)
}
}
fun Context.startPNModeActivity(flags: Int = 0) {
Intent(this, MessageNotificationsActivity::class.java)
.also { it.flags = flags }
.also(::startActivity)
}