package com.dnielfe.manager.controller; import android.app.Activity; import android.app.DialogFragment; import android.content.Intent; import android.net.Uri; import android.util.SparseBooleanArray; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.widget.AbsListView; import android.widget.AbsListView.MultiChoiceModeListener; import com.dnielfe.manager.BrowserActivity; import com.dnielfe.manager.R; import com.dnielfe.manager.SearchActivity; import com.dnielfe.manager.adapters.BookmarksAdapter; import com.dnielfe.manager.dialogs.DeleteFilesDialog; import com.dnielfe.manager.dialogs.FilePropertiesDialog; import com.dnielfe.manager.dialogs.GroupOwnerDialog; import com.dnielfe.manager.dialogs.RenameDialog; import com.dnielfe.manager.dialogs.ZipFilesDialog; import com.dnielfe.manager.settings.Settings; import com.dnielfe.manager.utils.ClipBoard; import com.dnielfe.manager.utils.SimpleUtils; import java.io.File; import java.util.ArrayList; public final class ActionModeController { private final MultiChoiceModeListener multiChoiceListener; private final Activity mActivity; private AbsListView mListView; private ActionMode mActionMode; public ActionModeController(final Activity activity) { this.mActivity = activity; this.multiChoiceListener = new MultiChoiceListener(); } public void finishActionMode() { if (this.mActionMode != null) { this.mActionMode.finish(); } } public void setListView(AbsListView list) { if (this.mActionMode != null) { this.mActionMode.finish(); } this.mListView = list; this.mListView.setMultiChoiceModeListener(this.multiChoiceListener); } public boolean isActionMode() { return mActionMode != null; } private final class MultiChoiceListener implements MultiChoiceModeListener { final String mSelected = mActivity.getString(R.string._selected); @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { menu.clear(); mActivity.getMenuInflater().inflate(R.menu.actionmode, menu); if (mActivity instanceof SearchActivity) { menu.removeItem(R.id.actiongroupowner); menu.removeItem(R.id.actionrename); menu.removeItem(R.id.actionzip); if (mListView.getCheckedItemCount() > 1) { menu.removeItem(R.id.actiondetails); } } else { if (!Settings.rootAccess()) menu.removeItem(R.id.actiongroupowner); if (mListView.getCheckedItemCount() > 1) { menu.removeItem(R.id.actionrename); menu.removeItem(R.id.actiongroupowner); menu.removeItem(R.id.actiondetails); } } return true; } @Override public void onDestroyActionMode(ActionMode mode) { ActionModeController.this.mActionMode = null; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { ActionModeController.this.mActionMode = mode; return true; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { final SparseBooleanArray items = mListView.getCheckedItemPositions(); final int checkedItemSize = items.size(); final String[] files = new String[mListView.getCheckedItemCount()]; int index = -1; switch (item.getItemId()) { case R.id.actionmove: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { files[++index] = (String) mListView.getItemAtPosition(key); } } ClipBoard.cutMove(files); mode.finish(); mActivity.invalidateOptionsMenu(); return true; case R.id.actioncopy: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { files[++index] = (String) mListView.getItemAtPosition(key); } } ClipBoard.cutCopy(files); mode.finish(); mActivity.invalidateOptionsMenu(); return true; case R.id.actiongroupowner: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { final DialogFragment dialog9 = GroupOwnerDialog .instantiate(new File((String) mListView .getItemAtPosition(key))); mode.finish(); dialog9.show(mActivity.getFragmentManager(), BrowserActivity.TAG_DIALOG); break; } } return true; case R.id.actiondelete: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { files[++index] = (String) mListView.getItemAtPosition(key); } } final DialogFragment dialog1 = DeleteFilesDialog.instantiate(files); mode.finish(); dialog1.show(mActivity.getFragmentManager(), BrowserActivity.TAG_DIALOG); return true; case R.id.actionshare: final ArrayList<Uri> uris = new ArrayList<>(mListView.getCheckedItemCount()); for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { final File selected = new File((String) mListView.getItemAtPosition(key)); if (!selected.isDirectory()) { uris.add(Uri.fromFile(selected)); } } } Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND_MULTIPLE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setType("*/*"); intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); mode.finish(); mActivity.startActivity(Intent.createChooser(intent, mActivity.getString(R.string.share))); return true; case R.id.actionshortcut: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { files[++index] = (String) mListView.getItemAtPosition(key); } } for (String a : files) { SimpleUtils.createShortcut(mActivity, a); } mode.finish(); return true; case R.id.actionbookmark: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { files[++index] = (String) mListView.getItemAtPosition(key); } } BookmarksAdapter mAdapter = BrowserActivity.getBookmarksAdapter(); for (String a : files) { mAdapter.createBookmark(new File(a)); } mode.finish(); return true; case R.id.actionzip: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { files[++index] = (String) mListView.getItemAtPosition(key); } } final DialogFragment dialog = ZipFilesDialog.instantiate(files); mode.finish(); dialog.show(mActivity.getFragmentManager(), BrowserActivity.TAG_DIALOG); return true; case R.id.actionrename: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { final DialogFragment dialog3 = RenameDialog .instantiate(new File((String) mListView .getItemAtPosition(key)).getName()); mode.finish(); dialog3.show(mActivity.getFragmentManager(), BrowserActivity.TAG_DIALOG); break; } } return true; case R.id.actiondetails: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { final DialogFragment dialog4 = FilePropertiesDialog .instantiate(new File((String) mListView.getItemAtPosition(key))); mode.finish(); dialog4.show(mActivity.getFragmentManager(), BrowserActivity.TAG_DIALOG); break; } } return true; case R.id.actionall: for (int i = 0; i < mListView.getCount(); i++) { mListView.setItemChecked(i, true); } mode.invalidate(); return true; default: return false; } } @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { mode.setTitle(mListView.getCheckedItemCount() + mSelected); } } }