summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-05-22 23:12:41 +0200
committerAlbin <albin@mullvad.net>2023-05-23 16:27:32 +0200
commit5cae6612dfaed04079a34e38b47c6bc7a5d6dcdb (patch)
treebab47aef017e90de816e1eb057c50251b01ce155 /android
parent6d8b81e305489bafed9e84a7c297e4f71ac3e9dc (diff)
downloadmullvadvpn-5cae6612dfaed04079a34e38b47c6bc7a5d6dcdb.tar.xz
mullvadvpn-5cae6612dfaed04079a34e38b47c6bc7a5d6dcdb.zip
Move content type and key to seperate files
Diffstat (limited to 'android')
-rw-r--r--android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt6
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/SplitTunnelingCell.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/CommonContentKey.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/ContentType.kt11
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/constant/SplitTunnelingContentKey.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt53
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/SplitTunnelingFragment.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt2
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt6
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())