diff --git a/app/build.gradle b/app/build.gradle
index 6dded367f7..574f6baeb6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -66,6 +66,7 @@ android {
dependencies {
implementation project(":libraries:designsystem")
implementation project(":libraries:matrix")
+ implementation project(":features:onboarding")
implementation project(":features:login")
implementation project(":features:roomlist")
implementation project(":features:messages")
diff --git a/app/src/main/java/io/element/android/x/MainActivity.kt b/app/src/main/java/io/element/android/x/MainActivity.kt
index 8b335cba6f..99937203d1 100644
--- a/app/src/main/java/io/element/android/x/MainActivity.kt
+++ b/app/src/main/java/io/element/android/x/MainActivity.kt
@@ -15,6 +15,7 @@ import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.rememberNavHostEngine
import io.element.android.x.designsystem.ElementXTheme
import io.element.android.x.destinations.LoginScreenNavigationDestination
+import io.element.android.x.destinations.OnBoardingScreenNavigationDestination
import kotlinx.coroutines.runBlocking
class MainActivity : ComponentActivity() {
@@ -37,7 +38,7 @@ private fun MainScreen(viewModel: MainViewModel) {
val navController = engine.rememberNavController()
val startRoute = runBlocking {
if (!viewModel.isLoggedIn()) {
- LoginScreenNavigationDestination
+ OnBoardingScreenNavigationDestination
} else {
viewModel.restoreSession()
NavGraphs.root.startRoute
diff --git a/app/src/main/java/io/element/android/x/Navigation.kt b/app/src/main/java/io/element/android/x/Navigation.kt
index cba9804824..6604136649 100644
--- a/app/src/main/java/io/element/android/x/Navigation.kt
+++ b/app/src/main/java/io/element/android/x/Navigation.kt
@@ -8,18 +8,33 @@ import com.ramcosta.composedestinations.navigation.popUpTo
import io.element.android.x.destinations.LoginScreenNavigationDestination
import io.element.android.x.destinations.MessagesScreenNavigationDestination
import io.element.android.x.destinations.RoomListScreenNavigationDestination
+import io.element.android.x.destinations.OnBoardingScreenNavigationDestination
import io.element.android.x.features.login.LoginScreen
import io.element.android.x.features.messages.MessagesScreen
+import io.element.android.x.features.onboarding.OnBoardingScreen
import io.element.android.x.features.roomlist.RoomListScreen
import io.element.android.x.matrix.core.RoomId
+@Destination
+@Composable
+fun OnBoardingScreenNavigation(navigator: DestinationsNavigator) {
+ OnBoardingScreen(
+ onSignUp = {
+ // TODO
+ },
+ onSignIn = {
+ navigator.navigate(LoginScreenNavigationDestination)
+ }
+ )
+}
+
@Destination
@Composable
fun LoginScreenNavigation(navigator: DestinationsNavigator) {
LoginScreen(
onLoginWithSuccess = {
navigator.navigate(RoomListScreenNavigationDestination) {
- popUpTo(LoginScreenNavigationDestination) {
+ popUpTo(OnBoardingScreenNavigationDestination) {
inclusive = true
}
}
@@ -36,7 +51,7 @@ fun RoomListScreenNavigation(navigator: DestinationsNavigator) {
navigator.navigate(MessagesScreenNavigationDestination(roomId = roomId.value))
},
onSuccessLogout = {
- navigator.navigate(LoginScreenNavigationDestination) {
+ navigator.navigate(OnBoardingScreenNavigationDestination) {
popUpTo(RoomListScreenNavigationDestination) {
inclusive = true
}
diff --git a/features/onboarding/.gitignore b/features/onboarding/.gitignore
new file mode 100644
index 0000000000..42afabfd2a
--- /dev/null
+++ b/features/onboarding/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/features/onboarding/build.gradle.kts b/features/onboarding/build.gradle.kts
new file mode 100644
index 0000000000..5c67c8df53
--- /dev/null
+++ b/features/onboarding/build.gradle.kts
@@ -0,0 +1,20 @@
+plugins {
+ id("io.element.android-compose")
+}
+
+android {
+ namespace = "io.element.android.x.features.onboarding"
+}
+
+dependencies {
+ implementation(project(":libraries:core"))
+ implementation(project(":libraries:elementresources"))
+ implementation(project(":libraries:designsystem"))
+ implementation(libs.mavericks.compose)
+ implementation(libs.timber)
+ implementation(libs.accompanist.pager)
+ implementation(libs.accompanist.pagerindicator)
+ testImplementation("junit:junit:4.13.2")
+ androidTestImplementation("androidx.test.ext:junit:1.1.3")
+ androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
+}
\ No newline at end of file
diff --git a/features/onboarding/consumer-rules.pro b/features/onboarding/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/features/onboarding/proguard-rules.pro b/features/onboarding/proguard-rules.pro
new file mode 100644
index 0000000000..ff59496d81
--- /dev/null
+++ b/features/onboarding/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.kts.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/features/onboarding/src/androidTest/java/io/element/android/x/features/login/ExampleInstrumentedTest.kt b/features/onboarding/src/androidTest/java/io/element/android/x/features/login/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000000..ba9eb96b15
--- /dev/null
+++ b/features/onboarding/src/androidTest/java/io/element/android/x/features/login/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package io.element.android.x.features.login
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("io.element.android.x.features.login.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/features/onboarding/src/main/AndroidManifest.xml b/features/onboarding/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..a5918e68ab
--- /dev/null
+++ b/features/onboarding/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingActions.kt b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingActions.kt
new file mode 100644
index 0000000000..d95c6f3a4a
--- /dev/null
+++ b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingActions.kt
@@ -0,0 +1,5 @@
+package io.element.android.x.features.onboarding
+
+sealed interface OnBoardingActions {
+ data class GoToPage(val page: Int) : OnBoardingActions
+}
diff --git a/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingScreen.kt b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingScreen.kt
new file mode 100644
index 0000000000..d71c9d9721
--- /dev/null
+++ b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingScreen.kt
@@ -0,0 +1,147 @@
+@file:OptIn(ExperimentalMaterial3Api::class)
+
+package io.element.android.x.features.onboarding
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.*
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment.Companion.CenterHorizontally
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.airbnb.mvrx.compose.collectAsState
+import com.airbnb.mvrx.compose.mavericksViewModel
+import com.google.accompanist.pager.ExperimentalPagerApi
+import com.google.accompanist.pager.HorizontalPager
+import com.google.accompanist.pager.HorizontalPagerIndicator
+import com.google.accompanist.pager.rememberPagerState
+import io.element.android.x.designsystem.components.VectorButton
+
+@Composable
+fun OnBoardingScreen(
+ viewModel: OnBoardingViewModel = mavericksViewModel(),
+ onSignUp: () -> Unit = { },
+ onSignIn: () -> Unit = { },
+) {
+ val state: OnBoardingViewState by viewModel.collectAsState()
+ OnBoardingContent(
+ state,
+ onSignUp = onSignUp,
+ onSignIn = onSignIn,
+ )
+}
+
+
+@OptIn(ExperimentalPagerApi::class)
+@Composable
+fun OnBoardingContent(
+ state: OnBoardingViewState,
+ onSignUp: () -> Unit,
+ onSignIn: () -> Unit,
+) {
+ val carrouselState = remember { SplashCarouselStateFactory().create() }
+ Surface(
+ color = MaterialTheme.colorScheme.background,
+ ) {
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(vertical = 16.dp)
+ ) {
+ Column(
+ modifier = Modifier.fillMaxSize(),
+ ) {
+ val pagerState = rememberPagerState()
+ // pagerState.scrollToPage(state.currentPage)
+ HorizontalPager(
+ modifier = Modifier.weight(1f),
+ count = carrouselState.items.size,
+ state = pagerState,
+ ) { page ->
+ // Our page content
+ OnBoardingPage(carrouselState.items[page])
+ }
+ HorizontalPagerIndicator(
+ pagerState = pagerState,
+ modifier = Modifier
+ .align(CenterHorizontally)
+ .padding(16.dp),
+ )
+ VectorButton(
+ text = "CREATE ACCOUNT",
+ onClick = {
+ onSignUp()
+ },
+ enabled = true,
+ modifier = Modifier
+ .align(CenterHorizontally)
+ .padding(top = 16.dp)
+ )
+ VectorButton(
+ text = "I ALREADY HAVE AN ACCOUNT",
+ onClick = {
+ onSignIn()
+ },
+ enabled = true,
+ modifier = Modifier
+ .align(CenterHorizontally)
+ .padding(top = 16.dp)
+ )
+ }
+ }
+ }
+}
+
+@Composable
+fun OnBoardingPage(
+ item: SplashCarouselState.Item,
+) {
+ Box {
+ /*
+ Image(
+ painterResource(id = item.pageBackground),
+ contentDescription = null,
+ modifier = Modifier.fillMaxSize()
+ )
+ */
+ Column(
+ modifier = Modifier.padding(vertical = 16.dp, horizontal = 32.dp)
+ ) {
+ Image(
+ painterResource(id = item.image),
+ contentDescription = null,
+ modifier = Modifier
+ .align(CenterHorizontally)
+ .size(192.dp)
+ .padding(16.dp)
+ )
+ Text(
+ text = stringResource(id = item.title),
+ modifier = Modifier
+ .fillMaxWidth()
+ .align(CenterHorizontally)
+ .padding(8.dp),
+ textAlign = TextAlign.Center,
+ fontWeight = FontWeight.Bold,
+ fontSize = 24.sp,
+ )
+ Text(
+ text = stringResource(id = item.body),
+ modifier = Modifier
+ .fillMaxWidth()
+ .align(CenterHorizontally),
+ textAlign = TextAlign.Center,
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingViewModel.kt b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingViewModel.kt
new file mode 100644
index 0000000000..a0d6ef359a
--- /dev/null
+++ b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingViewModel.kt
@@ -0,0 +1,19 @@
+package io.element.android.x.features.onboarding
+
+import com.airbnb.mvrx.MavericksViewModel
+
+class OnBoardingViewModel(initialState: OnBoardingViewState) :
+ MavericksViewModel(initialState) {
+
+ fun handle(action: OnBoardingActions) {
+ when (action) {
+ is OnBoardingActions.GoToPage -> handleGoToPage(action)
+ }
+ }
+
+ private fun handleGoToPage(action: OnBoardingActions.GoToPage) {
+ setState {
+ copy(currentPage = action.page)
+ }
+ }
+}
\ No newline at end of file
diff --git a/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingViewState.kt b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingViewState.kt
new file mode 100644
index 0000000000..0262bdd339
--- /dev/null
+++ b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/OnBoardingViewState.kt
@@ -0,0 +1,7 @@
+package io.element.android.x.features.onboarding
+
+import com.airbnb.mvrx.MavericksState
+
+data class OnBoardingViewState(
+ val currentPage: Int = 0,
+) : MavericksState
diff --git a/features/onboarding/src/main/java/io/element/android/x/features/onboarding/SplashCarouselState.kt b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/SplashCarouselState.kt
new file mode 100644
index 0000000000..f9b0bb9dfb
--- /dev/null
+++ b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/SplashCarouselState.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.x.features.onboarding
+
+import androidx.annotation.DrawableRes
+import androidx.annotation.StringRes
+
+data class SplashCarouselState(
+ val items: List-
+) {
+ data class Item(
+ @StringRes val title: Int,
+ @StringRes val body: Int,
+ @DrawableRes val image: Int,
+ @DrawableRes val pageBackground: Int
+ )
+}
diff --git a/features/onboarding/src/main/java/io/element/android/x/features/onboarding/SplashCarouselStateFactory.kt b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/SplashCarouselStateFactory.kt
new file mode 100644
index 0000000000..e80f591062
--- /dev/null
+++ b/features/onboarding/src/main/java/io/element/android/x/features/onboarding/SplashCarouselStateFactory.kt
@@ -0,0 +1,56 @@
+package io.element.android.x.features.onboarding
+
+import androidx.annotation.DrawableRes
+import io.element.android.x.element.resources.R as ElementR
+
+class SplashCarouselStateFactory() {
+ fun create(): SplashCarouselState {
+ val lightTheme = true
+ fun background(@DrawableRes lightDrawable: Int) =
+ if (lightTheme) lightDrawable else R.drawable.bg_color_background
+
+ fun hero(@DrawableRes lightDrawable: Int, @DrawableRes darkDrawable: Int) =
+ if (lightTheme) lightDrawable else darkDrawable
+ return SplashCarouselState(
+ listOf(
+ SplashCarouselState.Item(
+ ElementR.string.ftue_auth_carousel_secure_title,
+ ElementR.string.ftue_auth_carousel_secure_body,
+ hero(
+ R.drawable.ic_splash_conversations,
+ R.drawable.ic_splash_conversations_dark
+ ),
+ background(R.drawable.bg_carousel_page_1)
+ ),
+ SplashCarouselState.Item(
+ ElementR.string.ftue_auth_carousel_control_title,
+ ElementR.string.ftue_auth_carousel_control_body,
+ hero(R.drawable.ic_splash_control, R.drawable.ic_splash_control_dark),
+ background(R.drawable.bg_carousel_page_2)
+ ),
+ SplashCarouselState.Item(
+ ElementR.string.ftue_auth_carousel_encrypted_title,
+ ElementR.string.ftue_auth_carousel_encrypted_body,
+ hero(R.drawable.ic_splash_secure, R.drawable.ic_splash_secure_dark),
+ background(R.drawable.bg_carousel_page_3)
+ ),
+ SplashCarouselState.Item(
+ collaborationTitle(),
+ ElementR.string.ftue_auth_carousel_workplace_body,
+ hero(
+ R.drawable.ic_splash_collaboration,
+ R.drawable.ic_splash_collaboration_dark
+ ),
+ background(R.drawable.bg_carousel_page_4)
+ )
+ )
+ )
+ }
+
+ private fun collaborationTitle(): Int {
+ return when {
+ true -> R.string.cut_the_slack_from_teams
+ else -> ElementR.string.ftue_auth_carousel_workplace_title
+ }
+ }
+}
diff --git a/features/onboarding/src/main/res/drawable-hdpi/ic_splash_collaboration.webp b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_collaboration.webp
new file mode 100644
index 0000000000..7042e030d0
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_collaboration.webp differ
diff --git a/features/onboarding/src/main/res/drawable-hdpi/ic_splash_collaboration_dark.webp b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_collaboration_dark.webp
new file mode 100644
index 0000000000..6e4297183a
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_collaboration_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-hdpi/ic_splash_control.webp b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_control.webp
new file mode 100644
index 0000000000..82c04e402b
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_control.webp differ
diff --git a/features/onboarding/src/main/res/drawable-hdpi/ic_splash_control_dark.webp b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_control_dark.webp
new file mode 100644
index 0000000000..0d0c6ad78b
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_control_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-hdpi/ic_splash_conversations.webp b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_conversations.webp
new file mode 100644
index 0000000000..ee9604c1f1
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_conversations.webp differ
diff --git a/features/onboarding/src/main/res/drawable-hdpi/ic_splash_conversations_dark.webp b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_conversations_dark.webp
new file mode 100644
index 0000000000..c5cdf4e6fe
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_conversations_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-hdpi/ic_splash_secure.webp b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_secure.webp
new file mode 100644
index 0000000000..a880031ada
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_secure.webp differ
diff --git a/features/onboarding/src/main/res/drawable-hdpi/ic_splash_secure_dark.webp b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_secure_dark.webp
new file mode 100644
index 0000000000..65ef9f35ff
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-hdpi/ic_splash_secure_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_collaboration.webp b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_collaboration.webp
new file mode 100644
index 0000000000..d32d9f6026
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_collaboration.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_collaboration_dark.webp b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_collaboration_dark.webp
new file mode 100644
index 0000000000..04af9e2db4
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_collaboration_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_control.webp b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_control.webp
new file mode 100644
index 0000000000..972d91d5d0
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_control.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_control_dark.webp b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_control_dark.webp
new file mode 100644
index 0000000000..cbbea1ae87
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_control_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_conversations.webp b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_conversations.webp
new file mode 100644
index 0000000000..4057edfc66
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_conversations.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_conversations_dark.webp b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_conversations_dark.webp
new file mode 100644
index 0000000000..e3b7f22c1a
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_conversations_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_secure.webp b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_secure.webp
new file mode 100644
index 0000000000..b8c772bde2
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_secure.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_secure_dark.webp b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_secure_dark.webp
new file mode 100644
index 0000000000..d4c1f97652
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xhdpi/ic_splash_secure_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_collaboration.webp b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_collaboration.webp
new file mode 100644
index 0000000000..8feed1f9f9
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_collaboration.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_collaboration_dark.webp b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_collaboration_dark.webp
new file mode 100644
index 0000000000..02e44fbf44
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_collaboration_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_control.webp b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_control.webp
new file mode 100644
index 0000000000..99d4c4049d
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_control.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_control_dark.webp b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_control_dark.webp
new file mode 100644
index 0000000000..9afa384f27
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_control_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_conversations.webp b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_conversations.webp
new file mode 100644
index 0000000000..99a4c0c6f5
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_conversations.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_conversations_dark.webp b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_conversations_dark.webp
new file mode 100644
index 0000000000..361981eec7
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_conversations_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_secure.webp b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_secure.webp
new file mode 100644
index 0000000000..114421453e
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_secure.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_secure_dark.webp b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_secure_dark.webp
new file mode 100644
index 0000000000..737bcbdf17
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxhdpi/ic_splash_secure_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_collaboration.webp b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_collaboration.webp
new file mode 100644
index 0000000000..1dc31f6447
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_collaboration.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_collaboration_dark.webp b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_collaboration_dark.webp
new file mode 100644
index 0000000000..943f2b9ba8
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_collaboration_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_control.webp b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_control.webp
new file mode 100644
index 0000000000..9375475513
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_control.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_control_dark.webp b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_control_dark.webp
new file mode 100644
index 0000000000..905851dc26
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_control_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_conversations.webp b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_conversations.webp
new file mode 100644
index 0000000000..0d669312f5
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_conversations.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_conversations_dark.webp b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_conversations_dark.webp
new file mode 100644
index 0000000000..c5c4b2ccdd
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_conversations_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_secure.webp b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_secure.webp
new file mode 100644
index 0000000000..6a2a3fda56
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_secure.webp differ
diff --git a/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_secure_dark.webp b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_secure_dark.webp
new file mode 100644
index 0000000000..b792cb16ea
Binary files /dev/null and b/features/onboarding/src/main/res/drawable-xxxhdpi/ic_splash_secure_dark.webp differ
diff --git a/features/onboarding/src/main/res/drawable/bg_carousel_page_1.xml b/features/onboarding/src/main/res/drawable/bg_carousel_page_1.xml
new file mode 100644
index 0000000000..fa3aea4cab
--- /dev/null
+++ b/features/onboarding/src/main/res/drawable/bg_carousel_page_1.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/features/onboarding/src/main/res/drawable/bg_carousel_page_2.xml b/features/onboarding/src/main/res/drawable/bg_carousel_page_2.xml
new file mode 100644
index 0000000000..f696823a6e
--- /dev/null
+++ b/features/onboarding/src/main/res/drawable/bg_carousel_page_2.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/features/onboarding/src/main/res/drawable/bg_carousel_page_3.xml b/features/onboarding/src/main/res/drawable/bg_carousel_page_3.xml
new file mode 100644
index 0000000000..b114f9c804
--- /dev/null
+++ b/features/onboarding/src/main/res/drawable/bg_carousel_page_3.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/features/onboarding/src/main/res/drawable/bg_carousel_page_4.xml b/features/onboarding/src/main/res/drawable/bg_carousel_page_4.xml
new file mode 100644
index 0000000000..e8ee364431
--- /dev/null
+++ b/features/onboarding/src/main/res/drawable/bg_carousel_page_4.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/features/onboarding/src/main/res/drawable/bg_color_background.xml b/features/onboarding/src/main/res/drawable/bg_color_background.xml
new file mode 100644
index 0000000000..2542ff2b1d
--- /dev/null
+++ b/features/onboarding/src/main/res/drawable/bg_color_background.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/features/onboarding/src/main/res/drawable/bg_gradient_ftue_breaker.xml b/features/onboarding/src/main/res/drawable/bg_gradient_ftue_breaker.xml
new file mode 100644
index 0000000000..cdd4c20a4d
--- /dev/null
+++ b/features/onboarding/src/main/res/drawable/bg_gradient_ftue_breaker.xml
@@ -0,0 +1,19 @@
+
+
+
-
+
+
+
+
+ -
+
+
+
+
+
diff --git a/features/onboarding/src/main/res/values/strings.xml b/features/onboarding/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..e996efefaf
--- /dev/null
+++ b/features/onboarding/src/main/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+
+ Cut the slack from teams.
+
\ No newline at end of file
diff --git a/features/onboarding/src/test/java/io/element/android/x/features/login/ExampleUnitTest.kt b/features/onboarding/src/test/java/io/element/android/x/features/login/ExampleUnitTest.kt
new file mode 100644
index 0000000000..bcc403cdbf
--- /dev/null
+++ b/features/onboarding/src/test/java/io/element/android/x/features/login/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package io.element.android.x.features.login
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 3329cad5d3..955a773c86 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -63,6 +63,8 @@ accompanist_permission = { module = "com.google.accompanist:accompanist-permissi
accompanist_material = { module = "com.google.accompanist:accompanist-navigation-material", version.ref = "accompanist" }
accompanist_systemui = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanist" }
accompanist_placeholder = { module = "com.google.accompanist:accompanist-placeholder-material", version.ref = "accompanist" }
+accompanist_pager = { module = "com.google.accompanist:accompanist-pager", version.ref = "accompanist" }
+accompanist_pagerindicator = { module = "com.google.accompanist:accompanist-pager-indicators", version.ref = "accompanist" }
# Test
test_junit = { module = "junit:junit", version.ref = "test_junit" }
diff --git a/libraries/core/src/main/java/io/element/android/x/core/data/StableCharSequence.kt b/libraries/core/src/main/java/io/element/android/x/core/data/StableCharSequence.kt
index 29e72c95f1..0475b41599 100644
--- a/libraries/core/src/main/java/io/element/android/x/core/data/StableCharSequence.kt
+++ b/libraries/core/src/main/java/io/element/android/x/core/data/StableCharSequence.kt
@@ -9,3 +9,5 @@ class StableCharSequence(val charSequence: CharSequence) {
override fun hashCode() = hash
override fun equals(other: Any?) = other is StableCharSequence && other.hash == hash
}
+
+fun CharSequence.toStableCharSequence() = StableCharSequence(this)
diff --git a/libraries/core/src/main/res/values-ldrtl/integers.xml b/libraries/core/src/main/res/values-ldrtl/integers.xml
new file mode 100644
index 0000000000..88b587c96f
--- /dev/null
+++ b/libraries/core/src/main/res/values-ldrtl/integers.xml
@@ -0,0 +1,7 @@
+
+
+
+ -1
+ 180
+
+
\ No newline at end of file
diff --git a/libraries/core/src/main/res/values/integers.xml b/libraries/core/src/main/res/values/integers.xml
new file mode 100644
index 0000000000..4b147b3a98
--- /dev/null
+++ b/libraries/core/src/main/res/values/integers.xml
@@ -0,0 +1,7 @@
+
+
+
+ 1
+ 0
+
+
\ No newline at end of file
diff --git a/libraries/designsystem/src/main/java/io/element/android/x/designsystem/components/VectorButton.kt b/libraries/designsystem/src/main/java/io/element/android/x/designsystem/components/VectorButton.kt
index ee7c188f8c..70198103eb 100644
--- a/libraries/designsystem/src/main/java/io/element/android/x/designsystem/components/VectorButton.kt
+++ b/libraries/designsystem/src/main/java/io/element/android/x/designsystem/components/VectorButton.kt
@@ -7,11 +7,11 @@ import androidx.compose.ui.Modifier
@Composable
-fun VectorButton(text: String, enabled: Boolean, onClick: () -> Unit, modifier: Modifier? = null) {
+fun VectorButton(text: String, enabled: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier) {
Button(
onClick = onClick,
enabled = enabled,
- modifier = modifier ?: Modifier
+ modifier = modifier
) {
Text(text = text)
}
diff --git a/libraries/elementresources/src/main/res/values/strings.xml b/libraries/elementresources/src/main/res/values/strings.xml
index 450eb64849..f6168565b0 100644
--- a/libraries/elementresources/src/main/res/values/strings.xml
+++ b/libraries/elementresources/src/main/res/values/strings.xml
@@ -193,7 +193,7 @@
Initial sync:\nImporting account data
Initial sync request
- ${app_name} needs to perform a clear cache to be up to date, for the following reason:\n%s\n\nNote that this action will restart the app and it may take some time.
+ ElementX needs to perform a clear cache to be up to date, for the following reason:\n%s\n\nNote that this action will restart the app and it may take some time.
- Some users have been unignored
Message sent
@@ -521,8 +521,8 @@
Are you sure that you want to start a voice call?
Are you sure that you want to start a video call?
-
- ${app_name} Call Failed
+
+ ElementX Call Failed
Failed to establish real time connection.\nPlease ask the administrator of your homeserver to configure a TURN server in order for calls to work reliably.
Select Sound Device
@@ -584,8 +584,8 @@
Re-request encryption keys from your other sessions.
-
- Please launch ${app_name} on another device that can decrypt the message so it can send the keys to this session.
+
+ Please launch ElementX on another device that can decrypt the message so it can send the keys to this session.
@@ -605,8 +605,8 @@
Calls
Prevent accidental call
Ask for confirmation before starting a call
-
- Use default ${app_name} ringtone for incoming calls
+
+ Use default ElementX ringtone for incoming calls
Incoming call ringtone
Select ringtone for calls:
@@ -643,12 +643,12 @@
Information
-
- ${app_name} needs permission to access your microphone to perform audio calls.
-
- ${app_name} needs permission to access your camera and your microphone to perform video calls.\n\nPlease allow access on the next pop-ups to be able to make the call.
-
- ${app_name} needs permission to display notifications. Notifications can display your messages, your invitations, etc.\n\nPlease allow access on the next pop-ups to be able to view notification.
+
+ ElementX needs permission to access your microphone to perform audio calls.
+
+ ElementX needs permission to access your camera and your microphone to perform video calls.\n\nPlease allow access on the next pop-ups to be able to make the call.
+
+ ElementX needs permission to display notifications. Notifications can display your messages, your invitations, etc.\n\nPlease allow access on the next pop-ups to be able to view notification.
To scan a QR code, you need to allow camera access.
Allow permission to access your contacts.
@@ -868,7 +868,7 @@
System Settings.
Notifications are enabled in the system settings.
Notifications are disabled in the system settings.\nPlease check system settings.
- ${app_name} needs the permission to show notifications.\nPlease grant the permission.
+ ElementX needs the permission to show notifications.\nPlease grant the permission.
Open Settings
Grant Permission
@@ -879,8 +879,8 @@
Session Settings.
Notifications are enabled for this session.
-
- Notifications are not enabled for this session.\nPlease check the ${app_name} settings.
+
+ Notifications are not enabled for this session.\nPlease check the ElementX settings.
Enable
Custom Settings.
@@ -889,19 +889,19 @@
Play Services Check
Google Play Services APK is available and up-to-date.
-
- ${app_name} uses Google Play Services to deliver push messages but it doesn’t seem to be configured correctly:\n%1$s
+
+ ElementX uses Google Play Services to deliver push messages but it doesn’t seem to be configured correctly:\n%1$s
Fix Play Services
Firebase Token
FCM token successfully retrieved:\n%1$s
Failed to retrieved FCM token:\n%1$s
-
- [%1$s]\nThis error is out of control of ${app_name} and according to Google, this error indicates that the device has too many apps registered with FCM. The error only occurs in cases where there are extreme numbers of apps, so it should not affect the average user.
-
- [%1$s]\nThis error is out of control of ${app_name}. It can occur for several reasons. Maybe it will work if you retry later, you can also check that Google Play Service is not restricted in data usage in the system settings, or that your device clock is correct, or it can happen on custom ROM.
-
- [%1$s]\nThis error is out of control of ${app_name}. There is no Google account on the phone. Please open the account manager and add a Google account.
+
+ [%1$s]\nThis error is out of control of ElementX and according to Google, this error indicates that the device has too many apps registered with FCM. The error only occurs in cases where there are extreme numbers of apps, so it should not affect the average user.
+
+ [%1$s]\nThis error is out of control of ElementX. It can occur for several reasons. Maybe it will work if you retry later, you can also check that Google Play Service is not restricted in data usage in the system settings, or that your device clock is correct, or it can happen on custom ROM.
+
+ [%1$s]\nThis error is out of control of ElementX. There is no Google account on the phone. Please open the account manager and add a Google account.
Add Account
Token Registration
@@ -923,20 +923,20 @@
Start on boot
Service will start when the device is restarted.
-
- The service will not start when the device is restarted, you will not receive notifications until ${app_name} has been opened once.
+
+ The service will not start when the device is restarted, you will not receive notifications until ElementX has been opened once.
Enable Start on boot
Check background restrictions
-
- Background restrictions are disabled for ${app_name}. This test should be run using mobile data (no WIFI).\n%1$s
-
- Background restrictions are enabled for ${app_name}.\nWork that the app tries to do will be aggressively restricted while it is in the background, and this could affect notifications.\n%1$s
+
+ Background restrictions are disabled for ElementX. This test should be run using mobile data (no WIFI).\n%1$s
+
+ Background restrictions are enabled for ElementX.\nWork that the app tries to do will be aggressively restricted while it is in the background, and this could affect notifications.\n%1$s
Disable restrictions
Battery Optimization
-
- ${app_name} is not affected by Battery Optimization.
+
+ ElementX is not affected by Battery Optimization.
If a user leaves a device unplugged and stationary for a period of time, with the screen off, the device enters Doze mode. This prevents apps from accessing the network and defers their jobs, syncs, and standard alarms.
Ignore Optimization
@@ -976,11 +976,11 @@
Background synchronization
Background Sync Mode
Optimized for battery
-
- ${app_name} will sync in background in way that preserves the device’s limited resources (battery).\nDepending on your device resource state, the sync may be deferred by the operating system.
+
+ ElementX will sync in background in way that preserves the device’s limited resources (battery).\nDepending on your device resource state, the sync may be deferred by the operating system.
Optimized for real time
-
- ${app_name} will sync in background periodically at precise time (configurable).\nThis will impact radio and battery usage, there will be a permanent notification displayed stating that ${app_name} is listening for events.
+
+ ElementX will sync in background periodically at precise time (configurable).\nThis will impact radio and battery usage, there will be a permanent notification displayed stating that ElementX is listening for events.
No background sync
You will not be notified of incoming messages when the app is in background.
@@ -1059,12 +1059,12 @@
Analytics
Send analytics data
-
- ${app_name} collects anonymous analytics to allow us to improve the application.
+
+ ElementX collects anonymous analytics to allow us to improve the application.
- Help improve ${app_name}
+ Help improve ElementX
- Help us identify issues and improve ${app_name} by sharing anonymous usage data. To understand how people use multiple devices, we’ll generate a random identifier, shared by your devices.\n\nYou can read all our terms %s.
+ Help us identify issues and improve ElementX by sharing anonymous usage data. To understand how people use multiple devices, we’ll generate a random identifier, shared by your devices.\n\nYou can read all our terms %s.
here
We don\'t record or profile any account data
We don\'t share information with third parties
@@ -1083,7 +1083,7 @@
Allow integrations
Integration manager
- ${app_name} policy
+ ElementX policy
Your homeserver policy
Your identity server policy
Third party libraries
@@ -1504,8 +1504,8 @@
-
- Please delete the passphrase if you want ${app_name} to generate a recovery key.
+
+ Please delete the passphrase if you want ElementX to generate a recovery key.
Never lose encrypted messages
Messages in encrypted rooms are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.\n\nSecurely back up your keys to avoid losing them.
@@ -1735,7 +1735,7 @@
Help
Help and support
- Get help with using ${app_name}
+ Get help with using ElementX
Versions
System settings
@@ -1964,8 +1964,8 @@
Secure and independent communication that gives you the same level of privacy as a face-to-face conversation in your own home.
Choose where your conversations are kept, giving you control and independence. Connected via Matrix.
End-to-end encrypted and no phone number required. No ads or datamining.
-
- ${app_name} is also great for the workplace. It’s trusted by the world’s most secure organisations.
+
+ ElementX is also great for the workplace. It’s trusted by the world’s most secure organisations.
Who will you chat to the most?
We\'ll help you get connected
@@ -2214,8 +2214,8 @@
Clear data
Clear all data currently stored on this device?\nSign in again to access your account data and messages.
You’ll lose access to secure messages unless you sign in to recover your encryption keys.
-
- The current session is for user %1$s and you provide credentials for user %2$s. This is not supported by ${app_name}.\nPlease first clear data, then sign in again on another account.
+
+ The current session is for user %1$s and you provide credentials for user %2$s. This is not supported by ElementX.\nPlease first clear data, then sign in again on another account.
Your matrix.to link was malformed
Cannot open this link: communities have been replaced by spaces
@@ -2237,8 +2237,8 @@
Showing only the first results, type more letters…
Fail-fast
-
- ${app_name} may crash more often when an unexpected error occurs
+
+ ElementX may crash more often when an unexpected error occurs
Show debug info on screen
Show some useful info to help debugging the application
@@ -2346,10 +2346,10 @@
Direct message
Jump to read receipt
-
- ${app_name} does not handle events of type \'%1$s\'
-
- ${app_name} encountered an issue when rendering content of event with id \'%1$s\'
+
+ ElementX does not handle events of type \'%1$s\'
+
+ ElementX encountered an issue when rendering content of event with id \'%1$s\'
Unignore
@@ -2475,8 +2475,8 @@
Keys are already up to date!
-
- ${app_name} Android
+
+ ElementX Android
Key Requests
Export Audit
@@ -2607,15 +2607,15 @@
Could not save media file
Set a new account password…
-
- Use the latest ${app_name} on your other devices, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} for Android, or another cross-signing capable Matrix client
-
- ${app_name} Web\n${app_name} Desktop
-
- ${app_name} iOS\n${app_name} Android
+
+ Use the latest ElementX on your other devices, ElementX Web, ElementX Desktop, ElementX iOS, ElementX for Android, or another cross-signing capable Matrix client
+
+ ElementX Web\nElementX Desktop
+
+ ElementX iOS\nElementX Android
or another cross-signing capable Matrix client
-
- Use the latest ${app_name} on your other devices:
+
+ Use the latest ElementX on your other devices:
Forces the current outbound group session in an encrypted room to be discarded
Only supported in encrypted rooms
@@ -2670,10 +2670,10 @@
Inviting users…
Invite Users
Invite friends
-
- Hey, talk to me on ${app_name}: %s
-
- 🔐️ Join me on ${app_name}
+
+ Hey, talk to me on ElementX: %s
+
+ 🔐️ Join me on ElementX
Invitation sent to %1$s
Invitations sent to %1$s and %2$s
"It's not a valid matrix QR code"
@@ -2694,13 +2694,13 @@
Open terms of %s
Disconnect from the identity server %s?
-
- This identity server is outdated. ${app_name} support only API V2.
+
+ This identity server is outdated. ElementX support only API V2.
This operation is not possible. The homeserver is outdated.
Please first configure an identity server.
Please first accepts the terms of the identity server in the settings.
-
- For your privacy, ${app_name} only supports sending hashed user email addresses and phone numbers.
+
+ For your privacy, ElementX only supports sending hashed user email addresses and phone numbers.
The association has failed.
There is no current association with this identifier.
The user consent has not been provided.
@@ -2794,17 +2794,17 @@
If you want to reset your PIN, tap Forgot PIN to logout and reset.
Enable biometrics
Enable device specific biometrics, like fingerprints and face recognition.
-
- PIN code is the only way to unlock ${app_name}.
+
+ PIN code is the only way to unlock ElementX.
Could not enable biometric authentication.
Show content in notifications
Show details like room names and message content.
Only display number of unread messages in a simple notification.
Require PIN after 2 minutes
-
- PIN code is required after 2 minutes of not using ${app_name}.
-
- PIN code is required every time you open ${app_name}.
+
+ PIN code is required after 2 minutes of not using ElementX.
+
+ PIN code is required every time you open ElementX.
Change PIN
Change your current PIN
Can\'t open a room where you are banned from.
@@ -2863,8 +2863,8 @@
Slide to end the call
Re-Authentication Needed
-
- ${app_name} requires you to enter your credentials to perform this action.
+
+ ElementX requires you to enter your credentials to perform this action.
Failed to authenticate
Screenshot
@@ -3113,7 +3113,7 @@
Link this email address with your account
- %s in Settings to receive invites directly in ${app_name}.
+ %s in Settings to receive invites directly in ElementX.
Enable LaTeX mathematics
Restart the application for the change to take effect.
@@ -3184,8 +3184,8 @@
15 minutes
1 hour
8 hours
- ${app_name} could not access your location
- ${app_name} could not access your location. Please try again later.
+ ElementX could not access your location
+ ElementX could not access your location. Please try again later.
Open with
Failed to load map
Unable to load map\nThis home server may not be configured to display maps.
@@ -3198,7 +3198,7 @@
Stop
%1$s left
- ${app_name} Live Location
+ ElementX Live Location
Location sharing is in progress
Enable Live Location Sharing
Temporary implementation: locations persist in room history
@@ -3241,7 +3241,7 @@
Room notification
- ${app_name} Screen Sharing
+ ElementX Screen Sharing
Screen sharing is in progress
Choose how to receive notifications
@@ -3388,14 +3388,14 @@
Spaces are a new way to group rooms and people. Add an existing room, or create a new one, using the bottom-right button.
- Welcome to ${app_name},\n%s.
+ Welcome to ElementX,\n%s.
The all-in-one secure chat app for teams, friends and organisations. Create a chat, or join an existing room, to get started.
Nothing to report.
This is where your unread messages will show up, when you have some.
Welcome to a new view!
- To simplify your ${app_name}, tabs are now optional. Manage them using the top-right menu.
+ To simplify your ElementX, tabs are now optional. Manage them using the top-right menu.
Access Spaces
Access your Spaces (bottom-right) faster and easier than ever before.
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 66d4dabfa7..e91979bfdb 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -22,6 +22,7 @@ include(":libraries:core")
include(":libraries:matrix")
include(":libraries:textcomposer")
include(":libraries:elementresources")
+include(":features:onboarding")
include(":features:login")
include(":features:roomlist")
include(":features:messages")