|
@@ -26,6 +26,7 @@ package com.owncloud.android.ui.adapter;
|
|
|
|
|
|
import android.accounts.Account;
|
|
|
import android.content.ActivityNotFoundException;
|
|
|
+import android.content.Context;
|
|
|
import android.content.Intent;
|
|
|
import android.graphics.Bitmap;
|
|
|
import android.graphics.drawable.Drawable;
|
|
@@ -44,10 +45,13 @@ import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter;
|
|
|
import com.afollestad.sectionedrecyclerview.SectionedViewHolder;
|
|
|
import com.nextcloud.client.account.User;
|
|
|
import com.nextcloud.client.account.UserAccountManager;
|
|
|
+import com.nextcloud.client.core.Clock;
|
|
|
import com.nextcloud.client.device.PowerManagementService;
|
|
|
import com.nextcloud.client.network.ConnectivityService;
|
|
|
import com.nextcloud.java.util.Optional;
|
|
|
+import com.owncloud.android.MainApp;
|
|
|
import com.owncloud.android.R;
|
|
|
+import com.owncloud.android.datamodel.FileDataStorageManager;
|
|
|
import com.owncloud.android.datamodel.OCFile;
|
|
|
import com.owncloud.android.datamodel.ThumbnailsCacheManager;
|
|
|
import com.owncloud.android.datamodel.UploadsStorageManager;
|
|
@@ -56,7 +60,10 @@ import com.owncloud.android.db.OCUpload;
|
|
|
import com.owncloud.android.db.OCUploadComparator;
|
|
|
import com.owncloud.android.db.UploadResult;
|
|
|
import com.owncloud.android.files.services.FileUploader;
|
|
|
+import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
|
|
|
import com.owncloud.android.lib.common.utils.Log_OC;
|
|
|
+import com.owncloud.android.operations.RefreshFolderOperation;
|
|
|
+import com.owncloud.android.ui.activity.ConflictsResolveActivity;
|
|
|
import com.owncloud.android.ui.activity.FileActivity;
|
|
|
import com.owncloud.android.utils.DisplayUtils;
|
|
|
import com.owncloud.android.utils.MimeTypeUtil;
|
|
@@ -78,9 +85,11 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
|
|
|
private ProgressListener progressListener;
|
|
|
private FileActivity parentActivity;
|
|
|
private UploadsStorageManager uploadsStorageManager;
|
|
|
+ private FileDataStorageManager storageManager;
|
|
|
private ConnectivityService connectivityService;
|
|
|
private PowerManagementService powerManagementService;
|
|
|
private UserAccountManager accountManager;
|
|
|
+ private Clock clock;
|
|
|
private UploadGroup[] uploadGroups;
|
|
|
private boolean showUser;
|
|
|
|
|
@@ -161,15 +170,19 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
|
|
|
|
|
|
public UploadListAdapter(final FileActivity fileActivity,
|
|
|
final UploadsStorageManager uploadsStorageManager,
|
|
|
+ final FileDataStorageManager storageManager,
|
|
|
final UserAccountManager accountManager,
|
|
|
final ConnectivityService connectivityService,
|
|
|
- final PowerManagementService powerManagementService) {
|
|
|
+ final PowerManagementService powerManagementService,
|
|
|
+ final Clock clock) {
|
|
|
Log_OC.d(TAG, "UploadListAdapter");
|
|
|
this.parentActivity = fileActivity;
|
|
|
this.uploadsStorageManager = uploadsStorageManager;
|
|
|
+ this.storageManager = storageManager;
|
|
|
this.accountManager = accountManager;
|
|
|
this.connectivityService = connectivityService;
|
|
|
this.powerManagementService = powerManagementService;
|
|
|
+ this.clock = clock;
|
|
|
uploadGroups = new UploadGroup[3];
|
|
|
|
|
|
shouldShowHeadersForEmptySections(false);
|
|
@@ -339,26 +352,58 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
|
|
|
|
|
|
// click on item
|
|
|
if (item.getUploadStatus() == UploadStatus.UPLOAD_FAILED) {
|
|
|
- if (UploadResult.CREDENTIAL_ERROR == item.getLastResult()) {
|
|
|
- itemViewHolder.itemLayout.setOnClickListener(v ->
|
|
|
- parentActivity.getFileOperationsHelper().checkCurrentCredentials(
|
|
|
- item.getAccount(accountManager)));
|
|
|
- } else {
|
|
|
- // not a credentials error
|
|
|
- itemViewHolder.itemLayout.setOnClickListener(v -> {
|
|
|
- File file = new File(item.getLocalPath());
|
|
|
- if (file.exists()) {
|
|
|
- FileUploader.UploadRequester requester = new FileUploader.UploadRequester();
|
|
|
- requester.retry(parentActivity, accountManager, item);
|
|
|
- loadUploadItemsFromDb();
|
|
|
- } else {
|
|
|
- DisplayUtils.showSnackMessage(
|
|
|
- v.getRootView().findViewById(android.R.id.content),
|
|
|
- R.string.local_file_not_found_message
|
|
|
- );
|
|
|
+ final UploadResult uploadResult = item.getLastResult();
|
|
|
+ itemViewHolder.itemLayout.setOnClickListener(v -> {
|
|
|
+ if (uploadResult == UploadResult.CREDENTIAL_ERROR) {
|
|
|
+ parentActivity.getFileOperationsHelper().checkCurrentCredentials(
|
|
|
+ item.getAccount(accountManager));
|
|
|
+ return;
|
|
|
+ } else if (uploadResult == UploadResult.SYNC_CONFLICT) {
|
|
|
+ String remotePath = item.getRemotePath();
|
|
|
+ OCFile ocFile = storageManager.getFileByPath(remotePath);
|
|
|
+
|
|
|
+ if (ocFile == null) { // Remote file doesn't exist, try to refresh folder
|
|
|
+ OCFile folder = storageManager.getFileByPath(new File(remotePath).getParent() + "/");
|
|
|
+ if (folder != null && folder.isFolder()) {
|
|
|
+ if (optionalUser.isPresent()) {
|
|
|
+ Account userAccount = optionalUser.get().toPlatformAccount();
|
|
|
+ this.refreshFolder(itemViewHolder, userAccount, folder, (caller, result) -> {
|
|
|
+ itemViewHolder.status.setText(status);
|
|
|
+ if (result.isSuccess()) {
|
|
|
+ OCFile file = storageManager.getFileByPath(remotePath);
|
|
|
+ if (file != null) {
|
|
|
+ this.openConflictActivity(file, item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Destination folder doesn't exist anymore
|
|
|
}
|
|
|
- });
|
|
|
- }
|
|
|
+
|
|
|
+ if (ocFile != null) {
|
|
|
+ this.openConflictActivity(ocFile, item);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Remote file doesn't exist anymore = there is no more conflict
|
|
|
+ }
|
|
|
+
|
|
|
+ // not a credentials error
|
|
|
+ File file = new File(item.getLocalPath());
|
|
|
+ if (file.exists()) {
|
|
|
+ FileUploader.UploadRequester requester = new FileUploader.UploadRequester();
|
|
|
+ requester.retry(parentActivity, accountManager, item);
|
|
|
+ loadUploadItemsFromDb();
|
|
|
+ } else {
|
|
|
+ DisplayUtils.showSnackMessage(
|
|
|
+ v.getRootView().findViewById(android.R.id.content),
|
|
|
+ R.string.local_file_not_found_message
|
|
|
+ );
|
|
|
+ }
|
|
|
+ });
|
|
|
} else {
|
|
|
itemViewHolder.itemLayout.setOnClickListener(v ->
|
|
|
onUploadItemClick(item));
|
|
@@ -466,6 +511,36 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void refreshFolder(ItemViewHolder view, Account account, OCFile folder, OnRemoteOperationListener listener) {
|
|
|
+ view.itemLayout.setClickable(false);
|
|
|
+ view.status.setText(R.string.uploads_view_upload_status_fetching_server_version);
|
|
|
+ Context context = MainApp.getAppContext();
|
|
|
+ new RefreshFolderOperation(folder,
|
|
|
+ clock.getCurrentTime(),
|
|
|
+ false,
|
|
|
+ false,
|
|
|
+ true,
|
|
|
+ storageManager,
|
|
|
+ account,
|
|
|
+ context)
|
|
|
+ .execute(account, context, (caller, result) -> {
|
|
|
+ view.itemLayout.setClickable(true);
|
|
|
+ listener.onRemoteOperationFinish(caller, result);
|
|
|
+ }, parentActivity.getHandler());
|
|
|
+ }
|
|
|
+
|
|
|
+ private void openConflictActivity(OCFile file, OCUpload upload) {
|
|
|
+ file.setStoragePath(upload.getLocalPath());
|
|
|
+
|
|
|
+ Context context = MainApp.getAppContext();
|
|
|
+ Intent i = new Intent(context, ConflictsResolveActivity.class);
|
|
|
+ i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
|
+ i.putExtra(ConflictsResolveActivity.EXTRA_FILE, file);
|
|
|
+ i.putExtra(ConflictsResolveActivity.EXTRA_ACCOUNT, upload.getAccount(accountManager));
|
|
|
+ i.putExtra(ConflictsResolveActivity.EXTRA_CONFLICT_UPLOAD, upload);
|
|
|
+ context.startActivity(i);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Gets the status text to show to the user according to the status and last result of the
|
|
|
* the given upload.
|