Commit f23b1c1d authored by twellington's avatar twellington Committed by Commit bot

[Home] Add support for snackbars in the BottomSheet

A second SnackbarManager is used to display snackbars on top
of the bottom sheet.

BUG=704128

Review-Url: https://codereview.chromium.org/2806593004
Cr-Commit-Position: refs/heads/master@{#463329}
parent a92e7bd9
...@@ -78,6 +78,13 @@ ...@@ -78,6 +78,13 @@
android:inflatedId="@+id/bottom_nav" android:inflatedId="@+id/bottom_nav"
android:layout="@layout/bottom_sheet_bottom_nav" /> android:layout="@layout/bottom_sheet_bottom_nav" />
<FrameLayout
android:id="@+id/bottom_sheet_snackbar_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start|bottom"
android:layout_marginTop="@dimen/bottom_nav_height_inverse" />
</android.support.design.widget.CoordinatorLayout> </android.support.design.widget.CoordinatorLayout>
<HorizontalScrollView <HorizontalScrollView
......
...@@ -433,6 +433,7 @@ ...@@ -433,6 +433,7 @@
<!-- Bottom sheet bottom nav dimensions --> <!-- Bottom sheet bottom nav dimensions -->
<dimen name="bottom_nav_height">56dp</dimen> <dimen name="bottom_nav_height">56dp</dimen>
<dimen name="bottom_nav_height_inverse">-56dp</dimen>
<dimen name="bottom_nav_space_from_toolbar">96dp</dimen> <dimen name="bottom_nav_space_from_toolbar">96dp</dimen>
<!-- The following two dimensions override defaults in Android's BottomNavigationView --> <!-- The following two dimensions override defaults in Android's BottomNavigationView -->
<dimen name="design_bottom_navigation_text_size">12sp</dimen> <dimen name="design_bottom_navigation_text_size">12sp</dimen>
......
...@@ -310,7 +310,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity ...@@ -310,7 +310,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
public void postInflationStartup() { public void postInflationStartup() {
super.postInflationStartup(); super.postInflationStartup();
mSnackbarManager = new SnackbarManager(this); mSnackbarManager = new SnackbarManager(this, null);
mDataUseSnackbarController = new DataUseSnackbarController(this, getSnackbarManager()); mDataUseSnackbarController = new DataUseSnackbarController(this, getSnackbarManager());
mAssistStatusHandler = createAssistStatusHandler(); mAssistStatusHandler = createAssistStatusHandler();
...@@ -379,7 +379,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity ...@@ -379,7 +379,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
int controlContainerHeight = int controlContainerHeight =
((ControlContainer) findViewById(R.id.control_container)).getView().getHeight(); ((ControlContainer) findViewById(R.id.control_container)).getView().getHeight();
mBottomSheetContentController.init( mBottomSheetContentController.init(
mBottomSheet, controlContainerHeight, mTabModelSelector); mBottomSheet, controlContainerHeight, mTabModelSelector, this);
} }
((BottomContainer) findViewById(R.id.bottom_container)).initialize(mFullscreenManager); ((BottomContainer) findViewById(R.id.bottom_container)).initialize(mFullscreenManager);
} }
......
...@@ -26,7 +26,7 @@ public abstract class SnackbarActivity extends SynchronousInitializationActivity ...@@ -26,7 +26,7 @@ public abstract class SnackbarActivity extends SynchronousInitializationActivity
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
mSnackbarManager = new SnackbarManager(this); mSnackbarManager = new SnackbarManager(this, null);
} }
@Override @Override
......
...@@ -26,7 +26,7 @@ public class BookmarkActivity extends SnackbarActivity { ...@@ -26,7 +26,7 @@ public class BookmarkActivity extends SnackbarActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mBookmarkManager = new BookmarkManager(this, true); mBookmarkManager = new BookmarkManager(this, true, getSnackbarManager());
String url = getIntent().getDataString(); String url = getIntent().getDataString();
if (TextUtils.isEmpty(url)) url = UrlConstants.BOOKMARKS_URL; if (TextUtils.isEmpty(url)) url = UrlConstants.BOOKMARKS_URL;
mBookmarkManager.updateForUrl(url); mBookmarkManager.updateForUrl(url);
......
...@@ -26,7 +26,7 @@ import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserve ...@@ -26,7 +26,7 @@ import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserve
import org.chromium.chrome.browser.favicon.LargeIconBridge; import org.chromium.chrome.browser.favicon.LargeIconBridge;
import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim; import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable; 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.SearchDelegate; import org.chromium.chrome.browser.widget.selection.SelectableListToolbar.SearchDelegate;
import org.chromium.chrome.browser.widget.selection.SelectionDelegate; import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
...@@ -121,8 +121,9 @@ public class BookmarkManager implements BookmarkDelegate, SearchDelegate { ...@@ -121,8 +121,9 @@ public class BookmarkManager implements BookmarkDelegate, SearchDelegate {
* bookmark models and jni bridges. * bookmark models and jni bridges.
* @param activity The activity context to use. * @param activity The activity context to use.
* @param isDialogUi Whether the main bookmarks UI will be shown in a dialog, not a NativePage. * @param isDialogUi Whether the main bookmarks UI will be shown in a dialog, not a NativePage.
* @param snackbarManager The {@link SnackbarManager} used to display snackbars.
*/ */
public BookmarkManager(Activity activity, boolean isDialogUi) { public BookmarkManager(Activity activity, boolean isDialogUi, SnackbarManager snackbarManager) {
mActivity = activity; mActivity = activity;
mIsDialogUi = isDialogUi; mIsDialogUi = isDialogUi;
...@@ -159,8 +160,7 @@ public class BookmarkManager implements BookmarkDelegate, SearchDelegate { ...@@ -159,8 +160,7 @@ public class BookmarkManager implements BookmarkDelegate, SearchDelegate {
mToolbar.initializeSearchView( mToolbar.initializeSearchView(
this, R.string.bookmark_action_bar_search, R.id.search_menu_id); this, R.string.bookmark_action_bar_search, R.id.search_menu_id);
mUndoController = new BookmarkUndoController(activity, mBookmarkModel, mUndoController = new BookmarkUndoController(activity, mBookmarkModel, snackbarManager);
((SnackbarManageable) activity).getSnackbarManager());
mBookmarkModel.addObserver(mBookmarkModelObserver); mBookmarkModel.addObserver(mBookmarkModelObserver);
initializeToLoadingState(); initializeToLoadingState();
mBookmarkModel.runAfterBookmarkModelLoaded(mModelLoadedRunnable); mBookmarkModel.runAfterBookmarkModelLoaded(mModelLoadedRunnable);
......
...@@ -11,6 +11,7 @@ import org.chromium.chrome.R; ...@@ -11,6 +11,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.BasicNativePage; import org.chromium.chrome.browser.BasicNativePage;
import org.chromium.chrome.browser.NativePageHost; import org.chromium.chrome.browser.NativePageHost;
import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
/** /**
* A native page holding a {@link BookmarkManager} on _tablet_. * A native page holding a {@link BookmarkManager} on _tablet_.
...@@ -30,7 +31,8 @@ public class BookmarkPage extends BasicNativePage { ...@@ -30,7 +31,8 @@ public class BookmarkPage extends BasicNativePage {
@Override @Override
protected void initialize(Activity activity, NativePageHost host) { protected void initialize(Activity activity, NativePageHost host) {
mManager = new BookmarkManager(activity, false); mManager = new BookmarkManager(
activity, false, ((SnackbarManageable) activity).getSnackbarManager());
mManager.setBasicNativePage(this); mManager.setBasicNativePage(this);
mTitle = activity.getString(R.string.bookmarks); mTitle = activity.getString(R.string.bookmarks);
} }
......
...@@ -8,6 +8,7 @@ import android.support.v7.widget.Toolbar; ...@@ -8,6 +8,7 @@ import android.support.v7.widget.Toolbar;
import android.view.View; import android.view.View;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.toolbar.BottomToolbarPhone; import org.chromium.chrome.browser.toolbar.BottomToolbarPhone;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentController; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentController;
...@@ -22,9 +23,10 @@ public class BookmarkSheetContent implements BottomSheetContent { ...@@ -22,9 +23,10 @@ public class BookmarkSheetContent implements BottomSheetContent {
/** /**
* @param activity The activity displaying the bookmark manager UI. * @param activity The activity displaying the bookmark manager UI.
* @param snackbarManager The {@link SnackbarManager} used to display snackbars.
*/ */
public BookmarkSheetContent(ChromeActivity activity) { public BookmarkSheetContent(ChromeActivity activity, SnackbarManager snackbarManager) {
mBookmarkManager = new BookmarkManager(activity, false); mBookmarkManager = new BookmarkManager(activity, false, snackbarManager);
mBookmarkManager.updateForUrl(BookmarkUtils.getLastUsedUrl(activity)); mBookmarkManager.updateForUrl(BookmarkUtils.getLastUsedUrl(activity));
mContentView = mBookmarkManager.getView(); mContentView = mBookmarkManager.getView();
mToolbarView = mBookmarkManager.detachToolbarView(); mToolbarView = mBookmarkManager.detachToolbarView();
......
...@@ -49,7 +49,8 @@ public class DownloadActivity extends SnackbarActivity { ...@@ -49,7 +49,8 @@ public class DownloadActivity extends SnackbarActivity {
boolean isOffTheRecord = DownloadUtils.shouldShowOffTheRecordDownloads(getIntent()); boolean isOffTheRecord = DownloadUtils.shouldShowOffTheRecordDownloads(getIntent());
ComponentName parentComponent = IntentUtils.safeGetParcelableExtra( ComponentName parentComponent = IntentUtils.safeGetParcelableExtra(
getIntent(), IntentHandler.EXTRA_PARENT_COMPONENT); getIntent(), IntentHandler.EXTRA_PARENT_COMPONENT);
mDownloadManagerUi = new DownloadManagerUi(this, isOffTheRecord, parentComponent, true); mDownloadManagerUi = new DownloadManagerUi(
this, isOffTheRecord, parentComponent, true, getSnackbarManager());
setContentView(mDownloadManagerUi.getView()); setContentView(mDownloadManagerUi.getView());
mIsOffTheRecord = isOffTheRecord; mIsOffTheRecord = isOffTheRecord;
mDownloadManagerUi.addObserver(mUiObserver); mDownloadManagerUi.addObserver(mUiObserver);
......
...@@ -16,6 +16,7 @@ import org.chromium.chrome.browser.BasicNativePage; ...@@ -16,6 +16,7 @@ import org.chromium.chrome.browser.BasicNativePage;
import org.chromium.chrome.browser.NativePageHost; import org.chromium.chrome.browser.NativePageHost;
import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.download.ui.DownloadManagerUi; import org.chromium.chrome.browser.download.ui.DownloadManagerUi;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
/** /**
* Native page for managing downloads handled through Chrome. * Native page for managing downloads handled through Chrome.
...@@ -39,8 +40,8 @@ public class DownloadPage extends BasicNativePage { ...@@ -39,8 +40,8 @@ public class DownloadPage extends BasicNativePage {
protected void initialize(Activity activity, final NativePageHost host) { protected void initialize(Activity activity, final NativePageHost host) {
ThreadUtils.assertOnUiThread(); ThreadUtils.assertOnUiThread();
mManager = new DownloadManagerUi( mManager = new DownloadManagerUi(activity, host.isIncognito(), activity.getComponentName(),
activity, host.isIncognito(), activity.getComponentName(), false); false, ((SnackbarManageable) activity).getSnackbarManager());
mManager.setBasicNativePage(this); mManager.setBasicNativePage(this);
mTitle = activity.getString(R.string.download_manager_ui_all_downloads); mTitle = activity.getString(R.string.download_manager_ui_all_downloads);
......
...@@ -14,6 +14,7 @@ import org.chromium.base.ApplicationStatus.ActivityStateListener; ...@@ -14,6 +14,7 @@ import org.chromium.base.ApplicationStatus.ActivityStateListener;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.download.ui.DownloadManagerUi; import org.chromium.chrome.browser.download.ui.DownloadManagerUi;
import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.toolbar.BottomToolbarPhone; import org.chromium.chrome.browser.toolbar.BottomToolbarPhone;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentController; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentController;
...@@ -30,12 +31,14 @@ public class DownloadSheetContent implements BottomSheetContent { ...@@ -30,12 +31,14 @@ public class DownloadSheetContent implements BottomSheetContent {
/** /**
* @param activity The activity displaying the download manager UI. * @param activity The activity displaying the download manager UI.
* @param isIncognito Whether the activity is currently displaying an incognito tab. * @param isIncognito Whether the activity is currently displaying an incognito tab.
* @param snackbarManager The {@link SnackbarManager} used to display snackbars.
*/ */
public DownloadSheetContent(ChromeActivity activity, final boolean isIncognito) { public DownloadSheetContent(
ChromeActivity activity, final boolean isIncognito, SnackbarManager snackbarManager) {
ThreadUtils.assertOnUiThread(); ThreadUtils.assertOnUiThread();
mDownloadManager = mDownloadManager = new DownloadManagerUi(
new DownloadManagerUi(activity, isIncognito, activity.getComponentName(), false); activity, isIncognito, activity.getComponentName(), false, snackbarManager);
mContentView = mDownloadManager.getView(); mContentView = mDownloadManager.getView();
mToolbarView = mDownloadManager.detachToolbarView(); mToolbarView = mDownloadManager.detachToolbarView();
((BottomToolbarPhone) activity.getToolbarManager().getToolbar()) ((BottomToolbarPhone) activity.getToolbarManager().getToolbar())
......
...@@ -38,7 +38,6 @@ import org.chromium.chrome.browser.profiles.Profile; ...@@ -38,7 +38,6 @@ import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.snackbar.Snackbar; import org.chromium.chrome.browser.snackbar.Snackbar;
import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController; import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
import org.chromium.chrome.browser.widget.selection.SelectableListLayout; import org.chromium.chrome.browser.widget.selection.SelectableListLayout;
import org.chromium.chrome.browser.widget.selection.SelectableListToolbar.SearchDelegate; import org.chromium.chrome.browser.widget.selection.SelectableListToolbar.SearchDelegate;
import org.chromium.chrome.browser.widget.selection.SelectionDelegate; import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
...@@ -168,6 +167,7 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat ...@@ -168,6 +167,7 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat
private final FilterAdapter mFilterAdapter; private final FilterAdapter mFilterAdapter;
private final ObserverList<DownloadUiObserver> mObservers = new ObserverList<>(); private final ObserverList<DownloadUiObserver> mObservers = new ObserverList<>();
private final BackendProvider mBackendProvider; private final BackendProvider mBackendProvider;
private final SnackbarManager mSnackbarManager;
private final SpaceDisplay mSpaceDisplay; private final SpaceDisplay mSpaceDisplay;
private final ListView mFilterView; private final ListView mFilterView;
...@@ -188,13 +188,16 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat ...@@ -188,13 +188,16 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat
* @param parentComponent The {@link ComponentName} of the parent activity. * @param parentComponent The {@link ComponentName} of the parent activity.
* @param isSeparateActivity Whether the download manager UI will be shown in a separate * @param isSeparateActivity Whether the download manager UI will be shown in a separate
* activity than the main Chrome activity. * activity than the main Chrome activity.
* @param snackbarManager The {@link SnackbarManager} used to display snackbars.
*/ */
@SuppressWarnings("unchecked") // mSelectableListLayout @SuppressWarnings("unchecked") // mSelectableListLayout
public DownloadManagerUi(Activity activity, boolean isOffTheRecord, public DownloadManagerUi(Activity activity, boolean isOffTheRecord,
ComponentName parentComponent, boolean isSeparateActivity) { ComponentName parentComponent, boolean isSeparateActivity,
SnackbarManager snackbarManager) {
mActivity = activity; mActivity = activity;
mBackendProvider = mBackendProvider =
sProviderForTests == null ? new DownloadBackendProvider() : sProviderForTests; sProviderForTests == null ? new DownloadBackendProvider() : sProviderForTests;
mSnackbarManager = snackbarManager;
mMainView = (ViewGroup) LayoutInflater.from(activity).inflate(R.layout.download_main, null); mMainView = (ViewGroup) LayoutInflater.from(activity).inflate(R.layout.download_main, null);
...@@ -463,7 +466,7 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat ...@@ -463,7 +466,7 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat
snackbar.setAction(mActivity.getString(R.string.undo), itemsToDelete); snackbar.setAction(mActivity.getString(R.string.undo), itemsToDelete);
snackbar.setTemplateText(mActivity.getString(snackbarTemplateId)); snackbar.setTemplateText(mActivity.getString(snackbarTemplateId));
((SnackbarManageable) mActivity).getSnackbarManager().showSnackbar(snackbar); mSnackbarManager.showSnackbar(snackbar);
} }
private List<DownloadHistoryItemWrapper> getItemsForDeletion() { private List<DownloadHistoryItemWrapper> getItemsForDeletion() {
...@@ -508,13 +511,12 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat ...@@ -508,13 +511,12 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat
} }
private void dismissUndoDeletionSnackbars() { private void dismissUndoDeletionSnackbars() {
((SnackbarManageable) mActivity).getSnackbarManager().dismissSnackbars( mSnackbarManager.dismissSnackbars(mUndoDeletionSnackbarController);
mUndoDeletionSnackbarController);
} }
@VisibleForTesting @VisibleForTesting
public SnackbarManager getSnackbarManagerForTesting() { public SnackbarManager getSnackbarManagerForTesting() {
return ((SnackbarManageable) mActivity).getSnackbarManager(); return mSnackbarManager;
} }
/** Returns the {@link DownloadManagerToolbar}. */ /** Returns the {@link DownloadManagerToolbar}. */
......
...@@ -19,7 +19,7 @@ public class HistoryActivity extends SnackbarActivity { ...@@ -19,7 +19,7 @@ public class HistoryActivity extends SnackbarActivity {
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mHistoryManager = new HistoryManager(this, true); mHistoryManager = new HistoryManager(this, true, getSnackbarManager());
setContentView(mHistoryManager.getView()); setContentView(mHistoryManager.getView());
} }
......
...@@ -37,8 +37,8 @@ import org.chromium.chrome.browser.profiles.Profile; ...@@ -37,8 +37,8 @@ import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager;
import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver; import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver;
import org.chromium.chrome.browser.snackbar.Snackbar; import org.chromium.chrome.browser.snackbar.Snackbar;
import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController; import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.chrome.browser.util.IntentUtils;
import org.chromium.chrome.browser.widget.selection.SelectableListLayout; import org.chromium.chrome.browser.widget.selection.SelectableListLayout;
import org.chromium.chrome.browser.widget.selection.SelectableListToolbar.SearchDelegate; import org.chromium.chrome.browser.widget.selection.SelectableListToolbar.SearchDelegate;
...@@ -71,6 +71,7 @@ public class HistoryManager implements OnMenuItemClickListener, SignInStateObser ...@@ -71,6 +71,7 @@ public class HistoryManager implements OnMenuItemClickListener, SignInStateObser
private final HistoryManagerToolbar mToolbar; private final HistoryManagerToolbar mToolbar;
private final TextView mEmptyView; private final TextView mEmptyView;
private final RecyclerView mRecyclerView; private final RecyclerView mRecyclerView;
private final SnackbarManager mSnackbarManager;
private LargeIconBridge mLargeIconBridge; private LargeIconBridge mLargeIconBridge;
private boolean mIsSearching; private boolean mIsSearching;
...@@ -80,11 +81,14 @@ public class HistoryManager implements OnMenuItemClickListener, SignInStateObser ...@@ -80,11 +81,14 @@ public class HistoryManager implements OnMenuItemClickListener, SignInStateObser
* @param activity The Activity associated with the HistoryManager. * @param activity The Activity associated with the HistoryManager.
* @param isSeparateActivity Whether the history UI will be shown in a separate activity than * @param isSeparateActivity Whether the history UI will be shown in a separate activity than
* the main Chrome activity. * the main Chrome activity.
* @param snackbarManager The {@link SnackbarManager} used to display snackbars.
*/ */
@SuppressWarnings("unchecked") // mSelectableListLayout @SuppressWarnings("unchecked") // mSelectableListLayout
public HistoryManager(Activity activity, boolean isSeparateActivity) { public HistoryManager(
Activity activity, boolean isSeparateActivity, SnackbarManager snackbarManager) {
mActivity = activity; mActivity = activity;
mIsSeparateActivity = isSeparateActivity; mIsSeparateActivity = isSeparateActivity;
mSnackbarManager = snackbarManager;
mSelectionDelegate = new SelectionDelegate<>(); mSelectionDelegate = new SelectionDelegate<>();
mSelectionDelegate.addObserver(this); mSelectionDelegate.addObserver(this);
...@@ -186,7 +190,7 @@ public class HistoryManager implements OnMenuItemClickListener, SignInStateObser ...@@ -186,7 +190,7 @@ public class HistoryManager implements OnMenuItemClickListener, SignInStateObser
mSelectionDelegate.clearSelection(); mSelectionDelegate.clearSelection();
Snackbar snackbar = Snackbar.make(mActivity.getString(R.string.copied), this, Snackbar snackbar = Snackbar.make(mActivity.getString(R.string.copied), this,
Snackbar.TYPE_NOTIFICATION, Snackbar.UMA_HISTORY_LINK_COPIED); Snackbar.TYPE_NOTIFICATION, Snackbar.UMA_HISTORY_LINK_COPIED);
((SnackbarManageable) mActivity).getSnackbarManager().showSnackbar(snackbar); mSnackbarManager.showSnackbar(snackbar);
return true; return true;
} else if (item.getItemId() == R.id.selection_mode_open_in_incognito) { } else if (item.getItemId() == R.id.selection_mode_open_in_incognito) {
openItemsInNewTabs(mSelectionDelegate.getSelectedItems(), true); openItemsInNewTabs(mSelectionDelegate.getSelectedItems(), true);
......
...@@ -11,6 +11,7 @@ import org.chromium.chrome.R; ...@@ -11,6 +11,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.BasicNativePage; import org.chromium.chrome.browser.BasicNativePage;
import org.chromium.chrome.browser.NativePageHost; import org.chromium.chrome.browser.NativePageHost;
import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
/** /**
* Native page for managing browsing history. * Native page for managing browsing history.
...@@ -31,7 +32,8 @@ public class HistoryPage extends BasicNativePage { ...@@ -31,7 +32,8 @@ public class HistoryPage extends BasicNativePage {
@Override @Override
protected void initialize(Activity activity, final NativePageHost host) { protected void initialize(Activity activity, final NativePageHost host) {
mHistoryManager = new HistoryManager(activity, false); mHistoryManager = new HistoryManager(
activity, false, ((SnackbarManageable) activity).getSnackbarManager());
mTitle = activity.getString(R.string.menu_history); mTitle = activity.getString(R.string.menu_history);
} }
......
...@@ -8,6 +8,7 @@ import android.support.v7.widget.Toolbar; ...@@ -8,6 +8,7 @@ import android.support.v7.widget.Toolbar;
import android.view.View; import android.view.View;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.toolbar.BottomToolbarPhone; import org.chromium.chrome.browser.toolbar.BottomToolbarPhone;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentController; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentController;
...@@ -22,9 +23,10 @@ public class HistorySheetContent implements BottomSheetContent { ...@@ -22,9 +23,10 @@ public class HistorySheetContent implements BottomSheetContent {
/** /**
* @param activity The activity displaying the history manager UI. * @param activity The activity displaying the history manager UI.
* @param snackbarManager The {@link SnackbarManager} used to display snackbars.
*/ */
public HistorySheetContent(ChromeActivity activity) { public HistorySheetContent(ChromeActivity activity, SnackbarManager snackbarManager) {
mHistoryManager = new HistoryManager(activity, false); mHistoryManager = new HistoryManager(activity, false, snackbarManager);
mContentView = mHistoryManager.getView(); mContentView = mHistoryManager.getView();
mToolbarView = mHistoryManager.detachToolbarView(); mToolbarView = mHistoryManager.detachToolbarView();
((BottomToolbarPhone) activity.getToolbarManager().getToolbar()) ((BottomToolbarPhone) activity.getToolbarManager().getToolbar())
......
...@@ -255,7 +255,8 @@ public class NewTabPage ...@@ -255,7 +255,8 @@ public class NewTabPage
private NewTabPageTileGroupDelegate(ChromeActivity activity, Profile profile, private NewTabPageTileGroupDelegate(ChromeActivity activity, Profile profile,
TabModelSelector tabModelSelector, TabModelSelector tabModelSelector,
SuggestionsNavigationDelegate navigationDelegate) { SuggestionsNavigationDelegate navigationDelegate) {
super(activity, profile, tabModelSelector, navigationDelegate); super(activity, profile, tabModelSelector, navigationDelegate,
activity.getSnackbarManager());
} }
@Override @Override
......
...@@ -115,7 +115,7 @@ public class SearchActivity extends AsyncInitializationActivity ...@@ -115,7 +115,7 @@ public class SearchActivity extends AsyncInitializationActivity
initializeDimensions(); initializeDimensions();
mWindowAndroid = new ActivityWindowAndroid(this); mWindowAndroid = new ActivityWindowAndroid(this);
mSnackbarManager = new SnackbarManager(this); mSnackbarManager = new SnackbarManager(this, null);
mSearchBoxDataProvider = new SearchBoxDataProvider(); mSearchBoxDataProvider = new SearchBoxDataProvider();
mContentView = createContentView(mSearchBox); mContentView = createContentView(mSearchBox);
......
...@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.snackbar; ...@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.snackbar;
import android.app.Activity; import android.app.Activity;
import android.os.Handler; import android.os.Handler;
import android.support.annotation.Nullable;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
...@@ -68,6 +69,7 @@ public class SnackbarManager implements OnClickListener { ...@@ -68,6 +69,7 @@ public class SnackbarManager implements OnClickListener {
private SnackbarCollection mSnackbars = new SnackbarCollection(); private SnackbarCollection mSnackbars = new SnackbarCollection();
private boolean mActivityInForeground; private boolean mActivityInForeground;
private boolean mIsDisabledForTesting; private boolean mIsDisabledForTesting;
private ViewGroup mSnackbarParentView;
private final Runnable mHideRunnable = new Runnable() { private final Runnable mHideRunnable = new Runnable() {
@Override @Override
public void run() { public void run() {
...@@ -79,10 +81,13 @@ public class SnackbarManager implements OnClickListener { ...@@ -79,10 +81,13 @@ public class SnackbarManager implements OnClickListener {
/** /**
* Constructs a SnackbarManager to show snackbars in the given window. * Constructs a SnackbarManager to show snackbars in the given window.
* @param activity The embedding activity. * @param activity The embedding activity.
* @param snackbarParentView The ViewGroup used to display snackbars. If this is null, the
* {@link SnackbarView} will determine where to attach the snackbar.
*/ */
public SnackbarManager(Activity activity) { public SnackbarManager(Activity activity, @Nullable ViewGroup snackbarParentView) {
mActivity = activity; mActivity = activity;
mUIThreadHandler = new Handler(); mUIThreadHandler = new Handler();
mSnackbarParentView = snackbarParentView;
} }
/** /**
...@@ -114,6 +119,14 @@ public class SnackbarManager implements OnClickListener { ...@@ -114,6 +119,14 @@ public class SnackbarManager implements OnClickListener {
mView.announceforAccessibility(); mView.announceforAccessibility();
} }
/** Dismisses all snackbars. */
public void dismissAllSnackbars() {
if (mSnackbars.isEmpty()) return;
mSnackbars.clear();
updateView();
}
/** /**
* Dismisses snackbars that are associated with the given {@link SnackbarController}. * Dismisses snackbars that are associated with the given {@link SnackbarController}.
* *
...@@ -182,7 +195,7 @@ public class SnackbarManager implements OnClickListener { ...@@ -182,7 +195,7 @@ public class SnackbarManager implements OnClickListener {
} else { } else {
boolean viewChanged = true; boolean viewChanged = true;
if (mView == null) { if (mView == null) {
mView = new SnackbarView(mActivity, this, currentSnackbar); mView = new SnackbarView(mActivity, this, currentSnackbar, mSnackbarParentView);
mView.show(); mView.show();
} else { } else {
viewChanged = mView.update(currentSnackbar); viewChanged = mView.update(currentSnackbar);
......
...@@ -12,6 +12,7 @@ import android.app.Activity; ...@@ -12,6 +12,7 @@ import android.app.Activity;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.GradientDrawable;
import android.support.annotation.Nullable;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.SurfaceView; import android.view.SurfaceView;
import android.view.View; import android.view.View;
...@@ -46,6 +47,7 @@ class SnackbarView { ...@@ -46,6 +47,7 @@ class SnackbarView {
private ViewGroup mOriginalParent; private ViewGroup mOriginalParent;
private ViewGroup mParent; private ViewGroup mParent;
private Snackbar mSnackbar; private Snackbar mSnackbar;
private boolean mAnimateOverWebContent;
// Variables used to calculate the virtual keyboard's height. // Variables used to calculate the virtual keyboard's height.
private Rect mCurrentVisibleRect = new Rect(); private Rect mCurrentVisibleRect = new Rect();
...@@ -65,11 +67,21 @@ class SnackbarView { ...@@ -65,11 +67,21 @@ class SnackbarView {
* @param listener An {@link OnClickListener} that will be called when the action button is * @param listener An {@link OnClickListener} that will be called when the action button is
* clicked. * clicked.
* @param snackbar The snackbar to be displayed. * @param snackbar The snackbar to be displayed.
* @param parentView The ViewGroup used to display this snackbar. If this is null, this class
* will determine where to attach the snackbar.
*/ */
SnackbarView(Activity activity, OnClickListener listener, Snackbar snackbar) { SnackbarView(Activity activity, OnClickListener listener, Snackbar snackbar,
@Nullable ViewGroup parentView) {
mActivity = activity; mActivity = activity;
mIsTablet = DeviceFormFactor.isTablet(activity); mIsTablet = DeviceFormFactor.isTablet(activity);
mOriginalParent = findParentView(activity);
if (parentView == null) {
mOriginalParent = findParentView(activity);
if (activity instanceof ChromeActivity) mAnimateOverWebContent = true;
} else {
mOriginalParent = parentView;
}
mParent = mOriginalParent; mParent = mOriginalParent;
mView = (ViewGroup) LayoutInflater.from(activity).inflate( mView = (ViewGroup) LayoutInflater.from(activity).inflate(
R.layout.snackbar, mParent, false); R.layout.snackbar, mParent, false);
...@@ -248,7 +260,7 @@ class SnackbarView { ...@@ -248,7 +260,7 @@ class SnackbarView {
* in the normal way. * in the normal way.
*/ */
private void startAnimatorOnSurfaceView(Animator animator) { private void startAnimatorOnSurfaceView(Animator animator) {
if (mActivity instanceof ChromeActivity) { if (mAnimateOverWebContent) {
((ChromeActivity) mActivity).getWindowAndroid().startAnimationOverContent(animator); ((ChromeActivity) mActivity).getWindowAndroid().startAnimationOverContent(animator);
} else { } else {
animator.start(); animator.start();
......
...@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource; ...@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.LocationBar;
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.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.widget.FadingShadow; import org.chromium.chrome.browser.widget.FadingShadow;
import org.chromium.chrome.browser.widget.FadingShadowView; import org.chromium.chrome.browser.widget.FadingShadowView;
...@@ -48,12 +49,12 @@ public class SuggestionsBottomSheetContent implements BottomSheet.BottomSheetCon ...@@ -48,12 +49,12 @@ public class SuggestionsBottomSheetContent implements BottomSheet.BottomSheetCon
private final TileGroup.Delegate mTileGroupDelegate; private final TileGroup.Delegate mTileGroupDelegate;
public SuggestionsBottomSheetContent(final ChromeActivity activity, final BottomSheet sheet, public SuggestionsBottomSheetContent(final ChromeActivity activity, final BottomSheet sheet,
TabModelSelector tabModelSelector) { TabModelSelector tabModelSelector, SnackbarManager snackbarManager) {
Profile profile = Profile.getLastUsedProfile(); Profile profile = Profile.getLastUsedProfile();
SuggestionsNavigationDelegate navigationDelegate = SuggestionsNavigationDelegate navigationDelegate =
new SuggestionsNavigationDelegateImpl(activity, profile, sheet, tabModelSelector); new SuggestionsNavigationDelegateImpl(activity, profile, sheet, tabModelSelector);
mTileGroupDelegate = mTileGroupDelegate = new TileGroupDelegateImpl(
new TileGroupDelegateImpl(activity, profile, tabModelSelector, navigationDelegate); activity, profile, tabModelSelector, navigationDelegate, snackbarManager);
mSuggestionsManager = createSuggestionsDelegate(profile, navigationDelegate, sheet); mSuggestionsManager = createSuggestionsDelegate(profile, navigationDelegate, sheet);
mView = LayoutInflater.from(activity).inflate( mView = LayoutInflater.from(activity).inflate(
......
...@@ -45,9 +45,10 @@ public class TileGroupDelegateImpl implements TileGroup.Delegate { ...@@ -45,9 +45,10 @@ public class TileGroupDelegateImpl implements TileGroup.Delegate {
private SnackbarController mTileRemovedSnackbarController; private SnackbarController mTileRemovedSnackbarController;
public TileGroupDelegateImpl(ChromeActivity activity, Profile profile, public TileGroupDelegateImpl(ChromeActivity activity, Profile profile,
TabModelSelector tabModelSelector, SuggestionsNavigationDelegate navigationDelegate) { TabModelSelector tabModelSelector, SuggestionsNavigationDelegate navigationDelegate,
SnackbarManager snackbarManager) {
mContext = activity; mContext = activity;
mSnackbarManager = activity.getSnackbarManager(); mSnackbarManager = snackbarManager;
mTabModelSelector = tabModelSelector; mTabModelSelector = tabModelSelector;
mNavigationDelegate = navigationDelegate; mNavigationDelegate = navigationDelegate;
mMostVisitedSites = buildMostVisitedSites(profile); mMostVisitedSites = buildMostVisitedSites(profile);
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.widget.bottomsheet; package org.chromium.chrome.browser.widget.bottomsheet;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.support.annotation.IntDef; import android.support.annotation.IntDef;
...@@ -14,12 +15,17 @@ import android.support.design.widget.BottomNavigationView.OnNavigationItemSelect ...@@ -14,12 +15,17 @@ import android.support.design.widget.BottomNavigationView.OnNavigationItemSelect
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import org.chromium.base.ActivityState;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.ApplicationStatus.ActivityStateListener;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.bookmarks.BookmarkSheetContent; import org.chromium.chrome.browser.bookmarks.BookmarkSheetContent;
import org.chromium.chrome.browser.download.DownloadSheetContent; import org.chromium.chrome.browser.download.DownloadSheetContent;
import org.chromium.chrome.browser.history.HistorySheetContent; import org.chromium.chrome.browser.history.HistorySheetContent;
import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.suggestions.SuggestionsBottomSheetContent; import org.chromium.chrome.browser.suggestions.SuggestionsBottomSheetContent;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.util.MathUtils; import org.chromium.chrome.browser.util.MathUtils;
...@@ -57,6 +63,8 @@ public class BottomSheetContentController extends BottomNavigationView ...@@ -57,6 +63,8 @@ public class BottomSheetContentController extends BottomNavigationView
+ mDistanceBelowToolbarPx; + mDistanceBelowToolbarPx;
setTranslationY((int) Math.max(offsetY, 0f)); setTranslationY((int) Math.max(offsetY, 0f));
setVisibility(MathUtils.areFloatsEqual(heightFraction, 0f) ? View.GONE : View.VISIBLE); setVisibility(MathUtils.areFloatsEqual(heightFraction, 0f) ? View.GONE : View.VISIBLE);
mSnackbarManager.dismissAllSnackbars();
} }
@Override @Override
...@@ -88,6 +96,7 @@ public class BottomSheetContentController extends BottomNavigationView ...@@ -88,6 +96,7 @@ public class BottomSheetContentController extends BottomNavigationView
private BottomSheet mBottomSheet; private BottomSheet mBottomSheet;
private TabModelSelector mTabModelSelector; private TabModelSelector mTabModelSelector;
private SnackbarManager mSnackbarManager;
private float mDistanceBelowToolbarPx; private float mDistanceBelowToolbarPx;
private int mSelectedItemId; private int mSelectedItemId;
private boolean mDefaultContentInitialized; private boolean mDefaultContentInitialized;
...@@ -101,9 +110,10 @@ public class BottomSheetContentController extends BottomNavigationView ...@@ -101,9 +110,10 @@ public class BottomSheetContentController extends BottomNavigationView
* @param bottomSheet The {@link BottomSheet} associated with this bottom nav. * @param bottomSheet The {@link BottomSheet} associated with this bottom nav.
* @param controlContainerHeight The height of the control container in px. * @param controlContainerHeight The height of the control container in px.
* @param tabModelSelector The {@link TabModelSelector} for the application. * @param tabModelSelector The {@link TabModelSelector} for the application.
* @param activity The {@link Activity} that owns the BottomSheet.
*/ */
public void init(BottomSheet bottomSheet, int controlContainerHeight, public void init(BottomSheet bottomSheet, int controlContainerHeight,
TabModelSelector tabModelSelector) { TabModelSelector tabModelSelector, Activity activity) {
mBottomSheet = bottomSheet; mBottomSheet = bottomSheet;
mBottomSheet.addObserver(mBottomSheetObserver); mBottomSheet.addObserver(mBottomSheetObserver);
mTabModelSelector = tabModelSelector; mTabModelSelector = tabModelSelector;
...@@ -114,6 +124,18 @@ public class BottomSheetContentController extends BottomNavigationView ...@@ -114,6 +124,18 @@ public class BottomSheetContentController extends BottomNavigationView
setOnNavigationItemSelectedListener(this); setOnNavigationItemSelectedListener(this);
disableShiftingMode(); disableShiftingMode();
mSnackbarManager = new SnackbarManager(
activity, (ViewGroup) activity.findViewById(R.id.bottom_sheet_snackbar_container));
mSnackbarManager.onStart();
ApplicationStatus.registerStateListenerForActivity(new ActivityStateListener() {
@Override
public void onActivityStateChange(Activity activity, int newState) {
if (newState == ActivityState.STARTED) mSnackbarManager.onStart();
if (newState == ActivityState.STOPPED) mSnackbarManager.onStop();
}
}, activity);
} }
/** /**
...@@ -129,6 +151,7 @@ public class BottomSheetContentController extends BottomNavigationView ...@@ -129,6 +151,7 @@ public class BottomSheetContentController extends BottomNavigationView
public boolean onNavigationItemSelected(MenuItem item) { public boolean onNavigationItemSelected(MenuItem item) {
if (mSelectedItemId == item.getItemId()) return false; if (mSelectedItemId == item.getItemId()) return false;
mSnackbarManager.dismissAllSnackbars();
showBottomSheetContent(item.getItemId()); showBottomSheetContent(item.getItemId());
return true; return true;
} }
...@@ -161,14 +184,16 @@ public class BottomSheetContentController extends BottomNavigationView ...@@ -161,14 +184,16 @@ public class BottomSheetContentController extends BottomNavigationView
if (navItemId == R.id.action_home) { if (navItemId == R.id.action_home) {
content = new SuggestionsBottomSheetContent( content = new SuggestionsBottomSheetContent(
mTabModelSelector.getCurrentTab().getActivity(), mBottomSheet, mTabModelSelector.getCurrentTab().getActivity(), mBottomSheet,
mTabModelSelector); mTabModelSelector, mSnackbarManager);
} else if (navItemId == R.id.action_downloads) { } else if (navItemId == R.id.action_downloads) {
content = new DownloadSheetContent(mTabModelSelector.getCurrentTab().getActivity(), content = new DownloadSheetContent(mTabModelSelector.getCurrentTab().getActivity(),
mTabModelSelector.getCurrentModel().isIncognito()); mTabModelSelector.getCurrentModel().isIncognito(), mSnackbarManager);
} else if (navItemId == R.id.action_bookmarks) { } else if (navItemId == R.id.action_bookmarks) {
content = new BookmarkSheetContent(mTabModelSelector.getCurrentTab().getActivity()); content = new BookmarkSheetContent(
mTabModelSelector.getCurrentTab().getActivity(), mSnackbarManager);
} else if (navItemId == R.id.action_history) { } else if (navItemId == R.id.action_history) {
content = new HistorySheetContent(mTabModelSelector.getCurrentTab().getActivity()); content = new HistorySheetContent(
mTabModelSelector.getCurrentTab().getActivity(), mSnackbarManager);
} }
mBottomSheetContents.put(navItemId, content); mBottomSheetContents.put(navItemId, content);
return content; return content;
......
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