diff --git a/android/app/build.gradle b/android/app/build.gradle index 0a357c72..b479f903 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -93,7 +93,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 48 - versionName "23.01.48" + versionName "23.01.49" buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\"" } diff --git a/apks/Schnappix_v23.01.49.aab b/apks/Schnappix_v23.01.49.aab new file mode 100644 index 00000000..a50fd13f Binary files /dev/null and b/apks/Schnappix_v23.01.49.aab differ diff --git a/apks/Schnappix_v23.01.49.apk b/apks/Schnappix_v23.01.49.apk new file mode 100644 index 00000000..b0a90d70 --- /dev/null +++ b/apks/Schnappix_v23.01.49.apk @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3fc2d050c7343ec1f66976b9fb3db34db705b63a1fc0b62e3633035ad993149 +size 116898411 diff --git a/app.json b/app.json index 6a39f8bc..a6f332d7 100644 --- a/app.json +++ b/app.json @@ -3,7 +3,7 @@ "newArchEnabled": true, "name": "Schnappix", "slug": "Schnappix", - "version": "23.01.48", + "version": "23.01.49", "orientation": "landscape", "icon": "./Icon.png", "userInterfaceStyle": "dark", diff --git a/modules/usb-camera/android/src/main/java/expo/modules/usbcamera/UsbCameraView.kt b/modules/usb-camera/android/src/main/java/expo/modules/usbcamera/UsbCameraView.kt index 1e5e26a3..77382a7e 100644 --- a/modules/usb-camera/android/src/main/java/expo/modules/usbcamera/UsbCameraView.kt +++ b/modules/usb-camera/android/src/main/java/expo/modules/usbcamera/UsbCameraView.kt @@ -14,6 +14,34 @@ import expo.modules.kotlin.Promise import expo.modules.kotlin.viewevent.EventDispatcher import androidx.annotation.Keep +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner + +class UsbContextWrapper(base: Context) : android.content.ContextWrapper(base), LifecycleOwner { + override val lifecycle: Lifecycle + get() = (baseContext as LifecycleOwner).lifecycle + + override fun registerReceiver(receiver: android.content.BroadcastReceiver?, filter: android.content.IntentFilter?): android.content.Intent? { + return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { + super.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED) + } else { + super.registerReceiver(receiver, filter) + } + } + + override fun registerReceiver( + receiver: android.content.BroadcastReceiver?, + filter: android.content.IntentFilter?, + broadcastPermission: String?, + scheduler: android.os.Handler? + ): android.content.Intent? { + return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { + super.registerReceiver(receiver, filter, broadcastPermission, scheduler, Context.RECEIVER_EXPORTED) + } else { + super.registerReceiver(receiver, filter, broadcastPermission, scheduler) + } + } +} @Keep class UsbCameraView(context: Context, appContext: AppContext) : ExpoView(context, appContext) { @@ -92,8 +120,10 @@ class UsbCameraView(context: Context, appContext: AppContext) : ExpoView(context activityContext.registerReceiver(permissionReceiver, filter) } - cameraClient = CameraClient.newBuilder(activityContext) - .setCameraStrategy(CameraUvcStrategy(activityContext)) + val safeContext = UsbContextWrapper(activityContext) + + cameraClient = CameraClient.newBuilder(safeContext) + .setCameraStrategy(CameraUvcStrategy(safeContext)) .setCameraRequest(cameraRequest) .setEnableGLES(false) .build() diff --git a/package.json b/package.json index daa1f672..7f550503 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "schnappix", - "version": "23.01.48", + "version": "23.01.49", "main": "index.ts", "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.7.2", diff --git a/src/screens/CameraScreen.tsx b/src/screens/CameraScreen.tsx index 70e95b36..4524d13b 100644 --- a/src/screens/CameraScreen.tsx +++ b/src/screens/CameraScreen.tsx @@ -86,6 +86,20 @@ export default function CameraScreen({ }: CameraScreenProps) { const [permission, requestPermission] = useCameraPermissions(); const [isUsbConnected, setIsUsbConnected] = useState(false); + const [showDisconnectedText, setShowDisconnectedText] = useState(false); + + // Delay showing the "not connected" text so it doesn't flash during background reconnects + useEffect(() => { + let timeout: NodeJS.Timeout; + if (!isUsbConnected) { + timeout = setTimeout(() => { + setShowDisconnectedText(true); + }, 3000); // 3 seconds grace period + } else { + setShowDisconnectedText(false); + } + return () => clearTimeout(timeout); + }, [isUsbConnected]); const [countdown, setCountdown] = useState(countdownDuration); const [isCapturing, setIsCapturing] = useState(false); const [hasStarted, setHasStarted] = useState(false); @@ -744,13 +758,20 @@ export default function CameraScreen({ onCameraReady={handleCameraReady} /> ) : ( - - USB-Kamera nicht verbunden - - 1. Überprüfe, ob das USB-Kabel richtig eingesteckt ist.{'\n\n'} - 2. Falls der Kiosk-Modus aktiv ist: Beende ihn kurz (oben rechts), stecke die Kamera neu ein und setze den Haken bei "Immer zulassen", wenn das Android-Popup erscheint. - - + showDisconnectedText ? ( + + USB-Kamera nicht verbunden + Bitte Kabelverbindung prüfen... + + 1. Überprüfe, ob das USB-Kabel richtig eingesteckt ist.{'\n\n'} + 2. Falls der Kiosk-Modus aktiv ist: Beende ihn kurz (oben rechts), stecke die Kamera neu ein und setze den Haken bei "Immer zulassen", wenn das Android-Popup erscheint. + + + ) : ( + + + + ) ) )}