/* * Copyright 2014 Yaroslav Mytkalyk * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.docd.purefm.controller; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.content.res.Resources; import android.media.MediaScannerConnection; 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 android.widget.Toast; import com.cyanogenmod.filemanager.ui.policy.IntentsActionPolicy; import com.docd.purefm.R; import com.docd.purefm.adapters.BrowserBaseAdapter; import com.docd.purefm.ui.activities.BrowserPagerActivity; import com.docd.purefm.ui.dialogs.DeleteFilesDialog; import com.docd.purefm.ui.dialogs.FilePropertiesDialog; import com.docd.purefm.ui.dialogs.RenameFileDialog; import com.docd.purefm.file.GenericFile; import com.docd.purefm.utils.ClipBoard; import com.docd.purefm.utils.PFMFileUtils; /** * Controller that manages ActionMode for BrowserFragment * * @author Doctoror */ public final class ActionModeController { private final MultiChoiceModeListener multiChoiceListener; private final Activity mActivity; private AbsListView mListView; private ActionMode mActionMode; private Intent mShareIntent; private int mShareItemsCount; 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); } private final class MultiChoiceListener implements MultiChoiceModeListener { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { menu.clear(); mActivity.getMenuInflater().inflate( R.menu.browser_contextual, menu); final SparseBooleanArray items = mListView.getCheckedItemPositions(); if (items != null) { final int checkedCount = mListView.getCheckedItemCount(); final ArrayList<GenericFile> toShare = new ArrayList<>(checkedCount); for (int i = 0; i < items.size(); i++) { final int key = items.keyAt(i); if (items.get(key)) { final GenericFile selected = (GenericFile) mListView.getItemAtPosition(key); if (selected != null && !selected.isDirectory()) { toShare.add(selected); } } } mShareItemsCount = toShare.size(); if (toShare.isEmpty()) { menu.removeItem(R.id.menu_share); } else if (toShare.size() == 1) { mShareIntent = IntentsActionPolicy.createShareIntent(mActivity, toShare.get(0)); } else { mShareIntent = IntentsActionPolicy.createShareIntent(mActivity, toShare); } if (checkedCount > 1) { menu.removeItem(android.R.id.edit); menu.removeItem(R.id.properties); } } 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(final ActionMode mode, final MenuItem item) { final SparseBooleanArray items = mListView .getCheckedItemPositions(); if (items != null) { final int checkedItemSize = items.size(); final Resources res = mActivity.getResources(); switch (item.getItemId()) { case android.R.id.edit: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { final RenameFileDialog rename = RenameFileDialog .instantiate(mode, (GenericFile) mListView .getItemAtPosition(key)); rename.show(mActivity.getFragmentManager(), BrowserPagerActivity.TAG_DIALOG); return true; } } return false; case R.id.properties: for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { final GenericFile itemAtPosition = (GenericFile) mListView.getItemAtPosition(key); if (itemAtPosition == null) { throw new RuntimeException("Item at position: " + key + "is null"); } final FilePropertiesDialog prop = FilePropertiesDialog .newInstance(itemAtPosition); mode.finish(); prop.show(mActivity.getFragmentManager(), BrowserPagerActivity.TAG_DIALOG); break; } } return true; case R.id.menu_delete: final List<GenericFile> files1 = new LinkedList<>(); final BrowserBaseAdapter adapter = (BrowserBaseAdapter) mListView.getAdapter(); for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { files1.add(adapter.getItem(key)); } } final DeleteFilesDialog dialog = DeleteFilesDialog.newInstance(mode, files1); dialog.show(mActivity.getFragmentManager(), BrowserPagerActivity.TAG_DIALOG); return true; case android.R.id.cut: final GenericFile[] files = new GenericFile[mListView .getCheckedItemCount()]; int index = -1; for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { files[++index] = (GenericFile) mListView.getItemAtPosition(key); } } ClipBoard.cutMove(files); Toast.makeText( mActivity, res.getQuantityString( R.plurals.cut_n_files_to_clipboard, index + 1, index + 1), Toast.LENGTH_SHORT ).show(); mode.finish(); return true; case android.R.id.copy: final GenericFile[] files2 = new GenericFile[mListView .getCheckedItemCount()]; int index1 = -1; for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { files2[++index1] = (GenericFile) mListView.getItemAtPosition(key); } } ClipBoard.cutCopy(files2); Toast.makeText( mActivity, res.getQuantityString(R.plurals.copied_n_files_to_clipboard, index1 + 1, index1 + 1), Toast.LENGTH_SHORT ).show(); mode.finish(); return true; case R.id.select_all: for (int i = 0; i < mListView.getCount(); i++) { mListView.setItemChecked(i, true); } return true; case R.id.menu_add_to_media_store: final String[] paths = new String[mListView.getCheckedItemCount()]; int pathsCounter = 0; for (int i = 0; i < checkedItemSize; i++) { final int key = items.keyAt(i); if (items.get(key)) { final GenericFile itemAtPosition = (GenericFile) mListView.getItemAtPosition(key); if (itemAtPosition == null) { throw new RuntimeException("Item at position: " + key + "is null"); } paths[pathsCounter++] = PFMFileUtils.fullPath(itemAtPosition); } } MediaScannerConnection.scanFile(mActivity, paths, null, null); mode.finish(); return true; case R.id.menu_share: if (mShareIntent != null) { mActivity.startActivity(mShareIntent); } else { Toast.makeText(mActivity, res.getQuantityText( R.plurals.no_applications_can_share, mShareItemsCount), Toast.LENGTH_SHORT ).show(); } return true; default: return false; } } return false; } @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { mode.setTitle(mActivity.getString(R.string._selected, mListView.getCheckedItemCount())); mode.invalidate(); } } }