diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index 1f2eb81..49c3f9a 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -93,6 +93,33 @@ def jscFlavor = 'org.webkit:android-jsc:+' apply from: new File(["node", "--print", "require('path').dirname(require.resolve('@sentry/react-native/package.json'))"].execute().text.trim(), "sentry.gradle") +// Sentry Android Gradle Plugin: wysylka symboli natywnych (.so z build intermediates) i mappingu +// ProGuard. Bez tego natywne crashe SIGABRT (abort w JNI) maja same w stosie. +// Wysylka tylko gdy build dostal SENTRY_AUTH_TOKEN (Infisical goon-app przez iclaude) i nie ma +// SENTRY_DISABLE_AUTO_UPLOAD=true; inaczej plugin jest bierny i build dziala offline. +// autoInstallation wylaczone: sentry-android przychodzi z @sentry/react-native, drugi egzemplarz +// w innej wersji psulby runtime. Instrumentacja bytecode tez wylaczona (nie potrzebujemy spanow +// OkHttp/Room, a zmienia kod bibliotek). +apply plugin: "io.sentry.android.gradle" + +def sentryUploadEnabled = System.getenv("SENTRY_AUTH_TOKEN") && + System.getenv("SENTRY_DISABLE_AUTO_UPLOAD") != "true" + +sentry { + org = System.getenv("SENTRY_ORG") + projectName = System.getenv("SENTRY_PROJECT") + authToken = System.getenv("SENTRY_AUTH_TOKEN") + uploadNativeSymbols = sentryUploadEnabled + includeNativeSources = true + autoUploadProguardMapping = sentryUploadEnabled + includeProguardMapping = true + includeSourceContext = false + ignoredBuildTypes = ["debug"] + autoInstallation { enabled = false } + tracingInstrumentation { enabled = false } + telemetry = false +} + android { ndkVersion rootProject.ext.ndkVersion @@ -104,8 +131,8 @@ android { applicationId 'com.goon.mobile' minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 16 - versionName "0.4.2" + versionCode 17 + versionName "0.4.3" } signingConfigs { debug { diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml index 3114cea..e3173ba 100644 --- a/mobile/android/app/src/main/AndroidManifest.xml +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -49,7 +49,9 @@ gdy Chromium probowal podpiac skaner kodow (GOON-3B, 3 crashe od lipca). --> - + + @@ -63,12 +65,14 @@ - + Alias tej samej aktywnosci (nie osobna klasa): dwie ReactActivity naraz walily + asercja przy pauzie (crash na TV), a nazwa .TvMainActivity zostaje, zeby skroty + na ekranach telewizorow dalej dzialaly. --> + - + \ No newline at end of file diff --git a/mobile/android/app/src/main/java/com/goon/mobile/MainActivity.kt b/mobile/android/app/src/main/java/com/goon/mobile/MainActivity.kt index 1585701..56c8006 100644 --- a/mobile/android/app/src/main/java/com/goon/mobile/MainActivity.kt +++ b/mobile/android/app/src/main/java/com/goon/mobile/MainActivity.kt @@ -1,5 +1,10 @@ package com.goon.mobile +import android.app.UiModeManager +import android.content.Context +import android.content.pm.ActivityInfo +import android.content.pm.PackageManager +import android.content.res.Configuration import android.os.Build import android.os.Bundle import android.util.Log @@ -13,9 +18,28 @@ import com.reactnative.googlecast.api.RNGCCastContext import expo.modules.ReactActivityDelegateWrapper -// open, bo dziedziczy z niej TvMainActivity (to samo, tylko bez blokady pionu). +/** + * Jedyna aktywnosc Reacta w aplikacji. Wejscie dla Android TV (`.TvMainActivity`, + * LEANBACK_LAUNCHER) to w manifescie activity-alias na te klase, a nie osobna klasa. + * + * Dlaczego (najczestszy crash na telewizorach do 2026-10): osobna `TvMainActivity : + * MainActivity()` byla DRUGA ReactActivity na tym samym ReactInstanceManager. Na telewizorze + * obie potrafily zyc naraz (launcher TV startuje Tv, a intent MAIN/VIEW, Cast albo Recents + * wchodzi w MainActivity) i pauza tej, ktora nie byla "current", walila asercja + * `Unable to pause activity TvMainActivity`. Jedna klasa + `singleTask` = jedna instancja. + * + * Blokada pionu: nie w manifescie (alias nie moze jej nadpisac, a telewizor ma ekran na stale + * poziomy i pionowa aplikacja wychodzi waskim paskiem), tylko tutaj, przed `super.onCreate`, + * i TYLKO poza telewizorem. Na TV nie wolno wolac `setRequestedOrientation` (relaunch tuz po + * starcie i bialy ekran, sprawdzone 2026-09-17). Telefon startuje niemal zawsze w pionie, + * wiec zadanie pionu nie zmienia konfiguracji; gdyby zmienilo, `configChanges` w manifescie + * obsluguje orientation|screenSize bez odtwarzania aktywnosci. + */ open class MainActivity : ReactActivity() { override fun onCreate(savedInstanceState: Bundle?) { + if (!isTelevision()) { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + } // Set the theme to AppTheme BEFORE onCreate to support // coloring the background, status bar, and navigation bar. // This is required for expo-splash-screen. @@ -33,6 +57,12 @@ open class MainActivity : ReactActivity() { } } + private fun isTelevision(): Boolean { + val uiMode = getSystemService(Context.UI_MODE_SERVICE) as? UiModeManager + if (uiMode?.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) return true + return packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK) + } + /** * Returns the name of the main component registered from JavaScript. This is used to schedule * rendering of the component. diff --git a/mobile/android/app/src/main/java/com/goon/mobile/TvMainActivity.kt b/mobile/android/app/src/main/java/com/goon/mobile/TvMainActivity.kt deleted file mode 100644 index 6b37da3..0000000 --- a/mobile/android/app/src/main/java/com/goon/mobile/TvMainActivity.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.goon.mobile - -/** - * Wejscie dla Android TV. Ta sama aktywnosc co na telefonie, rozni sie WYLACZNIE wpisem - * w manifescie: telefon ma blokade pionu, telewizor jej nie ma, bo ekran telewizora jest - * na stale poziomy i pionowa aplikacja wychodzi tam waskim paskiem na srodku. - * - * Dlaczego osobna klasa, a nie jedna aktywnosc: - * - `setRequestedOrientation` w `onCreate` to zmiana konfiguracji, wiec system - * relaunchuje aktywnosc tuz po starcie i na TV zostawal bialy ekran (widok Reacta nie - * wracal; emulator android-34 android-tv, 2026-09-17), - * - orientacja z zasobu (`values-television`) nie przechodzi, bo manifest czyta zasoby - * bez kontekstu konfiguracji (lint ManifestResource), - * - `activity-alias` nie pozwala nadpisac `screenOrientation`. - * - * Telewizorowy launcher pyta o `LEANBACK_LAUNCHER`, wiec na telefonie ta klasa jest - * niewidoczna, a na TV widoczna jest tylko ona. - */ -class TvMainActivity : MainActivity() diff --git a/mobile/android/build.gradle b/mobile/android/build.gradle index a45ed27..fcd89a2 100644 --- a/mobile/android/build.gradle +++ b/mobile/android/build.gradle @@ -23,6 +23,10 @@ buildscript { classpath('com.android.tools.build:gradle') classpath('com.facebook.react:react-native-gradle-plugin') classpath('org.jetbrains.kotlin:kotlin-gradle-plugin') + // Symbole natywne (.so) i mapping ProGuard do Sentry. sentry.gradle z @sentry/react-native + // wysyla tylko bundle JS i source mapy; natywne crashe SIGABRT byly przez to + // nieczytelne. Wersja 4.14.x dziala z AGP 8.x i sentry-android 7.x z RN SDK 6.10. + classpath('io.sentry:sentry-android-gradle-plugin:4.14.1') } } diff --git a/mobile/app.json b/mobile/app.json index 63d064d..1f979a5 100644 --- a/mobile/app.json +++ b/mobile/app.json @@ -2,7 +2,7 @@ "expo": { "name": "goon", "slug": "goon", - "version": "0.4.2", + "version": "0.4.3", "orientation": "portrait", "userInterfaceStyle": "automatic", "newArchEnabled": false,