forked from upstream-mirrors/OpenTracks
@@ -73,11 +73,13 @@ limitations under the License.
|
|||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND" />
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<data android:mimeType="application/gpx+xml" />
|
<data android:mimeType="application/gpx+xml" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND" />
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<data android:mimeType="application/gpx" />
|
<data android:mimeType="application/gpx" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@@ -135,6 +137,7 @@ limitations under the License.
|
|||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND" />
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<data android:mimeType="application/vnd.google-earth.kmz" />
|
<data android:mimeType="application/vnd.google-earth.kmz" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@@ -192,6 +195,8 @@ limitations under the License.
|
|||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND" />
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<data android:mimeType="application/vnd.google-earth.kml+xml" />
|
<data android:mimeType="application/vnd.google-earth.kml+xml" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package de.dennisguse.opentracks.io.file.importer;
|
package de.dennisguse.opentracks.io.file.importer;
|
||||||
|
|
||||||
|
import android.content.ClipData;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -30,6 +31,10 @@ import androidx.documentfile.provider.DocumentFile;
|
|||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
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.R;
|
||||||
import de.dennisguse.opentracks.TrackRecordedActivity;
|
import de.dennisguse.opentracks.TrackRecordedActivity;
|
||||||
import de.dennisguse.opentracks.databinding.ImportActivityBinding;
|
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";
|
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_URIS = "document_uris";
|
||||||
private static final String BUNDLE_DOCUMENT_URI = "document_uri";
|
|
||||||
private static final String BUNDLE_IS_DIRECTORY = "is_directory";
|
private static final String BUNDLE_IS_DIRECTORY = "is_directory";
|
||||||
|
|
||||||
private ImportActivityBinding viewBinding;
|
private ImportActivityBinding viewBinding;
|
||||||
|
|
||||||
boolean doubleBackToCancel = false;
|
boolean doubleBackToCancel = false;
|
||||||
|
|
||||||
private Uri documentUri;
|
private ArrayList<Uri> documentUris = new ArrayList<>();
|
||||||
private boolean isDirectory;
|
private boolean isDirectory;
|
||||||
private String toolbarTitle;
|
|
||||||
|
|
||||||
private ImportViewModel viewModel;
|
private ImportViewModel viewModel;
|
||||||
private ImportViewModel.Summary summary;
|
private ImportViewModel.Summary summary;
|
||||||
@@ -70,35 +73,46 @@ public class ImportActivity extends FragmentActivity {
|
|||||||
|
|
||||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||||
|
|
||||||
final DocumentFile documentFile;
|
final Intent intent = getIntent();
|
||||||
|
final ClipData intentClipData = intent.getClipData();
|
||||||
|
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
if (getIntent().getData() != null) {
|
if (intent.getData() != null) {
|
||||||
documentUri = getIntent().getData();
|
documentUris.add(intent.getData());
|
||||||
isDirectory = false;
|
|
||||||
} else if (getIntent().getClipData() != null && getIntent().getClipData().getItemCount() > 0) {
|
|
||||||
documentUri = getIntent().getClipData().getItemAt(0).getUri();
|
|
||||||
isDirectory = false;
|
isDirectory = false;
|
||||||
} else {
|
} else {
|
||||||
// Started from DirectoryChooserActivity
|
if (intentClipData != null && intentClipData.getItemCount() > 0) {
|
||||||
documentUri = getIntent().getParcelableExtra(EXTRA_DIRECTORY_URI_KEY);
|
for (int i = 0; i < intentClipData.getItemCount(); i++) {
|
||||||
isDirectory = true;
|
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 {
|
} else {
|
||||||
documentUri = savedInstanceState.getParcelable(BUNDLE_DOCUMENT_URI);
|
documentUris = savedInstanceState.getParcelable(BUNDLE_DOCUMENT_URIS);
|
||||||
toolbarTitle = savedInstanceState.getString(BUNDLE_TOOLBAR_TITLE);
|
|
||||||
isDirectory = savedInstanceState.getBoolean(BUNDLE_IS_DIRECTORY);
|
isDirectory = savedInstanceState.getBoolean(BUNDLE_IS_DIRECTORY);
|
||||||
|
|
||||||
documentFile = isDirectory ? DocumentFile.fromTreeUri(this, documentUri) : DocumentFile.fromSingleUri(this, documentUri);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toolbar.setTitle(toolbarTitle);
|
final List<DocumentFile> 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();
|
initViews();
|
||||||
|
|
||||||
viewModel = new ViewModelProvider(this).get(ImportViewModel.class);
|
viewModel = new ViewModelProvider(this).get(ImportViewModel.class);
|
||||||
viewModel.getImportData(documentFile).observe(this, data -> {
|
viewModel.getImportData(documentFiles).observe(this, data -> {
|
||||||
summary = data;
|
summary = data;
|
||||||
setProgress();
|
setProgress();
|
||||||
});
|
});
|
||||||
@@ -107,9 +121,8 @@ public class ImportActivity extends FragmentActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onSaveInstanceState(@NonNull Bundle outState) {
|
protected void onSaveInstanceState(@NonNull Bundle outState) {
|
||||||
super.onSaveInstanceState(outState);
|
super.onSaveInstanceState(outState);
|
||||||
outState.putParcelable(BUNDLE_DOCUMENT_URI, documentUri);
|
outState.putParcelableArrayList(BUNDLE_DOCUMENT_URIS, documentUris);
|
||||||
outState.putBoolean(BUNDLE_IS_DIRECTORY, isDirectory);
|
outState.putBoolean(BUNDLE_IS_DIRECTORY, isDirectory);
|
||||||
outState.putString(BUNDLE_TOOLBAR_TITLE, toolbarTitle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ import androidx.lifecycle.LiveData;
|
|||||||
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.MutableLiveData;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.content.data.Track;
|
import de.dennisguse.opentracks.content.data.Track;
|
||||||
@@ -33,20 +35,20 @@ public class ImportViewModel extends AndroidViewModel implements ImportServiceRe
|
|||||||
summary = new Summary();
|
summary = new Summary();
|
||||||
}
|
}
|
||||||
|
|
||||||
public LiveData<Summary> getImportData(DocumentFile documentFile) {
|
LiveData<Summary> getImportData(List<DocumentFile> documentFiles) {
|
||||||
if (importData == null) {
|
if (importData == null) {
|
||||||
importData = new MutableLiveData<>();
|
importData = new MutableLiveData<>();
|
||||||
loadData(documentFile);
|
loadData(documentFiles);
|
||||||
}
|
}
|
||||||
return importData;
|
return importData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancel() {
|
void cancel() {
|
||||||
cancel = true;
|
cancel = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadData(DocumentFile documentFile) {
|
private void loadData(List<DocumentFile> documentFiles) {
|
||||||
List<DocumentFile> fileList = FileUtils.getFiles(documentFile);
|
List<DocumentFile> fileList = documentFiles.stream().map(FileUtils::getFiles).flatMap(Collection::stream).collect(Collectors.toList());
|
||||||
summary.totalCount = fileList.size();
|
summary.totalCount = fileList.size();
|
||||||
filesToImport.addAll(fileList);
|
filesToImport.addAll(fileList);
|
||||||
importNextFile();
|
importNextFile();
|
||||||
@@ -90,7 +92,7 @@ public class ImportViewModel extends AndroidViewModel implements ImportServiceRe
|
|||||||
importNextFile();
|
importNextFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Summary {
|
static class Summary {
|
||||||
private int totalCount;
|
private int totalCount;
|
||||||
private int successCount;
|
private int successCount;
|
||||||
private int existsCount;
|
private int existsCount;
|
||||||
|
|||||||
Reference in New Issue
Block a user