Skip to content

Commit

Permalink
Fix back navigation when Duck Player set to always
Browse files Browse the repository at this point in the history
  • Loading branch information
CrisBarreiro committed Aug 26, 2024
1 parent db64312 commit bce739b
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -274,20 +274,30 @@ class RealDuckPlayer @Inject constructor(
url: Uri,
webView: WebView,
): WebResourceResponse? {
val referer = duckPlayerFeatureRepository.getYouTubeReferrerHeaders()
.firstOrNull { referrer -> request.requestHeaders[referrer] != null }
?.let { referrer -> url.getQueryParameter(referrer) }
val referer = request.requestHeaders.keys.firstOrNull { it in duckPlayerFeatureRepository.getYouTubeReferrerHeaders() }
?.let { url.getQueryParameter(it) }
val previousUrl = duckPlayerFeatureRepository.getYouTubeReferrerQueryParams()
.firstOrNull { referrer -> url.getQueryParameter(referrer) != null }
?.let { referrer -> url.getQueryParameter(referrer) }
.firstOrNull { url.getQueryParameter(it) != null }
?.let { url.getQueryParameter(it) }
val currentUrl = withContext(dispatchers.main()) { webView.url }

val videoIdQueryParam = duckPlayerFeatureRepository.getVideoIDQueryParam()
if ((referer != null && isSimulatedYoutubeNoCookie(referer.toUri())) ||
(previousUrl != null && isSimulatedYoutubeNoCookie(previousUrl))
val requestedVideoId = url.getQueryParameter(videoIdQueryParam)

val isSimulated: suspend (String?) -> Boolean = { uri ->
uri?.let { isSimulatedYoutubeNoCookie(it.toUri()) } == true
}

val isMatchingVideoId: (String?) -> Boolean = { uri ->
uri?.toUri()?.getQueryParameter(DUCK_PLAYER_VIDEO_ID_QUERY_PARAM) == requestedVideoId
}

if (isSimulated(referer) && isMatchingVideoId(referer) ||
isSimulated(previousUrl) && isMatchingVideoId(previousUrl) ||
isSimulated(currentUrl) && isMatchingVideoId(currentUrl)
) {
withContext(dispatchers.main()) {
url.getQueryParameter(videoIdQueryParam)?.let {
webView.loadUrl("$DUCK_PLAYER_URL_BASE$DUCK_PLAYER_OPEN_IN_YOUTUBE_PATH?$videoIdQueryParam=$it")
}
webView.loadUrl("$DUCK_PLAYER_URL_BASE$DUCK_PLAYER_OPEN_IN_YOUTUBE_PATH?$videoIdQueryParam=$requestedVideoId")
}
return WebResourceResponse(null, null, null)
} else if (shouldNavigateToDuckPlayer()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,36 @@ class RealDuckPlayerTest {
assertNotNull(result)
}

@Test
fun whenUriIsYoutubeWatchUrlAndPreviousUrlIsDuckPlayer_interceptOpensInYouTube() = runTest {
val request: WebResourceRequest = mock()
val url: Uri = Uri.parse("https://www.youtube.com/watch?v=12345")
val webView: WebView = mock()
whenever(mockDuckPlayerFeatureRepository.getUserPreferences()).thenReturn(UserPreferences(true, Enabled))
whenever(webView.url).thenReturn("https://www.youtube-nocookie.com?videoID=12345")

val result = testee.intercept(request, url, webView)

verify(webView).loadUrl("duck://player/openInYoutube?v=12345")
verify(mockPixel, never()).fire(DUCK_PLAYER_VIEW_FROM_YOUTUBE_AUTOMATIC)
assertNotNull(result)
}

@Test
fun whenUriIsYoutubeWatchUrlAndPreviousUrlIsDuckPlayerWithDifferentId_interceptOpensDuckPlayer() = runTest {
val request: WebResourceRequest = mock()
val url: Uri = Uri.parse("https://www.youtube.com/watch?v=123456")
val webView: WebView = mock()
whenever(mockDuckPlayerFeatureRepository.getUserPreferences()).thenReturn(UserPreferences(true, Enabled))
whenever(webView.url).thenReturn("https://www.youtube-nocookie.com?videoID=12345")

val result = testee.intercept(request, url, webView)

verify(webView).loadUrl("duck://player/123456?origin=auto")
verify(mockPixel).fire(DUCK_PLAYER_VIEW_FROM_YOUTUBE_AUTOMATIC)
assertNotNull(result)
}

@Test
fun whenUriIsYoutubeWatchUrlAndSettingsAlwaysAsk_interceptProcessesYoutubeWatchUri() = runTest {
val request: WebResourceRequest = mock()
Expand Down

0 comments on commit bce739b

Please sign in to comment.