mirror of
https://github.com/twinksoftware/Gearslip.git
synced 2026-11-11 08:12:26 +01:00
ask existing users about usage notes once
This commit is contained in:
1 parent
fe44576b06
commit
62fb8babad
2 files changed
+38
-1
No files matched your search
@@ -127,6 +127,8 @@ fun GearslipApp(onDisconnect: () -> Unit, onRequestCallScreening: () -> Unit) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CompatWarning()
|
CompatWarning()
|
||||||
|
// Anyone who set up before usage notes existed gets asked once, on Home.
|
||||||
|
if (screen == Screen.HOME) UsageStatsPrompt()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,23 +2,28 @@ package app.seb3thehacker.gearslip.ui
|
|||||||
|
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.ColumnScope
|
import androidx.compose.foundation.layout.ColumnScope
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.selection.toggleable
|
import androidx.compose.foundation.selection.toggleable
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.Info
|
import androidx.compose.material.icons.filled.Info
|
||||||
import androidx.compose.material.icons.filled.KeyboardArrowDown
|
import androidx.compose.material.icons.filled.KeyboardArrowDown
|
||||||
import androidx.compose.material.icons.filled.KeyboardArrowUp
|
import androidx.compose.material.icons.filled.KeyboardArrowUp
|
||||||
import androidx.compose.material.icons.filled.Send
|
import androidx.compose.material.icons.filled.Send
|
||||||
|
import androidx.compose.material3.AlertDialog
|
||||||
import androidx.compose.material3.Checkbox
|
import androidx.compose.material3.Checkbox
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.Switch
|
import androidx.compose.material3.Switch
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TextButton
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
@@ -43,7 +48,7 @@ internal const val USAGE_STATS_TITLE = "Help show which cars work"
|
|||||||
private const val INTRO_START =
|
private const val INTRO_START =
|
||||||
"Gearslip can't tell which cars it works in unless drivers say so. Turn this on, and Gearslip " +
|
"Gearslip can't tell which cars it works in unless drivers say so. Turn this on, and Gearslip " +
|
||||||
"sends a short note when you open it and after each drive, never in the background. The " +
|
"sends a short note when you open it and after each drive, never in the background. The " +
|
||||||
"note carries the Gearslip version and whatever you tick below. "
|
"note carries the Gearslip version and whatever you choose to share. "
|
||||||
private const val INTRO_PRIVACY =
|
private const val INTRO_PRIVACY =
|
||||||
"It holds no name, account, or location, only a random number so your phone counts once. " +
|
"It holds no name, account, or location, only a random number so your phone counts once. " +
|
||||||
"Cloudflare carries the note, and the server keeps no IP address."
|
"Cloudflare carries the note, and the server keeps no IP address."
|
||||||
@@ -146,3 +151,33 @@ private fun Choice(label: String, checked: Boolean, onChange: (Boolean) -> Unit)
|
|||||||
Checkbox(checked = checked, onCheckedChange = null, modifier = Modifier.padding(vertical = 8.dp))
|
Checkbox(checked = checked, onCheckedChange = null, modifier = Modifier.padding(vertical = 8.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asks once, for people who set Gearslip up before usage notes existed and so never saw the
|
||||||
|
* setup page. Either answer is final; Settings changes it later. Release builds only.
|
||||||
|
*/
|
||||||
|
@Composable
|
||||||
|
internal fun UsageStatsPrompt() {
|
||||||
|
if (!UsageStats.choosable) return
|
||||||
|
val context = LocalContext.current
|
||||||
|
var show by remember { mutableStateOf(!UsageStats.asked(context)) }
|
||||||
|
if (!show) return
|
||||||
|
AlertDialog(
|
||||||
|
// An answer is needed: tapping outside would just bring it back next time.
|
||||||
|
onDismissRequest = {},
|
||||||
|
title = { Text(USAGE_STATS_TITLE) },
|
||||||
|
text = {
|
||||||
|
Column(Modifier.verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(12.dp)) {
|
||||||
|
Text(USAGE_STATS_INTRO)
|
||||||
|
Text(
|
||||||
|
"Turning this on also shares the Android version, the phone model, and the cars you " +
|
||||||
|
"connect to. You can untick any of them in Settings.",
|
||||||
|
style = MaterialTheme.typography.bodySmall,
|
||||||
|
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
confirmButton = { TextButton(onClick = { UsageStats.set(context, true); show = false }) { Text("Turn on") } },
|
||||||
|
dismissButton = { TextButton(onClick = { UsageStats.set(context, false); show = false }) { Text("No thanks") } },
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in new issue
Block a user