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.');
}