@@ -235,8 +235,9 @@ public int onStartCommand(Intent intent, int flags, int startId) {
235235 if (worker == null || !prefs ().getBoolean (DashcamSettingsController .KEY_ENABLED , false )) {
236236 return START_STICKY ;
237237 }
238- armEventCapture ();
239- DashcamEventOverlayService .showConfirmation (this );
238+ if (armEventCapture ()) {
239+ DashcamEventOverlayService .showConfirmation (this );
240+ }
240241 return START_STICKY ;
241242 }
242243
@@ -433,20 +434,35 @@ private void onSegmentCompleted(File baseDir, String baseName, long startMs, lon
433434 }
434435 }
435436
436- private void armEventCapture () {
437+ private boolean armEventCapture () {
437438 long now = System .currentTimeMillis ();
438439 String eventBaseName = "event_" + makeTimestampBase (now , "yyMMddHHmmssSSS" );
439- File eventDir = new File (getEventsBaseDir (), eventBaseName );
440- // noinspection ResultOfMethodCallIgnored
441- eventDir .mkdirs ();
440+ File eventsBaseDir = getEventsBaseDir ();
441+ if (eventsBaseDir == null ) {
442+ DevRuntimeLog .add ("RecordingService" , "Event capture failed: events base dir unavailable" );
443+ Log .e (TAG , "Failed to arm event capture because events base dir is unavailable" );
444+ return false ;
445+ }
446+ File eventDir = new File (eventsBaseDir , eventBaseName );
447+ if (!ensureDirectoryExists (eventDir , "event dir" )) {
448+ DevRuntimeLog .add ("RecordingService" , "Event capture failed: mkdir " + eventDir .getAbsolutePath ());
449+ Log .e (TAG , "Failed to create event dir " + eventDir .getAbsolutePath ());
450+ return false ;
451+ }
442452 synchronized (eventLock ) {
443453 long currentSegmentOrdinal = completedSegmentCount + 1L ;
444454 pendingEventRequests .add (new EventCaptureRequest (
445455 eventBaseName ,
446456 Math .max (1L , currentSegmentOrdinal - EVENT_SEGMENTS_BEFORE_CURRENT ),
447457 currentSegmentOrdinal + EVENT_SEGMENTS_AFTER_CURRENT
448458 ));
459+ DevRuntimeLog .add (
460+ "RecordingService" ,
461+ "Event armed: " + eventBaseName
462+ + " ordinals " + Math .max (1L , currentSegmentOrdinal - EVENT_SEGMENTS_BEFORE_CURRENT )
463+ + "-" + (currentSegmentOrdinal + EVENT_SEGMENTS_AFTER_CURRENT ));
449464 }
465+ return true ;
450466 }
451467
452468 private List <EventCopyJob > collectEventCopyJobsLocked (long completedThroughOrdinal ) {
@@ -492,9 +508,19 @@ private void copyEventSegments(EventCopyJob job) {
492508 Log .w (TAG , "Skipping empty event copy job for " + job .eventBaseName );
493509 return ;
494510 }
495- File eventDir = new File (getEventsBaseDir (), job .eventBaseName );
496- // noinspection ResultOfMethodCallIgnored
497- eventDir .mkdirs ();
511+ File eventsBaseDir = getEventsBaseDir ();
512+ if (eventsBaseDir == null ) {
513+ DevRuntimeLog .add ("RecordingService" , "Event copy failed: events base dir unavailable" );
514+ Log .e (TAG , "Failed to copy event segments because events base dir is unavailable" );
515+ return ;
516+ }
517+ File eventDir = new File (eventsBaseDir , job .eventBaseName );
518+ if (!ensureDirectoryExists (eventDir , "event dir" )) {
519+ DevRuntimeLog .add ("RecordingService" , "Event copy failed: mkdir " + eventDir .getAbsolutePath ());
520+ Log .e (TAG , "Failed to create event dir " + eventDir .getAbsolutePath ());
521+ return ;
522+ }
523+ DevRuntimeLog .add ("RecordingService" , "Event copy: " + job .eventBaseName + " files " + job .baseNames .size ());
498524 for (String baseName : job .baseNames ) {
499525 copySegmentGroup (DashcamSettingsController .getRecordsBaseDir (this ), eventDir , baseName );
500526 }
@@ -603,22 +629,39 @@ private void cleanupOldSegments(File baseDir, int keepSegments, Set<String> prot
603629
604630 private File getEventsBaseDir () {
605631 File dir = new File (DashcamSettingsController .getRecordsBaseDir (this ), "events" );
606- // noinspection ResultOfMethodCallIgnored
607- dir .mkdirs ();
608- return dir ;
632+ return ensureDirectoryExists (dir , "events base dir" ) ? dir : null ;
609633 }
610634
611635 private File requireBaseDir () {
612636 File baseDir = DashcamSettingsController .getRecordsBaseDir (this );
613- // noinspection ResultOfMethodCallIgnored
614- baseDir .mkdirs ();
615- if (baseDir .exists () && baseDir .canWrite ()) {
637+ if (ensureDirectoryExists (baseDir , "records base dir" ) && baseDir .canWrite ()) {
616638 return baseDir ;
617639 }
618640 publishStatus (STATUS_ERROR , 0 , TOTAL_CAMERAS , "storage not writable" );
619641 return null ;
620642 }
621643
644+ private boolean ensureDirectoryExists (File dir , String label ) {
645+ if (dir == null ) {
646+ return false ;
647+ }
648+ if (dir .exists ()) {
649+ if (dir .isDirectory ()) {
650+ return true ;
651+ }
652+ Log .e (TAG , label + " exists but is not a directory: " + dir .getAbsolutePath ());
653+ return false ;
654+ }
655+ if (dir .mkdirs ()) {
656+ return true ;
657+ }
658+ boolean created = dir .exists () && dir .isDirectory ();
659+ if (!created ) {
660+ Log .e (TAG , "Failed to create " + label + ": " + dir .getAbsolutePath ());
661+ }
662+ return created ;
663+ }
664+
622665 private String makeTimestampBase (long epochMs , String pattern ) {
623666 return new SimpleDateFormat (pattern , Locale .US ).format (epochMs );
624667 }
0 commit comments