For #16847: Allow autoplay to controlled via the toolbar.
parent
6f3665bc74
commit
00d971e9d3
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:id="@+id/enabled"
|
||||
android:drawable="@drawable/ic_autoplay_enabled"
|
||||
android:state_enabled="true" />
|
||||
<item
|
||||
android:id="@+id/disabled"
|
||||
android:drawable="@drawable/ic_autoplay_disabled" />
|
||||
|
||||
</selector>
|
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="@color/disabled_text"
|
||||
android:pathData="M19.168,8.458A7.985,7.985 0,0 1,8.462 19.164L6.987,20.639A9.986,9.986 0,0 0,20.643 6.984Z" />
|
||||
<path
|
||||
android:fillColor="@color/disabled_text"
|
||||
android:pathData="M21.707,2.293a1,1 0,0 0,-1.414 0l-1.97,1.97a9.915,9.915 0,0 0,-2.991 -1.694,1 1,0 1,0 -0.666,1.885 7.88,7.88 0,0 1,2.227 1.239L13.311,9.275 10.5,7.643A1,1 0,0 0,9 8.508v5.078l-3.3,3.3A7.922,7.922 0,0 1,4 12,8 8,0 0,1 7,5.773V9.5a0.5,0.5 0,0 0,1 0v-6A0.5,0.5 0,0 0,7.5 3h-5a0.5,0.5 0,0 0,0 1H6.024A9.939,9.939 0,0 0,4.273 18.313l-1.98,1.98a1,1 0,1 0,1.414 1.414l18,-18A1,1 0,0 0,21.707 2.293Z" />
|
||||
<path
|
||||
android:fillColor="@color/disabled_text"
|
||||
android:pathData="M16.5,11.128l-4.166,4.165 4.179,-2.428a1,1 0,0 0,0 -1.73Z" />
|
||||
</vector>
|
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="@color/disabled_text"
|
||||
android:pathData="M4.47 7.5l3-3c0.3-0.3 0.7-0.3 1 0l4.2 4.2c0.8-1 0.7-2.4-0.2-3.3L9.84 2.7a2.5 2.5 0 0 0-3.53 0L2.77 6.28a2.5 2.5 0 0 0 0 3.52l2.66 2.67c0.9 0.9 2.25 1 3.2 0.2l-4.2-4.2a0.7 0.7 0 0 1 0-1zm16.8 6.63a2.5 2.5 0 0 1 0 3.53l-3.55 3.54a2.5 2.5 0 0 1-3.53 0l-2.7-2.7a2.49 2.49 0 0 1-0.2-3.24l4.2 4.2a0.7 0.7 0 0 0 1 0l3.04-3.05a0.7 0.7 0 0 0 0-1l-4.2-4.2c1-0.8 2.4-0.7 3.3 0.2l2.66 2.66zm-5.1 0.56a1 1 0 0 1-1.42 1.41L7.8 9.2A1 1 0 1 1 9.24 7.8l6.9 6.9z" />
|
||||
</vector>
|
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="?primaryText"
|
||||
android:pathData="M4.47 7.5l3-3c0.3-0.3 0.7-0.3 1 0l4.2 4.2c0.8-1 0.7-2.4-0.2-3.3L9.84 2.7a2.5 2.5 0 0 0-3.53 0L2.77 6.28a2.5 2.5 0 0 0 0 3.52l2.66 2.67c0.9 0.9 2.25 1 3.2 0.2l-4.2-4.2a0.7 0.7 0 0 1 0-1zm16.8 6.63a2.5 2.5 0 0 1 0 3.53l-3.55 3.54a2.5 2.5 0 0 1-3.53 0l-2.7-2.7a2.49 2.49 0 0 1-0.2-3.24l4.2 4.2a0.7 0.7 0 0 0 1 0l3.04-3.05a0.7 0.7 0 0 0 0-1l-4.2-4.2c1-0.8 2.4-0.7 3.3 0.2l2.66 2.66zm-5.1 0.56a1 1 0 0 1-1.42 1.41L7.8 9.2A1 1 0 1 1 9.24 7.8l6.9 6.9z" />
|
||||
</vector>
|
@ -1,13 +1,7 @@
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:autoMirrored="true">
|
||||
<path
|
||||
android:fillColor="?primaryText"
|
||||
android:pathData="M2,20h20v-4L2,16v4zM4,17h2v2L4,19v-2zM2,4v4h20L22,4L2,4zM6,7L4,7L4,5h2v2zM2,14h20v-4L2,10v4zM4,11h2v2L4,13v-2z"/>
|
||||
</vector>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/enabled" android:drawable="@drawable/ic_storage_enabled" android:state_enabled="true" />
|
||||
<item android:id="@+id/disabled" android:drawable="@drawable/ic_storage_disabled" />
|
||||
</selector>
|
||||
|
@ -0,0 +1,13 @@
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:autoMirrored="true">
|
||||
<path
|
||||
android:fillColor="@color/disabled_text"
|
||||
android:pathData="M2,20h20v-4L2,16v4zM4,17h2v2L4,19v-2zM2,4v4h20L22,4L2,4zM6,7L4,7L4,5h2v2zM2,14h20v-4L2,10v4zM4,11h2v2L4,13v-2z"/>
|
||||
</vector>
|
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:autoMirrored="true">
|
||||
<path
|
||||
android:fillColor="?primaryText"
|
||||
android:pathData="M2,20h20v-4L2,16v4zM4,17h2v2L4,19v-2zM2,4v4h20L22,4L2,4zM6,7L4,7L4,5h2v2zM2,14h20v-4L2,10v4zM4,11h2v2L4,13v-2z"/>
|
||||
</vector>
|
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@android:id/text1"
|
||||
style="?android:attr/spinnerDropDownItemStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
android:background="@drawable/etp_spinner_item_background"
|
||||
android:gravity="end|center_vertical"
|
||||
android:paddingStart="15dp"
|
||||
android:paddingEnd="15dp"
|
||||
tools:text="Allow Audible"
|
||||
android:textColor="?accentUsedOnDarkBackground" />
|
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/quicksettings_item_height"
|
||||
android:gravity="end|center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:textColor="?accentUsedOnDarkBackground"
|
||||
tools:text="Allowed" />
|
@ -0,0 +1,97 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.fenix.components
|
||||
|
||||
import androidx.paging.DataSource
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.test.runBlockingTest
|
||||
import mozilla.components.feature.sitepermissions.SitePermissions
|
||||
import mozilla.components.feature.sitepermissions.SitePermissionsStorage
|
||||
import mozilla.components.support.test.robolectric.testContext
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class PermissionStorageTest {
|
||||
|
||||
@Test
|
||||
fun `add permission`() = runBlockingTest {
|
||||
val sitePermissions: SitePermissions = mockk(relaxed = true)
|
||||
val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true)
|
||||
val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage)
|
||||
|
||||
storage.add(sitePermissions)
|
||||
|
||||
verify { sitePermissionsStorage.save(sitePermissions) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `find sitePermissions by origin`() = runBlockingTest {
|
||||
val sitePermissions: SitePermissions = mockk(relaxed = true)
|
||||
val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true)
|
||||
val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage)
|
||||
|
||||
every { sitePermissionsStorage.findSitePermissionsBy(any()) } returns sitePermissions
|
||||
|
||||
val result = storage.findSitePermissionsBy("origin")
|
||||
|
||||
verify { sitePermissionsStorage.findSitePermissionsBy("origin") }
|
||||
|
||||
assertEquals(sitePermissions, result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `update SitePermissions`() = runBlockingTest {
|
||||
val sitePermissions: SitePermissions = mockk(relaxed = true)
|
||||
val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true)
|
||||
val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage)
|
||||
|
||||
storage.updateSitePermissions(sitePermissions)
|
||||
|
||||
verify { sitePermissionsStorage.update(sitePermissions) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `get sitePermissions paged`() = runBlockingTest {
|
||||
val dataSource: DataSource.Factory<Int, SitePermissions> = mockk(relaxed = true)
|
||||
val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true)
|
||||
val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage)
|
||||
|
||||
every { sitePermissionsStorage.getSitePermissionsPaged() } returns dataSource
|
||||
|
||||
val result = storage.getSitePermissionsPaged()
|
||||
|
||||
verify { sitePermissionsStorage.getSitePermissionsPaged() }
|
||||
|
||||
assertEquals(dataSource, result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `delete sitePermissions`() = runBlockingTest {
|
||||
val sitePermissions: SitePermissions = mockk(relaxed = true)
|
||||
val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true)
|
||||
val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage)
|
||||
|
||||
storage.deleteSitePermissions(sitePermissions)
|
||||
|
||||
verify { sitePermissionsStorage.remove(sitePermissions) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `delete all sitePermissions`() = runBlockingTest {
|
||||
val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true)
|
||||
val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage)
|
||||
|
||||
storage.deleteAllSitePermissions()
|
||||
|
||||
verify { sitePermissionsStorage.removeAll() }
|
||||
}
|
||||
}
|
@ -0,0 +1,381 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.fenix.settings.quicksettings
|
||||
|
||||
import io.mockk.MockKAnnotations
|
||||
import io.mockk.every
|
||||
import io.mockk.impl.annotations.MockK
|
||||
import mozilla.components.feature.sitepermissions.SitePermissions
|
||||
import mozilla.components.feature.sitepermissions.SitePermissions.AutoplayStatus
|
||||
import mozilla.components.feature.sitepermissions.SitePermissionsRules
|
||||
import mozilla.components.feature.sitepermissions.SitePermissionsRules.AutoplayAction
|
||||
import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action
|
||||
import mozilla.components.support.test.mock
|
||||
import mozilla.components.support.test.robolectric.testContext
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||
import org.mozilla.fenix.utils.Settings
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class AutoplayValueTest {
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var settings: Settings
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
MockKAnnotations.init(this)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `AllowAll - isSelected`() {
|
||||
var rules = getRules().copy(
|
||||
autoplayAudible = AutoplayAction.ALLOWED,
|
||||
autoplayInaudible = AutoplayAction.ALLOWED
|
||||
)
|
||||
|
||||
var value = AutoplayValue.AllowAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
assertTrue(value.isSelected())
|
||||
|
||||
rules = rules.copy(
|
||||
autoplayAudible = AutoplayAction.BLOCKED
|
||||
)
|
||||
|
||||
value = AutoplayValue.AllowAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
assertFalse(value.isSelected())
|
||||
|
||||
value = AutoplayValue.AllowAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = SitePermissions(
|
||||
origin = "",
|
||||
savedAt = 0L,
|
||||
autoplayAudible = AutoplayStatus.ALLOWED,
|
||||
autoplayInaudible = AutoplayStatus.ALLOWED
|
||||
)
|
||||
)
|
||||
|
||||
assertTrue(value.isSelected())
|
||||
|
||||
value = AutoplayValue.AllowAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = SitePermissions(
|
||||
origin = "",
|
||||
savedAt = 0L,
|
||||
autoplayAudible = AutoplayStatus.BLOCKED,
|
||||
autoplayInaudible = AutoplayStatus.BLOCKED
|
||||
)
|
||||
)
|
||||
|
||||
assertFalse(value.isSelected())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `BlockAll - isSelected`() {
|
||||
var rules = getRules().copy(
|
||||
autoplayAudible = AutoplayAction.BLOCKED,
|
||||
autoplayInaudible = AutoplayAction.BLOCKED
|
||||
)
|
||||
|
||||
var value = AutoplayValue.BlockAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
assertTrue(value.isSelected())
|
||||
|
||||
rules = rules.copy(
|
||||
autoplayAudible = AutoplayAction.BLOCKED,
|
||||
autoplayInaudible = AutoplayAction.ALLOWED
|
||||
)
|
||||
|
||||
value = AutoplayValue.BlockAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
assertFalse(value.isSelected())
|
||||
|
||||
value = AutoplayValue.BlockAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = SitePermissions(
|
||||
origin = "",
|
||||
savedAt = 0L,
|
||||
autoplayAudible = AutoplayStatus.BLOCKED,
|
||||
autoplayInaudible = AutoplayStatus.BLOCKED
|
||||
)
|
||||
)
|
||||
|
||||
assertTrue(value.isSelected())
|
||||
|
||||
value = AutoplayValue.BlockAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = SitePermissions(
|
||||
origin = "",
|
||||
savedAt = 0L,
|
||||
autoplayAudible = AutoplayStatus.ALLOWED,
|
||||
autoplayInaudible = AutoplayStatus.BLOCKED
|
||||
)
|
||||
)
|
||||
|
||||
assertFalse(value.isSelected())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `BlockAudible - isSelected`() {
|
||||
var rules = getRules().copy(
|
||||
autoplayAudible = AutoplayAction.BLOCKED,
|
||||
autoplayInaudible = AutoplayAction.ALLOWED
|
||||
)
|
||||
|
||||
var value = AutoplayValue.BlockAudible(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
assertTrue(value.isSelected())
|
||||
|
||||
rules = rules.copy(
|
||||
autoplayAudible = AutoplayAction.BLOCKED,
|
||||
autoplayInaudible = AutoplayAction.BLOCKED
|
||||
)
|
||||
|
||||
value = AutoplayValue.BlockAudible(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
assertFalse(value.isSelected())
|
||||
|
||||
value = AutoplayValue.BlockAudible(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = SitePermissions(
|
||||
origin = "",
|
||||
savedAt = 0L,
|
||||
autoplayAudible = AutoplayStatus.BLOCKED,
|
||||
autoplayInaudible = AutoplayStatus.ALLOWED
|
||||
)
|
||||
)
|
||||
|
||||
assertTrue(value.isSelected())
|
||||
|
||||
value = AutoplayValue.BlockAudible(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = SitePermissions(
|
||||
origin = "",
|
||||
savedAt = 0L,
|
||||
autoplayAudible = AutoplayStatus.ALLOWED,
|
||||
autoplayInaudible = AutoplayStatus.ALLOWED
|
||||
)
|
||||
)
|
||||
|
||||
assertFalse(value.isSelected())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `AllowAll - createSitePermissionsFromCustomRules`() {
|
||||
val rules = getRules().copy(
|
||||
autoplayAudible = AutoplayAction.BLOCKED,
|
||||
autoplayInaudible = AutoplayAction.BLOCKED
|
||||
)
|
||||
|
||||
every { settings.getSitePermissionsCustomSettingsRules() } returns rules
|
||||
|
||||
val value = AutoplayValue.AllowAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
val result = value.createSitePermissionsFromCustomRules("mozilla.org", settings)
|
||||
|
||||
assertEquals(AutoplayStatus.ALLOWED, result.autoplayAudible)
|
||||
assertEquals(AutoplayStatus.ALLOWED, result.autoplayInaudible)
|
||||
assertEquals(rules.camera.toStatus(), result.camera)
|
||||
assertEquals(rules.location.toStatus(), result.location)
|
||||
assertEquals(rules.microphone.toStatus(), result.microphone)
|
||||
assertEquals(rules.notification.toStatus(), result.notification)
|
||||
assertEquals(rules.persistentStorage.toStatus(), result.localStorage)
|
||||
assertEquals(rules.mediaKeySystemAccess.toStatus(), result.mediaKeySystemAccess)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `BlockAll - createSitePermissionsFromCustomRules`() {
|
||||
val rules = getRules().copy(
|
||||
autoplayAudible = AutoplayAction.ALLOWED,
|
||||
autoplayInaudible = AutoplayAction.ALLOWED
|
||||
)
|
||||
|
||||
every { settings.getSitePermissionsCustomSettingsRules() } returns rules
|
||||
|
||||
val value = AutoplayValue.BlockAll(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
val result = value.createSitePermissionsFromCustomRules("mozilla.org", settings)
|
||||
|
||||
assertEquals(AutoplayStatus.BLOCKED, result.autoplayAudible)
|
||||
assertEquals(AutoplayStatus.BLOCKED, result.autoplayInaudible)
|
||||
assertEquals(rules.camera.toStatus(), result.camera)
|
||||
assertEquals(rules.location.toStatus(), result.location)
|
||||
assertEquals(rules.microphone.toStatus(), result.microphone)
|
||||
assertEquals(rules.notification.toStatus(), result.notification)
|
||||
assertEquals(rules.persistentStorage.toStatus(), result.localStorage)
|
||||
assertEquals(rules.mediaKeySystemAccess.toStatus(), result.mediaKeySystemAccess)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `BlockAudible - createSitePermissionsFromCustomRules`() {
|
||||
val rules = getRules().copy(
|
||||
autoplayAudible = AutoplayAction.ALLOWED,
|
||||
autoplayInaudible = AutoplayAction.ALLOWED
|
||||
)
|
||||
|
||||
every { settings.getSitePermissionsCustomSettingsRules() } returns rules
|
||||
|
||||
val value = AutoplayValue.BlockAudible(
|
||||
label = "label",
|
||||
rules = rules,
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
val result = value.createSitePermissionsFromCustomRules("mozilla.org", settings)
|
||||
|
||||
assertEquals(AutoplayStatus.BLOCKED, result.autoplayAudible)
|
||||
assertEquals(AutoplayStatus.ALLOWED, result.autoplayInaudible)
|
||||
assertEquals(rules.camera.toStatus(), result.camera)
|
||||
assertEquals(rules.location.toStatus(), result.location)
|
||||
assertEquals(rules.microphone.toStatus(), result.microphone)
|
||||
assertEquals(rules.notification.toStatus(), result.notification)
|
||||
assertEquals(rules.persistentStorage.toStatus(), result.localStorage)
|
||||
assertEquals(rules.mediaKeySystemAccess.toStatus(), result.mediaKeySystemAccess)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `AllowAll - updateSitePermissions`() {
|
||||
val sitePermissions = SitePermissions(
|
||||
origin = "origin",
|
||||
savedAt = 0L,
|
||||
autoplayAudible = AutoplayStatus.BLOCKED,
|
||||
autoplayInaudible = AutoplayStatus.BLOCKED
|
||||
)
|
||||
|
||||
val value = AutoplayValue.AllowAll(
|
||||
label = "label",
|
||||
rules = mock(),
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
val result = value.updateSitePermissions(sitePermissions)
|
||||
|
||||
assertEquals(AutoplayStatus.ALLOWED, result.autoplayAudible)
|
||||
assertEquals(AutoplayStatus.ALLOWED, result.autoplayInaudible)
|
||||
assertEquals(sitePermissions.camera, result.camera)
|
||||
assertEquals(sitePermissions.location, result.location)
|
||||
assertEquals(sitePermissions.microphone, result.microphone)
|
||||
assertEquals(sitePermissions.notification, result.notification)
|
||||
assertEquals(sitePermissions.localStorage, result.localStorage)
|
||||
assertEquals(sitePermissions.mediaKeySystemAccess, result.mediaKeySystemAccess)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `BlockAll - updateSitePermissions`() {
|
||||
val sitePermissions = SitePermissions(
|
||||
origin = "origin",
|
||||
savedAt = 0L,
|
||||
autoplayAudible = AutoplayStatus.ALLOWED,
|
||||
autoplayInaudible = AutoplayStatus.ALLOWED
|
||||
)
|
||||
|
||||
val value = AutoplayValue.BlockAll(
|
||||
label = "label",
|
||||
rules = mock(),
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
val result = value.updateSitePermissions(sitePermissions)
|
||||
|
||||
assertEquals(AutoplayStatus.BLOCKED, result.autoplayAudible)
|
||||
assertEquals(AutoplayStatus.BLOCKED, result.autoplayInaudible)
|
||||
assertEquals(sitePermissions.camera, result.camera)
|
||||
assertEquals(sitePermissions.location, result.location)
|
||||
assertEquals(sitePermissions.microphone, result.microphone)
|
||||
assertEquals(sitePermissions.notification, result.notification)
|
||||
assertEquals(sitePermissions.localStorage, result.localStorage)
|
||||
assertEquals(sitePermissions.mediaKeySystemAccess, result.mediaKeySystemAccess)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `BlockAudible - updateSitePermissions`() {
|
||||
val sitePermissions = SitePermissions(
|
||||
origin = "origin",
|
||||
savedAt = 0L,
|
||||
autoplayAudible = AutoplayStatus.ALLOWED,
|
||||
autoplayInaudible = AutoplayStatus.BLOCKED
|
||||
)
|
||||
|
||||
val value = AutoplayValue.BlockAudible(
|
||||
label = "label",
|
||||
rules = mock(),
|
||||
sitePermission = null
|
||||
)
|
||||
|
||||
val result = value.updateSitePermissions(sitePermissions)
|
||||
|
||||
assertEquals(AutoplayStatus.BLOCKED, result.autoplayAudible)
|
||||
assertEquals(AutoplayStatus.ALLOWED, result.autoplayInaudible)
|
||||
assertEquals(sitePermissions.camera, result.camera)
|
||||
assertEquals(sitePermissions.location, result.location)
|
||||
assertEquals(sitePermissions.microphone, result.microphone)
|
||||
assertEquals(sitePermissions.notification, result.notification)
|
||||
assertEquals(sitePermissions.localStorage, result.localStorage)
|
||||
assertEquals(sitePermissions.mediaKeySystemAccess, result.mediaKeySystemAccess)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `values - contains the right values`() {
|
||||
val values = AutoplayValue.values(testContext, settings, null)
|
||||
|
||||
assertTrue(values.any { it is AutoplayValue.AllowAll })
|
||||
assertTrue(values.any { it is AutoplayValue.BlockAll })
|
||||
assertTrue(values.any { it is AutoplayValue.BlockAudible })
|
||||
}
|
||||
|
||||
private fun getRules() = SitePermissionsRules(
|
||||
camera = Action.ASK_TO_ALLOW,
|
||||
location = Action.ASK_TO_ALLOW,
|
||||
microphone = Action.ASK_TO_ALLOW,
|
||||
notification = Action.ASK_TO_ALLOW,
|
||||
autoplayAudible = AutoplayAction.BLOCKED,
|
||||
autoplayInaudible = AutoplayAction.BLOCKED,
|
||||
persistentStorage = Action.ASK_TO_ALLOW,
|
||||
mediaKeySystemAccess = Action.ASK_TO_ALLOW
|
||||
)
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.fenix.settings.quicksettings
|
||||
|
||||
import mozilla.components.support.test.mock
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||
import org.mozilla.fenix.settings.PhoneFeature
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class QuickSettingsFragmentReducerTest {
|
||||
|
||||
@Test
|
||||
fun `WebsitePermissionAction - TogglePermission`() {
|
||||
val toggleablePermission = WebsitePermission.Toggleable(
|
||||
phoneFeature = PhoneFeature.CAMERA,
|
||||
status = "status",
|
||||
isVisible = false,
|
||||
isEnabled = false,
|
||||
isBlockedByAndroid = false
|
||||
)
|
||||
|
||||
val map =
|
||||
mapOf<PhoneFeature, WebsitePermission>(PhoneFeature.CAMERA to toggleablePermission)
|
||||
|
||||
val state = QuickSettingsFragmentState(mock(), map)
|
||||
val newState = quickSettingsFragmentReducer(
|
||||
state,
|
||||
WebsitePermissionAction.TogglePermission(
|
||||
updatedFeature = PhoneFeature.CAMERA,
|
||||
updatedStatus = "newStatus",
|
||||
updatedEnabledStatus = true
|
||||
)
|
||||
)
|
||||
val result = newState.websitePermissionsState[PhoneFeature.CAMERA]!!
|
||||
assertEquals("newStatus", result.status)
|
||||
assertTrue(result.isEnabled)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WebsitePermissionAction - ChangeAutoplay`() {
|
||||
val permissionPermission = WebsitePermission.Autoplay(
|
||||
autoplayValue = AutoplayValue.BlockAll(
|
||||
label = "label",
|
||||
rules = mock(),
|
||||
sitePermission = null
|
||||
),
|
||||
options = emptyList(),
|
||||
isVisible = false
|
||||
)
|
||||
|
||||
val map =
|
||||
mapOf<PhoneFeature, WebsitePermission>(PhoneFeature.AUTOPLAY to permissionPermission)
|
||||
|
||||
val state = QuickSettingsFragmentState(mock(), map)
|
||||
val autoplayValue = AutoplayValue.AllowAll(
|
||||
label = "newLabel",
|
||||
rules = mock(),
|
||||
sitePermission = null
|
||||
)
|
||||
val newState = quickSettingsFragmentReducer(
|
||||
state,
|
||||
WebsitePermissionAction.ChangeAutoplay(autoplayValue)
|
||||
)
|
||||
|
||||
val result =
|
||||
newState.websitePermissionsState[PhoneFeature.AUTOPLAY] as WebsitePermission.Autoplay
|
||||
assertEquals(autoplayValue, result.autoplayValue)
|
||||
}
|
||||
}
|
@ -0,0 +1,200 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.fenix.settings.quicksettings
|
||||
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.widget.AppCompatSpinner
|
||||
import androidx.core.view.isVisible
|
||||
import io.mockk.every
|
||||
import io.mockk.spyk
|
||||
import io.mockk.MockKAnnotations
|
||||
import io.mockk.verify
|
||||
import io.mockk.impl.annotations.MockK
|
||||
import junit.framework.TestCase.assertFalse
|
||||
import junit.framework.TestCase.assertTrue
|
||||
import junit.framework.TestCase.assertEquals
|
||||
import mozilla.components.support.test.mock
|
||||
import mozilla.components.support.test.robolectric.testContext
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||
import org.mozilla.fenix.settings.PhoneFeature
|
||||
import org.mozilla.fenix.settings.quicksettings.WebsitePermissionsView.PermissionViewHolder.SpinnerPermission
|
||||
import org.mozilla.fenix.settings.quicksettings.WebsitePermissionsView.PermissionViewHolder.ToggleablePermission
|
||||
import java.util.EnumMap
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class WebsitePermissionViewTest {
|
||||
|
||||
@MockK(relaxed = true)
|
||||
private lateinit var interactor: WebsitePermissionInteractor
|
||||
private lateinit var view: WebsitePermissionsView
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
MockKAnnotations.init(this)
|
||||
view = spyk(WebsitePermissionsView(FrameLayout(testContext), interactor))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `update - with visible permissions`() {
|
||||
val label = TextView(testContext)
|
||||
val status = TextView(testContext)
|
||||
val permission = WebsitePermission.Toggleable(
|
||||
phoneFeature = PhoneFeature.CAMERA,
|
||||
status = "status",
|
||||
isVisible = true,
|
||||
isEnabled = true,
|
||||
isBlockedByAndroid = false
|
||||
)
|
||||
|
||||
val map = mapOf<PhoneFeature, WebsitePermission>(PhoneFeature.CAMERA to permission)
|
||||
|
||||
view.permissionViews = EnumMap(
|
||||
mapOf(PhoneFeature.CAMERA to ToggleablePermission(label, status))
|
||||
)
|
||||
|
||||
every { view.bindPermission(any(), any()) } returns Unit
|
||||
|
||||
view.update(map)
|
||||
|
||||
verify { interactor.onPermissionsShown() }
|
||||
verify { view.bindPermission(any(), any()) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `update - with none visible permissions`() {
|
||||
val label = TextView(testContext)
|
||||
val status = TextView(testContext)
|
||||
val permission = WebsitePermission.Toggleable(
|
||||
phoneFeature = PhoneFeature.CAMERA,
|
||||
status = "status",
|
||||
isVisible = false,
|
||||
isEnabled = true,
|
||||
isBlockedByAndroid = false
|
||||
)
|
||||
|
||||
val map = mapOf<PhoneFeature, WebsitePermission>(PhoneFeature.CAMERA to permission)
|
||||
|
||||
view.permissionViews =
|
||||
EnumMap(mapOf(PhoneFeature.CAMERA to ToggleablePermission(label, status)))
|
||||
|
||||
every { view.bindPermission(any(), any()) } returns Unit
|
||||
|
||||
view.update(map)
|
||||
|
||||
verify(exactly = 0) { interactor.onPermissionsShown() }
|
||||
verify { view.bindPermission(any(), any()) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `bindPermission - a visible ToggleablePermission`() {
|
||||
val label = TextView(testContext)
|
||||
val status = TextView(testContext)
|
||||
val permissionView = ToggleablePermission(label, status)
|
||||
val permission = WebsitePermission.Toggleable(
|
||||
phoneFeature = PhoneFeature.CAMERA,
|
||||
status = "status",
|
||||
isVisible = true,
|
||||
isEnabled = true,
|
||||
isBlockedByAndroid = false
|
||||
)
|
||||
|
||||
view.permissionViews = EnumMap(mapOf(PhoneFeature.CAMERA to permissionView))
|
||||
|
||||
every { interactor.onPermissionToggled(any()) } returns Unit
|
||||
|
||||
view.bindPermission(permission, permissionView)
|
||||
|
||||
assertTrue(permissionView.label.isVisible)
|
||||
assertTrue(permissionView.label.isEnabled)
|
||||
assertTrue(permissionView.status.isVisible)
|
||||
assertEquals(permission.status, permissionView.status.text)
|
||||
|
||||
permissionView.status.performClick()
|
||||
|
||||
verify { interactor.onPermissionToggled(any()) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `bindPermission - a not visible ToggleablePermission`() {
|
||||
val label = TextView(testContext)
|
||||
val status = TextView(testContext)
|
||||
val permissionView = ToggleablePermission(label, status)
|
||||
val permission = WebsitePermission.Toggleable(
|
||||
phoneFeature = PhoneFeature.CAMERA,
|
||||
status = "status",
|
||||
isVisible = false,
|
||||
isEnabled = false,
|
||||
isBlockedByAndroid = false
|
||||
)
|
||||
|
||||
view.permissionViews = EnumMap(mapOf(PhoneFeature.CAMERA to permissionView))
|
||||
|
||||
every { interactor.onPermissionToggled(any()) } returns Unit
|
||||
|
||||
view.bindPermission(permission, permissionView)
|
||||
|
||||
assertFalse(permissionView.label.isVisible)
|
||||
assertFalse(permissionView.label.isEnabled)
|
||||
assertFalse(permissionView.status.isVisible)
|
||||
assertEquals(permission.status, permissionView.status.text)
|
||||
|
||||
permissionView.status.performClick()
|
||||
|
||||
verify { interactor.onPermissionToggled(any()) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `bindPermission - a visible SpinnerPermission`() {
|
||||
val label = TextView(testContext)
|
||||
val status = AppCompatSpinner(testContext)
|
||||
val permissionView = SpinnerPermission(label, status)
|
||||
val options = listOf(
|
||||
AutoplayValue.BlockAll(
|
||||
label = "BlockAll",
|
||||
rules = mock(),
|
||||
sitePermission = null
|
||||
),
|
||||
AutoplayValue.AllowAll(
|
||||
label = "AllowAll",
|
||||
rules = mock(),
|
||||
sitePermission = null
|
||||
),
|
||||
AutoplayValue.BlockAudible(
|
||||
label = "BlockAudible",
|
||||
rules = mock(),
|
||||
sitePermission = null
|
||||
)
|
||||
)
|
||||
val permission = WebsitePermission.Autoplay(
|
||||
autoplayValue = options[0],
|
||||
options = options,
|
||||
isVisible = true
|
||||
)
|
||||
|
||||
view.permissionViews = EnumMap(mapOf(PhoneFeature.AUTOPLAY to permissionView))
|
||||
|
||||
every { interactor.onAutoplayChanged(any()) } returns Unit
|
||||
|
||||
view.bindPermission(permission, permissionView)
|
||||
|
||||
assertTrue(permissionView.label.isVisible)
|
||||
assertFalse(permissionView.label.isEnabled)
|
||||
assertTrue(permissionView.status.isVisible)
|
||||
assertEquals(permission.autoplayValue, permissionView.status.selectedItem)
|
||||
|
||||
permissionView.status.onItemSelectedListener!!.onItemSelected(
|
||||
mock(),
|
||||
permissionView.status,
|
||||
1,
|
||||
0L
|
||||
)
|
||||
|
||||
verify { interactor.onAutoplayChanged(permissionView.status.selectedItem as AutoplayValue) }
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue