orchestrate initialization with callback

This commit is contained in:
Urko. 2024-01-30 20:32:49 +01:00
parent e0b84683d0
commit 19b7d4c019
2 changed files with 59 additions and 16 deletions

View File

@ -130,6 +130,7 @@ class MainActivity : AppCompatActivity() {
val serviceIntent = Intent(this, RecordingService::class.java).apply { val serviceIntent = Intent(this, RecordingService::class.java).apply {
action = RecordingService.ACTION_STOP_RECORDING action = RecordingService.ACTION_STOP_RECORDING
} }
// startService(serviceIntent) // Note: Using startService to send the stop action
stopService(serviceIntent) stopService(serviceIntent)
} }

View File

@ -37,6 +37,19 @@ class RecordingService : LifecycleService() {
private var videoCapture: VideoCapture<Recorder>? = null private var videoCapture: VideoCapture<Recorder>? = null
private var recording: Recording? = null private var recording: Recording? = null
private lateinit var cameraExecutor: ExecutorService private lateinit var cameraExecutor: ExecutorService
private var isCameraInitialized = false
private var cameraInitializedCallback: CameraInitializedCallback? = null
companion object {
const val ACTION_START_RECORDING = "com.urkob.wittrail_android.action.START_RECORDING"
const val ACTION_STOP_RECORDING = "com.urkob.wittrail_android.action.STOP_RECORDING"
private const val CHANNEL_ID = "ForegroundServiceChannel"
private const val NOTIFICATION_ID = 1
}
private fun setCameraInitializedCallback(callback: CameraInitializedCallback) {
this.cameraInitializedCallback = callback
}
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
@ -54,9 +67,15 @@ class RecordingService : LifecycleService() {
.build() .build()
videoCapture = VideoCapture.withOutput(recorder) videoCapture = VideoCapture.withOutput(recorder)
Log.e(tag, "videoCapture initialized")
// Now we can start the camera // Now we can start the camera
startCamera() startCamera()
isCameraInitialized = true
isCameraInitialized = true
cameraInitializedCallback?.onCameraInitialized()
cameraInitializedCallback = null
}, ContextCompat.getMainExecutor(this)) }, ContextCompat.getMainExecutor(this))
Log.e(tag, "END onCreate") Log.e(tag, "END onCreate")
@ -74,7 +93,8 @@ class RecordingService : LifecycleService() {
} }
} }
private fun createNotification(): Notification {
private fun createNotification(): Notification {
val notificationIntent = Intent(this, MainActivity::class.java) val notificationIntent = Intent(this, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity( val pendingIntent = PendingIntent.getActivity(
this, this,
@ -92,17 +112,23 @@ class RecordingService : LifecycleService() {
.build() .build()
} }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
useFrontCamera = intent?.getBooleanExtra("useFrontCamera", false) ?: false useFrontCamera = intent?.getBooleanExtra("useFrontCamera", false) ?: false
when (intent?.action) { when (intent?.action) {
ACTION_START_RECORDING -> { ACTION_START_RECORDING -> {
Log.e(tag, ACTION_START_RECORDING) if (isCameraInitialized) {
captureVideo() captureVideo()
} else {
setCameraInitializedCallback(object : CameraInitializedCallback {
override fun onCameraInitialized() {
captureVideo()
}
})
}
} }
ACTION_STOP_RECORDING -> { ACTION_STOP_RECORDING -> {
Log.e(tag, ACTION_STOP_RECORDING) Log.e(tag, ACTION_STOP_RECORDING)
stopRecording() stopRecording()
// return START_NOT_STICKY // return START_NOT_STICKY
} }
@ -113,6 +139,11 @@ class RecordingService : LifecycleService() {
// override fun onDestroy() { // override fun onDestroy() {
// Log.e(tag, "ON DESTROY IS CALLED SHOUlD STOP CAMERA") // Log.e(tag, "ON DESTROY IS CALLED SHOUlD STOP CAMERA")
// // Release resources
// stopRecording()
// cameraExecutor.shutdown()
// // Consider releasing cameraProvider here if needed
// Log.e(tag, "Resources released")
// super.onDestroy() // super.onDestroy()
// } // }
@ -135,8 +166,19 @@ class RecordingService : LifecycleService() {
// Implements VideoCapture use case, including start and stop capturing. // Implements VideoCapture use case, including start and stop capturing.
private fun captureVideo() { private fun captureVideo() {
if (!isCameraInitialized) {
Log.e(tag, "Camera not initialized yet.")
// Optionally, queue this request or set a flag to try again later
return
}
Log.e(tag, "START CAPTURE VIDEO") Log.e(tag, "START CAPTURE VIDEO")
val videoCapture = this.videoCapture ?: return
Log.e(tag, "Attempting to start video capture")
val videoCapture = this.videoCapture ?: run {
Log.e(tag, "VideoCapture not initialized")
return
}
val curRecording = recording val curRecording = recording
if (curRecording != null) { if (curRecording != null) {
@ -192,22 +234,22 @@ class RecordingService : LifecycleService() {
} }
} }
} }
companion object {
const val ACTION_START_RECORDING = "com.urkob.wittrail_android.action.START_RECORDING"
const val ACTION_STOP_RECORDING = "com.urkob.wittrail_android.action.STOP_RECORDING"
private const val CHANNEL_ID = "ForegroundServiceChannel"
private const val NOTIFICATION_ID = 1
}
private fun stopRecording() {
Log.e(tag, "stopRecording")
private fun stopRecording() {
Log.e(tag, "Attempting to stop recording")
val curRecording = recording val curRecording = recording
if (curRecording != null) { if (curRecording != null) {
Log.e(tag, "stopRecording curRecording != null Stop the current recording session")
curRecording.stop() curRecording.stop()
recording = null recording = null
return Log.e(tag, "Recording stopped. Now stopping service.")
stopSelf() // Add this line to stop the service.
} else {
Log.e(tag, "No active recording to stop")
} }
} }
} }
interface CameraInitializedCallback {
fun onCameraInitialized()
}