diff options
Diffstat (limited to 'android')
50 files changed, 175 insertions, 133 deletions
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 97a3965aaf..979eb466e2 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -136,12 +136,10 @@ android { } kotlinOptions { - allWarningsAsErrors = false jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true freeCompilerArgs = listOf( - "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", - "-opt-in=kotlinx.coroutines.ObsoleteCoroutinesApi", // Opt-in option for Koin annotation of KoinComponent. "-opt-in=kotlin.RequiresOptIn", ) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/NavigationComposeCell.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/NavigationComposeCell.kt index 2240e10eb8..0fd7674c89 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/NavigationComposeCell.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/NavigationComposeCell.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.OpenInNew import androidx.compose.material.icons.filled.ChevronRight import androidx.compose.material.icons.filled.Error import androidx.compose.material.icons.filled.OpenInNew @@ -116,7 +117,7 @@ internal fun NavigationTitleView( @Composable internal fun DefaultExternalLinkView(chevronContentDescription: String, tint: Color) { Icon( - imageVector = Icons.Default.OpenInNew, + imageVector = Icons.AutoMirrored.Default.OpenInNew, contentDescription = chevronContentDescription, tint = tint, ) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/MullvadExposedDropdownMenuBox.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/MullvadExposedDropdownMenuBox.kt index c558c078e1..82f9e49220 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/MullvadExposedDropdownMenuBox.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/MullvadExposedDropdownMenuBox.kt @@ -9,6 +9,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MenuAnchorType import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldColors @@ -20,10 +21,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import net.mullvad.mullvadvpn.lib.theme.color.menuItemColors -/* - This has bug with dropdown menu width that might be fixed in compose material 3 1.3 - https://issuetracker.google.com/issues/205589613 -*/ @OptIn(ExperimentalMaterial3Api::class) @Composable fun MullvadExposedDropdownMenuBox( @@ -40,7 +37,7 @@ fun MullvadExposedDropdownMenuBox( modifier = modifier.clickable { expanded = !expanded }, ) { TextField( - modifier = Modifier.fillMaxWidth().menuAnchor(), + modifier = Modifier.fillMaxWidth().menuAnchor(MenuAnchorType.PrimaryNotEditable, true), readOnly = true, value = title, onValueChange = { /* Do nothing */ }, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt index 0a69b4fbb6..cafb9ef11d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt @@ -1,8 +1,6 @@ package net.mullvad.mullvadvpn.compose.screen -import android.net.Uri import androidx.annotation.StringRes -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -18,7 +16,6 @@ import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.text.ClickableText import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ChevronLeft import androidx.compose.material.icons.filled.ChevronRight @@ -37,12 +34,12 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.ExperimentalTextApi +import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.UrlAnnotation import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.withLink import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.constraintlayout.compose.ConstrainedLayoutReference @@ -59,7 +56,6 @@ import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithLargeTopBarAndButton import net.mullvad.mullvadvpn.compose.extensions.toAnnotatedString import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition -import net.mullvad.mullvadvpn.lib.common.util.openLink import net.mullvad.mullvadvpn.lib.common.util.openVpnSettings import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens @@ -80,7 +76,6 @@ fun AutoConnectAndLockdownMode(navigator: DestinationsNavigator) { AutoConnectAndLockdownModeScreen(onBackClick = dropUnlessResumed { navigator.navigateUp() }) } -@OptIn(ExperimentalFoundationApi::class) @Composable fun AutoConnectAndLockdownModeScreen(onBackClick: () -> Unit = {}) { val context = LocalContext.current @@ -101,7 +96,6 @@ fun AutoConnectAndLockdownModeScreen(onBackClick: () -> Unit = {}) { backButtonRef = backButtonRef, nextButtonRef = nextButtonRef, pager = pager, - onOpenUrl = { url -> context.openLink(Uri.parse(url)) }, ) // Go to previous page @@ -149,14 +143,12 @@ fun AutoConnectAndLockdownModeScreen(onBackClick: () -> Unit = {}) { ) } -@OptIn(ExperimentalFoundationApi::class, ExperimentalTextApi::class) @Composable private fun ConstraintLayoutScope.AutoConnectCarousel( pagerState: PagerState, backButtonRef: ConstrainedLayoutReference, nextButtonRef: ConstrainedLayoutReference, pager: ConstrainedLayoutReference, - onOpenUrl: (String) -> Unit, ) { HorizontalPager( state = pagerState, @@ -175,18 +167,13 @@ private fun ConstraintLayoutScope.AutoConnectCarousel( modifier = Modifier.fillMaxWidth(), ) { val annotatedTopText = page.annotatedTopText() - ClickableText( + Text( modifier = Modifier.padding(horizontal = Dimens.largePadding), style = MaterialTheme.typography.titleMedium.copy( color = MaterialTheme.colorScheme.onSurfaceVariant ), text = annotatedTopText, - onClick = { - annotatedTopText.getUrlAnnotations(it, it).let { annotation -> - annotation.firstOrNull()?.item?.url?.let { onOpenUrl(it) } - } - }, ) Image( modifier = Modifier.padding(top = Dimens.topPadding, bottom = Dimens.bottomPadding), @@ -230,7 +217,6 @@ private fun CarouselNavigationButton( } } -@OptIn(ExperimentalFoundationApi::class) @Composable private fun ConstraintLayoutScope.PageIndicator( pagerState: PagerState, @@ -279,14 +265,13 @@ private fun buildTopText(@StringRes id: Int) = buildAnnotatedString { } } -@OptIn(ExperimentalTextApi::class) @Composable private fun buildLockdownTopText() = buildAnnotatedString { append(buildTopText(id = R.string.auto_connect_carousel_third_slide_top_text)) append(" ") withLink( - UrlAnnotation( + LinkAnnotation.Url( stringResource(id = R.string.lockdown_url).appendHideNavOnPlayBuild(IS_PLAY_BUILD) ) ) { @@ -307,20 +292,6 @@ private fun buildLockdownTopText() = buildAnnotatedString { } } -// Will be replaced by upstream withLink in Compose UI 1.7.0 -@OptIn(ExperimentalTextApi::class) -inline fun <R : Any> AnnotatedString.Builder.withLink( - annotation: UrlAnnotation, - block: AnnotatedString.Builder.() -> R, -): R { - val index = pushUrlAnnotation(annotation) - return try { - block(this) - } finally { - pop(index) - } -} - private enum class PAGES( val annotatedTopText: @Composable () -> AnnotatedString, val image: Int, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt index f894eb8eba..69bc87ce9f 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt @@ -1,7 +1,5 @@ package net.mullvad.mullvadvpn.compose.screen -import android.content.Context -import android.net.Uri import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -11,9 +9,8 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.OpenInNew @@ -27,10 +24,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.LinkAnnotation +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.withLink +import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -52,7 +52,6 @@ import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle import net.mullvad.mullvadvpn.compose.util.toDp import net.mullvad.mullvadvpn.constant.DAEMON_READY_TIMEOUT_MS -import net.mullvad.mullvadvpn.lib.common.util.openLink import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.lib.theme.color.AlphaScrollbar @@ -70,7 +69,6 @@ private fun PreviewPrivacyDisclaimerScreen() { PrivacyDisclaimerScreen( PrivacyDisclaimerViewState(isStartingService = false, isPlayBuild = false), {}, - {}, ) } } @@ -108,19 +106,11 @@ fun PrivacyDisclaimer(navigator: DestinationsNavigator) { } } } - PrivacyDisclaimerScreen( - state, - { openPrivacyPolicy(context, state.isPlayBuild) }, - viewModel::setPrivacyDisclosureAccepted, - ) + PrivacyDisclaimerScreen(state, viewModel::setPrivacyDisclosureAccepted) } @Composable -fun PrivacyDisclaimerScreen( - state: PrivacyDisclaimerViewState, - onPrivacyPolicyLinkClicked: () -> Unit, - onAcceptClicked: () -> Unit, -) { +fun PrivacyDisclaimerScreen(state: PrivacyDisclaimerViewState, onAcceptClicked: () -> Unit) { val topColor = MaterialTheme.colorScheme.primary ScaffoldWithTopBar(topBarColor = topColor, onAccountClicked = null, onSettingsClicked = null) { val scrollState = rememberScrollState() @@ -136,7 +126,7 @@ fun PrivacyDisclaimerScreen( ), verticalArrangement = Arrangement.SpaceBetween, ) { - Content(onPrivacyPolicyLinkClicked) + Content(state.isPlayBuild) ButtonPanel(state.isStartingService, onAcceptClicked) } @@ -144,7 +134,7 @@ fun PrivacyDisclaimerScreen( } @Composable -private fun Content(onPrivacyPolicyLinkClicked: () -> Unit) { +private fun Content(isPlayBuild: Boolean) { Column { Text( text = stringResource(id = R.string.privacy_disclaimer_title), @@ -169,26 +159,19 @@ private fun Content(onPrivacyPolicyLinkClicked: () -> Unit) { color = MaterialTheme.colorScheme.onSurface, ) - Row(modifier = Modifier.padding(top = 10.dp)) { - ClickableText( - text = AnnotatedString(stringResource(id = R.string.privacy_policy_label)), - onClick = { onPrivacyPolicyLinkClicked() }, - style = - TextStyle( - fontSize = 12.sp, - color = MaterialTheme.colorScheme.onSurface, - textDecoration = TextDecoration.Underline, - ), + Spacer(modifier = Modifier.height(fontSize.toDp() + Dimens.smallPadding)) + + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = buildPrivacyPolicyAnnotatedString(isPlayBuild), + modifier = Modifier.padding(end = Dimens.miniPadding), ) Icon( imageVector = Icons.AutoMirrored.Filled.OpenInNew, contentDescription = null, modifier = - Modifier.align(Alignment.CenterVertically) - .padding(start = 2.dp, top = 2.dp) - .width(10.dp) - .height(10.dp), + Modifier.align(Alignment.CenterVertically).size(Dimens.privacyPolicyIconSize), tint = MaterialTheme.colorScheme.onSurface, ) } @@ -196,6 +179,25 @@ private fun Content(onPrivacyPolicyLinkClicked: () -> Unit) { } @Composable +private fun buildPrivacyPolicyAnnotatedString(isPlayBuild: Boolean) = buildAnnotatedString { + withLink( + LinkAnnotation.Url( + stringResource(R.string.privacy_policy_url).appendHideNavOnPlayBuild(isPlayBuild) + ) + ) { + withStyle( + style = + SpanStyle( + color = MaterialTheme.colorScheme.onSurface, + textDecoration = TextDecoration.Underline, + ) + ) { + append(stringResource(id = R.string.privacy_policy_label)) + } + } +} + +@Composable private fun ButtonPanel(isStartingService: Boolean, onAcceptClicked: () -> Unit) { Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { if (isStartingService) { @@ -208,13 +210,3 @@ private fun ButtonPanel(isStartingService: Boolean, onAcceptClicked: () -> Unit) } } } - -private fun openPrivacyPolicy(context: Context, isPlayBuild: Boolean) { - context.openLink( - Uri.parse( - context.resources - .getString(R.string.privacy_policy_url) - .appendHideNavOnPlayBuild(isPlayBuild) - ) - ) -} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt index 660beaae94..0dddd926fc 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt @@ -1,7 +1,6 @@ package net.mullvad.mullvadvpn.compose.screen import android.graphics.Bitmap -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -203,7 +202,6 @@ private fun LazyListScope.appList( ) } -@OptIn(ExperimentalFoundationApi::class) private fun LazyListScope.appItems( apps: List<AppData>, focusManager: FocusManager, @@ -223,7 +221,7 @@ private fun LazyListScope.appItems( isSelected = excluded, enabled = enabled, modifier = - Modifier.animateItemPlacement() + Modifier.animateItem() .fillMaxWidth() .alpha( if (enabled) { @@ -247,12 +245,11 @@ private fun LazyListScope.appItems( } } -@OptIn(ExperimentalFoundationApi::class) private fun LazyListScope.headerItem(key: String, textId: Int, enabled: Boolean) { itemWithDivider(key = key, contentType = ContentType.HEADER) { HeaderCell( modifier = - Modifier.animateItemPlacement() + Modifier.animateItem() .alpha( if (enabled) { AlphaVisible @@ -266,7 +263,6 @@ private fun LazyListScope.headerItem(key: String, textId: Int, enabled: Boolean) } } -@OptIn(ExperimentalFoundationApi::class) private fun LazyListScope.systemAppsToggle( showSystemApps: Boolean, onShowSystemAppsClick: (show: Boolean) -> Unit, @@ -282,7 +278,7 @@ private fun LazyListScope.systemAppsToggle( onCellClicked = { newValue -> onShowSystemAppsClick(newValue) }, isEnabled = enabled, modifier = - Modifier.animateItemPlacement() + Modifier.animateItem() .alpha( if (enabled) { AlphaVisible @@ -294,9 +290,8 @@ private fun LazyListScope.systemAppsToggle( } } -@OptIn(ExperimentalFoundationApi::class) private fun LazyListScope.spacer() { item(contentType = ContentType.SPACER) { - Spacer(modifier = Modifier.animateItemPlacement().height(Dimens.mediumPadding)) + Spacer(modifier = Modifier.animateItem().height(Dimens.mediumPadding)) } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt index dd1ed8ffba..24b19cfae6 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt @@ -20,7 +20,6 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -30,6 +29,7 @@ import androidx.compose.ui.unit.dp import androidx.core.text.HtmlCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.dropUnlessResumed import com.ramcosta.composedestinations.annotation.Destination @@ -469,7 +469,7 @@ fun VpnSettingsScreen( isUnreachableLocalDnsWarningVisible = item.isLocal && !state.isLocalNetworkSharingEnabled, onClick = { navigateToDns(index, item.address) }, - modifier = Modifier.animateItemPlacement(), + modifier = Modifier.animateItem(), ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/textfield/ApiAccessMethodTextField.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/textfield/ApiAccessMethodTextField.kt index 05ec572194..561465973e 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/textfield/ApiAccessMethodTextField.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/textfield/ApiAccessMethodTextField.kt @@ -57,7 +57,7 @@ fun ApiAccessMethodTextField( keyboardOptions = KeyboardOptions( capitalization = capitalization, - autoCorrect = false, + autoCorrectEnabled = false, keyboardType = keyboardType, imeAction = imeAction, ), diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/textfield/CustomTextField.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/textfield/CustomTextField.kt index d148550538..b64de576ee 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/textfield/CustomTextField.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/textfield/CustomTextField.kt @@ -47,10 +47,10 @@ fun CustomTextField( capitalization: KeyboardCapitalization = KeyboardCapitalization.None, keyboardOptions: KeyboardOptions = KeyboardOptions( + capitalization = capitalization, + autoCorrectEnabled = false, keyboardType = keyboardType, imeAction = ImeAction.Done, - autoCorrect = false, - capitalization = capitalization, ), ) { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt index 61d491094a..48dada2d61 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt @@ -93,7 +93,7 @@ import net.mullvad.mullvadvpn.viewmodel.WireguardCustomPortDialogViewModel import org.apache.commons.validator.routines.InetAddressValidator import org.koin.android.ext.koin.androidApplication import org.koin.android.ext.koin.androidContext -import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.core.module.dsl.viewModel import org.koin.core.qualifier.named import org.koin.dsl.module diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCase.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCase.kt index 209c213feb..8fd97dc63d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCase.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCase.kt @@ -1,6 +1,7 @@ package net.mullvad.mullvadvpn.usecase import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted @@ -53,6 +54,7 @@ class OutOfTimeUseCase( ?.isCausedByExpiredAccount() ?: false } + @OptIn(ExperimentalCoroutinesApi::class) private fun pastAccountExpiry(): Flow<Boolean?> = repository.accountData .flatMapLatest { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt index c25e71ef9c..200502dee4 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt @@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.util import kotlinx.coroutines.Deferred +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow inline fun <T1, T2, T3, T4, T5, T6, R> combine( @@ -28,6 +29,7 @@ inline fun <T1, T2, T3, T4, T5, T6, R> combine( } } +@OptIn(ExperimentalCoroutinesApi::class) fun <T> Deferred<T>.getOrDefault(default: T) = try { getCompleted() diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplashViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplashViewModel.kt index 9a0d9cdeff..a196d4ae90 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplashViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplashViewModel.kt @@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -32,7 +33,7 @@ class SplashViewModel( splashCompleteRepository.onSplashCompleted() } - private val _uiState = MutableStateFlow<SplashScreenState>(SplashScreenState(false)) + private val _uiState = MutableStateFlow(SplashScreenState(false)) val uiState: StateFlow<SplashScreenState> = _uiState private suspend fun getStartDestination(): SplashUiSideEffect { @@ -61,6 +62,7 @@ class SplashViewModel( } // We know the user is logged in, but we need to find out if their account has expired + @OptIn(ExperimentalCoroutinesApi::class) private suspend fun getLoggedInStartDestination(): SplashUiSideEffect { val expiry = viewModelScope.async { accountRepository.accountData.filterNotNull().first() } diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt index 3bbdcea9cc..84ec047f06 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/InAppNotificationControllerTest.kt @@ -7,6 +7,7 @@ import io.mockk.mockk import io.mockk.unmockkAll import kotlin.test.assertEquals import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -25,6 +26,7 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith +@ExperimentalCoroutinesApi @ExtendWith(TestCoroutineRule::class) class InAppNotificationControllerTest { diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/ApiAccessRepositoryTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/ApiAccessRepositoryTest.kt index 9f0e9e9c68..4d5f305add 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/ApiAccessRepositoryTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/ApiAccessRepositoryTest.kt @@ -6,6 +6,7 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.mockk +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -27,6 +28,7 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +@ExperimentalCoroutinesApi class ApiAccessRepositoryTest { private val mockManagementService: ManagementService = mockk() diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/CustomListsRepositoryTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/CustomListsRepositoryTest.kt index 9148d45be7..d86c82748d 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/CustomListsRepositoryTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/CustomListsRepositoryTest.kt @@ -7,6 +7,7 @@ import io.mockk.coVerify import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest @@ -23,6 +24,7 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +@ExperimentalCoroutinesApi class CustomListsRepositoryTest { private val mockManagementService: ManagementService = mockk() private lateinit var customListsRepository: CustomListsRepository diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/RelayListFilterRepositoryTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/RelayListFilterRepositoryTest.kt index 53d2b1044d..6ec1ae1fea 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/RelayListFilterRepositoryTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/repository/RelayListFilterRepositoryTest.kt @@ -7,6 +7,7 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.mockk +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest @@ -21,6 +22,7 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +@ExperimentalCoroutinesApi class RelayListFilterRepositoryTest { private val mockManagementService: ManagementService = mockk() diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCaseTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCaseTest.kt index 3e905d87f6..d8438cafe0 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCaseTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/usecase/OutOfTimeUseCaseTest.kt @@ -9,6 +9,7 @@ import kotlin.time.Duration.Companion.days import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.consumeAsFlow @@ -29,6 +30,7 @@ import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +@ExperimentalCoroutinesApi class OutOfTimeUseCaseTest { private val mockAccountRepository: AccountRepository = mockk() private val mockConnectionProxy: ConnectionProxy = mockk() diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModelTest.kt index 4fb6047066..d0af241314 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModelTest.kt @@ -10,6 +10,7 @@ import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk import io.mockk.unmockkAll +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest @@ -24,6 +25,7 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith +@ExperimentalCoroutinesApi @ExtendWith(TestCoroutineRule::class) class DeviceRevokedViewModelTest { diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt index a01554befc..ba636197f4 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt @@ -13,6 +13,7 @@ import io.mockk.impl.annotations.MockK import io.mockk.mockk import kotlin.test.assertIs import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest @@ -34,6 +35,7 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith +@ExperimentalCoroutinesApi @ExtendWith(TestCoroutineRule::class) class LoginViewModelTest { diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt index 00fd6e752c..63a0907629 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt @@ -11,6 +11,7 @@ import io.mockk.unmockkAll import io.mockk.verify import java.util.concurrent.TimeUnit import kotlin.test.assertEquals +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -27,6 +28,7 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.Timeout import org.junit.jupiter.api.extension.ExtendWith +@ExperimentalCoroutinesApi @ExtendWith(TestCoroutineRule::class) @Timeout(3000L, unit = TimeUnit.MILLISECONDS) class SplitTunnelingViewModelTest { diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt index 5b878b52b9..d04cdc5d26 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelTest.kt @@ -13,6 +13,7 @@ import io.mockk.unmockkAll import io.mockk.verify import kotlin.test.assertEquals import kotlin.test.assertIs +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -38,6 +39,7 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith +@ExperimentalCoroutinesApi @ExtendWith(TestCoroutineRule::class) class VpnSettingsViewModelTest { diff --git a/android/lib/billing/build.gradle.kts b/android/lib/billing/build.gradle.kts index e6753a306a..46554cf956 100644 --- a/android/lib/billing/build.gradle.kts +++ b/android/lib/billing/build.gradle.kts @@ -20,7 +20,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/billing/src/main/kotlin/net/mullvad/mullvadvpn/lib/billing/BillingRepository.kt b/android/lib/billing/src/main/kotlin/net/mullvad/mullvadvpn/lib/billing/BillingRepository.kt index 9ccd1d77ff..77eaea03a6 100644 --- a/android/lib/billing/src/main/kotlin/net/mullvad/mullvadvpn/lib/billing/BillingRepository.kt +++ b/android/lib/billing/src/main/kotlin/net/mullvad/mullvadvpn/lib/billing/BillingRepository.kt @@ -7,6 +7,7 @@ import com.android.billingclient.api.BillingClient.BillingResponseCode import com.android.billingclient.api.BillingClientStateListener import com.android.billingclient.api.BillingFlowParams import com.android.billingclient.api.BillingResult +import com.android.billingclient.api.PendingPurchasesParams import com.android.billingclient.api.ProductDetails import com.android.billingclient.api.ProductDetailsResult import com.android.billingclient.api.PurchasesResult @@ -62,7 +63,9 @@ class BillingRepository(context: Context) { init { billingClient = BillingClient.newBuilder(context) - .enablePendingPurchases() + .enablePendingPurchases( + PendingPurchasesParams.newBuilder().enableOneTimeProducts().build() + ) .setListener(purchaseUpdateListener) .build() } diff --git a/android/lib/common-test/build.gradle.kts b/android/lib/common-test/build.gradle.kts index 33107baba5..733d2b9111 100644 --- a/android/lib/common-test/build.gradle.kts +++ b/android/lib/common-test/build.gradle.kts @@ -15,7 +15,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/common/build.gradle.kts b/android/lib/common/build.gradle.kts index a686f023a1..2c4fbe0233 100644 --- a/android/lib/common/build.gradle.kts +++ b/android/lib/common/build.gradle.kts @@ -16,7 +16,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/daemon-grpc/build.gradle.kts b/android/lib/daemon-grpc/build.gradle.kts index d8b02aad1d..e1807c9d34 100644 --- a/android/lib/daemon-grpc/build.gradle.kts +++ b/android/lib/daemon-grpc/build.gradle.kts @@ -21,7 +21,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt index 4e74a8f78b..7961b5460c 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt @@ -143,6 +143,7 @@ class ManagementService( private var job: Job? = null // We expect daemon to create the rpc socket file on the path provided on initialisation + @Suppress("DEPRECATION") private val channel = UdsChannelBuilder.forPath( rpcSocketFile.absolutePath, diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/ManagedChannel.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/ManagedChannel.kt index a0e5bd5fd1..8ce5a10876 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/ManagedChannel.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/ManagedChannel.kt @@ -3,13 +3,11 @@ package net.mullvad.mullvadvpn.lib.daemon.grpc.util import co.touchlab.kermit.Logger import io.grpc.ConnectivityState import io.grpc.ManagedChannel -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.isActive import kotlinx.coroutines.suspendCancellableCoroutine -@OptIn(ExperimentalCoroutinesApi::class) internal fun ManagedChannel.connectivityFlow(): Flow<ConnectivityState> { return callbackFlow { var currentState = getState(false) @@ -20,7 +18,9 @@ internal fun ManagedChannel.connectivityFlow(): Flow<ConnectivityState> { currentState = suspendCancellableCoroutine { notifyWhenStateChanged(currentState) { // If we are cancelled we will just log - it.resume(getState(false)) { Logger.w("Resume while cancelled", it) } + it.resume(getState(false)) { cause, value, _ -> + Logger.w("Resume while cancelled, value: $value", cause) + } } } } diff --git a/android/lib/endpoint/build.gradle.kts b/android/lib/endpoint/build.gradle.kts index cf632b1419..7b6e82b769 100644 --- a/android/lib/endpoint/build.gradle.kts +++ b/android/lib/endpoint/build.gradle.kts @@ -16,7 +16,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/endpoint/src/main/kotlin/net/mullvad/mullvadvpn/lib/endpoint/ApiEndpointIntentExtensions.kt b/android/lib/endpoint/src/main/kotlin/net/mullvad/mullvadvpn/lib/endpoint/ApiEndpointIntentExtensions.kt index 9e46c5dda8..d8ba956188 100644 --- a/android/lib/endpoint/src/main/kotlin/net/mullvad/mullvadvpn/lib/endpoint/ApiEndpointIntentExtensions.kt +++ b/android/lib/endpoint/src/main/kotlin/net/mullvad/mullvadvpn/lib/endpoint/ApiEndpointIntentExtensions.kt @@ -13,6 +13,6 @@ fun Intent.getApiEndpointConfigurationExtras(): ApiEndpointOverride? { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { getParcelableExtra(OVERRIDE_API_EXTRA_NAME, ApiEndpointOverride::class.java) } else { - getParcelableExtra(OVERRIDE_API_EXTRA_NAME) + @Suppress("DEPRECATION") getParcelableExtra(OVERRIDE_API_EXTRA_NAME) } } diff --git a/android/lib/intent-provider/build.gradle.kts b/android/lib/intent-provider/build.gradle.kts index 03cafa5970..66c9b6ff74 100644 --- a/android/lib/intent-provider/build.gradle.kts +++ b/android/lib/intent-provider/build.gradle.kts @@ -16,7 +16,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/map/build.gradle.kts b/android/lib/map/build.gradle.kts index 8367a435de..a0253ebc4d 100644 --- a/android/lib/map/build.gradle.kts +++ b/android/lib/map/build.gradle.kts @@ -16,7 +16,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } buildFeatures { compose = true diff --git a/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt b/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt index a1e411bece..05b8d59701 100644 --- a/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt +++ b/android/lib/map/src/main/kotlin/net/mullvad/mullvadvpn/lib/map/Map.kt @@ -4,10 +4,10 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner import net.mullvad.mullvadvpn.lib.map.data.CameraPosition import net.mullvad.mullvadvpn.lib.map.data.GlobeColors import net.mullvad.mullvadvpn.lib.map.data.MapViewState diff --git a/android/lib/model/build.gradle.kts b/android/lib/model/build.gradle.kts index 543852a360..c961dcc32f 100644 --- a/android/lib/model/build.gradle.kts +++ b/android/lib/model/build.gradle.kts @@ -22,7 +22,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Constraint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Constraint.kt index 95e7d95154..79ccd6899e 100644 --- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Constraint.kt +++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Constraint.kt @@ -1,12 +1,8 @@ package net.mullvad.mullvadvpn.lib.model -import arrow.optics.optics - -@optics sealed interface Constraint<out T> { data object Any : Constraint<Nothing> - @optics data class Only<T>(val value: T) : Constraint<T> { companion object } diff --git a/android/lib/payment/build.gradle.kts b/android/lib/payment/build.gradle.kts index 8fda0feacd..421ade90d4 100644 --- a/android/lib/payment/build.gradle.kts +++ b/android/lib/payment/build.gradle.kts @@ -18,7 +18,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/resource/build.gradle.kts b/android/lib/resource/build.gradle.kts index 9a208f29eb..c162b25a0c 100644 --- a/android/lib/resource/build.gradle.kts +++ b/android/lib/resource/build.gradle.kts @@ -16,7 +16,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("lint.xml") diff --git a/android/lib/shared/build.gradle.kts b/android/lib/shared/build.gradle.kts index 1665c2c663..4be82a9eb2 100644 --- a/android/lib/shared/build.gradle.kts +++ b/android/lib/shared/build.gradle.kts @@ -18,7 +18,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/talpid/build.gradle.kts b/android/lib/talpid/build.gradle.kts index 3b4d422af8..a5cd613de1 100644 --- a/android/lib/talpid/build.gradle.kts +++ b/android/lib/talpid/build.gradle.kts @@ -16,7 +16,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/theme/build.gradle.kts b/android/lib/theme/build.gradle.kts index 592cb25337..9c1ac32b09 100644 --- a/android/lib/theme/build.gradle.kts +++ b/android/lib/theme/build.gradle.kts @@ -18,7 +18,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt b/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt index 33fdfd4ded..2407fda047 100644 --- a/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt +++ b/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt @@ -50,6 +50,7 @@ data class Dimensions( val notificationIconPadding: Dp = 10.dp, val notificationStatusIconSize: Dp = 10.dp, val obfuscationNavigationBoxWidth: Dp = 80.dp, + val privacyPolicyIconSize: Dp = 16.dp, val problemReportIconToTitlePadding: Dp = 60.dp, val reconnectButtonMinInteractiveComponentSize: Dp = 40.dp, val relayCircleSize: Dp = 16.dp, diff --git a/android/service/build.gradle.kts b/android/service/build.gradle.kts index 2fbca92cb7..36d3df7eb3 100644 --- a/android/service/build.gradle.kts +++ b/android/service/build.gradle.kts @@ -16,7 +16,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/test/arch/build.gradle.kts b/android/test/arch/build.gradle.kts index 085ad8d835..e84d725f87 100644 --- a/android/test/arch/build.gradle.kts +++ b/android/test/arch/build.gradle.kts @@ -17,7 +17,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/test/common/build.gradle.kts b/android/test/common/build.gradle.kts index 31b8cfa67a..ebb719bbbd 100644 --- a/android/test/common/build.gradle.kts +++ b/android/test/common/build.gradle.kts @@ -16,7 +16,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/test/e2e/build.gradle.kts b/android/test/e2e/build.gradle.kts index 8f4e9c2e0d..50224489d5 100644 --- a/android/test/e2e/build.gradle.kts +++ b/android/test/e2e/build.gradle.kts @@ -82,7 +82,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/SimpleMullvadHttpClient.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/SimpleMullvadHttpClient.kt index 3373691923..5e702a2d80 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/SimpleMullvadHttpClient.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/SimpleMullvadHttpClient.kt @@ -187,7 +187,13 @@ class SimpleMullvadHttpClient(context: Context) { } operator fun <T> JSONArray.iterator(): Iterator<T> = - (0 until this.length()).asSequence().map { this.get(it) as T }.iterator() + (0 until length()) + .asSequence() + .map { + @Suppress("UNCHECKED_CAST") + get(it) as T + } + .iterator() companion object { private const val REQUEST_ERROR_MESSAGE = diff --git a/android/test/mockapi/build.gradle.kts b/android/test/mockapi/build.gradle.kts index 5a571bd4fc..166a389553 100644 --- a/android/test/mockapi/build.gradle.kts +++ b/android/test/mockapi/build.gradle.kts @@ -38,7 +38,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/tile/build.gradle.kts b/android/tile/build.gradle.kts index b3f21e5be9..b1c558685c 100644 --- a/android/tile/build.gradle.kts +++ b/android/tile/build.gradle.kts @@ -16,7 +16,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = Versions.jvmTarget } + kotlinOptions { + jvmTarget = Versions.jvmTarget + allWarningsAsErrors = true + } lint { lintConfig = file("${rootProject.projectDir}/config/lint.xml") diff --git a/android/tile/src/main/kotlin/net/mullvad/mullvadvpn/tile/MullvadTileService.kt b/android/tile/src/main/kotlin/net/mullvad/mullvadvpn/tile/MullvadTileService.kt index ec152fcbbb..b1fa9ae311 100644 --- a/android/tile/src/main/kotlin/net/mullvad/mullvadvpn/tile/MullvadTileService.kt +++ b/android/tile/src/main/kotlin/net/mullvad/mullvadvpn/tile/MullvadTileService.kt @@ -135,7 +135,7 @@ class MullvadTileService : TileService() { ) startActivityAndCollapse(pendingIntent) } else { - startActivityAndCollapse(intent) + @Suppress("DEPRECATION") startActivityAndCollapse(intent) } } |
