Commit fb355670 authored by Sky Malice's avatar Sky Malice Committed by Commit Bot

[Touchless] Show toast instead of snackbar on fetch errors.

Touchless doesn't support snackbars so use toasts instead.

Bug: 959333
Change-Id: I14fcea19a53e6d3d7e7bfee6542ff71775dbed03
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1626884Reviewed-by: default avatarTheresa <twellington@chromium.org>
Reviewed-by: default avatarJustin DeWitt <dewittj@chromium.org>
Commit-Queue: Sky Malice <skym@chromium.org>
Cr-Commit-Position: refs/heads/master@{#663752}
parent 5158b6cf
...@@ -183,11 +183,13 @@ public class ActionItem extends OptionalLeaf { ...@@ -183,11 +183,13 @@ public class ActionItem extends OptionalLeaf {
// If we fail to find it under the action_button id, fallback to the top-level view. // If we fail to find it under the action_button id, fallback to the top-level view.
if (mButton == null) mButton = itemView; if (mButton == null) mButton = itemView;
mUiDelegate = uiDelegate; mUiDelegate = uiDelegate;
mButton.setOnClickListener(v -> mActionListItem.performAction(uiDelegate, mButton.setOnClickListener(v
this::showFetchFailureSnackbar, this::showNoNewSuggestionsSnackbar)); -> mActionListItem.performAction(uiDelegate, this::showFetchFailureMessage,
this::showNoNewSuggestionsMessage));
} }
private void showFetchFailureSnackbar() { /** Shows a message to the user that the fetch failed. */
protected void showFetchFailureMessage() {
mUiDelegate.getSnackbarManager().showSnackbar(Snackbar.make( mUiDelegate.getSnackbarManager().showSnackbar(Snackbar.make(
itemView.getResources().getString(R.string.ntp_suggestions_fetch_failed), itemView.getResources().getString(R.string.ntp_suggestions_fetch_failed),
new SnackbarManager.SnackbarController() { }, new SnackbarManager.SnackbarController() { },
...@@ -196,7 +198,8 @@ public class ActionItem extends OptionalLeaf { ...@@ -196,7 +198,8 @@ public class ActionItem extends OptionalLeaf {
); );
} }
private void showNoNewSuggestionsSnackbar() { /** Shows a message to the user that no new suggestions could be loaded. */
protected void showNoNewSuggestionsMessage() {
mUiDelegate.getSnackbarManager().showSnackbar(Snackbar.make( mUiDelegate.getSnackbarManager().showSnackbar(Snackbar.make(
itemView.getResources().getString( itemView.getResources().getString(
R.string.ntp_suggestions_fetch_no_new_suggestions), R.string.ntp_suggestions_fetch_no_new_suggestions),
......
...@@ -9,6 +9,7 @@ import android.widget.LinearLayout; ...@@ -9,6 +9,7 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.native_page.ContextMenuManager; import org.chromium.chrome.browser.native_page.ContextMenuManager;
import org.chromium.chrome.browser.ntp.cards.ActionItem; import org.chromium.chrome.browser.ntp.cards.ActionItem;
import org.chromium.chrome.browser.suggestions.SuggestionsRecyclerView; import org.chromium.chrome.browser.suggestions.SuggestionsRecyclerView;
...@@ -16,6 +17,7 @@ import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate; ...@@ -16,6 +17,7 @@ import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
import org.chromium.chrome.browser.widget.displaystyle.UiConfig; import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
import org.chromium.chrome.touchless.R; import org.chromium.chrome.touchless.R;
import org.chromium.ui.widget.ChromeImageView; import org.chromium.ui.widget.ChromeImageView;
import org.chromium.ui.widget.Toast;
/** ViewHolder associated to {@link ItemViewType#ACTION} for touchless devices. */ /** ViewHolder associated to {@link ItemViewType#ACTION} for touchless devices. */
class TouchlessActionItemViewHolder extends ActionItem.ViewHolder { class TouchlessActionItemViewHolder extends ActionItem.ViewHolder {
...@@ -64,4 +66,23 @@ class TouchlessActionItemViewHolder extends ActionItem.ViewHolder { ...@@ -64,4 +66,23 @@ class TouchlessActionItemViewHolder extends ActionItem.ViewHolder {
assert false : "ActionViewHolder got notified of an unsupported state: " + state; assert false : "ActionViewHolder got notified of an unsupported state: " + state;
} }
} }
@Override
protected void showFetchFailureMessage() {
Toast.makeText(itemView.getContext(), R.string.ntp_suggestions_fetch_failed,
Toast.LENGTH_SHORT)
.show();
}
@Override
protected void showNoNewSuggestionsMessage() {
Toast.makeText(itemView.getContext(), R.string.ntp_suggestions_fetch_no_new_suggestions,
Toast.LENGTH_SHORT)
.show();
}
@VisibleForTesting
View getButtonForTesting() {
return mButton;
}
} }
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.touchless;
import android.support.test.filters.SmallTest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowToast;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.native_page.ContextMenuManager;
import org.chromium.chrome.browser.ntp.cards.ActionItem;
import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo;
import org.chromium.chrome.browser.ntp.cards.SuggestionsSection;
import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
import org.chromium.chrome.browser.suggestions.ContentSuggestionsAdditionalAction;
import org.chromium.chrome.browser.suggestions.SuggestionsEventReporter;
import org.chromium.chrome.browser.suggestions.SuggestionsRanker;
import org.chromium.chrome.browser.suggestions.SuggestionsRecyclerView;
import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
import org.chromium.chrome.test.util.browser.suggestions.ContentSuggestionsTestUtils;
/**
* Unit tests for the TouchlessActionItemViewHolder class.
*/
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class TouchlessActionItemViewHolderTest {
@Mock
private ContextMenuManager mContextMenuManager;
@Mock
private SuggestionsUiDelegate mUiDelegate;
@Mock
private UiConfig mUiConfig;
@Mock
private SuggestionsSection mSection;
@Mock
private SuggestionsRanker mRanker;
@Mock
private SuggestionsEventReporter mSuggestionsEventReporter;
@Captor
private ArgumentCaptor<Runnable> mCallbackCaptor;
private TouchlessActionItemViewHolder mViewHolder;
@Before
public void setUp() throws InterruptedException {
MockitoAnnotations.initMocks(this);
SuggestionsRecyclerView recyclerView =
new SuggestionsRecyclerView(RuntimeEnvironment.application);
mViewHolder = new TouchlessActionItemViewHolder(
recyclerView, mContextMenuManager, mUiDelegate, mUiConfig);
SuggestionsCategoryInfo info =
new ContentSuggestionsTestUtils.CategoryInfoBuilder(KnownCategories.ARTICLES)
.withAction(ContentSuggestionsAdditionalAction.FETCH)
.showIfEmpty()
.build();
Mockito.when(mSection.getCategoryInfo()).thenReturn(info);
Mockito.when(mUiDelegate.getEventReporter()).thenReturn(mSuggestionsEventReporter);
}
@Test
@SmallTest
public void testOnFailureToast() {
mViewHolder.onBindViewHolder(new ActionItem(mSection, mRanker));
mViewHolder.getButtonForTesting().performClick();
Assert.assertEquals(0, ShadowToast.shownToastCount());
Mockito.verify(mSection).fetchSuggestions(/*onFailure*/
mCallbackCaptor.capture(), /*onNoNewSuggestions*/ Mockito.any(Runnable.class));
mCallbackCaptor.getValue().run();
Mockito.verify(mUiDelegate, Mockito.never()).getSnackbarManager();
Assert.assertEquals(1, ShadowToast.shownToastCount());
}
@Test
@SmallTest
public void testOnNoNewSuggestionsToast() {
mViewHolder.onBindViewHolder(new ActionItem(mSection, mRanker));
mViewHolder.getButtonForTesting().performClick();
Assert.assertEquals(0, ShadowToast.shownToastCount());
Mockito.verify(mSection).fetchSuggestions(/*onFailure*/
Mockito.any(Runnable.class), /*onNoNewSuggestions*/ mCallbackCaptor.capture());
mCallbackCaptor.getValue().run();
Mockito.verify(mUiDelegate, Mockito.never()).getSnackbarManager();
Assert.assertEquals(1, ShadowToast.shownToastCount());
}
}
...@@ -70,7 +70,10 @@ touchless_test_java_sources = [ ...@@ -70,7 +70,10 @@ touchless_test_java_sources = [
"touchless/javatests/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediatorTest.java", "touchless/javatests/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediatorTest.java",
] ]
touchless_junit_test_java_sources = [ "touchless/junit/src/org/chromium/chrome/browser/touchless/ScrollPositionInfoTest.java" ] touchless_junit_test_java_sources = [
"touchless/junit/src/org/chromium/chrome/browser/touchless/ScrollPositionInfoTest.java",
"touchless/junit/src/org/chromium/chrome/browser/touchless/TouchlessActionItemViewHolderTest.java",
]
touchess_fallback_java_sources = [ touchess_fallback_java_sources = [
"touchless/fallback/java/src/org/chromium/chrome/browser/touchless/TouchlessDelegate.java", "touchless/fallback/java/src/org/chromium/chrome/browser/touchless/TouchlessDelegate.java",
......
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