Commit 50a8ac9d authored by Natalie Chouinard's avatar Natalie Chouinard Committed by Commit Bot

Migrate Payment apps Settings to SL

Migrate the Payment apps Settings page from the deprecated Framework
preferences to the preferences Support Library.

This change also centralizes the logic to override dividers on
programmatically created preferences in ChromeBasePreferenceCompat.
Screenshots verifying no change in UI for the affected preference pages
are included in https://crbug.com/983305.

Bug: 968592, 983305
Change-Id: I20c17e53f3620ff9c423c8b9c80df10db924ae69
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1695926
Commit-Queue: Natalie Chouinard <chouinard@chromium.org>
Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#676982}
parent 208e8eb1
...@@ -283,11 +283,6 @@ ...@@ -283,11 +283,6 @@
<item name="android:paddingEnd">@dimen/pref_list_padding_kitkat</item> <item name="android:paddingEnd">@dimen/pref_list_padding_kitkat</item>
</style> </style>
<style name="Theme.Chromium.PreferenceItemNoDividers">
<item name="allowDividerAbove">false</item>
<item name="allowDividerBelow">false</item>
</style>
<style name="Theme.Chromium.DialogPreference"> <style name="Theme.Chromium.DialogPreference">
<item name="android:layout">@layout/preference_compat</item> <item name="android:layout">@layout/preference_compat</item>
<item name="android:negativeButtonText">@android:string/cancel</item> <item name="android:negativeButtonText">@android:string/cancel</item>
......
...@@ -4,16 +4,18 @@ ...@@ -4,16 +4,18 @@
found in the LICENSE file. --> found in the LICENSE file. -->
<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orderingFromXml="true"> android:orderingFromXml="true">
<android.support.v7.preference.Preference <android.support.v7.preference.Preference
android:fragment="org.chromium.chrome.browser.preferences.developer.TracingPreferences" android:fragment="org.chromium.chrome.browser.preferences.developer.TracingPreferences"
android:key="tracing" android:key="tracing"
android:title="Tracing" /> android:title="Tracing" />
<org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
style="@style/Theme.Chromium.PreferenceItemNoDividers"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:enabled="false" android:enabled="false"
android:key="beta_stable_hint" android:key="beta_stable_hint"
android:title="Hint: You can also enable Developer options on Beta/Stable channels by tapping the Chrome version in &quot;Settings > About Chrome&quot; multiple times." /> android:title="Hint: You can also enable Developer options on Beta/Stable channels by tapping the Chrome version in &quot;Settings > About Chrome&quot; multiple times."
app:allowDividerAbove="false"
app:allowDividerBelow="false" />
</android.support.v7.preference.PreferenceScreen> </android.support.v7.preference.PreferenceScreen>
...@@ -3,7 +3,9 @@ ...@@ -3,7 +3,9 @@
Use of this source code is governed by a BSD-style license that can be Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. --> found in the LICENSE file. -->
<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:orderingFromXml="true"> <android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orderingFromXml="true">
<android.support.v7.preference.Preference <android.support.v7.preference.Preference
android:fragment="org.chromium.chrome.browser.preferences.developer.TracingCategoriesPreferences" android:fragment="org.chromium.chrome.browser.preferences.developer.TracingCategoriesPreferences"
android:key="default_categories" android:key="default_categories"
...@@ -19,8 +21,9 @@ ...@@ -19,8 +21,9 @@
<org.chromium.chrome.browser.preferences.ButtonPreferenceCompat <org.chromium.chrome.browser.preferences.ButtonPreferenceCompat
android:key="start_recording"/> android:key="start_recording"/>
<org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
style="@style/Theme.Chromium.PreferenceItemNoDividers"
android:key="tracing_status" android:key="tracing_status"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"
app:allowDividerAbove="false"
app:allowDividerBelow="false" />
</android.support.v7.preference.PreferenceScreen> </android.support.v7.preference.PreferenceScreen>
...@@ -9,10 +9,10 @@ import android.content.res.ColorStateList; ...@@ -9,10 +9,10 @@ import android.content.res.ColorStateList;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.support.annotation.Nullable;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder; import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.widget.TextView;
import org.chromium.chrome.R; import org.chromium.chrome.R;
...@@ -36,6 +36,14 @@ public class ChromeBasePreferenceCompat extends Preference { ...@@ -36,6 +36,14 @@ public class ChromeBasePreferenceCompat extends Preference {
private ColorStateList mIconTint; private ColorStateList mIconTint;
private ManagedPreferenceDelegateCompat mManagedPrefDelegate; private ManagedPreferenceDelegateCompat mManagedPrefDelegate;
/**
* When null, the default Preferences Support Library logic will be used to determine dividers.
*/
@Nullable
private Boolean mDividerAllowedAbove;
@Nullable
private Boolean mDividerAllowedBelow;
/** /**
* Constructor for use in Java. * Constructor for use in Java.
*/ */
...@@ -48,7 +56,9 @@ public class ChromeBasePreferenceCompat extends Preference { ...@@ -48,7 +56,9 @@ public class ChromeBasePreferenceCompat extends Preference {
*/ */
public ChromeBasePreferenceCompat(Context context, AttributeSet attrs) { public ChromeBasePreferenceCompat(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
setLayoutResource(R.layout.preference_compat); setLayoutResource(R.layout.preference_compat);
setSingleLineTitle(false);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ChromeBasePreference); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ChromeBasePreference);
mIconTint = a.getColorStateList(R.styleable.ChromeBasePreference_iconTint); mIconTint = a.getColorStateList(R.styleable.ChromeBasePreference_iconTint);
...@@ -66,12 +76,26 @@ public class ChromeBasePreferenceCompat extends Preference { ...@@ -66,12 +76,26 @@ public class ChromeBasePreferenceCompat extends Preference {
@Override @Override
public void onBindViewHolder(PreferenceViewHolder holder) { public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder); super.onBindViewHolder(holder);
((TextView) holder.findViewById(android.R.id.title)).setSingleLine(false);
Drawable icon = getIcon(); Drawable icon = getIcon();
if (icon != null && mIconTint != null) { if (icon != null && mIconTint != null) {
icon.setColorFilter(mIconTint.getDefaultColor(), PorterDuff.Mode.SRC_IN); icon.setColorFilter(mIconTint.getDefaultColor(), PorterDuff.Mode.SRC_IN);
} }
ManagedPreferencesUtils.onBindViewToPreference(mManagedPrefDelegate, this, holder.itemView); ManagedPreferencesUtils.onBindViewToPreference(mManagedPrefDelegate, this, holder.itemView);
if (mDividerAllowedAbove != null) {
holder.setDividerAllowedAbove(mDividerAllowedAbove);
}
if (mDividerAllowedBelow != null) {
holder.setDividerAllowedBelow(mDividerAllowedBelow);
}
}
public void setDividerAllowedAbove(boolean allowed) {
mDividerAllowedAbove = allowed;
}
public void setDividerAllowedBelow(boolean allowed) {
mDividerAllowedBelow = allowed;
} }
@Override @Override
......
...@@ -5,57 +5,30 @@ ...@@ -5,57 +5,30 @@
package org.chromium.chrome.browser.preferences.autofill; package org.chromium.chrome.browser.preferences.autofill;
import android.content.Context; import android.content.Context;
import android.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.ui.HorizontalListDividerDrawable;
/** Preference with fixed icon size for Android payment apps. */ /** Preference with fixed icon size for Android payment apps. */
public class AndroidPaymentAppPreference extends Preference { public class AndroidPaymentAppPreference extends Preference {
private boolean mDrawDivider;
public AndroidPaymentAppPreference(Context context) { public AndroidPaymentAppPreference(Context context) {
super(context, null); super(context, null);
} }
@Override @Override
protected View onCreateView(ViewGroup parent) { public void onBindViewHolder(PreferenceViewHolder holder) {
View view = super.onCreateView(parent); super.onBindViewHolder(holder);
// TODO(crbug.com/971791): Simplify this or replace it with a custom preference layout.
int iconSize = int iconSize =
getContext().getResources().getDimensionPixelSize(R.dimen.payments_favicon_size); getContext().getResources().getDimensionPixelSize(R.dimen.payments_favicon_size);
View iconView = view.findViewById(android.R.id.icon); View iconView = holder.findViewById(android.R.id.icon);
ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams(); ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams();
layoutParams.width = iconSize; layoutParams.width = iconSize;
layoutParams.height = iconSize; layoutParams.height = iconSize;
iconView.setLayoutParams(layoutParams); iconView.setLayoutParams(layoutParams);
return view;
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
if (mDrawDivider) {
int left = view.getPaddingLeft();
int right = view.getPaddingRight();
int top = view.getPaddingTop();
int bottom = view.getPaddingBottom();
view.setBackground(HorizontalListDividerDrawable.create(getContext()));
view.setPadding(left, top, right, bottom);
}
}
/**
* Sets whether a horizontal divider line should be drawn at the bottom of this preference.
*/
public void setDrawDivider(boolean drawDivider) {
if (mDrawDivider != drawDivider) {
mDrawDivider = drawDivider;
notifyChanged();
}
} }
} }
\ No newline at end of file
...@@ -4,32 +4,35 @@ ...@@ -4,32 +4,35 @@
package org.chromium.chrome.browser.preferences.autofill; package org.chromium.chrome.browser.preferences.autofill;
import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceFragment; import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.preference.PreferenceScreen;
import android.util.Pair; import android.util.Pair;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.payments.AndroidPaymentAppFactory; import org.chromium.chrome.browser.payments.AndroidPaymentAppFactory;
import org.chromium.chrome.browser.payments.ServiceWorkerPaymentAppBridge; import org.chromium.chrome.browser.payments.ServiceWorkerPaymentAppBridge;
import org.chromium.chrome.browser.preferences.PreferenceUtils; import org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat;
import org.chromium.chrome.browser.preferences.TextMessagePreference;
import java.util.Map; import java.util.Map;
/** /**
* Preference fragment to allow users to control use of the Android payment apps on device. * Preference fragment to allow users to control use of the Android payment apps on device.
*/ */
public class AndroidPaymentAppsFragment extends PreferenceFragment { public class AndroidPaymentAppsFragment extends PreferenceFragmentCompat {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
super.onCreate(savedInstanceState);
PreferenceUtils.addPreferencesFromResource(this, R.xml.blank_preference_fragment_screen);
getActivity().setTitle(R.string.payment_apps_title); getActivity().setTitle(R.string.payment_apps_title);
// Create blank preference screen.
PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getStyledContext());
setPreferenceScreen(screen);
} }
@Override @Override
...@@ -57,15 +60,14 @@ public class AndroidPaymentAppsFragment extends PreferenceFragment { ...@@ -57,15 +60,14 @@ public class AndroidPaymentAppsFragment extends PreferenceFragment {
Map<String, Pair<String, Bitmap>> serviceWorkerAppsInfo) { Map<String, Pair<String, Bitmap>> serviceWorkerAppsInfo) {
if (androidAppsInfo.isEmpty() && serviceWorkerAppsInfo.isEmpty()) return; if (androidAppsInfo.isEmpty() && serviceWorkerAppsInfo.isEmpty()) return;
AndroidPaymentAppPreference pref = null;
for (Map.Entry<String, Pair<String, Drawable>> app : androidAppsInfo.entrySet()) { for (Map.Entry<String, Pair<String, Drawable>> app : androidAppsInfo.entrySet()) {
pref = new AndroidPaymentAppPreference(getActivity()); AndroidPaymentAppPreference pref = new AndroidPaymentAppPreference(getStyledContext());
pref.setTitle(app.getValue().first); pref.setTitle(app.getValue().first);
pref.setIcon(app.getValue().second); pref.setIcon(app.getValue().second);
getPreferenceScreen().addPreference(pref); getPreferenceScreen().addPreference(pref);
} }
for (Map.Entry<String, Pair<String, Bitmap>> app : serviceWorkerAppsInfo.entrySet()) { for (Map.Entry<String, Pair<String, Bitmap>> app : serviceWorkerAppsInfo.entrySet()) {
pref = new AndroidPaymentAppPreference(getActivity()); AndroidPaymentAppPreference pref = new AndroidPaymentAppPreference(getStyledContext());
pref.setTitle(app.getValue().first); pref.setTitle(app.getValue().first);
pref.setSummary(app.getKey()); pref.setSummary(app.getKey());
pref.setIcon(app.getValue().second == null pref.setIcon(app.getValue().second == null
...@@ -73,12 +75,15 @@ public class AndroidPaymentAppsFragment extends PreferenceFragment { ...@@ -73,12 +75,15 @@ public class AndroidPaymentAppsFragment extends PreferenceFragment {
: new BitmapDrawable(getResources(), app.getValue().second)); : new BitmapDrawable(getResources(), app.getValue().second));
getPreferenceScreen().addPreference(pref); getPreferenceScreen().addPreference(pref);
} }
// Add a divider line at the bottom of the last preference to separate it from below
// TextMessagePreference.
if (pref != null) pref.setDrawDivider(true);
TextMessagePreference textPreference = new TextMessagePreference(getActivity(), null); TextMessagePreferenceCompat textPreference =
textPreference.setTitle(getActivity().getString(R.string.payment_apps_usage_message)); new TextMessagePreferenceCompat(getStyledContext(), null);
textPreference.setTitle(R.string.payment_apps_usage_message);
textPreference.setDividerAllowedBelow(false);
getPreferenceScreen().addPreference(textPreference); getPreferenceScreen().addPreference(textPreference);
} }
private Context getStyledContext() {
return getPreferenceManager().getContext();
}
} }
...@@ -65,8 +65,7 @@ public class AutofillPaymentMethodsFragment extends PreferenceFragmentCompat ...@@ -65,8 +65,7 @@ public class AutofillPaymentMethodsFragment extends PreferenceFragmentCompat
ChromeSwitchPreferenceCompat autofillSwitch = ChromeSwitchPreferenceCompat autofillSwitch =
new ChromeSwitchPreferenceCompat(getStyledContext(), null); new ChromeSwitchPreferenceCompat(getStyledContext(), null);
autofillSwitch.setTitle(R.string.autofill_enable_credit_cards_toggle_label); autofillSwitch.setTitle(R.string.autofill_enable_credit_cards_toggle_label);
autofillSwitch.setSummary( autofillSwitch.setSummary(R.string.autofill_enable_credit_cards_toggle_sublabel);
getActivity().getString(R.string.autofill_enable_credit_cards_toggle_sublabel));
autofillSwitch.setChecked(PersonalDataManager.isAutofillCreditCardEnabled()); autofillSwitch.setChecked(PersonalDataManager.isAutofillCreditCardEnabled());
autofillSwitch.setOnPreferenceChangeListener((preference, newValue) -> { autofillSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
PersonalDataManager.setAutofillCreditCardEnabled((boolean) newValue); PersonalDataManager.setAutofillCreditCardEnabled((boolean) newValue);
...@@ -124,8 +123,8 @@ public class AutofillPaymentMethodsFragment extends PreferenceFragmentCompat ...@@ -124,8 +123,8 @@ public class AutofillPaymentMethodsFragment extends PreferenceFragmentCompat
// Add the link to payment apps only after the credit card list is rebuilt. // Add the link to payment apps only after the credit card list is rebuilt.
if (ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_PAYMENT_APPS) if (ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_PAYMENT_APPS)
|| ChromeFeatureList.isEnabled(ChromeFeatureList.SERVICE_WORKER_PAYMENT_APPS)) { || ChromeFeatureList.isEnabled(ChromeFeatureList.SERVICE_WORKER_PAYMENT_APPS)) {
Preference payment_apps_pref = new Preference(getActivity()); Preference payment_apps_pref = new Preference(getStyledContext());
payment_apps_pref.setTitle(getActivity().getString(R.string.payment_apps_title)); payment_apps_pref.setTitle(R.string.payment_apps_title);
payment_apps_pref.setFragment(AndroidPaymentAppsFragment.class.getCanonicalName()); payment_apps_pref.setFragment(AndroidPaymentAppsFragment.class.getCanonicalName());
payment_apps_pref.setShouldDisableView(true); payment_apps_pref.setShouldDisableView(true);
payment_apps_pref.setKey(PREF_PAYMENT_APPS); payment_apps_pref.setKey(PREF_PAYMENT_APPS);
...@@ -161,7 +160,7 @@ public class AutofillPaymentMethodsFragment extends PreferenceFragmentCompat ...@@ -161,7 +160,7 @@ public class AutofillPaymentMethodsFragment extends PreferenceFragmentCompat
pref.setSummary(null); pref.setSummary(null);
pref.setEnabled(true); pref.setEnabled(true);
} else { } else {
pref.setSummary(getActivity().getString(R.string.payment_no_apps_summary)); pref.setSummary(R.string.payment_no_apps_summary);
pref.setEnabled(false); pref.setEnabled(false);
} }
} }
......
...@@ -18,7 +18,6 @@ import android.support.v7.preference.PreferenceScreen; ...@@ -18,7 +18,6 @@ import android.support.v7.preference.PreferenceScreen;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.style.ForegroundColorSpan; import android.text.style.ForegroundColorSpan;
import android.view.ContextThemeWrapper;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
...@@ -184,13 +183,12 @@ public class SavePasswordsPreferences ...@@ -184,13 +183,12 @@ public class SavePasswordsPreferences
* Empty screen message when no passwords or exceptions are stored. * Empty screen message when no passwords or exceptions are stored.
*/ */
private void displayEmptyScreenMessage() { private void displayEmptyScreenMessage() {
mEmptyView = new TextMessagePreferenceCompat( mEmptyView = new TextMessagePreferenceCompat(getStyledContext(), null);
new ContextThemeWrapper(
getStyledContext(), R.style.Theme_Chromium_PreferenceItemNoDividers),
null);
mEmptyView.setSummary(R.string.saved_passwords_none_text); mEmptyView.setSummary(R.string.saved_passwords_none_text);
mEmptyView.setKey(PREF_KEY_SAVED_PASSWORDS_NO_TEXT); mEmptyView.setKey(PREF_KEY_SAVED_PASSWORDS_NO_TEXT);
mEmptyView.setOrder(ORDER_SAVED_PASSWORDS_NO_TEXT); mEmptyView.setOrder(ORDER_SAVED_PASSWORDS_NO_TEXT);
mEmptyView.setDividerAllowedAbove(false);
mEmptyView.setDividerAllowedBelow(false);
getPreferenceScreen().addPreference(mEmptyView); getPreferenceScreen().addPreference(mEmptyView);
} }
......
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