66import android .content .Intent ;
77import android .content .IntentFilter ;
88import android .content .SharedPreferences ;
9+ import android .content .UriPermission ;
910import android .content .pm .PackageInfo ;
1011import android .content .pm .PackageManager ;
1112import android .content .res .ColorStateList ;
@@ -160,6 +161,68 @@ private void resetApp()
160161 }
161162 }
162163
164+ private boolean hasUriPermission (Uri uri ) {
165+ for (UriPermission perm : getContentResolver ().getPersistedUriPermissions ()) {
166+ if (perm .getUri ().equals (uri ) && perm .isWritePermission ()) {
167+ return true ;
168+ }
169+ }
170+ return false ;
171+ }
172+
173+ private void resetFolderPermissions () {
174+ // Retrieve the stored DVR folder URI
175+ SharedPreferences prefs = getSharedPreferences ("general" , Context .MODE_PRIVATE );
176+ String dvrFolderUriString = prefs .getString ("dvr_folder_" , null );
177+ if (dvrFolderUriString == null ) {
178+ Toast .makeText (this , "No folder permissions to reset." , Toast .LENGTH_SHORT ).show ();
179+ return ;
180+ }
181+
182+ Uri dvrUri = Uri .parse (dvrFolderUriString );
183+
184+ // Revoke persisted URI permissions
185+ for (UriPermission perm : getContentResolver ().getPersistedUriPermissions ()) {
186+ if (perm .getUri ().equals (dvrUri )) {
187+ getContentResolver ().releasePersistableUriPermission (perm .getUri (), Intent .FLAG_GRANT_READ_URI_PERMISSION |
188+ Intent .FLAG_GRANT_WRITE_URI_PERMISSION );
189+ Log .d (TAG , "Released URI permission for: " + perm .getUri ());
190+ }
191+ }
192+
193+ // Clear the stored URI from SharedPreferences
194+ SharedPreferences .Editor editor = prefs .edit ();
195+ editor .remove ("dvr_folder_" );
196+ editor .apply ();
197+
198+ // Stop any ongoing DVR recording
199+ if (dvrFd != null ) {
200+ stopDvr ();
201+ }
202+
203+ // Update the record button icon to default
204+ binding .imgBtnRecord .setImageResource (R .drawable .record );
205+
206+ // Reset any related UI elements
207+ binding .txtRecordLabel .setVisibility (View .GONE );
208+ binding .imgRecIndicator .setVisibility (View .INVISIBLE );
209+
210+ // Inform the user
211+ Toast .makeText (this , "Folder permissions have been reset." , Toast .LENGTH_LONG ).show ();
212+
213+ // Optionally, prompt the user to select a new folder immediately
214+ // Uncomment the following lines if you want to prompt immediately
215+ /*
216+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
217+ intent.addCategory(Intent.CATEGORY_DEFAULT);
218+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |
219+ Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
220+ Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
221+ startActivityForResult(intent, PICK_DVR_REQUEST_CODE);
222+ */
223+ }
224+
225+
163226 @ SuppressLint ("ClickableViewAccessibility" )
164227 @ Override
165228 protected void onCreate (Bundle savedInstanceState ) {
@@ -318,18 +381,7 @@ public void onStopTrackingTouch(SeekBar distanceSeekBar) { }
318381 chart .setData (noData );
319382
320383 binding .imgBtnRecord .setOnClickListener (item -> {
321- if (dvrFd == null ) {
322- Uri dvrUri = openDvrFile ();
323- if (dvrUri != null ) {
324- startDvr (dvrUri );
325- } else {
326- Intent intent = new Intent (Intent .ACTION_OPEN_DOCUMENT_TREE );
327- intent .addCategory (Intent .CATEGORY_DEFAULT );
328- startActivityForResult (intent , PICK_DVR_REQUEST_CODE );
329- }
330- } else {
331- stopDvr ();
332- }
384+ startStopDvr ();
333385 });
334386
335387 binding .btnSettings .setOnClickListener (v -> {
@@ -395,18 +447,7 @@ public void onStopTrackingTouch(SeekBar distanceSeekBar) { }
395447 SubMenu recording = popup .getMenu ().addSubMenu ("Recording" );
396448 MenuItem dvrBtn = recording .add (dvrFd == null ? "Start" : "Stop" );
397449 dvrBtn .setOnMenuItemClickListener (item -> {
398- if (dvrFd == null ) {
399- Uri dvrUri = openDvrFile ();
400- if (dvrUri != null ) {
401- startDvr (dvrUri );
402- } else {
403- Intent intent = new Intent (Intent .ACTION_OPEN_DOCUMENT_TREE );
404- intent .addCategory (Intent .CATEGORY_DEFAULT );
405- startActivityForResult (intent , PICK_DVR_REQUEST_CODE );
406- }
407- } else {
408- stopDvr ();
409- }
450+ startStopDvr ();
410451 return true ;
411452 });
412453 MenuItem fmp4 = recording .add ("fMP4" );
@@ -421,6 +462,12 @@ public void onStopTrackingTouch(SeekBar distanceSeekBar) { }
421462 return false ;
422463 });
423464
465+ MenuItem resetPermissions = recording .add ("Reset DVR folder" );
466+ resetPermissions .setOnMenuItemClickListener (item -> {
467+ resetFolderPermissions ();
468+ return true ;
469+ });
470+
424471 SubMenu help = popup .getMenu ().addSubMenu ("Help" );
425472 MenuItem logs = help .add ("Send Logs" );
426473 logs .setOnMenuItemClickListener (item -> {
@@ -543,6 +590,24 @@ private Uri openDvrFile() {
543590 return null ;
544591 }
545592
593+ private void startStopDvr () {
594+ if (dvrFd == null ) {
595+ Uri dvrUri = openDvrFile ();
596+ if (dvrUri != null ) {
597+ startDvr (dvrUri );
598+ } else {
599+ Intent intent = new Intent (Intent .ACTION_OPEN_DOCUMENT_TREE );
600+ intent .addCategory (Intent .CATEGORY_DEFAULT );
601+ intent .addFlags (Intent .FLAG_GRANT_READ_URI_PERMISSION |
602+ Intent .FLAG_GRANT_WRITE_URI_PERMISSION |
603+ Intent .FLAG_GRANT_PERSISTABLE_URI_PERMISSION );
604+ startActivityForResult (intent , PICK_DVR_REQUEST_CODE );
605+ }
606+ } else {
607+ stopDvr ();
608+ }
609+ }
610+
546611 private void startDvr (Uri dvrUri ) {
547612 if (dvrFd != null ) {
548613 stopDvr ();
@@ -630,6 +695,11 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
630695 Uri uri ;
631696 if (data != null && data .getData () != null ) {
632697 uri = data .getData ();
698+ final int takeFlags = data .getFlags () &
699+ (Intent .FLAG_GRANT_READ_URI_PERMISSION |
700+ Intent .FLAG_GRANT_WRITE_URI_PERMISSION );
701+ getContentResolver ().takePersistableUriPermission (uri , takeFlags );
702+
633703 // Perform operations on the document using its URI.
634704 SharedPreferences prefs = getSharedPreferences ("general" , Context .MODE_PRIVATE );
635705 SharedPreferences .Editor editor = prefs .edit ();
@@ -743,7 +813,6 @@ protected void onResume() {
743813 wfbLinkManager .refreshAdapters ();
744814 osdManager .restoreOSDConfig ();
745815
746- registerReceivers ();
747816 super .onResume ();
748817 }
749818
0 commit comments