From c62e406749bce0a804c76ed905a0b9ddf1ead937 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Sun, 8 Mar 2026 18:14:49 +0100 Subject: [PATCH] refactor: gate sentry behind build flag --- .github/workflows/build.yml | 17 +++--- android/fastlane/Fastfile | 4 +- ios/fastlane/Fastfile | 2 +- lib/main.dart | 114 +++++++++++++++++++----------------- 4 files changed, 73 insertions(+), 64 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5c3eb0bd..c0956f3f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,9 @@ name: Build on: workflow_dispatch: +env: + SENTRY_DART_DEFINE: ${{ github.repository == 'edde746/plezy' && '--dart-define=ENABLE_SENTRY=true' || '' }} + jobs: build-android: runs-on: ubuntu-latest @@ -58,7 +61,7 @@ jobs: EOF - name: Build APKs - run: flutter build apk --release --split-per-abi --dart-define=ENABLE_UPDATE_CHECK=true + run: flutter build apk --release --split-per-abi --dart-define=ENABLE_UPDATE_CHECK=true ${{ env.SENTRY_DART_DEFINE }} - name: Clean up keystore if: always() @@ -126,7 +129,7 @@ jobs: run: flutter pub get - name: Build iOS (no codesign) - run: flutter build ios --release --no-codesign --dart-define=ENABLE_UPDATE_CHECK=true + run: flutter build ios --release --no-codesign --dart-define=ENABLE_UPDATE_CHECK=true ${{ env.SENTRY_DART_DEFINE }} - name: Create IPA run: | @@ -184,7 +187,7 @@ jobs: run: flutter pub get - name: Build macOS - run: flutter build macos --release --dart-define=ENABLE_UPDATE_CHECK=true + run: flutter build macos --release --dart-define=ENABLE_UPDATE_CHECK=true ${{ env.SENTRY_DART_DEFINE }} - name: Import Code Signing Certificate env: @@ -335,7 +338,7 @@ jobs: run: flutter pub get - name: Build Windows x64 - run: flutter build windows --release --dart-define=ENABLE_UPDATE_CHECK=true + run: flutter build windows --release --dart-define=ENABLE_UPDATE_CHECK=true ${{ env.SENTRY_DART_DEFINE }} - name: Upload x64 build uses: actions/upload-artifact@v4 @@ -372,7 +375,7 @@ jobs: run: flutter pub get - name: Build Windows arm64 - run: flutter build windows --release --dart-define=ENABLE_UPDATE_CHECK=true + run: flutter build windows --release --dart-define=ENABLE_UPDATE_CHECK=true ${{ env.SENTRY_DART_DEFINE }} - name: Upload arm64 build uses: actions/upload-artifact@v4 @@ -516,7 +519,7 @@ jobs: run: flutter pub get - name: Build Linux x64 - run: flutter build linux --release --dart-define=ENABLE_UPDATE_CHECK=true + run: flutter build linux --release --dart-define=ENABLE_UPDATE_CHECK=true ${{ env.SENTRY_DART_DEFINE }} env: PKG_CONFIG_PATH: ${{ github.workspace }}/libmpv-prefix/lib/pkgconfig:${{ github.workspace }}/libmpv-prefix/lib/x86_64-linux-gnu/pkgconfig @@ -624,7 +627,7 @@ jobs: run: flutter pub get - name: Build Linux arm64 - run: flutter build linux --release --dart-define=ENABLE_UPDATE_CHECK=true + run: flutter build linux --release --dart-define=ENABLE_UPDATE_CHECK=true ${{ env.SENTRY_DART_DEFINE }} env: PKG_CONFIG_PATH: ${{ github.workspace }}/libmpv-prefix/lib/pkgconfig:${{ github.workspace }}/libmpv-prefix/lib/aarch64-linux-gnu/pkgconfig diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile index f4a9f362..56ce74ff 100644 --- a/android/fastlane/Fastfile +++ b/android/fastlane/Fastfile @@ -22,7 +22,7 @@ platform :android do debug_info_dir = "./debug-info/#{version_name}+#{version_code}" # Build the Flutter app - sh("cd #{ENV['PWD']}/.. && flutter build appbundle --dart-define=ENABLE_IN_APP_REVIEW=true --obfuscate --split-debug-info=#{debug_info_dir}/aab") + sh("cd #{ENV['PWD']}/.. && flutter build appbundle --dart-define=ENABLE_IN_APP_REVIEW=true --dart-define=ENABLE_SENTRY=true --obfuscate --split-debug-info=#{debug_info_dir}/aab") upload_to_play_store( track: "production", @@ -32,7 +32,7 @@ platform :android do ) # Build universal APK for Amazon Appstore (doesn't accept AABs, excludes x86 via env var) - sh("cd #{ENV['PWD']}/.. && AMAZON=1 flutter build apk --release --obfuscate --split-debug-info=#{debug_info_dir}/apk") + sh("cd #{ENV['PWD']}/.. && AMAZON=1 flutter build apk --release --dart-define=ENABLE_SENTRY=true --obfuscate --split-debug-info=#{debug_info_dir}/apk") upload_to_amazon_appstore( apk_paths: [ diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile index e766bbff..fd7c9cba 100644 --- a/ios/fastlane/Fastfile +++ b/ios/fastlane/Fastfile @@ -7,7 +7,7 @@ platform :ios do desc "Build and deploy to App Store" lane :deploy_appstore do # Build the Flutter app - sh("cd #{ENV['PWD']}/.. && flutter build ipa --dart-define=ENABLE_IN_APP_REVIEW=true") + sh("cd #{ENV['PWD']}/.. && flutter build ipa --dart-define=ENABLE_IN_APP_REVIEW=true --dart-define=ENABLE_SENTRY=true") # Upload to App Store upload_to_app_store( diff --git a/lib/main.dart b/lib/main.dart index 3ddef8c0..6731aeb5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -53,6 +53,8 @@ import 'utils/navigation_transitions.dart'; import 'utils/log_redaction_manager.dart'; import 'package:package_info_plus/package_info_plus.dart'; +const bool _enableSentry = bool.fromEnvironment('ENABLE_SENTRY', defaultValue: false); + // Workaround for Flutter bug #177992: iPadOS 26.1+ misinterprets fake touch events // at (0,0) as barrier taps, causing modals to dismiss immediately. // Remove when Flutter PR #179643 is merged. @@ -70,14 +72,14 @@ void _absorbZeroOffsetPointerEvent(PointerEvent event) { } } -void main() async { +Future main() async { WidgetsFlutterBinding.ensureInitialized(); _installZeroOffsetPointerGuard(); // Workaround for iPadOS 26.1+ modal dismissal bug - final packageInfo = await PackageInfo.fromPlatform(); + if (_enableSentry) { + final packageInfo = await PackageInfo.fromPlatform(); - await SentryFlutter.init( - (options) { + await SentryFlutter.init((options) { options.dsn = 'https://6a1a6ef8c72140099b2798973c1bfb2f@bugs.plezy.app/1'; options.release = 'plezy@${packageInfo.version}+${packageInfo.buildNumber}'; options.tracesSampleRate = 0; @@ -86,73 +88,77 @@ void main() async { options.recordHttpBreadcrumbs = false; options.beforeSend = _beforeSend; options.beforeBreadcrumb = _beforeBreadcrumb; - }, - appRunner: () async { - // Initialize settings first to get saved locale - final settings = await SettingsService.getInstance(); - final savedLocale = settings.getAppLocale(); + }, appRunner: _bootstrapApp); + return; + } - // Initialize localization with saved locale - LocaleSettings.setLocale(savedLocale); + await _bootstrapApp(); +} - // Needed for formatting dates in different locales - await initializeDateFormatting(savedLocale.languageCode, null); +Future _bootstrapApp() async { + // Initialize settings first to get saved locale + final settings = await SettingsService.getInstance(); + final savedLocale = settings.getAppLocale(); - // Configure image cache for large libraries - PaintingBinding.instance.imageCache.maximumSize = 2000; // default 1000 - PaintingBinding.instance.imageCache.maximumSizeBytes = 300 << 20; // 300MB + // Initialize localization with saved locale + LocaleSettings.setLocale(savedLocale); - // Initialize services in parallel where possible - final futures = >[]; + // Needed for formatting dates in different locales + await initializeDateFormatting(savedLocale.languageCode, null); - // Initialize window_manager for desktop platforms - if (Platform.isMacOS || Platform.isWindows || Platform.isLinux) { - futures.add(windowManager.ensureInitialized()); - } + // Configure image cache for large libraries + PaintingBinding.instance.imageCache.maximumSize = 2000; // default 1000 + PaintingBinding.instance.imageCache.maximumSizeBytes = 300 << 20; // 300MB - // Initialize TV detection and PiP service for Android - if (Platform.isAndroid) { - futures.add(TvDetectionService.getInstance()); - // Initialize PiP service to listen for PiP state changes - PipService(); - } + // Initialize services in parallel where possible + final futures = >[]; - // Configure macOS window with custom titlebar (depends on window manager) - futures.add(MacOSWindowService.setupCustomTitlebar()); + // Initialize window_manager for desktop platforms + if (Platform.isMacOS || Platform.isWindows || Platform.isLinux) { + futures.add(windowManager.ensureInitialized()); + } - // Initialize storage service - futures.add(StorageService.getInstance()); + // Initialize TV detection and PiP service for Android + if (Platform.isAndroid) { + futures.add(TvDetectionService.getInstance()); + // Initialize PiP service to listen for PiP state changes + PipService(); + } - // Initialize language codes for track selection - futures.add(LanguageCodes.initialize()); + // Configure macOS window with custom titlebar (depends on window manager) + futures.add(MacOSWindowService.setupCustomTitlebar()); - // Wait for all parallel services to complete - await Future.wait(futures); + // Initialize storage service + futures.add(StorageService.getInstance()); - // Initialize logger level based on debug setting - final debugEnabled = settings.getEnableDebugLogging(); - setLoggerLevel(debugEnabled); + // Initialize language codes for track selection + futures.add(LanguageCodes.initialize()); - // Initialize download storage service with settings - await DownloadStorageService.instance.initialize(settings); + // Wait for all parallel services to complete + await Future.wait(futures); - // Start global fullscreen state monitoring - FullscreenStateManager().startMonitoring(); + // Initialize logger level based on debug setting + final debugEnabled = settings.getEnableDebugLogging(); + setLoggerLevel(debugEnabled); - // Initialize gamepad service for desktop platforms - if (Platform.isMacOS || Platform.isWindows || Platform.isLinux) { - GamepadService.instance.start(); - DiscordRPCService.instance.initialize(); - } + // Initialize download storage service with settings + await DownloadStorageService.instance.initialize(settings); - // DTD service is available for MCP tooling connection if needed + // Start global fullscreen state monitoring + FullscreenStateManager().startMonitoring(); - // Register bundled shader licenses - _registerShaderLicenses(); + // Initialize gamepad service for desktop platforms + if (Platform.isMacOS || Platform.isWindows || Platform.isLinux) { + GamepadService.instance.start(); + DiscordRPCService.instance.initialize(); + } - runApp(const MainApp()); - }, - ); + // DTD service is available for MCP tooling connection if needed + + // Register bundled shader licenses + _registerShaderLicenses(); + + runApp(const MainApp()); } Breadcrumb? _beforeBreadcrumb(Breadcrumb? breadcrumb, Hint _) {