Commit 7b00a635 authored by Wenyu Fu's avatar Wenyu Fu Committed by Commit Bot

[HomepageConversion] Change context menu for homebutton

According to proposal, when the feature flag is enabled, the context
menu for Homebutton will be changed from "Remove" to "Edit Homepage",
and launch HomeSettings.

Change-Id: If416a585200a7b854cdd66f4c0b1f0982983fef9
Bug: 1036470
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1994099Reviewed-by: default avatarNatalie Chouinard <chouinard@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Commit-Queue: Wenyu Fu <wenyufu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#733052}
parent 74c9298f
......@@ -485,6 +485,7 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java",
"javatests/src/org/chromium/chrome/browser/test/CommandLineInitRule.java",
"javatests/src/org/chromium/chrome/browser/test/ScreenShooter.java",
"javatests/src/org/chromium/chrome/browser/toolbar/HomeButtonTest.java",
"javatests/src/org/chromium/chrome/browser/toolbar/IdentityDiscControllerTest.java",
"javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java",
"javatests/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarIntegrationTest.java",
......
......@@ -15,6 +15,8 @@ import android.view.MenuItem;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
......@@ -24,10 +26,13 @@ import org.chromium.chrome.browser.ThemeColorProvider.TintObserver;
import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeState;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.FeatureUtilities;
import org.chromium.chrome.browser.homepage.HomepagePolicyManager;
import org.chromium.chrome.browser.ntp.NewTabPage;
import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
import org.chromium.chrome.browser.settings.SettingsLauncher;
import org.chromium.chrome.browser.settings.homepage.HomepageSettings;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.ui.widget.ChromeImageButton;
......@@ -37,7 +42,10 @@ import org.chromium.ui.widget.ChromeImageButton;
public class HomeButton extends ChromeImageButton
implements TintObserver, OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener,
HomepageManager.HomepageStateListener {
private static final int ID_REMOVE = 0;
@VisibleForTesting
public static final int ID_REMOVE = 0;
@VisibleForTesting
public static final int ID_SETTINGS = 1;
/** A provider that notifies components when the theme color changes.*/
private ThemeColorProvider mThemeColorProvider;
......@@ -54,6 +62,10 @@ public class HomeButton extends ChromeImageButton
/** The {@link OvervieModeObserver} observing the OverviewModeBehavior */
private OverviewModeBehavior.OverviewModeObserver mOverviewModeObserver;
// Test related members
private static boolean sSaveContextMenuForTests;
private ContextMenu mMenuForTests;
public HomeButton(Context context, AttributeSet attrs) {
super(context, attrs);
......@@ -112,14 +124,31 @@ public class HomeButton extends ChromeImageButton
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove).setOnMenuItemClickListener(this);
// Disable long click before native initialized.
if (!ChromeFeatureList.isInitialized()) return;
if (isHomepageSettingsUIConversionEnabled()) {
menu.add(Menu.NONE, ID_SETTINGS, Menu.NONE, R.string.homebutton_context_menu_settings)
.setOnMenuItemClickListener(this);
} else {
menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove)
.setOnMenuItemClickListener(this);
}
if (sSaveContextMenuForTests) mMenuForTests = menu;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
assert item.getItemId() == ID_REMOVE;
assert !isManagedByPolicy();
HomepageManager.getInstance().setPrefHomepageEnabled(false);
if (isHomepageSettingsUIConversionEnabled()) {
assert item.getItemId() == ID_SETTINGS;
SettingsLauncher.getInstance().launchSettingsPage(getContext(), HomepageSettings.class);
} else {
assert item.getItemId() == ID_REMOVE;
HomepageManager.getInstance().setPrefHomepageEnabled(false);
}
return true;
}
......@@ -205,4 +234,25 @@ public class HomeButton extends ChromeImageButton
setLongClickable(false);
}
}
private boolean isHomepageSettingsUIConversionEnabled() {
assert ChromeFeatureList.isInitialized();
return ChromeFeatureList.isEnabled(ChromeFeatureList.HOMEPAGE_SETTINGS_UI_CONVERSION);
}
/**
* @param saveContextMenuForTests Whether we want to store the context menu for testing
*/
@VisibleForTesting
public static void setSaveContextMenuForTests(boolean saveContextMenuForTests) {
sSaveContextMenuForTests = saveContextMenuForTests;
}
/**
* @return Latest context menu created.
*/
@VisibleForTesting
public ContextMenu getMenuForTests() {
return mMenuForTests;
}
}
// Copyright 2020 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.toolbar;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.longClick;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import android.support.test.filters.SmallTest;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.FeatureUtilities;
import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.settings.SettingsLauncher;
import org.chromium.chrome.browser.settings.homepage.HomepageSettings;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.test.util.DummyUiActivityTestCase;
/**
* Test related to {@link HomeButton}.
*
* Currently the change only affects {@link
* FeatureUtilities#isHomepageSettingsUIConversionEnabled()}.
* TODO: Add more test when features related has update.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
public class HomeButtonTest extends DummyUiActivityTestCase {
private static final String ASSERT_MSG_MENU_IS_CREATED =
"ContextMenu is not created after long press.";
private static final String ASSERT_MSG_MENU_SIZE =
"ContextMenu has a different size than test setting.";
private static final String ASSERT_MSG_MENU_ITEM_TEXT =
"MenuItem does shows different text than test setting.";
@Rule
public TestRule mProcessor = new Features.JUnitProcessor();
@Mock
private SettingsLauncher mSettingsLauncher;
private HomeButton mHomeButton;
private int mIdHomeButton;
private boolean mIsHomepageEnabled;
private boolean mIsUsingDefaultHomepage;
private String mCustomizedHomepage;
public HomeButtonTest() {
super();
SharedPreferencesManager manager = SharedPreferencesManager.getInstance();
mIsHomepageEnabled = manager.readBoolean(ChromePreferenceKeys.HOMEPAGE_ENABLED, true);
mIsUsingDefaultHomepage =
manager.readBoolean(ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, true);
mCustomizedHomepage = manager.readString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI, "");
}
@Override
public void setUpTest() throws Exception {
super.setUpTest();
MockitoAnnotations.initMocks(this);
SettingsLauncher.getInstance().setInstanceForTests(mSettingsLauncher);
setupDefaultHomepagePreferences();
TestThreadUtils.runOnUiThreadBlocking(() -> {
FrameLayout content = new FrameLayout(getActivity());
getActivity().setContentView(content);
mIdHomeButton = View.generateViewId();
mHomeButton = new HomeButton(getActivity(), null);
mHomeButton.setId(mIdHomeButton);
HomeButton.setSaveContextMenuForTests(true);
content.addView(mHomeButton);
});
}
@Override
public void tearDownTest() throws Exception {
super.tearDownTest();
resetHomepageRelatedPreferenceAfterTest();
}
@Test
@SmallTest
@DisableFeatures(ChromeFeatureList.HOMEPAGE_SETTINGS_UI_CONVERSION)
public void testContextMenu_BeforeConversion() {
onView(withId(mIdHomeButton)).perform(longClick());
ContextMenu menu = mHomeButton.getMenuForTests();
Assert.assertNotNull(ASSERT_MSG_MENU_IS_CREATED, menu);
Assert.assertEquals(ASSERT_MSG_MENU_SIZE, 1, menu.size());
MenuItem item_remove = menu.findItem(HomeButton.ID_REMOVE);
Assert.assertNotNull("MenuItem 'Remove' is not added to menu", item_remove);
Assert.assertEquals(ASSERT_MSG_MENU_ITEM_TEXT, item_remove.getTitle().toString(),
getActivity().getResources().getString(R.string.remove));
// Test click on context menu item
Assert.assertTrue("Homepage should be enabled before clicking the menu item.",
HomepageManager.isHomepageEnabled());
onView(withText(R.string.remove)).perform(click());
Assert.assertFalse("Homepage should be disabled after clicking the menu item.",
HomepageManager.isHomepageEnabled());
}
@Test
@SmallTest
@EnableFeatures(ChromeFeatureList.HOMEPAGE_SETTINGS_UI_CONVERSION)
public void testContextMenu_AfterConversion() {
onView(withId(mIdHomeButton)).perform(longClick());
ContextMenu menu = mHomeButton.getMenuForTests();
Assert.assertNotNull(ASSERT_MSG_MENU_IS_CREATED, menu);
Assert.assertEquals(ASSERT_MSG_MENU_SIZE, 1, menu.size());
MenuItem item_settings = menu.findItem(HomeButton.ID_SETTINGS);
Assert.assertNotNull("MenuItem 'Edit Homepage' is not added to menu", item_settings);
Assert.assertEquals(ASSERT_MSG_MENU_ITEM_TEXT, item_settings.getTitle().toString(),
getActivity().getResources().getString(R.string.homebutton_context_menu_settings));
// Test click on context menu item
onView(withText(R.string.homebutton_context_menu_settings)).perform(click());
Mockito.verify(mSettingsLauncher)
.launchSettingsPage(mHomeButton.getContext(), HomepageSettings.class);
}
private void resetHomepageRelatedPreferenceAfterTest() {
SharedPreferencesManager manager = SharedPreferencesManager.getInstance();
manager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_ENABLED, mIsHomepageEnabled);
manager.writeBoolean(
ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, mIsUsingDefaultHomepage);
manager.writeString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI, mCustomizedHomepage);
}
/**
* Set the default test status for homepage button tests.
* By default, the homepage is <b>enabled</b> and with customized url
* <b>https://www.chromium.org/</b>.
*/
private void setupDefaultHomepagePreferences() {
SharedPreferencesManager manager = SharedPreferencesManager.getInstance();
manager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_ENABLED, true);
manager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, false);
manager.writeString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI, "https://www.chromium.org/");
}
}
......@@ -605,6 +605,9 @@ CHAR-LIMIT guidelines:
<message name="IDS_OPTIONS_HOMEPAGE_EDIT_LABEL" desc="The label for the edit text field that allows the user to change the URL that is opened when they tap on the home page button in the omnibox.">
Open this page
</message>
<message name="IDS_HOMEBUTTON_CONTEXT_MENU_SETTINGS" desc="The label displayed on home button context menu item, which navigate the user to the homepage settings.">
Edit homepage
</message>
<!-- Notifications preferences -->
<message name="IDS_PREFS_NOTIFICATIONS" desc="Title for Notification preferences.">
......
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