summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAleksandr Granin <aleksandr@mullvad.net>2021-08-26 13:18:54 +0200
committerAleksandr Granin <aleksandr@mullvad.net>2021-08-26 13:18:54 +0200
commit5538762a00723fbcddd52cd7dc01bc0cc7eb3a37 (patch)
tree778d191a6d8151b86fef47827de16f36f131ba6e
parent63f678dce2c5a61b39a5f3ca603caf336193a9ff (diff)
parent179a4116714b589a357216ad49088287b7ac5cb5 (diff)
downloadmullvadvpn-5538762a00723fbcddd52cd7dc01bc0cc7eb3a37.tar.xz
mullvadvpn-5538762a00723fbcddd52cd7dc01bc0cc7eb3a37.zip
Merge branch 'add-system-apps-to-splittunnel'
-rw-r--r--CHANGELOG.md3
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/applist/AppData.kt7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProvider.kt8
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/applist/ViewIntent.kt1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/SplitTunnelingFragment.kt11
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModel.kt20
-rw-r--r--android/src/main/res/values/strings.xml1
-rw-r--r--android/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsProviderTest.kt11
-rw-r--r--android/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/SplitTunnelingViewModelTest.kt11
-rw-r--r--gui/locales/messages.pot3
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 ""