Try to takkle down export dir issues

This commit is contained in:
Peter Storch
2022-01-01 12:10:47 +01:00
parent 07074ad260
commit 1631836327
7 changed files with 34 additions and 19 deletions
@@ -45,7 +45,7 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity {
protected void onActivityResultCustom(int requestCode, int resultCode, @Nullable Intent resultData) { protected void onActivityResultCustom(int requestCode, int resultCode, @Nullable Intent resultData) {
if (requestCode == DIRECTORY_PICKER_REQUEST_CODE) { if (requestCode == DIRECTORY_PICKER_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK && resultData != null) {
Uri directoryUri = resultData.getData(); Uri directoryUri = resultData.getData();
int takeFlags = resultData.getFlags(); int takeFlags = resultData.getFlags();
@@ -107,16 +107,21 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity {
@Override @Override
protected void onActivityResultCustom(int requestCode, int resultCode, @Nullable Intent resultData) { protected void onActivityResultCustom(int requestCode, int resultCode, @Nullable Intent resultData) {
if (requestCode == DIRECTORY_PICKER_REQUEST_CODE) { if (requestCode == DIRECTORY_PICKER_REQUEST_CODE) {
DocumentFile oldDirectoryUri = PreferencesUtils.getDefaultExportDirectoryUri(this);
switch (resultCode) { switch (resultCode) {
case RESULT_OK: case RESULT_OK:
IntentUtils.releaseDirectoryAccessPermission(getApplicationContext(), PreferencesUtils.getDefaultExportDirectoryUri(this)); if (resultData != null) {
Uri newDirectoryUri = resultData.getData();
if (oldDirectoryUri != null && !newDirectoryUri.equals(oldDirectoryUri.getUri())) {
IntentUtils.releaseDirectoryAccessPermission(getApplicationContext(), oldDirectoryUri);
}
Uri directoryUri = resultData.getData(); PreferencesUtils.setDefaultExportDirectoryUri(newDirectoryUri);
PreferencesUtils.setDefaultExportDirectoryUri(directoryUri); IntentUtils.persistDirectoryAccessPermission(getApplicationContext(), newDirectoryUri, resultData.getFlags());
IntentUtils.persistDirectoryAccessPermission(getApplicationContext(), directoryUri, resultData.getFlags()); }
break; break;
case RESULT_CANCELED: case RESULT_CANCELED:
IntentUtils.releaseDirectoryAccessPermission(getApplicationContext(), PreferencesUtils.getDefaultExportDirectoryUri(this)); IntentUtils.releaseDirectoryAccessPermission(getApplicationContext(), oldDirectoryUri);
PreferencesUtils.setDefaultExportDirectoryUri(null); PreferencesUtils.setDefaultExportDirectoryUri(null);
break; break;
} }
@@ -300,9 +300,9 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
trackRecordingManager.end(trackPointCreator); trackRecordingManager.end(trackPointCreator);
} }
ExportUtils.postWorkoutExport(this, trackId, new ExportServiceResultReceiver(new Handler(), this));
endRecording(true); endRecording(true);
ExportUtils.postWorkoutExport(this, trackId, new ExportServiceResultReceiver(new Handler(), this));
} }
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
@@ -66,7 +66,11 @@ public class ImportExportSettingsFragment extends PreferenceFragmentCompat {
instantExportDirectoryPreference.setSummaryProvider(preference -> { instantExportDirectoryPreference.setSummaryProvider(preference -> {
DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(getContext()); DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(getContext());
//Use same value for not set as Androidx ListPreference and EditTextPreference //Use same value for not set as Androidx ListPreference and EditTextPreference
return directory != null ? directory.getName() : getString(R.string.not_set); if (directory == null) {
return getString(R.string.not_set);
}
return directory.getUri().toString() + (directory.canWrite() ? "" : getString(R.string.export_dir_not_writable));
}); });
} }
} }
@@ -531,12 +531,12 @@ public class PreferencesUtils {
} }
public static DocumentFile getDefaultExportDirectoryUri(Context context) { public static DocumentFile getDefaultExportDirectoryUri(Context context) {
String singleExportDirectorySettingsKey = getString(R.string.settings_default_export_directory_key, null); String singleExportDirectory = getString(R.string.settings_default_export_directory_key, null);
if (singleExportDirectorySettingsKey == null) { if (singleExportDirectory == null) {
return null; return null;
} }
try { try {
return DocumentFile.fromTreeUri(context, Uri.parse(singleExportDirectorySettingsKey)); return DocumentFile.fromTreeUri(context, Uri.parse(singleExportDirectory));
} catch (Exception e) { } catch (Exception e) {
Log.w(TAG, "Could not decode default export directory: " + e.getMessage()); Log.w(TAG, "Could not decode default export directory: " + e.getMessage());
} }
@@ -6,6 +6,7 @@ import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.provider.DocumentsContract; import android.provider.DocumentsContract;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import androidx.documentfile.provider.DocumentFile; import androidx.documentfile.provider.DocumentFile;
@@ -17,6 +18,7 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.io.file.TrackFileFormat; import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.io.file.exporter.ExportService; import de.dennisguse.opentracks.io.file.exporter.ExportService;
@@ -33,6 +35,11 @@ public class ExportUtils {
TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(); TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat();
DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(context); DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(context);
if (directory == null || !directory.canWrite()) {
Toast.makeText(context, R.string.export_cannot_write_to_dir, Toast.LENGTH_LONG).show();
return;
}
ExportService.enqueue(context, resultReceiver, trackId, trackFileFormat, directory.getUri()); ExportService.enqueue(context, resultReceiver, trackId, trackFileFormat, directory.getUri());
} }
} }
@@ -217,13 +217,10 @@ public class IntentUtils {
return; return;
} }
final Uri documentUri = documentFile.getUri(); final Uri documentUri = documentFile.getUri();
final List<UriPermission> persistedUriPermissions = context.getContentResolver().getPersistedUriPermissions(); context.getContentResolver().getPersistedUriPermissions().stream()
for (final UriPermission permission : persistedUriPermissions) { .map(UriPermission::getUri)
final Uri uri = permission.getUri(); .filter(documentUri::equals)
if (uri.equals(documentUri)) { .forEach(u -> context.getContentResolver().releasePersistableUriPermission(u, 0));
context.getContentResolver().releasePersistableUriPermission(uri, 0);
}
}
} }
} }
+2
View File
@@ -201,6 +201,8 @@ limitations under the License.
<string name="export_with_photos">with photos</string> <string name="export_with_photos">with photos</string>
<string name="export_without_photos">without photos</string> <string name="export_without_photos">without photos</string>
<string name="export_error_post_workout">Post-workout export failed, please check the export directory.</string> <string name="export_error_post_workout">Post-workout export failed, please check the export directory.</string>
<string name="export_cannot_write_to_dir">Cannot write to export directory.</string>
<string name="export_dir_not_writable">" (not writable!)"</string>
<string name="export_progress_message">Exporting to %1$s&#8230;</string> <string name="export_progress_message">Exporting to %1$s&#8230;</string>
<string name="export_track_already_exists_msg">The track %1$s already exists at the destination directory.</string> <string name="export_track_already_exists_msg">The track %1$s already exists at the destination directory.</string>
<string name="export_all_do_it_for_all">do it for all conflicts</string> <string name="export_all_do_it_for_all">do it for all conflicts</string>