Skip to content

Commit 7e66365

Browse files
authored
Better DVR permission handling (#30)
1 parent 0572ae3 commit 7e66365

File tree

1 file changed

+94
-25
lines changed

1 file changed

+94
-25
lines changed

app/src/main/java/com/openipc/pixelpilot/VideoActivity.java

Lines changed: 94 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.content.Intent;
77
import android.content.IntentFilter;
88
import android.content.SharedPreferences;
9+
import android.content.UriPermission;
910
import android.content.pm.PackageInfo;
1011
import android.content.pm.PackageManager;
1112
import 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

Comments
 (0)