Commit 8044fd2d authored by Shakti Sahu's avatar Shakti Sahu Committed by Commit Bot

Download Home: Menu items - search and delete

Hooked up the menu items to their respective functionalites.
Implemented functionalities for search and delete.

Bug: 850605
Change-Id: I89186c21481ed834f92ac4b5915a41d3e830b273
Reviewed-on: https://chromium-review.googlesource.com/1141208
Commit-Queue: Shakti Sahu <shaktisahu@chromium.org>
Reviewed-by: default avatarMin Qin <qinmin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#576324}
parent 0d7dc80b
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.download.home; package org.chromium.chrome.browser.download.home;
import android.app.Activity; import android.app.Activity;
import android.content.Intent;
import android.support.graphics.drawable.VectorDrawableCompat; import android.support.graphics.drawable.VectorDrawableCompat;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
...@@ -15,6 +16,7 @@ import android.view.ViewGroup; ...@@ -15,6 +16,7 @@ import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import org.chromium.base.ObserverList; import org.chromium.base.ObserverList;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
...@@ -25,9 +27,13 @@ import org.chromium.chrome.browser.download.home.list.ListItem; ...@@ -25,9 +27,13 @@ import org.chromium.chrome.browser.download.home.list.ListItem;
import org.chromium.chrome.browser.download.home.snackbars.DeleteUndoCoordinator; import org.chromium.chrome.browser.download.home.snackbars.DeleteUndoCoordinator;
import org.chromium.chrome.browser.download.home.toolbar.DownloadHomeToolbar; import org.chromium.chrome.browser.download.home.toolbar.DownloadHomeToolbar;
import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory; import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory;
import org.chromium.chrome.browser.download.ui.DownloadManagerUi;
import org.chromium.chrome.browser.preferences.PreferencesLauncher;
import org.chromium.chrome.browser.preferences.download.DownloadPreferences;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.widget.selection.SelectableListLayout; import org.chromium.chrome.browser.widget.selection.SelectableListLayout;
import org.chromium.chrome.browser.widget.selection.SelectableListToolbar;
import org.chromium.chrome.browser.widget.selection.SelectionDelegate; import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
import java.io.Closeable; import java.io.Closeable;
...@@ -54,6 +60,20 @@ class DownloadManagerCoordinatorImpl ...@@ -54,6 +60,20 @@ class DownloadManagerCoordinatorImpl
private SelectionDelegate<ListItem> mSelectionDelegate; private SelectionDelegate<ListItem> mSelectionDelegate;
private SelectableListToolbar.SearchDelegate mSearchDelegate =
new SelectableListToolbar.SearchDelegate() {
@Override
public void onSearchTextChanged(String query) {
mListCoordinator.setSearchQuery(query);
}
@Override
public void onEndSearch() {
mSelectableListLayout.onEndSearch();
mListCoordinator.setSearchQuery(null);
}
};
/** Builds a {@link DownloadManagerCoordinatorImpl} instance. */ /** Builds a {@link DownloadManagerCoordinatorImpl} instance. */
@SuppressWarnings({"unchecked"}) // mSelectableListLayout @SuppressWarnings({"unchecked"}) // mSelectableListLayout
public DownloadManagerCoordinatorImpl(Profile profile, Activity activity, boolean offTheRecord, public DownloadManagerCoordinatorImpl(Profile profile, Activity activity, boolean offTheRecord,
...@@ -89,7 +109,7 @@ class DownloadManagerCoordinatorImpl ...@@ -89,7 +109,7 @@ class DownloadManagerCoordinatorImpl
isSeparateActivity); isSeparateActivity);
mToolbar.getMenu().setGroupVisible(normalGroupId, true); mToolbar.getMenu().setGroupVisible(normalGroupId, true);
mToolbar.initializeSearchView( mToolbar.initializeSearchView(
/* searchDelegate = */ null, R.string.download_manager_search, mSearchMenuId); mSearchDelegate, R.string.download_manager_search, mSearchMenuId);
mIsSeparateActivity = isSeparateActivity; mIsSeparateActivity = isSeparateActivity;
if (!mIsSeparateActivity) mToolbar.removeCloseButton(); if (!mIsSeparateActivity) mToolbar.removeCloseButton();
...@@ -147,7 +167,49 @@ class DownloadManagerCoordinatorImpl ...@@ -147,7 +167,49 @@ class DownloadManagerCoordinatorImpl
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
// TODO(shaktisahu): Handle menu items. if ((item.getItemId() == R.id.close_menu_id
|| item.getItemId() == R.id.with_settings_close_menu_id)
&& mIsSeparateActivity) {
DownloadManagerUi.recordMenuActionHistogram(DownloadManagerUi.MENU_ACTION_CLOSE);
mActivity.finish();
return true;
} else if (item.getItemId() == R.id.selection_mode_delete_menu_id) {
DownloadManagerUi.recordMenuActionHistogram(DownloadManagerUi.MENU_ACTION_MULTI_DELETE);
RecordHistogram.recordCount100Histogram(
"Android.DownloadManager.Menu.Delete.SelectedCount",
mSelectionDelegate.getSelectedItems().size());
mListCoordinator.onDeletionRequested(mSelectionDelegate.getSelectedItems());
mSelectionDelegate.clearSelection();
return true;
} else if (item.getItemId() == R.id.selection_mode_share_menu_id) {
// TODO(twellington): ideally the intent chooser would be started with
// startActivityForResult() and the selection would only be cleared
// after receiving an OK response. See https://crbug.com/638916.
DownloadManagerUi.recordMenuActionHistogram(DownloadManagerUi.MENU_ACTION_MULTI_SHARE);
RecordHistogram.recordCount100Histogram(
"Android.DownloadManager.Menu.Share.SelectedCount",
mSelectionDelegate.getSelectedItems().size());
// TODO(shaktisahu): Share selected items.
mSelectionDelegate.clearSelection();
return true;
} else if (item.getItemId() == mSearchMenuId) {
// The header should be removed as soon as a search is started. Also it should be added
// back when the search is ended.
// TODO(shaktisahu): Check with UX and remove header.
mSelectableListLayout.onStartSearch();
mToolbar.showSearchView();
DownloadManagerUi.recordMenuActionHistogram(DownloadManagerUi.MENU_ACTION_SEARCH);
RecordUserAction.record("Android.DownloadManager.Search");
return true;
} else if (item.getItemId() == R.id.settings_menu_id) {
Intent intent = PreferencesLauncher.createIntentForSettingsPage(
mActivity, DownloadPreferences.class.getName());
mActivity.startActivity(intent);
RecordUserAction.record("Android.DownloadManager.Settings");
return true;
}
return false; return false;
} }
......
...@@ -93,4 +93,9 @@ public class DateOrderedListCoordinator { ...@@ -93,4 +93,9 @@ public class DateOrderedListCoordinator {
public void setSelectedFilter(@FilterType int filter) { public void setSelectedFilter(@FilterType int filter) {
mFilterCoordinator.setSelectedFilter(filter); mFilterCoordinator.setSelectedFilter(filter);
} }
/** Called to delete a list of items specified by {@code items}. */
public void onDeletionRequested(List<ListItem> items) {
mMediator.onDeletionRequested(items);
}
} }
...@@ -28,6 +28,7 @@ import org.chromium.components.offline_items_collection.OfflineItem; ...@@ -28,6 +28,7 @@ import org.chromium.components.offline_items_collection.OfflineItem;
import org.chromium.components.offline_items_collection.VisualsCallback; import org.chromium.components.offline_items_collection.VisualsCallback;
import java.io.Closeable; import java.io.Closeable;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
...@@ -124,6 +125,11 @@ class DateOrderedListMediator { ...@@ -124,6 +125,11 @@ class DateOrderedListMediator {
} }
} }
/** Called to delete a list of items specified by {@code items}. */
public void onDeletionRequested(List<ListItem> items) {
onDeleteItems(getOfflineItems(items));
}
/** /**
* @return The {@link OfflineItemFilterSource} that should be used to determine which filter * @return The {@link OfflineItemFilterSource} that should be used to determine which filter
* options are available. * options are available.
...@@ -170,6 +176,16 @@ class DateOrderedListMediator { ...@@ -170,6 +176,16 @@ class DateOrderedListMediator {
return () -> mThumbnailProvider.cancelRetrieval(request); return () -> mThumbnailProvider.cancelRetrieval(request);
} }
private List<OfflineItem> getOfflineItems(List<ListItem> items) {
List<OfflineItem> offlineItems = new ArrayList<>();
for (ListItem item : items) {
if (item instanceof ListItem.OfflineItemListItem) {
offlineItems.add(((ListItem.OfflineItemListItem) item).item);
}
}
return offlineItems;
}
/** Helper class to disable animations for certain list changes. */ /** Helper class to disable animations for certain list changes. */
private class AnimationDisableClosable implements Closeable { private class AnimationDisableClosable implements Closeable {
AnimationDisableClosable() { AnimationDisableClosable() {
......
...@@ -168,13 +168,14 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat ...@@ -168,13 +168,14 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat
MENU_ACTION_SHOW_INFO, MENU_ACTION_HIDE_INFO, MENU_ACTION_SEARCH}) MENU_ACTION_SHOW_INFO, MENU_ACTION_HIDE_INFO, MENU_ACTION_SEARCH})
public @interface MenuAction {} public @interface MenuAction {}
private static final int MENU_ACTION_CLOSE = 0; // TODO(shaktisahu): Move these to new download home and make them private.
private static final int MENU_ACTION_MULTI_DELETE = 1; public static final int MENU_ACTION_CLOSE = 0;
private static final int MENU_ACTION_MULTI_SHARE = 2; public static final int MENU_ACTION_MULTI_DELETE = 1;
private static final int MENU_ACTION_SHOW_INFO = 3; public static final int MENU_ACTION_MULTI_SHARE = 2;
private static final int MENU_ACTION_HIDE_INFO = 4; public static final int MENU_ACTION_SHOW_INFO = 3;
private static final int MENU_ACTION_SEARCH = 5; public static final int MENU_ACTION_HIDE_INFO = 4;
private static final int MENU_ACTION_BOUNDARY = 6; public static final int MENU_ACTION_SEARCH = 5;
public static final int MENU_ACTION_BOUNDARY = 6;
private static final int PREFETCH_BUNDLE_OPEN_DELAY_MS = 500; private static final int PREFETCH_BUNDLE_OPEN_DELAY_MS = 500;
...@@ -618,7 +619,7 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat ...@@ -618,7 +619,7 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat
sProviderForTests = provider; sProviderForTests = provider;
} }
private static void recordMenuActionHistogram(@MenuAction int action) { public static void recordMenuActionHistogram(@MenuAction int action) {
RecordHistogram.recordEnumeratedHistogram( RecordHistogram.recordEnumeratedHistogram(
"Android.DownloadManager.Menu.Action", action, MENU_ACTION_BOUNDARY); "Android.DownloadManager.Menu.Action", action, MENU_ACTION_BOUNDARY);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment