From 0222c25ae47b80efda5bfebf8e1e199406b9bbb8 Mon Sep 17 00:00:00 2001 From: Jamil Date: Wed, 29 Jan 2025 22:16:09 +0000 Subject: [PATCH] chore(android): Run `spotlessApply` with new version 7 (#7949) Spotless version 7 introduced some new linter rules that need to be applied for the kotlin static analysis checks to succeed. Supersedes: #7929 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- kotlin/android/app/build.gradle.kts | 2 +- .../firezone/android/core/HiltTestRunner.kt | 4 +- .../dev/firezone/android/core/ViewActions.kt | 3 +- .../android/core/BaseUrlInterceptor.kt | 3 +- .../firezone/android/core/data/Repository.kt | 27 +++-- .../dev/firezone/android/core/di/AppModule.kt | 3 +- .../firezone/android/core/di/NetworkModule.kt | 6 +- .../android/features/auth/ui/AuthActivity.kt | 6 +- .../android/features/auth/ui/AuthViewModel.kt | 4 +- .../notifications/CustomUriNotification.kt | 7 +- .../customuri/ui/CustomUriViewModel.kt | 4 +- .../session/ui/ResourceDetailsBottomSheet.kt | 9 +- .../features/session/ui/ResourceViewModel.kt | 18 ++-- .../features/session/ui/ResourcesAdapter.kt | 17 ++- .../features/session/ui/SessionActivity.kt | 4 +- .../features/session/ui/SessionViewModel.kt | 21 +++- .../features/settings/ui/SettingsActivity.kt | 10 +- .../features/settings/ui/SettingsViewModel.kt | 12 ++- .../features/splash/ui/SplashViewModel.kt | 4 +- .../android/tunnel/DisconnectMonitor.kt | 4 +- .../firezone/android/tunnel/NetworkMonitor.kt | 4 +- .../firezone/android/tunnel/TunnelService.kt | 102 +++++++++--------- .../tunnel/TunnelStatusNotification.kt | 3 +- .../firezone/android/tunnel/model/Resource.kt | 4 +- 24 files changed, 149 insertions(+), 132 deletions(-) diff --git a/kotlin/android/app/build.gradle.kts b/kotlin/android/app/build.gradle.kts index 6fd1a1944..bfaf919e1 100644 --- a/kotlin/android/app/build.gradle.kts +++ b/kotlin/android/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { id("com.google.dagger.hilt.android") id("com.google.gms.google-services") id("com.google.firebase.crashlytics") - id("com.diffplug.spotless") version "6.25.0" + id("com.diffplug.spotless") version "7.0.2" id("com.google.firebase.appdistribution") id("kotlin-parcelize") id("androidx.navigation.safeargs") diff --git a/kotlin/android/app/src/androidTest/java/dev/firezone/android/core/HiltTestRunner.kt b/kotlin/android/app/src/androidTest/java/dev/firezone/android/core/HiltTestRunner.kt index 059b5706f..9df71903b 100644 --- a/kotlin/android/app/src/androidTest/java/dev/firezone/android/core/HiltTestRunner.kt +++ b/kotlin/android/app/src/androidTest/java/dev/firezone/android/core/HiltTestRunner.kt @@ -11,7 +11,5 @@ class HiltTestRunner : AndroidJUnitRunner() { cl: ClassLoader?, className: String?, context: Context?, - ): Application { - return super.newApplication(cl, HiltTestApplication::class.java.name, context) - } + ): Application = super.newApplication(cl, HiltTestApplication::class.java.name, context) } diff --git a/kotlin/android/app/src/androidTest/java/dev/firezone/android/core/ViewActions.kt b/kotlin/android/app/src/androidTest/java/dev/firezone/android/core/ViewActions.kt index bdbb85e52..efa5fc05d 100644 --- a/kotlin/android/app/src/androidTest/java/dev/firezone/android/core/ViewActions.kt +++ b/kotlin/android/app/src/androidTest/java/dev/firezone/android/core/ViewActions.kt @@ -46,7 +46,8 @@ fun waitForView( uiController.loopMainThreadForAtLeast(100) } while (System.currentTimeMillis() < endTime) - throw PerformException.Builder() + throw PerformException + .Builder() .withCause(TimeoutException()) .withActionDescription(this.description) .withViewDescription(HumanReadables.describe(rootView)) diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/core/BaseUrlInterceptor.kt b/kotlin/android/app/src/main/java/dev/firezone/android/core/BaseUrlInterceptor.kt index 642655887..016935765 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/core/BaseUrlInterceptor.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/core/BaseUrlInterceptor.kt @@ -15,7 +15,8 @@ internal class BaseUrlInterceptor( val newUrl = BuildConfig.AUTH_BASE_URL.toHttpUrlOrNull() val newRequest = - originalRequest.newBuilder() + originalRequest + .newBuilder() .url(newUrl!!) .build() return chain.proceed(newRequest) diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/core/data/Repository.kt b/kotlin/android/app/src/main/java/dev/firezone/android/core/data/Repository.kt index c7004683c..8266faacc 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/core/data/Repository.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/core/data/Repository.kt @@ -31,29 +31,27 @@ enum class ResourceState { UNSET, } -fun ResourceState.isEnabled(): Boolean { - return this == ResourceState.ENABLED -} +fun ResourceState.isEnabled(): Boolean = this == ResourceState.ENABLED -fun ResourceState.stateSymbol(): String { - return if (this.isEnabled()) { +fun ResourceState.stateSymbol(): String = + if (this.isEnabled()) { ON_SYMBOL } else { OFF_SYMBOL } -} -fun ResourceState.toggle(): ResourceState { - return if (this.isEnabled()) { +fun ResourceState.toggle(): ResourceState = + if (this.isEnabled()) { ResourceState.DISABLED } else { ResourceState.ENABLED } -} // Wrapper class used because `MutableStateFlow` will not // notify subscribers if you submit the same object that's already in it. -class Favorites(val inner: HashSet) +class Favorites( + val inner: HashSet, +) internal class Repository @Inject @@ -69,8 +67,8 @@ internal class Repository MutableStateFlow(Favorites(HashSet(sharedPreferences.getStringSet(FAVORITE_RESOURCES_KEY, null).orEmpty()))) val favorites = _favorites.asStateFlow() - fun getConfigSync(): Config { - return Config( + fun getConfigSync(): Config = + Config( sharedPreferences.getString(AUTH_BASE_URL_KEY, null) ?: BuildConfig.AUTH_BASE_URL, sharedPreferences.getString(API_URL_KEY, null) @@ -78,7 +76,6 @@ internal class Repository sharedPreferences.getString(LOG_FILTER_KEY, null) ?: BuildConfig.LOG_FILTER, ) - } fun getConfig(): Flow = flow { @@ -165,7 +162,9 @@ internal class Repository } fun saveInternetResourceStateSync(value: ResourceState): Unit = - sharedPreferences.edit().putString(ENABLED_INTERNET_RESOURCE_KEY, Gson().toJson(value)) + sharedPreferences + .edit() + .putString(ENABLED_INTERNET_RESOURCE_KEY, Gson().toJson(value)) .apply() fun saveNonce(value: String): Flow = diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/core/di/AppModule.kt b/kotlin/android/app/src/main/java/dev/firezone/android/core/di/AppModule.kt index fed6a65e2..c358dc952 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/core/di/AppModule.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/core/di/AppModule.kt @@ -28,7 +28,8 @@ object AppModule { EncryptedSharedPreferences.create( app.applicationContext, ENCRYPTED_SHARED_PREFERENCES, - MasterKey.Builder(app.applicationContext) + MasterKey + .Builder(app.applicationContext) .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) .build(), EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/core/di/NetworkModule.kt b/kotlin/android/app/src/main/java/dev/firezone/android/core/di/NetworkModule.kt index e71312dde..a2d5d1faf 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/core/di/NetworkModule.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/core/di/NetworkModule.kt @@ -37,7 +37,8 @@ internal object NetworkModule { fun provideOkHttpClient( baseUrlInterceptor: BaseUrlInterceptor, loggingInterceptor: HttpLoggingInterceptor, - ) = OkHttpClient.Builder() + ) = OkHttpClient + .Builder() .followRedirects(true) .followSslRedirects(true) .readTimeout(NETWORK_TIMEOUT, TimeUnit.SECONDS) @@ -53,7 +54,8 @@ internal object NetworkModule { okHttpClient: OkHttpClient, moshi: Moshi, ): Retrofit = - Retrofit.Builder() + Retrofit + .Builder() .baseUrl("http://localhost.com/") .client(okHttpClient) .addConverterFactory(MoshiConverterFactory.create(moshi)) 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 4eb2c1383..86a94403a 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 @@ -59,15 +59,15 @@ class AuthActivity : AppCompatActivity(R.layout.activity_auth) { } private fun showError() { - AlertDialog.Builder(this) + AlertDialog + .Builder(this) .setTitle(R.string.error_dialog_title) .setMessage(R.string.error_dialog_message) .setPositiveButton( R.string.error_dialog_button_text, ) { _, _ -> this@AuthActivity.finish() - } - .setIcon(R.drawable.ic_firezone_logo) + }.setIcon(R.drawable.ic_firezone_logo) .show() } } diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthViewModel.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthViewModel.kt index 6576c6fd1..a7dbb9174 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthViewModel.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/auth/ui/AuthViewModel.kt @@ -49,7 +49,9 @@ internal class AuthViewModel } internal sealed class ViewAction { - data class LaunchAuthFlow(val url: String) : ViewAction() + data class LaunchAuthFlow( + val url: String, + ) : ViewAction() object NavigateToSignIn : ViewAction() diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/customuri/notifications/CustomUriNotification.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/customuri/notifications/CustomUriNotification.kt index 8b27e209b..bd613622d 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/customuri/notifications/CustomUriNotification.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/customuri/notifications/CustomUriNotification.kt @@ -34,7 +34,8 @@ object CustomUriNotification { manager.createNotificationChannel(chan) val notificationBuilder = - NotificationCompat.Builder(context, CHANNEL_ID) + NotificationCompat + .Builder(context, CHANNEL_ID) .setContentIntent(configIntent(context)) return status.applySettings(notificationBuilder) } @@ -50,7 +51,9 @@ object CustomUriNotification { ) } - data class Error(val message: String) : StatusType() { + data class Error( + val message: String, + ) : StatusType() { override fun applySettings(builder: NotificationCompat.Builder) = builder.apply { setSmallIcon(R.drawable.ic_firezone_logo) diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/customuri/ui/CustomUriViewModel.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/customuri/ui/CustomUriViewModel.kt index 506b11308..ab992c9c5 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/customuri/ui/CustomUriViewModel.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/customuri/ui/CustomUriViewModel.kt @@ -78,7 +78,9 @@ internal class CustomUriViewModel internal sealed class ViewAction { data object AuthFlowComplete : ViewAction() - data class AuthFlowError(val errors: Iterable) : ViewAction() { + data class AuthFlowError( + val errors: Iterable, + ) : ViewAction() { constructor(vararg errors: String) : this(errors.toList()) } } diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourceDetailsBottomSheet.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourceDetailsBottomSheet.kt index 685198e58..59732e833 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourceDetailsBottomSheet.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourceDetailsBottomSheet.kt @@ -36,9 +36,7 @@ class ResourceDetailsBottomSheet( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, - ): View? { - return inflater.inflate(R.layout.fragment_resource_details, container, false) - } + ): View? = inflater.inflate(R.layout.fragment_resource_details, container, false) override fun onViewCreated( view: View, @@ -92,13 +90,12 @@ class ResourceDetailsBottomSheet( } } - private fun resourceToggleText(resource: ResourceViewModel): String { - return if (resource.state.isEnabled()) { + private fun resourceToggleText(resource: ResourceViewModel): String = + if (resource.state.isEnabled()) { "Disable this resource" } else { "Enable this resource" } - } private fun resourceHeader() { if (resource.isInternetResource()) { diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourceViewModel.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourceViewModel.kt index 47b5ab13a..2ce5f6d22 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourceViewModel.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourceViewModel.kt @@ -9,7 +9,10 @@ import dev.firezone.android.tunnel.model.Site import dev.firezone.android.tunnel.model.StatusEnum import dev.firezone.android.tunnel.model.isInternetResource -class ResourceViewModel(resource: Resource, resourceState: ResourceState) { +class ResourceViewModel( + resource: Resource, + resourceState: ResourceState, +) { val id: String = resource.id val type: ResourceType = resource.type val address: String? = resource.address @@ -24,21 +27,16 @@ class ResourceViewModel(resource: Resource, resourceState: ResourceState) { fun displayName( resource: Resource, state: ResourceState, -): String { - return if (resource.isInternetResource()) { +): String = + if (resource.isInternetResource()) { internetResourceDisplayName(resource, state) } else { resource.name } -} fun internetResourceDisplayName( resource: Resource, state: ResourceState, -): String { - return "${state.stateSymbol()} ${resource.name}" -} +): String = "${state.stateSymbol()} ${resource.name}" -fun ResourceViewModel.isInternetResource(): Boolean { - return this.type == ResourceType.Internet -} +fun ResourceViewModel.isInternetResource(): Boolean = this.type == ResourceType.Internet diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourcesAdapter.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourcesAdapter.kt index cd750d88f..4bc7fe7e4 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourcesAdapter.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/ResourcesAdapter.kt @@ -11,8 +11,9 @@ import androidx.recyclerview.widget.RecyclerView import dev.firezone.android.core.data.ResourceState import dev.firezone.android.databinding.ListItemResourceBinding -internal class ResourcesAdapter(private val internetResourceToggle: () -> ResourceState) : - ListAdapter( +internal class ResourcesAdapter( + private val internetResourceToggle: () -> ResourceState, +) : ListAdapter( ResourceDiffCallback(), ) { override fun onCreateViewHolder( @@ -38,7 +39,9 @@ internal class ResourcesAdapter(private val internetResourceToggle: () -> Resour } } - class ViewHolder(private val binding: ListItemResourceBinding) : RecyclerView.ViewHolder(binding.root) { + class ViewHolder( + private val binding: ListItemResourceBinding, + ) : RecyclerView.ViewHolder(binding.root) { fun bind(resource: ResourceViewModel) { binding.resourceNameText.text = resource.displayName if (resource.isInternetResource()) { @@ -53,15 +56,11 @@ internal class ResourcesAdapter(private val internetResourceToggle: () -> Resour override fun areItemsTheSame( oldItem: ResourceViewModel, newItem: ResourceViewModel, - ): Boolean { - return oldItem.id == newItem.id - } + ): Boolean = oldItem.id == newItem.id override fun areContentsTheSame( oldItem: ResourceViewModel, newItem: ResourceViewModel, - ): Boolean { - return oldItem == newItem - } + ): Boolean = oldItem == newItem } } diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/SessionActivity.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/SessionActivity.kt index b348982a0..27f7c5512 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/SessionActivity.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/SessionActivity.kt @@ -75,9 +75,7 @@ class SessionActivity : AppCompatActivity() { super.onDestroy() } - fun internetState(): ResourceState { - return tunnelService?.internetState() ?: ResourceState.UNSET - } + fun internetState(): ResourceState = tunnelService?.internetState() ?: ResourceState.UNSET private fun onInternetResourceToggled(): ResourceState { tunnelService?.let { diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/SessionViewModel.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/SessionViewModel.kt index b15baa13b..b773f46e5 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/SessionViewModel.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/session/ui/SessionViewModel.kt @@ -58,17 +58,24 @@ internal class SessionViewModel } } - return if (repo.favorites.value.inner.isEmpty()) { + return if (repo.favorites.value.inner + .isEmpty() + ) { resources } else if (selectedTab == RESOURCES_TAB_FAVORITES) { - resources.filter { repo.favorites.value.inner.contains(it.id) } + resources.filter { + repo.favorites.value.inner + .contains(it.id) + } } else { resources } } fun forceTab(): Int? = - if (repo.favorites.value.inner.isEmpty()) { + if (repo.favorites.value.inner + .isEmpty() + ) { RESOURCES_TAB_ALL } else { null @@ -78,10 +85,14 @@ internal class SessionViewModel selectedTab = position } - fun isFavorite(id: String) = repo.favorites.value.inner.contains(id) + fun isFavorite(id: String) = + repo.favorites.value.inner + .contains(id) fun tabLayoutVisibility(): Int = - if (repo.favorites.value.inner.isNotEmpty()) { + if (repo.favorites.value.inner + .isNotEmpty() + ) { View.VISIBLE } else { View.GONE diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/settings/ui/SettingsActivity.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/settings/ui/SettingsActivity.kt index 519c7206d..dc502f1e1 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/settings/ui/SettingsActivity.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/settings/ui/SettingsActivity.kt @@ -108,16 +108,16 @@ internal class SettingsActivity : AppCompatActivity() { } } - private inner class SettingsPagerAdapter(activity: FragmentActivity) : - FragmentStateAdapter(activity) { + private inner class SettingsPagerAdapter( + activity: FragmentActivity, + ) : FragmentStateAdapter(activity) { override fun getItemCount(): Int = 2 // Two tabs - override fun createFragment(position: Int): Fragment { - return when (position) { + override fun createFragment(position: Int): Fragment = + when (position) { 0 -> AdvancedSettingsFragment() 1 -> LogSettingsFragment() else -> throw IllegalArgumentException("Invalid tab position: $position") } - } } } diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/settings/ui/SettingsViewModel.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/settings/ui/SettingsViewModel.kt index 65b8bc16f..a02e598e6 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/settings/ui/SettingsViewModel.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/settings/ui/SettingsViewModel.kt @@ -56,7 +56,12 @@ internal class SettingsViewModel fun onViewResume(context: Context) { val directory = File(context.cacheDir.absolutePath + "/logs") - val totalSize = directory.walkTopDown().filter { it.isFile }.map { it.length() }.sum() + val totalSize = + directory + .walkTopDown() + .filter { it.isFile } + .map { it.length() } + .sum() _uiState.value = _uiState.value.copy( @@ -198,14 +203,13 @@ internal class SettingsViewModel config.logFilter.isNotBlank() } - private fun isUriValid(uri: String): Boolean { - return try { + private fun isUriValid(uri: String): Boolean = + try { URI(uri) true } catch (e: URISyntaxException) { false } - } internal data class UiState( val isSaveButtonEnabled: Boolean = false, diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/features/splash/ui/SplashViewModel.kt b/kotlin/android/app/src/main/java/dev/firezone/android/features/splash/ui/SplashViewModel.kt index 26fa3c739..8b797cf79 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/features/splash/ui/SplashViewModel.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/features/splash/ui/SplashViewModel.kt @@ -48,9 +48,7 @@ internal class SplashViewModel } } - private fun hasVpnPermissions(context: Context): Boolean { - return android.net.VpnService.prepare(context) == null - } + private fun hasVpnPermissions(context: Context): Boolean = android.net.VpnService.prepare(context) == null internal sealed class ViewAction { object NavigateToVpnPermission : ViewAction() diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/DisconnectMonitor.kt b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/DisconnectMonitor.kt index 39beef08e..c908a88ed 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/DisconnectMonitor.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/DisconnectMonitor.kt @@ -10,7 +10,9 @@ import dev.firezone.android.tunnel.TunnelService // None of the TunnelService lifecycle callbacks are called when a user disconnects the VPN // from the system settings. This class listens for network changes and shuts down the service // when the network is lost, which achieves the same effect. -class DisconnectMonitor(private val tunnelService: TunnelService) : ConnectivityManager.NetworkCallback() { +class DisconnectMonitor( + private val tunnelService: TunnelService, +) : ConnectivityManager.NetworkCallback() { private var vpnNetwork: Network? = null // This handler is used to stop connlib when the VPN fd is lost diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/NetworkMonitor.kt b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/NetworkMonitor.kt index 8278ccdb4..4992c8159 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/NetworkMonitor.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/NetworkMonitor.kt @@ -10,7 +10,9 @@ import dev.firezone.android.tunnel.TunnelService import dev.firezone.android.tunnel.TunnelStatusNotification import java.net.InetAddress -class NetworkMonitor(private val tunnelService: TunnelService) : ConnectivityManager.NetworkCallback() { +class NetworkMonitor( + private val tunnelService: TunnelService, +) : ConnectivityManager.NetworkCallback() { private var lastNetwork: Network? = null private var lastDns: List? = null diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelService.kt b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelService.kt index 8e5555770..6c7e156f1 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelService.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelService.kt @@ -101,9 +101,7 @@ class TunnelService : VpnService() { fun getService(): TunnelService = this@TunnelService } - override fun onBind(intent: Intent): IBinder { - return binder - } + override fun onBind(intent: Intent): IBinder = binder private val callback: ConnlibCallback = object : ConnlibCallback { @@ -168,48 +166,51 @@ class TunnelService : VpnService() { } } - Builder().apply { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - setMetered(false) // Inherit the metered status from the underlying networks. + Builder() + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + setMetered(false) // Inherit the metered status from the underlying networks. + } + + if (tunnelRoutes.all { it.prefix != 0 }) { + // Allow traffic to bypass the VPN interface when Always-on VPN is enabled only + // if full-route is not enabled. + allowBypass() + } + + setUnderlyingNetworks(null) // Use all available networks. + + setSession(SESSION_NAME) + setMtu(MTU) + + handleApplications(appRestrictions, "allowedApplications") { addAllowedApplication(it) } + handleApplications( + appRestrictions, + "disallowedApplications", + ) { addDisallowedApplication(it) } + + // Never route GCM notifications through the tunnel. + addDisallowedApplication("com.google.android.gms") // Google Mobile Services + addDisallowedApplication("com.google.firebase.messaging") // Firebase Cloud Messaging + addDisallowedApplication("com.google.android.gsf") // Google Services Framework + + tunnelRoutes.forEach { + addRoute(it.address, it.prefix) + } + + tunnelDnsAddresses.forEach { dns -> + addDnsServer(dns) + } + + addAddress(tunnelIpv4Address!!, 32) + addAddress(tunnelIpv6Address!!, 128) + }.establish() + ?.detachFd() + ?.also { fd -> + connlibSessionPtr?.let { + ConnlibSession.setTun(it, fd) + } } - - if (tunnelRoutes.all { it.prefix != 0 }) { - // Allow traffic to bypass the VPN interface when Always-on VPN is enabled only - // if full-route is not enabled. - allowBypass() - } - - setUnderlyingNetworks(null) // Use all available networks. - - setSession(SESSION_NAME) - setMtu(MTU) - - handleApplications(appRestrictions, "allowedApplications") { addAllowedApplication(it) } - handleApplications( - appRestrictions, - "disallowedApplications", - ) { addDisallowedApplication(it) } - - // Never route GCM notifications through the tunnel. - addDisallowedApplication("com.google.android.gms") // Google Mobile Services - addDisallowedApplication("com.google.firebase.messaging") // Firebase Cloud Messaging - addDisallowedApplication("com.google.android.gsf") // Google Services Framework - - tunnelRoutes.forEach { - addRoute(it.address, it.prefix) - } - - tunnelDnsAddresses.forEach { dns -> - addDnsServer(dns) - } - - addAddress(tunnelIpv4Address!!, 32) - addAddress(tunnelIpv6Address!!, 128) - }.establish()?.detachFd()?.also { fd -> - connlibSessionPtr?.let { - ConnlibSession.setTun(it, fd) - } - } } private val restrictionsFilter = IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED) @@ -263,13 +264,9 @@ class TunnelService : VpnService() { super.onRevoke() } - fun internetState(): ResourceState { - return resourceState - } + fun internetState(): ResourceState = resourceState - private fun internetResource(): Resource? { - return tunnelResources.firstOrNull { it.isInternetResource() } - } + private fun internetResource(): Resource? = tunnelResources.firstOrNull { it.isInternetResource() } // UI updates for resources fun resourcesUpdated() { @@ -432,7 +429,10 @@ class TunnelService : VpnService() { // Get the deviceId from the preferenceRepository, or save a new UUIDv4 and return that if it doesn't exist val deviceId = repo.getDeviceIdSync() ?: run { - val newDeviceId = java.util.UUID.randomUUID().toString() + val newDeviceId = + java.util.UUID + .randomUUID() + .toString() repo.saveDeviceIdSync(newDeviceId) newDeviceId } diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelStatusNotification.kt b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelStatusNotification.kt index 6292f8081..8671cf334 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelStatusNotification.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/TunnelStatusNotification.kt @@ -36,7 +36,8 @@ object TunnelStatusNotification { manager.createNotificationChannel(chan) val notificationBuilder = - NotificationCompat.Builder(context, CHANNEL_ID) + NotificationCompat + .Builder(context, CHANNEL_ID) .setContentIntent(configIntent(context)) return status.applySettings(notificationBuilder) } diff --git a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/model/Resource.kt b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/model/Resource.kt index 14411b0c3..b151638b0 100644 --- a/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/model/Resource.kt +++ b/kotlin/android/app/src/main/java/dev/firezone/android/tunnel/model/Resource.kt @@ -18,9 +18,7 @@ data class Resource( val status: StatusEnum, ) : Parcelable -fun Resource.isInternetResource(): Boolean { - return this.type == ResourceType.Internet -} +fun Resource.isInternetResource(): Boolean = this.type == ResourceType.Internet enum class ResourceType { @Json(name = "dns")