From: tobiasKaminsky Date: Tue, 29 Sep 2015 19:13:26 +0000 (+0200) Subject: wip X-Git-Tag: beta-20151122~11^2~5 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/71fa16de601a571187f2ed89a40ba796dd2fa455?ds=inline;hp=--cc wip --- 71fa16de601a571187f2ed89a40ba796dd2fa455 diff --git a/res/menu/multiple_file_actions_menu.xml b/res/menu/multiple_file_actions_menu.xml new file mode 100644 index 00000000..fce1654e --- /dev/null +++ b/res/menu/multiple_file_actions_menu.xml @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/src/com/owncloud/android/datamodel/OCFile.java b/src/com/owncloud/android/datamodel/OCFile.java index 4baf1ea5..9e77f0d1 100644 --- a/src/com/owncloud/android/datamodel/OCFile.java +++ b/src/com/owncloud/android/datamodel/OCFile.java @@ -27,17 +27,16 @@ import android.webkit.MimeTypeMap; import com.owncloud.android.lib.common.utils.Log_OC; import java.io.File; +import java.io.Serializable; import third_parties.daveKoeller.AlphanumComparator; public class OCFile implements Parcelable, Comparable { - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public OCFile createFromParcel(Parcel source) { return new OCFile(source); } - @Override public OCFile[] newArray(int size) { return new OCFile[size]; } diff --git a/src/com/owncloud/android/files/FileOperationsHelper.java b/src/com/owncloud/android/files/FileOperationsHelper.java index 22370289..55368f43 100644 --- a/src/com/owncloud/android/files/FileOperationsHelper.java +++ b/src/com/owncloud/android/files/FileOperationsHelper.java @@ -43,6 +43,8 @@ import com.owncloud.android.ui.dialog.ShareLinkToDialog; import org.apache.http.protocol.HTTP; +import java.util.ArrayList; + /** * */ @@ -205,10 +207,14 @@ public class FileOperationsHelper { } } + public void syncFiles(ArrayList files) { + for (OCFile file: files) { + syncFile(file); + } + } public void syncFile(OCFile file) { - - if (!file.isFolder()){ + if (!file.isFolder()) { Intent intent = new Intent(mFileActivity, OperationsService.class); intent.setAction(OperationsService.ACTION_SYNC_FILE); intent.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount()); @@ -216,7 +222,7 @@ public class FileOperationsHelper { intent.putExtra(OperationsService.EXTRA_SYNC_FILE_CONTENTS, true); mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(intent); mFileActivity.showLoadingDialog(); - + } else { Intent intent = new Intent(mFileActivity, OperationsService.class); intent.setAction(OperationsService.ACTION_SYNC_FOLDER); @@ -226,6 +232,12 @@ public class FileOperationsHelper { } } + public void toggleFavorites(ArrayList files, boolean isFavorite){ + for (OCFile file: files) { + toggleFavorite(file, isFavorite); + } + } + public void toggleFavorite(OCFile file, boolean isFavorite) { file.setFavorite(isFavorite); mFileActivity.getStorageManager().saveFile(file); @@ -329,7 +341,8 @@ public class FileOperationsHelper { service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount()); mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service); - mFileActivity.showLoadingDialog(); + // TODO Tobi loading dialog? + // mFileActivity.showLoadingDialog(); } /** diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index 1c21cab4..d74a4a6e 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -847,11 +847,15 @@ public class FileActivity extends AppCompatActivity */ public void showLoadingDialog() { // Construct dialog - LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment)); - FragmentManager fm = getSupportFragmentManager(); - FragmentTransaction ft = fm.beginTransaction(); - loading.show(ft, DIALOG_WAIT_TAG); - + Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); + if (frag == null) { + Log_OC.d(TAG, "show loading dialog"); + LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment)); + FragmentManager fm = getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + loading.show(ft, DIALOG_WAIT_TAG); + fm.executePendingTransactions(); + } } @@ -861,6 +865,7 @@ public class FileActivity extends AppCompatActivity public void dismissLoadingDialog() { Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); if (frag != null) { + Log_OC.d(TAG, "dismiss loading dialog"); LoadingDialog loading = (LoadingDialog) frag; loading.dismiss(); } diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 20bcdce4..cf9b29bc 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -26,6 +26,7 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; import android.annotation.TargetApi; +import android.os.Parcelable; import android.support.v7.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -107,6 +108,8 @@ import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.utils.UriUtils; import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; /** * Displays, what files the user has available in his ownCloud. @@ -764,8 +767,12 @@ public class FileDisplayActivity extends HookActivity */ private void requestMoveOperation(Intent data, int resultCode) { OCFile folderToMoveAt = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER); - OCFile targetFile = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FILE); - getFileOperationsHelper().moveFile(folderToMoveAt, targetFile); + + ArrayList files = data.getParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES); + + for (Parcelable file : files) { + getFileOperationsHelper().moveFile(folderToMoveAt, (OCFile) file); + } } /** @@ -776,8 +783,12 @@ public class FileDisplayActivity extends HookActivity */ private void requestCopyOperation(Intent data, int resultCode) { OCFile folderToMoveAt = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER); - OCFile targetFile = data.getParcelableExtra(FolderPickerActivity.EXTRA_FILE); - getFileOperationsHelper().copyFile(folderToMoveAt, targetFile); + + ArrayList files = data.getParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES); + + for (Parcelable file : files) { + getFileOperationsHelper().copyFile(folderToMoveAt, (OCFile) file); + } } @Override diff --git a/src/com/owncloud/android/ui/activity/FolderPickerActivity.java b/src/com/owncloud/android/ui/activity/FolderPickerActivity.java index 4b558f00..56daee72 100644 --- a/src/com/owncloud/android/ui/activity/FolderPickerActivity.java +++ b/src/com/owncloud/android/ui/activity/FolderPickerActivity.java @@ -62,6 +62,8 @@ import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; import com.owncloud.android.utils.ErrorMessageAdapter; +import java.util.ArrayList; + public class FolderPickerActivity extends FileActivity implements FileFragment.ContainerActivity, OnClickListener, OnEnforceableRefreshListener { @@ -69,6 +71,8 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C + ".EXTRA_FOLDER"; public static final String EXTRA_FILE = UploadFilesActivity.class.getCanonicalName() + ".EXTRA_FILE"; + public static final String EXTRA_FILES = UploadFilesActivity.class.getCanonicalName() + + ".EXTRA_FILES"; //TODO: Think something better private SyncBroadcastReceiver mSyncBroadcastReceiver; @@ -373,12 +377,16 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C } else if (v == mChooseBtn) { Intent i = getIntent(); Parcelable targetFile = i.getParcelableExtra(FolderPickerActivity.EXTRA_FILE); + ArrayList targetFiles = i.getParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES); Intent data = new Intent(); data.putExtra(EXTRA_FOLDER, getCurrentFolder()); if (targetFile != null) { data.putExtra(EXTRA_FILE, targetFile); } + if (targetFiles != null){ + data.putParcelableArrayListExtra(EXTRA_FILES, targetFiles); + } setResult(RESULT_OK, data); finish(); } diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index 63689e88..272a7ffc 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -544,4 +544,15 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { } return ids; } + + public ArrayList getCheckedItems() { + ArrayList files = new ArrayList(); + + for (Map.Entry entry : mSelection.entrySet()){ + if (entry.getValue()){ + files.add((OCFile) getItem(entry.getKey())); + } + } + return files; + } } diff --git a/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 42ad54e4..954b8e46 100644 --- a/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@ -187,7 +187,7 @@ public class ExtendedListFragment extends Fragment mGridView = (GridViewWithHeaderAndFooter) (v.findViewById(R.id.grid_root)); mGridView.setNumColumns(GridView.AUTO_FIT); - // mGridView.setOnItemClickListener(this); + mGridView.setOnItemClickListener(this); mGridView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); // mGridView.setMultiChoiceModeListener(listener); diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index fc490790..8a8589da 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -25,6 +25,7 @@ package com.owncloud.android.ui.fragment; import android.app.Activity; import android.content.Intent; import android.os.Bundle; +import android.os.Parcelable; import android.support.v4.widget.SwipeRefreshLayout; import android.view.ActionMode; import android.view.ContextMenu; @@ -59,13 +60,14 @@ import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.ui.preview.PreviewTextFragment; import java.io.File; +import java.util.ArrayList; /** * A Fragment that lists all files and folders in a given path. * * TODO refactor to get rid of direct dependency on FileDisplayActivity */ -public class OCFileListFragment extends ExtendedListFragment implements FileActionsDialogFragment.FileActionsDialogFragmentListener { +public class OCFileListFragment extends ExtendedListFragment { private static final String TAG = OCFileListFragment.class.getSimpleName(); @@ -82,11 +84,7 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi private OCFile mFile = null; private FileListListAdapter mAdapter; private boolean mJustFolders; - - private OCFile mTargetFile; - - - + /** * {@inheritDoc} */ @@ -150,56 +148,34 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi private void registerLongClickListener() { getListView().setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { + private Menu menu; + @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { - // Capture total checked items final int checkedCount = getListView().getCheckedItemCount(); - // Set the CAB title according to total checked items - mode.setTitle(checkedCount + " Selected"); + // TODO Tobi extract to values + mode.setTitle(checkedCount + " selected"); - if (checked){ - mAdapter.setNewSelection(position,checked); + if (checked) { + mAdapter.setNewSelection(position, checked); } else { mAdapter.removeSelection(position); } + + // TODO maybe change: only recreate menu if count changes + menu.clear(); + if (checkedCount == 1) { + createContextMenu(menu); + } else { + // download, move, copy, delete + getActivity().getMenuInflater().inflate(R.menu.multiple_file_actions_menu, menu); + } + } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { - -// Bundle args = getArguments(); -// boolean allowContextualActions = -// (args == null) ? true : args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, true); -// if (allowContextualActions) { -// MenuInflater inflater = getActivity().getMenuInflater(); -// inflater.inflate(R.menu.file_actions_menu, menu); -// AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; -// OCFile targetFile = (OCFile) mAdapter.getItem(info.position); -// -// if (mContainerActivity.getStorageManager() != null) { -// FileMenuFilter mf = new FileMenuFilter( -// targetFile, -// mContainerActivity.getStorageManager().getAccount(), -// mContainerActivity, -// getActivity() -// ); -// mf.filter(menu); -// } -// -// /// TODO break this direct dependency on FileDisplayActivity... if possible -// MenuItem item = menu.findItem(R.id.action_open_file_with); -// FileFragment frag = ((FileDisplayActivity)getActivity()).getSecondFragment(); -// if (frag != null && frag instanceof FileDetailFragment && -// frag.getFile().getFileId() == targetFile.getFileId()) { -// item = menu.findItem(R.id.action_see_details); -// if (item != null) { -// item.setVisible(false); -// item.setEnabled(false); -// } -// } -// } - - mode.getMenuInflater().inflate(R.menu.file_actions_menu, menu); + this.menu = menu; return true; } @@ -210,12 +186,7 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - if (mAdapter.getCheckedItemPositions().size() == 1) { - return onFileActionChosen(item.getItemId(), mAdapter.getCheckedItemPositions().get(0)); - } else if (mAdapter.getCheckedItemPositions().size() > 1){ - return false; - } - return false; + return onFileActionChosen(item.getItemId()); } @Override @@ -368,17 +339,17 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi * {@inheritDoc} */ // TODO Tobi needed? - @Override - public void onCreateContextMenu( - ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + public void createContextMenu(Menu menu) { Bundle args = getArguments(); boolean allowContextualActions = (args == null) ? true : args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, true); if (allowContextualActions) { MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.file_actions_menu, menu); - AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - OCFile targetFile = (OCFile) mAdapter.getItem(info.position); + OCFile targetFile = null; + if (mAdapter.getCheckedItems().size() == 1){ + targetFile = mAdapter.getCheckedItems().get(0); + } if (mContainerActivity.getStorageManager() != null) { FileMenuFilter mf = new FileMenuFilter( @@ -404,86 +375,124 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi } } - /** - * {@inheritDoc} - */ - @Override - public boolean onFileActionChosen(int menuId, int filePosition) { - mTargetFile = (OCFile) mAdapter.getItem(filePosition); - switch (menuId) { - case R.id.action_share_file: { - mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile); - return true; - } - case R.id.action_open_file_with: { - mContainerActivity.getFileOperationsHelper().openFile(mTargetFile); - return true; - } - case R.id.action_unshare_file: { - mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile); - return true; - } - case R.id.action_rename_file: { - RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(mTargetFile); - dialog.show(getFragmentManager(), FileDetailFragment.FTAG_RENAME_FILE); - return true; - } - case R.id.action_remove_file: { - RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(mTargetFile); - dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); - return true; - } - case R.id.action_download_file: - case R.id.action_sync_file: { - mContainerActivity.getFileOperationsHelper().syncFile(mTargetFile); - return true; - } - case R.id.action_cancel_download: - case R.id.action_cancel_upload: { - ((FileDisplayActivity) mContainerActivity).cancelTransference(mTargetFile); - return true; - } - case R.id.action_see_details: { - mContainerActivity.showDetails(mTargetFile); - return true; - } - case R.id.action_send_file: { - // Obtain the file - if (!mTargetFile.isDown()) { // Download the file - Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); - ((FileDisplayActivity) mContainerActivity).startDownloadForSending(mTargetFile); + public boolean onFileActionChosen(int menuId) { + if (mAdapter.getCheckedItems().size() == 1){ + OCFile mTargetFile = mAdapter.getCheckedItems().get(0); - } else { - mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); + switch (menuId) { + case R.id.action_share_file: { + mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile); + return true; } - return true; - } - case R.id.action_move: { - Intent action = new Intent(getActivity(), FolderPickerActivity.class); + case R.id.action_open_file_with: { + mContainerActivity.getFileOperationsHelper().openFile(mTargetFile); + return true; + } + case R.id.action_unshare_file: { + mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile); + return true; + } + case R.id.action_rename_file: { + RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(mTargetFile); + dialog.show(getFragmentManager(), FileDetailFragment.FTAG_RENAME_FILE); + return true; + } + case R.id.action_remove_file: { + RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(mTargetFile); + dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); + return true; + } + case R.id.action_download_file: + case R.id.action_sync_file: { + mContainerActivity.getFileOperationsHelper().syncFile(mTargetFile); + return true; + } + case R.id.action_cancel_download: + case R.id.action_cancel_upload: { + ((FileDisplayActivity) mContainerActivity).cancelTransference(mTargetFile); + return true; + } + case R.id.action_see_details: { + mContainerActivity.showDetails(mTargetFile); + return true; + } + case R.id.action_send_file: { + // Obtain the file + if (!mTargetFile.isDown()) { // Download the file + Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); + ((FileDisplayActivity) mContainerActivity).startDownloadForSending(mTargetFile); - // Pass mTargetFile that contains info of selected file/folder - action.putExtra(FolderPickerActivity.EXTRA_FILE, mTargetFile); - getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_MOVE_FILES); - return true; - } - case R.id.action_favorite_file: { - mContainerActivity.getFileOperationsHelper().toggleFavorite(mTargetFile, true); - return true; - } - case R.id.action_unfavorite_file: { - mContainerActivity.getFileOperationsHelper().toggleFavorite(mTargetFile, false); - return true; + } else { + mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); + } + return true; + } + case R.id.action_move: { + Intent action = new Intent(getActivity(), FolderPickerActivity.class); + + // Pass mTargetFile that contains info of selected file/folder + ArrayList files = new ArrayList(); + files.add(mTargetFile); + action.putParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES, files); + getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_MOVE_FILES); + return true; + } + case R.id.action_favorite_file: { + mContainerActivity.getFileOperationsHelper().toggleFavorite(mTargetFile, true); + return true; + } + case R.id.action_unfavorite_file: { + mContainerActivity.getFileOperationsHelper().toggleFavorite(mTargetFile, false); + return true; + } + case R.id.action_copy: + Intent action = new Intent(getActivity(), FolderPickerActivity.class); + + // Pass mTargetFile that contains info of selected file/folder + action.putExtra(FolderPickerActivity.EXTRA_FILE, mTargetFile); + getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_COPY_FILES); + return true; + default: + return false; } - case R.id.action_copy: - Intent action = new Intent(getActivity(), FolderPickerActivity.class); + } else { + ArrayList mTargetFiles = mAdapter.getCheckedItems(); - // Pass mTargetFile that contains info of selected file/folder - action.putExtra(FolderPickerActivity.EXTRA_FILE, mTargetFile); - getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_COPY_FILES); - return true; - default: - return false; + switch (menuId) { +// case R.id.action_remove_file: { +// RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(mTargetFile); +// dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); +// return true; +// } + case R.id.action_download_file: + case R.id.action_sync_file: { + mContainerActivity.getFileOperationsHelper().syncFiles(mTargetFiles); + return true; + } + case R.id.action_move: { + Intent action = new Intent(getActivity(), FolderPickerActivity.class); + action.putParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES, mTargetFiles); + getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_MOVE_FILES); + return true; + } + case R.id.action_favorite_file: { + mContainerActivity.getFileOperationsHelper().toggleFavorites(mTargetFiles, true); + return true; + } + case R.id.action_unfavorite_file: { + mContainerActivity.getFileOperationsHelper().toggleFavorites(mTargetFiles, false); + return true; + } + case R.id.action_copy: + Intent action = new Intent(getActivity(), FolderPickerActivity.class); + action.putParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES, mTargetFiles); + getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_COPY_FILES); + return true; + default: + return false; + } } + } /** @@ -492,7 +501,7 @@ public class OCFileListFragment extends ExtendedListFragment implements FileActi @Override public boolean onContextItemSelected (MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); - boolean matched = onFileActionChosen(item.getItemId(), ((AdapterContextMenuInfo) item.getMenuInfo()).position); + boolean matched = onFileActionChosen(item.getItemId()); if(!matched) { return super.onContextItemSelected(item); } else {