forked from upstream-mirrors/OpenTracks
Try to takkle down export dir issues
This commit is contained in:
+11
-6
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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…</string>
|
<string name="export_progress_message">Exporting to %1$s…</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>
|
||||||
|
|||||||
Reference in New Issue
Block a user