intro: new page order ending on thanks, a plainer welcome, and it resumes where it was after the app restarts

This commit is contained in:
Seb3thehacker committed 2026-10-13 19:08:48 -07:00
1 parent 76955669f5
commit daa6f24289
2 files changed
+26 -6

No files matched your search

@@ -123,7 +123,7 @@ fun GearslipApp(onDisconnect: () -> Unit, onRequestCallScreening: () -> Unit) {
onOpenCarPreview = { settingsAtUsageNotes = false; screen = Screen.CAR_PREVIEW }, onOpenCarPreview = { settingsAtUsageNotes = false; screen = Screen.CAR_PREVIEW },
onOpenLogs = { settingsAtUsageNotes = false; screen = Screen.LOGS }, onOpenLogs = { settingsAtUsageNotes = false; screen = Screen.LOGS },
onReplayTutorial = { screen = Screen.SETUP_GUIDE }, onReplayTutorial = { screen = Screen.SETUP_GUIDE },
onReplayIntro = { introReturn = Screen.SETTINGS; screen = Screen.INTRO }, onReplayIntro = { Intro.replay(context); introReturn = Screen.SETTINGS; screen = Screen.INTRO },
atUsageNotes = settingsAtUsageNotes, atUsageNotes = settingsAtUsageNotes,
) )
Screen.RECOMMENDED_APPS -> RecommendedAppsScreen(onBack = { screen = Screen.SETTINGS }) Screen.RECOMMENDED_APPS -> RecommendedAppsScreen(onBack = { screen = Screen.SETTINGS })
@@ -104,6 +104,7 @@ import kotlinx.coroutines.delay
object Intro { object Intro {
private const val PREFS = "intro" private const val PREFS = "intro"
private const val KEY_SEEN = "seen_release" private const val KEY_SEEN = "seen_release"
private const val KEY_STEP = "step"
/** "0.3" from "0.3.00-alpha": the intro belongs to a release, not to each patch. */ /** "0.3" from "0.3.00-alpha": the intro belongs to a release, not to each patch. */
val release: String = BuildConfig.VERSION_NAME.split('.').take(2).joinToString(".") val release: String = BuildConfig.VERSION_NAME.split('.').take(2).joinToString(".")
@@ -123,7 +124,23 @@ object Intro {
} }
fun markSeen(context: Context) { fun markSeen(context: Context) {
context.getSharedPreferences(PREFS, Context.MODE_PRIVATE).edit().putString(KEY_SEEN, release).apply() context.getSharedPreferences(PREFS, Context.MODE_PRIVATE).edit()
.putString(KEY_SEEN, release)
.remove(KEY_STEP)
.apply()
}
/** A replay from Settings starts at the first page. */
fun replay(context: Context) {
context.getSharedPreferences(PREFS, Context.MODE_PRIVATE).edit().remove(KEY_STEP).apply()
}
/** The page the intro was on, so an app restart part-way through resumes there. */
internal fun savedStep(context: Context): String? =
context.getSharedPreferences(PREFS, Context.MODE_PRIVATE).getString(KEY_STEP, null)
internal fun saveStep(context: Context, step: String) {
context.getSharedPreferences(PREFS, Context.MODE_PRIVATE).edit().putString(KEY_STEP, step).apply()
} }
} }
@@ -145,7 +162,8 @@ internal fun introColors(): IntroColors {
) )
} }
private enum class IntroStep { WELCOME, WIRELESS, KNOBS, VOICE, GRAPHENE, THANKS, CHAT, APPS, THEME, DRIVE } /** In the order shown: what's new, what to pick, housekeeping, then the people behind it. */
private enum class IntroStep { WELCOME, WIRELESS, KNOBS, VOICE, THEME, APPS, GRAPHENE, CHAT, DRIVE, THANKS }
private val Pop = CubicBezierEasing(0.3f, 1.6f, 0.5f, 1f) private val Pop = CubicBezierEasing(0.3f, 1.6f, 0.5f, 1f)
private val Rise = CubicBezierEasing(0.2f, 0.8f, 0.2f, 1f) private val Rise = CubicBezierEasing(0.2f, 0.8f, 0.2f, 1f)
@@ -158,8 +176,12 @@ fun IntroScreen(onDone: () -> Unit) {
val steps = remember { val steps = remember {
IntroStep.entries.filter { it != IntroStep.GRAPHENE || UsageStats.osName(context) == "GrapheneOS" } IntroStep.entries.filter { it != IntroStep.GRAPHENE || UsageStats.osName(context) == "GrapheneOS" }
} }
var index by remember { mutableIntStateOf(0) } // Turning exploit protection back on restarts the app, so the intro picks up where it was.
var index by remember {
mutableIntStateOf(steps.indexOfFirst { it.name == Intro.savedStep(context) }.coerceAtLeast(0))
}
val step = steps[index] val step = steps[index]
LaunchedEffect(step) { Intro.saveStep(context, step.name) }
val finish = { val finish = {
Intro.markSeen(context) Intro.markSeen(context)
onDone() onDone()
@@ -285,8 +307,6 @@ private fun Welcome(c: IntroColors, cq: (Float) -> Dp, cqSp: (Float) -> TextUnit
) )
} }
Ticker(c.primary, c.onPrimary, "WIRELESS ✦ KNOB SUPPORT ✦ OFFLINE VOICE ✦ FASTER VIDEO ✦ AUTO UPDATES ✦ ", cq, cqSp, reverse = false, tilt = -4f,
key = key, modifier = Modifier.align(Alignment.BottomCenter).padding(bottom = height * 0.15f))
Confetti(c, key, Modifier.fillMaxSize()) Confetti(c, key, Modifier.fillMaxSize())
} }
} }