Commit ad8815d3 authored by Wenyu Fu's avatar Wenyu Fu Committed by Commit Bot

[HomepageConversion] Change HomepageSettings UI

Update the HomepageSettings UI to the radio group style when homepage
conversion flag is enabled.

Change-Id: Ic5d707de0a32bb0715518953bbc6286c0ec0a2da
Bug: 1036470
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2015552Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarNatalie Chouinard <chouinard@chromium.org>
Commit-Queue: Wenyu Fu <wenyufu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#738605}
parent d36e16ae
......@@ -1402,6 +1402,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/settings/download/DownloadSettings.java",
"java/src/org/chromium/chrome/browser/settings/homepage/HomepageEditor.java",
"java/src/org/chromium/chrome/browser/settings/homepage/HomepageSettings.java",
"java/src/org/chromium/chrome/browser/settings/homepage/RadioButtonGroupHomepagePreference.java",
"java/src/org/chromium/chrome/browser/settings/languages/AddLanguageFragment.java",
"java/src/org/chromium/chrome/browser/settings/languages/LanguageItem.java",
"java/src/org/chromium/chrome/browser/settings/languages/LanguageListBaseAdapter.java",
......
......@@ -413,6 +413,7 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragmentTest.java",
"javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillTestRule.java",
"javatests/src/org/chromium/chrome/browser/settings/developer/TracingSettingsTest.java",
"javatests/src/org/chromium/chrome/browser/settings/homepage/HomepageSettingsFragmentTest.java",
"javatests/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettingsTest.java",
"javatests/src/org/chromium/chrome/browser/settings/password/PasswordSettingsTest.java",
"javatests/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridgeTest.java",
......
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">
<!-- TODO(crbug.com/1048859): Change to the exact style TextMessagePreference is using. -->
<TextView
android:id="@+id/title"
style="@style/PreferenceTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/homepage_preference_title_lateral_padding"
android:paddingTop="@dimen/homepage_preference_title_vertical_padding"
android:paddingEnd="@dimen/homepage_preference_title_lateral_padding"
android:paddingBottom="@dimen/homepage_preference_title_vertical_padding"
android:text="@string/options_homepage_edit_label" />
<org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout
android:id="@+id/radio_button_group"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- TODO(crbug.com/1048863): Remove android:background for radio buttons here and below after enhancement. -->
<org.chromium.components.browser_ui.widget.RadioButtonWithDescription
android:id="@+id/radio_button_chrome_ntp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
app:primaryText="@string/options_homepage_chrome_homepage" />
<org.chromium.components.browser_ui.widget.RadioButtonWithEditText
android:id="@+id/radio_button_uri_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:hint="@string/options_homepage_edit_hint"
android:inputType="textUri" />
</org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout>
</LinearLayout>
\ No newline at end of file
......@@ -660,6 +660,8 @@
<dimen name="theme_preferences_checkbox_margin_end">8dp</dimen>
<dimen name="theme_preferences_checkbox_container_padding_start">60dp</dimen>
<dimen name="theme_preferences_checkbox_container_padding_end">16dp</dimen>
<dimen name="homepage_preference_title_lateral_padding">16dp</dimen>
<dimen name="homepage_preference_title_vertical_padding">10dp</dimen>
<!-- Dimens of tab indicator -->
<dimen name="tab_indicator_height">3dp</dimen>
......
......@@ -4,7 +4,8 @@
found in the LICENSE file. -->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<org.chromium.chrome.browser.settings.ChromeSwitchPreference
android:key="homepage_switch"
......@@ -14,6 +15,19 @@
<Preference
android:key="homepage_edit"
android:title="@string/options_homepage_edit_label"
android:visibility="gone"
android:fragment="org.chromium.chrome.browser.settings.homepage.HomepageEditor" />
<org.chromium.chrome.browser.settings.homepage.RadioButtonGroupHomepagePreference
android:key="homepage_radio_group"
android:visibility="gone"
app:allowDividerBelow="false" />
<org.chromium.chrome.browser.settings.TextMessagePreference
android:key="text_managed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:allowDividerAbove="false"
app:allowDividerBelow="false" />
</PreferenceScreen>
......@@ -93,7 +93,7 @@ public class HomepagePolicyManager implements PrefObserver {
}
@VisibleForTesting
static void setInstanceForTests(HomepagePolicyManager instance) {
public static void setInstanceForTests(HomepagePolicyManager instance) {
assert instance != null;
sInstance = instance;
}
......@@ -197,13 +197,13 @@ public class HomepagePolicyManager implements PrefObserver {
}
@VisibleForTesting
boolean isHomepageLocationPolicyEnabled() {
public boolean isHomepageLocationPolicyEnabled() {
return mIsHomepageLocationPolicyEnabled;
}
@VisibleForTesting
@NonNull
String getHomepagePreference() {
public String getHomepagePreference() {
assert mIsHomepageLocationPolicyEnabled;
return mHomepage;
}
......
......@@ -126,7 +126,18 @@ public class HomepageManager implements HomepagePolicyManager.HomepagePolicyStat
}
/**
* Get the current homepage URI string, if it's enabled. Null otherwise or uninitialized.
*
* This function checks different source to get the current homepage, which listed below
* according to their priority:
*
* <b>isManagedByPolicy > useChromeNTP > useDefaultUri > useCustomUri</b>
*
* @return Homepage URI string, if it's enabled. Null otherwise or uninitialized.
*
* @see HomepagePolicyManager#isHomepageManagedByPolicy()
* @see #getPrefHomepageUseChromeNTP()
* @see #getPrefHomepageUseDefaultUri()
*/
public static String getHomepageUri() {
if (!isHomepageEnabled()) return null;
......@@ -135,6 +146,8 @@ public class HomepageManager implements HomepagePolicyManager.HomepagePolicyStat
String homepageUri;
if (HomepagePolicyManager.isHomepageManagedByPolicy()) {
homepageUri = HomepagePolicyManager.getHomepageUrl();
} else if (manager.getPrefHomepageUseChromeNTP()) {
homepageUri = UrlConstants.NTP_NON_NATIVE_URL;
} else if (manager.getPrefHomepageUseDefaultUri()) {
homepageUri = getDefaultHomepageUri();
} else {
......@@ -147,7 +160,7 @@ public class HomepageManager implements HomepagePolicyManager.HomepagePolicyStat
* @return The default homepage URI if the homepage is partner provided or the new tab page
* if the homepage button is force enabled via flag.
*/
private static String getDefaultHomepageUri() {
public static String getDefaultHomepageUri() {
if (PartnerBrowserCustomizations.isHomepageProviderAvailableAndEnabled()) {
return PartnerBrowserCustomizations.getHomePageUrl();
}
......@@ -183,31 +196,56 @@ public class HomepageManager implements HomepagePolicyManager.HomepagePolicyStat
}
/**
* Sets custom homepage URI
* True if the homepage URL is the default value. False means the homepage URL is using
* the user customized URL. Note that this method does not take enterprise policy into account.
* Use {@link HomepagePolicyManager#isHomepageManagedByPolicy} if policy information is needed.
*
* @return Whether if the homepage URL is the default value.
*/
public void setPrefHomepageCustomUri(String customUri) {
mSharedPreferencesManager.writeString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI, customUri);
public boolean getPrefHomepageUseDefaultUri() {
return mSharedPreferencesManager.readBoolean(
ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, true);
}
/**
* @return Whether the homepage URL is the default value.
* @return Whether the homepage is set to Chrome NTP in Homepage settings
*/
public boolean getPrefHomepageUseDefaultUri() {
public boolean getPrefHomepageUseChromeNTP() {
return mSharedPreferencesManager.readBoolean(
ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, true);
ChromePreferenceKeys.HOMEPAGE_USE_CHROME_NTP, false);
}
/**
* Sets whether the homepage URL is the default value.
* Set homepage related shared preferences, and notify listeners for the homepage status change.
* These shared preference values will reflect what homepage we are using.
*
* The priority of the input pref values during value checking:
* useChromeNTP > useDefaultUri > customUri
*
* @param useChromeNtp True if homepage is set as Chrome's New tab page.
* @param useDefaultUri True if homepage is using default URI.
* @param customUri String value for user customized homepage URI.
*
* @see #getHomepageUri()
*/
public void setPrefHomepageUseDefaultUri(boolean useDefaultUri) {
assert !HomepagePolicyManager.isHomepageManagedByPolicy();
public void setHomepagePreferences(
boolean useChromeNtp, boolean useDefaultUri, String customUri) {
// TODO(wenyufu): Add metrics for how ofter user checks this option.
mSharedPreferencesManager.writeBoolean(
ChromePreferenceKeys.HOMEPAGE_USE_CHROME_NTP, useChromeNtp);
boolean wasUseDefaultUri = getPrefHomepageUseDefaultUri();
if (wasUseDefaultUri != useDefaultUri) {
recordHomepageIsCustomized(!useDefaultUri);
mSharedPreferencesManager.writeBoolean(
ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, useDefaultUri);
}
mSharedPreferencesManager.writeString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI, customUri);
notifyHomepageUpdated();
}
/**
* Get the homepage button preference state.
*/
......
......@@ -365,4 +365,9 @@ public class PartnerBrowserCustomizations {
}
return true;
}
@VisibleForTesting
public static void setHomepageForTests(String homepage) {
sHomepage = homepage;
}
}
......@@ -65,7 +65,7 @@ public class HomepageEditor extends Fragment implements TextWatcher {
mResetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mHomepageManager.setPrefHomepageUseDefaultUri(true);
mHomepageManager.setHomepagePreferences(false, true, "");
getActivity().finish();
}
});
......@@ -79,8 +79,7 @@ public class HomepageEditor extends Fragment implements TextWatcher {
@Override
public void onClick(View v) {
GURL url = UrlFormatter.fixupUrl(mHomepageUrlEdit.getText().toString());
mHomepageManager.setPrefHomepageCustomUri(url.getValidSpecOrEmpty());
mHomepageManager.setPrefHomepageUseDefaultUri(false);
mHomepageManager.setHomepagePreferences(false, false, url.getValidSpecOrEmpty());
getActivity().finish();
}
});
......
......@@ -11,12 +11,18 @@ import android.support.v7.preference.PreferenceFragmentCompat;
import androidx.annotation.VisibleForTesting;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.flags.CachedFeatureFlags;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
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.ChromeSwitchPreference;
import org.chromium.chrome.browser.settings.ManagedPreferenceDelegate;
import org.chromium.chrome.browser.settings.SettingsUtils;
import org.chromium.chrome.browser.settings.TextMessagePreference;
import org.chromium.chrome.browser.settings.homepage.RadioButtonGroupHomepagePreference.HomepageOption;
import org.chromium.chrome.browser.settings.homepage.RadioButtonGroupHomepagePreference.PreferenceValues;
import org.chromium.chrome.browser.toolbar.bottom.BottomToolbarVariationManager;
import org.chromium.components.url_formatter.UrlFormatter;
/**
* Fragment that allows the user to configure homepage related preferences.
......@@ -26,6 +32,10 @@ public class HomepageSettings extends PreferenceFragmentCompat {
public static final String PREF_HOMEPAGE_SWITCH = "homepage_switch";
@VisibleForTesting
public static final String PREF_HOMEPAGE_EDIT = "homepage_edit";
@VisibleForTesting
public static final String PREF_HOMEPAGE_RADIO_GROUP = "homepage_radio_group";
@VisibleForTesting
public static final String PREF_TEXT_MANAGED = "text_managed";
/**
* Delegate used to mark that the homepage is being managed.
......@@ -40,6 +50,8 @@ public class HomepageSettings extends PreferenceFragmentCompat {
private HomepageManager mHomepageManager;
private Preference mHomepageEdit;
private RadioButtonGroupHomepagePreference mRadioButtons;
private TextMessagePreference mTextManaged;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
......@@ -48,34 +60,159 @@ public class HomepageSettings extends PreferenceFragmentCompat {
getActivity().setTitle(R.string.options_homepage_title);
SettingsUtils.addPreferencesFromResource(this, R.xml.homepage_preferences);
HomepageManagedPreferenceDelegate managedDelegate = new HomepageManagedPreferenceDelegate();
// Set up preferences inside the activity.
ChromeSwitchPreference homepageSwitch =
(ChromeSwitchPreference) findPreference(PREF_HOMEPAGE_SWITCH);
homepageSwitch.setManagedPreferenceDelegate(new HomepageManagedPreferenceDelegate());
homepageSwitch.setManagedPreferenceDelegate(managedDelegate);
mHomepageEdit = findPreference(PREF_HOMEPAGE_EDIT);
mTextManaged = (TextMessagePreference) findPreference(PREF_TEXT_MANAGED);
mRadioButtons =
(RadioButtonGroupHomepagePreference) findPreference(PREF_HOMEPAGE_RADIO_GROUP);
if (CachedFeatureFlags.isBottomToolbarEnabled()) {
mTextManaged.setManagedPreferenceDelegate(managedDelegate);
setupPreferenceVisibility();
// Set up listeners and update the page.
if (BottomToolbarVariationManager.isHomeButtonOnBottom()) {
homepageSwitch.setVisible(false);
} else {
boolean isHomepageEnabled = HomepageManager.isHomepageEnabled();
homepageSwitch.setChecked(isHomepageEnabled);
homepageSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
mHomepageManager.setPrefHomepageEnabled((boolean) newValue);
onSwitchPreferenceChange((boolean) newValue);
return true;
});
}
mHomepageEdit = findPreference(PREF_HOMEPAGE_EDIT);
updateCurrentHomepageUrl();
if (isHomepageSettingsUIConversionEnabled()) {
mRadioButtons.setOnPreferenceChangeListener((preference, newValue) -> {
assert newValue instanceof PreferenceValues;
onRadioGroupPreferenceChange((PreferenceValues) newValue);
return true;
});
}
// Update preference views and state.
updatePreferenceState();
}
/**
* Set up the visibility for HomepageSettings based on {@link
* ChromeFeatureList#HOMEPAGE_SETTINGS_UI_CONVERSION}.
* TODO(wenyufu): If the feature flag is removed in the future, remove the unused component and
* delete this function.
*/
private void setupPreferenceVisibility() {
boolean useNewUI = isHomepageSettingsUIConversionEnabled();
mHomepageEdit.setVisible(!useNewUI);
mRadioButtons.setVisible(useNewUI);
mTextManaged.setVisible(useNewUI && BottomToolbarVariationManager.isHomeButtonOnBottom()
&& HomepagePolicyManager.isHomepageManagedByPolicy());
}
private void updateCurrentHomepageUrl() {
if (HomepagePolicyManager.isHomepageManagedByPolicy()) mHomepageEdit.setEnabled(false);
/**
* Update the visibility when pref values or policy state changes.
*/
private void updatePreferenceState() {
boolean isManagedByPolicy = HomepagePolicyManager.isHomepageManagedByPolicy();
if (isHomepageSettingsUIConversionEnabled()) {
mTextManaged.setVisible(
isManagedByPolicy && BottomToolbarVariationManager.isHomeButtonOnBottom());
if (mRadioButtons != null) {
mRadioButtons.setupPreferenceValues(createPreferenceValuesForRadioGroup());
}
} else {
mHomepageEdit.setEnabled(!isManagedByPolicy && HomepageManager.isHomepageEnabled());
mHomepageEdit.setSummary(HomepageManager.getHomepageUri());
}
}
private boolean isHomepageSettingsUIConversionEnabled() {
return ChromeFeatureList.isEnabled(ChromeFeatureList.HOMEPAGE_SETTINGS_UI_CONVERSION);
}
@Override
public void onResume() {
super.onResume();
updateCurrentHomepageUrl();
updatePreferenceState();
}
/**
* Handle the preference changes when we toggled the homepage switch.
* @param isChecked Whether switch is turned on.
*/
private void onSwitchPreferenceChange(boolean isChecked) {
mHomepageManager.setPrefHomepageEnabled(isChecked);
updatePreferenceState();
}
/**
* Will be called when the status of {@link #mRadioButtons} is changed.
* @param newValue The {@link PreferenceValues} that the {@link
* RadioButtonGroupHomepagePreference} is holding.
*/
private void onRadioGroupPreferenceChange(PreferenceValues newValue) {
// When the preference is changed by code during initialization due to policy, ignore the
// changes of the preference.
if (HomepagePolicyManager.isHomepageManagedByPolicy()) return;
boolean setToUseNTP = newValue.getCheckedOption() == HomepageOption.ENTRY_CHROME_NTP;
String newHomepage = UrlFormatter.fixupUrl(newValue.getCustomURI()).getValidSpecOrEmpty();
boolean useDefaultUri = HomepageManager.getDefaultHomepageUri().equals(newHomepage);
mHomepageManager.setHomepagePreferences(setToUseNTP, useDefaultUri, newHomepage);
}
/**
* @return The user customized homepage setting.
*/
private String getHomepageForEditText() {
if (HomepagePolicyManager.isHomepageManagedByPolicy()) {
return HomepagePolicyManager.getHomepageUrl();
}
if (mHomepageManager.getPrefHomepageUseDefaultUri()) {
String defaultUrl = HomepageManager.getDefaultHomepageUri();
return NewTabPage.isNTPUrl(defaultUrl) ? "" : defaultUrl;
}
return mHomepageManager.getPrefHomepageCustomUri();
}
private PreferenceValues createPreferenceValuesForRadioGroup() {
boolean isPolicyEnabled = HomepagePolicyManager.isHomepageManagedByPolicy();
// Check if the NTP button should be checked.
// Note it is not always checked when homepage is NTP. When user customized homepage is NTP
// URL, we don't check Chrome's Homepage radio button.
boolean shouldCheckNTP;
if (isPolicyEnabled) {
shouldCheckNTP = NewTabPage.isNTPUrl(HomepagePolicyManager.getHomepageUrl());
} else {
shouldCheckNTP = mHomepageManager.getPrefHomepageUseChromeNTP()
|| (mHomepageManager.getPrefHomepageUseDefaultUri()
&& NewTabPage.isNTPUrl(HomepageManager.getDefaultHomepageUri()));
}
@HomepageOption
int checkedOption =
shouldCheckNTP ? HomepageOption.ENTRY_CHROME_NTP : HomepageOption.ENTRY_CUSTOM_URI;
boolean isRadioButtonPreferenceEnabled =
!isPolicyEnabled && HomepageManager.isHomepageEnabled();
// NTP should be visible when policy is not enforced or the option is checked.
boolean isNTPOptionVisible = !isPolicyEnabled || shouldCheckNTP;
// Customized option should be visible when policy is not enforced or the option is checked.
boolean isCustomizedOptionVisible = !isPolicyEnabled || !shouldCheckNTP;
return new PreferenceValues(checkedOption, getHomepageForEditText(),
isRadioButtonPreferenceEnabled, isNTPOptionVisible, isCustomizedOptionVisible);
}
}
// 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.settings.homepage;
import android.content.Context;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RadioGroup;
import android.widget.TextView;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import org.chromium.chrome.R;
import org.chromium.components.browser_ui.widget.RadioButtonWithDescription;
import org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout;
import org.chromium.components.browser_ui.widget.RadioButtonWithEditText;
import org.chromium.components.browser_ui.widget.RadioButtonWithEditText.OnTextChangeListener;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* A radio button group Preference used for Homepage Preference. It contains 2 options:
* a {@link RadioButtonWithDescription} that represent Chrome NTP, and a
* {@link RadioButtonWithEditText} that represents customized URL set by partner or user.
*/
public final class RadioButtonGroupHomepagePreference
extends Preference implements RadioGroup.OnCheckedChangeListener, OnTextChangeListener {
/**
* A data structure which holds the displayed value and the status for this preference.
*/
static class PreferenceValues {
/**
* The option that is checked in {@link RadioButtonGroupHomepagePreference}.
*/
private @HomepageOption int mCheckedOption;
/**
* The string that displayed on the edit text box.
*/
private String mCustomizedText;
/**
* Whether the RadioButtonGroup is enabled.
*/
private boolean mIsEnabled;
/**
* Whether the option for to {@link HomepageOption#ENTRY_CHROME_NTP} is visible.
*/
private boolean mIsNTPOptionVisible;
/**
* Whether the option for to {@link HomepageOption#ENTRY_CUSTOM_URI} is visible.
*/
private boolean mIsCustomizedOptionVisible;
/**
* Created the data structure for {@link RadioButtonGroupHomepagePreference} to communicate
* the preference status to outside fragment.
* @param checkedOption The option that is checked in {@link
* RadioButtonGroupHomepagePreference}
* @param customizedText The string that displayed on the edit text box.
* @param isEnabled Whether the RadioButtonGroup is enabled.
* @param isNTPButtonVisible Whether the option for to {@link
* HomepageOption#ENTRY_CHROME_NTP} is visible.
* @param isCustomizedOptionVisible Whether the option for to {@link
* HomepageOption#ENTRY_CUSTOM_URI} is visible.
*/
PreferenceValues(@HomepageOption int checkedOption, String customizedText,
boolean isEnabled, boolean isNTPButtonVisible, boolean isCustomizedOptionVisible) {
mCheckedOption = checkedOption;
mCustomizedText = customizedText;
mIsEnabled = isEnabled;
mIsNTPOptionVisible = isNTPButtonVisible;
mIsCustomizedOptionVisible = isCustomizedOptionVisible;
}
/**
* @return The option that is checked in {@link RadioButtonGroupHomepagePreference}.
*/
@HomepageOption
int getCheckedOption() {
return mCheckedOption;
}
/**
* @return The string that displayed on the edit text box.
*/
String getCustomURI() {
return mCustomizedText;
}
}
/**
* Enums that represent the status of radio buttons inside this Preference.
*/
@IntDef({HomepageOption.ENTRY_CHROME_NTP, HomepageOption.ENTRY_CUSTOM_URI})
@Retention(RetentionPolicy.SOURCE)
@interface HomepageOption {
int ENTRY_CHROME_NTP = 0;
int ENTRY_CUSTOM_URI = 1;
int NUM_ENTRIES = 2;
}
private boolean mIsBoundToViewHolder;
private RadioButtonWithEditText mCustomUri;
private RadioButtonWithDescription mChromeNTP;
private RadioButtonWithDescriptionLayout mGroup;
private TextView mTitle;
private PreferenceValues mPreferenceValues;
public RadioButtonGroupHomepagePreference(Context context, AttributeSet attrs) {
super(context, attrs);
// Inflating from XML.
setLayoutResource(R.layout.radio_button_group_homepage_preference);
}
/**
* Called when the checked radio button has changed. When the selection is cleared, checkedId is
* -1.
*
* @param group The group in which the checked radio button has changed
* @param checkedId The unique identifier of the newly checked radio button
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
assert mCustomUri.isChecked() != mChromeNTP.isChecked();
@HomepageOption
int checkedOption = mChromeNTP.isChecked() ? HomepageOption.ENTRY_CHROME_NTP
: HomepageOption.ENTRY_CUSTOM_URI;
mPreferenceValues.mCheckedOption = checkedOption;
callChangeListener(mPreferenceValues);
}
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
mChromeNTP = (RadioButtonWithDescription) holder.findViewById(R.id.radio_button_chrome_ntp);
mCustomUri = (RadioButtonWithEditText) holder.findViewById(R.id.radio_button_uri_edit);
assert mChromeNTP != null : "Chrome NTP button missing in the layout";
assert mCustomUri != null : "Custom URI button missing in the layout";
mGroup = (RadioButtonWithDescriptionLayout) holder.findViewById(R.id.radio_button_group);
mGroup.setOnCheckedChangeListener(this);
mTitle = (TextView) holder.findViewById(R.id.title);
mIsBoundToViewHolder = true;
// Set up views with data provided by the delegate.
if (mPreferenceValues != null) {
setupPreferenceValues(mPreferenceValues);
}
// Set up text listeners after initial value are set.
mCustomUri.addTextChangeListener(this);
}
/**
* Will be called when the text edit has a value change.
*/
@Override
public void onTextChanged(CharSequence newText) {
assert mPreferenceValues != null;
// If the text change is triggered by the preference fragment (ex. setting up when toggle
// the switch), ignore this update.
if (mPreferenceValues.mCustomizedText.equals(newText.toString())) return;
if (mChromeNTP.isChecked()) {
// TODO(crbug.com/1048863): Remove after enhancing RadioButtonWithDescription#setChecked
mChromeNTP.setChecked(false);
mCustomUri.setChecked(true);
}
mPreferenceValues.mCheckedOption = HomepageOption.ENTRY_CUSTOM_URI;
mPreferenceValues.mCustomizedText = newText.toString();
callChangeListener(mPreferenceValues);
}
/**
* Update the current view with the latest data from the {@link PreferenceValues}. If the
* preference is not bounded with view holder yet, the values will be stored and populated at
* the end of {@link #onBindViewHolder(PreferenceViewHolder)}.
*
* @param value The {@link PreferenceValues} that should be presents by this preference.
*/
void setupPreferenceValues(@NonNull PreferenceValues value) {
if (mIsBoundToViewHolder) {
mGroup.setEnabled(value.mIsEnabled);
mTitle.setEnabled(value.mIsEnabled);
// Change the text first so that #onTextChanged will not mess up radio buttons that
// should be checked.
mCustomUri.setPrimaryText(value.mCustomizedText);
mChromeNTP.setChecked(value.mCheckedOption == HomepageOption.ENTRY_CHROME_NTP);
mCustomUri.setChecked(value.mCheckedOption == HomepageOption.ENTRY_CUSTOM_URI);
mChromeNTP.setVisibility(value.mIsNTPOptionVisible ? View.VISIBLE : View.GONE);
mCustomUri.setVisibility(value.mIsCustomizedOptionVisible ? View.VISIBLE : View.GONE);
}
// Lastly, store the value as current value the preference is displaying.
// Doing it last to keep the previous value for necessary comparing in #onTextChanged.
mPreferenceValues = value;
}
@VisibleForTesting
RadioButtonWithEditText getCustomUriRadioButton() {
return mCustomUri;
}
@VisibleForTesting
RadioButtonWithDescription getChromeNTPRadioButton() {
return mChromeNTP;
}
@VisibleForTesting
TextView getTitleTextView() {
return mTitle;
}
}
......@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
*/
public class HomepageTestRule implements TestRule {
private boolean mIsHomepageEnabled;
private boolean mIsUsingChromeNTP;
private boolean mIsUsingDefaultHomepage;
private String mCustomizedHomepage;
......@@ -44,6 +45,8 @@ public class HomepageTestRule implements TestRule {
private void copyInitialValueBeforeTest() {
mIsHomepageEnabled = mManager.readBoolean(ChromePreferenceKeys.HOMEPAGE_ENABLED, true);
mIsUsingChromeNTP =
mManager.readBoolean(ChromePreferenceKeys.HOMEPAGE_USE_CHROME_NTP, false);
mIsUsingDefaultHomepage =
mManager.readBoolean(ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, true);
mCustomizedHomepage = mManager.readString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI, "");
......@@ -53,6 +56,7 @@ public class HomepageTestRule implements TestRule {
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_ENABLED, mIsHomepageEnabled);
mManager.writeBoolean(
ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, mIsUsingDefaultHomepage);
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_USE_CHROME_NTP, mIsUsingChromeNTP);
mManager.writeString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI, mCustomizedHomepage);
}
......@@ -72,10 +76,26 @@ public class HomepageTestRule implements TestRule {
*
* HOMEPAGE_ENABLED -> true;
* HOMEPAGE_USE_DEFAULT_URI -> true;
* HOMEPAGE_USE_CHROME_NTP -> false;
*/
public void useDefaultHomepageForTest() {
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_ENABLED, true);
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, true);
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_USE_CHROME_NTP, false);
}
/**
* Set up shared preferences to use Chrome NTP as homepage. This is to select chrome NTP in the
* home settings page, rather than setting the address of Chrome NTP as customized homepage.
*
* HOMEPAGE_ENABLED -> true;
* HOMEPAGE_USE_DEFAULT_URI -> false;
* HOMEPAGE_USE_CHROME_NTP -> true;
*/
public void useChromeNTPForTest() {
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_ENABLED, true);
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, false);
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_USE_CHROME_NTP, true);
}
/**
......@@ -83,6 +103,7 @@ public class HomepageTestRule implements TestRule {
*
* HOMEPAGE_ENABLED -> true;
* HOMEPAGE_USE_DEFAULT_URI -> false;
* HOMEPAGE_USE_CHROME_NTP -> false;
* HOMEPAGE_CUSTOM_URI -> <b>homepage</b>
*
* @param homepage The customized homepage that will be used in this testcase.
......@@ -90,6 +111,7 @@ public class HomepageTestRule implements TestRule {
public void useCustomizedHomepageForTest(String homepage) {
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_ENABLED, true);
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, false);
mManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_USE_CHROME_NTP, false);
mManager.writeString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI, homepage);
}
}
......@@ -23,6 +23,7 @@ import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.test.util.DisabledTest;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.RetryOnFailure;
import org.chromium.chrome.browser.homepage.HomepageTestRule;
import org.chromium.chrome.browser.util.UrlConstants;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.partnercustomizations.TestPartnerBrowserCustomizationsDelayedProvider;
......@@ -42,6 +43,9 @@ public class PartnerHomepageUnitTest {
public BasePartnerBrowserCustomizationUnitTestRule mTestRule =
new BasePartnerBrowserCustomizationUnitTestRule();
@Rule
public HomepageTestRule mHomepageTestRule = new HomepageTestRule();
public static final String TAG = "PartnerHomepageUnitTest";
private static final String TEST_CUSTOM_HOMEPAGE_URI = "http://chrome.com";
......@@ -82,8 +86,7 @@ public class PartnerHomepageUnitTest {
@DisabledTest(message = "crbug.com/836700")
public void testProviderNotFromSystemPackage() throws InterruptedException {
mHomepageManager.setPrefHomepageEnabled(true);
mHomepageManager.setPrefHomepageUseDefaultUri(true);
mHomepageManager.setPrefHomepageCustomUri(TEST_CUSTOM_HOMEPAGE_URI);
mHomepageManager.setHomepagePreferences(false, true, TEST_CUSTOM_HOMEPAGE_URI);
// Note that unlike other tests in this file, we test if Chrome ignores a customizations
// provider that is not from a system package.
......@@ -115,8 +118,7 @@ public class PartnerHomepageUnitTest {
@DisabledTest(message = "crbug.com/836110")
public void testNoProvider() throws InterruptedException {
mHomepageManager.setPrefHomepageEnabled(true);
mHomepageManager.setPrefHomepageUseDefaultUri(true);
mHomepageManager.setPrefHomepageCustomUri(TEST_CUSTOM_HOMEPAGE_URI);
mHomepageManager.setHomepagePreferences(false, true, TEST_CUSTOM_HOMEPAGE_URI);
PartnerBrowserCustomizations.setProviderAuthorityForTests(
PARTNER_BROWSER_CUSTOMIZATIONS_NO_PROVIDER);
......@@ -144,8 +146,7 @@ public class PartnerHomepageUnitTest {
@RetryOnFailure
public void testHomepageDisabled() throws InterruptedException {
mHomepageManager.setPrefHomepageEnabled(false);
mHomepageManager.setPrefHomepageUseDefaultUri(true);
mHomepageManager.setPrefHomepageCustomUri(TEST_CUSTOM_HOMEPAGE_URI);
mHomepageManager.setHomepagePreferences(false, true, TEST_CUSTOM_HOMEPAGE_URI);
PartnerBrowserCustomizations.setProviderAuthorityForTests(
PARTNER_BROWSER_CUSTOMIZATIONS_PROVIDER);
......@@ -176,8 +177,7 @@ public class PartnerHomepageUnitTest {
@RetryOnFailure
public void testCustomHomepage() throws InterruptedException {
mHomepageManager.setPrefHomepageEnabled(true);
mHomepageManager.setPrefHomepageUseDefaultUri(false);
mHomepageManager.setPrefHomepageCustomUri(TEST_CUSTOM_HOMEPAGE_URI);
mHomepageManager.setHomepagePreferences(false, false, TEST_CUSTOM_HOMEPAGE_URI);
PartnerBrowserCustomizations.setProviderAuthorityForTests(
PARTNER_BROWSER_CUSTOMIZATIONS_PROVIDER);
......@@ -208,8 +208,7 @@ public class PartnerHomepageUnitTest {
@Feature({"Homepage"})
public void testHomepageProviderTimeout() throws InterruptedException {
mHomepageManager.setPrefHomepageEnabled(true);
mHomepageManager.setPrefHomepageUseDefaultUri(true);
mHomepageManager.setPrefHomepageCustomUri(TEST_CUSTOM_HOMEPAGE_URI);
mHomepageManager.setHomepagePreferences(false, true, TEST_CUSTOM_HOMEPAGE_URI);
PartnerBrowserCustomizations.setProviderAuthorityForTests(
PARTNER_BROWSER_CUSTOMIZATIONS_DELAYED_PROVIDER);
......@@ -248,8 +247,7 @@ public class PartnerHomepageUnitTest {
@DisabledTest(message = "crbug.com/837130")
public void testHomepageProviderDelayed() throws InterruptedException {
mHomepageManager.setPrefHomepageEnabled(true);
mHomepageManager.setPrefHomepageUseDefaultUri(true);
mHomepageManager.setPrefHomepageCustomUri(TEST_CUSTOM_HOMEPAGE_URI);
mHomepageManager.setHomepagePreferences(false, true, TEST_CUSTOM_HOMEPAGE_URI);
PartnerBrowserCustomizations.setProviderAuthorityForTests(
PARTNER_BROWSER_CUSTOMIZATIONS_DELAYED_PROVIDER);
......@@ -291,8 +289,7 @@ public class PartnerHomepageUnitTest {
@RetryOnFailure
public void testReadHomepageProvider() throws InterruptedException {
mHomepageManager.setPrefHomepageEnabled(true);
mHomepageManager.setPrefHomepageUseDefaultUri(true);
mHomepageManager.setPrefHomepageCustomUri(TEST_CUSTOM_HOMEPAGE_URI);
mHomepageManager.setHomepagePreferences(false, true, TEST_CUSTOM_HOMEPAGE_URI);
PartnerBrowserCustomizations.setProviderAuthorityForTests(
PARTNER_BROWSER_CUSTOMIZATIONS_PROVIDER);
......
......@@ -401,6 +401,7 @@ public final class ChromePreferenceKeys {
/** Keys used to save settings related to homepage. */
public static final String HOMEPAGE_CUSTOM_URI = "homepage_custom_uri";
public static final String HOMEPAGE_ENABLED = "homepage";
public static final String HOMEPAGE_USE_CHROME_NTP = "Chrome.Homepage.UseNTP";
public static final String HOMEPAGE_USE_DEFAULT_URI = "homepage_partner_enabled";
/**
......@@ -682,7 +683,8 @@ public final class ChromePreferenceKeys {
FLAGS_CACHED_DUET_TABSTRIP_INTEGRATION_ANDROID_ENABLED,
FLAGS_CACHED_PAINT_PREVIEW_TEST_ENABLED_KEY,
FLAGS_FIELD_TRIAL_PARAM_CACHED.pattern(),
HOMEPAGE_LOCATION_POLICY
HOMEPAGE_LOCATION_POLICY,
HOMEPAGE_USE_CHROME_NTP
);
// clang-format on
}
......
......@@ -600,6 +600,9 @@ CHAR-LIMIT guidelines:
</message>
<!-- Homepage preferences -->
<message name="IDS_OPTIONS_HOMEPAGE_EDIT_HINT" desc="Hint for the text edit on Homepage Preference setting, guiding user to enter their customized homepage setting">
Enter custom web address
</message>
<message name="IDS_OPTIONS_HOMEPAGE_EDIT_TITLE" desc="The title of the screen that allows users to change the URL that opens when they tap on the home page button in the omnibox.">
Edit home page
</message>
......@@ -609,6 +612,9 @@ CHAR-LIMIT guidelines:
<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>
<message name="IDS_OPTIONS_HOMEPAGE_CHROME_HOMEPAGE" desc="The option that allows user to set Chrome's new tab page as the homepage." >
Chrome’s homepage
</message>
<!-- Notifications preferences -->
<message name="IDS_PREFS_NOTIFICATIONS" desc="Title for Notification preferences.">
......
29f7414c2b689b7204157ae967c88b96d995fc1c
\ No newline at end of file
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