diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-05-22 23:12:41 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2023-05-23 16:27:32 +0200 |
| commit | 5cae6612dfaed04079a34e38b47c6bc7a5d6dcdb (patch) | |
| tree | bab47aef017e90de816e1eb057c50251b01ce155 /android | |
| parent | 6d8b81e305489bafed9e84a7c297e4f71ac3e9dc (diff) | |
| download | mullvadvpn-5cae6612dfaed04079a34e38b47c6bc7a5d6dcdb.tar.xz mullvadvpn-5cae6612dfaed04079a34e38b47c6bc7a5d6dcdb.zip | |
Move content type and key to seperate files
Diffstat (limited to 'android')
9 files changed, 56 insertions, 41 deletions
diff --git a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt index e7fa052d5f..dc011abd05 100644 --- a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt +++ b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt @@ -131,7 +131,7 @@ class SplitTunnelingScreenTest { includedApps = listOf(includedApp), showSystemApps = false ), - addToExcluded = mockedClickHandler + onExcludeAppClick = mockedClickHandler ) } @@ -158,7 +158,7 @@ class SplitTunnelingScreenTest { includedApps = listOf(includedApp), showSystemApps = false ), - removeFromExcluded = mockedClickHandler + onIncludeAppClick = mockedClickHandler ) } @@ -185,7 +185,7 @@ class SplitTunnelingScreenTest { includedApps = listOf(includedApp), showSystemApps = false ), - onShowSystemAppsClicked = mockedClickHandler + onShowSystemAppsClick = mockedClickHandler ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/SplitTunnelingCell.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/SplitTunnelingCell.kt index adf097c2e9..06e0197268 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/SplitTunnelingCell.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/SplitTunnelingCell.kt @@ -14,7 +14,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment -import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview @@ -36,7 +35,6 @@ fun PreviewTunnelingCell() { } } -@OptIn(ExperimentalComposeUiApi::class) @Composable fun SplitTunnelingCell( title: String, @@ -60,7 +58,6 @@ fun SplitTunnelingCell( update = { applicationImageView -> applicationImageView.packageName = packageName ?: "" }, - onReset = {}, modifier = Modifier.padding(start = Dimens.cellLeftPadding) .align(Alignment.CenterVertically) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/CommonContentKey.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/CommonContentKey.kt new file mode 100644 index 0000000000..41dbcadaa1 --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/CommonContentKey.kt @@ -0,0 +1,7 @@ +package net.mullvad.mullvadvpn.compose.constant + +object CommonContentKey { + const val DESCRIPTION = "description" + const val SPACER = "spacer" + const val PROGRESS = "progress" +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/ContentType.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/ContentType.kt new file mode 100644 index 0000000000..df55278d07 --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/ContentType.kt @@ -0,0 +1,11 @@ +package net.mullvad.mullvadvpn.compose.constant + +// Content types, to improve the ability to reuse views +object ContentType { + const val HEADER = 1 + const val ITEM = 2 + const val OTHER_ITEM = 3 + const val DESCRIPTION = 4 + const val SPACER = 5 + const val PROGRESS = 6 +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/SplitTunnelingContentKey.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/SplitTunnelingContentKey.kt new file mode 100644 index 0000000000..28a123410f --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/SplitTunnelingContentKey.kt @@ -0,0 +1,7 @@ +package net.mullvad.mullvadvpn.compose.constant + +object SplitTunnelingContentKey { + const val EXCLUDED_APPLICATIONS = "excluded" + const val SHOW_SYSTEM_APPLICATIONS = "show_system" + const val INCLUDED_APPLICATIONS = "included" +} 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 5fc222bf0a..a46e5dad35 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 @@ -28,6 +28,9 @@ import net.mullvad.mullvadvpn.compose.cell.SwitchComposeCell import net.mullvad.mullvadvpn.compose.component.CollapsableAwareToolbarScaffold import net.mullvad.mullvadvpn.compose.component.CollapsingTopBar import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar +import net.mullvad.mullvadvpn.compose.constant.CommonContentKey +import net.mullvad.mullvadvpn.compose.constant.ContentType +import net.mullvad.mullvadvpn.compose.constant.SplitTunnelingContentKey import net.mullvad.mullvadvpn.compose.extensions.itemWithDivider import net.mullvad.mullvadvpn.compose.state.SplitTunnelingUiState import net.mullvad.mullvadvpn.compose.theme.AppTheme @@ -43,12 +46,12 @@ fun PreviewSplitTunnelingScreen() { excludedApps = listOf( AppData( - packageName = "Package C", + packageName = "my.package.a", name = "TitleA", iconRes = R.drawable.icon_alert ), AppData( - packageName = "Package G", + packageName = "my.package.b", name = "TitleB", iconRes = R.drawable.icon_chevron, ) @@ -56,7 +59,7 @@ fun PreviewSplitTunnelingScreen() { includedApps = listOf( AppData( - packageName = "Package I", + packageName = "my.package.c", name = "TitleC", iconRes = R.drawable.icon_alert ) @@ -71,7 +74,7 @@ fun PreviewSplitTunnelingScreen() { @OptIn(ExperimentalFoundationApi::class) fun SplitTunnelingScreen( uiState: SplitTunnelingUiState = SplitTunnelingUiState.Loading, - onShowSystemAppsClicked: (show: Boolean) -> Unit = {}, + onShowSystemAppsClick: (show: Boolean) -> Unit = {}, onExcludeAppClick: (packageName: String) -> Unit = {}, onIncludeAppClick: (packageName: String) -> Unit = {}, onBackClick: () -> Unit = {} @@ -107,7 +110,7 @@ fun SplitTunnelingScreen( horizontalAlignment = Alignment.CenterHorizontally, state = lazyListState ) { - item(key = KEY_DESCRIPTION, contentType = TYPE_DESCRIPTION) { + item(key = CommonContentKey.DESCRIPTION, contentType = ContentType.DESCRIPTION) { Text( style = MaterialTheme.typography.labelMedium, text = stringResource(id = R.string.split_tunneling_description), @@ -121,7 +124,7 @@ fun SplitTunnelingScreen( } when (uiState) { SplitTunnelingUiState.Loading -> { - item(key = KEY_PROGRESS, contentType = TYPE_PROGRESS) { + item(key = CommonContentKey.PROGRESS, contentType = ContentType.PROGRESS) { CircularProgressIndicator( color = MaterialTheme.colorScheme.onBackground, modifier = @@ -134,7 +137,10 @@ fun SplitTunnelingScreen( } is SplitTunnelingUiState.ShowAppList -> { if (uiState.excludedApps.isNotEmpty()) { - itemWithDivider(key = KEY_EXCLUDED_APPLICATIONS, contentType = TYPE_TITLE) { + itemWithDivider( + key = SplitTunnelingContentKey.EXCLUDED_APPLICATIONS, + contentType = ContentType.HEADER + ) { BaseCell( title = { Text( @@ -149,7 +155,7 @@ fun SplitTunnelingScreen( items( items = uiState.excludedApps, key = { listItem -> listItem.packageName }, - contentType = { TYPE_APPLICATION } + contentType = { ContentType.ITEM } ) { listItem -> SplitTunnelingCell( title = listItem.name, @@ -160,22 +166,25 @@ fun SplitTunnelingScreen( onIncludeAppClick(listItem.packageName) } } - item(key = KEY_SPACER, contentType = TYPE_SPACER) { + item(key = CommonContentKey.SPACER, contentType = ContentType.SPACER) { Spacer(modifier = Modifier.height(Dimens.mediumPadding)) } } itemWithDivider( - key = KEY_SHOW_SYSTEM_APPLICATIONS, - contentType = TYPE_SWITCH_CELL + key = SplitTunnelingContentKey.SHOW_SYSTEM_APPLICATIONS, + contentType = ContentType.OTHER_ITEM ) { SwitchComposeCell( title = stringResource(id = R.string.show_system_apps), isToggled = uiState.showSystemApps, - onCellClicked = { newValue -> onShowSystemAppsClicked(newValue) } + onCellClicked = { newValue -> onShowSystemAppsClick(newValue) } ) } - itemWithDivider(key = KEY_INCLUDED_APPLICATIONS, contentType = TYPE_TITLE) { + itemWithDivider( + key = SplitTunnelingContentKey.INCLUDED_APPLICATIONS, + contentType = ContentType.HEADER + ) { BaseCell( title = { Text( @@ -190,7 +199,7 @@ fun SplitTunnelingScreen( items( items = uiState.includedApps, key = { listItem -> listItem.packageName }, - contentType = { TYPE_APPLICATION } + contentType = { ContentType.ITEM } ) { listItem -> SplitTunnelingCell( title = listItem.name, @@ -206,19 +215,3 @@ fun SplitTunnelingScreen( } } } - -// Content types, to improve the ability to reuse views -const val TYPE_DESCRIPTION = 1 -const val TYPE_TITLE = 2 -const val TYPE_SWITCH_CELL = 3 -const val TYPE_APPLICATION = 4 -const val TYPE_SPACER = 5 -const val TYPE_PROGRESS = 6 - -// Keys, also to improve re-usability of views -const val KEY_DESCRIPTION = "description" -const val KEY_EXCLUDED_APPLICATIONS = "excluded" -const val KEY_SHOW_SYSTEM_APPLICATIONS = "show_system" -const val KEY_INCLUDED_APPLICATIONS = "included" -const val KEY_SPACER = "spacer" -const val KEY_PROGRESS = "progress" diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/SplitTunnelingFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/SplitTunnelingFragment.kt index 9a920d7324..59328dc273 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/SplitTunnelingFragment.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/SplitTunnelingFragment.kt @@ -26,7 +26,7 @@ class SplitTunnelingFragment : BaseFragment() { val state = viewModel.uiState.collectAsState().value SplitTunnelingScreen( uiState = state, - onShowSystemAppsClicked = viewModel::onShowSystemAppsClicked, + onShowSystemAppsClick = viewModel::onShowSystemAppsClick, onExcludeAppClick = viewModel::onExcludeAppClick, onIncludeAppClick = viewModel::onIncludeAppClick, onBackClick = { activity?.onBackPressedDispatcher?.onBackPressed() } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt index a1376eabb4..bb543d85cf 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt @@ -101,7 +101,7 @@ class SplitTunnelingViewModel( } } - fun onShowSystemAppsClicked(show: Boolean) { + fun onShowSystemAppsClick(show: Boolean) { viewModelScope.launch(dispatcher) { showSystemApps.emit(show) } } 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 2b5a7f261c..8077468a6d 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 @@ -111,7 +111,7 @@ class SplitTunnelingViewModelTest { } @Test - fun test_remove_app_from_excluded() = + fun test_include_app() = runTest(testCoroutineRule.testDispatcher) { var excludedAppsCallback = slot<(Set<String>) -> Unit>() val app = AppData("test", 0, "testName") @@ -139,7 +139,7 @@ class SplitTunnelingViewModelTest { testSubject.uiState.test { assertEquals(expectedStateBeforeAction, awaitItem()) - testSubject.removeFromExcluded(app.packageName) + testSubject.onIncludeAppClick(app.packageName) excludedAppsCallback.invoke(emptySet()) assertEquals(expectedStateAfterAction, awaitItem()) @@ -181,7 +181,7 @@ class SplitTunnelingViewModelTest { testSubject.uiState.test { assertEquals(expectedStateBeforeAction, awaitItem()) - testSubject.addToExcluded(app.packageName) + testSubject.onExcludeAppClick(app.packageName) excludedAppsCallback.invoke(setOf(app.packageName)) assertEquals(expectedStateAfterAction, awaitItem()) |
