From c073acff038e732c67b80ce432715a54657ba11a Mon Sep 17 00:00:00 2001 From: goon-foss Date: Mon, 29 Jun 2026 11:21:41 +0200 Subject: [PATCH] fix(mobile): no center pause button while seeking + incognito diagnostic browser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Player (report dccc05e4): swipe-seek no longer force-opens full controls (it has its own ±time bubble), and the center play/pause button is hidden while actively seeking (pan or scrub-bar drag) — kills the big pause that popped up mid-seek and lingered ~3.5s. Diagnostics "open in browser" now routes to an in-app WebView with incognito=true instead of Linking.openURL: fresh sessionless view of the host page + no NSFW URL dumped into the user's real browser history (fits the app's privacy stance). New DiagnosticBrowser route. Co-Authored-By: Claude Opus 4.8 (1M context) --- mobile/src/changelog.ts | 8 ++++ mobile/src/navigation.tsx | 8 ++++ .../src/screens/DiagnosticBrowserScreen.tsx | 44 +++++++++++++++++++ mobile/src/screens/PlayerScreen.tsx | 19 +++++--- mobile/src/screens/SceneDetailScreen.tsx | 7 ++- 5 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 mobile/src/screens/DiagnosticBrowserScreen.tsx diff --git a/mobile/src/changelog.ts b/mobile/src/changelog.ts index e3f707c..e90e4be 100644 --- a/mobile/src/changelog.ts +++ b/mobile/src/changelog.ts @@ -16,6 +16,14 @@ export type ChangelogEntry = { }; export const CHANGELOG: ChangelogEntry[] = [ + { + id: '2026-06-29b', + date: 'June 2026', + items: [ + 'Seeking (swipe or drag) no longer pops a big pause button into the middle of the screen.', + 'Diagnostics "open in browser" now opens privately inside the app (incognito) — no cookies, no trace in your real browser.', + ], + }, { id: '2026-06-29', date: 'June 2026', diff --git a/mobile/src/navigation.tsx b/mobile/src/navigation.tsx index 5685a66..0c4fef9 100644 --- a/mobile/src/navigation.tsx +++ b/mobile/src/navigation.tsx @@ -11,6 +11,7 @@ import React from 'react'; import { Pressable, Text, View } from 'react-native'; import { AppLockSettingsScreen } from './screens/AppLockSettingsScreen'; import { BlacklistScreen } from './screens/BlacklistScreen'; +import { DiagnosticBrowserScreen } from './screens/DiagnosticBrowserScreen'; import { DonateScreen } from './screens/DonateScreen'; import { FavoritesScreen } from './screens/FavoritesScreen'; import { MovieDetailScreen } from './screens/MovieDetailScreen'; @@ -52,6 +53,8 @@ export type RootStackParamList = { AppLockSettings: undefined; Blacklist: undefined; Donate: undefined; + // In-app incognito browser do diagnostyki hostera (long-press na linku playbacku). + DiagnosticBrowser: { url: string }; Player: { url: string; sceneId: string; @@ -275,6 +278,11 @@ export function AppNavigator({ onLogout, client, appVersion }: AppNavigatorProps component={DonateScreen} options={{ title: 'Support project' }} /> + >(); + const { url } = route.params; + return ( + + ( + + + + )} + style={styles.web} + /> + + ); +} + +const styles = StyleSheet.create({ + root: { flex: 1, backgroundColor: theme.bg }, + web: { flex: 1, backgroundColor: theme.bg }, + loading: { + ...StyleSheet.absoluteFillObject, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: theme.bg, + }, +}); diff --git a/mobile/src/screens/PlayerScreen.tsx b/mobile/src/screens/PlayerScreen.tsx index 9d38f98..f323269 100644 --- a/mobile/src/screens/PlayerScreen.tsx +++ b/mobile/src/screens/PlayerScreen.tsx @@ -575,7 +575,9 @@ function NativeVideoPlayer({ params }: { params: RouteParams }) { .onStart(() => { cancelHide(); panStartTimeRef.current = player.currentTime || 0; - setControlsVisible(true); + // NIE pokazujemy pełnych kontrolek przy swipe-seeku — pan ma własny popup + // ±czas (panSeekBubble). Wcześniej setControlsVisible(true) wyrzucał duży + // przycisk pauzy na środek i zostawiał go ~3.5s po puszczeniu (report dccc05e4). Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light).catch(() => {}); }) .onUpdate((e) => { @@ -686,6 +688,9 @@ function NativeVideoPlayer({ params }: { params: RouteParams }) { // Priorytet: scrubber (palec na pasku) > pan-seek (swipe na video) > playback. const panSeekRatio = panSeekTarget !== null && dur > 0 ? panSeekTarget / dur : null; const displayRatio = scrubbingRatio ?? panSeekRatio ?? progressRatio; + // Aktywne przewijanie (palec na pasku albo swipe) — chowamy wtedy duży środkowy + // przycisk play/pauza (report dccc05e4): przy seeku nie chcesz wielkiej pauzy na ekranie. + const isSeeking = panSeekTarget !== null || scrubX !== null; const displayedTime = scrubbingRatio !== null ? scrubbingRatio * dur @@ -775,11 +780,13 @@ function NativeVideoPlayer({ params }: { params: RouteParams }) { - - - {isPlaying ? '❚❚' : '▶'} - - + {!isSeeking && ( + + + {isPlaying ? '❚❚' : '▶'} + + + )} {formatTime(displayedTime)} diff --git a/mobile/src/screens/SceneDetailScreen.tsx b/mobile/src/screens/SceneDetailScreen.tsx index 60b2b17..ee74d08 100644 --- a/mobile/src/screens/SceneDetailScreen.tsx +++ b/mobile/src/screens/SceneDetailScreen.tsx @@ -775,12 +775,15 @@ function PlaybackButton({ 'What do you want to do with this link?', [ { - text: 'Open in browser (diagnostics)', + text: 'Open in browser (incognito)', onPress: async () => { try { const url = source.page_url || source.embed_url || source.stream_url; if (url) { - await Linking.openURL(url); + // In-app incognito WebView (report dccc05e4): świeży widok bez sesji/ + // cookies usera i bez śladu w prawdziwej przeglądarce. Zamiast + // Linking.openURL (otwierał Chrome z historią + sesją). + nav.navigate('DiagnosticBrowser', { url }); } else { Alert.alert('No URL', 'This playback has no page_url to open.'); }