From b287967bc4f40c8f760b3dcdc0ac87f95e8df174 Mon Sep 17 00:00:00 2001 From: Peter Storch Date: Wed, 15 Dec 2021 20:48:05 +0100 Subject: [PATCH] fix persistable directory permissions --- .../importer/DirectoryChooserActivity.java | 6 +++--- .../opentracks/util/IntentUtils.java | 20 ++++++++++++++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/DirectoryChooserActivity.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/DirectoryChooserActivity.java index f4a28d31e..d2cdbf760 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/DirectoryChooserActivity.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/DirectoryChooserActivity.java @@ -8,7 +8,6 @@ import android.os.Bundle; import android.provider.DocumentsContract; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.documentfile.provider.DocumentFile; @@ -110,14 +109,15 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity { if (requestCode == DIRECTORY_PICKER_REQUEST_CODE) { switch (resultCode) { case RESULT_OK: - Uri directoryUri = resultData.getData(); + IntentUtils.releaseDirectoryAccessPermission(getApplicationContext(), PreferencesUtils.getDefaultExportDirectoryUri(this)); + Uri directoryUri = resultData.getData(); PreferencesUtils.setDefaultExportDirectoryUri(directoryUri); IntentUtils.persistDirectoryAccessPermission(getApplicationContext(), directoryUri, resultData.getFlags()); break; case RESULT_CANCELED: + IntentUtils.releaseDirectoryAccessPermission(getApplicationContext(), PreferencesUtils.getDefaultExportDirectoryUri(this)); PreferencesUtils.setDefaultExportDirectoryUri(null); - //TODO Remove stored permission contentResolver.releasePersistableUriPermission break; } diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java index 762f4346c..b8d13e58d 100644 --- a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java @@ -18,6 +18,7 @@ package de.dennisguse.opentracks.util; import android.content.Context; import android.content.Intent; +import android.content.UriPermission; import android.net.Uri; import android.provider.MediaStore; import android.util.Log; @@ -25,12 +26,14 @@ import android.util.Pair; import androidx.annotation.Nullable; import androidx.core.content.FileProvider; +import androidx.documentfile.provider.DocumentFile; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.List; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.content.DescriptionGenerator; @@ -205,7 +208,22 @@ public class IntentUtils { } public static void persistDirectoryAccessPermission(Context context, Uri directoryUri, int existingFlags) { - int newFlags = existingFlags | (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + int newFlags = existingFlags & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); context.getContentResolver().takePersistableUriPermission(directoryUri, newFlags); } + + public static void releaseDirectoryAccessPermission(Context context, final DocumentFile documentFile) { + if (documentFile == null) { + return; + } + final Uri documentUri = documentFile.getUri(); + final List persistedUriPermissions = context.getContentResolver().getPersistedUriPermissions(); + for (final UriPermission permission : persistedUriPermissions) { + final Uri uri = permission.getUri(); + if (uri.equals(documentUri)) { + context.getContentResolver().releasePersistableUriPermission(uri, 0); + } + } + } + }