summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreenTest.kt17
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt28
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt3
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManagerTest.kt110
4 files changed, 0 insertions, 158 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 12e06b009d..a4f6d1ab4a 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
@@ -1,49 +1,32 @@
package net.mullvad.mullvadvpn.compose.screen
-import android.graphics.Bitmap
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import de.mannodermaus.junit5.compose.createComposeExtension
import io.mockk.MockKAnnotations
-import io.mockk.every
import io.mockk.mockk
import io.mockk.unmockkAll
import io.mockk.verify
import net.mullvad.mullvadvpn.applist.AppData
-import net.mullvad.mullvadvpn.applist.ApplicationsIconManager
import net.mullvad.mullvadvpn.compose.setContentWithTheme
import net.mullvad.mullvadvpn.compose.state.SplitTunnelingUiState
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.RegisterExtension
-import org.koin.core.context.loadKoinModules
-import org.koin.core.context.unloadKoinModules
-import org.koin.dsl.module
@OptIn(ExperimentalTestApi::class)
class SplitTunnelingScreenTest {
@JvmField @RegisterExtension val composeExtension = createComposeExtension()
- private val mockBitmap: Bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888)
- private val testModule = module {
- single {
- mockk<ApplicationsIconManager>().apply {
- every { getAppIcon(any()) } returns mockBitmap
- }
- }
- }
-
@BeforeEach
fun setup() {
MockKAnnotations.init(this)
- loadKoinModules(testModule)
}
@AfterEach
fun tearDown() {
- unloadKoinModules(testModule)
unmockkAll()
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt
deleted file mode 100644
index e1ff07022c..0000000000
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManager.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package net.mullvad.mullvadvpn.applist
-
-import android.content.pm.PackageManager
-import android.graphics.Bitmap
-import android.os.Looper
-import androidx.annotation.WorkerThread
-import androidx.collection.LruCache
-import androidx.core.graphics.drawable.toBitmap
-
-class ApplicationsIconManager(private val packageManager: PackageManager) {
- private val iconsCache = LruCache<String, Bitmap>(500)
-
- @WorkerThread
- @Throws(PackageManager.NameNotFoundException::class)
- fun getAppIcon(packageName: String): Bitmap {
- check(!Looper.getMainLooper().isCurrentThread) { "Should not be called from MainThread" }
- iconsCache.get(packageName)?.let {
- return it
- }
- return packageManager.getApplicationIcon(packageName).toBitmap().also {
- iconsCache.put(packageName, it)
- }
- }
-
- fun dispose() {
- iconsCache.evictAll()
- }
-}
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 56d6b71a2d..5e51cc99d4 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
@@ -7,7 +7,6 @@ import android.os.Messenger
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import net.mullvad.mullvadvpn.BuildConfig
-import net.mullvad.mullvadvpn.applist.ApplicationsIconManager
import net.mullvad.mullvadvpn.applist.ApplicationsProvider
import net.mullvad.mullvadvpn.constant.IS_PLAY_BUILD
import net.mullvad.mullvadvpn.dataproxy.MullvadProblemReport
@@ -67,7 +66,6 @@ import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.qualifier.named
import org.koin.dsl.bind
import org.koin.dsl.module
-import org.koin.dsl.onClose
val uiModule = module {
single<SharedPreferences>(named(APP_PREFERENCES_NAME)) {
@@ -78,7 +76,6 @@ val uiModule = module {
single<String>(named(SELF_PACKAGE_NAME)) { androidContext().packageName }
viewModel { SplitTunnelingViewModel(get(), get(), Dispatchers.Default) }
- single { ApplicationsIconManager(get()) } onClose { it?.dispose() }
single { ApplicationsProvider(get(), get(named(SELF_PACKAGE_NAME))) }
single { (messenger: Messenger, dispatcher: EventDispatcher) ->
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManagerTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManagerTest.kt
deleted file mode 100644
index 3296243c56..0000000000
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/applist/ApplicationsIconManagerTest.kt
+++ /dev/null
@@ -1,110 +0,0 @@
-package net.mullvad.mullvadvpn.applist
-
-import android.content.pm.PackageManager
-import android.graphics.Bitmap
-import android.graphics.drawable.Drawable
-import android.os.Looper
-import androidx.core.graphics.drawable.toBitmap
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.mockkStatic
-import io.mockk.unmockkAll
-import io.mockk.verify
-import kotlin.test.assertEquals
-import kotlin.test.assertFails
-import org.junit.jupiter.api.AfterEach
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Test
-
-class ApplicationsIconManagerTest {
- private val mockedPackageManager = mockk<PackageManager>()
- private val mockedMainLooper = mockk<Looper>()
- private val testSubject = ApplicationsIconManager(mockedPackageManager)
-
- @BeforeEach
- fun setUp() {
- mockkStatic(Looper::class)
- mockkStatic(DRAWABLE_EXTENSION_CLASS)
- every { Looper.getMainLooper() } returns mockedMainLooper
- }
-
- @AfterEach
- fun tearDown() {
- unmockkAll()
- }
-
- @Test
- fun test_first_time_load_icon_from_PM() {
- val testPackageName = "test"
- val mockedBitmap = mockk<Bitmap>()
- val mockedDrawable = mockk<Drawable>().apply { every { toBitmap() } returns mockedBitmap }
- every { mockedPackageManager.getApplicationIcon(testPackageName) } returns mockedDrawable
- every { mockedMainLooper.isCurrentThread } returns false
- every { mockedDrawable.intrinsicWidth } returns 0
- every { mockedDrawable.intrinsicHeight } returns 0
-
- val result = testSubject.getAppIcon(testPackageName)
-
- assertEquals(mockedBitmap, result)
- verify {
- mockedMainLooper.isCurrentThread
- mockedPackageManager.getApplicationIcon(testPackageName)
- }
- }
-
- @Test
- fun test_second_time_load_icon_from_cache() {
- val testPackageName = "test"
- val mockedBitmap = mockk<Bitmap>()
- val mockedDrawable = mockk<Drawable>().apply { every { toBitmap() } returns mockedBitmap }
- every { mockedPackageManager.getApplicationIcon(testPackageName) } returns mockedDrawable
- every { mockedMainLooper.isCurrentThread } returns false
- every { mockedDrawable.intrinsicWidth } returns 0
- every { mockedDrawable.intrinsicHeight } returns 0
-
- val result = testSubject.getAppIcon(testPackageName)
- val result2 = testSubject.getAppIcon(testPackageName)
-
- assertEquals(mockedBitmap, result)
- assertEquals(mockedBitmap, result2)
- verify(exactly = 2) { mockedMainLooper.isCurrentThread }
- verify(exactly = 1) { mockedPackageManager.getApplicationIcon(testPackageName) }
- }
-
- @Test
- fun test_second_time_load_icon_from_PM_after_clear() {
- val testPackageName = "test"
- val mockedBitmap = mockk<Bitmap>()
- val mockedDrawable = mockk<Drawable>().apply { every { toBitmap() } returns mockedBitmap }
- every { mockedPackageManager.getApplicationIcon(testPackageName) } returns mockedDrawable
- every { mockedMainLooper.isCurrentThread } returns false
- every { mockedDrawable.intrinsicWidth } returns 0
- every { mockedDrawable.intrinsicHeight } returns 0
-
- val result = testSubject.getAppIcon(testPackageName)
- testSubject.dispose()
- val result2 = testSubject.getAppIcon(testPackageName)
-
- assertEquals(mockedBitmap, result)
- assertEquals(mockedBitmap, result2)
- verify(exactly = 2) {
- mockedMainLooper.isCurrentThread
- mockedPackageManager.getApplicationIcon(testPackageName)
- }
- }
-
- @Test
- fun test_throw_exception_when_invoke_from_MainThread() {
- val testPackageName = "test"
- every { mockedMainLooper.isCurrentThread } returns true
-
- assertFails("Should not be called from MainThread") {
- testSubject.getAppIcon(testPackageName)
- }
- verify { mockedMainLooper.isCurrentThread }
- }
-
- companion object {
- private const val DRAWABLE_EXTENSION_CLASS = "androidx.core.graphics.drawable.DrawableKt"
- }
-}