diff --git a/android/app/build.gradle b/android/app/build.gradle
index 9590358c..002dd38a 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -94,11 +94,50 @@ android {
applicationId 'com.nuvio.app'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 19
- versionName "1.2.4"
+ versionCode 20
+ versionName "1.2.5"
buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\""
}
+
+ // Split APKs by architecture and density for smaller downloads
+ splits {
+ abi {
+ enable true
+ reset()
+ include "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
+ universalApk true // Generate universal APK as well
+ }
+ density {
+ enable true
+ reset()
+ include "ldpi", "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
+ universalApk true // Generate universal APK as well
+ }
+ }
+
+ // Generate unique version codes for each split APK
+ def abiVersionCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
+ def densityVersionCodes = ['ldpi': 1, 'mdpi': 2, 'hdpi': 3, 'xhdpi': 4, 'xxhdpi': 5, 'xxxhdpi': 6]
+ android.applicationVariants.all { variant ->
+ variant.outputs.each { output ->
+ def baseVersionCode = 19 // Current versionCode 20from defaultConfig
+ def abiName = output.getFilter(com.android.build.OutputFile.ABI)
+ def densityName = output.getFilter(com.android.build.OutputFile.DENSITY)
+
+ def versionCode 20= baseVersionCode * 100 // Base multiplier
+
+ if (abiName != null) {
+ versionCode 20+= abiVersionCodes.get(abiName) * 10
+ }
+
+ if (densityName != null) {
+ versionCode 20+= densityVersionCodes.get(densityName)
+ }
+
+ output.versionCodeOverride = versionCode
+ }
+ }
signingConfigs {
debug {
storeFile file('debug.keystore')
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 8fdc2ab6..08f0025b 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -3,5 +3,5 @@
contain
false
dark
- 1.2.4
+ 1.2.5
\ No newline at end of file
diff --git a/app.json b/app.json
index a2d22456..32a5c291 100644
--- a/app.json
+++ b/app.json
@@ -2,7 +2,7 @@
"expo": {
"name": "Nuvio",
"slug": "nuvio",
- "version": "1.2.4",
+ "version": "1.2.5",
"orientation": "default",
"backgroundColor": "#020404",
"icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png",
@@ -17,7 +17,7 @@
"ios": {
"supportsTablet": true,
"icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png",
- "buildNumber": "19",
+ "buildNumber": "20",
"infoPlist": {
"NSAppTransportSecurity": {
"NSAllowsArbitraryLoads": true
@@ -48,7 +48,7 @@
"WAKE_LOCK"
],
"package": "com.nuvio.app",
- "versionCode": 19,
+ "versionCode": 20,
"architectures": [
"arm64-v8a",
"armeabi-v7a",
@@ -94,6 +94,6 @@
"fallbackToCacheTimeout": 30000,
"url": "https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest"
},
- "runtimeVersion": "1.2.4"
+ "runtimeVersion": "1.2.5"
}
}
diff --git a/ios/Nuvio.xcodeproj/project.pbxproj b/ios/Nuvio.xcodeproj/project.pbxproj
index 1c107f7d..b562e963 100644
--- a/ios/Nuvio.xcodeproj/project.pbxproj
+++ b/ios/Nuvio.xcodeproj/project.pbxproj
@@ -25,9 +25,10 @@
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Nuvio/Images.xcassets; sourceTree = ""; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Nuvio/Info.plist; sourceTree = ""; };
2DDA95A7458A78E817D9496D /* libPods-Nuvio.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuvio.a"; sourceTree = BUILT_PRODUCTS_DIR; };
- 49055D6E250FAFA21141FE49 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Nuvio/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 49055D6E250FAFA21141FE49 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Nuvio/PrivacyInfo.xcprivacy; sourceTree = ""; };
6E0017E5203955A430ABF21B /* Pods-Nuvio.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuvio.release.xcconfig"; path = "Target Support Files/Pods-Nuvio/Pods-Nuvio.release.xcconfig"; sourceTree = ""; };
6E007C0BAC8C453623E81663 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Nuvio/ExpoModulesProvider.swift"; sourceTree = ""; };
+ 73BB213C2E9EEAC700EC03F8 /* NuvioRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = NuvioRelease.entitlements; path = Nuvio/NuvioRelease.entitlements; sourceTree = ""; };
9FBA88F02E86ECD700892850 /* KSPlayerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSPlayerManager.m; sourceTree = ""; };
9FBA88F12E86ECD700892850 /* KSPlayerModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerModule.swift; sourceTree = ""; };
9FBA88F22E86ECD700892850 /* KSPlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerView.swift; sourceTree = ""; };
@@ -55,6 +56,7 @@
13B07FAE1A68108700A75B9A /* Nuvio */ = {
isa = PBXGroup;
children = (
+ 73BB213C2E9EEAC700EC03F8 /* NuvioRelease.entitlements */,
F11748412D0307B40044C1D9 /* AppDelegate.swift */,
F11748442D0722820044C1D9 /* Nuvio-Bridging-Header.h */,
9FBA88F02E86ECD700892850 /* KSPlayerManager.m */,
@@ -132,7 +134,6 @@
BD6015E69A4861CCBD3C1D39 /* Pods-Nuvio.debug.xcconfig */,
6E0017E5203955A430ABF21B /* Pods-Nuvio.release.xcconfig */,
);
- name = Pods;
path = Pods;
sourceTree = "";
};
@@ -440,6 +441,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements;
CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = NLXTHANK2N;
ENABLE_BITCODE = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
@@ -458,7 +460,7 @@
"-lc++",
);
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
- PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.nuvio.app";
PRODUCT_NAME = "Nuvio";
SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -474,8 +476,9 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements;
+ CODE_SIGN_ENTITLEMENTS = Nuvio/NuvioRelease.entitlements;
CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = NLXTHANK2N;
INFOPLIST_FILE = Nuvio/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
@@ -489,7 +492,7 @@
"-lc++",
);
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
- PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.nuvio.app";
PRODUCT_NAME = "Nuvio";
SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
SWIFT_VERSION = 5.0;
diff --git a/ios/Nuvio/Info.plist b/ios/Nuvio/Info.plist
index ffd3ebb3..d701baa9 100644
--- a/ios/Nuvio/Info.plist
+++ b/ios/Nuvio/Info.plist
@@ -19,7 +19,7 @@
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
- 1.2.4
+ 1.2.5
CFBundleSignature
????
CFBundleURLTypes
@@ -39,7 +39,7 @@
CFBundleVersion
- 19
+ 20
LSMinimumSystemVersion
12.0
LSRequiresIPhoneOS
diff --git a/ios/Nuvio/NuvioRelease.entitlements b/ios/Nuvio/NuvioRelease.entitlements
new file mode 100644
index 00000000..a0bc443f
--- /dev/null
+++ b/ios/Nuvio/NuvioRelease.entitlements
@@ -0,0 +1,10 @@
+
+
+
+
+ aps-environment
+ development
+ com.apple.developer.associated-domains
+
+
+
\ No newline at end of file
diff --git a/ios/Nuvio/Supporting/Expo.plist b/ios/Nuvio/Supporting/Expo.plist
index cff0afd5..f325c178 100644
--- a/ios/Nuvio/Supporting/Expo.plist
+++ b/ios/Nuvio/Supporting/Expo.plist
@@ -9,7 +9,7 @@
EXUpdatesLaunchWaitMs
30000
EXUpdatesRuntimeVersion
- 1.2.4
+ 1.2.5
EXUpdatesURL
https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index f855bc88..4e82b521 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -2336,7 +2336,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- - RNReanimated (3.19.3):
+ - RNReanimated (4.1.3):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2358,10 +2358,10 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- - RNReanimated/reanimated (= 3.19.3)
- - RNReanimated/worklets (= 3.19.3)
+ - RNReanimated/reanimated (= 4.1.3)
+ - RNWorklets
- Yoga
- - RNReanimated/reanimated (3.19.3):
+ - RNReanimated/reanimated (4.1.3):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2383,56 +2383,10 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- - RNReanimated/reanimated/apple (= 3.19.3)
+ - RNReanimated/reanimated/apple (= 4.1.3)
+ - RNWorklets
- Yoga
- - RNReanimated/reanimated/apple (3.19.3):
- - hermes-engine
- - RCTRequired
- - RCTTypeSafety
- - React-Core
- - React-Core-prebuilt
- - React-debug
- - React-Fabric
- - React-featureflags
- - React-graphics
- - React-hermes
- - React-ImageManager
- - React-jsi
- - React-NativeModulesApple
- - React-RCTFabric
- - React-renderercss
- - React-rendererdebug
- - React-utils
- - ReactCodegen
- - ReactCommon/turbomodule/bridging
- - ReactCommon/turbomodule/core
- - ReactNativeDependencies
- - Yoga
- - RNReanimated/worklets (3.19.3):
- - hermes-engine
- - RCTRequired
- - RCTTypeSafety
- - React-Core
- - React-Core-prebuilt
- - React-debug
- - React-Fabric
- - React-featureflags
- - React-graphics
- - React-hermes
- - React-ImageManager
- - React-jsi
- - React-NativeModulesApple
- - React-RCTFabric
- - React-renderercss
- - React-rendererdebug
- - React-utils
- - ReactCodegen
- - ReactCommon/turbomodule/bridging
- - ReactCommon/turbomodule/core
- - ReactNativeDependencies
- - RNReanimated/worklets/apple (= 3.19.3)
- - Yoga
- - RNReanimated/worklets/apple (3.19.3):
+ - RNReanimated/reanimated/apple (4.1.3):
- hermes-engine
- RCTRequired
- RCTTypeSafety
@@ -2454,6 +2408,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
+ - RNWorklets
- Yoga
- RNScreens (4.16.0):
- hermes-engine
@@ -2593,6 +2548,77 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
+ - RNWorklets (0.6.1):
+ - hermes-engine
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-Core-prebuilt
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-ImageManager
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-renderercss
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - ReactNativeDependencies
+ - RNWorklets/worklets (= 0.6.1)
+ - Yoga
+ - RNWorklets/worklets (0.6.1):
+ - hermes-engine
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-Core-prebuilt
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-ImageManager
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-renderercss
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - ReactNativeDependencies
+ - RNWorklets/worklets/apple (= 0.6.1)
+ - Yoga
+ - RNWorklets/worklets/apple (0.6.1):
+ - hermes-engine
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-Core-prebuilt
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-ImageManager
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-renderercss
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - ReactNativeDependencies
+ - Yoga
- SDWebImage (5.21.3):
- SDWebImage/Core (= 5.21.3)
- SDWebImage/Core (5.21.3)
@@ -2729,6 +2755,7 @@ DEPENDENCIES:
- "RNSentry (from `../node_modules/@sentry/react-native`)"
- RNSVG (from `../node_modules/react-native-svg`)
- RNVectorIcons (from `../node_modules/react-native-vector-icons`)
+ - RNWorklets (from `../node_modules/react-native-worklets`)
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
SPEC REPOS:
@@ -2994,6 +3021,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-svg"
RNVectorIcons:
:path: "../node_modules/react-native-vector-icons"
+ RNWorklets:
+ :path: "../node_modules/react-native-worklets"
Yoga:
:path: "../node_modules/react-native/ReactCommon/yoga"
@@ -3135,11 +3164,12 @@ SPEC CHECKSUMS:
RNCPicker: a7170edbcbf8288de8edb2502e08e7fc757fa755
RNFastImage: 42a769cd260a7686b1db32a9f7d754333bad4e77
RNGestureHandler: 2914750df066d89bf9d8f48a10ad5f0051108ac3
- RNReanimated: 112c0628c3c11b56c261bafb8df9ae72eb525aec
+ RNReanimated: 3895a29fdf77bbe2a627e1ed599a5e5d1df76c29
RNScreens: d8d6f1792f6e7ac12b0190d33d8d390efc0c1845
RNSentry: 41979b419908128847ef662cc130a400b7576fa9
RNSVG: 31d6639663c249b7d5abc9728dde2041eb2a3c34
RNVectorIcons: 4351544f100d4f12cac156a7c13399e60bab3e26
+ RNWorklets: 54d8dffb7f645873a58484658ddfd4bd1a9a0bc1
SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a
SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
diff --git a/src/components/metadata/FloatingHeader.tsx b/src/components/metadata/FloatingHeader.tsx
index 73f1d364..5e3a6edf 100644
--- a/src/components/metadata/FloatingHeader.tsx
+++ b/src/components/metadata/FloatingHeader.tsx
@@ -16,6 +16,7 @@ import Animated, {
Extrapolate,
useAnimatedReaction,
runOnJS,
+ SharedValue,
} from 'react-native-reanimated';
import { useTheme } from '../../contexts/ThemeContext';
import { logger } from '../../utils/logger';
@@ -28,9 +29,9 @@ interface FloatingHeaderProps {
handleBack: () => void;
handleToggleLibrary: () => void;
inLibrary: boolean;
- headerOpacity: Animated.SharedValue;
- headerElementsY: Animated.SharedValue;
- headerElementsOpacity: Animated.SharedValue;
+ headerOpacity: SharedValue;
+ headerElementsY: SharedValue;
+ headerElementsOpacity: SharedValue;
safeAreaTop: number;
setLogoLoadError: (error: boolean) => void;
}
diff --git a/src/components/metadata/HeroSection.tsx b/src/components/metadata/HeroSection.tsx
index da0ff84b..ddff74d4 100644
--- a/src/components/metadata/HeroSection.tsx
+++ b/src/components/metadata/HeroSection.tsx
@@ -29,6 +29,7 @@ import Animated, {
FadeIn,
runOnUI,
useDerivedValue,
+ SharedValue,
} from 'react-native-reanimated';
import { useTheme } from '../../contexts/ThemeContext';
import { useTraktContext } from '../../contexts/TraktContext';
@@ -52,14 +53,14 @@ interface HeroSectionProps {
bannerImage: string | null;
loadingBanner: boolean;
logoLoadError: boolean;
- scrollY: Animated.SharedValue;
- heroHeight: Animated.SharedValue;
- heroOpacity: Animated.SharedValue;
- logoOpacity: Animated.SharedValue;
- buttonsOpacity: Animated.SharedValue;
- buttonsTranslateY: Animated.SharedValue;
- watchProgressOpacity: Animated.SharedValue;
- watchProgressWidth: Animated.SharedValue;
+ scrollY: SharedValue;
+ heroHeight: SharedValue;
+ heroOpacity: SharedValue;
+ logoOpacity: SharedValue;
+ buttonsOpacity: SharedValue;
+ buttonsTranslateY: SharedValue;
+ watchProgressOpacity: SharedValue;
+ watchProgressWidth: SharedValue;
watchProgress: {
currentTime: number;
duration: number;
diff --git a/src/contexts/DownloadsContext.tsx b/src/contexts/DownloadsContext.tsx
index 66a6a3d1..2b7ad52e 100644
--- a/src/contexts/DownloadsContext.tsx
+++ b/src/contexts/DownloadsContext.tsx
@@ -1,6 +1,6 @@
import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
import { AppState } from 'react-native';
-import * as FileSystem from 'expo-file-system';
+import * as FileSystem from 'expo-file-system/legacy';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { notificationService } from '../services/notificationService';
@@ -135,7 +135,7 @@ export const DownloadsProvider: React.FC<{ children: React.ReactNode }> = ({ chi
downloadsRef.current = downloads;
}, [downloads]);
// Keep active resumables in memory (not persisted)
- const resumablesRef = useRef