diff options
| author | Aleksandr Granin <aleksandr@mullvad.net> | 2021-08-26 13:18:54 +0200 |
|---|---|---|
| committer | Aleksandr Granin <aleksandr@mullvad.net> | 2021-08-26 13:18:54 +0200 |
| commit | 5538762a00723fbcddd52cd7dc01bc0cc7eb3a37 (patch) | |
| tree | 778d191a6d8151b86fef47827de16f36f131ba6e | |
| parent | 63f678dce2c5a61b39a5f3ca603caf336193a9ff (diff) | |
| parent | 179a4116714b589a357216ad49088287b7ac5cb5 (diff) | |
| download | mullvadvpn-5538762a00723fbcddd52cd7dc01bc0cc7eb3a37.tar.xz mullvadvpn-5538762a00723fbcddd52cd7dc01bc0cc7eb3a37.zip | |
Merge branch 'add-system-apps-to-splittunnel'
10 files changed, 64 insertions, 12 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 198fd41a12..75947d3381 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ Line wrap the file at 100 chars. Th - Added possibility to filter locations by provider in the desktop app. - Add WireGuard over TCP CLI option for all relays. +#### Android +- Added toggle for Split tunneling view to be able to show system apps + ### Changed - Only use the account history file to store the last used account. - Update the out of time-view and new account-view to make it more user friendly. diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/AppData.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/AppData.kt index 5bed89c149..ec5912c244 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/AppData.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/AppData.kt @@ -1,3 +1,8 @@ package net.mullvad.mullvadvpn.applist -data class AppData(val packageName: String, val iconRes: Int, val name: String) +data class AppData( + val packageName: String, + val iconRes: Int, + val name: String, + val isSystemApp: Boolean = false +) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt index ab6315afd2..774392f1a6 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt @@ -10,7 +10,6 @@ class ApplicationsProvider( ) { private val applicationFilterPredicate: (ApplicationInfo) -> Boolean = { appInfo -> hasInternetPermission(appInfo.packageName) && - isLaunchable(appInfo.packageName) && !isSelfApplication(appInfo.packageName) } @@ -19,7 +18,12 @@ class ApplicationsProvider( .asSequence() .filter(applicationFilterPredicate) .map { info -> - AppData(info.packageName, info.icon, info.loadLabel(packageManager).toString()) + AppData( + info.packageName, + info.icon, + info.loadLabel(packageManager).toString(), + !isLaunchable(info.packageName) + ) } .toList() } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ViewIntent.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ViewIntent.kt index f1c15abbb8..47391f2971 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ViewIntent.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ViewIntent.kt @@ -6,4 +6,5 @@ sealed class ViewIntent { // In future we will have search intent data class ChangeApplicationGroup(val item: ListItemData) : ViewIntent() object ViewIsReady : ViewIntent() + data class ShowSystemApps(internal val show: Boolean) : ViewIntent() } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/SplitTunnelingFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/SplitTunnelingFragment.kt index 82d647fc3b..494753845f 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/SplitTunnelingFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/SplitTunnelingFragment.kt @@ -22,6 +22,8 @@ import net.mullvad.mullvadvpn.applist.ViewIntent import net.mullvad.mullvadvpn.di.APPS_SCOPE import net.mullvad.mullvadvpn.di.SERVICE_CONNECTION_SCOPE import net.mullvad.mullvadvpn.model.ListItemData +import net.mullvad.mullvadvpn.model.WidgetState.ImageState +import net.mullvad.mullvadvpn.model.WidgetState.SwitchState import net.mullvad.mullvadvpn.ui.ListItemDividerDecoration import net.mullvad.mullvadvpn.ui.ListItemListener import net.mullvad.mullvadvpn.ui.ListItemsAdapter @@ -46,10 +48,14 @@ class SplitTunnelingFragment : BaseFragment(R.layout.collapsed_title_layout) { ViewModelOwner.from(this, this) } ) + private val toggleSystemAppsVisibility = Channel<Boolean>(Channel.CONFLATED) private val toggleExcludeChannel = Channel<ListItemData>(Channel.BUFFERED) private val listItemListener = object : ListItemListener { override fun onItemAction(item: ListItemData) { - toggleExcludeChannel.offer(item) + when (item.widget) { + is ImageState -> toggleExcludeChannel.offer(item) + is SwitchState -> toggleSystemAppsVisibility.offer(!item.widget.isChecked) + } } } @@ -100,7 +106,8 @@ class SplitTunnelingFragment : BaseFragment(R.layout.collapsed_title_layout) { private fun intents(): Flow<ViewIntent> = merge( transitionFinishedFlow.map { ViewIntent.ViewIsReady }, - toggleExcludeChannel.consumeAsFlow().map { ViewIntent.ChangeApplicationGroup(it) } + toggleExcludeChannel.consumeAsFlow().map { ViewIntent.ChangeApplicationGroup(it) }, + toggleSystemAppsVisibility.consumeAsFlow().map { ViewIntent.ShowSystemApps(it) } ) private fun tweakMargin(view: View) { diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt index 9e18a90ab7..71db6686ca 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt @@ -38,6 +38,7 @@ class SplitTunnelingViewModel( createTextItem(R.string.split_tunneling_description) // We will have search item in future ) + private var isSystemAppsVisible = false init { viewModelScope.launch(dispatcher) { @@ -73,6 +74,10 @@ class SplitTunnelingViewModel( } } is ViewIntent.ViewIsReady -> isUIReady.complete(Unit) + is ViewIntent.ShowSystemApps -> { + isSystemAppsVisible = viewIntent.show + publishList() + } } } @@ -112,10 +117,13 @@ class SplitTunnelingViewModel( createApplicationItem(info, true) } } - if (notExcludedApps.isNotEmpty()) { + val shownNotExcludedApps = + notExcludedApps.filter { app -> !app.value.isSystemApp || isSystemAppsVisible } + if (shownNotExcludedApps.isNotEmpty()) { listItems += createDivider(1) + listItems += createSwitchItem(R.string.show_system_apps, isSystemAppsVisible) listItems += createMainItem(R.string.all_applications) - listItems += notExcludedApps.values.sortedBy { it.name }.map { info -> + listItems += shownNotExcludedApps.values.sortedBy { it.name }.map { info -> createApplicationItem(info, false) } } @@ -153,4 +161,12 @@ class SplitTunnelingViewModel( private fun createProgressItem(): ListItemData = ListItemData.build(identifier = "progress") { type = ListItemData.PROGRESS } + + private fun createSwitchItem(@StringRes text: Int, checked: Boolean): ListItemData = + ListItemData.build(identifier = "switch_$text") { + type = ListItemData.ACTION + textRes = text + action = ListItemData.ItemAction(text.toString()) + widget = WidgetState.SwitchState(checked) + } } diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml index 6202fe7bbb..f9351cbb13 100644 --- a/android/src/main/res/values/strings.xml +++ b/android/src/main/res/values/strings.xml @@ -181,4 +181,5 @@ <string name="download_url">https://mullvad.net/en/download</string> <string name="faqs_and_guides_url">https://mullvad.net/en/help/tag/mullvad-app/</string> <string name="copied_to_clipboard">Copied to clipboard</string> + <string name="show_system_apps">Show system apps</string> </resources> diff --git a/android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt b/android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt index 578f6b4821..e1a9e37ac4 100644 --- a/android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt +++ b/android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt @@ -51,6 +51,7 @@ class ApplicationsProviderTest { val result = testSubject.getAppsList() val expected = listOf( AppData(launchWithInternetPackageName, 0, launchWithInternetPackageName), + AppData(nonLaunchWithInternetPackageName, 0, nonLaunchWithInternetPackageName, true), AppData(leanbackLaunchWithInternetPackageName, 0, leanbackLaunchWithInternetPackageName) ) @@ -74,8 +75,7 @@ class ApplicationsProviderTest { listOf( launchWithInternetPackageName, nonLaunchWithInternetPackageName, - leanbackLaunchWithInternetPackageName, - selfPackageName + leanbackLaunchWithInternetPackageName ).forEach { packageName -> mockedPackageManager.getLaunchIntentForPackage(packageName) } @@ -93,7 +93,8 @@ class ApplicationsProviderTest { packageName: String, launch: Boolean = false, leanback: Boolean = false, - internet: Boolean = false + internet: Boolean = false, + systemApp: Boolean = false ): ApplicationInfo { val mockApplicationInfo = mockk<ApplicationInfo>() @@ -104,14 +105,14 @@ class ApplicationsProviderTest { every { mockedPackageManager.getLaunchIntentForPackage(packageName) - } returns if (launch) + } returns if (launch || systemApp) mockk() else null every { mockedPackageManager.getLeanbackLaunchIntentForPackage(packageName) - } returns if (leanback) + } returns if (leanback || systemApp) mockk() else null diff --git a/android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt b/android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt index f2834082c5..ac229ba3fb 100644 --- a/android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt +++ b/android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt @@ -93,6 +93,7 @@ class SplitTunnelingViewModelTest { createMainItem(R.string.exclude_applications), createApplicationItem(appExcluded, true), createDivider(1), + createSwitchItem(R.string.show_system_apps, false), createMainItem(R.string.all_applications), createApplicationItem(appNotExcluded, false), ) @@ -131,6 +132,7 @@ class SplitTunnelingViewModelTest { val expectedList = listOf( createTextItem(R.string.split_tunneling_description), createDivider(1), + createSwitchItem(R.string.show_system_apps, false), createMainItem(R.string.all_applications), createApplicationItem(app, false), ) @@ -156,6 +158,7 @@ class SplitTunnelingViewModelTest { val expectedListBeforeAction = listOf( createTextItem(R.string.split_tunneling_description), createDivider(1), + createSwitchItem(R.string.show_system_apps, false), createMainItem(R.string.all_applications), createApplicationItem(app, false), ) @@ -224,4 +227,12 @@ class SplitTunnelingViewModelTest { private fun createProgressItem(): ListItemData = ListItemData.build(identifier = "progress") { type = ListItemData.PROGRESS } + + private fun createSwitchItem(@StringRes text: Int, checked: Boolean): ListItemData = + ListItemData.build(identifier = "switch_$text") { + type = ListItemData.ACTION + textRes = text + action = ListItemData.ItemAction(text.toString()) + widget = WidgetState.SwitchState(checked) + } } diff --git a/gui/locales/messages.pot b/gui/locales/messages.pot index 7ad0485586..22c12be39e 100644 --- a/gui/locales/messages.pot +++ b/gui/locales/messages.pot @@ -1355,6 +1355,9 @@ msgstr "" msgid "Secured" msgstr "" +msgid "Show system apps" +msgstr "" + msgid "Shows current VPN tunnel status" msgstr "" |
