diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/FakeChatView.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/FakeChatView.kt deleted file mode 100644 index dcd4d783e..000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/FakeChatView.kt +++ /dev/null @@ -1,79 +0,0 @@ -package org.thoughtcrime.securesms.onboarding - -import android.animation.FloatEvaluator -import android.animation.ValueAnimator -import android.content.Context -import android.os.Handler -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.widget.ScrollView -import network.loki.messenger.R -import network.loki.messenger.databinding.ViewFakeChatBinding -import org.thoughtcrime.securesms.util.disableClipping - -class FakeChatView : ScrollView { - private lateinit var binding: ViewFakeChatBinding - // region Settings - private val spacing = context.resources.getDimension(R.dimen.medium_spacing) - private val startDelay: Long = 1000 - private val delayBetweenMessages: Long = 1500 - private val animationDuration: Long = 400 - // endregion - - // region Lifecycle - constructor(context: Context) : super(context) { - setUpViewHierarchy() - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - setUpViewHierarchy() - } - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { - setUpViewHierarchy() - } - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) { - setUpViewHierarchy() - } - - private fun setUpViewHierarchy() { - binding = ViewFakeChatBinding.inflate(LayoutInflater.from(context), this, true) - binding.root.disableClipping() - isVerticalScrollBarEnabled = false - } - // endregion - - // region Animation - fun startAnimating() { - listOf( binding.bubble1, binding.bubble2, binding.bubble3, binding.bubble4, binding.bubble5 ).forEach { it.alpha = 0.0f } - fun show(bubble: View) { - val animation = ValueAnimator.ofObject(FloatEvaluator(), 0.0f, 1.0f) - animation.duration = animationDuration - animation.addUpdateListener { animator -> - bubble.alpha = animator.animatedValue as Float - } - animation.start() - } - Handler().postDelayed({ - show(binding.bubble1) - Handler().postDelayed({ - show(binding.bubble2) - Handler().postDelayed({ - show(binding.bubble3) - smoothScrollTo(0, (binding.bubble1.height + spacing).toInt()) - Handler().postDelayed({ - show(binding.bubble4) - smoothScrollTo(0, (binding.bubble1.height + spacing).toInt() + (binding.bubble2.height + spacing).toInt()) - Handler().postDelayed({ - show(binding.bubble5) - smoothScrollTo(0, (binding.bubble1.height + spacing).toInt() + (binding.bubble2.height + spacing).toInt() + (binding.bubble3.height + spacing).toInt()) - }, delayBetweenMessages) - }, delayBetweenMessages) - }, delayBetweenMessages) - }, delayBetweenMessages) - }, startDelay) - } - // endregion -} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/LandingActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/LandingActivity.kt index c23d2adc2..1cc51f818 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/LandingActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/onboarding/LandingActivity.kt @@ -1,37 +1,130 @@ package org.thoughtcrime.securesms.onboarding -import android.content.Intent import android.os.Bundle -import network.loki.messenger.databinding.ActivityLandingBinding +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +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.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +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.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import org.session.libsession.utilities.TextSecurePreferences import org.thoughtcrime.securesms.BaseActionBarActivity import org.thoughtcrime.securesms.crypto.IdentityKeyUtil import org.thoughtcrime.securesms.onboarding.pickname.startPickDisplayNameActivity import org.thoughtcrime.securesms.service.KeyCachingService -import org.thoughtcrime.securesms.util.push +import org.thoughtcrime.securesms.ui.AppTheme +import org.thoughtcrime.securesms.ui.BorderlessButton +import org.thoughtcrime.securesms.ui.FilledButton +import org.thoughtcrime.securesms.ui.OutlineButton +import org.thoughtcrime.securesms.ui.classicDarkColors +import org.thoughtcrime.securesms.ui.session_accent import org.thoughtcrime.securesms.util.setUpActionBarSessionLogo class LandingActivity : BaseActionBarActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val binding = ActivityLandingBinding.inflate(layoutInflater) - setContentView(binding.root) setUpActionBarSessionLogo(true) - with(binding) { - fakeChatView.startAnimating() - registerButton.setOnClickListener { startPickDisplayNameActivity() } - restoreButton.setOnClickListener { link() } - linkButton.setOnClickListener { link() } - } + + ComposeView(this) + .apply { setContent { LandingScreen() } } + .let(::setContentView) + IdentityKeyUtil.generateIdentityKeyPair(this) TextSecurePreferences.setPasswordDisabled(this, true) // AC: This is a temporary workaround to trick the old code that the screen is unlocked. KeyCachingService.setMasterSecret(applicationContext, Object()) } - private fun link() { - val intent = Intent(this, LinkDeviceActivity::class.java) - push(intent) + @Preview + @Composable + private fun LandingScreen() { + AppTheme { + Column(modifier = Modifier.padding(horizontal = 36.dp)) { + Spacer(modifier = Modifier.weight(1f)) + Text("Privacy in your pocket.", modifier = Modifier.align(Alignment.CenterHorizontally), style = MaterialTheme.typography.h4, textAlign = TextAlign.Center) + Spacer(modifier = Modifier.height(24.dp)) + IncomingText("Welcome to Session \uD83D\uDC4B") + Spacer(modifier = Modifier.height(14.dp)) + OutgoingText("Session is engineered\nto protect your privacy.") + Spacer(modifier = Modifier.height(14.dp)) + IncomingText("You don’t even need a phone number to sign up. ") + Spacer(modifier = Modifier.height(14.dp)) + OutgoingText("Creating an account is \ninstant, free, and \nanonymous \uD83D\uDC47") + Spacer(modifier = Modifier.weight(1f)) + + OutlineButton(text = "Create account", modifier = Modifier + .width(262.dp) + .align(Alignment.CenterHorizontally)) { startPickDisplayNameActivity() } + Spacer(modifier = Modifier.height(14.dp)) + FilledButton(text = "I have an account", modifier = Modifier + .width(262.dp) + .align(Alignment.CenterHorizontally)) { startLinkDeviceActivity() } + Spacer(modifier = Modifier.height(8.dp)) + BorderlessButton( + text = "By using this service, you agree to our Terms of Service and Privacy Policy", + modifier = Modifier + .width(262.dp) + .align(Alignment.CenterHorizontally), + fontSize = 11.sp, + lineHeight = 13.sp + ) { } + Spacer(modifier = Modifier.height(8.dp)) + } + } } -} \ No newline at end of file + + @Composable + private fun IncomingText(text: String) { + ChatText( + text, + color = classicDarkColors[2] + ) + } + + @Composable + private fun ColumnScope.OutgoingText(text: String) { + ChatText( + text, + color = session_accent, + textColor = MaterialTheme.colors.primary, + modifier = Modifier.align(Alignment.End) + ) + } + + @Composable + private fun ChatText( + text: String, + color: Color, + textColor: Color = Color.Unspecified, + modifier: Modifier = Modifier + ) { + Text( + text, + fontSize = 16.sp, + lineHeight = 19.sp, + color = textColor, + modifier = modifier + .fillMaxWidth(0.666f) + .background( + color = color, + shape = RoundedCornerShape(size = 13.dp) + ) + .padding(horizontal = 16.dp, vertical = 12.dp) + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/LinkDeviceActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/LinkDeviceActivity.kt index db4f4be8c..0e06bdb93 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/LinkDeviceActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/onboarding/LinkDeviceActivity.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.onboarding import android.content.Context +import android.content.Intent import android.os.Bundle import android.text.InputType import android.view.LayoutInflater @@ -149,3 +150,7 @@ class RecoveryPhraseFragment : Fragment() { } } // endregion + +fun Context.startLinkDeviceActivity() { + Intent(this, LinkDeviceActivity::class.java).let(::startActivity) +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt index cd2e6317c..560375a39 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import com.google.accompanist.pager.HorizontalPagerIndicator @@ -58,11 +59,50 @@ fun OutlineButton(text: String, modifier: Modifier = Modifier, onClick: () -> Un contentColor = LocalExtraColors.current.prominentButtonColor, backgroundColor = MaterialTheme.colors.background ) - ){ + ) { Text(text = text) } } +@Composable +fun FilledButton(text: String, modifier: Modifier = Modifier, onClick: () -> Unit) { + OutlinedButton( + modifier = modifier.size(108.dp, 34.dp), + onClick = onClick, + shape = RoundedCornerShape(50), // = 50% percent + colors = ButtonDefaults.outlinedButtonColors( + contentColor = MaterialTheme.colors.background, + backgroundColor = LocalExtraColors.current.prominentButtonColor + ) + ) { + Text(text = text) + } +} + +@Composable +fun BorderlessButton( + text: String, + modifier: Modifier = Modifier, + fontSize: TextUnit = TextUnit.Unspecified, + lineHeight: TextUnit = TextUnit.Unspecified, + onClick: () -> Unit) { + TextButton( + onClick = onClick, + modifier = modifier, + shape = RoundedCornerShape(50), // = 50% percent + colors = ButtonDefaults.outlinedButtonColors( + contentColor = MaterialTheme.colors.onBackground, + backgroundColor = MaterialTheme.colors.background + ) + ) { + Text( + text = text, + fontSize = fontSize, + lineHeight = lineHeight + ) + } +} + @Composable fun ItemButton( text: String, diff --git a/app/src/main/res/drawable/session_logo.xml b/app/src/main/res/drawable/session_logo.xml index f88a4f21a..b2f931990 100644 --- a/app/src/main/res/drawable/session_logo.xml +++ b/app/src/main/res/drawable/session_logo.xml @@ -1,9 +1,9 @@ - - - - - + + diff --git a/app/src/main/res/layout-sw400dp/activity_landing.xml b/app/src/main/res/layout-sw400dp/activity_landing.xml deleted file mode 100644 index 5e5a36704..000000000 --- a/app/src/main/res/layout-sw400dp/activity_landing.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - -