From 6ff5aa9e028257d909ae6c2c6901171675441493 Mon Sep 17 00:00:00 2001 From: tapframe Date: Tue, 6 Jan 2026 00:25:18 +0530 Subject: [PATCH 01/22] updated react native video patch file --- patches/react-native-video+6.18.0.patch | 1739 +++-------------------- 1 file changed, 185 insertions(+), 1554 deletions(-) diff --git a/patches/react-native-video+6.18.0.patch b/patches/react-native-video+6.18.0.patch index 584a0fd..de10c59 100644 --- a/patches/react-native-video+6.18.0.patch +++ b/patches/react-native-video+6.18.0.patch @@ -1,1467 +1,16 @@ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/a04bee87307e1775c0b129596d3a2b6e/results.bin b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/a04bee87307e1775c0b129596d3a2b6e/results.bin -new file mode 100644 -index 0000000..0d259dd ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/a04bee87307e1775c0b129596d3a2b6e/results.bin -@@ -0,0 +1 @@ -+o/classes -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/a04bee87307e1775c0b129596d3a2b6e/transformed/classes/classes_dex/classes.dex b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/a04bee87307e1775c0b129596d3a2b6e/transformed/classes/classes_dex/classes.dex -new file mode 100644 -index 0000000..0c96902 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/a04bee87307e1775c0b129596d3a2b6e/transformed/classes/classes_dex/classes.dex differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/cde462de23ae0e930ed29ed683a0d845/results.bin b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/cde462de23ae0e930ed29ed683a0d845/results.bin -new file mode 100644 -index 0000000..0d259dd ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/cde462de23ae0e930ed29ed683a0d845/results.bin -@@ -0,0 +1 @@ -+o/classes -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/cde462de23ae0e930ed29ed683a0d845/transformed/classes/classes_dex/classes.dex b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/.transforms/cde462de23ae0e930ed29ed683a0d845/transformed/classes/classes_dex/classes.dex -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/generated/source/buildConfig/debug/com/brentvatne/react/BuildConfig.java b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/generated/source/buildConfig/debug/com/brentvatne/react/BuildConfig.java -new file mode 100644 -index 0000000..b26a50e ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/generated/source/buildConfig/debug/com/brentvatne/react/BuildConfig.java -@@ -0,0 +1,22 @@ -+/** -+ * Automatically generated file. DO NOT MODIFY -+ */ -+package com.brentvatne.react; -+ -+public final class BuildConfig { -+ public static final boolean DEBUG = Boolean.parseBoolean("true"); -+ public static final String LIBRARY_PACKAGE_NAME = "com.brentvatne.react"; -+ public static final String BUILD_TYPE = "debug"; -+ // Field from default config. -+ public static final boolean IS_NEW_ARCHITECTURE_ENABLED = true; -+ // Field from default config. -+ public static final boolean USE_EXOPLAYER_DASH = true; -+ // Field from default config. -+ public static final boolean USE_EXOPLAYER_HLS = true; -+ // Field from default config. -+ public static final boolean USE_EXOPLAYER_IMA = false; -+ // Field from default config. -+ public static final boolean USE_EXOPLAYER_RTSP = false; -+ // Field from default config. -+ public static final boolean USE_EXOPLAYER_SMOOTH_STREAMING = true; -+} -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml -new file mode 100644 -index 0000000..728c5a9 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml -@@ -0,0 +1,7 @@ -+ -+ -+ -+ -+ -+ -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json -new file mode 100644 -index 0000000..247891c ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json -@@ -0,0 +1,18 @@ -+{ -+ "version": 3, -+ "artifactType": { -+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS", -+ "kind": "Directory" -+ }, -+ "applicationId": "com.brentvatne.react", -+ "variantName": "debug", -+ "elements": [ -+ { -+ "type": "SINGLE", -+ "filters": [], -+ "attributes": [], -+ "outputFile": "AndroidManifest.xml" -+ } -+ ], -+ "elementType": "File" -+} -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties -new file mode 100644 -index 0000000..1211b1e ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties -@@ -0,0 +1,6 @@ -+aarFormatVersion=1.0 -+aarMetadataVersion=1.0 -+minCompileSdk=1 -+minCompileSdkExtension=0 -+minAndroidGradlePluginVersion=1.0.0 -+coreLibraryDesugaringEnabled=false -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json -new file mode 100644 -index 0000000..9e26dfe ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json -@@ -0,0 +1 @@ -+{} -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar -new file mode 100644 -index 0000000..b0bc2f4 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar -new file mode 100644 -index 0000000..0889def -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt -new file mode 100644 -index 0000000..b5a67e1 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt -@@ -0,0 +1,44 @@ -+int color player_overlay_color 0x0 -+int color red 0x0 -+int color silver_gray 0x0 -+int color white 0x0 -+int dimen controller_wrapper_padding_top 0x0 -+int dimen full_screen_margin 0x0 -+int dimen full_screen_size 0x0 -+int dimen live_wrapper_margin_top 0x0 -+int dimen position_duration_horizontal_padding 0x0 -+int dimen position_duration_text_size 0x0 -+int dimen position_duration_width 0x0 -+int dimen seekBar_height 0x0 -+int dimen seekBar_wrapper_margin_top 0x0 -+int drawable circle 0x0 -+int id exo_duration 0x0 -+int id exo_ffwd 0x0 -+int id exo_fullscreen 0x0 -+int id exo_live_container 0x0 -+int id exo_live_icon 0x0 -+int id exo_live_label 0x0 -+int id exo_next 0x0 -+int id exo_pause 0x0 -+int id exo_play 0x0 -+int id exo_play_pause_container 0x0 -+int id exo_position 0x0 -+int id exo_prev 0x0 -+int id exo_progress 0x0 -+int id exo_rew 0x0 -+int id exo_settings 0x0 -+int layout exo_legacy_player_control_view 0x0 -+int string error_drm_not_supported 0x0 -+int string error_drm_unknown 0x0 -+int string error_drm_unsupported_scheme 0x0 -+int string error_instantiating_decoder 0x0 -+int string error_no_decoder 0x0 -+int string error_no_secure_decoder 0x0 -+int string error_querying_decoders 0x0 -+int string media_playback_notification_text 0x0 -+int string media_playback_notification_title 0x0 -+int string playback_speed 0x0 -+int string select_playback_speed 0x0 -+int string settings 0x0 -+int string unrecognized_media_format 0x0 -+int style ExoMediaButton_FullScreen 0x0 -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_circle.xml.flat b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_circle.xml.flat -new file mode 100644 -index 0000000..e62758d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_circle.xml.flat differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_exo_legacy_player_control_view.xml.flat b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_exo_legacy_player_control_view.xml.flat -new file mode 100644 -index 0000000..bb5b5f9 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_exo_legacy_player_control_view.xml.flat differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug-mergeJavaRes/merge-state b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug-mergeJavaRes/merge-state -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties -new file mode 100644 -index 0000000..a07f51b ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties -@@ -0,0 +1,3 @@ -+#Fri Dec 26 20:39:25 IST 2025 -+com.brentvatne.react.react-native-video-main-6\:/drawable/circle.xml=/Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/drawable/circle.xml -+com.brentvatne.react.react-native-video-main-6\:/layout/exo_legacy_player_control_view.xml=/Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/layout/exo_legacy_player_control_view.xml -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml -new file mode 100644 -index 0000000..e8dd9e4 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml -@@ -0,0 +1,33 @@ -+ -+ -+ #00000000 -+ #FF0000 -+ #FFBEBEBE -+ #FFFFFF -+ 4dp -+ 4dp -+ 30dp -+ 12dp -+ 4dp -+ 14sp -+ 50dp -+ 26dp -+ 4dp -+ Protected content not supported on API levels below 18 -+ An unknown DRM error occurred -+ This device does not support the required DRM scheme -+ Unable to instantiate decoder %1$s -+ This device does not provide a decoder for %1$s -+ This device does not provide a secure decoder for %1$s -+ Unable to query device decoders -+ Preparing playback -+ Media playback -+ Playback Speed -+ Select Playback Speed -+ Settings -+ Unrecognized media format -+ -+ -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug/packageDebugResources/merger.xml -new file mode 100644 -index 0000000..55ffc6b ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/debug/packageDebugResources/merger.xml -@@ -0,0 +1,5 @@ -+ -+#FFBEBEBE#00000000#FFFFFF#FF00004dp4dp12dp4dp4dp50dp26dp30dp14spThis device does not provide a decoder for %1$sThis device does not provide a secure decoder for %1$sUnable to query device decodersUnable to instantiate decoder %1$sProtected content not supported on API levels below 18Unrecognized media formatThis device does not support the required DRM schemeAn unknown DRM error occurredSettingsPlayback SpeedSelect Playback SpeedMedia playbackPreparing playback -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/mergeDebugAssets/merger.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/mergeDebugAssets/merger.xml -new file mode 100644 -index 0000000..8769311 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/mergeDebugAssets/merger.xml -@@ -0,0 +1,2 @@ -+ -+ -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/mergeDebugJniLibFolders/merger.xml -new file mode 100644 -index 0000000..af687a7 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/mergeDebugJniLibFolders/merger.xml -@@ -0,0 +1,2 @@ -+ -+ -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/mergeDebugShaders/merger.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/mergeDebugShaders/merger.xml -new file mode 100644 -index 0000000..65138a3 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/incremental/mergeDebugShaders/merger.xml -@@ -0,0 +1,2 @@ -+ -+ -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/react-native-video_debug.kotlin_module b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/react-native-video_debug.kotlin_module -new file mode 100644 -index 0000000..1698483 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/react-native-video_debug.kotlin_module differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/ima/ImaAdsLoader$Builder.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/ima/ImaAdsLoader$Builder.class -new file mode 100644 -index 0000000..b019110 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/ima/ImaAdsLoader$Builder.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/ima/ImaAdsLoader.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/ima/ImaAdsLoader.class -new file mode 100644 -index 0000000..5e16e53 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/ima/ImaAdsLoader.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/rtsp/RtspMediaSource$Factory.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/rtsp/RtspMediaSource$Factory.class -new file mode 100644 -index 0000000..b08faeb -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/rtsp/RtspMediaSource$Factory.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/rtsp/RtspMediaSource.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/rtsp/RtspMediaSource.class -new file mode 100644 -index 0000000..2f92e20 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/androidx/media3/exoplayer/rtsp/RtspMediaSource.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$1.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$1.class -new file mode 100644 -index 0000000..2a5b980 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$1.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$2.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$2.class -new file mode 100644 -index 0000000..727c94e -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$2.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$3.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$3.class -new file mode 100644 -index 0000000..b3b518f -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$3.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$4.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$4.class -new file mode 100644 -index 0000000..682ae0e -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$4.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$OnAudioFocusChangedListener.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$OnAudioFocusChangedListener.class -new file mode 100644 -index 0000000..92cbcf5 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$OnAudioFocusChangedListener.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$RNVLoadControl.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$RNVLoadControl.class -new file mode 100644 -index 0000000..4f175f2 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView$RNVLoadControl.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView.class -new file mode 100644 -index 0000000..719d047 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/exoplayer/ReactExoplayerView.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/react/BuildConfig.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/react/BuildConfig.class -new file mode 100644 -index 0000000..4c5c87e -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/brentvatne/react/BuildConfig.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdError.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdError.class -new file mode 100644 -index 0000000..0a9b7a7 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdError.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdErrorEvent$AdErrorListener.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdErrorEvent$AdErrorListener.class -new file mode 100644 -index 0000000..1380a05 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdErrorEvent$AdErrorListener.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdErrorEvent.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdErrorEvent.class -new file mode 100644 -index 0000000..07ab3fa -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdErrorEvent.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdEvent$AdEventListener.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdEvent$AdEventListener.class -new file mode 100644 -index 0000000..dbe9984 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdEvent$AdEventListener.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdEvent.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdEvent.class -new file mode 100644 -index 0000000..88ae34c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/AdEvent.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ConcreteImaSdkFactory.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ConcreteImaSdkFactory.class -new file mode 100644 -index 0000000..a3184b3 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ConcreteImaSdkFactory.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ConcreteImaSdkSettings.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ConcreteImaSdkSettings.class -new file mode 100644 -index 0000000..264cd83 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ConcreteImaSdkSettings.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ImaSdkFactory.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ImaSdkFactory.class -new file mode 100644 -index 0000000..46cea81 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ImaSdkFactory.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ImaSdkSettings.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ImaSdkSettings.class -new file mode 100644 -index 0000000..a4cef0d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/google/ads/interactivemedia/v3/api/ImaSdkSettings.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt -new file mode 100644 -index 0000000..987e479 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt -@@ -0,0 +1,46 @@ -+R_DEF: Internal format may change without notice -+local -+color player_overlay_color -+color red -+color silver_gray -+color white -+dimen controller_wrapper_padding_top -+dimen full_screen_margin -+dimen full_screen_size -+dimen live_wrapper_margin_top -+dimen position_duration_horizontal_padding -+dimen position_duration_text_size -+dimen position_duration_width -+dimen seekBar_height -+dimen seekBar_wrapper_margin_top -+drawable circle -+id exo_duration -+id exo_ffwd -+id exo_fullscreen -+id exo_live_container -+id exo_live_icon -+id exo_live_label -+id exo_next -+id exo_pause -+id exo_play -+id exo_play_pause_container -+id exo_position -+id exo_prev -+id exo_progress -+id exo_rew -+id exo_settings -+layout exo_legacy_player_control_view -+string error_drm_not_supported -+string error_drm_unknown -+string error_drm_unsupported_scheme -+string error_instantiating_decoder -+string error_no_decoder -+string error_no_secure_decoder -+string error_querying_decoders -+string media_playback_notification_text -+string media_playback_notification_title -+string playback_speed -+string select_playback_speed -+string settings -+string unrecognized_media_format -+style ExoMediaButton.FullScreen -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt -new file mode 100644 -index 0000000..2300097 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt -@@ -0,0 +1,7 @@ -+1 -+2 -+4 -+5 -+6 -+7 -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-react-native-video.jar b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-react-native-video.jar -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml -new file mode 100644 -index 0000000..728c5a9 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml -@@ -0,0 +1,7 @@ -+ -+ -+ -+ -+ -+ -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json -new file mode 100644 -index 0000000..0637a08 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json -@@ -0,0 +1 @@ -+[] -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt -new file mode 100644 -index 0000000..08f4ebe ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt -@@ -0,0 +1 @@ -+0 Warning/Error -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/drawable/circle.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/drawable/circle.xml -new file mode 100644 -index 0000000..9f06d7c ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/drawable/circle.xml -@@ -0,0 +1,6 @@ -+ -+ -+ -+ -+ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/layout/exo_legacy_player_control_view.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/layout/exo_legacy_player_control_view.xml -new file mode 100644 -index 0000000..e0babc4 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/layout/exo_legacy_player_control_view.xml -@@ -0,0 +1,120 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/values/values.xml b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/values/values.xml -new file mode 100644 -index 0000000..e8dd9e4 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/packaged_res/debug/packageDebugResources/values/values.xml -@@ -0,0 +1,33 @@ -+ -+ -+ #00000000 -+ #FF0000 -+ #FFBEBEBE -+ #FFFFFF -+ 4dp -+ 4dp -+ 30dp -+ 12dp -+ 4dp -+ 14sp -+ 50dp -+ 26dp -+ 4dp -+ Protected content not supported on API levels below 18 -+ An unknown DRM error occurred -+ This device does not support the required DRM scheme -+ Unable to instantiate decoder %1$s -+ This device does not provide a decoder for %1$s -+ This device does not provide a secure decoder for %1$s -+ Unable to query device decoders -+ Preparing playback -+ Media playback -+ Playback Speed -+ Select Playback Speed -+ Settings -+ Unrecognized media format -+ -+ -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar -new file mode 100644 -index 0000000..3b4d20b -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt -new file mode 100644 -index 0000000..1cb95ed ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt -@@ -0,0 +1,45 @@ -+com.brentvatne.react -+color player_overlay_color -+color red -+color silver_gray -+color white -+dimen controller_wrapper_padding_top -+dimen full_screen_margin -+dimen full_screen_size -+dimen live_wrapper_margin_top -+dimen position_duration_horizontal_padding -+dimen position_duration_text_size -+dimen position_duration_width -+dimen seekBar_height -+dimen seekBar_wrapper_margin_top -+drawable circle -+id exo_duration -+id exo_ffwd -+id exo_fullscreen -+id exo_live_container -+id exo_live_icon -+id exo_live_label -+id exo_next -+id exo_pause -+id exo_play -+id exo_play_pause_container -+id exo_position -+id exo_prev -+id exo_progress -+id exo_rew -+id exo_settings -+layout exo_legacy_player_control_view -+string error_drm_not_supported -+string error_drm_unknown -+string error_drm_unsupported_scheme -+string error_instantiating_decoder -+string error_no_decoder -+string error_no_secure_decoder -+string error_querying_decoders -+string media_playback_notification_text -+string media_playback_notification_title -+string playback_speed -+string select_playback_speed -+string settings -+string unrecognized_media_format -+style ExoMediaButton_FullScreen -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab -new file mode 100644 -index 0000000..7df5bcf -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream -new file mode 100644 -index 0000000..1a55594 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len -new file mode 100644 -index 0000000..74ddf64 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len -new file mode 100644 -index 0000000..41d6c24 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at -new file mode 100644 -index 0000000..d0eda54 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i -new file mode 100644 -index 0000000..8a80b7d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab -new file mode 100644 -index 0000000..532458c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream -new file mode 100644 -index 0000000..1d1d548 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len -new file mode 100644 -index 0000000..3247724 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len -new file mode 100644 -index 0000000..bba171d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at -new file mode 100644 -index 0000000..5d6b64a -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i -new file mode 100644 -index 0000000..045022c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab -new file mode 100644 -index 0000000..8178530 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream -new file mode 100644 -index 0000000..1d1d548 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len -new file mode 100644 -index 0000000..3247724 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len -new file mode 100644 -index 0000000..bba171d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at -new file mode 100644 -index 0000000..6a45a65 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i -new file mode 100644 -index 0000000..045022c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab -new file mode 100644 -index 0000000..496bda2 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream -new file mode 100644 -index 0000000..a49789c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len -new file mode 100644 -index 0000000..a3d0573 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len -new file mode 100644 -index 0000000..93a595b -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at -new file mode 100644 -index 0000000..9d91003 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i -new file mode 100644 -index 0000000..1598ef3 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab -new file mode 100644 -index 0000000..c3975e3 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream -new file mode 100644 -index 0000000..9d05b9a -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len -new file mode 100644 -index 0000000..d3e09af -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len -new file mode 100644 -index 0000000..b7d7395 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at -new file mode 100644 -index 0000000..e3911a1 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i -new file mode 100644 -index 0000000..af27d9c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab -new file mode 100644 -index 0000000..bdf584a -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream -new file mode 100644 -index 0000000..a9e6823 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len -new file mode 100644 -index 0000000..de8bf97 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len -new file mode 100644 -index 0000000..2a17e6e -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at -new file mode 100644 -index 0000000..46d6744 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i -new file mode 100644 -index 0000000..2073982 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab -new file mode 100644 -index 0000000..c626f49 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream -new file mode 100644 -index 0000000..7214377 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len -new file mode 100644 -index 0000000..86b154b -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len -new file mode 100644 -index 0000000..882f24f -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values -new file mode 100644 -index 0000000..2ff3eb7 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at -new file mode 100644 -index 0000000..af661f7 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s -new file mode 100644 -index 0000000..b6551b9 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s -@@ -0,0 +1 @@ -+ -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i -new file mode 100644 -index 0000000..0cbafa1 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab -new file mode 100644 -index 0000000..85d9216 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream -new file mode 100644 -index 0000000..1a55594 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len -new file mode 100644 -index 0000000..74ddf64 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len -new file mode 100644 -index 0000000..41d6c24 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at -new file mode 100644 -index 0000000..dfc60fb -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i -new file mode 100644 -index 0000000..8a80b7d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab -new file mode 100644 -index 0000000..95c2c01 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream -new file mode 100644 -index 0000000..90b21c4 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len -new file mode 100644 -index 0000000..4cb813c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len -new file mode 100644 -index 0000000..385642d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at -new file mode 100644 -index 0000000..195d865 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i -new file mode 100644 -index 0000000..5e4a0c0 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab -new file mode 100644 -index 0000000..d98dace -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream -new file mode 100644 -index 0000000..ae4ac93 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len -new file mode 100644 -index 0000000..6dc1435 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len -new file mode 100644 -index 0000000..42df8b9 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at -new file mode 100644 -index 0000000..bc345c6 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i -new file mode 100644 -index 0000000..f0c9463 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab -new file mode 100644 -index 0000000..672070d ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab -@@ -0,0 +1,2 @@ -+44 -+0 -\ No newline at end of file -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab -new file mode 100644 -index 0000000..1878d5a -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream -new file mode 100644 -index 0000000..1a55594 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len -new file mode 100644 -index 0000000..74ddf64 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len -new file mode 100644 -index 0000000..41d6c24 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at -new file mode 100644 -index 0000000..d3fcc7e -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i -new file mode 100644 -index 0000000..8a80b7d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab -new file mode 100644 -index 0000000..04aeda4 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream -new file mode 100644 -index 0000000..132a271 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len -new file mode 100644 -index 0000000..79ad34c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len -new file mode 100644 -index 0000000..41d6c24 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at -new file mode 100644 -index 0000000..c834290 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i -new file mode 100644 -index 0000000..1601c02 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab -new file mode 100644 -index 0000000..5fc703e -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream -new file mode 100644 -index 0000000..39f4cac -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len -new file mode 100644 -index 0000000..e381b23 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len -new file mode 100644 -index 0000000..35ed991 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at -new file mode 100644 -index 0000000..a262c4a -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i -new file mode 100644 -index 0000000..1bfa622 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len -new file mode 100644 -index 0000000..131e265 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/last-build.bin b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/last-build.bin -new file mode 100644 -index 0000000..a42036d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/cacheable/last-build.bin differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin -new file mode 100644 -index 0000000..badcbce -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/outputs/aar/react-native-video-debug.aar b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/outputs/aar/react-native-video-debug.aar -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/outputs/logs/manifest-merger-debug-report.txt b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/outputs/logs/manifest-merger-debug-report.txt -new file mode 100644 -index 0000000..a388215 ---- /dev/null -+++ b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/outputs/logs/manifest-merger-debug-report.txt -@@ -0,0 +1,16 @@ -+-- Merging decision tree log --- -+manifest -+ADDED from /Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/src/main/AndroidManifestNew.xml:1:1-2:12 -+INJECTED from /Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/src/main/AndroidManifestNew.xml:1:1-2:12 -+ package -+ INJECTED from /Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/src/main/AndroidManifestNew.xml -+ xmlns:android -+ ADDED from /Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/src/main/AndroidManifestNew.xml:1:11-69 -+uses-sdk -+INJECTED from /Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/src/main/AndroidManifestNew.xml reason: use-sdk injection requested -+INJECTED from /Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/src/main/AndroidManifestNew.xml -+INJECTED from /Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/src/main/AndroidManifestNew.xml -+ android:targetSdkVersion -+ INJECTED from /Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/src/main/AndroidManifestNew.xml -+ android:minSdkVersion -+ INJECTED from /Users/nayifnoushad/Documents/Projects/NuvioStreaming/node_modules/react-native-video/android/src/main/AndroidManifestNew.xml -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin -new file mode 100644 -index 0000000..8d6fb57 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/META-INF/react-native-video_debug.kotlin_module b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/META-INF/react-native-video_debug.kotlin_module -new file mode 100644 -index 0000000..1698483 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/META-INF/react-native-video_debug.kotlin_module differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/AdsProps$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/AdsProps$Companion.class -new file mode 100644 -index 0000000..2e5d42b -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/AdsProps$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/AdsProps.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/AdsProps.class -new file mode 100644 -index 0000000..e2b54bd -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/AdsProps.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig$Companion.class -new file mode 100644 -index 0000000..0fbaa90 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig$Live$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig$Live$Companion.class -new file mode 100644 -index 0000000..ce1128e -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig$Live$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig$Live.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig$Live.class -new file mode 100644 -index 0000000..2054200 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig$Live.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig.class -new file mode 100644 -index 0000000..7ef226b -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferConfig.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferingStrategy$BufferingStrategyEnum.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferingStrategy$BufferingStrategyEnum.class -new file mode 100644 -index 0000000..162566c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferingStrategy$BufferingStrategyEnum.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferingStrategy$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferingStrategy$Companion.class -new file mode 100644 -index 0000000..7477be8 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferingStrategy$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferingStrategy.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferingStrategy.class -new file mode 100644 -index 0000000..3516405 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/BufferingStrategy.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/CMCDProps$Companion$WhenMappings.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/CMCDProps$Companion$WhenMappings.class -new file mode 100644 -index 0000000..5145552 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/CMCDProps$Companion$WhenMappings.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/CMCDProps$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/CMCDProps$Companion.class -new file mode 100644 -index 0000000..e813d1a -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/CMCDProps$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/CMCDProps.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/CMCDProps.class -new file mode 100644 -index 0000000..e6c0538 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/CMCDProps.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ControlsConfig$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ControlsConfig$Companion.class -new file mode 100644 -index 0000000..b2e5cfc -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ControlsConfig$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ControlsConfig.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ControlsConfig.class -new file mode 100644 -index 0000000..a672b48 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ControlsConfig.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/DRMProps$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/DRMProps$Companion.class -new file mode 100644 -index 0000000..949a5b9 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/DRMProps$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/DRMProps.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/DRMProps.class -new file mode 100644 -index 0000000..8e26a44 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/DRMProps.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ResizeMode$Mode.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ResizeMode$Mode.class -new file mode 100644 -index 0000000..8c2948d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ResizeMode$Mode.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ResizeMode.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ResizeMode.class -new file mode 100644 -index 0000000..ab7c203 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ResizeMode.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrack$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrack$Companion.class -new file mode 100644 -index 0000000..3262de8 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrack$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrack.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrack.class -new file mode 100644 -index 0000000..a6b7907 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrack.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrackList$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrackList$Companion.class -new file mode 100644 -index 0000000..a41fe7d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrackList$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrackList.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrackList.class -new file mode 100644 -index 0000000..ec0f170 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SideLoadedTextTrackList.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source$Companion.class -new file mode 100644 -index 0000000..20c7316 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source$Metadata$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source$Metadata$Companion.class -new file mode 100644 -index 0000000..3a83d08 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source$Metadata$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source$Metadata.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source$Metadata.class -new file mode 100644 -index 0000000..381c5ea -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source$Metadata.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source.class -new file mode 100644 -index 0000000..763511c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Source.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SubtitleStyle$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SubtitleStyle$Companion.class -new file mode 100644 -index 0000000..1ef82f1 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SubtitleStyle$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SubtitleStyle.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SubtitleStyle.class -new file mode 100644 -index 0000000..4ebb38c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/SubtitleStyle.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/TimedMetadata.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/TimedMetadata.class -new file mode 100644 -index 0000000..81dc3f7 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/TimedMetadata.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Track.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Track.class -new file mode 100644 -index 0000000..bf9687d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/Track.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/VideoTrack.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/VideoTrack.class -new file mode 100644 -index 0000000..a011166 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/VideoTrack.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ViewType$ViewType.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ViewType$ViewType.class -new file mode 100644 -index 0000000..2dfe0a5 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ViewType$ViewType.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ViewType.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ViewType.class -new file mode 100644 -index 0000000..24c319c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/api/ViewType.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/EventTypes$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/EventTypes$Companion.class -new file mode 100644 -index 0000000..7c1c2f6 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/EventTypes$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/EventTypes.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/EventTypes.class -new file mode 100644 -index 0000000..68c48f1 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/EventTypes.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/VideoEventEmitter$EventBuilder.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/VideoEventEmitter$EventBuilder.class -new file mode 100644 -index 0000000..0dceebe -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/VideoEventEmitter$EventBuilder.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/VideoEventEmitter$VideoCustomEvent.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/VideoEventEmitter$VideoCustomEvent.class -new file mode 100644 -index 0000000..6116962 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/VideoEventEmitter$VideoCustomEvent.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/VideoEventEmitter.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/VideoEventEmitter.class -new file mode 100644 -index 0000000..1f63a29 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/react/VideoEventEmitter.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/toolbox/DebugLog.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/toolbox/DebugLog.class -new file mode 100644 -index 0000000..35fd981 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/toolbox/DebugLog.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/toolbox/ReactBridgeUtils.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/toolbox/ReactBridgeUtils.class -new file mode 100644 -index 0000000..5b3a99d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/common/toolbox/ReactBridgeUtils.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AspectRatioFrameLayout$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AspectRatioFrameLayout$Companion.class -new file mode 100644 -index 0000000..e1e118c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AspectRatioFrameLayout$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AspectRatioFrameLayout.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AspectRatioFrameLayout.class -new file mode 100644 -index 0000000..8955650 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AspectRatioFrameLayout.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AudioOutput$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AudioOutput$Companion.class -new file mode 100644 -index 0000000..fdbd8c4 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AudioOutput$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AudioOutput.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AudioOutput.class -new file mode 100644 -index 0000000..49bd1a1 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/AudioOutput.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/CMCDConfig$createCmcdConfiguration$1.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/CMCDConfig$createCmcdConfiguration$1.class -new file mode 100644 -index 0000000..1b9ff2b -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/CMCDConfig$createCmcdConfiguration$1.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/CMCDConfig.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/CMCDConfig.class -new file mode 100644 -index 0000000..24ff469 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/CMCDConfig.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ConfigurationUtils.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ConfigurationUtils.class -new file mode 100644 -index 0000000..8623659 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ConfigurationUtils.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DRMManager.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DRMManager.class -new file mode 100644 -index 0000000..c054558 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DRMManager.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DRMManagerSpec.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DRMManagerSpec.class -new file mode 100644 -index 0000000..3ba0b21 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DRMManagerSpec.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DataSourceUtil.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DataSourceUtil.class -new file mode 100644 -index 0000000..435095f -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DataSourceUtil.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DefaultReactExoplayerConfig.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DefaultReactExoplayerConfig.class -new file mode 100644 -index 0000000..7d79368 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/DefaultReactExoplayerConfig.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ExoPlayerView$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ExoPlayerView$Companion.class -new file mode 100644 -index 0000000..345dd50 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ExoPlayerView$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ExoPlayerView$playerListener$1.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ExoPlayerView$playerListener$1.class -new file mode 100644 -index 0000000..4dcc80e -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ExoPlayerView$playerListener$1.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ExoPlayerView.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ExoPlayerView.class -new file mode 100644 -index 0000000..df0ace7 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ExoPlayerView.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/FullScreenPlayerView$KeepScreenOnUpdater$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/FullScreenPlayerView$KeepScreenOnUpdater$Companion.class -new file mode 100644 -index 0000000..8bcae8d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/FullScreenPlayerView$KeepScreenOnUpdater$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/FullScreenPlayerView$KeepScreenOnUpdater.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/FullScreenPlayerView$KeepScreenOnUpdater.class -new file mode 100644 -index 0000000..550135d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/FullScreenPlayerView$KeepScreenOnUpdater.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/FullScreenPlayerView.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/FullScreenPlayerView.class -new file mode 100644 -index 0000000..257de83 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/FullScreenPlayerView.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/PictureInPictureUtil.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/PictureInPictureUtil.class -new file mode 100644 -index 0000000..9e8c1b9 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/PictureInPictureUtil.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/PictureInPictureUtilKt.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/PictureInPictureUtilKt.class -new file mode 100644 -index 0000000..2c42f4a -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/PictureInPictureUtilKt.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/PlaybackServiceBinder.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/PlaybackServiceBinder.class -new file mode 100644 -index 0000000..5ae25b4 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/PlaybackServiceBinder.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/RNVExoplayerPlugin$DefaultImpls.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/RNVExoplayerPlugin$DefaultImpls.class -new file mode 100644 -index 0000000..af3decf -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/RNVExoplayerPlugin$DefaultImpls.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/RNVExoplayerPlugin.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/RNVExoplayerPlugin.class -new file mode 100644 -index 0000000..9bc6115 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/RNVExoplayerPlugin.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/RNVSimpleCache.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/RNVSimpleCache.class -new file mode 100644 -index 0000000..659e439 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/RNVSimpleCache.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerConfig.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerConfig.class -new file mode 100644 -index 0000000..2456c95 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerConfig.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerLoadErrorHandlingPolicy.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerLoadErrorHandlingPolicy.class -new file mode 100644 -index 0000000..38ce458 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerLoadErrorHandlingPolicy.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerViewManager$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerViewManager$Companion.class -new file mode 100644 -index 0000000..bc906a9 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerViewManager$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerViewManager.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerViewManager.class -new file mode 100644 -index 0000000..07bd865 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/ReactExoplayerViewManager.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackCallback.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackCallback.class -new file mode 100644 -index 0000000..5e67aa0 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackCallback.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService$Companion$COMMAND.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService$Companion$COMMAND.class -new file mode 100644 -index 0000000..6ba65f2 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService$Companion$COMMAND.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService$Companion$WhenMappings.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService$Companion$WhenMappings.class -new file mode 100644 -index 0000000..647f782 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService$Companion$WhenMappings.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService$Companion.class -new file mode 100644 -index 0000000..0f20e85 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService.class -new file mode 100644 -index 0000000..8a576c2 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/exoplayer/VideoPlaybackService.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/RNVPlugin.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/RNVPlugin.class -new file mode 100644 -index 0000000..8a59f22 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/RNVPlugin.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/ReactNativeVideoManager$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/ReactNativeVideoManager$Companion.class -new file mode 100644 -index 0000000..32d6d1f -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/ReactNativeVideoManager$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/ReactNativeVideoManager.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/ReactNativeVideoManager.class -new file mode 100644 -index 0000000..2679ae0 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/ReactNativeVideoManager.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/ReactVideoPackage.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/ReactVideoPackage.class -new file mode 100644 -index 0000000..2af2d2c -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/ReactVideoPackage.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoDecoderInfoModule$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoDecoderInfoModule$Companion.class -new file mode 100644 -index 0000000..d8a4aa3 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoDecoderInfoModule$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoDecoderInfoModule.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoDecoderInfoModule.class -new file mode 100644 -index 0000000..8348d9d -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoDecoderInfoModule.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoManagerModule$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoManagerModule$Companion.class -new file mode 100644 -index 0000000..435293b -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoManagerModule$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoManagerModule.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoManagerModule.class -new file mode 100644 -index 0000000..c28e02b -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/react/VideoManagerModule.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/AudioBecomingNoisyReceiver.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/AudioBecomingNoisyReceiver.class -new file mode 100644 -index 0000000..990ca48 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/AudioBecomingNoisyReceiver.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/BecomingNoisyListener$Companion$NO_OP$1.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/BecomingNoisyListener$Companion$NO_OP$1.class -new file mode 100644 -index 0000000..07a503b -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/BecomingNoisyListener$Companion$NO_OP$1.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/BecomingNoisyListener$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/BecomingNoisyListener$Companion.class -new file mode 100644 -index 0000000..efa3ee3 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/BecomingNoisyListener$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/BecomingNoisyListener.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/BecomingNoisyListener.class -new file mode 100644 -index 0000000..75d1cd4 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/BecomingNoisyListener.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/PictureInPictureReceiver$Companion.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/PictureInPictureReceiver$Companion.class -new file mode 100644 -index 0000000..535aad5 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/PictureInPictureReceiver$Companion.class differ -diff --git a/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/PictureInPictureReceiver.class b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/PictureInPictureReceiver.class -new file mode 100644 -index 0000000..0143f64 -Binary files /dev/null and b/node_modules/react-native-video/android/buildOutput_a15d4dee7fc4eda61b91308cbb6a2e72/tmp/kotlin-classes/debug/com/brentvatne/receiver/PictureInPictureReceiver.class differ diff --git a/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java -index 539ecfd..44d8be2 100644 +index 539ecfd..a939148 100644 --- a/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +@@ -161,7 +161,7 @@ public class ReactExoplayerView extends FrameLayout implements + AdEvent.AdEventListener, + AdErrorEvent.AdErrorListener { + +- public static final double DEFAULT_MAX_HEAP_ALLOCATION_PERCENT = 1; ++ public static final double DEFAULT_MAX_HEAP_ALLOCATION_PERCENT = 0.5; + public static final double DEFAULT_MIN_BUFFER_MEMORY_RESERVE = 0; + + private static final String TAG = "ReactExoplayerView"; @@ -222,7 +222,8 @@ public class ReactExoplayerView extends FrameLayout implements private ArrayList rootViewChildrenOriginalVisibility = new ArrayList(); @@ -1472,7 +21,24 @@ index 539ecfd..44d8be2 100644 * Then we set if to false when playback is back in onIsPlayingChanged -> true */ private boolean isSeeking = false; -@@ -292,7 +293,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -243,7 +244,7 @@ public class ReactExoplayerView extends FrameLayout implements + private BufferingStrategy.BufferingStrategyEnum bufferingStrategy; + private boolean disableDisconnectError; + private boolean preventsDisplaySleepDuringVideoPlayback = true; +- private float mProgressUpdateInterval = 250.0f; ++ private float mProgressUpdateInterval = 1000.0f; + protected boolean playInBackground = false; + private boolean mReportBandwidth = false; + private boolean controls = false; +@@ -269,6 +270,7 @@ public class ReactExoplayerView extends FrameLayout implements + private final String instanceId = String.valueOf(UUID.randomUUID()); + + private CmcdConfiguration.Factory cmcdConfigurationFactory; ++ private static final ExecutorService SHARED_EXECUTOR = Executors.newSingleThreadExecutor(); + + public void setCmcdConfigurationFactory(CmcdConfiguration.Factory factory) { + this.cmcdConfigurationFactory = factory; +@@ -292,7 +294,8 @@ public class ReactExoplayerView extends FrameLayout implements lastPos = pos; lastBufferDuration = bufferedDuration; lastDuration = duration; @@ -1482,7 +48,7 @@ index 539ecfd..44d8be2 100644 } } } -@@ -310,7 +312,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -310,7 +313,7 @@ public class ReactExoplayerView extends FrameLayout implements public double getPositionInFirstPeriodMsForCurrentWindow(long currentPosition) { Timeline.Window window = new Timeline.Window(); @@ -1491,7 +57,7 @@ index 539ecfd..44d8be2 100644 player.getCurrentTimeline().getWindow(player.getCurrentMediaItemIndex(), window); } return window.windowStartTimeMs + currentPosition; -@@ -349,9 +351,9 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -349,9 +352,9 @@ public class ReactExoplayerView extends FrameLayout implements LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); exoPlayerView = new ExoPlayerView(getContext()); @@ -1504,7 +70,7 @@ index 539ecfd..44d8be2 100644 exoPlayerView.setLayoutParams(layoutParams); addView(exoPlayerView, 0, layoutParams); -@@ -377,8 +379,10 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -377,8 +380,10 @@ public class ReactExoplayerView extends FrameLayout implements public void onHostPause() { isInBackground = true; Activity activity = themedReactContext.getCurrentActivity(); @@ -1517,7 +83,7 @@ index 539ecfd..44d8be2 100644 if (playInBackground || isInPictureInPicture || isInMultiWindowMode) { return; } -@@ -397,7 +401,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -397,7 +402,7 @@ public class ReactExoplayerView extends FrameLayout implements viewHasDropped = true; } @@ -1526,7 +92,7 @@ index 539ecfd..44d8be2 100644 @Override public void onBandwidthSample(int elapsedMs, long bytes, long bitrate) { if (mReportBandwidth) { -@@ -405,7 +409,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -405,7 +410,8 @@ public class ReactExoplayerView extends FrameLayout implements eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, 0, 0, null); } else { Format videoFormat = player.getVideoFormat(); @@ -1536,7 +102,7 @@ index 539ecfd..44d8be2 100644 int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0; int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0; String trackId = videoFormat != null ? videoFormat.id : null; -@@ -420,7 +425,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -420,7 +426,8 @@ public class ReactExoplayerView extends FrameLayout implements * Toggling the visibility of the player control view */ private void togglePlayerControlVisibility() { @@ -1546,7 +112,7 @@ index 539ecfd..44d8be2 100644 if (exoPlayerView.isControllerVisible()) { exoPlayerView.hideController(); } else { -@@ -444,7 +450,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -444,7 +451,8 @@ public class ReactExoplayerView extends FrameLayout implements } private void updateControllerConfig() { @@ -1556,7 +122,7 @@ index 539ecfd..44d8be2 100644 exoPlayerView.setControllerShowTimeoutMs(5000); -@@ -455,7 +462,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -455,7 +463,8 @@ public class ReactExoplayerView extends FrameLayout implements } private void updateControllerVisibility() { @@ -1566,7 +132,7 @@ index 539ecfd..44d8be2 100644 exoPlayerView.setUseController(controls && !controlsConfig.getHideFullscreen()); } -@@ -463,7 +471,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -463,7 +472,7 @@ public class ReactExoplayerView extends FrameLayout implements private void openSettings() { AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext); builder.setTitle(R.string.settings); @@ -1575,7 +141,7 @@ index 539ecfd..44d8be2 100644 builder.setItems(settingsOptions, (dialog, which) -> { if (which == 0) { showPlaybackSpeedOptions(); -@@ -473,7 +481,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -473,7 +482,7 @@ public class ReactExoplayerView extends FrameLayout implements } private void showPlaybackSpeedOptions() { @@ -1584,7 +150,7 @@ index 539ecfd..44d8be2 100644 AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext); builder.setTitle(R.string.select_playback_speed); -@@ -491,8 +499,10 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -491,8 +500,10 @@ public class ReactExoplayerView extends FrameLayout implements speed = 2.0f; break; default: @@ -1597,7 +163,7 @@ index 539ecfd..44d8be2 100644 setRateModifier(speed); }); builder.show(); -@@ -504,24 +514,30 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -504,24 +515,30 @@ public class ReactExoplayerView extends FrameLayout implements /** * Update the layout @@ -1634,7 +200,7 @@ index 539ecfd..44d8be2 100644 // reimplemented using PlayerView's APIs if custom behavior is required. private void reLayoutControls() { -@@ -558,6 +574,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -558,6 +575,7 @@ public class ReactExoplayerView extends FrameLayout implements private class RNVLoadControl extends DefaultLoadControl { private final int availableHeapInBytes; private final Runtime runtime; @@ -1642,7 +208,7 @@ index 539ecfd..44d8be2 100644 public RNVLoadControl(DefaultAllocator allocator, BufferConfig config) { super(allocator, config.getMinBufferMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt() -@@ -568,7 +585,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -568,7 +586,7 @@ public class ReactExoplayerView extends FrameLayout implements : DefaultLoadControl.DEFAULT_MAX_BUFFER_MS, config.getBufferForPlaybackMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt() ? config.getBufferForPlaybackMs() @@ -1651,7 +217,7 @@ index 539ecfd..44d8be2 100644 config.getBufferForPlaybackAfterRebufferMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt() ? config.getBufferForPlaybackAfterRebufferMs() : DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS, -@@ -579,10 +596,12 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -579,10 +597,12 @@ public class ReactExoplayerView extends FrameLayout implements : DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS, DefaultLoadControl.DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME); runtime = Runtime.getRuntime(); @@ -1668,7 +234,7 @@ index 539ecfd..44d8be2 100644 availableHeapInBytes = (int) Math.floor(activityManager.getMemoryClass() * maxHeap * 1024 * 1024); } -@@ -600,13 +619,15 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -600,13 +620,15 @@ public class ReactExoplayerView extends FrameLayout implements } long usedMemory = runtime.totalMemory() - runtime.freeMemory(); long freeMemory = runtime.maxMemory() - usedMemory; @@ -1688,7 +254,16 @@ index 539ecfd..44d8be2 100644 return false; } if (runtime.freeMemory() == 0) { -@@ -640,13 +661,13 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -621,6 +643,8 @@ public class ReactExoplayerView extends FrameLayout implements + } + + private void initializePlayer() { ++ drmRetryCount = 0; ++ hasDrmFailed = false; + disableCache = ReactNativeVideoManager.Companion.getInstance().shouldDisableCache(source); + + ReactExoplayerView self = this; +@@ -640,12 +664,16 @@ public class ReactExoplayerView extends FrameLayout implements // Initialize core configuration and listeners initializePlayerCore(self); pipListenerUnsubscribe = PictureInPictureUtil.addLifecycleEventListener(themedReactContext, this); @@ -1696,26 +271,31 @@ index 539ecfd..44d8be2 100644 + PictureInPictureUtil.applyAutoEnterEnabled(themedReactContext, pictureInPictureParamsBuilder, + this.enterPictureInPictureOnLeave); } - if (!source.isLocalAssetFile() && !source.isAsset() && source.getBufferConfig().getCacheSize() > 0) { +- if (!source.isLocalAssetFile() && !source.isAsset() && source.getBufferConfig().getCacheSize() > 0) { ++ long requestedCacheSize = source.getBufferConfig().getCacheSize(); ++ long MAX_SAFE_CACHE_SIZE = 100L * 1024 * 1024; ++ long effectiveCacheSize = Math.min(requestedCacheSize, MAX_SAFE_CACHE_SIZE); ++ if (!source.isLocalAssetFile() && !source.isAsset() && effectiveCacheSize > 0) { RNVSimpleCache.INSTANCE.setSimpleCache( this.getContext(), - source.getBufferConfig().getCacheSize() -- ); -+ source.getBufferConfig().getCacheSize()); ++ effectiveCacheSize + ); useCache = true; } else { - useCache = false; -@@ -654,7 +675,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -654,16 +682,17 @@ public class ReactExoplayerView extends FrameLayout implements if (playerNeedsSource) { // Will force display of shutter view if needed exoPlayerView.invalidateAspectRatio(); - // DRM session manager creation must be done on a different thread to prevent crashes so we start a new thread +- ExecutorService es = Executors.newSingleThreadExecutor(); +- es.execute(() -> { + // DRM session manager creation must be done on a different thread to prevent + // crashes so we start a new thread - ExecutorService es = Executors.newSingleThreadExecutor(); - es.execute(() -> { ++ SHARED_EXECUTOR.execute(() -> { // DRM initialization must run on a different thread -@@ -663,7 +685,8 @@ public class ReactExoplayerView extends FrameLayout implements + if (viewHasDropped && runningSource == source) { + return; } if (activity == null) { DebugLog.e(TAG, "Failed to initialize Player!, null activity"); @@ -1725,7 +305,7 @@ index 539ecfd..44d8be2 100644 return; } -@@ -716,8 +739,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -716,8 +745,7 @@ public class ReactExoplayerView extends FrameLayout implements DefaultAllocator allocator = new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE); RNVLoadControl loadControl = new RNVLoadControl( allocator, @@ -1735,7 +315,7 @@ index 539ecfd..44d8be2 100644 long initialBitrate = source.getBufferConfig().getInitialBitrate(); if (initialBitrate > 0) { -@@ -725,15 +747,15 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -725,15 +753,15 @@ public class ReactExoplayerView extends FrameLayout implements this.bandwidthMeter = config.getBandwidthMeter(); } @@ -1757,7 +337,7 @@ index 539ecfd..44d8be2 100644 } mediaSourceFactory.setLocalAdInsertionComponents(unusedAdTagUri -> adsLoader, exoPlayerView.getPlayerView()); -@@ -760,7 +782,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -760,7 +788,7 @@ public class ReactExoplayerView extends FrameLayout implements player.setPlaybackParameters(params); changeAudioOutput(this.audioOutput); @@ -1766,7 +346,7 @@ index 539ecfd..44d8be2 100644 setupPlaybackService(); } } -@@ -772,8 +794,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -772,8 +800,7 @@ public class ReactExoplayerView extends FrameLayout implements Uri adTagUrl = adProps.getAdTagUrl(); if (adTagUrl != null) { // Create an AdsLoader. @@ -1776,7 +356,7 @@ index 539ecfd..44d8be2 100644 .setAdEventListener(this) .setAdErrorListener(this); -@@ -805,7 +826,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -805,7 +832,8 @@ public class ReactExoplayerView extends FrameLayout implements } try { @@ -1786,7 +366,7 @@ index 539ecfd..44d8be2 100644 DRMManagerSpec drmManager = ReactNativeVideoManager.Companion.getInstance().getDRMManager(); if (drmManager == null) { // If no custom manager is registered, use the default implementation -@@ -814,11 +836,13 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -814,11 +842,13 @@ public class ReactExoplayerView extends FrameLayout implements DrmSessionManager drmSessionManager = drmManager.buildDrmSessionManager(uuid, drmProps); if (drmSessionManager == null) { @@ -1802,7 +382,7 @@ index 539ecfd..44d8be2 100644 return overriddenManager != null ? overriddenManager : drmSessionManager; } catch (UnsupportedDrmException ex) { // Unsupported DRM exceptions are handled by the calling method -@@ -836,7 +860,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -836,7 +866,8 @@ public class ReactExoplayerView extends FrameLayout implements } /// init DRM DrmSessionManager drmSessionManager = initializePlayerDrm(); @@ -1812,7 +392,25 @@ index 539ecfd..44d8be2 100644 // Failed to initialize DRM session manager - cannot continue DebugLog.e(TAG, "Failed to initialize DRM Session Manager Framework!"); return; -@@ -893,7 +918,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -851,13 +882,10 @@ public class ReactExoplayerView extends FrameLayout implements + MediaSource mediaSource = Objects.requireNonNullElse(mediaSourceWithAds, videoSource); + + // wait for player to be set +- while (player == null) { +- try { +- wait(); +- } catch (InterruptedException ex) { +- Thread.currentThread().interrupt(); +- DebugLog.e(TAG, ex.toString()); +- } ++ if (player == null) { ++ DebugLog.w(TAG, "Player not ready yet, aborting source initialization"); ++ playerNeedsSource = true; ++ return; + } + + boolean haveResumePosition = resumeWindow != C.INDEX_UNSET; +@@ -893,7 +921,8 @@ public class ReactExoplayerView extends FrameLayout implements } catch (UnsupportedDrmException e) { int errorStringId = Util.SDK_INT < 18 ? R.string.error_drm_not_supported : (e.reason == UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME @@ -1822,7 +420,7 @@ index 539ecfd..44d8be2 100644 eventEmitter.onVideoError.invoke(getResources().getString(errorStringId), e, "3003"); } } -@@ -938,7 +964,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -938,7 +967,8 @@ public class ReactExoplayerView extends FrameLayout implements if (playbackServiceBinder != null) { playbackServiceBinder.getService().unregisterPlayer(player); } @@ -1832,7 +430,7 @@ index 539ecfd..44d8be2 100644 playbackServiceBinder = null; } -@@ -970,21 +997,22 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -970,21 +1000,22 @@ public class ReactExoplayerView extends FrameLayout implements private void cleanupPlaybackService() { try { @@ -1859,7 +457,7 @@ index 539ecfd..44d8be2 100644 if (uri == null) { throw new IllegalStateException("Invalid video uri"); } -@@ -1016,12 +1044,12 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1016,12 +1047,12 @@ public class ReactExoplayerView extends FrameLayout implements Uri adTagUrl = source.getAdsProps().getAdTagUrl(); if (adTagUrl != null) { mediaItemBuilder.setAdsConfiguration( @@ -1875,7 +473,7 @@ index 539ecfd..44d8be2 100644 mediaItemBuilder.setLiveConfiguration(liveConfiguration.build()); MediaSource.Factory mediaSourceFactory; -@@ -1033,29 +1061,26 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1033,29 +1064,26 @@ public class ReactExoplayerView extends FrameLayout implements drmProvider = new DefaultDrmSessionManagerProvider(); } @@ -1909,7 +507,7 @@ index 539ecfd..44d8be2 100644 break; case CONTENT_TYPE_HLS: if (!BuildConfig.USE_EXOPLAYER_HLS) { -@@ -1070,13 +1095,14 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1070,13 +1098,14 @@ public class ReactExoplayerView extends FrameLayout implements } mediaSourceFactory = new HlsMediaSource.Factory( @@ -1927,7 +525,7 @@ index 539ecfd..44d8be2 100644 mediaSourceFactory = new ProgressiveMediaSource.Factory(assetDataSourceFactory); } catch (Exception e) { throw new IllegalStateException("cannot open input file:" + uri); -@@ -1084,12 +1110,10 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1084,12 +1113,10 @@ public class ReactExoplayerView extends FrameLayout implements } else if ("file".equals(uri.getScheme()) || !useCache) { mediaSourceFactory = new ProgressiveMediaSource.Factory( @@ -1942,7 +540,7 @@ index 539ecfd..44d8be2 100644 } break; -@@ -1108,20 +1132,19 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1108,20 +1135,19 @@ public class ReactExoplayerView extends FrameLayout implements if (cmcdConfigurationFactory != null) { mediaSourceFactory = mediaSourceFactory.setCmcdConfigurationFactory( @@ -1967,7 +565,7 @@ index 539ecfd..44d8be2 100644 MediaItem mediaItem = overridenMediaItemBuilder != null ? overridenMediaItemBuilder.build() -@@ -1130,8 +1153,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1130,8 +1156,7 @@ public class ReactExoplayerView extends FrameLayout implements MediaSource mediaSource = mediaSourceFactory .setDrmSessionManagerProvider(drmProvider) .setLoadErrorHandlingPolicy( @@ -1977,7 +575,7 @@ index 539ecfd..44d8be2 100644 .createMediaSource(mediaItem); if (cropStartMs >= 0 && cropEndMs >= 0) { -@@ -1166,7 +1188,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1166,7 +1191,8 @@ public class ReactExoplayerView extends FrameLayout implements } } @@ -1987,7 +585,7 @@ index 539ecfd..44d8be2 100644 .setId(trackId) .setMimeType(track.getType()) .setLabel(label) -@@ -1177,7 +1200,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1177,7 +1203,8 @@ public class ReactExoplayerView extends FrameLayout implements configBuilder.setLanguage(track.getLanguage()); } @@ -1997,7 +595,7 @@ index 539ecfd..44d8be2 100644 if (trackIndex == 0 && (textTrackType == null || "disabled".equals(textTrackType))) { configBuilder.setSelectionFlags(C.SELECTION_FLAG_DEFAULT); } else { -@@ -1187,10 +1211,12 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1187,10 +1214,12 @@ public class ReactExoplayerView extends FrameLayout implements MediaItem.SubtitleConfiguration subtitleConfiguration = configBuilder.build(); subtitleConfigurations.add(subtitleConfiguration); @@ -2012,7 +610,7 @@ index 539ecfd..44d8be2 100644 } } -@@ -1203,7 +1229,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1203,7 +1232,7 @@ public class ReactExoplayerView extends FrameLayout implements private void releasePlayer() { if (player != null) { @@ -2021,7 +619,7 @@ index 539ecfd..44d8be2 100644 playbackServiceBinder.getService().unregisterPlayer(player); themedReactContext.unbindService(playbackServiceConnection); } -@@ -1253,7 +1279,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1253,7 +1282,8 @@ public class ReactExoplayerView extends FrameLayout implements case AudioManager.AUDIOFOCUS_LOSS: view.hasAudioFocus = false; view.eventEmitter.onAudioFocusChanged.invoke(false); @@ -2031,7 +629,7 @@ index 539ecfd..44d8be2 100644 if (activity != null) { activity.runOnUiThread(view::pausePlayback); } -@@ -1274,16 +1301,12 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1274,16 +1304,12 @@ public class ReactExoplayerView extends FrameLayout implements if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { // Lower the volume if (!view.muted) { @@ -2050,7 +648,7 @@ index 539ecfd..44d8be2 100644 } } } -@@ -1356,7 +1379,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1356,7 +1382,8 @@ public class ReactExoplayerView extends FrameLayout implements /** * Returns a new DataSource factory. * @@ -2060,7 +658,7 @@ index 539ecfd..44d8be2 100644 * DataSource factory. * @return A new DataSource factory. */ -@@ -1368,12 +1392,14 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1368,12 +1395,14 @@ public class ReactExoplayerView extends FrameLayout implements /** * Returns a new HttpDataSource factory. * @@ -2078,7 +676,7 @@ index 539ecfd..44d8be2 100644 } // AudioBecomingNoisyListener implementation -@@ -1390,11 +1416,13 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1390,11 +1419,13 @@ public class ReactExoplayerView extends FrameLayout implements @Override public void onEvents(@NonNull Player player, Player.Events events) { @@ -2094,7 +692,7 @@ index 539ecfd..44d8be2 100644 switch (playbackState) { case Player.STATE_IDLE: text += "idle"; -@@ -1451,9 +1479,11 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1451,9 +1482,11 @@ public class ReactExoplayerView extends FrameLayout implements } /** @@ -2109,7 +707,7 @@ index 539ecfd..44d8be2 100644 */ private void clearProgressMessageHandler() { progressHandler.removeMessages(SHOW_PROGRESS); -@@ -1472,7 +1502,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1472,7 +1505,8 @@ public class ReactExoplayerView extends FrameLayout implements setSelectedTextTrack(textTrackType, textTrackValue); } Format videoFormat = player.getVideoFormat(); @@ -2119,7 +717,7 @@ index 539ecfd..44d8be2 100644 int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0; int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0; String trackId = videoFormat != null ? videoFormat.id : null; -@@ -1481,18 +1512,19 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1481,18 +1515,18 @@ public class ReactExoplayerView extends FrameLayout implements long duration = player.getDuration(); long currentPosition = player.getCurrentPosition(); ArrayList audioTracks = getAudioTrackInfo(); @@ -2127,9 +725,10 @@ index 539ecfd..44d8be2 100644 + ArrayList textTracks = getTextTrackInfo(); if (source.getContentStartTime() != -1) { - ExecutorService es = Executors.newSingleThreadExecutor(); - es.execute(() -> { +- ExecutorService es = Executors.newSingleThreadExecutor(); +- es.execute(() -> { - // To prevent ANRs caused by getVideoTrackInfo we run this on a different thread and notify the player only when we're done ++ SHARED_EXECUTOR.execute(() -> { + // To prevent ANRs caused by getVideoTrackInfo we run this on a different thread + // and notify the player only when we're done ArrayList videoTracks = getVideoTrackInfoFromManifest(); @@ -2142,7 +741,7 @@ index 539ecfd..44d8be2 100644 updateSubtitleButtonVisibility(); }); -@@ -1510,9 +1542,9 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1510,9 +1544,9 @@ public class ReactExoplayerView extends FrameLayout implements } private static boolean isTrackSelected(TrackSelection selection, TrackGroup group, @@ -2154,7 +753,7 @@ index 539ecfd..44d8be2 100644 } private ArrayList getAudioTrackInfo() { -@@ -1530,7 +1562,6 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1530,7 +1564,6 @@ public class ReactExoplayerView extends FrameLayout implements TrackSelectionArray selectionArray = player.getCurrentTrackSelections(); TrackSelection selection = selectionArray.get(C.TRACK_TYPE_AUDIO); @@ -2162,7 +761,7 @@ index 539ecfd..44d8be2 100644 for (int groupIndex = 0; groupIndex < groups.length; ++groupIndex) { TrackGroup group = groups.get(groupIndex); Format format = group.getFormat(0); -@@ -1556,7 +1587,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1556,7 +1589,8 @@ public class ReactExoplayerView extends FrameLayout implements videoTrack.setHeight(format.height == Format.NO_VALUE ? 0 : format.height); videoTrack.setBitrate(format.bitrate == Format.NO_VALUE ? 0 : format.bitrate); videoTrack.setRotation(format.rotationDegrees); @@ -2172,7 +771,7 @@ index 539ecfd..44d8be2 100644 videoTrack.setTrackId(format.id == null ? String.valueOf(trackIndex) : format.id); videoTrack.setIndex(trackIndex); return videoTrack; -@@ -1593,7 +1625,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1593,33 +1627,35 @@ public class ReactExoplayerView extends FrameLayout implements return this.getVideoTrackInfoFromManifest(0); } @@ -2181,8 +780,16 @@ index 539ecfd..44d8be2 100644 + // conditions @WorkerThread private ArrayList getVideoTrackInfoFromManifest(int retryCount) { - ExecutorService es = Executors.newSingleThreadExecutor(); -@@ -1608,18 +1641,20 @@ public class ReactExoplayerView extends FrameLayout implements +- ExecutorService es = Executors.newSingleThreadExecutor(); + final DataSource dataSource = this.mediaDataSourceFactory.createDataSource(); + final Uri sourceUri = source.getUri(); + final long startTime = source.getContentStartTime() * 1000 - 100; // s -> ms with 100ms offset + +- Future> result = es.submit(new Callable() { ++ Future> result = SHARED_EXECUTOR.submit(new Callable>() { + final DataSource ds = dataSource; + final Uri uri = sourceUri; + final long startTimeUs = startTime * 1000; // ms -> us public ArrayList call() { ArrayList videoTracks = new ArrayList<>(); @@ -2206,7 +813,7 @@ index 539ecfd..44d8be2 100644 Representation representation = adaptation.representations.get(representationIndex); Format format = representation.format; if (isFormatSupported(format)) { -@@ -1627,7 +1662,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1627,7 +1663,8 @@ public class ReactExoplayerView extends FrameLayout implements break; } hasFoundContentPeriod = true; @@ -2216,6 +823,14 @@ index 539ecfd..44d8be2 100644 videoTracks.add(videoTrack); } } +@@ -1648,7 +1685,6 @@ public class ReactExoplayerView extends FrameLayout implements + if (results == null && retryCount < 1) { + return this.getVideoTrackInfoFromManifest(++retryCount); + } +- es.shutdown(); + return results; + } catch (Exception e) { + DebugLog.w(TAG, "error in getVideoTrackInfoFromManifest handling request:" + e.getMessage()); @@ -1657,12 +1693,16 @@ public class ReactExoplayerView extends FrameLayout implements return null; } @@ -2349,7 +964,7 @@ index 539ecfd..44d8be2 100644 eventEmitter.onVideoPlaybackStateChanged.invoke(isPlaying, isSeeking); if (isPlaying) { -@@ -1931,14 +1984,15 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -1931,21 +1984,24 @@ public class ReactExoplayerView extends FrameLayout implements public void onPlayerError(@NonNull PlaybackException e) { String errorString = "ExoPlaybackException: " + PlaybackException.getErrorCodeName(e.errorCode); String errorCode = "2" + e.errorCode; @@ -2362,12 +977,28 @@ index 539ecfd..44d8be2 100644 case PlaybackException.ERROR_CODE_DRM_UNSPECIFIED: if (!hasDrmFailed) { - // When DRM fails to reach the app level certificate server it will fail with a source error so we assume that it is DRM related and try one more time +- hasDrmFailed = true; +- playerNeedsSource = true; +- updateResumePosition(); +- initializePlayer(); +- setPlayWhenReady(true); +- return; +- } + // When DRM fails to reach the app level certificate server it will fail with a + // source error so we assume that it is DRM related and try one more time - hasDrmFailed = true; - playerNeedsSource = true; - updateResumePosition(); -@@ -2020,14 +2074,16 @@ public class ReactExoplayerView extends FrameLayout implements ++ if (drmRetryCount < 1) { ++ drmRetryCount++; ++ hasDrmFailed = true; ++ playerNeedsSource = true; ++ updateResumePosition(); ++ initializePlayer(); ++ setPlayWhenReady(true); ++ return; ++ } + break; + default: + break; +@@ -2020,14 +2076,16 @@ public class ReactExoplayerView extends FrameLayout implements boolean isSourceEqual = source.isEquals(this.source); hasDrmFailed = false; this.source = source; @@ -2389,7 +1020,7 @@ index 539ecfd..44d8be2 100644 if (source.getCmcdProps() != null) { CMCDConfig cmcdConfig = new CMCDConfig(source.getCmcdProps()); -@@ -2046,6 +2102,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2046,6 +2104,7 @@ public class ReactExoplayerView extends FrameLayout implements clearSrc(); } } @@ -2397,7 +1028,7 @@ index 539ecfd..44d8be2 100644 public void clearSrc() { if (source.getUri() != null) { if (player != null) { -@@ -2094,7 +2151,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2094,7 +2153,8 @@ public class ReactExoplayerView extends FrameLayout implements } public void disableTrack(int rendererIndex) { @@ -2407,7 +1038,7 @@ index 539ecfd..44d8be2 100644 DefaultTrackSelector.Parameters disableParameters = trackSelector.getParameters() .buildUpon() -@@ -2104,7 +2162,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2104,7 +2164,8 @@ public class ReactExoplayerView extends FrameLayout implements } private void selectTextTrackInternal(String type, String value) { @@ -2417,7 +1048,7 @@ index 539ecfd..44d8be2 100644 DebugLog.d(TAG, "selectTextTrackInternal: type=" + type + ", value=" + value); -@@ -2123,6 +2182,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2123,6 +2184,7 @@ public class ReactExoplayerView extends FrameLayout implements if (textRendererIndex != C.INDEX_UNSET) { TrackGroupArray groups = info.getTrackGroups(textRendererIndex); boolean trackFound = false; @@ -2425,7 +1056,7 @@ index 539ecfd..44d8be2 100644 for (int groupIndex = 0; groupIndex < groups.length; groupIndex++) { TrackGroup group = groups.get(groupIndex); -@@ -2136,25 +2196,28 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2136,25 +2198,28 @@ public class ReactExoplayerView extends FrameLayout implements isMatch = true; } else if ("index".equals(type)) { int targetIndex = ReactBridgeUtils.safeParseInt(value, -1); @@ -2458,7 +1089,7 @@ index 539ecfd..44d8be2 100644 } } } -@@ -2175,7 +2238,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2175,7 +2240,8 @@ public class ReactExoplayerView extends FrameLayout implements } public void setSelectedTrack(int trackType, String type, String value) { @@ -2468,7 +1099,7 @@ index 539ecfd..44d8be2 100644 if (controls) { return; -@@ -2249,9 +2313,11 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2249,9 +2315,11 @@ public class ReactExoplayerView extends FrameLayout implements usingExactMatch = true; break; } else if (isUsingContentResolution) { @@ -2482,7 +1113,7 @@ index 539ecfd..44d8be2 100644 // Higher quality match closestFormat = format; closestTrackIndex = j; -@@ -2262,7 +2328,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2262,7 +2330,8 @@ public class ReactExoplayerView extends FrameLayout implements } } } @@ -2492,7 +1123,7 @@ index 539ecfd..44d8be2 100644 if (closestFormat == null && isUsingContentResolution && !usingExactMatch) { // No close match found - so we pick the lowest quality int minHeight = Integer.MAX_VALUE; -@@ -2285,8 +2352,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2285,8 +2354,8 @@ public class ReactExoplayerView extends FrameLayout implements } } else if (trackType == C.TRACK_TYPE_TEXT && Util.SDK_INT > 18) { // Text default // Use system settings if possible @@ -2503,7 +1134,7 @@ index 539ecfd..44d8be2 100644 if (captioningManager != null && captioningManager.isEnabled()) { groupIndex = getGroupIndexForDefaultLocale(groups); } -@@ -2315,7 +2382,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2315,7 +2384,7 @@ public class ReactExoplayerView extends FrameLayout implements // With only one tracks we can't remove any tracks so attempt to play it anyway tracks = allTracks; } else { @@ -2512,7 +1143,7 @@ index 539ecfd..44d8be2 100644 for (int k = 0; k < allTracks.size(); k++) { Format format = group.getFormat(k); if (isFormatSupported(format)) { -@@ -2341,7 +2408,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2341,7 +2410,8 @@ public class ReactExoplayerView extends FrameLayout implements .setRendererDisabled(rendererIndex, false); // Clear existing overrides for this track type to avoid conflicts @@ -2522,7 +1153,7 @@ index 539ecfd..44d8be2 100644 if (trackType != C.TRACK_TYPE_AUDIO || !type.equals("default")) { selectionParameters.clearOverridesOfType(selectionOverride.getType()); } -@@ -2357,7 +2425,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2357,7 +2427,7 @@ public class ReactExoplayerView extends FrameLayout implements selectionParameters.setForceHighestSupportedBitrate(false); selectionParameters.setForceLowestBitrate(false); DebugLog.d(TAG, "Audio track selection: group=" + groupIndex + ", tracks=" + tracks + @@ -2531,7 +1162,7 @@ index 539ecfd..44d8be2 100644 } trackSelector.setParameters(selectionParameters.build()); -@@ -2388,7 +2456,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2388,7 +2458,7 @@ public class ReactExoplayerView extends FrameLayout implements } private int getGroupIndexForDefaultLocale(TrackGroupArray groups) { @@ -2540,7 +1171,7 @@ index 539ecfd..44d8be2 100644 return C.INDEX_UNSET; } -@@ -2409,7 +2477,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2409,7 +2479,8 @@ public class ReactExoplayerView extends FrameLayout implements public void setSelectedVideoTrack(String type, String value) { videoTrackType = type; videoTrackValue = value; @@ -2550,7 +1181,7 @@ index 539ecfd..44d8be2 100644 } public void setSelectedAudioTrack(String type, String value) { -@@ -2440,9 +2509,11 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2440,9 +2511,11 @@ public class ReactExoplayerView extends FrameLayout implements } public void setEnterPictureInPictureOnLeave(boolean enterPictureInPictureOnLeave) { @@ -2564,7 +1195,7 @@ index 539ecfd..44d8be2 100644 } } -@@ -2450,12 +2521,14 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2450,12 +2523,14 @@ public class ReactExoplayerView extends FrameLayout implements eventEmitter.onPictureInPictureStatusChanged.invoke(isInPictureInPicture); if (fullScreenPlayerView != null && fullScreenPlayerView.isShowing()) { @@ -2581,7 +1212,7 @@ index 539ecfd..44d8be2 100644 View decorView = currentActivity.getWindow().getDecorView(); ViewGroup rootView = decorView.findViewById(android.R.id.content); -@@ -2465,7 +2538,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2465,7 +2540,7 @@ public class ReactExoplayerView extends FrameLayout implements LayoutParams.MATCH_PARENT); if (isInPictureInPicture) { @@ -2590,7 +1221,7 @@ index 539ecfd..44d8be2 100644 if (parent != null) { parent.removeView(exoPlayerView); } -@@ -2491,10 +2564,12 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2491,10 +2566,12 @@ public class ReactExoplayerView extends FrameLayout implements public void enterPictureInPictureMode() { PictureInPictureParams _pipParams = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -2605,7 +1236,7 @@ index 539ecfd..44d8be2 100644 } _pipParams = pictureInPictureParamsBuilder.build(); } -@@ -2503,13 +2578,15 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2503,13 +2580,15 @@ public class ReactExoplayerView extends FrameLayout implements public void exitPictureInPictureMode() { Activity currentActivity = themedReactContext.getCurrentActivity(); @@ -2623,7 +1254,7 @@ index 539ecfd..44d8be2 100644 for (int i = 0; i < rootView.getChildCount(); i++) { rootView.getChildAt(i).setVisibility(rootViewChildrenOriginalVisibility.get(i)); } -@@ -2607,7 +2684,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2607,7 +2686,7 @@ public class ReactExoplayerView extends FrameLayout implements if (playbackServiceConnection == null && showNotificationControls) { setupPlaybackService(); @@ -2632,7 +1263,7 @@ index 539ecfd..44d8be2 100644 cleanupPlaybackService(); } } -@@ -2636,12 +2713,13 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2636,12 +2715,13 @@ public class ReactExoplayerView extends FrameLayout implements } if (isFullscreen) { @@ -2652,7 +1283,7 @@ index 539ecfd..44d8be2 100644 eventEmitter.onVideoFullscreenPlayerWillPresent.invoke(); if (fullScreenPlayerView != null) { fullScreenPlayerView.show(); -@@ -2678,7 +2756,8 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2678,7 +2758,8 @@ public class ReactExoplayerView extends FrameLayout implements } @Override @@ -2662,7 +1293,7 @@ index 539ecfd..44d8be2 100644 DebugLog.d("DRM Info", "onDrmSessionManagerError"); eventEmitter.onVideoError.invoke("onDrmSessionManagerError", e, "3002"); } -@@ -2696,7 +2775,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2696,7 +2777,7 @@ public class ReactExoplayerView extends FrameLayout implements /** * Handling controls prop * @@ -2671,7 +1302,7 @@ index 539ecfd..44d8be2 100644 */ public void setControls(boolean controls) { this.controls = controls; -@@ -2705,7 +2784,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2705,7 +2786,7 @@ public class ReactExoplayerView extends FrameLayout implements // Additional configuration for proper touch handling if (controls) { exoPlayerView.setControllerAutoShow(true); @@ -2680,7 +1311,7 @@ index 539ecfd..44d8be2 100644 exoPlayerView.setControllerShowTimeoutMs(5000); } } -@@ -2738,8 +2817,7 @@ public class ReactExoplayerView extends FrameLayout implements +@@ -2738,8 +2819,7 @@ public class ReactExoplayerView extends FrameLayout implements Map errMap = Map.of( "message", error.getMessage(), "code", String.valueOf(error.getErrorCode()), From 1627928fb2f05b50744c11c8d326e5700ebf085e Mon Sep 17 00:00:00 2001 From: tapframe Date: Tue, 6 Jan 2026 09:17:56 +0530 Subject: [PATCH 02/22] added back up next --- .../home/ContinueWatchingSection.tsx | 173 +++++++++++++++++- 1 file changed, 169 insertions(+), 4 deletions(-) diff --git a/src/components/home/ContinueWatchingSection.tsx b/src/components/home/ContinueWatchingSection.tsx index 237caf2..c3e06c0 100644 --- a/src/components/home/ContinueWatchingSection.tsx +++ b/src/components/home/ContinueWatchingSection.tsx @@ -511,8 +511,54 @@ const ContinueWatchingSection = React.forwardRef((props, re const { episodeId, progress, progressPercent } = episode; if (group.type === 'series' && progressPercent >= 85) { - // Skip completed episodes - don't add "next episode" here - // The Trakt playback endpoint handles in-progress items + // Episode is completed - find the next unwatched episode + let completedSeason: number | undefined; + let completedEpisode: number | undefined; + + if (episodeId) { + const match = episodeId.match(/s(\d+)e(\d+)/i); + if (match) { + completedSeason = parseInt(match[1], 10); + completedEpisode = parseInt(match[2], 10); + } else { + const parts = episodeId.split(':'); + if (parts.length >= 3) { + const seasonPart = parts[parts.length - 2]; + const episodePart = parts[parts.length - 1]; + const seasonNum = parseInt(seasonPart, 10); + const episodeNum = parseInt(episodePart, 10); + if (!isNaN(seasonNum) && !isNaN(episodeNum)) { + completedSeason = seasonNum; + completedEpisode = episodeNum; + } + } + } + } + + // If we have valid season/episode info, find the next episode + if (completedSeason !== undefined && completedEpisode !== undefined && metadata?.videos) { + const watchedEpisodesSet = await traktShowsSetPromise; + const nextEpisode = findNextEpisode( + completedSeason, + completedEpisode, + metadata.videos, + watchedEpisodesSet, + group.id + ); + + if (nextEpisode) { + logger.log(`📺 [ContinueWatching] Found next episode: S${nextEpisode.season}E${nextEpisode.episode} for ${basicContent.name}`); + batch.push({ + ...basicContent, + progress: 0, // Up next - no progress yet + lastUpdated: progress.lastUpdated, // Keep the timestamp from completed episode + season: nextEpisode.season, + episode: nextEpisode.episode, + episodeTitle: nextEpisode.title || `Episode ${nextEpisode.episode}`, + addonId: progress.addonId, + } as ContinueWatchingItem); + } + } continue; } @@ -627,13 +673,14 @@ const ContinueWatchingSection = React.forwardRef((props, re try { // Skip items with < 2% progress (accidental clicks) if (item.progress < 2) continue; - // Skip items with >= 85% progress (completed) - if (item.progress >= 85) continue; // Skip items older than 30 days const pausedAt = new Date(item.paused_at).getTime(); if (pausedAt < thirtyDaysAgo) continue; if (item.type === 'movie' && item.movie?.ids?.imdb) { + // Skip completed movies + if (item.progress >= 85) continue; + const imdbId = item.movie.ids.imdb.startsWith('tt') ? item.movie.ids.imdb : `tt${item.movie.ids.imdb}`; @@ -672,6 +719,37 @@ const ContinueWatchingSection = React.forwardRef((props, re const cachedData = await getCachedMetadata('series', showImdb); if (!cachedData?.basicContent) continue; + // If episode is completed (>= 85%), find next episode + if (item.progress >= 85) { + const metadata = cachedData.metadata; + if (metadata?.videos) { + const nextEpisode = findNextEpisode( + item.episode.season, + item.episode.number, + metadata.videos, + undefined, // No watched set needed, findNextEpisode handles it + showImdb + ); + + if (nextEpisode) { + logger.log(`📺 [TraktPlayback] Episode completed, adding next: S${nextEpisode.season}E${nextEpisode.episode} for ${item.show.title}`); + traktBatch.push({ + ...cachedData.basicContent, + id: showImdb, + type: 'series', + progress: 0, // Up next - no progress yet + lastUpdated: pausedAt, + season: nextEpisode.season, + episode: nextEpisode.episode, + episodeTitle: nextEpisode.title || `Episode ${nextEpisode.episode}`, + addonId: undefined, + traktPlaybackId: item.id, + } as ContinueWatchingItem); + } + } + continue; + } + traktBatch.push({ ...cachedData.basicContent, id: showImdb, @@ -692,6 +770,93 @@ const ContinueWatchingSection = React.forwardRef((props, re } } + // STEP 2: Get watched shows and find "Up Next" episodes + // This handles cases where episodes are fully completed and removed from playback progress + try { + const watchedShows = await traktService.getWatchedShows(); + const thirtyDaysAgoForShows = Date.now() - (30 * 24 * 60 * 60 * 1000); + + for (const watchedShow of watchedShows) { + try { + if (!watchedShow.show?.ids?.imdb) continue; + + // Skip shows that haven't been watched recently + const lastWatchedAt = new Date(watchedShow.last_watched_at).getTime(); + if (lastWatchedAt < thirtyDaysAgoForShows) continue; + + const showImdb = watchedShow.show.ids.imdb.startsWith('tt') + ? watchedShow.show.ids.imdb + : `tt${watchedShow.show.ids.imdb}`; + + // Check if recently removed + const showKey = `series:${showImdb}`; + if (recentlyRemovedRef.current.has(showKey)) continue; + + // Find the last watched episode + let lastWatchedSeason = 0; + let lastWatchedEpisode = 0; + let latestEpisodeTimestamp = 0; + + if (watchedShow.seasons) { + for (const season of watchedShow.seasons) { + for (const episode of season.episodes) { + const episodeTimestamp = new Date(episode.last_watched_at).getTime(); + if (episodeTimestamp > latestEpisodeTimestamp) { + latestEpisodeTimestamp = episodeTimestamp; + lastWatchedSeason = season.number; + lastWatchedEpisode = episode.number; + } + } + } + } + + if (lastWatchedSeason === 0 && lastWatchedEpisode === 0) continue; + + // Get metadata with episode list + const cachedData = await getCachedMetadata('series', showImdb); + if (!cachedData?.basicContent || !cachedData?.metadata?.videos) continue; + + // Build a set of watched episodes for this show + const watchedEpisodeSet = new Set(); + if (watchedShow.seasons) { + for (const season of watchedShow.seasons) { + for (const episode of season.episodes) { + watchedEpisodeSet.add(`${showImdb}:${season.number}:${episode.number}`); + } + } + } + + // Find the next unwatched episode + const nextEpisode = findNextEpisode( + lastWatchedSeason, + lastWatchedEpisode, + cachedData.metadata.videos, + watchedEpisodeSet, + showImdb + ); + + if (nextEpisode) { + logger.log(`📺 [TraktWatched] Found Up Next: ${watchedShow.show.title} S${nextEpisode.season}E${nextEpisode.episode}`); + traktBatch.push({ + ...cachedData.basicContent, + id: showImdb, + type: 'series', + progress: 0, // Up next - no progress yet + lastUpdated: latestEpisodeTimestamp, + season: nextEpisode.season, + episode: nextEpisode.episode, + episodeTitle: nextEpisode.title || `Episode ${nextEpisode.episode}`, + addonId: undefined, + } as ContinueWatchingItem); + } + } catch (err) { + // Continue with other shows + } + } + } catch (err) { + logger.warn('[TraktSync] Error fetching watched shows for Up Next:', err); + } + // Set Trakt playback items as state (replace, don't merge with local storage) if (traktBatch.length > 0) { // Dedupe: for series, keep only the latest episode per show From f4b5082827b791db8594e2322c11262338847cb6 Mon Sep 17 00:00:00 2001 From: tapframe Date: Tue, 6 Jan 2026 09:40:42 +0530 Subject: [PATCH 03/22] chore: updated continue watching card hold behaviour --- .../home/ContinueWatchingSection.tsx | 319 ++++++++++++++---- 1 file changed, 251 insertions(+), 68 deletions(-) diff --git a/src/components/home/ContinueWatchingSection.tsx b/src/components/home/ContinueWatchingSection.tsx index c3e06c0..685deda 100644 --- a/src/components/home/ContinueWatchingSection.tsx +++ b/src/components/home/ContinueWatchingSection.tsx @@ -12,6 +12,10 @@ import { } from 'react-native'; import { FlatList } from 'react-native'; import Animated, { FadeIn, Layout } from 'react-native-reanimated'; +import BottomSheet, { BottomSheetModal, BottomSheetView, BottomSheetBackdrop } from '@gorhom/bottom-sheet'; +import { Ionicons } from '@expo/vector-icons'; +import { BlurView } from 'expo-blur'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useNavigation, useFocusEffect } from '@react-navigation/native'; import { NavigationProp } from '@react-navigation/native'; import { RootStackParamList } from '../../navigation/AppNavigator'; @@ -26,7 +30,7 @@ import { TraktService } from '../../services/traktService'; import { stremioService } from '../../services/stremioService'; import { streamCacheService } from '../../services/streamCacheService'; import { useSettings } from '../../hooks/useSettings'; -import CustomAlert from '../../components/CustomAlert'; + // Define interface for continue watching items interface ContinueWatchingItem extends StreamingContent { @@ -106,6 +110,7 @@ const ContinueWatchingSection = React.forwardRef((props, re const navigation = useNavigation>(); const { currentTheme } = useTheme(); const { settings } = useSettings(); + const insets = useSafeAreaInsets(); const [continueWatchingItems, setContinueWatchingItems] = useState([]); const [loading, setLoading] = useState(true); const appState = useRef(AppState.currentState); @@ -113,6 +118,10 @@ const ContinueWatchingSection = React.forwardRef((props, re const [deletingItemId, setDeletingItemId] = useState(null); const longPressTimeoutRef = useRef(null); + // Bottom sheet for item actions + const actionSheetRef = useRef(null); + const [selectedItem, setSelectedItem] = useState(null); + // Enhanced responsive sizing for tablets and TV screens const [dimensions, setDimensions] = useState(Dimensions.get('window')); const deviceWidth = dimensions.width; @@ -195,11 +204,7 @@ const ContinueWatchingSection = React.forwardRef((props, re } }, [deviceType]); - // Alert state for CustomAlert - const [alertVisible, setAlertVisible] = useState(false); - const [alertTitle, setAlertTitle] = useState(''); - const [alertMessage, setAlertMessage] = useState(''); - const [alertActions, setAlertActions] = useState([]); + // Use a ref to track if a background refresh is in progress to avoid state updates const isRefreshingRef = useRef(false); @@ -1101,71 +1106,93 @@ const ContinueWatchingSection = React.forwardRef((props, re } }, [navigation, settings.useCachedStreams, settings.openMetadataScreenWhenCacheDisabled]); - // Handle long press to delete (moved before renderContinueWatchingItem) - const handleLongPress = useCallback(async (item: ContinueWatchingItem) => { + // Handle long press to show action sheet + const handleLongPress = useCallback((item: ContinueWatchingItem) => { try { - // Trigger haptic feedback Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); } catch (error) { // Ignore haptic errors } + setSelectedItem(item); + actionSheetRef.current?.present(); + }, []); - const traktService = TraktService.getInstance(); - const isAuthed = await traktService.isAuthenticated(); + // Handle view details action + const handleViewDetails = useCallback(() => { + if (!selectedItem) return; + actionSheetRef.current?.dismiss(); - setAlertTitle('Remove from Continue Watching'); + setTimeout(() => { + if (selectedItem.type === 'series' && selectedItem.season && selectedItem.episode) { + const episodeId = `${selectedItem.id}:${selectedItem.season}:${selectedItem.episode}`; + navigation.navigate('Metadata', { + id: selectedItem.id, + type: selectedItem.type, + episodeId: episodeId, + addonId: selectedItem.addonId + }); + } else { + navigation.navigate('Metadata', { + id: selectedItem.id, + type: selectedItem.type, + addonId: selectedItem.addonId + }); + } + }, 150); + }, [selectedItem, navigation]); - if (isAuthed) { - setAlertMessage(`Remove "${item.name}" from your continue watching list?\n\nThis will also remove it from your Trakt Continue Watching.`); - } else { - setAlertMessage(`Remove "${item.name}" from your continue watching list?`); + // Handle remove action + const handleRemoveItem = useCallback(async () => { + if (!selectedItem) return; + actionSheetRef.current?.dismiss(); + + setDeletingItemId(selectedItem.id); + try { + Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + await storageService.removeAllWatchProgressForContent(selectedItem.id, selectedItem.type, { addBaseTombstone: true }); + + const traktService = TraktService.getInstance(); + const isAuthed = await traktService.isAuthenticated(); + + if (isAuthed) { + if (selectedItem.traktPlaybackId) { + await traktService.removePlaybackItem(selectedItem.traktPlaybackId); + } else if (selectedItem.type === 'movie') { + await traktService.removeMovieFromHistory(selectedItem.id); + } else if (selectedItem.type === 'series' && selectedItem.season !== undefined && selectedItem.episode !== undefined) { + await traktService.removeEpisodeFromHistory(selectedItem.id, selectedItem.season, selectedItem.episode); + } else { + await traktService.removeShowFromHistory(selectedItem.id); + } + } + + const itemKey = `${selectedItem.type}:${selectedItem.id}`; + recentlyRemovedRef.current.add(itemKey); + await storageService.addContinueWatchingRemoved(selectedItem.id, selectedItem.type); + setTimeout(() => { + recentlyRemovedRef.current.delete(itemKey); + }, REMOVAL_IGNORE_DURATION); + setContinueWatchingItems(prev => prev.filter(i => i.id !== selectedItem.id)); + } catch (error) { + // Continue even if removal fails + } finally { + setDeletingItemId(null); + setSelectedItem(null); } + }, [selectedItem]); - setAlertActions([ - { - label: 'Cancel', - style: { color: '#888' }, - onPress: () => { }, - }, - { - label: 'Remove', - style: { color: currentTheme.colors.error }, - onPress: async () => { - setDeletingItemId(item.id); - try { - Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - await storageService.removeAllWatchProgressForContent(item.id, item.type, { addBaseTombstone: true }); - - if (isAuthed) { - let traktResult = false; - // If we have a playback ID (from sync/playback), use that to remove from Continue Watching - if (item.traktPlaybackId) { - traktResult = await traktService.removePlaybackItem(item.traktPlaybackId); - } else if (item.type === 'movie') { - traktResult = await traktService.removeMovieFromHistory(item.id); - } else if (item.type === 'series' && item.season !== undefined && item.episode !== undefined) { - traktResult = await traktService.removeEpisodeFromHistory(item.id, item.season, item.episode); - } else { - traktResult = await traktService.removeShowFromHistory(item.id); - } - } - const itemKey = `${item.type}:${item.id}`; - recentlyRemovedRef.current.add(itemKey); - await storageService.addContinueWatchingRemoved(item.id, item.type); - setTimeout(() => { - recentlyRemovedRef.current.delete(itemKey); - }, REMOVAL_IGNORE_DURATION); - setContinueWatchingItems(prev => prev.filter(i => i.id !== item.id)); - } catch (error) { - // Continue even if removal fails - } finally { - setDeletingItemId(null); - } - }, - }, - ]); - setAlertVisible(true); - }, [currentTheme.colors.error]); + // Render backdrop for bottom sheet + const renderBackdrop = useCallback( + (props: any) => ( + + ), + [] + ); // Compute poster dimensions for poster-style cards const computedPosterWidth = useMemo(() => { @@ -1514,13 +1541,101 @@ const ContinueWatchingSection = React.forwardRef((props, re removeClippedSubviews={true} /> - setAlertVisible(false)} - /> + {/* Action Sheet Bottom Sheet */} + { + setSelectedItem(null); + }} + > + + {selectedItem && ( + <> + {/* Header with poster and info */} + + + + + {selectedItem.name} + + {selectedItem.type === 'series' && selectedItem.season && selectedItem.episode ? ( + + Season {selectedItem.season} · Episode {selectedItem.episode} + {selectedItem.episodeTitle && selectedItem.episodeTitle !== `Episode ${selectedItem.episode}` && `\n${selectedItem.episodeTitle}`} + + ) : ( + + {selectedItem.year ? `${selectedItem.type === 'movie' ? 'Movie' : 'Series'} · ${selectedItem.year}` : selectedItem.type === 'movie' ? 'Movie' : 'Series'} + + )} + {selectedItem.progress > 0 && ( + + + + + + {Math.round(selectedItem.progress)}% watched + + + )} + + + + {/* Action Buttons */} + + + + View Details + + + + + Remove + + + + )} + + ); }); @@ -1795,6 +1910,74 @@ const styles = StyleSheet.create({ fontWeight: '500', marginLeft: 6, }, + // Action Sheet Styles + actionSheetContent: { + flex: 1, + paddingHorizontal: 20, + paddingTop: 8, + }, + actionSheetHeader: { + flexDirection: 'row', + marginBottom: 20, + }, + actionSheetPoster: { + width: 70, + height: 105, + borderRadius: 10, + marginRight: 16, + }, + actionSheetInfo: { + flex: 1, + justifyContent: 'center', + }, + actionSheetTitle: { + fontSize: 18, + fontWeight: '700', + marginBottom: 6, + lineHeight: 22, + }, + actionSheetSubtitle: { + fontSize: 14, + opacity: 0.8, + lineHeight: 20, + }, + actionSheetProgressContainer: { + marginTop: 10, + }, + actionSheetProgressTrack: { + height: 4, + borderRadius: 2, + overflow: 'hidden', + }, + actionSheetProgressBar: { + height: '100%', + borderRadius: 2, + }, + actionSheetProgressText: { + fontSize: 12, + marginTop: 4, + }, + actionSheetButtons: { + flexDirection: 'row', + gap: 12, + }, + actionButton: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + paddingVertical: 14, + borderRadius: 14, + gap: 8, + }, + actionButtonSecondary: { + borderWidth: 0, + }, + actionButtonText: { + fontSize: 16, + fontWeight: '600', + color: '#fff', + }, }); export default React.memo(ContinueWatchingSection, (prevProps, nextProps) => { From 9877f513e2627a4d9f2448c466b24225954b878b Mon Sep 17 00:00:00 2001 From: tapframe Date: Tue, 6 Jan 2026 10:07:58 +0530 Subject: [PATCH 04/22] up next logic improvements --- .../home/ContinueWatchingSection.tsx | 86 +++++++++++++++---- 1 file changed, 67 insertions(+), 19 deletions(-) diff --git a/src/components/home/ContinueWatchingSection.tsx b/src/components/home/ContinueWatchingSection.tsx index 685deda..c93ef7b 100644 --- a/src/components/home/ContinueWatchingSection.tsx +++ b/src/components/home/ContinueWatchingSection.tsx @@ -325,15 +325,21 @@ const ContinueWatchingSection = React.forwardRef((props, re // 1. Filter items first (async checks) - do this BEFORE any state updates const validItems: ContinueWatchingItem[] = []; for (const it of batch) { - const key = `${it.type}:${it.id}`; + // For series, use episode-specific key + const key = it.type === 'series' && it.season && it.episode + ? `${it.type}:${it.id}:${it.season}:${it.episode}` + : `${it.type}:${it.id}`; // Skip recently removed items if (recentlyRemovedRef.current.has(key)) { continue; } - // Skip persistently removed items - const isRemoved = await storageService.isContinueWatchingRemoved(it.id, it.type); + // Skip persistently removed items (episode-specific for series) + const removeId = it.type === 'series' && it.season && it.episode + ? `${it.id}:${it.season}:${it.episode}` + : it.id; + const isRemoved = await storageService.isContinueWatchingRemoved(removeId, it.type); if (isRemoved) { continue; } @@ -874,9 +880,23 @@ const ContinueWatchingSection = React.forwardRef((props, re } } const uniqueItems = Array.from(deduped.values()); - logger.log(`📋 [TraktSync] Setting ${uniqueItems.length} items from Trakt playback (deduped from ${traktBatch.length})`); + + // Filter out removed items + const filteredItems: ContinueWatchingItem[] = []; + for (const item of uniqueItems) { + // Check episode-specific removal for series + const removeId = item.type === 'series' && item.season && item.episode + ? `${item.id}:${item.season}:${item.episode}` + : item.id; + const isRemoved = await storageService.isContinueWatchingRemoved(removeId, item.type); + if (!isRemoved) { + filteredItems.push(item); + } + } + + logger.log(`📋 [TraktSync] Setting ${filteredItems.length} items from Trakt playback (deduped from ${traktBatch.length})`); // Sort by lastUpdated descending and set directly - const sortedBatch = uniqueItems.sort((a, b) => (b.lastUpdated ?? 0) - (a.lastUpdated ?? 0)); + const sortedBatch = filteredItems.sort((a, b) => (b.lastUpdated ?? 0) - (a.lastUpdated ?? 0)); setContinueWatchingItems(sortedBatch); } } catch (err) { @@ -1149,30 +1169,58 @@ const ContinueWatchingSection = React.forwardRef((props, re setDeletingItemId(selectedItem.id); try { Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - await storageService.removeAllWatchProgressForContent(selectedItem.id, selectedItem.type, { addBaseTombstone: true }); + + // For series episodes, only remove the specific episode's local progress + // Don't add a base tombstone which would block all episodes of the series + const isEpisode = selectedItem.type === 'series' && selectedItem.season && selectedItem.episode; + if (isEpisode) { + // Only remove local progress for this specific episode (no base tombstone) + await storageService.removeAllWatchProgressForContent( + selectedItem.id, + selectedItem.type, + { addBaseTombstone: false } + ); + } else { + // For movies or whole series, add the base tombstone + await storageService.removeAllWatchProgressForContent( + selectedItem.id, + selectedItem.type, + { addBaseTombstone: true } + ); + } const traktService = TraktService.getInstance(); const isAuthed = await traktService.isAuthenticated(); - if (isAuthed) { - if (selectedItem.traktPlaybackId) { - await traktService.removePlaybackItem(selectedItem.traktPlaybackId); - } else if (selectedItem.type === 'movie') { - await traktService.removeMovieFromHistory(selectedItem.id); - } else if (selectedItem.type === 'series' && selectedItem.season !== undefined && selectedItem.episode !== undefined) { - await traktService.removeEpisodeFromHistory(selectedItem.id, selectedItem.season, selectedItem.episode); - } else { - await traktService.removeShowFromHistory(selectedItem.id); - } + // Only remove playback progress from Trakt (not watch history) + // This ensures "Up Next" items don't affect Trakt watch history + if (isAuthed && selectedItem.traktPlaybackId) { + await traktService.removePlaybackItem(selectedItem.traktPlaybackId); } + // For series, make the key episode-specific so dismissing "Up Next" + // doesn't affect other episodes + const itemKey = selectedItem.type === 'series' && selectedItem.season && selectedItem.episode + ? `${selectedItem.type}:${selectedItem.id}:${selectedItem.season}:${selectedItem.episode}` + : `${selectedItem.type}:${selectedItem.id}`; - const itemKey = `${selectedItem.type}:${selectedItem.id}`; recentlyRemovedRef.current.add(itemKey); - await storageService.addContinueWatchingRemoved(selectedItem.id, selectedItem.type); + + // Store with episode-specific ID for series + const removeId = selectedItem.type === 'series' && selectedItem.season && selectedItem.episode + ? `${selectedItem.id}:${selectedItem.season}:${selectedItem.episode}` + : selectedItem.id; + await storageService.addContinueWatchingRemoved(removeId, selectedItem.type); + setTimeout(() => { recentlyRemovedRef.current.delete(itemKey); }, REMOVAL_IGNORE_DURATION); - setContinueWatchingItems(prev => prev.filter(i => i.id !== selectedItem.id)); + setContinueWatchingItems(prev => prev.filter(i => { + // For series, also check episode match + if (i.type === 'series' && selectedItem.type === 'series') { + return !(i.id === selectedItem.id && i.season === selectedItem.season && i.episode === selectedItem.episode); + } + return i.id !== selectedItem.id; + })); } catch (error) { // Continue even if removal fails } finally { From 9c37ad8b949467e048c550d0eae9efaf5663c9d8 Mon Sep 17 00:00:00 2001 From: tapframe Date: Tue, 6 Jan 2026 11:34:05 +0530 Subject: [PATCH 05/22] multi-lang init --- App.tsx | 1 + package-lock.json | 85 ++++++++++++++++++++++++ package.json | 3 + src/i18n/index.ts | 21 ++++++ src/i18n/languageDetector.ts | 29 +++++++++ src/i18n/locales/en.json | 42 ++++++++++++ src/i18n/locales/pt.json | 42 ++++++++++++ src/i18n/resources.ts | 7 ++ src/screens/AddonsScreen.tsx | 57 +++++++++-------- src/screens/SettingsScreen.tsx | 114 +++++++++++++++++++++++++++++++++ 10 files changed, 374 insertions(+), 27 deletions(-) create mode 100644 src/i18n/index.ts create mode 100644 src/i18n/languageDetector.ts create mode 100644 src/i18n/locales/en.json create mode 100644 src/i18n/locales/pt.json create mode 100644 src/i18n/resources.ts diff --git a/App.tsx b/App.tsx index a42d2c8..af1b463 100644 --- a/App.tsx +++ b/App.tsx @@ -13,6 +13,7 @@ import { Platform, LogBox } from 'react-native'; +import './src/i18n'; // Initialize i18n import { NavigationContainer } from '@react-navigation/native'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { StatusBar } from 'expo-status-bar'; diff --git a/package-lock.json b/package-lock.json index 1e28238..f79cf16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,10 +64,13 @@ "expo-system-ui": "~6.0.7", "expo-updates": "~29.0.12", "expo-web-browser": "~15.0.8", + "i18next": "^25.7.3", + "intl-pluralrules": "^2.0.1", "lodash": "^4.17.21", "lottie-react-native": "~7.3.1", "posthog-react-native": "^4.4.0", "react": "19.1.0", + "react-i18next": "^16.5.1", "react-native": "0.81.4", "react-native-boost": "^0.6.2", "react-native-bottom-tabs": "^1.0.2", @@ -7505,6 +7508,15 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, "node_modules/htmlparser2-without-node-native": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2-without-node-native/-/htmlparser2-without-node-native-3.9.2.tgz", @@ -7616,6 +7628,37 @@ "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", "license": "BSD-3-Clause" }, + "node_modules/i18next": { + "version": "25.7.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.7.3.tgz", + "integrity": "sha512-2XaT+HpYGuc2uTExq9TVRhLsso+Dxym6PWaKpn36wfBmTI779OQ7iP/XaZHzrnGyzU4SHpFrTYLKfVyBfAhVNA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -7743,6 +7786,12 @@ "css-in-js-utils": "^3.1.0" } }, + "node_modules/intl-pluralrules": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/intl-pluralrules/-/intl-pluralrules-2.0.1.tgz", + "integrity": "sha512-astxTLzIdXPeN0K9Rumi6LfMpm3rvNO0iJE+h/k8Kr/is+wPbRe4ikyDjlLr6VTh/mEfNv8RjN+gu3KwDiuhqg==", + "license": "ISC" + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -10537,6 +10586,33 @@ "react": ">=17.0.0" } }, + "node_modules/react-i18next": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.1.tgz", + "integrity": "sha512-Hks6UIRZWW4c+qDAnx1csVsCGYeIR4MoBGQgJ+NUoNnO6qLxXuf8zu0xdcinyXUORgGzCdRsexxO1Xzv3sTdnw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 25.6.2", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "19.2.3", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz", @@ -13250,6 +13326,15 @@ "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "license": "MIT" }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", diff --git a/package.json b/package.json index ca955c1..1bc7b10 100644 --- a/package.json +++ b/package.json @@ -64,10 +64,13 @@ "expo-system-ui": "~6.0.7", "expo-updates": "~29.0.12", "expo-web-browser": "~15.0.8", + "i18next": "^25.7.3", + "intl-pluralrules": "^2.0.1", "lodash": "^4.17.21", "lottie-react-native": "~7.3.1", "posthog-react-native": "^4.4.0", "react": "19.1.0", + "react-i18next": "^16.5.1", "react-native": "0.81.4", "react-native-boost": "^0.6.2", "react-native-bottom-tabs": "^1.0.2", diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..8c1de83 --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,21 @@ +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; +import 'intl-pluralrules'; +import languageDetector from './languageDetector'; +import { resources } from './resources'; + +i18n + .use(languageDetector) + .use(initReactI18next) + .init({ + resources, + fallbackLng: 'en', + interpolation: { + escapeValue: false, + }, + react: { + useSuspense: false, + }, + }); + +export default i18n; diff --git a/src/i18n/languageDetector.ts b/src/i18n/languageDetector.ts new file mode 100644 index 0000000..aeed48e --- /dev/null +++ b/src/i18n/languageDetector.ts @@ -0,0 +1,29 @@ +import { getLocales } from 'expo-localization'; +import { LanguageDetectorModule } from 'i18next'; +import { mmkvStorage } from '../services/mmkvStorage'; + +const languageDetector = { + type: 'languageDetector', + async: true, + detect: async (callback: any) => { + try { + const savedLanguage = await mmkvStorage.getItem('user_language'); + if (savedLanguage) { + callback(savedLanguage); + return; + } + } catch (error) { + console.log('Error reading language from storage', error); + } + + const locales = getLocales(); + const languageCode = locales[0]?.languageCode ?? 'en'; + callback(languageCode); + }, + init: () => { }, + cacheUserLanguage: (language: string) => { + mmkvStorage.setItem('user_language', language); + }, +}; + +export default languageDetector; diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json new file mode 100644 index 0000000..339d95f --- /dev/null +++ b/src/i18n/locales/en.json @@ -0,0 +1,42 @@ +{ + "common": { + "loading": "Loading...", + "cancel": "Cancel", + "save": "Save", + "delete": "Delete", + "edit": "Edit", + "search": "Search", + "error": "Error", + "success": "Success", + "ok": "OK" + }, + "addons": { + "title": "Addons", + "reorder_mode": "Reorder Mode", + "reorder_info": "Addons at the top have higher priority when loading content", + "add_addon_placeholder": "Addon URL", + "add_button": "Add Addon", + "my_addons": "My Addons", + "community_addons": "Community Addons", + "no_addons": "No addons installed", + "uninstall_title": "Uninstall Addon", + "uninstall_message": "Are you sure you want to uninstall {{name}}?", + "uninstall_button": "Uninstall", + "install_success": "Addon installed successfully", + "install_error": "Failed to install addon", + "load_error": "Failed to load addons", + "fetch_error": "Failed to fetch addon details", + "invalid_url": "Please enter an addon URL", + "configure": "Configure", + "version": "Version: {{version}}", + "installed_addons": "INSTALLED ADDONS", + "reorder_drag_title": "DRAG ADDONS TO REORDER", + "install": "Install" + }, + "settings": { + "language": "Language", + "select_language": "Select Language", + "english": "English", + "portuguese": "Portuguese" + } +} \ No newline at end of file diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json new file mode 100644 index 0000000..44d9205 --- /dev/null +++ b/src/i18n/locales/pt.json @@ -0,0 +1,42 @@ +{ + "common": { + "loading": "Carregando...", + "cancel": "Cancelar", + "save": "Salvar", + "delete": "Excluir", + "edit": "Editar", + "search": "Buscar", + "error": "Erro", + "success": "Sucesso", + "ok": "OK" + }, + "addons": { + "title": "Addons", + "reorder_mode": "Modo de Reordenação", + "reorder_info": "Arraste e solte para reordenar seus addons.", + "add_addon_placeholder": "Digite a URL do addon (comece com https://)", + "add_button": "Adicionar", + "my_addons": "Meus Addons", + "community_addons": "Addons da Comunidade", + "no_addons": "Nenhum addon instalado", + "uninstall_title": "Desinstalar Addon", + "uninstall_message": "Tem certeza que deseja desinstalar {{name}}?", + "uninstall_button": "Desinstalar", + "installed_addons": "ADDONS INSTALADOS", + "reorder_drag_title": "ARRASTE PARA REORDENAR", + "install": "Instalar", + "install_success": "Addon instalado com sucesso", + "install_error": "Falha ao instalar addon", + "load_error": "Falha ao carregar addons", + "fetch_error": "Falha ao buscar detalhes do addon", + "invalid_url": "Por favor, digite uma URL de addon", + "configure": "Configurar", + "version": "Versão: {{version}}" + }, + "settings": { + "language": "Idioma", + "select_language": "Selecionar Idioma", + "english": "Inglês", + "portuguese": "Português" + } +} \ No newline at end of file diff --git a/src/i18n/resources.ts b/src/i18n/resources.ts new file mode 100644 index 0000000..cf8fbd6 --- /dev/null +++ b/src/i18n/resources.ts @@ -0,0 +1,7 @@ +import en from './locales/en.json'; +import pt from './locales/pt.json'; + +export const resources = { + en: { translation: en }, + pt: { translation: pt }, +}; diff --git a/src/screens/AddonsScreen.tsx b/src/screens/AddonsScreen.tsx index 4644889..8ee6322 100644 --- a/src/screens/AddonsScreen.tsx +++ b/src/screens/AddonsScreen.tsx @@ -30,6 +30,7 @@ import { logger } from '../utils/logger'; import { mmkvStorage } from '../services/mmkvStorage'; import { BlurView as ExpoBlurView } from 'expo-blur'; import CustomAlert from '../components/CustomAlert'; +import { useTranslation } from 'react-i18next'; // Optional iOS Glass effect (expo-glass-effect) with safe fallback for AddonsScreen let GlassViewComp: any = null; @@ -536,6 +537,7 @@ const createStyles = (colors: any) => StyleSheet.create({ const AddonsScreen = () => { + const { t } = useTranslation(); const navigation = useNavigation>(); const [addons, setAddons] = useState([]); const [loading, setLoading] = useState(true); @@ -603,9 +605,9 @@ const AddonsScreen = () => { } } catch (error) { logger.error('Failed to load addons:', error); - setAlertTitle('Error'); - setAlertMessage('Failed to load addons'); - setAlertActions([{ label: 'OK', onPress: () => setAlertVisible(false) }]); + setAlertTitle(t('common.error')); + setAlertMessage(t('addons.load_error')); + setAlertActions([{ label: t('common.ok'), onPress: () => setAlertVisible(false) }]); setAlertVisible(true); } finally { setLoading(false); @@ -617,9 +619,9 @@ const AddonsScreen = () => { const handleAddAddon = async (url?: string) => { let urlToInstall = url || addonUrl; if (!urlToInstall) { - setAlertTitle('Error'); - setAlertMessage('Please enter an addon URL'); - setAlertActions([{ label: 'OK', onPress: () => setAlertVisible(false) }]); + setAlertTitle(t('common.error')); + setAlertMessage(t('addons.invalid_url')); + setAlertActions([{ label: t('common.ok'), onPress: () => setAlertVisible(false) }]); setAlertVisible(true); return; } @@ -637,9 +639,9 @@ const AddonsScreen = () => { setShowConfirmModal(true); } catch (error) { logger.error('Failed to fetch addon details:', error); - setAlertTitle('Error'); - setAlertMessage(`Failed to fetch addon details from ${urlToInstall}`); - setAlertActions([{ label: 'OK', onPress: () => setAlertVisible(false) }]); + setAlertTitle(t('common.error')); + setAlertMessage(`${t('addons.fetch_error')} ${urlToInstall}`); + setAlertActions([{ label: t('common.ok'), onPress: () => setAlertVisible(false) }]); setAlertVisible(true); } finally { setInstalling(false); @@ -656,9 +658,9 @@ const AddonsScreen = () => { setShowConfirmModal(false); setAddonDetails(null); loadAddons(); - setAlertTitle('Success'); - setAlertMessage('Addon installed successfully'); - setAlertActions([{ label: 'OK', onPress: () => setAlertVisible(false) }]); + setAlertTitle(t('common.success')); + setAlertMessage(t('addons.install_success')); + setAlertActions([{ label: t('common.ok'), onPress: () => setAlertVisible(false) }]); setAlertVisible(true); } catch (error) { logger.error('Failed to install addon:', error); @@ -691,12 +693,12 @@ const AddonsScreen = () => { }; const handleRemoveAddon = (addon: ExtendedManifest) => { - setAlertTitle('Uninstall Addon'); - setAlertMessage(`Are you sure you want to uninstall ${addon.name}?`); + setAlertTitle(t('addons.uninstall_title')); + setAlertMessage(t('addons.uninstall_message', { name: addon.name })); setAlertActions([ - { label: 'Cancel', onPress: () => setAlertVisible(false), style: { color: colors.mediumGray } }, + { label: t('common.cancel'), onPress: () => setAlertVisible(false), style: { color: colors.mediumGray } }, { - label: 'Uninstall', + label: t('addons.uninstall_button'), onPress: async () => { await stremioService.removeAddon(addon.id); setAddons(prev => prev.filter(a => a.id !== addon.id)); @@ -997,15 +999,15 @@ const AddonsScreen = () => { - Addons - {reorderMode && (Reorder Mode)} + {t('addons.title')} + {reorderMode && {t('addons.reorder_mode')}} {reorderMode && ( - Addons at the top have higher priority when loading content + {t('addons.reorder_info')} )} @@ -1040,7 +1042,7 @@ const AddonsScreen = () => { { disabled={installing || !addonUrl} > - {installing ? 'Loading...' : 'Add Addon'} + {installing ? 'Loading...' : t('addons.add_button')} @@ -1063,13 +1065,13 @@ const AddonsScreen = () => { {/* Installed Addons Section */} - {reorderMode ? "DRAG ADDONS TO REORDER" : "INSTALLED ADDONS"} + {reorderMode ? t('addons.reorder_drag_title') : t('addons.installed_addons')} {addons.length === 0 ? ( - No addons installed + {t('addons.no_addons')} ) : ( addons.map((addon, index) => ( @@ -1083,7 +1085,8 @@ const AddonsScreen = () => { )} - + + )} {/* Addon Details Confirmation Modal */} @@ -1189,7 +1192,7 @@ const AddonsScreen = () => { setAddonDetails(null); }} > - Cancel + {t('common.cancel')} { {installing ? ( ) : ( - Install + {t('addons.install')} )} @@ -1216,7 +1219,7 @@ const AddonsScreen = () => { onClose={() => setAlertVisible(false)} actions={alertActions} /> - + ); }; diff --git a/src/screens/SettingsScreen.tsx b/src/screens/SettingsScreen.tsx index 5a34f06..20d4923 100644 --- a/src/screens/SettingsScreen.tsx +++ b/src/screens/SettingsScreen.tsx @@ -12,7 +12,10 @@ import { Platform, Dimensions, Linking, + Modal, + FlatList, } from 'react-native'; +import { useTranslation } from 'react-i18next'; import { mmkvStorage } from '../services/mmkvStorage'; import { useNavigation } from '@react-navigation/native'; import { NavigationProp } from '@react-navigation/native'; @@ -142,8 +145,10 @@ const Sidebar: React.FC = ({ selectedCategory, onCategorySelect, c const SettingsScreen: React.FC = () => { + const { t, i18n } = useTranslation(); const { settings, updateSetting } = useSettings(); const [hasUpdateBadge, setHasUpdateBadge] = useState(false); + const [languageModalVisible, setLanguageModalVisible] = useState(false); // CustomAlert state const [alertVisible, setAlertVisible] = useState(false); const [alertTitle, setAlertTitle] = useState(''); @@ -577,6 +582,13 @@ const SettingsScreen: React.FC = () => { (settingsConfig?.categories?.['playback']?.visible !== false) ) && ( + } + onPress={() => setLanguageModalVisible(true)} + /> {(settingsConfig?.categories?.['content']?.visible !== false) && ( { actions={alertActions} onClose={() => setAlertVisible(false)} /> + + setLanguageModalVisible(false)} + > + setLanguageModalVisible(false)} + > + + + {t('settings.select_language')} + + + { + i18n.changeLanguage('en'); + setLanguageModalVisible(false); + }} + > + + {t('settings.english')} + + {i18n.language === 'en' && ( + + )} + + + { + i18n.changeLanguage('pt'); + setLanguageModalVisible(false); + }} + > + + {t('settings.portuguese')} + + {i18n.language === 'pt' && ( + + )} + + + + ); }; @@ -799,6 +874,45 @@ const styles = StyleSheet.create({ container: { flex: 1, }, + modalOverlay: { + flex: 1, + backgroundColor: 'rgba(0,0,0,0.5)', + justifyContent: 'center', + alignItems: 'center', + padding: 20, + }, + modalContent: { + width: '100%', + maxWidth: 340, + borderRadius: 16, + padding: 20, + elevation: 5, + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + }, + modalTitle: { + fontSize: 18, + fontWeight: 'bold', + marginBottom: 16, + textAlign: 'center', + }, + languageOption: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingVertical: 14, + paddingHorizontal: 16, + borderRadius: 8, + marginBottom: 8, + }, + languageText: { + fontSize: 16, + }, // Mobile styles contentContainer: { flex: 1, From afddf4bf2dd6b5b5a098b2100bf19f0585715831 Mon Sep 17 00:00:00 2001 From: tapframe Date: Tue, 6 Jan 2026 11:39:12 +0530 Subject: [PATCH 06/22] updated settinsgcreen and it's sub-pages to support localization --- src/i18n/locales/en.json | 104 +++++++++++++++++- src/i18n/locales/pt.json | 104 +++++++++++++++++- src/screens/SettingsScreen.tsx | 100 ++++++++--------- src/screens/settings/AboutSettingsScreen.tsx | 22 ++-- .../settings/AppearanceSettingsScreen.tsx | 19 ++-- .../ContentDiscoverySettingsScreen.tsx | 39 ++++--- .../settings/DeveloperSettingsScreen.tsx | 24 ++-- .../settings/IntegrationsSettingsScreen.tsx | 21 ++-- .../settings/PlaybackSettingsScreen.tsx | 59 +++++----- 9 files changed, 360 insertions(+), 132 deletions(-) diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 339d95f..d114853 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -37,6 +37,108 @@ "language": "Language", "select_language": "Select Language", "english": "English", - "portuguese": "Portuguese" + "portuguese": "Portuguese", + "account": "Account", + "content_discovery": "Content & Discovery", + "appearance": "Appearance", + "integrations": "Integrations", + "playback": "Playback", + "backup_restore": "Backup & Restore", + "updates": "Updates", + "about": "About", + "developer": "Developer", + "cache": "Cache", + "settings_title": "Settings", + "sign_in_sync": "Sign in to sync", + "add_catalogs_sources": "Addons, catalogs, and sources", + "player_trailers_downloads": "Player, trailers, downloads", + "mdblist_tmdb_ai": "MDBList, TMDB, AI", + "check_updates": "Check for updates", + "developer_tools": "Testing and debug options", + "clear_mdblist_cache": "Clear MDBList Cache", + "cache_management": "CACHE MANAGEMENT", + "downloads_counter": "downloads and counting", + "made_with_love": "Made with ❤️ by Tapframe and friends", + "sections": { + "information": "INFORMATION", + "theme": "THEME", + "layout": "LAYOUT", + "sources": "SOURCES", + "catalogs": "CATALOGS", + "discovery": "DISCOVERY", + "metadata": "METADATA", + "ai_assistant": "AI ASSISTANT", + "video_player": "VIDEO PLAYER", + "audio_subtitles": "AUDIO & SUBTITLES", + "media": "MEDIA", + "notifications": "NOTIFICATIONS", + "testing": "TESTING", + "danger_zone": "DANGER ZONE" + }, + "items": { + "privacy_policy": "Privacy Policy", + "report_issue": "Report Issue", + "version": "Version", + "contributors": "Contributors", + "view_contributors": "View all contributors", + "theme": "Theme", + "episode_layout": "Episode Layout", + "streams_backdrop": "Streams Backdrop", + "streams_backdrop_desc": "Show blurred backdrop on mobile streams", + "addons": "Addons", + "installed": "installed", + "debrid_integration": "Debrid Integration", + "debrid_desc": "Connect Torbox for premium streams", + "plugins": "Plugins", + "plugins_desc": "Manage plugins and repositories", + "catalogs": "Catalogs", + "active": "active", + "home_screen": "Home Screen", + "home_screen_desc": "Layout and content", + "continue_watching": "Continue Watching", + "continue_watching_desc": "Cache and playback behavior", + "show_discover": "Show Discover Section", + "show_discover_desc": "Display discover content in Search", + "mdblist": "MDBList", + "mdblist_connected": "Connected", + "mdblist_desc": "Enable to add ratings & reviews", + "tmdb": "TMDB", + "tmdb_desc": "Metadata & logo source provider", + "openrouter": "OpenRouter API", + "openrouter_connected": "Connected", + "openrouter_desc": "Add your API key to enable AI chat", + "video_player": "Video Player", + "built_in": "Built-in", + "external": "External", + "preferred_audio": "Preferred Audio Language", + "preferred_subtitle": "Preferred Subtitle Language", + "subtitle_source": "Subtitle Source Priority", + "auto_select_subs": "Auto-Select Subtitles", + "auto_select_subs_desc": "Automatically select subtitles matching your preferences", + "show_trailers": "Show Trailers", + "show_trailers_desc": "Display trailers in hero section", + "enable_downloads": "Enable Downloads (Beta)", + "enable_downloads_desc": "Show Downloads tab and enable saving streams", + "notifications": "Notifications", + "notifications_desc": "Episode reminders", + "test_onboarding": "Test Onboarding", + "reset_onboarding": "Reset Onboarding", + "test_announcement": "Test Announcement", + "test_announcement_desc": "Show what's new overlay", + "reset_campaigns": "Reset Campaigns", + "reset_campaigns_desc": "Clear campaign impressions", + "clear_all_data": "Clear All Data", + "clear_all_data_desc": "Reset all settings and cached data" + }, + "options": { + "horizontal": "Horizontal", + "vertical": "Vertical", + "internal_first": "Internal First", + "internal_first_desc": "Prefer embedded subtitles, then external", + "external_first": "External First", + "external_first_desc": "Prefer addon subtitles, then embedded", + "any_available": "Any Available", + "any_available_desc": "Use first available subtitle track" + } } } \ No newline at end of file diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index 44d9205..496f5e3 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -37,6 +37,108 @@ "language": "Idioma", "select_language": "Selecionar Idioma", "english": "Inglês", - "portuguese": "Português" + "portuguese": "Português", + "account": "Conta", + "content_discovery": "Conteúdo e Descoberta", + "appearance": "Aparência", + "integrations": "Integrações", + "playback": "Reprodução", + "backup_restore": "Backup e Restauração", + "updates": "Atualizações", + "about": "Sobre", + "developer": "Desenvolvedor", + "cache": "Cache", + "settings_title": "Configurações", + "sign_in_sync": "Faça login para sincronizar", + "add_catalogs_sources": "Addons, catálogos e fontes", + "player_trailers_downloads": "Player, trailers, downloads", + "mdblist_tmdb_ai": "MDBList, TMDB, IA", + "check_updates": "Verificar atualizações", + "developer_tools": "Opções de teste e depuração", + "clear_mdblist_cache": "Limpar Cache do MDBList", + "cache_management": "GERENCIAMENTO DE CACHE", + "downloads_counter": "downloads e contando", + "made_with_love": "Feito com ❤️ por Tapframe e amigos", + "sections": { + "information": "INFORMAÇÕES", + "theme": "TEMA", + "layout": "LAYOUT", + "sources": "FONTES", + "catalogs": "CATÁLOGOS", + "discovery": "DESCOBERTA", + "metadata": "METADADOS", + "ai_assistant": "ASSISTENTE IA", + "video_player": "PLAYER DE VÍDEO", + "audio_subtitles": "ÁUDIO E LEGENDAS", + "media": "MÍDIA", + "notifications": "NOTIFICAÇÕES", + "testing": "TESTES", + "danger_zone": "AREA DE PERIGO" + }, + "items": { + "privacy_policy": "Política de Privacidade", + "report_issue": "Reportar Problema", + "version": "Versão", + "contributors": "Contribuidores", + "view_contributors": "Ver todos os contribuidores", + "theme": "Tema", + "episode_layout": "Layout de Episódios", + "streams_backdrop": "Fundo de Streams", + "streams_backdrop_desc": "Mostrar fundo desfocado em streams móveis", + "addons": "Addons", + "installed": "instalados", + "debrid_integration": "Integração Debrid", + "debrid_desc": "Conectar Torbox para streams premium", + "plugins": "Plugins", + "plugins_desc": "Gerenciar plugins e repositórios", + "catalogs": "Catálogos", + "active": "ativos", + "home_screen": "Tela Inicial", + "home_screen_desc": "Layout e conteúdo", + "continue_watching": "Continuar Assistindo", + "continue_watching_desc": "Cache e comportamento de reprodução", + "show_discover": "Mostrar Seção Descobrir", + "show_discover_desc": "Exibir conteúdo de descoberta na Pesquisa", + "mdblist": "MDBList", + "mdblist_connected": "Conectado", + "mdblist_desc": "Habilitar para adicionar avaliações e resenhas", + "tmdb": "TMDB", + "tmdb_desc": "Provedor de metadados e logos", + "openrouter": "OpenRouter API", + "openrouter_connected": "Conectado", + "openrouter_desc": "Adicione sua chave API para chat IA", + "video_player": "Player de Vídeo", + "built_in": "Integrado", + "external": "Externo", + "preferred_audio": "Idioma de Áudio Preferido", + "preferred_subtitle": "Idioma de Legenda Preferido", + "subtitle_source": "Prioridade de Fonte de Legenda", + "auto_select_subs": "Auto-Selecionar Legendas", + "auto_select_subs_desc": "Selecionar legendas automaticamente", + "show_trailers": "Mostrar Trailers", + "show_trailers_desc": "Exibir trailers na seção hero", + "enable_downloads": "Habilitar Downloads (Beta)", + "enable_downloads_desc": "Mostrar aba Downloads e permitir salvar streams", + "notifications": "Notificações", + "notifications_desc": "Lembretes de episódios", + "test_onboarding": "Testar Onboarding", + "reset_onboarding": "Resetar Onboarding", + "test_announcement": "Testar Anúncio", + "test_announcement_desc": "Mostrar sobreposição de novidades", + "reset_campaigns": "Resetar Campanhas", + "reset_campaigns_desc": "Limpar impressões de campanhas", + "clear_all_data": "Limpar Todos os Dados", + "clear_all_data_desc": "Resetar todas as configurações e cache" + }, + "options": { + "horizontal": "Horizontal", + "vertical": "Vertical", + "internal_first": "Interno Primeiro", + "internal_first_desc": "Preferir legendas embutidas, depois externas", + "external_first": "Externo Primeiro", + "external_first_desc": "Preferir legendas de addons, depois embutidas", + "any_available": "Qualquer Disponível", + "any_available_desc": "Usar primeira legenda disponível" + } } } \ No newline at end of file diff --git a/src/screens/SettingsScreen.tsx b/src/screens/SettingsScreen.tsx index 20d4923..331432c 100644 --- a/src/screens/SettingsScreen.tsx +++ b/src/screens/SettingsScreen.tsx @@ -50,25 +50,15 @@ const { width } = Dimensions.get('window'); const isTablet = width >= 768; // Settings categories for tablet sidebar -const SETTINGS_CATEGORIES = [ - { id: 'account', title: 'Account', icon: 'user' as string }, - { id: 'content', title: 'Content & Discovery', icon: 'compass' as string }, - { id: 'appearance', title: 'Appearance', icon: 'sliders' as string }, - { id: 'integrations', title: 'Integrations', icon: 'layers' as string }, - { id: 'playback', title: 'Playback', icon: 'play-circle' as string }, - { id: 'backup', title: 'Backup & Restore', icon: 'archive' as string }, - { id: 'updates', title: 'Updates', icon: 'refresh-ccw' as string }, - { id: 'about', title: 'About', icon: 'info' as string }, - { id: 'developer', title: 'Developer', icon: 'code' as string }, - { id: 'cache', title: 'Cache', icon: 'database' as string }, -]; +// Settings categories moved inside component for translation + // Tablet Sidebar Component interface SidebarProps { selectedCategory: string; onCategorySelect: (category: string) => void; currentTheme: any; - categories: typeof SETTINGS_CATEGORIES; + categories: any[]; extraTopPadding?: number; } @@ -143,9 +133,21 @@ const Sidebar: React.FC = ({ selectedCategory, onCategorySelect, c ); }; - const SettingsScreen: React.FC = () => { const { t, i18n } = useTranslation(); + + const SETTINGS_CATEGORIES = [ + { id: 'account', title: t('settings.account'), icon: 'user' }, + { id: 'content', title: t('settings.content_discovery'), icon: 'compass' }, + { id: 'appearance', title: t('settings.appearance'), icon: 'sliders' }, + { id: 'integrations', title: t('settings.integrations'), icon: 'layers' }, + { id: 'playback', title: t('settings.playback'), icon: 'play-circle' }, + { id: 'backup', title: t('settings.backup_restore'), icon: 'archive' }, + { id: 'updates', title: t('settings.updates'), icon: 'refresh-ccw' }, + { id: 'about', title: t('settings.about'), icon: 'info' }, + { id: 'developer', title: t('settings.developer'), icon: 'code' }, + { id: 'cache', title: t('settings.cache'), icon: 'database' }, + ]; const { settings, updateSetting } = useSettings(); const [hasUpdateBadge, setHasUpdateBadge] = useState(false); const [languageModalVisible, setLanguageModalVisible] = useState(false); @@ -333,11 +335,11 @@ const SettingsScreen: React.FC = () => { switch (categoryId) { case 'account': return ( - + {isItemVisible('trakt') && ( } renderControl={() => } onPress={() => navigation.navigate('TraktSettings')} @@ -365,16 +367,16 @@ const SettingsScreen: React.FC = () => { case 'developer': return __DEV__ ? ( - + navigation.navigate('Onboarding')} renderControl={() => } isTablet={isTablet} /> { try { @@ -388,9 +390,9 @@ const SettingsScreen: React.FC = () => { isTablet={isTablet} /> { try { await mmkvStorage.removeItem('announcement_v1.0.0_shown'); @@ -403,8 +405,8 @@ const SettingsScreen: React.FC = () => { isTablet={isTablet} /> { await campaignService.resetCampaigns(); @@ -414,7 +416,7 @@ const SettingsScreen: React.FC = () => { isTablet={isTablet} /> { openAlert( @@ -444,9 +446,9 @@ const SettingsScreen: React.FC = () => { case 'cache': return mdblistKeySet ? ( - + { case 'backup': return ( - + } @@ -472,10 +474,10 @@ const SettingsScreen: React.FC = () => { case 'updates': return ( - + } badge={Platform.OS === 'android' && hasUpdateBadge ? 1 : undefined} @@ -549,7 +551,7 @@ const SettingsScreen: React.FC = () => { return ( - + { > {/* Account */} {(settingsConfig?.categories?.['account']?.visible !== false) && isItemVisible('trakt') && ( - + {isItemVisible('trakt') && ( } renderControl={() => } onPress={() => navigation.navigate('TraktSettings')} @@ -591,8 +593,8 @@ const SettingsScreen: React.FC = () => { /> {(settingsConfig?.categories?.['content']?.visible !== false) && ( } onPress={() => navigation.navigate('ContentDiscoverySettings')} @@ -600,7 +602,7 @@ const SettingsScreen: React.FC = () => { )} {(settingsConfig?.categories?.['appearance']?.visible !== false) && ( } @@ -609,8 +611,8 @@ const SettingsScreen: React.FC = () => { )} {(settingsConfig?.categories?.['integrations']?.visible !== false) && ( } onPress={() => navigation.navigate('IntegrationsSettings')} @@ -618,8 +620,8 @@ const SettingsScreen: React.FC = () => { )} {(settingsConfig?.categories?.['playback']?.visible !== false) && ( } onPress={() => navigation.navigate('PlaybackSettings')} @@ -637,7 +639,7 @@ const SettingsScreen: React.FC = () => { {(settingsConfig?.categories?.['backup']?.visible !== false) && ( } @@ -647,7 +649,7 @@ const SettingsScreen: React.FC = () => { {(settingsConfig?.categories?.['updates']?.visible !== false) && ( } @@ -668,7 +670,7 @@ const SettingsScreen: React.FC = () => { {mdblistKeySet && ( { )} {/* About */} - + { {/* Developer - only in DEV mode */} {__DEV__ && ( - + } onPress={() => navigation.navigate('DeveloperSettings')} @@ -709,7 +711,7 @@ const SettingsScreen: React.FC = () => { {displayDownloads.toLocaleString()} - downloads and counting + {t('settings.downloads_counter')} )} @@ -788,7 +790,7 @@ const SettingsScreen: React.FC = () => { - Made with ❤️ by Tapframe and friends + {t('settings.made_with_love')} diff --git a/src/screens/settings/AboutSettingsScreen.tsx b/src/screens/settings/AboutSettingsScreen.tsx index 35a8324..2362057 100644 --- a/src/screens/settings/AboutSettingsScreen.tsx +++ b/src/screens/settings/AboutSettingsScreen.tsx @@ -13,6 +13,7 @@ import { fetchTotalDownloads } from '../../services/githubReleaseService'; import { getDisplayedAppVersion } from '../../utils/version'; import ScreenHeader from '../../components/common/ScreenHeader'; import { SettingsCard, SettingItem, ChevronRight } from './SettingsComponents'; +import { useTranslation } from 'react-i18next'; const { width } = Dimensions.get('window'); @@ -29,6 +30,7 @@ export const AboutSettingsContent: React.FC = ({ isTablet = false, displayDownloads: externalDisplayDownloads }) => { + const { t } = useTranslation(); const navigation = useNavigation>(); const { currentTheme } = useTheme(); @@ -52,30 +54,30 @@ export const AboutSettingsContent: React.FC = ({ return ( <> - + Linking.openURL('https://tapframe.github.io/NuvioStreaming/#privacy-policy')} renderControl={() => } isTablet={isTablet} /> Sentry.showFeedbackWidget()} renderControl={() => } isTablet={isTablet} /> } onPress={() => navigation.navigate('Contributors')} @@ -92,6 +94,7 @@ export const AboutSettingsContent: React.FC = ({ */ export const AboutFooter: React.FC<{ displayDownloads: number | null }> = ({ displayDownloads }) => { const { currentTheme } = useTheme(); + const { t } = useTranslation(); return ( <> @@ -101,7 +104,7 @@ export const AboutFooter: React.FC<{ displayDownloads: number | null }> = ({ dis {displayDownloads.toLocaleString()} - downloads and counting + {t('settings.downloads_counter')} )} @@ -179,7 +182,7 @@ export const AboutFooter: React.FC<{ displayDownloads: number | null }> = ({ dis - Made with ❤️ by Tapframe and Friends + {t('settings.made_with_love')} @@ -192,13 +195,14 @@ export const AboutFooter: React.FC<{ displayDownloads: number | null }> = ({ dis const AboutSettingsScreen: React.FC = () => { const navigation = useNavigation>(); const { currentTheme } = useTheme(); + const { t } = useTranslation(); const insets = useSafeAreaInsets(); const screenIsTablet = width >= 768; return ( - navigation.goBack()} /> + navigation.goBack()} /> const navigation = useNavigation>(); const { currentTheme } = useTheme(); const { settings, updateSetting } = useSettings(); + const { t } = useTranslation(); const config = useRealtimeConfig(); const isItemVisible = (itemId: string) => { @@ -43,10 +45,10 @@ export const AppearanceSettingsContent: React.FC return ( <> {hasVisibleItems(['theme']) && ( - + {isItemVisible('theme') && ( } @@ -59,11 +61,11 @@ export const AppearanceSettingsContent: React.FC )} {hasVisibleItems(['episode_layout', 'streams_backdrop']) && ( - + {isItemVisible('episode_layout') && ( ( )} {!isTablet && isItemVisible('streams_backdrop') && ( ( const AppearanceSettingsScreen: React.FC = () => { const navigation = useNavigation>(); const { currentTheme } = useTheme(); + const { t } = useTranslation(); const insets = useSafeAreaInsets(); const screenIsTablet = width >= 768; return ( - navigation.goBack()} /> + navigation.goBack()} /> >(); const { currentTheme } = useTheme(); const { settings, updateSetting } = useSettings(); + const { t } = useTranslation(); const config = useRealtimeConfig(); const [addonCount, setAddonCount] = useState(0); @@ -79,11 +81,11 @@ export const ContentDiscoverySettingsContent: React.FC {hasVisibleItems(['addons', 'debrid', 'plugins']) && ( - + {isItemVisible('addons') && ( } onPress={() => navigation.navigate('Addons')} @@ -92,8 +94,8 @@ export const ContentDiscoverySettingsContent: React.FC } onPress={() => navigation.navigate('DebridIntegration')} @@ -102,8 +104,8 @@ export const ContentDiscoverySettingsContent: React.FC} renderControl={() => } onPress={() => navigation.navigate('ScraperSettings')} @@ -115,11 +117,11 @@ export const ContentDiscoverySettingsContent: React.FC + {isItemVisible('catalogs') && ( } onPress={() => navigation.navigate('CatalogSettings')} @@ -128,8 +130,8 @@ export const ContentDiscoverySettingsContent: React.FC } onPress={() => navigation.navigate('HomeScreenSettings')} @@ -138,8 +140,8 @@ export const ContentDiscoverySettingsContent: React.FC } onPress={() => navigation.navigate('ContinueWatchingSettings')} @@ -151,11 +153,11 @@ export const ContentDiscoverySettingsContent: React.FC + {isItemVisible('show_discover') && ( ( { const navigation = useNavigation>(); const { currentTheme } = useTheme(); + const { t } = useTranslation(); const insets = useSafeAreaInsets(); const screenIsTablet = width >= 768; return ( - navigation.goBack()} /> + navigation.goBack()} /> { const navigation = useNavigation>(); const { currentTheme } = useTheme(); + const { t } = useTranslation(); const insets = useSafeAreaInsets(); const [alertVisible, setAlertVisible] = useState(false); @@ -84,36 +86,36 @@ const DeveloperSettingsScreen: React.FC = () => { return ( - navigation.goBack()} /> + navigation.goBack()} /> - + navigation.navigate('Onboarding')} renderControl={() => } /> } /> } /> } @@ -121,10 +123,10 @@ const DeveloperSettingsScreen: React.FC = () => { /> - + >(); const { currentTheme } = useTheme(); const config = useRealtimeConfig(); + const { t } = useTranslation(); const [mdblistKeySet, setMdblistKeySet] = useState(false); const [openRouterKeySet, setOpenRouterKeySet] = useState(false); @@ -62,11 +64,11 @@ export const IntegrationsSettingsContent: React.FC {hasVisibleItems(['mdblist', 'tmdb']) && ( - + {isItemVisible('mdblist') && ( } renderControl={() => } onPress={() => navigation.navigate('MDBListSettings')} @@ -75,8 +77,8 @@ export const IntegrationsSettingsContent: React.FC} renderControl={() => } onPress={() => navigation.navigate('TMDBSettings')} @@ -88,11 +90,11 @@ export const IntegrationsSettingsContent: React.FC + {isItemVisible('openrouter') && ( } onPress={() => navigation.navigate('AISettings')} @@ -112,13 +114,14 @@ export const IntegrationsSettingsContent: React.FC { const navigation = useNavigation>(); const { currentTheme } = useTheme(); + const { t } = useTranslation(); const insets = useSafeAreaInsets(); const screenIsTablet = width >= 768; return ( - navigation.goBack()} /> + navigation.goBack()} /> = ( const navigation = useNavigation>(); const { currentTheme } = useTheme(); const { settings, updateSetting } = useSettings(); + const { t } = useTranslation(); const config = useRealtimeConfig(); // Bottom sheet refs @@ -116,8 +118,10 @@ export const PlaybackSettingsContent: React.FC = ( }; const getSourceLabel = (value: string) => { - const option = SUBTITLE_SOURCE_OPTIONS.find(o => o.value === value); - return option ? option.label : 'Internal First'; + if (value === 'internal') return t('settings.options.internal_first'); + if (value === 'external') return t('settings.options.external_first'); + if (value === 'any') return t('settings.options.any_available'); + return t('settings.options.internal_first'); }; // Render backdrop for bottom sheets @@ -151,13 +155,13 @@ export const PlaybackSettingsContent: React.FC = ( return ( <> {hasVisibleItems(['video_player']) && ( - + {isItemVisible('video_player') && ( } @@ -170,9 +174,9 @@ export const PlaybackSettingsContent: React.FC = ( )} {/* Audio & Subtitle Preferences */} - + } @@ -180,7 +184,7 @@ export const PlaybackSettingsContent: React.FC = ( isTablet={isTablet} /> } @@ -188,7 +192,7 @@ export const PlaybackSettingsContent: React.FC = ( isTablet={isTablet} /> } @@ -196,8 +200,8 @@ export const PlaybackSettingsContent: React.FC = ( isTablet={isTablet} /> ( = ( {hasVisibleItems(['show_trailers', 'enable_downloads']) && ( - + {isItemVisible('show_trailers') && ( ( = ( )} {isItemVisible('enable_downloads') && ( ( = ( )} {hasVisibleItems(['notifications']) && ( - + {isItemVisible('notifications') && ( } onPress={() => navigation.navigate('NotificationSettings')} @@ -272,7 +276,7 @@ export const PlaybackSettingsContent: React.FC = ( handleIndicatorStyle={{ backgroundColor: 'rgba(255,255,255,0.3)' }} > - Preferred Audio Language + {t('settings.items.preferred_audio')} {AVAILABLE_LANGUAGES.map((lang) => { @@ -313,7 +317,7 @@ export const PlaybackSettingsContent: React.FC = ( handleIndicatorStyle={{ backgroundColor: 'rgba(255,255,255,0.3)' }} > - Preferred Subtitle Language + {t('settings.items.preferred_subtitle')} {AVAILABLE_LANGUAGES.map((lang) => { @@ -354,7 +358,7 @@ export const PlaybackSettingsContent: React.FC = ( handleIndicatorStyle={{ backgroundColor: 'rgba(255,255,255,0.3)' }} > - Subtitle Source Priority + {t('settings.items.subtitle_source')} {SUBTITLE_SOURCE_OPTIONS.map((option) => { @@ -370,10 +374,12 @@ export const PlaybackSettingsContent: React.FC = ( > - {option.label} + {getSourceLabel(option.value)} - {option.description} + {option.value === 'internal' && t('settings.options.internal_first_desc')} + {option.value === 'external' && t('settings.options.external_first_desc')} + {option.value === 'any' && t('settings.options.any_available_desc')} {isSelected && ( @@ -395,13 +401,14 @@ export const PlaybackSettingsContent: React.FC = ( const PlaybackSettingsScreen: React.FC = () => { const navigation = useNavigation>(); const { currentTheme } = useTheme(); + const { t } = useTranslation(); const insets = useSafeAreaInsets(); const screenIsTablet = width >= 768; return ( - navigation.goBack()} /> + navigation.goBack()} /> Date: Tue, 6 Jan 2026 12:07:37 +0530 Subject: [PATCH 07/22] updated sub pages --- src/i18n/locales/en.json | 329 ++++++++++++++- src/i18n/locales/pt.json | 317 ++++++++++++++- src/screens/AISettingsScreen.tsx | 136 ++++--- src/screens/AddonsScreen.tsx | 24 +- src/screens/CatalogSettingsScreen.tsx | 58 +-- .../ContinueWatchingSettingsScreen.tsx | 85 ++-- src/screens/ContributorsScreen.tsx | 62 +-- src/screens/DebridIntegrationScreen.tsx | 142 +++---- src/screens/HomeScreenSettings.tsx | 75 ++-- src/screens/MDBListSettingsScreen.tsx | 378 ++++++++++-------- src/screens/NotificationSettingsScreen.tsx | 210 +++++----- src/screens/PlayerSettingsScreen.tsx | 70 ++-- src/screens/PluginsScreen.tsx | 40 +- src/screens/SettingsScreen.tsx | 14 +- 14 files changed, 1326 insertions(+), 614 deletions(-) diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index d114853..9d9ff4a 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -139,6 +139,333 @@ "external_first_desc": "Prefer addon subtitles, then embedded", "any_available": "Any Available", "any_available_desc": "Use first available subtitle track" - } + }, + "trakt": "Trakt", + "clear_data": "Clear All Data", + "clear_data_desc": "This will reset all settings and clear all cached data. Are you sure?", + "app_updates": "App Updates", + "about_nuvio": "About Nuvio" + }, + "ai_settings": { + "title": "AI Assistant", + "info_title": "AI-Powered Chat", + "info_desc": "Ask questions about any movie or TV show episode using advanced AI. Get insights about plot, characters, themes, trivia, and more - all powered by comprehensive TMDB data.", + "feature_1": "Episode-specific context and analysis", + "feature_2": "Plot explanations and character insights", + "feature_3": "Behind-the-scenes trivia and facts", + "feature_4": "Your own free OpenRouter API key", + "api_key_section": "OPENROUTER API KEY", + "api_key_label": "API Key", + "api_key_desc": "Enter your OpenRouter API key to enable AI chat features", + "save_api_key": "Save API Key", + "saving": "Saving...", + "update": "Update", + "remove": "Remove", + "get_free_key": "Get Free API Key from OpenRouter", + "enable_chat": "Enable AI Chat", + "enable_chat_desc": "When enabled, the Ask AI button will appear on content pages.", + "chat_enabled": "AI Chat Enabled", + "chat_enabled_desc": "You can now ask questions about movies and TV shows. Look for the \"Ask AI\" button on content pages!", + "how_it_works": "How it works", + "how_it_works_desc": "• OpenRouter provides access to multiple AI models\n• Your API key stays private and secure\n• Free tier includes generous usage limits\n• Chat with context about specific episodes/movies\n• Get detailed analysis and explanations", + "error_invalid_key": "Please enter a valid API key", + "error_key_format": "OpenRouter API keys should start with \"sk-or-\"", + "success_saved": "OpenRouter API key saved successfully!", + "error_save": "Failed to save API key", + "confirm_remove_title": "Remove API Key", + "confirm_remove_msg": "Are you sure you want to remove your OpenRouter API key? This will disable AI chat features.", + "success_removed": "API key removed successfully", + "error_remove": "Failed to remove API key" + }, + "catalog_settings": { + "title": "Catalogs", + "layout_phone": "LAYOUT CATALOGSCREEN (PHONE)", + "posters_per_row": "Posters per row", + "auto": "Auto", + "show_titles": "Show Poster Titles", + "show_titles_desc": "Display title text below each poster", + "phone_only_hint": "Applies to phones only. Tablets keep adaptive layout.", + "catalogs_group": "Catalogs", + "enabled_count": "{{enabled}} of {{total}} enabled", + "rename_hint": "Long-press a catalog to rename", + "rename_modal_title": "Rename Catalog", + "rename_placeholder": "Enter new catalog name", + "error_save_name": "Could not save the custom name." + }, + "continue_watching_settings": { + "title": "Continue Watching", + "playback_behavior": "PLAYBACK BEHAVIOR", + "use_cached": "Use Cached Streams", + "use_cached_desc": "When enabled, clicking Continue Watching items will open the player directly using previously played streams. When disabled, opens a content screen instead.", + "open_metadata": "Open Metadata Screen", + "open_metadata_desc": "When cached streams are disabled, open the Metadata screen instead of the Streams screen. This shows content details and allows manual stream selection.", + "card_appearance": "CARD APPEARANCE", + "card_style": "Card Style", + "card_style_desc": "Choose how Continue Watching items appear on the home screen", + "wide": "Wide", + "poster": "Poster", + "cache_settings": "CACHE SETTINGS", + "cache_duration": "Stream Cache Duration", + "cache_duration_desc": "How long to keep cached stream links before they expire", + "important_note": "Important Note", + "important_note_text": "Not all stream links may remain active for the full cache duration. Longer cache times may result in expired links. If a cached link fails, the app will fall back to fetching fresh streams.", + "how_it_works": "How it works", + "how_it_works_cached": "• Streams are cached for your selected duration after playing\n• Cached streams are validated before use\n• If cache is invalid or expired, falls back to content screen\n• \"Use Cached Streams\" controls direct player vs screen navigation\n• \"Open Metadata Screen\" appears only when cached streams are disabled", + "how_it_works_uncached": "• When cached streams are disabled, clicking Continue Watching items opens content screens\n• \"Open Metadata Screen\" option controls which screen to open\n• Metadata screen shows content details and allows manual stream selection\n• Streams screen shows available streams for immediate playback", + "changes_saved": "Changes saved", + "min": "min", + "hour": "hour", + "hours": "hours" + }, + "contributors": { + "title": "Contributors", + "special_mentions": "Special Mentions", + "tab_contributors": "Contributors", + "tab_special": "Special Mentions", + "manager_role": "Community Manager", + "manager_desc": "Manages the Discord & Reddit communities for Nuvio", + "sponsor_role": "Server Sponsor", + "sponsor_desc": "Sponsored the server infrastructure for Nuvio", + "mod_role": "Discord Mod", + "mod_desc": "Helps moderate the Nuvio Discord community", + "loading": "Loading...", + "discord_user": "Discord User", + "contributions": "contributions", + "gratitude_title": "We're grateful for every contribution", + "gratitude_desc": "Each line of code, bug report, and suggestion helps make Nuvio better for everyone", + "special_thanks_title": "Special Thanks", + "special_thanks_desc": "These amazing people help keep the Nuvio community running and the servers online", + "error_rate_limit": "GitHub API rate limit exceeded. Please try again later or pull to refresh.", + "error_failed": "Failed to load contributors. Please check your internet connection.", + "retry": "Try Again", + "no_contributors": "No contributors found", + "loading_contributors": "Loading contributors..." + }, + "debrid": { + "title": "Debrid Integration", + "description_torbox": "Unlock 4K high-quality streams and lightning-fast speeds by integrating Torbox. Enter your API Key below to instantly upgrade your streaming experience.", + "description_torrentio": "Configure Torrentio to get torrent streams for movies and TV shows. A debrid service is required to stream content.", + "tab_torbox": "TorBox", + "tab_torrentio": "Torrentio", + "status_connected": "Connected", + "status_disconnected": "Disconnected", + "enable_addon": "Enable Addon", + "disconnect_button": "Disconnect & Remove", + "disconnect_loading": "Disconnecting...", + "account_info": "Account Information", + "plan": "Plan", + "plan_free": "Free", + "plan_essential": "Essential ($3/mo)", + "plan_pro": "Pro ($10/mo)", + "plan_standard": "Standard ($5/mo)", + "plan_unknown": "Unknown", + "expires": "Expires", + "downloaded": "Downloaded", + "status_active": "Active", + "connected_title": "✓ Connected to TorBox", + "connected_desc": "Your TorBox addon is active and providing premium streams.", + "configure_title": "Configure Addon", + "configure_desc": "Customize your streaming experience. Sort by quality, filter file sizes, and manage other integration settings.", + "open_settings": "Open Settings", + "what_is_debrid": "What is a Debrid Service?", + "enter_api_key": "Enter your API Key", + "connect_button": "Connect & Install", + "connecting": "Connecting...", + "unlock_speeds_title": "Unlock Premium Speeds", + "unlock_speeds_desc": "Get a Torbox subscription to access cached high-quality streams with zero buffering.", + "get_subscription": "Get Subscription", + "powered_by": "Powered by", + "disclaimer_torbox": "Nuvio is not affiliated with Torbox in any way.", + "disclaimer_torrentio": "Nuvio is not affiliated with Torrentio in any way.", + "installed_badge": "✓ INSTALLED", + "promo_title": "⚡ Need a Debrid Service?", + "promo_desc": "Get TorBox for lightning-fast 4K streaming with zero buffering. Premium cached torrents and instant downloads.", + "promo_button": "Get TorBox Subscription", + "service_label": "Debrid Service *", + "api_key_label": "API Key *", + "sorting_label": "Sorting", + "exclude_qualities": "Exclude Qualities", + "priority_languages": "Priority Languages", + "max_results": "Max Results", + "additional_options": "Additional Options", + "no_download_links": "Don't show download links", + "no_debrid_catalog": "Don't show debrid catalog", + "install_button": "Install Torrentio", + "installing": "Installing...", + "update_button": "Update Configuration", + "updating": "Updating...", + "remove_button": "Remove Torrentio", + "error_api_required": "API Key Required", + "error_api_required_desc": "Please enter your debrid service API key to install Torrentio.", + "success_installed": "Torrentio addon installed successfully!", + "success_removed": "Torrentio addon removed successfully", + "alert_disconnect_title": "Disconnect Torbox", + "alert_disconnect_msg": "Are you sure you want to disconnect Torbox? This will remove the addon and clear your saved API key." + }, + "home_screen": { + "title": "Home Screen Settings", + "changes_applied": "Changes Applied", + "display_options": "DISPLAY OPTIONS", + "show_hero": "Show Hero Section", + "show_hero_desc": "Featured content at the top", + "show_this_week": "Show This Week Section", + "show_this_week_desc": "New episodes from current week", + "select_catalogs": "Select Catalogs", + "all_catalogs": "All catalogs", + "selected": "selected", + "hero_layout": "Hero Layout", + "layout_legacy": "Legacy", + "layout_carousel": "Carousel", + "layout_appletv": "Apple TV", + "layout_desc": "Full-width banner, swipeable cards, or Apple TV style", + "featured_source": "Featured Source", + "using_catalogs": "Using Catalogs", + "manage_catalogs": "Manage selected catalogs", + "dynamic_bg": "Dynamic Hero Background", + "dynamic_bg_desc": "Blurred banner behind carousel", + "performance_note": "May impact performance on low-end devices.", + "posters": "Posters", + "show_titles": "Show Titles", + "poster_size": "Poster Size", + "poster_corners": "Poster Corners", + "size_small": "Small", + "size_medium": "Medium", + "size_large": "Large", + "corner_square": "Square", + "corner_rounded": "Rounded", + "corner_pill": "Pill", + "about_title": "ABOUT THESE SETTINGS", + "about_desc": "These settings control how content is displayed on your Home screen. Changes are applied immediately without requiring an app restart." + }, + "mdblist": { + "title": "Rating Sources", + "status_disabled": "MDBList Disabled", + "status_active": "API Key Active", + "status_required": "API Key Required", + "status_disabled_desc": "MDBList functionality is currently disabled.", + "status_active_desc": "Ratings from MDBList are enabled.", + "status_required_desc": "Add your key below to enable ratings.", + "enable_toggle": "Enable MDBList", + "enable_toggle_desc": "Turn on/off all MDBList functionality", + "api_section": "API Key", + "placeholder": "Paste your MDBList API key", + "save": "Save", + "clear": "Clear Key", + "rating_providers": "Rating Providers", + "rating_providers_desc": "Choose which ratings to display in the app", + "how_to": "How to get an API key", + "step_1": "Log in on the", + "step_1_link": "MDBList website", + "step_2": "Go to", + "step_2_settings": "Settings", + "step_2_api": "API", + "step_2_end": "section.", + "step_3": "Generate a new key and copy it.", + "go_to_website": "Go to MDBList", + "alert_clear_title": "Clear API Key", + "alert_clear_msg": "Are you sure you want to remove the saved API key?", + "success_saved": "API key saved successfully.", + "error_empty": "API Key cannot be empty.", + "error_save": "An error occurred while saving. Please try again.", + "api_key_empty_error": "API Key cannot be empty.", + "success_cleared": "API key cleared successfully", + "error_clear": "Failed to clear API key" + }, + "notification": { + "title": "Notification Settings", + "section_general": "General", + "enable_notifications": "Enable Notifications", + "section_types": "Notification Types", + "new_episodes": "New Episodes", + "upcoming_shows": "Upcoming Shows", + "reminders": "Reminders", + "section_timing": "Notification Timing", + "timing_desc": "When should you be notified before an episode airs?", + "hours_1": "1 hour", + "hours_suffix": "hours", + "section_status": "Notification Status", + "stats_upcoming": "Upcoming", + "stats_this_week": "This Week", + "stats_total": "Total", + "sync_button": "Sync Library & Trakt", + "syncing": "Syncing...", + "sync_desc": "Automatically syncs notifications for all shows in your library and Trakt watchlist/collection.", + "section_advanced": "Advanced", + "reset_button": "Reset All Notifications", + "test_button": "Test Notification (5 sec)", + "test_notification_in": "Notification in {{seconds}}s...", + "test_notification_text": "Notification will appear in {{seconds}} seconds", + "alert_reset_title": "Reset Notifications", + "alert_reset_msg": "This will cancel all scheduled notifications, but will not remove anything from your saved library. Are you sure?", + "alert_reset_success": "All notifications have been reset", + "alert_sync_complete": "Sync Complete", + "alert_sync_msg": "Successfully synced notifications for your library and Trakt items.\n\nScheduled: {{upcoming}} upcoming episodes\nThis week: {{thisWeek}} episodes", + "alert_test_scheduled": "Test notification scheduled to fire instantly" + }, + "player": { + "title": "Video Player", + "section_selection": "PLAYER SELECTION", + "internal_title": "Built-in Player", + "internal_desc": "Use the app's default video player", + "vlc_title": "VLC", + "vlc_desc": "Open streams in VLC media player", + "infuse_title": "Infuse", + "infuse_desc": "Open streams in Infuse player", + "outplayer_title": "OutPlayer", + "outplayer_desc": "Open streams in OutPlayer", + "vidhub_title": "VidHub", + "vidhub_desc": "Open streams in VidHub player", + "infuse_live_title": "Infuse Livecontainer", + "infuse_live_desc": "Open streams in Infuse player LiveContainer", + "external_title": "External Player", + "external_desc": "Open streams in your preferred video player", + "section_playback": "PLAYBACK OPTIONS", + "autoplay_title": "Auto-play Best Stream", + "autoplay_desc": "Automatically start the highest quality stream available.", + "resume_title": "Always Resume", + "resume_desc": "Skip the resume prompt and automatically continue where you left off (if less than 85% watched).", + "engine_title": "Video Player Engine", + "engine_desc": "Auto uses ExoPlayer with MPV fallback. Some formats like Dolby Vision and HDR may not be supported by MPV, so Auto is recommended for best compatibility.", + "decoder_title": "Decoder Mode", + "decoder_desc": "How video is decoded. Auto is recommended for best balance.", + "gpu_title": "GPU Rendering", + "gpu_desc": "GPU-Next offers better HDR and color management.", + "external_downloads_title": "External Player for Downloads", + "external_downloads_desc": "Play downloaded content in your preferred external player.", + "restart_required": "Restart Required", + "restart_msg_decoder": "Please restart the app for the decoder change to take effect.", + "restart_msg_gpu": "Please restart the app for the GPU mode change to take effect." + }, + "plugins": { + "title": "Plugins", + "enable_title": "Enable Plugins", + "enable_desc": "Allow the app to use installed plugins for finding streams", + "repo_config_title": "Repository Configuration", + "repo_config_desc": "Enable multiple repositories to combine plugins from different sources. Toggle each repository on or off below.", + "your_repos": "Your Repositories", + "your_repos_desc": "Enable multiple repositories to combine plugins from different sources.", + "add_repo_button": "Add Repository", + "refresh": "Refresh", + "remove": "Remove", + "enabled": "Enabled", + "disabled": "Disabled", + "updating": "Updating...", + "success": "Success", + "error": "Error", + "alert_repo_added": "Repository added and plugins loaded successfully", + "alert_repo_saved": "Repository URL saved successfully", + "alert_repo_refreshed": "Repository refreshed successfully with latest files", + "alert_invalid_url": "Invalid URL Format", + "alert_plugins_cleared": "All plugins have been removed", + "alert_cache_cleared": "Repository cache cleared successfully", + "unknown": "Unknown", + "active": "Active", + "available": "Available", + "platform_disabled": "Platform Disabled", + "limited": "Limited", + "clear_all": "Clear All Plugins", + "clear_all_desc": "Are you sure you want to remove all installed plugins? This action cannot be undone.", + "clear_cache": "Clear Repository Cache", + "clear_cache_desc": "This will remove the saved repository URL and clear all cached plugin data. You will need to re-enter your repository URL." } } \ No newline at end of file diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index 496f5e3..c535f20 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -139,6 +139,321 @@ "external_first_desc": "Preferir legendas de addons, depois embutidas", "any_available": "Qualquer Disponível", "any_available_desc": "Usar primeira legenda disponível" - } + }, + "trakt": "Trakt", + "clear_data": "Limpar Todos os Dados", + "clear_data_desc": "Isso redefinirá todas as configurações e limpará todos os dados em cache. Você tem certeza?", + "app_updates": "Atualizações do App", + "about_nuvio": "Sobre o Nuvio" + }, + "ai_settings": { + "title": "Assistente IA", + "info_title": "Chat com IA", + "info_desc": "Faça perguntas sobre qualquer filme ou episódio usando IA avançada. Obtenha insights sobre enredo, personagens, temas, curiosidades e muito mais - tudo alimentado por dados abrangentes do TMDB.", + "feature_1": "Contexto e análise específica de episódios", + "feature_2": "Explicações de enredo e insights de personagens", + "feature_3": "Curiosidades e fatos de bastidores", + "feature_4": "Sua própria chave gratuita OpenRouter", + "api_key_section": "CHAVE API OPENROUTER", + "api_key_label": "Chave API", + "api_key_desc": "Digite sua chave OpenRouter para habilitar recursos de chat IA", + "save_api_key": "Salvar Chave API", + "saving": "Salvando...", + "update": "Atualizar", + "remove": "Remover", + "get_free_key": "Obter Chave Gratuita no OpenRouter", + "enable_chat": "Habilitar Chat IA", + "enable_chat_desc": "Quando habilitado, o botão Perguntar IA aparecerá nas páginas de conteúdo.", + "chat_enabled": "Chat IA Habilitado", + "chat_enabled_desc": "Você agora pode fazer perguntas sobre filmes e séries. Procure o botão \"Perguntar IA\" nas páginas de conteúdo!", + "how_it_works": "Como funciona", + "how_it_works_desc": "• OpenRouter fornece acesso a múltiplos modelos IA\n• Sua chave API permanece privada e segura\n• Camada gratuita inclui limites generosos de uso\n• Chat com contexto sobre episódios/filmes específicos\n• Obtenha análises detalhadas e explicações", + "error_invalid_key": "Por favor, digite uma chave API válida", + "error_key_format": "Chaves API OpenRouter devem começar com \"sk-or-\"", + "success_saved": "Chave API OpenRouter salva com sucesso!", + "error_save": "Falha ao salvar chave API", + "confirm_remove_title": "Remover Chave API", + "confirm_remove_msg": "Tem certeza que deseja remover sua chave API OpenRouter? Isso desativará os recursos de chat IA.", + "success_removed": "Chave API removida com sucesso", + "error_remove": "Falha ao remover chave API" + }, + "catalog_settings": { + "title": "Catálogos", + "layout_phone": "LAYOUT DE CATÁLOGOS (CELULAR)", + "posters_per_row": "Pôsteres por linha", + "auto": "Auto", + "show_titles": "Mostrar Títulos", + "show_titles_desc": "Exibir título abaixo de cada pôster", + "phone_only_hint": "Aplica-se apenas a celulares. Tablets mantêm layout adaptativo.", + "catalogs_group": "Catálogos", + "enabled_count": "{{enabled}} de {{total}} habilitados", + "rename_hint": "Pressione e segure um catálogo para renomear", + "rename_modal_title": "Renomear Catálogo", + "rename_placeholder": "Digite o novo nome do catálogo", + "error_save_name": "Não foi possível salvar o nome personalizado." + }, + "continue_watching_settings": { + "title": "Continuar Assistindo", + "playback_behavior": "COMPORTAMENTO DE REPRODUÇÃO", + "use_cached": "Usar Streams em Cache", + "use_cached_desc": "Quando habilitado, clicar em itens de Continuar Assistindo abrirá o player diretamente usando streams reproduzidos anteriormente. Quando desabilitado, abre uma tela de conteúdo.", + "open_metadata": "Abrir Tela de Metadados", + "open_metadata_desc": "Quando streams em cache estão desabilitados, abre a tela de Metadados em vez da tela de Streams. Isso mostra detalhes do conteúdo e permite seleção manual de streams.", + "card_appearance": "APARÊNCIA DO CARD", + "card_style": "Estilo do Card", + "card_style_desc": "Escolha como os itens de Continuar Assistindo aparecem na tela inicial", + "wide": "Largo", + "poster": "Pôster", + "cache_settings": "CONFIGURAÇÕES DE CACHE", + "cache_duration": "Duração do Cache de Stream", + "cache_duration_desc": "Por quanto tempo manter links de stream em cache antes de expirarem", + "important_note": "Nota Importante", + "important_note_text": "Nem todos os links de stream permanecem ativos por toda a duração do cache. Tempos de cache mais longos podem resultar em links expirados. Se um link em cache falhar, o app buscará novos streams.", + "how_it_works": "Como funciona", + "how_it_works_cached": "• Streams são armazenados em cache pela duração selecionada após a reprodução\n• Streams em cache são validados antes do uso\n• Se o cache for inválido ou expirado, volta para a tela de conteúdo\n• \"Usar Streams em Cache\" controla player direto vs navegação de tela\n• \"Abrir Tela de Metadados\" aparece apenas quando streams em cache estão desabilitados", + "how_it_works_uncached": "• Quando streams em cache estão desabilitados, clicar em itens de Continuar Assistindo abre telas de conteúdo\n• A opção \"Abrir Tela de Metadados\" controla qual tela abrir\n• A tela de Metadados mostra detalhes do conteúdo e permite seleção manual de streams\n• A tela de Streams mostra streams disponíveis para reprodução imediata", + "changes_saved": "Alterações salvas", + "min": "min", + "hour": "hora", + "sponsor_desc": "Patrocinou a infraestrutura do servidor para o Nuvio", + "mod_role": "Moderador do Discord", + "mod_desc": "Ajuda a moderar a comunidade do Nuvio no Discord", + "loading": "Carregando...", + "discord_user": "Usuário do Discord", + "contributions": "contribuições", + "gratitude_title": "Somos gratos por cada contribuição", + "gratitude_desc": "Cada linha de código, relatório de bug e sugestão ajuda a tornar o Nuvio melhor para todos", + "special_thanks_title": "Agradecimentos Especiais", + "special_thanks_desc": "Essas pessoas incríveis ajudam a manter a comunidade Nuvio funcionando e os servidores online", + "error_rate_limit": "Limite de taxa da API do GitHub excedido. Tente novamente mais tarde.", + "error_failed": "Falha ao carregar colaboradores. Verifique sua conexão com a internet.", + "retry": "Tentar Novamente", + "no_contributors": "Nenhum colaborador encontrado", + "loading_contributors": "Carregando colaboradores..." + }, + "debrid": { + "title": "Integração Debrid", + "description_torbox": "Desbloqueie streams 4K de alta qualidade e velocidades ultra-rápidas integrando o Torbox. Insira sua chave API abaixo para atualizar instantaneamente sua experiência de streaming.", + "description_torrentio": "Configure o Torrentio para obter streams de torrent para filmes e séries. Um serviço debrid é necessário para transmitir conteúdo.", + "tab_torbox": "TorBox", + "tab_torrentio": "Torrentio", + "status_connected": "Conectado", + "status_disconnected": "Desconectado", + "enable_addon": "Ativar Addon", + "disconnect_button": "Desconectar e Remover", + "disconnect_loading": "Desconectando...", + "account_info": "Informações da Conta", + "plan": "Plano", + "plan_free": "Grátis", + "plan_essential": "Essencial ($3/mês)", + "plan_pro": "Pro ($10/mês)", + "plan_standard": "Padrão ($5/mês)", + "plan_unknown": "Desconhecido", + "expires": "Expira em", + "downloaded": "Baixado", + "status_active": "Ativo", + "connected_title": "✓ Conectado ao TorBox", + "connected_desc": "Seu addon TorBox está ativo e fornecendo streams premium.", + "configure_title": "Configurar Addon", + "configure_desc": "Personalize sua experiência. Ordene por qualidade, filtre tamanhos de arquivo e gerencie outras configurações.", + "open_settings": "Abrir Configurações", + "what_is_debrid": "O que é um Serviço Debrid?", + "enter_api_key": "Insira sua Chave API", + "connect_button": "Conectar e Instalar", + "connecting": "Conectando...", + "unlock_speeds_title": "Velocidades Premium", + "unlock_speeds_desc": "Assine o Torbox para acessar streams em cache de alta qualidade com zero buffering.", + "get_subscription": "Obter Assinatura", + "powered_by": "Desenvolvido por", + "disclaimer_torbox": "O Nuvio não é afiliado ao Torbox de nenhuma forma.", + "disclaimer_torrentio": "O Nuvio não é afiliado ao Torrentio de nenhuma forma.", + "installed_badge": "✓ INSTALADO", + "promo_title": "⚡ Precisa de um Serviço Debrid?", + "promo_desc": "Obtenha o TorBox para streaming 4K ultra-rápido com zero buffering. Torrents em cache premium e downloads instantâneos.", + "promo_button": "Assinar TorBox", + "service_label": "Serviço Debrid *", + "api_key_label": "Chave API *", + "sorting_label": "Ordenação", + "exclude_qualities": "Excluir Qualidades", + "priority_languages": "Idiomas Prioritários", + "max_results": "Máx. Resultados", + "additional_options": "Opções Adicionais", + "no_download_links": "Não mostrar links de download", + "no_debrid_catalog": "Não mostrar catálogo debrid", + "install_button": "Instalar Torrentio", + "installing": "Instalando...", + "update_button": "Atualizar Configuração", + "updating": "Atualizando...", + "remove_button": "Remover Torrentio", + "error_api_required": "Chave API Necessária", + "error_api_required_desc": "Insira a chave API do seu serviço debrid para instalar o Torrentio.", + "success_installed": "Addon Torrentio instalado com sucesso!", + "success_removed": "Addon Torrentio removido com sucesso", + "alert_disconnect_title": "Desconectar Torbox", + "alert_disconnect_msg": "Tem certeza que deseja desconectar o Torbox? Isso removerá o addon e limpará sua chave API salva." + }, + "home_screen": { + "title": "Configurações da Tela Inicial", + "changes_applied": "Alterações Aplicadas", + "display_options": "OPÇÕES DE EXIBIÇÃO", + "show_hero": "Mostrar Seção Hero", + "show_hero_desc": "Conteúdo em destaque no topo", + "show_this_week": "Mostrar Seção Desta Semana", + "show_this_week_desc": "Novos episódios da semana atual", + "select_catalogs": "Selecionar Catálogos", + "all_catalogs": "Todos os catálogos", + "selected": "selecionados", + "hero_layout": "Layout do Hero", + "layout_legacy": "Legado", + "layout_carousel": "Carrossel", + "layout_appletv": "Apple TV", + "layout_desc": "Banner largura total, cartões deslizantes ou estilo Apple TV", + "featured_source": "Fonte de Destaques", + "using_catalogs": "Usando Catálogos", + "manage_catalogs": "Gerenciar catálogos selecionados", + "dynamic_bg": "Fundo Hero Dinâmico", + "dynamic_bg_desc": "Banner desfocado atrás do carrossel", + "performance_note": "Pode impactar o desempenho em dispositivos mais lentos.", + "posters": "Pôsteres", + "show_titles": "Mostrar Títulos", + "poster_size": "Tamanho do Pôster", + "poster_corners": "Cantos do Pôster", + "size_small": "Pequeno", + "size_medium": "Médio", + "size_large": "Grande", + "corner_square": "Quadrado", + "corner_rounded": "Arredondado", + "corner_pill": "Pílula", + "about_title": "SOBRE ESTAS CONFIGURAÇÕES", + "about_desc": "Estas configurações controlam como o conteúdo é exibido na sua tela inicial. As alterações são aplicadas imediatamente sem reiniciar o app." + }, + "mdblist": { + "title": "Fontes de Avaliação", + "status_disabled": "MDBList Desativado", + "status_active": "Chave de API Ativa", + "status_required": "Chave de API Necessária", + "status_disabled_desc": "A funcionalidade MDBList está atualmente desativada.", + "status_active_desc": "As avaliações do MDBList estão ativadas.", + "status_required_desc": "Adicione sua chave abaixo para ativar as avaliações.", + "enable_toggle": "Ativar MDBList", + "enable_toggle_desc": "Ligar/desligar toda a funcionalidade do MDBList", + "api_section": "Chave de API", + "placeholder": "Cole sua chave de API MDBList", + "save": "Salvar", + "clear": "Limpar Chave", + "rating_providers": "Provedores de Avaliação", + "rating_providers_desc": "Escolha quais avaliações exibir no aplicativo", + "how_to": "Como obter uma chave de API", + "step_1": "Faça login no", + "step_1_link": "site do MDBList", + "step_2": "Vá para a seção", + "step_2_settings": "Configurações", + "step_2_api": "API", + "step_2_end": ".", + "step_3": "Gere uma nova chave e copie-a.", + "go_to_website": "Ir para o MDBList", + "alert_clear_title": "Limpar Chave de API", + "alert_clear_msg": "Tem certeza de que deseja remover a chave de API salva?", + "success_saved": "Chave de API salva com sucesso.", + "error_empty": "Chave API não pode estar vazia.", + "error_save": "Ocorreu um erro ao salvar. Por favor, tente novamente.", + "api_key_empty_error": "A Chave de API não pode estar vazia.", + "success_cleared": "Chave de API limpa com sucesso", + "error_clear": "Falha ao limpar a chave de API" + }, + "notification": { + "title": "Configurações de Notificação", + "section_general": "Geral", + "enable_notifications": "Ativar Notificações", + "section_types": "Tipos de Notificação", + "new_episodes": "Novos Episódios", + "upcoming_shows": "Próximos Programas", + "reminders": "Lembretes", + "section_timing": "Tempo de Notificação", + "timing_desc": "Quanto tempo antes de um episódio ir ao ar você deve ser notificado?", + "hours_1": "1 hora", + "hours_suffix": "horas", + "section_status": "Status da Notificação", + "stats_upcoming": "Próximos", + "stats_this_week": "Esta Semana", + "stats_total": "Total", + "sync_button": "Sincronizar Biblioteca e Trakt", + "syncing": "Sincronizando...", + "sync_desc": "Sincroniza automaticamente notificações para todos os programas na sua biblioteca e watchlist/coleção do Trakt.", + "section_advanced": "Avançado", + "reset_button": "Redefinir Todas as Notificações", + "test_button": "Notificação de Teste (5 seg)", + "test_notification_in": "Notificação em {{seconds}}s...", + "test_notification_text": "A notificação aparecerá em {{seconds}} segundos", + "alert_reset_title": "Redefinir Notificações", + "alert_reset_msg": "Isso cancelará todas as notificações agendadas, mas não removerá nada da sua biblioteca salva. Tem certeza?", + "alert_reset_success": "Todas as notificações foram redefinidas", + "alert_sync_complete": "Sincronização Completa", + "alert_sync_msg": "Notificações sincronizadas com sucesso para sua biblioteca e itens do Trakt.\n\nAgendadas: {{upcoming}} próximos episódios\nEsta semana: {{thisWeek}} episódios", + "alert_test_scheduled": "Notificação de teste agendada para disparar instantaneamente" + }, + "player": { + "title": "Player de Vídeo", + "section_selection": "SELEÇÃO DE PLAYER", + "internal_title": "Player Integrado", + "internal_desc": "Usar o player de vídeo padrão do aplicativo", + "vlc_title": "VLC", + "vlc_desc": "Abrir streams no player de mídia VLC", + "infuse_title": "Infuse", + "infuse_desc": "Abrir streams no player Infuse", + "outplayer_title": "OutPlayer", + "outplayer_desc": "Abrir streams no OutPlayer", + "vidhub_title": "VidHub", + "vidhub_desc": "Abrir streams no player VidHub", + "infuse_live_title": "Infuse Livecontainer", + "infuse_live_desc": "Abrir streams no player Infuse LiveContainer", + "external_title": "Player Externo", + "external_desc": "Abrir streams no seu player de vídeo preferido", + "section_playback": "OPÇÕES DE REPRODUÇÃO", + "autoplay_title": "Reprodução Automática (Melhor Stream)", + "autoplay_desc": "Iniciar automaticamente o stream de melhor qualidade disponível.", + "resume_title": "Sempre Retomar", + "resume_desc": "Pular o aviso de retomar e continuar automaticamente de onde parou (se assistido menos de 85%).", + "engine_title": "Motor do Player de Vídeo", + "engine_desc": "Auto usa ExoPlayer com fallback para MPV. Alguns formatos como Dolby Vision e HDR podem não ser suportados pelo MPV, então Auto é recomendado para melhor compatibilidade.", + "decoder_title": "Modo de Decodificador", + "decoder_desc": "Como o vídeo é decodificado. Auto é recomendado para melhor equilíbrio.", + "gpu_title": "Renderização GPU", + "gpu_desc": "GPU-Next oferece melhor HDR e gerenciamento de cores.", + "external_downloads_title": "Player Externo para Downloads", + "external_downloads_desc": "Reproduzir conteúdo baixado no seu player externo preferido.", + "restart_required": "Reinicialização Necessária" + }, + "plugins": { + "title": "Plugins", + "enable_title": "Ativar Plugins", + "enable_desc": "Permitir que o aplicativo use plugins instalados para encontrar transmissões", + "repo_config_title": "Configuração de Repositório", + "repo_config_desc": "Ative vários repositórios para combinar plugins de diferentes fontes. Ative ou desative cada repositório abaixo.", + "your_repos": "Seus Repositórios", + "your_repos_desc": "Ative vários repositórios para combinar plugins de diferentes fontes.", + "add_repo_button": "Adicionar Repositório", + "refresh": "Atualizar", + "remove": "Remover", + "enabled": "Ativado", + "disabled": "Desativado", + "updating": "Atualizando...", + "success": "Sucesso", + "error": "Erro", + "alert_repo_added": "Repositório adicionado e plugins carregados com sucesso", + "alert_repo_saved": "URL do repositório salvo com sucesso", + "alert_repo_refreshed": "Repositório atualizado com sucesso com arquivos mais recentes", + "alert_invalid_url": "Formato de URL inválido", + "alert_plugins_cleared": "Todos os plugins foram removidos", + "alert_cache_cleared": "Cache do repositório limpo com sucesso", + "unknown": "Desconhecido", + "active": "Ativo", + "available": "Disponível", + "platform_disabled": "Plataforma Desativada", + "limited": "Limitado", + "clear_all": "Limpar Todos os Plugins", + "clear_all_desc": "Você tem certeza de que deseja remover todos os plugins instalados? Esta ação não pode ser desfeita.", + "clear_cache": "Limpar Cache do Repositório", + "clear_cache_desc": "Isso removerá a URL do repositório salva e limpará todos os dados de plugins armazenados em cache. Você precisará digitar a URL do repositório novamente." } } \ No newline at end of file diff --git a/src/screens/AISettingsScreen.tsx b/src/screens/AISettingsScreen.tsx index d73a51c..251134a 100644 --- a/src/screens/AISettingsScreen.tsx +++ b/src/screens/AISettingsScreen.tsx @@ -21,11 +21,13 @@ import { useTheme } from '../contexts/ThemeContext'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useSettings } from '../hooks/useSettings'; import { SvgXml } from 'react-native-svg'; +import { useTranslation } from 'react-i18next'; const { width } = Dimensions.get('window'); const isTablet = width >= 768; const AISettingsScreen: React.FC = () => { + const { t } = useTranslation(); // CustomAlert state (must be inside the component) const [alertVisible, setAlertVisible] = useState(false); const [alertTitle, setAlertTitle] = useState(''); @@ -69,7 +71,7 @@ const AISettingsScreen: React.FC = () => { `; - + const [apiKey, setApiKey] = useState(''); const [loading, setLoading] = useState(false); const [isKeySet, setIsKeySet] = useState(false); @@ -92,12 +94,12 @@ const AISettingsScreen: React.FC = () => { const handleSaveApiKey = async () => { if (!apiKey.trim()) { - openAlert('Error', 'Please enter a valid API key'); + openAlert(t('common.error'), t('ai_settings.error_invalid_key')); return; } if (!apiKey.startsWith('sk-or-')) { - openAlert('Error', 'OpenRouter API keys should start with "sk-or-"'); + openAlert(t('common.error'), t('ai_settings.error_key_format')); return; } @@ -105,9 +107,9 @@ const AISettingsScreen: React.FC = () => { try { await mmkvStorage.setItem('openrouter_api_key', apiKey.trim()); setIsKeySet(true); - openAlert('Success', 'OpenRouter API key saved successfully!'); + openAlert(t('common.success'), t('ai_settings.success_saved')); } catch (error) { - openAlert('Error', 'Failed to save API key'); + openAlert(t('common.error'), t('ai_settings.error_save')); if (__DEV__) console.error('Error saving OpenRouter API key:', error); } finally { setLoading(false); @@ -116,10 +118,10 @@ const AISettingsScreen: React.FC = () => { const handleRemoveApiKey = () => { openAlert( - 'Remove API Key', - 'Are you sure you want to remove your OpenRouter API key? This will disable AI chat features.', + t('ai_settings.confirm_remove_title'), + t('ai_settings.confirm_remove_msg'), [ - { label: 'Cancel', onPress: () => {} }, + { label: t('common.cancel'), onPress: () => { } }, { label: 'Remove', onPress: async () => { @@ -127,9 +129,9 @@ const AISettingsScreen: React.FC = () => { await mmkvStorage.removeItem('openrouter_api_key'); setApiKey(''); setIsKeySet(false); - openAlert('Success', 'API key removed successfully'); + openAlert(t('common.success'), t('ai_settings.success_removed')); } catch (error) { - openAlert('Error', 'Failed to remove API key'); + openAlert(t('common.error'), t('ai_settings.error_remove')); } } } @@ -142,35 +144,35 @@ const AISettingsScreen: React.FC = () => { }; return ( - + - + {/* Header */} - navigation.goBack()} style={styles.backButton} > - - Settings + {t('settings.settings_title')} - + {/* Empty for now, but ready for future actions */} - + - AI Assistant + {t('ai_settings.title')} - { {/* Info Card */} - - AI-Powered Chat + {t('ai_settings.info_title')} - Ask questions about any movie or TV show episode using advanced AI. Get insights about plot, characters, themes, trivia, and more - all powered by comprehensive TMDB data. + {t('ai_settings.info_desc')} - + - Episode-specific context and analysis + {t('ai_settings.feature_1')} - Plot explanations and character insights + {t('ai_settings.feature_2')} - Behind-the-scenes trivia and facts + {t('ai_settings.feature_3')} - Your own free OpenRouter API key + {t('ai_settings.feature_4')} @@ -222,21 +224,21 @@ const AISettingsScreen: React.FC = () => { {/* API Key Configuration */} - OPENROUTER API KEY + {t('ai_settings.api_key_section')} - + - API Key + {t('ai_settings.api_key_label')} - Enter your OpenRouter API key to enable AI chat features + {t('ai_settings.api_key_desc')} - + { onPress={handleSaveApiKey} disabled={loading} > - - {loading ? 'Saving...' : 'Save API Key'} + {loading ? t('ai_settings.saving') : t('ai_settings.save_api_key')} ) : ( @@ -275,27 +277,27 @@ const AISettingsScreen: React.FC = () => { onPress={handleSaveApiKey} disabled={loading} > - - Update + {t('ai_settings.update')} - + - - Remove + {t('ai_settings.remove')} @@ -306,23 +308,23 @@ const AISettingsScreen: React.FC = () => { style={[styles.getKeyButton, { backgroundColor: currentTheme.colors.elevation2 }]} onPress={handleGetApiKey} > - - Get Free API Key from OpenRouter + {t('ai_settings.get_free_key')} {/* Enable Toggle (top) */} - + - Enable AI Chat + {t('ai_settings.enable_chat')} updateSetting('aiChatEnabled', v)} @@ -331,24 +333,24 @@ const AISettingsScreen: React.FC = () => { ios_backgroundColor={currentTheme.colors.elevation2} /> - When enabled, the Ask AI button will appear on content pages. + {t('ai_settings.enable_chat_desc')} {/* Status Card */} {isKeySet && ( - - AI Chat Enabled + {t('ai_settings.chat_enabled')} - You can now ask questions about movies and TV shows. Look for the "Ask AI" button on content pages! + {t('ai_settings.chat_enabled_desc')} )} @@ -356,14 +358,10 @@ const AISettingsScreen: React.FC = () => { {/* Usage Info */} - How it works + {t('ai_settings.how_it_works')} - • OpenRouter provides access to multiple AI models{'\n'} - • Your API key stays private and secure{'\n'} - • Free tier includes generous usage limits{'\n'} - • Chat with context about specific episodes/movies{'\n'} - • Get detailed analysis and explanations + {t('ai_settings.how_it_works_desc')} {/* OpenRouter branding */} diff --git a/src/screens/AddonsScreen.tsx b/src/screens/AddonsScreen.tsx index 8ee6322..15c2db1 100644 --- a/src/screens/AddonsScreen.tsx +++ b/src/screens/AddonsScreen.tsx @@ -664,9 +664,9 @@ const AddonsScreen = () => { setAlertVisible(true); } catch (error) { logger.error('Failed to install addon:', error); - setAlertTitle('Error'); - setAlertMessage('Failed to install addon'); - setAlertActions([{ label: 'OK', onPress: () => setAlertVisible(false) }]); + setAlertTitle(t('common.error')); + setAlertMessage(t('addons.install_error')); + setAlertActions([{ label: t('common.ok'), onPress: () => setAlertVisible(false) }]); setAlertVisible(true); } finally { setInstalling(false); @@ -909,7 +909,7 @@ const AddonsScreen = () => { )} - v{item.version || '1.0.0'} + {t('addons.version', { version: item.version || '1.0.0' })} {categoryText} @@ -967,7 +967,7 @@ const AddonsScreen = () => { onPress={() => navigation.goBack()} > - Settings + {t('settings.settings_title')} @@ -1027,18 +1027,18 @@ const AddonsScreen = () => { OVERVIEW - + - + - + {/* Hide Add Addon Section in reorder mode */} {!reorderMode && ( - ADD NEW ADDON + {t('addons.add_button').toUpperCase()} { disabled={installing || !addonUrl} > - {installing ? 'Loading...' : t('addons.add_button')} + {installing ? t('common.loading') : t('addons.add_button')} @@ -1115,7 +1115,7 @@ const AddonsScreen = () => { {addonDetails && ( <> - Install Addon + {t('addons.install')} { setShowConfirmModal(false); @@ -1145,7 +1145,7 @@ const AddonsScreen = () => { )} {addonDetails.name} - v{addonDetails.version || '1.0.0'} + {t('addons.version', { version: addonDetails.version || '1.0.0' })} diff --git a/src/screens/CatalogSettingsScreen.tsx b/src/screens/CatalogSettingsScreen.tsx index 3c15dfe..320d725 100644 --- a/src/screens/CatalogSettingsScreen.tsx +++ b/src/screens/CatalogSettingsScreen.tsx @@ -25,6 +25,7 @@ import { logger } from '../utils/logger'; import { clearCustomNameCache } from '../utils/catalogNameUtils'; import { BlurView } from 'expo-blur'; import CustomAlert from '../components/CustomAlert'; +import { useTranslation } from 'react-i18next'; // Optional iOS Glass effect (expo-glass-effect) with safe fallback for CatalogSettingsScreen let GlassViewComp: any = null; @@ -275,6 +276,7 @@ const CatalogSettingsScreen = () => { const colors = currentTheme.colors; const styles = createStyles(colors); const isDarkMode = true; // Force dark mode + const { t } = useTranslation(); // Modal State const [isRenameModalVisible, setIsRenameModalVisible] = useState(false); @@ -489,9 +491,9 @@ const CatalogSettingsScreen = () => { } catch (error) { logger.error('Failed to save custom catalog name:', error); - setAlertTitle('Error'); - setAlertMessage('Could not save the custom name.'); - setAlertActions([{ label: 'OK', onPress: () => { } }]); + setAlertTitle(t('common.error')); + setAlertMessage(t('catalog_settings.error_save_name')); + setAlertActions([{ label: t('common.ok'), onPress: () => { } }]); setAlertVisible(true); } finally { setIsRenameModalVisible(false); @@ -514,10 +516,10 @@ const CatalogSettingsScreen = () => { onPress={() => navigation.goBack()} > - Settings + {t('settings.settings_title')} - Catalogs + {t('catalog_settings.title')} @@ -534,19 +536,19 @@ const CatalogSettingsScreen = () => { onPress={() => navigation.goBack()} > - Settings + {t('settings.settings_title')} - Catalogs + {t('catalog_settings.title')} {/* Layout (Mobile only) */} {Platform.OS && ( - LAYOUT CATALOGSCREEN (PHONE) + {t('catalog_settings.layout_phone')} - Posters per row + {t('catalog_settings.posters_per_row')} {/* Only show on phones (approx width < 600) */} @@ -561,7 +563,7 @@ const CatalogSettingsScreen = () => { }} activeOpacity={0.7} > - Auto + {t('catalog_settings.auto')} { - Applies to phones only. Tablets keep adaptive layout. + {t('catalog_settings.phone_only_hint')} {/* Show Titles Toggle */} - Show Poster Titles - Display title text below each poster + {t('catalog_settings.show_titles')} + {t('catalog_settings.show_titles_desc')} { onPress={() => toggleExpansion(addonId)} activeOpacity={0.7} > - Catalogs + {t('catalog_settings.catalogs_group')} - {group.enabledCount} of {group.catalogs.length} enabled + {t('catalog_settings.enabled_count', { enabled: group.enabledCount, total: group.catalogs.length })} { <> - Long-press a catalog to rename + {t('catalog_settings.rename_hint')} {group.catalogs.map((setting, index) => ( { {GlassViewComp && liquidGlassAvailable ? ( e.stopPropagation()}> - Rename Catalog + {t('catalog_settings.rename_modal_title')} -