From 7d256cdb7f8acc761f67809480fda7abe66e0676 Mon Sep 17 00:00:00 2001 From: Ashita Agrawal Date: Mon, 7 Oct 2024 16:48:44 +0530 Subject: [PATCH] Transcripts - Update html format transcript display (#2910) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MichaƂ Sikora --- CHANGELOG.md | 2 + app/lint-baseline.xml | 28 +----- gradle/libs.versions.toml | 5 + modules/features/player/build.gradle.kts | 2 + .../player/view/transcripts/TranscriptPage.kt | 96 ++++++++++++++++--- .../view/transcripts/TranscriptPageWrapper.kt | 2 +- .../view/transcripts/TranscriptViewModel.kt | 2 + .../transcripts/TranscriptViewModelTest.kt | 63 +++++++++++- modules/services/compose/build.gradle.kts | 1 + 9 files changed, 159 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63c51715ab6..9c946d601ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ ([#2979](https://github.com/Automattic/pocket-casts-android/pull/2979)) * Fix search podcast results scroll back to the start after subscribing ([#2923](https://github.com/Automattic/pocket-casts-android/pull/2923)) + * Display web-page based HTML transcripts in web view + ([#2910](https://github.com/Automattic/pocket-casts-android/pull/2910)) 7.74 ----- diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index a42627de55f..b591a5a15e3 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -190,7 +190,7 @@ - - - - - - - - - TranscriptItem( - item = item, - searchState = searchState, - ) + if (state.showAsWebPage) { + TranscriptWebView(state, transitionState) + } else { + LazyColumn( + state = scrollState, + modifier = scrollableContentModifier, + contentPadding = PaddingValues( + start = horizontalContentPadding, + end = horizontalContentPadding, + top = 64.dp, + bottom = 80.dp, + ), + ) { + items(state.displayInfo.items) { item -> + TranscriptItem( + item = item, + searchState = searchState, + ) + } } } } @@ -274,6 +291,53 @@ private fun ScrollableTranscriptView( } } +@Composable +private fun TranscriptWebView( + state: UiState.TranscriptLoaded, + transitionState: TransitionState?, +) { + val webViewState = rememberWebViewState(state.transcript.url) + val navigator = rememberWebViewNavigator() + val lastLoadedUri = webViewState.lastLoadedUrl?.toUri() + val transcriptUri = state.transcript.url.toUri() + val isRootUrl = "${lastLoadedUri?.host}${lastLoadedUri?.path}" == "${transcriptUri.host}${transcriptUri.path}" // Ignore scheme http or https + WebView( + state = webViewState, + navigator = navigator, + onCreated = { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + it.settings.isAlgorithmicDarkeningAllowed = true + } else { + if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { + @Suppress("DEPRECATION") + WebSettingsCompat.setForceDark(it.settings, WebSettingsCompat.FORCE_DARK_ON) + } + } + it.setBackgroundColor(android.graphics.Color.TRANSPARENT) + it.setOnKeyListener( + View.OnKeyListener { _, keyCode, event -> + if (event.action == KeyEvent.ACTION_DOWN) { + if (keyCode == KeyEvent.KEYCODE_BACK && it.canGoBack() && !isRootUrl) { + it.goBack() + return@OnKeyListener true + } + } + false + }, + ) + }, + modifier = Modifier + .fillMaxSize() + .padding(bottom = bottomPadding()), + ) + if (webViewState.loadingState is LoadingState.Loading) { + LoadingView(color = TranscriptColors.textColor()) + } + LaunchedEffect(transitionState, webViewState.viewState) { + if (!isRootUrl) navigator.navigateBack() + } +} + @Composable private fun TranscriptItem( item: DisplayItem, @@ -411,6 +475,7 @@ private fun TranscriptContentPreview( ), ), searchState = searchState, + transitionState = null, colors = TranscriptColors(Color.Black), modifier = Modifier.fillMaxSize(), ) @@ -437,6 +502,7 @@ private fun TranscriptEmptyContentPreview() { ), ), searchState = SearchUiState(), + transitionState = null, colors = TranscriptColors(Color.Black), modifier = Modifier.fillMaxSize(), ) diff --git a/modules/features/player/src/main/java/au/com/shiftyjelly/pocketcasts/player/view/transcripts/TranscriptPageWrapper.kt b/modules/features/player/src/main/java/au/com/shiftyjelly/pocketcasts/player/view/transcripts/TranscriptPageWrapper.kt index 60b40af6208..d15e751fc20 100644 --- a/modules/features/player/src/main/java/au/com/shiftyjelly/pocketcasts/player/view/transcripts/TranscriptPageWrapper.kt +++ b/modules/features/player/src/main/java/au/com/shiftyjelly/pocketcasts/player/view/transcripts/TranscriptPageWrapper.kt @@ -135,7 +135,7 @@ fun TranscriptPageWrapper( } LaunchedEffect(transcriptUiState.value) { - showSearch = transcriptUiState.value is TranscriptViewModel.UiState.TranscriptLoaded + showSearch = (transcriptUiState.value as? TranscriptViewModel.UiState.TranscriptLoaded)?.showSearch == true if (!showSearch) expandSearch = false } } diff --git a/modules/features/player/src/main/java/au/com/shiftyjelly/pocketcasts/player/view/transcripts/TranscriptViewModel.kt b/modules/features/player/src/main/java/au/com/shiftyjelly/pocketcasts/player/view/transcripts/TranscriptViewModel.kt index db405573d41..b6c48c0818a 100644 --- a/modules/features/player/src/main/java/au/com/shiftyjelly/pocketcasts/player/view/transcripts/TranscriptViewModel.kt +++ b/modules/features/player/src/main/java/au/com/shiftyjelly/pocketcasts/player/view/transcripts/TranscriptViewModel.kt @@ -235,6 +235,8 @@ class TranscriptViewModel @Inject constructor( cuesInfo.isNotEmpty() && cuesInfo[0].cuesWithTiming.cues.any { it.text?.contains("