From 42a4de1d3785d9cdaaf6b115daecb1a4f7d60bac Mon Sep 17 00:00:00 2001 From: zbuchheit Date: Mon, 12 May 2025 12:31:43 -0700 Subject: [PATCH] mdm: define OnboardingFlow syspolicy on Android Adds an MDM setting `OnboardingFlow` which allows for the intro screen to be skipped when set to true. Adds MDM Setting update to the top of MainActivity onCreate to ensure the latest MDMSettings are accurate. When attempting to do this while relying on MDMSettings being update during onResume it created a race condition where occasionally OnboardingFlow was being evaluated to the default value `show` when in reality it should be set to `hide`. Signed-off-by: zbuchheit --- .../main/java/com/tailscale/ipn/MainActivity.kt | 15 ++++++++++----- .../java/com/tailscale/ipn/mdm/MDMSettings.kt | 3 +++ android/src/main/res/values/strings.xml | 2 ++ android/src/main/res/xml/app_restrictions.xml | 8 ++++++++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/tailscale/ipn/MainActivity.kt b/android/src/main/java/com/tailscale/ipn/MainActivity.kt index 0b3b762..0d86c00 100644 --- a/android/src/main/java/com/tailscale/ipn/MainActivity.kt +++ b/android/src/main/java/com/tailscale/ipn/MainActivity.kt @@ -44,6 +44,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 @@ -123,6 +124,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()) { @@ -290,9 +294,7 @@ class MainActivity : ComponentActivity() { onNavigateHome = backTo("main"), backTo("userSwitcher")) } } - - // Show the intro screen one time - if (!introScreenViewed()) { + if (shouldDisplayOnboarding()) { navController.navigate("intro") setIntroScreenViewed(true) } @@ -446,8 +448,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 3364ceb..270d1a0 100644 --- a/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt +++ b/android/src/main/java/com/tailscale/ipn/mdm/MDMSettings.kt @@ -97,6 +97,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 5626e58..38f5a6c 100644 --- a/android/src/main/res/values/strings.xml +++ b/android/src/main/res/values/strings.xml @@ -214,6 +214,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 7f5549f..44603c7 100644 --- a/android/src/main/res/xml/app_restrictions.xml +++ b/android/src/main/res/xml/app_restrictions.xml @@ -134,4 +134,12 @@ android:key="Hostname" android:restrictionType="string" android:title="@string/hostname" /> + + \ No newline at end of file