diff --git a/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt b/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt
index c5331dbf..d2c784a0 100644
--- a/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt
+++ b/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt
@@ -84,6 +84,7 @@ import chat.revolt.screens.chat.views.OverviewScreen
import chat.revolt.screens.chat.views.channel.ChannelScreen
import chat.revolt.sheets.AddServerSheet
import chat.revolt.sheets.ChangelogSheet
+import chat.revolt.sheets.EarlyAccessSheet
import chat.revolt.sheets.EmoteInfoSheet
import chat.revolt.sheets.LinkInfoSheet
import chat.revolt.sheets.ReactionInfoSheet
@@ -148,6 +149,7 @@ class ChatRouterViewModel @Inject constructor(
var latestChangelog by mutableStateOf("")
var latestChangelogBody by mutableStateOf("")
var showNotificationRationale by mutableStateOf(false)
+ var showEarlyAccessSpark by mutableStateOf(false)
private val changelogs = Changelogs(context, kvStorage)
@@ -164,6 +166,11 @@ class ChatRouterViewModel @Inject constructor(
changelogs.markAsSeen()
}
+ val seenEarlyAccess = kvStorage.get("spark/earlyAccess/dismissed")
+ if (seenEarlyAccess == null) {
+ showEarlyAccessSpark = true
+ }
+
val hasNotificationPermission =
NotificationManagerCompat.from(context).areNotificationsEnabled()
// right now we only show this in debug builds so Chucker can show its notification
@@ -214,6 +221,13 @@ class ChatRouterViewModel @Inject constructor(
}
}
+ fun dismissEarlyAccessSpark() {
+ showEarlyAccessSpark = false
+ viewModelScope.launch {
+ kvStorage.set("spark/earlyAccess/dismissed", true)
+ }
+ }
+
fun navigateToServer(serverId: String) {
viewModelScope.launch {
val savedLastChannel = kvStorage.get("lastChannel/$serverId")
@@ -706,6 +720,29 @@ fun ChatRouterScreen(
)
}
+ if (viewModel.showEarlyAccessSpark) {
+ val earlyAccessSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
+
+ ModalBottomSheet(
+ sheetState = earlyAccessSheetState,
+ sheetGesturesEnabled = false,
+ dragHandle = {},
+ onDismissRequest = {
+ // Only dismiss using button in sheet
+ }
+ ) {
+ EarlyAccessSheet(
+ onClose = {
+ scope.launch {
+
+ earlyAccessSheetState.hide()
+ viewModel.dismissEarlyAccessSpark()
+ }
+ }
+ )
+ }
+ }
+
Column(
modifier = Modifier
.fillMaxWidth()
diff --git a/app/src/main/java/chat/revolt/screens/settings/DebugSettingsScreen.kt b/app/src/main/java/chat/revolt/screens/settings/DebugSettingsScreen.kt
index 9473330f..82b4735a 100644
--- a/app/src/main/java/chat/revolt/screens/settings/DebugSettingsScreen.kt
+++ b/app/src/main/java/chat/revolt/screens/settings/DebugSettingsScreen.kt
@@ -68,6 +68,7 @@ class DebugSettingsScreenViewModel @Inject constructor(
) : ViewModel() {
fun forgetAllSparks() {
forgetPhysicalKeyboardSpark()
+ forgetEarlyAccessSpark()
}
fun forgetPhysicalKeyboardSpark() {
@@ -76,6 +77,12 @@ class DebugSettingsScreenViewModel @Inject constructor(
}
}
+ fun forgetEarlyAccessSpark() {
+ viewModelScope.launch {
+ kvStorage.remove("spark/earlyAccess/dismissed")
+ }
+ }
+
fun forgetLatestChangelog() {
viewModelScope.launch {
kvStorage.remove("latestChangelogRead")
@@ -218,6 +225,9 @@ fun DebugSettingsScreen(
ElevatedButton(onClick = { viewModel.forgetPhysicalKeyboardSpark() }) {
Text("Forget physical keyboard spark")
}
+ ElevatedButton(onClick = { viewModel.forgetEarlyAccessSpark() }) {
+ Text("Forget early access spark")
+ }
Button(onClick = { viewModel.forgetAllSparks() }) {
Text("Forget all sparks")
}
diff --git a/app/src/main/java/chat/revolt/sheets/EarlyAccessSheet.kt b/app/src/main/java/chat/revolt/sheets/EarlyAccessSheet.kt
new file mode 100644
index 00000000..0608a985
--- /dev/null
+++ b/app/src/main/java/chat/revolt/sheets/EarlyAccessSheet.kt
@@ -0,0 +1,62 @@
+package chat.revolt.sheets
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.material3.TextButton
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import chat.revolt.R
+
+@Composable
+fun EarlyAccessSheet(onClose: () -> Unit) {
+ Column(
+ Modifier
+ .padding(16.dp)
+ .padding(horizontal = 8.dp)
+ .padding(top = 8.dp),
+ verticalArrangement = Arrangement.spacedBy(16.dp, Alignment.CenterVertically),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ Image(
+ painter = painterResource(R.drawable.ux_early_access),
+ contentDescription = null,
+ modifier = Modifier
+ .fillMaxWidth(0.5f)
+ .padding(vertical = 8.dp)
+ )
+ Text(
+ stringResource(R.string.spark_early_access),
+ style = MaterialTheme.typography.headlineLarge.copy(fontSize = 24.sp),
+ textAlign = TextAlign.Center
+ )
+ Text(
+ stringResource(R.string.spark_early_access_description_1),
+ style = MaterialTheme.typography.bodyLarge,
+ textAlign = TextAlign.Center
+ )
+ Text(
+ stringResource(R.string.spark_early_access_description_2),
+ style = MaterialTheme.typography.bodyLarge,
+ textAlign = TextAlign.Center
+ )
+ Text(
+ stringResource(R.string.spark_early_access_description_3),
+ style = MaterialTheme.typography.bodyLarge,
+ textAlign = TextAlign.Center
+ )
+ TextButton(onClick = onClose, modifier = Modifier.fillMaxWidth()) {
+ Text(stringResource(R.string.spark_early_access_cta))
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ux_early_access.xml b/app/src/main/res/drawable/ux_early_access.xml
new file mode 100644
index 00000000..e46f07ac
--- /dev/null
+++ b/app/src/main/res/drawable/ux_early_access.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 17634921..bb02387f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -579,6 +579,18 @@
Open shortcuts
Alright
+ Welcome to Early Access! 🚀
+ You\'re one of the first to try out our new Android app. We\'re excited to have you here!
+ Since this is early access, things might not be perfect just yet. You might run into the occasional bug, crash, or weird quirk. Your feedback helps us smooth out the rough edges and make Revolt even better.
+ We\'re thrilled to have you on board. Let\'s make something great together!
+ Got it
+
+ We love feedback!
+ If you have any feedback, suggestions, or bug reports, please let us know. We\'re always looking to improve Revolt.
+ Rate on Google Play
+ Join Testers Server
+ Done
+
Important notice regarding your account
You have received an important notice regarding your account from our moderation team. Please read it carefully.
View