|
@@ -41,10 +41,21 @@ import android.os.Looper;
|
|
|
import android.os.Parcelable;
|
|
|
import android.text.TextUtils;
|
|
|
import android.text.format.DateFormat;
|
|
|
-import android.view.*;
|
|
|
+import android.view.LayoutInflater;
|
|
|
+import android.view.Menu;
|
|
|
+import android.view.MenuInflater;
|
|
|
+import android.view.MenuItem;
|
|
|
+import android.view.View;
|
|
|
+import android.view.ViewGroup;
|
|
|
import android.view.WindowManager.LayoutParams;
|
|
|
-import android.widget.*;
|
|
|
+import android.widget.AdapterView;
|
|
|
import android.widget.AdapterView.OnItemClickListener;
|
|
|
+import android.widget.ArrayAdapter;
|
|
|
+import android.widget.EditText;
|
|
|
+import android.widget.ImageView;
|
|
|
+import android.widget.Spinner;
|
|
|
+import android.widget.TextView;
|
|
|
+import android.widget.Toast;
|
|
|
|
|
|
import com.google.android.material.button.MaterialButton;
|
|
|
import com.nextcloud.client.account.User;
|
|
@@ -66,13 +77,21 @@ import com.owncloud.android.operations.CreateFolderOperation;
|
|
|
import com.owncloud.android.operations.RefreshFolderOperation;
|
|
|
import com.owncloud.android.operations.UploadFileOperation;
|
|
|
import com.owncloud.android.syncadapter.FileSyncAdapter;
|
|
|
-import com.owncloud.android.ui.adapter.UploaderAdapter;
|
|
|
+import com.owncloud.android.ui.adapter.ReceiveExternalFilesAdapter;
|
|
|
import com.owncloud.android.ui.asynctasks.CopyAndUploadContentUrisTask;
|
|
|
-import com.owncloud.android.ui.dialog.*;
|
|
|
+import com.owncloud.android.ui.dialog.AccountChooserInterface;
|
|
|
+import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
|
|
|
+import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
|
|
|
+import com.owncloud.android.ui.dialog.MultipleAccountsDialog;
|
|
|
+import com.owncloud.android.ui.dialog.SortingOrderDialogFragment;
|
|
|
import com.owncloud.android.ui.fragment.TaskRetainerFragment;
|
|
|
import com.owncloud.android.ui.helpers.FileOperationsHelper;
|
|
|
import com.owncloud.android.ui.helpers.UriUploader;
|
|
|
-import com.owncloud.android.utils.*;
|
|
|
+import com.owncloud.android.utils.DataHolderUtil;
|
|
|
+import com.owncloud.android.utils.DisplayUtils;
|
|
|
+import com.owncloud.android.utils.ErrorMessageAdapter;
|
|
|
+import com.owncloud.android.utils.FileSortOrder;
|
|
|
+import com.owncloud.android.utils.MimeType;
|
|
|
import com.owncloud.android.utils.theme.ViewThemeUtils;
|
|
|
|
|
|
import java.io.File;
|
|
@@ -80,7 +99,12 @@ import java.io.FileWriter;
|
|
|
import java.io.IOException;
|
|
|
import java.lang.reflect.Method;
|
|
|
import java.nio.charset.Charset;
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Stack;
|
|
|
+import java.util.Vector;
|
|
|
|
|
|
import javax.inject.Inject;
|
|
|
|
|
@@ -96,6 +120,7 @@ import androidx.core.view.MenuItemCompat;
|
|
|
import androidx.fragment.app.DialogFragment;
|
|
|
import androidx.fragment.app.FragmentManager;
|
|
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
|
|
+import androidx.recyclerview.widget.LinearLayoutManager;
|
|
|
|
|
|
import static com.owncloud.android.utils.DisplayUtils.openSortingOrderDialogFragment;
|
|
|
|
|
@@ -103,8 +128,8 @@ import static com.owncloud.android.utils.DisplayUtils.openSortingOrderDialogFrag
|
|
|
* This can be used to upload things to an ownCloud instance.
|
|
|
*/
|
|
|
public class ReceiveExternalFilesActivity extends FileActivity
|
|
|
- implements OnItemClickListener, View.OnClickListener, CopyAndUploadContentUrisTask.OnCopyTmpFilesTaskListener,
|
|
|
- SortingOrderDialogFragment.OnSortingOrderListener, Injectable, AccountChooserInterface {
|
|
|
+ implements View.OnClickListener, CopyAndUploadContentUrisTask.OnCopyTmpFilesTaskListener,
|
|
|
+ SortingOrderDialogFragment.OnSortingOrderListener, Injectable, AccountChooserInterface, ReceiveExternalFilesAdapter.OnItemClickListener {
|
|
|
|
|
|
private static final String TAG = ReceiveExternalFilesActivity.class.getSimpleName();
|
|
|
|
|
@@ -125,6 +150,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
|
|
|
private OCFile mFile;
|
|
|
|
|
|
private SyncBroadcastReceiver mSyncBroadcastReceiver;
|
|
|
+ private ReceiveExternalFilesAdapter receiveExternalFilesAdapter;
|
|
|
private boolean mSyncInProgress;
|
|
|
|
|
|
private final static int REQUEST_CODE__SETUP_ACCOUNT = REQUEST_CODE__LAST_SHARED + 1;
|
|
@@ -273,6 +299,22 @@ public class ReceiveExternalFilesActivity extends FileActivity
|
|
|
populateDirectoryList();
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void selectFile(OCFile file) {
|
|
|
+ if (file.isFolder()) {
|
|
|
+ if (file.isEncrypted() &&
|
|
|
+ !FileOperationsHelper.isEndToEndEncryptionSetup(this, getUser().orElseThrow(IllegalAccessError::new))) {
|
|
|
+ DisplayUtils.showSnackMessage(this, R.string.e2e_not_yet_setup);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ startSyncFolderOperation(file);
|
|
|
+ mParents.push(file.getFileName());
|
|
|
+ populateDirectoryList();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public static class DialogNoAccount extends DialogFragment {
|
|
|
@NonNull
|
|
|
@Override
|
|
@@ -611,39 +653,6 @@ public class ReceiveExternalFilesActivity extends FileActivity
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
|
|
- // click on folder in the list
|
|
|
- Log_OC.d(TAG, "on item click");
|
|
|
- List<OCFile> tmpFiles = getStorageManager().getFolderContent(mFile, false);
|
|
|
- tmpFiles = sortFileList(tmpFiles);
|
|
|
-
|
|
|
- if (tmpFiles.isEmpty()) {
|
|
|
- return;
|
|
|
- }
|
|
|
- // filter on dirtype
|
|
|
- Vector<OCFile> files = new Vector<>();
|
|
|
- files.addAll(tmpFiles);
|
|
|
-
|
|
|
- if (files.size() < position) {
|
|
|
- throw new IndexOutOfBoundsException("Incorrect item selected");
|
|
|
- }
|
|
|
- OCFile ocFile = files.get(position);
|
|
|
- if (ocFile.isFolder()) {
|
|
|
- if (ocFile.isEncrypted() &&
|
|
|
- !FileOperationsHelper.isEndToEndEncryptionSetup(this, getUser().orElseThrow(IllegalAccessError::new))) {
|
|
|
- DisplayUtils.showSnackMessage(this, R.string.e2e_not_yet_setup);
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- OCFile folderToEnter = files.get(position);
|
|
|
- startSyncFolderOperation(folderToEnter);
|
|
|
- mParents.push(folderToEnter.getFileName());
|
|
|
- populateDirectoryList();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public void onClick(View v) {
|
|
|
// click on button
|
|
@@ -740,29 +749,10 @@ public class ReceiveExternalFilesActivity extends FileActivity
|
|
|
binding.list.setVisibility(View.GONE);
|
|
|
} else {
|
|
|
mEmptyListContainer.setVisibility(View.GONE);
|
|
|
-
|
|
|
files = sortFileList(files);
|
|
|
-
|
|
|
- List<Map<String, Object>> data = new LinkedList<>();
|
|
|
- for (OCFile f : files) {
|
|
|
- Map<String, Object> h = new HashMap<>();
|
|
|
- h.put("dirname", f);
|
|
|
- data.add(h);
|
|
|
- }
|
|
|
-
|
|
|
- UploaderAdapter sa = new UploaderAdapter(this,
|
|
|
- data,
|
|
|
- R.layout.uploader_list_item_layout,
|
|
|
- new String[]{"dirname"},
|
|
|
- new int[]{R.id.filename},
|
|
|
- getStorageManager(),
|
|
|
- getUser().get(),
|
|
|
- syncedFolderProvider,
|
|
|
- viewThemeUtils);
|
|
|
-
|
|
|
- binding.list.setAdapter(sa);
|
|
|
- binding.list.setVisibility(View.VISIBLE);
|
|
|
+ setupReceiveExternalFilesAdapter(files);
|
|
|
}
|
|
|
+
|
|
|
MaterialButton btnChooseFolder = binding.uploaderChooseFolder;
|
|
|
viewThemeUtils.material.colorMaterialButtonPrimaryFilled(btnChooseFolder);
|
|
|
btnChooseFolder.setOnClickListener(this);
|
|
@@ -774,8 +764,6 @@ public class ReceiveExternalFilesActivity extends FileActivity
|
|
|
viewThemeUtils.material.colorMaterialButtonPrimaryOutlined(binding.uploaderCancel);
|
|
|
binding.uploaderCancel.setOnClickListener(this);
|
|
|
|
|
|
- binding.list.setOnItemClickListener(this);
|
|
|
-
|
|
|
sortButton = binding.toolbarLayout.sortButton;
|
|
|
FileSortOrder sortOrder = preferences.getSortOrderByFolder(mFile);
|
|
|
sortButton.setText(DisplayUtils.getSortOrderStringId(sortOrder));
|
|
@@ -783,6 +771,21 @@ public class ReceiveExternalFilesActivity extends FileActivity
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void setupReceiveExternalFilesAdapter(List<OCFile> files) {
|
|
|
+ receiveExternalFilesAdapter = new ReceiveExternalFilesAdapter(files,
|
|
|
+ this,
|
|
|
+ getUser().get(),
|
|
|
+ getStorageManager(),
|
|
|
+ viewThemeUtils,
|
|
|
+ syncedFolderProvider,
|
|
|
+ this);
|
|
|
+
|
|
|
+
|
|
|
+ binding.list.setLayoutManager(new LinearLayoutManager(this));
|
|
|
+ binding.list.setAdapter(receiveExternalFilesAdapter);
|
|
|
+ binding.list.setVisibility(View.VISIBLE);
|
|
|
+ }
|
|
|
+
|
|
|
protected void setupEmptyList() {
|
|
|
mEmptyListContainer = binding.emptyView.emptyListView;
|
|
|
mEmptyListMessage = binding.emptyView.emptyListViewText;
|
|
@@ -1016,19 +1019,35 @@ public class ReceiveExternalFilesActivity extends FileActivity
|
|
|
menu.findItem(R.id.action_create_dir).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
|
|
}
|
|
|
|
|
|
- // tint search event
|
|
|
- final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
|
|
|
- SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
|
|
|
+ setupSearchView(menu);
|
|
|
|
|
|
MenuItem newFolderMenuItem = menu.findItem(R.id.action_create_dir);
|
|
|
newFolderMenuItem.setEnabled(mFile.canWrite());
|
|
|
|
|
|
- // hacky as no default way is provided
|
|
|
- viewThemeUtils.androidx.themeToolbarSearchView(searchView);
|
|
|
-
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ private void setupSearchView(Menu menu) {
|
|
|
+ final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
|
|
|
+
|
|
|
+ SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
|
|
|
+ searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
|
|
|
+ @Override
|
|
|
+ public boolean onQueryTextSubmit(String query) {
|
|
|
+ receiveExternalFilesAdapter.filter(query);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onQueryTextChange(String newText) {
|
|
|
+ receiveExternalFilesAdapter.filter(newText);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ viewThemeUtils.androidx.themeToolbarSearchView(searchView);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
|
boolean retval = true;
|