Skip to content

Commit 29c460e

Browse files
authored
feat: android 16kb compliance (#45)
* feat: Add Android 16 KB page size support for Google Play compliance This commit implements all required changes to support 16 KB memory page sizes on Android 15+ devices, as mandated by Google Play starting November 1, 2025. Changes include: Build System Upgrades: - Upgraded Gradle wrapper from 8.10.2 to 8.11.1 - Upgraded Android Gradle Plugin from 3.5.4 to 8.6.0 - Updated Kotlin JVM target from 11 to 17 - Added Java 17 compatibility settings (sourceCompatibility & targetCompatibility) 16 KB Page Size Configuration: - Added packagingOptions with useLegacyPackaging=false for proper native library alignment - Created Application.mk with APP_SUPPORT_FLEXIBLE_PAGE_SIZES flag for NDK r27 - Configured build to support 16 KB memory page sizes on 64-bit devices Dependency Updates: - Updated React Native from 0.77.0-rc.6 to 0.77.1 (stable release) - Updated react-native-reanimated from 3.16.1 to 3.19.3 - Updated react-native-gesture-handler from 2.20.2 to 2.25.0 - Updated react-native-device-info from 14.0.4 to 14.1.1 - Updated react-native-safe-area-context from 5.0.0 to 5.6.1 - Updated all React Native dev dependencies to match 0.77.1 These changes ensure the app: - Meets Google Play's mandatory 16 KB page size requirement - Properly aligns native libraries for 16 KB devices - Maintains backward compatibility with 4 KB page size devices - Benefits from performance improvements on modern Android devices Testing Required: - Build verification on all architectures - Functional testing on Android 15 emulator with 16 KB page size - Regression testing on 4 KB devices (Android 14 and below) - Verification using: adb shell getconf PAGE_SIZE (should return 16384) - APK alignment check: zipalign -c -P 16 -v 4 app.apk References: - https://developer.android.com/guide/practices/page-sizes - https://reactnative.dev/blog/2025/01/21/version-0.77 * chore: Remove temporary commit message file * feat: Upgrade React Native to 0.81 with Android 16 support - Upgraded React Native from 0.77.1 to 0.81.0 - Upgraded React from 18.3.1 to 19.1.0 - Upgraded React DOM to 19.1.0 - Updated all React Native dev dependencies to 0.81.0 - Updated React types to 19.0.0 - Updated metro-react-native-babel-preset to 0.81.0 - Updated react-test-renderer to 19.1.0 Android Changes: - Updated compileSdkVersion from 35 to 36 (Android 16) - Updated targetSdkVersion from 35 to 36 (Android 16) Native Library Updates: - Updated react-native-safe-area-context to 5.6.2 (latest) - Maintained react-native-reanimated at 3.19.3 (compatible with 0.81) - Maintained react-native-gesture-handler at 2.25.0 (compatible) - Maintained react-native-device-info at 14.1.1 (compatible) Benefits: - Android 16 (API 36) support with edge-to-edge display - Predictive back gesture support - Improved error reporting in DevTools - Foundation for experimental precompiled iOS builds - Enhanced stability and bug fixes Breaking Changes Addressed: - SafeAreaView deprecation (already using react-native-safe-area-context) - React 19 compatibility - Android 16 edge-to-edge requirements Note: This upgrade maintains 16 KB page size compliance and builds on the previous AGP 8.6.0 and Gradle 8.11.1 upgrades. * fix: Restore @react-navigation/native to 7.0.14 Corrected accidental downgrade from 7.0.14 to 7.0.0. Version 7.0.14 is fully compatible with React Native 0.81 and React 19. * fix: Update to React Native 0.81.5 (latest stable 0.81 patch) Updated from 0.81.0 to 0.81.5 to ensure all packages are available on npm. This includes: - react-native: 0.81.5 - @react-native/babel-preset: 0.81.5 - @react-native/eslint-config: 0.81.5 - @react-native/metro-config: 0.81.5 - @react-native/typescript-config: 0.81.5 - metro-react-native-babel-preset: 0.81.5 Version 0.81.5 is the latest patch release with all bug fixes. * feat: Apply React Native 0.81.5 upgrade changes (partial) Applied changes from React Native Upgrade Helper (0.77.1 -> 0.81.5): Package.json updates: - Updated CLI packages to 28.0.0 (android) and 20.0.0 (ios) - Updated Node engine requirement to >=20 Android changes: - Added edgeToEdgeEnabled=false to gradle.properties for Android 16 - Deleted android/app/src/debug/AndroidManifest.xml (no longer needed) Root configuration: - Added .kotlin/ to .gitignore Note: This is a partial upgrade. Additional native code changes may be needed. Testing required before considering upgrade complete. * fix: Correct CLI package versions to 20.0.2 Changed from incorrect 28.0.0 to 20.0.2 which is the actual version compatible with React Native 0.81.5. Also removed deprecated metro-react-native-babel-preset as it's replaced by @react-native/babel-preset in RN 0.81.5. * fix: Correct package versions to match official 0.81.5 upgrade diff Updated to match exact versions from React Native Upgrade Helper: - CLI packages: 20.0.2 → 20.0.0 (match official) - react-native-safe-area-context: 5.6.1 → ^5.6.2 - typescript: 5.0.4 → ^5.8.3 These changes ensure compatibility with React Native 0.81.5. * fix: Update Android build versions to match RN 0.81.5 Updated to match official upgrade diff: - buildToolsVersion: 35.0.0 → 36.0.0 - kotlinVersion: 2.0.21 → 2.1.20 These versions are required for React Native 0.81.5 compatibility. * fix: Remove old autolinking from settings.gradle Removed the deprecated line: apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle") React Native 0.81.5 uses the new autolinking system via: extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() } This fixes the build error: 'Could not read script native_modules.gradle' * fix: Remove react-native-gradle-plugin classpath and update Kotlin Changes: - Removed classpath("com.facebook.react:react-native-gradle-plugin") This is now loaded via includeBuild in settings.gradle (RN 0.81.5) - Updated kotlin-gradle-plugin: 1.9.0 → 2.1.20 (match kotlinVersion) - Removed duplicate kotlin-gradle-plugin classpath Fixes: 'Could not find com.facebook.react:react-native-gradle-plugin' * few minor changes * fix: Remove react-native-gradle-plugin classpath again This classpath entry keeps getting added back but it should NOT be in React Native 0.81.5. The plugin is loaded via includeBuild in settings.gradle instead. This is the correct configuration for RN 0.81.5. * fix: Add back react-native-gradle-plugin classpath (correct for RN 0.81.5) I was wrong to remove this - the official RN 0.81.5 build.gradle DOES include this classpath. The issue is elsewhere (likely node_modules). * fix: Add missing includeBuild for gradle-plugin Added the missing line at the end of settings.gradle: includeBuild('../node_modules/@react-native/gradle-plugin') This is required in RN 0.81.5 to make the gradle plugin available to build.gradle classpath. Without this, Gradle can't find the plugin. The official template has this line - it was accidentally removed. * fix: Update Gradle to 8.13 (required by AGP 8.6.0) Android Gradle Plugin 8.6.0 requires minimum Gradle 8.13. Updated from 8.11.1 to 8.13. Fixes: 'Minimum supported Gradle version is 8.13' * fix: Clean up react-native-i18n patch to fix Gradle compatibility Removed gradle cache files from patch and kept only the essential fix: - Changed 'compile' to 'implementation' in android/build.gradle This fixes the error: 'Could not find method compile()' with modern Gradle. * fix: Switch from Yarn patches to patch-package for Yarn 1.x compatibility Changes: - Added patch-package and postinstall-postinstall to devDependencies - Added postinstall script to run patch-package - Created patches/react-native-i18n+2.0.15.patch for patch-package format - Removed Yarn Berry style resolutions (not supported in Yarn 1.x) This fixes the 'invalid version entry' warnings and ensures patches are properly applied on yarn install. * fix: Add missing patches for react-native-notifications and react-native-toast Converted the other two patches from Yarn format to patch-package format: - react-native-notifications+5.1.0.patch (removes deprecated dexOptions) - @backpackapp-io+react-native-toast+0.12.1.patch (fixes export issue) These patches were lost when switching from Yarn Berry resolutions. * fix: Update react-native-notifications patch to match installed version 5.2.2 Renamed patch file from 5.1.0 to 5.2.2 to match the actual installed version and remove the version mismatch warning. * fix: Update @stripe/stripe-react-native to 0.57.0 for RN 0.81 compatibility Updated from 0.41.0 to ^0.57.0 to fix compilation error: 'Unresolved reference currentActivity' in StripeSdkModule.kt The old version (0.41.0) is not compatible with React Native 0.81.5. * fix: Update react-native-gesture-handler to 2.29.1 for AGP 8.6 compatibility Updated from 2.25.0 to 2.29.1 to fix build error: 'project does not specify compileSdk in build.gradle' The newer version is compatible with AGP 8.6.0 and React Native 0.81.5. * fix: Add patch for react-native-gesture-handler to specify compileSdk AGP 8.6.0 requires compileSdk to be explicitly specified. Added patch to set compileSdk from rootProject.ext.compileSdkVersion. Fixes: 'project does not specify compileSdk in build.gradle' * fix: Add JitPack repository for BlurView dependency JitPack is required to download the BlurView library used by @react-native-community/blur. Added maven { url 'https://jitpack.io' } to buildscript repositories. * fix(ios): Remove outdated react-native-google-maps pod configuration react-native-maps is now auto-linked via use_native_modules! The manual pod configuration is no longer needed and causes build errors. * use node v20.19.4 * fix(android): Update map region when location loads Fixes issue where Android map shows West Africa (0,0) instead of correct location. The map region is now updated via useEffect when currentLocation becomes available, which happens slower on Android than iOS due to permission handling differences. Resolves map initialization issue where coordinates default to [0,0] before location is loaded. * feat: Add platform-specific theme utility for cross-platform consistency Creates centralized platform-specific styling values to handle iOS/Android differences without scattering Platform.select() calls throughout components. Features: - Platform-specific spacing (margins, padding, gaps) - Text styling adjustments (line height, font weight) - Component styling (shadows, border radius) - Helper functions for platform detection Follows Fleetbase's minimal padding/spacing design philosophy while accounting for platform rendering differences. * fix(android): Improve map region initialization with onMapReady callback Previous fix didn't work because initialRegion is ignored after initial mount. Now using onMapReady callback which is critical for Android to ensure the map is fully initialized before attempting to animate to the correct region. Changes: - Added mapInitializedRef to track if region has been set - Created updateMapRegion callback that safely updates region - Added handleMapReady callback that triggers after map is ready - Added onMapReady prop to MapView component - Added console logs for debugging This ensures the map animates to the correct location even when currentLocation loads after the map component has mounted. * fix(android): Use region prop instead of initialRegion for reactive map updates The issue was that animateToRegion() doesn't work reliably on Android. Changed from initialRegion (static, only used once) to region (controlled, updates reactively). Key changes: - Changed MapView prop from initialRegion to region - Simplified updateMapRegion logic - just update state, region prop handles the rest - Removed onMapReady callback - no longer needed - Removed animateToRegion call - region prop updates automatically The region prop is controlled and will update the map whenever mapRegion state changes, which happens when currentLocation becomes available. This works reliably on both iOS and Android. * fix(android): Make map region update instant and Android-only Simplified the fix based on user's working solution: - Use animateToRegion with 0ms duration for instant update (no animation) - Only run on Android with isAndroid check - Changed back to initialRegion prop (cleaner than controlled region) This approach is simpler and more performant than the previous attempts. * Fix Android map flash and VehicleMarker rendering issues - Prevent MapView from rendering until currentLocation is available on Android - Fix VehicleMarker not appearing by disabling tracksViewChanges on Android - tracksViewChanges prop causes rendering issues on Android with react-native-maps - Maintains iOS behavior with delayed tracksViewChanges logic * Add comprehensive testing guide for Android map and marker fixes * Add comprehensive summary of Android map and marker fixes * Add debug logging to VehicleMarker and TrackingMarker for Android investigation * Add comprehensive marker debugging guide and simple test marker component * Added debugging log of availableFoodTrucks * Add debug logging for Vehicle instantiation to diagnose marker rendering issue * Fix VehicleMarker not rendering: Add missing React import The component was using useRef, useCallback, and useEffect without importing them from React, causing the component to fail silently on render. This is why markers weren't appearing on Android (or iOS). * Add detailed debug logging to identify which hook fails on Android * Add temporary simple Marker test for Android to isolate VehicleMarker issue * Add Google Play Services Maps dependency to fix marker rendering on Android Root cause: react-native-maps requires explicit play-services-maps dependency on Android. Without it, MapView renders but markers don't appear. This is a common issue after RN upgrades. * Upgrade react-native-maps from 1.20.0 to 1.26.18 for RN 0.81.5 compatibility Version 1.20.0 is outdated and has known issues with marker rendering on Android with newer React Native versions. Upgrading to 1.26.18 should fix the marker rendering issue. * Revert "Add Google Play Services Maps dependency to fix marker rendering on Android" This reverts commit 0a7b810. * Remove package-lock.json (project uses yarn) * Upgraded react-native-mmkv-storage to v12 for 16kb device support * Set `newArchEnabled=true` in gradle.properties, map fully working now * Remove all debug logging code from FoodTruckScreen, VehicleMarker, and TrackingMarker * Upgrade react-native-keychain from 9.2.2 to 10.0.0 to fix libconceal.so 16 KB alignment issue Version 10.0.0 removes the dependency on Facebook's Conceal library (libconceal.so), which doesn't support 16 KB page sizes required by Android 15+ for Google Play submission. * Add comprehensive Android 16 KB compliance summary document * Add guide for fixing New Architecture codegen directory errors * Fix Android modal header spacing by using safe area insets Fixed ProductScreen and CartItemScreen modal headers rendering too high into the status bar on Android. Both screens now use insets.top instead of top={0} for absolute positioned close buttons. Other modal screens (CartScreen, CatalogScreen, OrderScreen, ReceiptScreen) either use SafeAreaView or have headerShown=true, so they handle safe areas automatically. * Fix Android modal header spacing with Platform-specific logic (iOS unaffected) Applied Platform.OS === 'android' checks to ensure safe area insets only apply on Android: - ProductScreen: Close button uses insets.top on Android only - CartItemScreen: Close button uses insets.top on Android only - CatalogScreen: Header padding uses insets.top on Android only iOS layout remains completely unchanged and continues to work perfectly. * Add modal detection guide and reusable useIsModal hook Created comprehensive documentation for detecting modal screens with 4 different methods: 1. Route parameters (recommended) 2. Route name pattern 3. Navigation history 4. Screen options Added useIsModal() custom hook that combines all methods with sensible defaults and platform-specific logic. * Add ScreenWrapper component technical implementation document Comprehensive design document for centralized screen spacing management: - Component API with 20+ configurable props - Modal detection and platform-specific spacing logic - Migration strategy for 30+ screens - Complete inventory of modal screens - Before/after code examples - Testing strategy and implementation checklist Estimated implementation: 3-5 days Impact: Eliminates scattered Platform checks across all screens * updated dependencies * Implement ScreenWrapper component for centralized screen spacing management (#46) * Add ScreenWrapper component with full TypeScript implementation - Centralized screen spacing and safe area management - Auto-detection of modal presentation - Platform-specific spacing logic (Android/iOS) - Support for scrollable content - Customizable insets and padding - 20+ configurable props with TypeScript types - Comprehensive JSDoc documentation * Migrate high-priority modal screens to ScreenWrapper Migrated ProductScreen, CartItemScreen, and CatalogScreen to use the new ScreenWrapper component: - Removed scattered Platform checks and inset calculations - Removed manual useSafeAreaInsets and useBottomTabBarHeight hooks - Simplified component code significantly - Automatic modal spacing handling for Android/iOS * Migrate CartScreen to ScreenWrapper - Removed SafeAreaView, useSafeAreaInsets, and useBottomTabBarHeight - Removed manual modal detection logic - Simplified bottom button positioning - Auto-detects modal presentation via autoDetectModal prop * Add isModal parameter to all modal screen navigation calls Updated navigation calls to include isModal: true for: - ProductScreen (ProductCard, ProductCardHorizontal, ProductCardHorizontalLTR) - CartItemScreen (CartContents, CartScreen) - CatalogScreen (FoodTruckScreen) This ensures ScreenWrapper can properly detect and handle modal presentation * Add ScreenWrapper implementation summary document * Fix ProductScreen to respect isModal parameter - Restore original isModal logic: Platform.OS === 'ios' && (params.isModal ?? true) - Pass isModal as prop to ScreenWrapper instead of hardcoding true - Allows runtime override of modal presentation via navigation params * Add document addressing ScreenWrapper implementation concerns - Explains modal screen detection logic - Documents ProductScreen isModal parameter fix - Clarifies tab bar handling (not an issue for current migrated screens) - Analyzes navigation call updates (redundant but harmless) * Simplify modal detection using ScreenWrapper auto-detection - Updated ScreenWrapper detectIsModal to default to true on iOS (matching RN modal behavior) - Changed ProductScreen to use autoDetectModal instead of manual isModal calculation - Removed all redundant isModal: true parameters from navigation calls - Auto-detection now checks: params.isModal > route name pattern > Platform.OS default This simplifies the code while maintaining the same behavior: - iOS: Defaults to modal presentation - Android: Defaults to non-modal - Can be overridden with isModal: false parameter * Fix ScreenWrapper issues: remove Platform.OS assumption and JSDoc error 1. Removed incorrect Platform.OS default in detectIsModal - Was assuming all iOS screens are modals (incorrect) - Now only returns true when explicitly detected via params or route name - Prevents false positives for regular screens like AccountScreen, ProfileScreen 2. Fixed JSDoc syntax error - Changed {/* comment */} to // comment in example code - Babel was failing to parse JSX comments inside JSDoc strings 3. Updated ProductScreen to explicitly pass isModal prop - Restored original logic: Platform.OS === 'ios' && (params.isModal ?? true) - ProductScreen-specific behavior, not a global assumption * Fix ProductScreen bottom button positioning for Android - Restored bottom positioning logic for absolutely positioned buttons - Android: Always use insets.bottom for proper safe area spacing - iOS: Use insets.bottom for modals, tabBarHeight for non-modals - Fixes issue where Add to Cart buttons were not visible on Android - Fixes issue where buttons were too close to bottom edge on iOS The ScreenWrapper doesn't handle this case because the buttons are absolutely positioned outside the normal layout flow. * Fix CartItemScreen bottom button positioning - Restored bottom={insets.bottom} for absolutely positioned buttons - CartItemScreen is always a modal, so always use safe area insets - Fixes same issue as ProductScreen where buttons were not visible/too close * Fix missing insets and tabBarHeight in ProductScreen - Added useSafeAreaInsets import and hook - Added useBottomTabBarHeight import and hook - Fixes 'Property insets doesnt exist' error - Fixes 'Property tabBarHeight doesnt exist' error * fix bottom padding for absolute positioned add to cart/ quantity button section * Fix ProductScreen close button overlapping with Android status bar - Added Platform.OS check for top positioning - Android: Use insets.top to position below status bar - iOS: Keep top={0} (works correctly) - Fixes close button being impossible to press on Android * fix UX for android and ios to match * cleanup * added ebarimt company registration to qpay checkout screen * debugging vehicle marker render on android * Add comprehensive debugging and Android marker rendering fix - Add detailed console logs to track image loading and marker rendering - Use regular Marker on Android until image loads, then switch to AnimatedMarker - This should fix the 'marker not showing on first render' issue on Android - Track hasMovedOnce state for additional debugging * Fix infinite re-render loop in TrackingMarker on Android The issue was that incrementing renderKey on image load caused the marker key to change, which triggered a re-mount, which loaded the image again, which incremented renderKey again... infinite loop! Now using stable key that only changes between 'loading' and 'loaded' states. * Fix MarkerComponent closing tag and add simple test marker - Fixed closing tag from AnimatedMarker to MarkerComponent - Temporarily replaced VehicleMarker with simple red circle marker in FoodTruckScreen - This will test if basic markers can render on Android - If this works, the issue is with TrackingMarker/SVG loading * Fix VehicleMarker rendering on Android Root cause: AnimatedMarker with remote SVG doesn't render on Android Fixes: 1. Force local PNG image on Android instead of remote SVG avatar 3. iOS continues to use AnimatedMarker with remote images for smooth movement 4. Restored VehicleMarker in FoodTruckScreen This sacrifices smooth animation on Android but ensures the marker shows up. * Improve Android marker rendering with AnimatedMarker and PNG conversion Changes: - Restored AnimatedMarker on Android for smooth movement - On Android: Skip SvgCssUri, use FastImage only (no SVG children) - Auto-convert .svg URLs to .png for Android (assumes CDN has PNG versions) - iOS: Continue using SVG directly for full quality - Proper tracksViewChanges management to prevent re-render loops This should restore smooth animation on Android while avoiding SVG rendering issues. Requires PNG versions of vehicle avatars to be available on the server. * Use local PNG fallback for vehicle markers on Android Android AnimatedMarker doesn't support SVG children due to bitmap conversion issues. Current solution: - iOS: Use remote SVG avatars (full quality, smooth animation) Future improvements (TODO): 1. Fleetbase backend generates PNG versions of SVG avatars 2. Use SVG-to-PNG conversion service 3. Client-side SVG-to-bitmap rendering with react-native-view-shot This ensures markers render and animate smoothly on Android now, with custom avatar support to be added later. * Clean implementation: SVG support in AnimatedMarker on Android Removed all workarounds and implemented the proper solution: - Use fixed-size View wrapper around SvgCssUri (critical for Android) - AnimatedMarker works on both iOS and Android - Remote SVG avatars work on both platforms - Smooth animation and rotation on both platforms Key insight from research: Android requires explicit pixel dimensions on the View wrapper containing SVG for proper bitmap conversion. All hacky platform checks and fallbacks removed. * Fix Android SVG marker rendering by removing View transform Issue: View transform breaks Android bitmap conversion for markers Solution: Use native marker rotation only on Android Changes: - Android: Use marker's native rotation prop, NO View transform - iOS: Use both native rotation + View transform (for map bearing) - SVG now renders correctly on Android with rotation working - Maintains Uber-like smooth animation and rotation on both platforms The View transform interferes with Android's SVG-to-bitmap conversion process. * Fix marker children not rendering on Android Issue: tracksViewChanges staying true prevents children from rendering Solution: Set tracksViewChanges=false quickly after SVG loads on Android Changes: - Remove children from tracksViewChanges dependency - Set to false 100ms after SVG loads on Android (vs 120ms on iOS) - This allows Android to render the marker label/children properly Now both SVG marker AND children render correctly on Android! * Fix marker rendering - revert to working approach Issue: Marker stopped rendering after last change Fix: Restore working implementation with proper tracksViewChanges timing Key points: - SVG in fixed-size View without transform (Android requirement) - FastImage can have transform on iOS only - tracksViewChanges=false after 500ms (was too fast at 100ms) - Restore children dependency for tracksViewChanges This matches the working version from user testing. * Simplify marker rotation - use native rotation only Removed unnecessary View transform and childRotation calculation. Changes: - Remove childRotation transform from FastImage View - Use only native marker rotation prop on both platforms - Works correctly with Google Maps (Android) and Apple Maps (iOS) - Simpler, cleaner code The native rotation prop handles all rotation needs - no View transform required. Map bearing compensation removed as it's not used in the app. * Restore CSS rotation for iOS map bearing compensation Reverted previous simplification - map bearing compensation is needed on iOS. Changes: - Restored childRotation calculation - iOS: Apply transform for map bearing compensation (works fine) - Android: No transform (breaks SVG bitmap conversion) This allows iOS to properly counter-rotate markers when the map rotates, while Android uses native rotation only. * fully working with rendering svg icon on android but children do not render * Fix marker children not rendering on Android Issue: Children (label below marker) not rendering on Android Root cause: tracksViewChanges=true with children prevents separate rendering Fixes: 1. Remove children from tracksViewChanges dependency 2. Set tracksViewChanges=false after 300ms on Android (vs 500ms iOS) 3. Add collapsable=false to children View (Android requirement) 4. Use fixed left offset instead of marginLeft (more reliable on Android) 5. Add alignItems/justifyContent for proper centering This allows Android to render the marker icon first, then render children separately without bitmap conversion conflicts. * good enough * done for now --------- Co-authored-by: roncodes <[email protected]> * ready for release --------- Co-authored-by: roncodes <[email protected]>
1 parent d682b88 commit 29c460e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+6111
-4852
lines changed

.github/workflows/react-native-ci.yml

Lines changed: 441 additions & 441 deletions
Large diffs are not rendered by default.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ buck-out/
5050
\.buckd/
5151
*.keystore
5252
!debug.keystore
53+
.kotlin/
5354

5455
# testing
5556
/coverage

.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
v20.19.4
-2.36 KB
Binary file not shown.

android/app/build.gradle

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,32 @@ def enableProguardInReleaseBuilds = false
6464
* The preferred build flavor of JavaScriptCore (JSC)
6565
*
6666
* For example, to use the international variant, you can use:
67-
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
67+
* `def jscFlavor = io.github.react-native-community:jsc-android-intl:2026004.+`
6868
*
6969
* The international variant includes ICU i18n library and necessary data
7070
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
7171
* give correct results when using with locales other than en-US. Note that
7272
* this variant is about 6MiB larger per architecture than default.
7373
*/
74-
def jscFlavor = 'org.webkit:android-jsc:+'
74+
def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+'
7575

7676
android {
7777
ndkVersion rootProject.ext.ndkVersion
7878
buildToolsVersion rootProject.ext.buildToolsVersion
7979
compileSdk rootProject.ext.compileSdkVersion
8080

8181
namespace "com.storefront.app"
82+
83+
compileOptions {
84+
sourceCompatibility JavaVersion.VERSION_17
85+
targetCompatibility JavaVersion.VERSION_17
86+
}
87+
88+
packagingOptions {
89+
jniLibs {
90+
useLegacyPackaging = false
91+
}
92+
}
8293
defaultConfig {
8394
applicationId project.env.get("APP_IDENTIFIER") ?: "com.storefront.app"
8495
minSdkVersion rootProject.ext.minSdkVersion

android/app/src/debug/AndroidManifest.xml

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,20 @@
11
package com.storefront.app
22

33
import android.app.Application
4-
import com.AlexanderZaytsev.RNI18n.RNI18nPackage
54
import com.facebook.react.PackageList
65
import com.facebook.react.ReactApplication
76
import com.facebook.react.ReactHost
7+
import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative
88
import com.facebook.react.ReactNativeHost
99
import com.facebook.react.ReactPackage
10-
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
1110
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
1211
import com.facebook.react.defaults.DefaultReactNativeHost
13-
import com.facebook.react.soloader.OpenSourceMergedSoMapping
14-
import com.facebook.soloader.SoLoader
15-
import com.lugg.RNCConfig.RNCConfigPackage
1612

1713
class MainApplication : Application(), ReactApplication {
1814

1915
override val reactNativeHost: ReactNativeHost =
2016
object : DefaultReactNativeHost(this) {
21-
override fun getPackages(): List<ReactPackage> =
22-
PackageList(this).packages.apply {
23-
}
17+
override fun getPackages(): List<ReactPackage> = PackageList(this).packages.apply {}
2418

2519
override fun getJSMainModuleName(): String = "index"
2620

@@ -35,10 +29,6 @@ class MainApplication : Application(), ReactApplication {
3529

3630
override fun onCreate() {
3731
super.onCreate()
38-
SoLoader.init(this, OpenSourceMergedSoMapping)
39-
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
40-
// If you opted in for the New Architecture, we load the native entry point for this app.
41-
load()
42-
}
32+
loadReactNative(this)
4333
}
4434
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Application.mk for Fleetbase Storefront App
2+
# This file configures the NDK build for the application
3+
4+
# Enable support for 16 KB memory page sizes (required for Android 15+ devices)
5+
# This flag is supported by NDK r27 and higher
6+
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

android/build.gradle

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,24 @@ buildscript {
55
playServicesLocationVersion = "21.0.1"
66
firebaseMessagingVersion = "22.0.0"
77
firebaseVersion = "22.0.0"
8-
buildToolsVersion = "35.0.0"
8+
buildToolsVersion = "36.0.0"
99
minSdkVersion = 24
10-
compileSdkVersion = 35
11-
targetSdkVersion = 35
10+
compileSdkVersion = 36
11+
targetSdkVersion = 36
1212
ndkVersion = "27.1.12297006"
13-
kotlinVersion = "2.0.21"
13+
kotlinVersion = "2.1.20"
1414
appCompatVersion = "1.4.2"
1515
}
1616
repositories {
1717
google()
1818
mavenCentral()
19-
20-
maven {
21-
url "https://jitpack.io" // Or the correct repository URL for Flipper
22-
}
19+
maven { url 'https://jitpack.io' }
2320
}
2421
dependencies {
25-
classpath("com.android.tools.build:gradle:3.5.4")
22+
classpath("com.android.tools.build:gradle:8.6.0")
2623
classpath("com.facebook.react:react-native-gradle-plugin")
27-
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0")
24+
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20")
2825
classpath('com.google.gms:google-services:4.3.15')
29-
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
3026
}
3127
}
3228

android/gradle.properties

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ android.useAndroidX=true
2626
# You can also override it from the CLI using
2727
# ./gradlew <task> -PreactNativeArchitectures=x86_64
2828
reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
29+
newArchEnabled=true
2930

3031
# Use this property to enable support to the new architecture.
3132
# This will allow you to use TurboModules and the Fabric render in
@@ -38,5 +39,10 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
3839
hermesEnabled=true
3940
android.enableJetifier=true
4041

41-
kotlin.compiler.jvmTarget=11
42+
# Use this property to enable edge-to-edge display support.
43+
# This allows your app to draw behind system bars for an immersive UI.
44+
# Note: Only works with ReactActivity and should not be used with custom Activity.
45+
edgeToEdgeEnabled=false
46+
47+
kotlin.compiler.jvmTarget=17
4248
kotlin.jvm.target.validation.mode=warning

0 commit comments

Comments
 (0)