diff --git a/android/src/main/java/com/tailscale/ipn/MainActivity.kt b/android/src/main/java/com/tailscale/ipn/MainActivity.kt
index 04b4724..a8549ce 100644
--- a/android/src/main/java/com/tailscale/ipn/MainActivity.kt
+++ b/android/src/main/java/com/tailscale/ipn/MainActivity.kt
@@ -49,6 +49,7 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.tailscale.ipn.mdm.MDMSettings
+import com.tailscale.ipn.mdm.ShowHide
import com.tailscale.ipn.ui.model.Ipn
import com.tailscale.ipn.ui.notifier.Notifier
import com.tailscale.ipn.ui.theme.AppTheme
@@ -133,6 +134,9 @@ class MainActivity : ComponentActivity() {
App.get()
vpnViewModel = ViewModelProvider(App.get()).get(VpnViewModel::class.java)
+ val rm = getSystemService(Context.RESTRICTIONS_SERVICE) as RestrictionsManager
+ MDMSettings.update(App.get(), rm)
+
// (jonathan) TODO: Force the app to be portrait on small screens until we have
// proper landscape layout support
if (!isLandscapeCapable()) {
@@ -363,9 +367,7 @@ class MainActivity : ComponentActivity() {
onNavigateHome = backTo("main"), backTo("userSwitcher"))
}
}
-
- // Show the intro screen one time
- if (!introScreenViewed()) {
+ if (shouldDisplayOnboarding()) {
navController.navigate("intro")
setIntroScreenViewed(true)
}
@@ -523,8 +525,11 @@ class MainActivity : ComponentActivity() {
startActivity(intent)
}
- private fun introScreenViewed(): Boolean {
- return getSharedPreferences("introScreen", Context.MODE_PRIVATE).getBoolean("seen", false)
+ private fun shouldDisplayOnboarding(): Boolean {
+ val onboardingFlowShowHide = MDMSettings.onboardingFlow.flow.value.value
+ val introSeen =
+ getSharedPreferences("introScreen", Context.MODE_PRIVATE).getBoolean("seen", false)
+ return (onboardingFlowShowHide == ShowHide.Show && !introSeen)
}
private fun setIntroScreenViewed(seen: Boolean) {
diff --git a/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt b/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt
index c843d90..d8df61d 100644
--- a/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt
+++ b/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt
@@ -101,6 +101,9 @@ object MDMSettings {
// Overrides the value provided by os.Hostname() in Go
val hostname = StringMDMSetting("Hostname", "Device Hostname")
+ // Allows admins to skip the get started intro screen
+ val onboardingFlow = ShowHideMDMSetting("OnboardingFlow", "Suppress the intro screen")
+
val allSettings by lazy {
MDMSettings::class
.declaredMemberProperties
diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml
index 25ec4f1..ed1fa16 100644
--- a/android/src/main/res/values/strings.xml
+++ b/android/src/main/res/values/strings.xml
@@ -220,6 +220,8 @@
Run as exit node visibility
Defines an auth key that will be used for login.
Auth Key
+ Skips the intro page shown to users that open the app for the first time
+ Skip the Onboarding Flow
Permissions
diff --git a/android/src/main/res/xml/app_restrictions.xml b/android/src/main/res/xml/app_restrictions.xml
index 363bfc5..b47cc58 100644
--- a/android/src/main/res/xml/app_restrictions.xml
+++ b/android/src/main/res/xml/app_restrictions.xml
@@ -140,4 +140,12 @@
android:key="Hostname"
android:restrictionType="string"
android:title="@string/hostname" />
+
+
\ No newline at end of file