Skip to content

Commit f90ffbb

Browse files
committed
Merge branch 'hotfix/5.214.1'
2 parents c6d6bf8 + ab3f4e2 commit f90ffbb

File tree

13 files changed

+72
-62
lines changed

13 files changed

+72
-62
lines changed

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt

+17-17
Original file line numberDiff line numberDiff line change
@@ -4828,7 +4828,7 @@ class BrowserTabViewModelTest {
48284828
"webShare",
48294829
"myId",
48304830
JSONObject("""{ "my":"object"}"""),
4831-
"someUrl",
4831+
{ "someUrl" },
48324832
)
48334833
assertCommandIssued<Command.WebShareRequest> {
48344834
assertEquals("object", this.data.params.getString("my"))
@@ -4848,7 +4848,7 @@ class BrowserTabViewModelTest {
48484848
"permissionsQuery",
48494849
"myId",
48504850
JSONObject("""{ "name":"somePermission"}"""),
4851-
"someUrl",
4851+
{ "someUrl" },
48524852
)
48534853
assertCommandIssued<Command.SendResponseToJs> {
48544854
assertEquals("granted", this.data.params.getString("state"))
@@ -4866,7 +4866,7 @@ class BrowserTabViewModelTest {
48664866
"screenLock",
48674867
"myId",
48684868
JSONObject("""{ "my":"object"}"""),
4869-
"someUrl",
4869+
{ "someUrl" },
48704870
)
48714871
assertCommandNotIssued<Command.ScreenLock>()
48724872
}
@@ -4879,7 +4879,7 @@ class BrowserTabViewModelTest {
48794879
"screenLock",
48804880
"myId",
48814881
JSONObject("""{ "my":"object"}"""),
4882-
"someUrl",
4882+
{ "someUrl" },
48834883
)
48844884
assertCommandIssued<Command.ScreenLock> {
48854885
assertEquals("object", this.data.params.getString("my"))
@@ -4897,7 +4897,7 @@ class BrowserTabViewModelTest {
48974897
"screenUnlock",
48984898
"myId",
48994899
JSONObject("""{ "my":"object"}"""),
4900-
"someUrl",
4900+
{ "someUrl" },
49014901
)
49024902
assertCommandNotIssued<Command.ScreenUnlock>()
49034903
}
@@ -4910,7 +4910,7 @@ class BrowserTabViewModelTest {
49104910
"screenUnlock",
49114911
"myId",
49124912
JSONObject("""{ "my":"object"}"""),
4913-
"someUrl",
4913+
{ "someUrl" },
49144914
)
49154915
assertCommandIssued<Command.ScreenUnlock>()
49164916
}
@@ -4924,7 +4924,7 @@ class BrowserTabViewModelTest {
49244924
"getUserValues",
49254925
"id",
49264926
data = null,
4927-
"someUrl",
4927+
{ "someUrl" },
49284928
)
49294929
assertCommandIssued<Command.SendResponseToJs>()
49304930
}
@@ -4938,7 +4938,7 @@ class BrowserTabViewModelTest {
49384938
"setUserValues",
49394939
"id",
49404940
JSONObject("""{ overlayInteracted: "true", privatePlayerMode: {disabled: {} }}"""),
4941-
"someUrl",
4941+
{ "someUrl" },
49424942
)
49434943
assertCommandIssued<Command.SendResponseToJs>()
49444944
verify(mockDuckPlayer).setUserPreferences(any(), any())
@@ -4954,7 +4954,7 @@ class BrowserTabViewModelTest {
49544954
"setUserValues",
49554955
"id",
49564956
JSONObject("""{ overlayInteracted: "true", privatePlayerMode: {enabled: {} }}"""),
4957-
"someUrl",
4957+
{ "someUrl" },
49584958
)
49594959
assertCommandIssued<Command.SendResponseToJs>()
49604960
verify(mockDuckPlayer).setUserPreferences(any(), any())
@@ -4970,7 +4970,7 @@ class BrowserTabViewModelTest {
49704970
"setUserValues",
49714971
"id",
49724972
JSONObject("""{ overlayInteracted: "true", privatePlayerMode: {enabled: {} }}"""),
4973-
"someUrl",
4973+
{ "someUrl" },
49744974
)
49754975
assertCommandIssued<Command.SendResponseToDuckPlayer>()
49764976
verify(mockDuckPlayer).setUserPreferences(true, "enabled")
@@ -4986,7 +4986,7 @@ class BrowserTabViewModelTest {
49864986
"sendDuckPlayerPixel",
49874987
"id",
49884988
JSONObject("""{ pixelName: "pixel", params: {}}"""),
4989-
"someUrl",
4989+
{ "someUrl" },
49904990
)
49914991
verify(mockDuckPlayer).sendDuckPlayerPixel("pixel", mapOf())
49924992
}
@@ -5000,7 +5000,7 @@ class BrowserTabViewModelTest {
50005000
"openDuckPlayer",
50015001
"id",
50025002
JSONObject("""{ href: "duck://player/1234" }"""),
5003-
"someUrl",
5003+
{ "someUrl" },
50045004
)
50055005
assertCommandIssued<Navigate>()
50065006
}
@@ -5014,7 +5014,7 @@ class BrowserTabViewModelTest {
50145014
"openDuckPlayer",
50155015
"id",
50165016
null,
5017-
"someUrl",
5017+
{ "someUrl" },
50185018
)
50195019
assertCommandNotIssued<Navigate>()
50205020
}
@@ -5028,7 +5028,7 @@ class BrowserTabViewModelTest {
50285028
"initialSetup",
50295029
"id",
50305030
null,
5031-
"someUrl",
5031+
{ "someUrl" },
50325032
)
50335033
assertCommandIssued<Command.SendResponseToJs>()
50345034
}
@@ -5042,7 +5042,7 @@ class BrowserTabViewModelTest {
50425042
"initialSetup",
50435043
"id",
50445044
null,
5045-
"someUrl",
5045+
{ "someUrl" },
50465046
)
50475047
assertCommandIssued<Command.SendResponseToDuckPlayer>()
50485048
}
@@ -5055,7 +5055,7 @@ class BrowserTabViewModelTest {
50555055
"openSettings",
50565056
"id",
50575057
null,
5058-
"someUrl",
5058+
{ "someUrl" },
50595059
)
50605060
assertCommandIssued<Command.OpenDuckPlayerSettings>()
50615061
}
@@ -5070,7 +5070,7 @@ class BrowserTabViewModelTest {
50705070
"openInfo",
50715071
"id",
50725072
null,
5073-
"someUrl",
5073+
{ "someUrl" },
50745074
)
50755075
assertCommandIssued<Command.OpenDuckPlayerPageInfo>()
50765076
}

app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -2429,8 +2429,8 @@ class BrowserTabFragment :
24292429
id: String?,
24302430
data: JSONObject?,
24312431
) {
2432-
appCoroutineScope.launch(dispatchers.main()) {
2433-
viewModel.processJsCallbackMessage(featureName, method, id, data, it.url)
2432+
viewModel.processJsCallbackMessage(featureName, method, id, data) {
2433+
it.url
24342434
}
24352435
}
24362436
},
@@ -2444,8 +2444,8 @@ class BrowserTabFragment :
24442444
id: String?,
24452445
data: JSONObject?,
24462446
) {
2447-
appCoroutineScope.launch(dispatchers.main()) {
2448-
viewModel.processJsCallbackMessage(featureName, method, id, data, it.url)
2447+
viewModel.processJsCallbackMessage(featureName, method, id, data) {
2448+
it.url
24492449
}
24502450
}
24512451
},

app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt

+15-12
Original file line numberDiff line numberDiff line change
@@ -3167,12 +3167,12 @@ class BrowserTabViewModel @Inject constructor(
31673167
)
31683168
}
31693169

3170-
suspend fun processJsCallbackMessage(
3170+
fun processJsCallbackMessage(
31713171
featureName: String,
31723172
method: String,
31733173
id: String?,
31743174
data: JSONObject?,
3175-
url: String?,
3175+
getWebViewUrl: () -> String?,
31763176
) {
31773177
when (method) {
31783178
"webShare" -> if (id != null && data != null) {
@@ -3200,8 +3200,9 @@ class BrowserTabViewModel @Inject constructor(
32003200

32013201
when (featureName) {
32023202
DUCK_PLAYER_FEATURE_NAME, DUCK_PLAYER_PAGE_FEATURE_NAME -> {
3203-
withContext(dispatchers.io()) {
3204-
val response = duckPlayerJSHelper.processJsCallbackMessage(featureName, method, id, data, url)
3203+
viewModelScope.launch(dispatchers.io()) {
3204+
val webViewUrl = withContext(dispatchers.main()) { getWebViewUrl() }
3205+
val response = duckPlayerJSHelper.processJsCallbackMessage(featureName, method, id, data, webViewUrl)
32053206
withContext(dispatchers.main()) {
32063207
response?.let {
32073208
command.value = it
@@ -3230,15 +3231,17 @@ class BrowserTabViewModel @Inject constructor(
32303231
id: String,
32313232
data: JSONObject,
32323233
) {
3233-
val response = if (url == null) {
3234-
getDataForPermissionState(featureName, method, id, SitePermissionQueryResponse.Denied)
3235-
} else {
3236-
val permissionState = sitePermissionsManager.getPermissionsQueryResponse(url!!, tabId, data.optString("name"))
3237-
getDataForPermissionState(featureName, method, id, permissionState)
3238-
}
3234+
viewModelScope.launch(dispatchers.io()) {
3235+
val response = if (url == null) {
3236+
getDataForPermissionState(featureName, method, id, SitePermissionQueryResponse.Denied)
3237+
} else {
3238+
val permissionState = sitePermissionsManager.getPermissionsQueryResponse(url!!, tabId, data.optString("name"))
3239+
getDataForPermissionState(featureName, method, id, permissionState)
3240+
}
32393241

3240-
viewModelScope.launch(dispatchers.main()) {
3241-
command.value = SendResponseToJs(response)
3242+
withContext(dispatchers.main()) {
3243+
command.value = SendResponseToJs(response)
3244+
}
32423245
}
32433246
}
32443247

app/version/version.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION=5.214.0
1+
VERSION=5.214.1

duckplayer/duckplayer-impl/src/main/java/com/duckduckgo/duckplayer/impl/DuckPlayerDataStore.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class SharedPreferencesDuckPlayerDataStore @Inject constructor(
116116
private val duckPlayerRC: Flow<String>
117117
get() = store.data
118118
.map { prefs ->
119-
prefs[DUCK_PLAYER_RC] ?: ""
119+
prefs[DUCK_PLAYER_RC] ?: "{}"
120120
}
121121
.distinctUntilChanged()
122122

duckplayer/duckplayer-impl/src/main/java/com/duckduckgo/duckplayer/impl/DuckPlayerFeatureRepository.kt

+8-2
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717
package com.duckduckgo.duckplayer.impl
1818

1919
import com.duckduckgo.app.di.AppCoroutineScope
20+
import com.duckduckgo.app.di.IsMainProcess
2021
import com.duckduckgo.common.utils.DispatcherProvider
2122
import com.duckduckgo.di.scopes.AppScope
2223
import com.duckduckgo.duckplayer.api.DuckPlayer.UserPreferences
2324
import com.duckduckgo.duckplayer.api.PrivatePlayerMode.AlwaysAsk
2425
import com.duckduckgo.duckplayer.api.PrivatePlayerMode.Disabled
2526
import com.duckduckgo.duckplayer.api.PrivatePlayerMode.Enabled
2627
import com.squareup.anvil.annotations.ContributesBinding
28+
import dagger.SingleInstanceIn
2729
import javax.inject.Inject
2830
import kotlinx.coroutines.CoroutineScope
2931
import kotlinx.coroutines.flow.Flow
@@ -68,17 +70,21 @@ interface DuckPlayerFeatureRepository {
6870
suspend fun setUserOnboarded()
6971
}
7072

73+
@SingleInstanceIn(AppScope::class)
7174
@ContributesBinding(AppScope::class)
7275
class RealDuckPlayerFeatureRepository @Inject constructor(
7376
private val duckPlayerDataStore: DuckPlayerDataStore,
7477
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
7578
private val dispatcherProvider: DispatcherProvider,
79+
@IsMainProcess isMainProcess: Boolean,
7680
) : DuckPlayerFeatureRepository {
7781

78-
private var duckPlayerRC = ""
82+
private var duckPlayerRC = "{}"
7983

8084
init {
81-
loadToMemory()
85+
if (isMainProcess) {
86+
loadToMemory()
87+
}
8288
}
8389

8490
private fun loadToMemory() {

site-permissions/site-permissions-api/src/main/java/com/duckduckgo/site/permissions/api/SitePermissionsManager.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ interface SitePermissionsManager {
4545
* @param queriedPermission permission being queried (note: this is different from WebView permissions, check link above)
4646
* @return state of the permission as expected by the API: 'granted', 'prompt', or 'denied'
4747
*/
48-
fun getPermissionsQueryResponse(url: String, tabId: String, queriedPermission: String): SitePermissionQueryResponse
48+
suspend fun getPermissionsQueryResponse(url: String, tabId: String, queriedPermission: String): SitePermissionQueryResponse
4949

5050
data class SitePermissions(
5151
val autoAccept: List<String>,

site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SitePermissionsManagerImpl.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class SitePermissionsManagerImpl @Inject constructor(
3535
private val dispatcherProvider: DispatcherProvider,
3636
) : SitePermissionsManager {
3737

38-
private fun getSitePermissionsGranted(
38+
private suspend fun getSitePermissionsGranted(
3939
url: String,
4040
tabId: String,
4141
resources: Array<String>,
@@ -85,7 +85,7 @@ class SitePermissionsManagerImpl @Inject constructor(
8585
}
8686
}
8787

88-
override fun getPermissionsQueryResponse(
88+
override suspend fun getPermissionsQueryResponse(
8989
url: String,
9090
tabId: String,
9191
queriedPermission: String,

site-permissions/site-permissions-impl/src/main/java/com/duckduckgo/site/permissions/impl/SitePermissionsRepository.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ interface SitePermissionsRepository {
3939
var askCameraEnabled: Boolean
4040
var askMicEnabled: Boolean
4141
var askDrmEnabled: Boolean
42-
fun isDomainAllowedToAsk(url: String, permission: String): Boolean
43-
fun isDomainGranted(url: String, tabId: String, permission: String): Boolean
42+
suspend fun isDomainAllowedToAsk(url: String, permission: String): Boolean
43+
suspend fun isDomainGranted(url: String, tabId: String, permission: String): Boolean
4444
fun sitePermissionGranted(url: String, tabId: String, permission: String)
4545
fun sitePermissionsWebsitesFlow(): Flow<List<SitePermissionsEntity>>
4646
fun sitePermissionsForAllWebsites(): List<SitePermissionsEntity>
@@ -85,7 +85,7 @@ class SitePermissionsRepositoryImpl @Inject constructor(
8585

8686
private val drmSessions = mutableMapOf<String, Boolean>()
8787

88-
override fun isDomainAllowedToAsk(url: String, permission: String): Boolean {
88+
override suspend fun isDomainAllowedToAsk(url: String, permission: String): Boolean {
8989
val domain = url.extractDomain() ?: url
9090
val sitePermissionsForDomain = sitePermissionsDao.getSitePermissionsByDomain(domain)
9191
return when (permission) {
@@ -111,7 +111,7 @@ class SitePermissionsRepositoryImpl @Inject constructor(
111111
}
112112
}
113113

114-
override fun isDomainGranted(url: String, tabId: String, permission: String): Boolean {
114+
override suspend fun isDomainGranted(url: String, tabId: String, permission: String): Boolean {
115115
val domain = url.extractDomain() ?: url
116116
val sitePermissionForDomain = sitePermissionsDao.getSitePermissionsByDomain(domain)
117117
val permissionAllowedEntity = sitePermissionsAllowedDao.getSitePermissionAllowed(domain, tabId, permission)

site-permissions/site-permissions-impl/src/test/java/com/duckduckgo/site/permissions/impl/SitePermissionsManagerTest.kt

+6-5
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class SitePermissionsManagerTest {
9898
whenever(mockSitePermissionsRepository.isDomainAllowedToAsk(url, PermissionRequest.RESOURCE_VIDEO_CAPTURE)).thenReturn(true)
9999
whenever(mockSitePermissionsRepository.isDomainAllowedToAsk(url, PermissionRequest.RESOURCE_AUDIO_CAPTURE)).thenReturn(false)
100100
whenever(mockPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)).thenReturn(true)
101+
whenever(mockSitePermissionsRepository.isDomainGranted(url, tabId, PermissionRequest.RESOURCE_VIDEO_CAPTURE)).thenReturn(false)
101102

102103
val permissionRequest: PermissionRequest = mock()
103104
whenever(permissionRequest.origin).thenReturn(url.toUri())
@@ -167,14 +168,14 @@ class SitePermissionsManagerTest {
167168
}
168169

169170
@Test
170-
fun whenDomainGrantedThenGetPermissionsQueryResponseReturnsGranted() {
171+
fun whenDomainGrantedThenGetPermissionsQueryResponseReturnsGranted() = runTest {
171172
whenever(mockSitePermissionsRepository.isDomainGranted(url, tabId, PermissionRequest.RESOURCE_VIDEO_CAPTURE)).thenReturn(true)
172173

173174
assertEquals(SitePermissionQueryResponse.Granted, testee.getPermissionsQueryResponse(url, tabId, "camera"))
174175
}
175176

176177
@Test
177-
fun whenDomainAllowedToAskThenGetPermissionsQueryResponseReturnsPrompt() {
178+
fun whenDomainAllowedToAskThenGetPermissionsQueryResponseReturnsPrompt() = runTest {
178179
whenever(mockSitePermissionsRepository.isDomainGranted(url, tabId, PermissionRequest.RESOURCE_VIDEO_CAPTURE)).thenReturn(false)
179180
whenever(mockPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)).thenReturn(true)
180181
whenever(mockSitePermissionsRepository.isDomainAllowedToAsk(url, PermissionRequest.RESOURCE_VIDEO_CAPTURE)).thenReturn(true)
@@ -183,7 +184,7 @@ class SitePermissionsManagerTest {
183184
}
184185

185186
@Test
186-
fun whenDomainNotAllowedToAskThenGetPermissionsQueryResponseReturnsDenied() {
187+
fun whenDomainNotAllowedToAskThenGetPermissionsQueryResponseReturnsDenied() = runTest {
187188
whenever(mockSitePermissionsRepository.isDomainGranted(url, tabId, PermissionRequest.RESOURCE_VIDEO_CAPTURE)).thenReturn(false)
188189
whenever(mockPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)).thenReturn(true)
189190
whenever(mockSitePermissionsRepository.isDomainAllowedToAsk(url, PermissionRequest.RESOURCE_VIDEO_CAPTURE)).thenReturn(false)
@@ -192,7 +193,7 @@ class SitePermissionsManagerTest {
192193
}
193194

194195
@Test
195-
fun whenHardwareNotSupportedThenGetPermissionsQueryResponseReturnsDenied() {
196+
fun whenHardwareNotSupportedThenGetPermissionsQueryResponseReturnsDenied() = runTest {
196197
whenever(mockSitePermissionsRepository.isDomainGranted(url, tabId, PermissionRequest.RESOURCE_VIDEO_CAPTURE)).thenReturn(false)
197198
whenever(mockPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)).thenReturn(false)
198199
whenever(mockSitePermissionsRepository.isDomainAllowedToAsk(url, PermissionRequest.RESOURCE_VIDEO_CAPTURE)).thenReturn(true)
@@ -201,7 +202,7 @@ class SitePermissionsManagerTest {
201202
}
202203

203204
@Test
204-
fun whenAndroidPermissionNotSupportedThenGetPermissionsQueryResponseReturnsDenied() {
205+
fun whenAndroidPermissionNotSupportedThenGetPermissionsQueryResponseReturnsDenied() = runTest {
205206
assertEquals(SitePermissionQueryResponse.Denied, testee.getPermissionsQueryResponse(url, tabId, "unsupported"))
206207
}
207208
}

0 commit comments

Comments
 (0)