diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/ExportActivity.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/ExportActivity.java index 17872ffd9..cb06ffb76 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/ExportActivity.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/ExportActivity.java @@ -16,13 +16,17 @@ package de.dennisguse.opentracks.io.file.exporter; +import android.Manifest; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; +import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.FragmentActivity; import java.io.File; @@ -41,6 +45,8 @@ import de.dennisguse.opentracks.util.FileUtils; */ public class ExportActivity extends FragmentActivity implements FileTypeDialogFragment.FileTypeCaller { + private static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 6; + private static final int DIALOG_PROGRESS_ID = 0; private static final int DIALOG_RESULT_ID = 1; @@ -59,6 +65,27 @@ public class ExportActivity extends FragmentActivity implements FileTypeDialogFr public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (!FileUtils.isExternalStorageWriteable() || ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE); + } else { + fileTypeDialogStart(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (requestCode == EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE) { + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { + Toast.makeText(this, R.string.external_storage_not_writable, Toast.LENGTH_LONG).show(); + } else { + fileTypeDialogStart(); + } + return; + } + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + + private void fileTypeDialogStart() { FileTypeDialogFragment .newInstance(R.string.export_all_title, R.string.export_all_option) .show(getSupportFragmentManager(), FileTypeDialogFragment.FILE_TYPE_DIALOG_TAG); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportActivity.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportActivity.java index 0d198f2e1..ae579c8b8 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportActivity.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportActivity.java @@ -16,13 +16,17 @@ package de.dennisguse.opentracks.io.file.importer; +import android.Manifest; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; +import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.FragmentActivity; import java.io.File; @@ -41,7 +45,8 @@ import de.dennisguse.opentracks.util.FileUtils; */ public class ImportActivity extends FragmentActivity implements FileTypeDialogFragment.FileTypeCaller { - private static final String TAG = ImportActivity.class.getSimpleName(); + private static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 6; + private static final int DIALOG_PROGRESS_ID = 0; private static final int DIALOG_RESULT_ID = 1; @@ -61,12 +66,32 @@ public class ImportActivity extends FragmentActivity implements FileTypeDialogFr public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (!FileUtils.isExternalStorageWriteable() || ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE); + } else { + fileTypeDialogStart(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (requestCode == EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE) { + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { + Toast.makeText(this, R.string.external_storage_not_readable, Toast.LENGTH_LONG).show(); + } else { + fileTypeDialogStart(); + } + return; + } + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + + private void fileTypeDialogStart() { FileTypeDialogFragment .newInstance(R.string.import_selection_title, R.string.import_selection_option) .show(getSupportFragmentManager(), FileTypeDialogFragment.FILE_TYPE_DIALOG_TAG); } - @Override public void onFileTypeDone(TrackFileFormat trackFileFormat) { if (!FileUtils.isExternalStorageAvailable()) { diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 16ae1b280..983abdb15 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -509,6 +509,9 @@ limitations under the License. External storage not writable + + External storage not readable +