diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index c8d84eea9..9eb203ca4 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -73,11 +73,13 @@ limitations under the License. + + @@ -135,6 +137,7 @@ limitations under the License. + @@ -192,6 +195,8 @@ limitations under the License. + + 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 056f542fc..8afb65d17 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,6 +16,7 @@ package de.dennisguse.opentracks.io.file.importer; +import android.content.ClipData; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -30,6 +31,10 @@ import androidx.documentfile.provider.DocumentFile; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.ViewModelProvider; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.TrackRecordedActivity; import de.dennisguse.opentracks.databinding.ImportActivityBinding; @@ -47,17 +52,15 @@ public class ImportActivity extends FragmentActivity { public static final String EXTRA_DIRECTORY_URI_KEY = "directory_uri"; - private static final String BUNDLE_TOOLBAR_TITLE = "toolbar_title"; - private static final String BUNDLE_DOCUMENT_URI = "document_uri"; + private static final String BUNDLE_DOCUMENT_URIS = "document_uris"; private static final String BUNDLE_IS_DIRECTORY = "is_directory"; private ImportActivityBinding viewBinding; boolean doubleBackToCancel = false; - private Uri documentUri; + private ArrayList documentUris = new ArrayList<>(); private boolean isDirectory; - private String toolbarTitle; private ImportViewModel viewModel; private ImportViewModel.Summary summary; @@ -70,35 +73,46 @@ public class ImportActivity extends FragmentActivity { Toolbar toolbar = findViewById(R.id.toolbar); - final DocumentFile documentFile; + final Intent intent = getIntent(); + final ClipData intentClipData = intent.getClipData(); + if (savedInstanceState == null) { - if (getIntent().getData() != null) { - documentUri = getIntent().getData(); - isDirectory = false; - } else if (getIntent().getClipData() != null && getIntent().getClipData().getItemCount() > 0) { - documentUri = getIntent().getClipData().getItemAt(0).getUri(); + if (intent.getData() != null) { + documentUris.add(intent.getData()); isDirectory = false; } else { - // Started from DirectoryChooserActivity - documentUri = getIntent().getParcelableExtra(EXTRA_DIRECTORY_URI_KEY); - isDirectory = true; + if (intentClipData != null && intentClipData.getItemCount() > 0) { + for (int i = 0; i < intentClipData.getItemCount(); i++) { + documentUris.add(intentClipData.getItemAt(i).getUri()); + } + isDirectory = false; + } else { + // Started from DirectoryChooserActivity + documentUris.add(intent.getParcelableExtra(EXTRA_DIRECTORY_URI_KEY)); + isDirectory = true; + } } - documentFile = isDirectory ? DocumentFile.fromTreeUri(this, documentUri) : DocumentFile.fromSingleUri(this, documentUri); - toolbarTitle = getString(R.string.import_progress_message, documentFile.getName()); } else { - documentUri = savedInstanceState.getParcelable(BUNDLE_DOCUMENT_URI); - toolbarTitle = savedInstanceState.getString(BUNDLE_TOOLBAR_TITLE); + documentUris = savedInstanceState.getParcelable(BUNDLE_DOCUMENT_URIS); isDirectory = savedInstanceState.getBoolean(BUNDLE_IS_DIRECTORY); - - documentFile = isDirectory ? DocumentFile.fromTreeUri(this, documentUri) : DocumentFile.fromSingleUri(this, documentUri); } - toolbar.setTitle(toolbarTitle); + final List documentFiles; + if (isDirectory) { + documentFiles = new ArrayList<>(); + documentFiles.add(DocumentFile.fromTreeUri(this, documentUris.get(0))); + } else { + documentFiles = documentUris.stream().map(it -> DocumentFile.fromSingleUri(this, it)).collect(Collectors.toList()); + } + + //Works for a directory, but we might have received multiple files via SEND_MULTIPLE. + toolbar.setTitle(getString(R.string.import_progress_message, documentFiles.get(0).getName())); + initViews(); viewModel = new ViewModelProvider(this).get(ImportViewModel.class); - viewModel.getImportData(documentFile).observe(this, data -> { + viewModel.getImportData(documentFiles).observe(this, data -> { summary = data; setProgress(); }); @@ -107,9 +121,8 @@ public class ImportActivity extends FragmentActivity { @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); - outState.putParcelable(BUNDLE_DOCUMENT_URI, documentUri); + outState.putParcelableArrayList(BUNDLE_DOCUMENT_URIS, documentUris); outState.putBoolean(BUNDLE_IS_DIRECTORY, isDirectory); - outState.putString(BUNDLE_TOOLBAR_TITLE, toolbarTitle); } @Override diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportViewModel.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportViewModel.java index 74650fe40..27cfe34fe 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportViewModel.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportViewModel.java @@ -11,7 +11,9 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.content.data.Track; @@ -33,20 +35,20 @@ public class ImportViewModel extends AndroidViewModel implements ImportServiceRe summary = new Summary(); } - public LiveData getImportData(DocumentFile documentFile) { + LiveData getImportData(List documentFiles) { if (importData == null) { importData = new MutableLiveData<>(); - loadData(documentFile); + loadData(documentFiles); } return importData; } - public void cancel() { + void cancel() { cancel = true; } - private void loadData(DocumentFile documentFile) { - List fileList = FileUtils.getFiles(documentFile); + private void loadData(List documentFiles) { + List fileList = documentFiles.stream().map(FileUtils::getFiles).flatMap(Collection::stream).collect(Collectors.toList()); summary.totalCount = fileList.size(); filesToImport.addAll(fileList); importNextFile(); @@ -90,7 +92,7 @@ public class ImportViewModel extends AndroidViewModel implements ImportServiceRe importNextFile(); } - public static class Summary { + static class Summary { private int totalCount; private int successCount; private int existsCount;