diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthActivity.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthActivity.kt index a4400e06b..d4bcaffc1 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthActivity.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthActivity.kt @@ -4,7 +4,7 @@ package dev.firezone.android.features.auth.ui import android.content.Intent import android.net.Uri import android.os.Bundle -import android.util.Log +import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity @@ -14,6 +14,7 @@ import dev.firezone.android.R import dev.firezone.android.core.presentation.MainActivity import dev.firezone.android.databinding.ActivityAuthBinding import dev.firezone.android.util.CustomTabsHelper +import java.lang.Exception @AndroidEntryPoint class AuthActivity : AppCompatActivity(R.layout.activity_auth) { @@ -38,14 +39,10 @@ class AuthActivity : AppCompatActivity(R.layout.activity_auth) { private fun setupActionObservers() { viewModel.actionLiveData.observe(this) { action -> - Log.d("AuthActivity", "setupActionObservers: $action") when (action) { is AuthViewModel.ViewAction.LaunchAuthFlow -> setupWebView(action.url) is AuthViewModel.ViewAction.NavigateToSignInFragment -> { - startActivity( - Intent(this, MainActivity::class.java), - ) - finish() + navigateToSignIn() } is AuthViewModel.ViewAction.ShowError -> showError() else -> {} @@ -54,10 +51,40 @@ class AuthActivity : AppCompatActivity(R.layout.activity_auth) { } private fun setupWebView(url: String) { - val intent = CustomTabsIntent.Builder().build() - intent.intent.setPackage(CustomTabsHelper.getPackageNameToUse(this@AuthActivity)) - intent.launchUrl(this@AuthActivity, Uri.parse(url)) + if (CustomTabsHelper.checkIfChromeIsInstalled(this)) { + val intent = CustomTabsIntent.Builder().build() + val packageName = CustomTabsHelper.getPackageNameToUse(this) + if (CustomTabsHelper.checkIfChromeAppIsDefault()) { + if (packageName != null) { + intent.intent.setPackage(packageName) + } + } else { + intent.intent.setPackage(CustomTabsHelper.STABLE_PACKAGE) + } + + try { + intent.launchUrl(this@AuthActivity, Uri.parse(url)) + finish() + } catch (e: Exception) { + showChromeAppRequiredError() + } + } else { + showChromeAppRequiredError() + } } + + private fun showChromeAppRequiredError() { + Toast.makeText(this, getString(R.string.signing_in_requires_chrome_browser), Toast.LENGTH_LONG).show() + navigateToSignIn() + } + + private fun navigateToSignIn() { + startActivity( + Intent(this, MainActivity::class.java), + ) + finish() + } + private fun showError() { AlertDialog.Builder(this) .setTitle(R.string.error_dialog_title) diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/signin/ui/SignInFragment.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/signin/ui/SignInFragment.kt index 01e3ec7ad..2840f0fa8 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/signin/ui/SignInFragment.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/signin/ui/SignInFragment.kt @@ -34,7 +34,6 @@ internal class SignInFragment : Fragment(R.layout.fragment_sign_in) { AuthActivity::class.java, ), ) - requireActivity().finish() } btSettings.setOnClickListener { findNavController().navigate( diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/util/CustomTabsHelper.kt b/kotlin/android/app/src/main/java/dev/firezone/android/util/CustomTabsHelper.kt index 7f6c7b01c..d2a2233ba 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/util/CustomTabsHelper.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/util/CustomTabsHelper.kt @@ -3,7 +3,10 @@ package dev.firezone.android.util import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri +import android.os.Build + class CustomTabsHelper { companion object { val STABLE_PACKAGE = "com.android.chrome" @@ -46,5 +49,23 @@ class CustomTabsHelper { } return sPackageNameToUse } + + fun checkIfChromeAppIsDefault() = + sPackageNameToUse == STABLE_PACKAGE || + sPackageNameToUse == BETA_PACKAGE || + sPackageNameToUse == DEV_PACKAGE || + sPackageNameToUse == LOCAL_PACKAGE + + fun checkIfChromeIsInstalled(context: Context): Boolean = try { + val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + context.packageManager.getPackageInfo(STABLE_PACKAGE, PackageManager.PackageInfoFlags.of(0L)) + } else { + @Suppress("DEPRECATION") + context.packageManager.getPackageInfo(STABLE_PACKAGE, 0) + } + info.applicationInfo.enabled + } catch (e: PackageManager.NameNotFoundException) { + false + } } } diff --git a/kotlin/android/app/src/main/res/values/strings.xml b/kotlin/android/app/src/main/res/values/strings.xml index 5303d3571..d8b9a91fd 100644 --- a/kotlin/android/app/src/main/res/values/strings.xml +++ b/kotlin/android/app/src/main/res/values/strings.xml @@ -27,6 +27,7 @@ Request Permission Enter team id Sign In (Debug User) + Signing in requires chrome browser