[AF] Move "Payment apps" into "Payment methods" on Android Settings

A follow-up CL will delete the "Autofill and payments" page and move
"Addresses and more" and "Payment methods" into the main Settings page.
Moving "Payment apps" into the "Payment methods" as a separate step
to make CLs easier to review.

Screenshots (Googlers only): https://drive.google.com/open?id=1QMBcQKZ_O2aaxLs5OFf3zfyY7JSgcxgX

Bug: 860526
Change-Id: I57a107a15a7f8aab94a1125e79e6616957eaa49a
Reviewed-on: https://chromium-review.googlesource.com/1199684
Reviewed-by: Mathieu Perreault <mathp@chromium.org>
Reviewed-by: Theresa <twellington@chromium.org>
Commit-Queue: Fabio Tirelo <ftirelo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#589156}
diff --git a/chrome/android/java/res/xml/autofill_and_payments_preferences.xml b/chrome/android/java/res/xml/autofill_and_payments_preferences.xml
index 07091ff..6a3b326 100644
--- a/chrome/android/java/res/xml/autofill_and_payments_preferences.xml
+++ b/chrome/android/java/res/xml/autofill_and_payments_preferences.xml
@@ -12,7 +12,7 @@
 
     <org.chromium.chrome.browser.preferences.ChromeBasePreference
        android:title="@string/autofill_payment_methods"
-       android:fragment="org.chromium.chrome.browser.preferences.autofill.AutofillCreditCardsFragment"
+       android:fragment="org.chromium.chrome.browser.preferences.autofill.AutofillPaymentMethodsFragment"
        android:key="autofill_payment_methods" />
 
 </PreferenceScreen>
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
index d0c04ad..f2399d5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
@@ -10,7 +10,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.chrome.browser.preferences.autofill.AutofillCreditCardsFragment;
+import org.chromium.chrome.browser.preferences.autofill.AutofillPaymentMethodsFragment;
 import org.chromium.chrome.browser.preferences.autofill.AutofillProfilesFragment;
 import org.chromium.chrome.browser.preferences.password.SavePasswordsPreferences;
 import org.chromium.chrome.browser.preferences.privacy.ClearBrowsingDataTabsFragment;
@@ -72,7 +72,7 @@
 
     @CalledByNative
     private static void showAutofillCreditCardSettings(WebContents webContents) {
-        showSettingSubpage(webContents, AutofillCreditCardsFragment.class.getName());
+        showSettingSubpage(webContents, AutofillPaymentMethodsFragment.class.getName());
     }
 
     @CalledByNative
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillAndPaymentsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillAndPaymentsPreferences.java
index af0176da..f92aa26 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillAndPaymentsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillAndPaymentsPreferences.java
@@ -9,17 +9,14 @@
 import android.preference.PreferenceFragment;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
-import org.chromium.chrome.browser.payments.AndroidPaymentAppFactory;
-import org.chromium.chrome.browser.payments.ServiceWorkerPaymentAppBridge;
 import org.chromium.chrome.browser.preferences.ChromeBasePreference;
 import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 
 /**
  * Autofill and payments settings fragment, which allows the user to edit autofill and credit card
- * profiles and control payment apps.
+ * profiles.
  */
 public class AutofillAndPaymentsPreferences extends PreferenceFragment {
     public static final String AUTOFILL_GUID = "guid";
@@ -29,7 +26,6 @@
     public static final String SETTINGS_ORIGIN = "Chrome settings";
     private static final String AUTOFILL_ADDRESSES = "autofill_addresses";
     private static final String AUTOFILL_PAYMENT_METHODS = "autofill_payment_methods";
-    private static final String PREF_PAYMENT_APPS = "payment_apps";
 
     private final ManagedPreferenceDelegate mManagedPreferenceDelegate;
 
@@ -43,16 +39,6 @@
         PreferenceUtils.addPreferencesFromResource(this, R.xml.autofill_and_payments_preferences);
         getActivity().setTitle(R.string.prefs_autofill_and_payments);
 
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_PAYMENT_APPS)
-                || ChromeFeatureList.isEnabled(ChromeFeatureList.SERVICE_WORKER_PAYMENT_APPS)) {
-            Preference pref = new Preference(getActivity());
-            pref.setTitle(getActivity().getString(R.string.payment_apps_title));
-            pref.setFragment(AndroidPaymentAppsFragment.class.getCanonicalName());
-            pref.setShouldDisableView(true);
-            pref.setKey(PREF_PAYMENT_APPS);
-            getPreferenceScreen().addPreference(pref);
-        }
-
         ((ChromeBasePreference) findPreference(AUTOFILL_ADDRESSES))
                 .setManagedPreferenceDelegate(mManagedPreferenceDelegate);
         ((ChromeBasePreference) findPreference(AUTOFILL_PAYMENT_METHODS))
@@ -62,38 +48,6 @@
     @Override
     public void onResume() {
         super.onResume();
-        Preference pref = findPreference(PREF_PAYMENT_APPS);
-        if (pref != null) {
-            refreshPaymentAppsPrefForAndroidPaymentApps(pref);
-        }
-    }
-
-    private void refreshPaymentAppsPrefForAndroidPaymentApps(Preference pref) {
-        if (AndroidPaymentAppFactory.hasAndroidPaymentApps()) {
-            setPaymentAppsPrefStatus(pref, true);
-        } else {
-            refreshPaymentAppsPrefForServiceWorkerPaymentApps(pref);
-        }
-    }
-
-    private void refreshPaymentAppsPrefForServiceWorkerPaymentApps(Preference pref) {
-        ServiceWorkerPaymentAppBridge.hasServiceWorkerPaymentApps(
-                new ServiceWorkerPaymentAppBridge.HasServiceWorkerPaymentAppsCallback() {
-                    @Override
-                    public void onHasServiceWorkerPaymentAppsResponse(boolean hasPaymentApps) {
-                        setPaymentAppsPrefStatus(pref, hasPaymentApps);
-                    }
-                });
-    }
-
-    private void setPaymentAppsPrefStatus(Preference pref, boolean enabled) {
-        if (enabled) {
-            pref.setSummary(null);
-            pref.setEnabled(true);
-        } else {
-            pref.setSummary(getActivity().getString(R.string.payment_no_apps_summary));
-            pref.setEnabled(false);
-        }
     }
 
     ManagedPreferenceDelegate getManagedPreferenceDelegateForTest() {
@@ -119,6 +73,8 @@
                     return PersonalDataManager.isAutofillProfileManaged()
                             && !PersonalDataManager.isAutofillProfileEnabled();
                 }
+                // TODO(crbug.com/860526): Change this to allow access to payment apps even if cards
+                //                         autofill is disabled by policy.
                 if (AUTOFILL_PAYMENT_METHODS.equals(preference.getKey())) {
                     return PersonalDataManager.isAutofillCreditCardManaged()
                             && !PersonalDataManager.isAutofillCreditCardEnabled();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillCreditCardsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillCreditCardsFragment.java
deleted file mode 100644
index 00b3f43..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillCreditCardsFragment.java
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2017 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.preferences.autofill;
-
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.PreferenceFragment;
-import android.support.v7.content.res.AppCompatResources;
-
-import org.chromium.base.ApiCompatibilityUtils;
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.autofill.PersonalDataManager;
-import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-
-/**
- * Autofill credit cards fragment, which allows the user to edit credit cards.
- */
-public class AutofillCreditCardsFragment
-        extends PreferenceFragment implements PersonalDataManager.PersonalDataManagerObserver {
-    private static final String PREF_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_LABEL =
-            "autofill_enable_credit_cards_toggle_label";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        PreferenceUtils.addPreferencesFromResource(
-                this, R.xml.autofill_and_payments_preference_fragment_screen);
-        getActivity().setTitle(R.string.autofill_payment_methods);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        // Always rebuild our list of credit cards.  Although we could detect if credit cards are
-        // added or deleted, the credit card summary (number) might be different.  To be safe, we
-        // update all.
-        rebuildCreditCardList();
-    }
-
-    private void rebuildCreditCardList() {
-        getPreferenceScreen().removeAll();
-        getPreferenceScreen().setOrderingAsAdded(true);
-
-        ChromeSwitchPreference autofillSwitch = new ChromeSwitchPreference(getActivity(), null);
-        autofillSwitch.setTitle(R.string.autofill_enable_credit_cards_toggle_label);
-        autofillSwitch.setSummary(
-                getActivity().getString(R.string.autofill_enable_credit_cards_toggle_sublabel));
-        autofillSwitch.setKey(PREF_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_LABEL); // For testing.
-        autofillSwitch.setChecked(PersonalDataManager.isAutofillCreditCardEnabled());
-        autofillSwitch.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-            @Override
-            public boolean onPreferenceChange(Preference preference, Object newValue) {
-                PersonalDataManager.setAutofillCreditCardEnabled((boolean) newValue);
-                return true;
-            }
-        });
-        getPreferenceScreen().addPreference(autofillSwitch);
-
-        for (CreditCard card : PersonalDataManager.getInstance().getCreditCardsForSettings()) {
-            // Add a preference for the credit card.
-            Preference pref = new Preference(getActivity());
-            pref.setTitle(card.getObfuscatedNumber());
-            pref.setSummary(card.getFormattedExpirationDate(getActivity()));
-            pref.setIcon(
-                    AppCompatResources.getDrawable(getActivity(), card.getIssuerIconDrawableId()));
-
-            if (card.getIsLocal()) {
-                pref.setFragment(AutofillLocalCardEditor.class.getName());
-            } else {
-                pref.setFragment(AutofillServerCardEditor.class.getName());
-                pref.setWidgetLayoutResource(R.layout.autofill_server_data_label);
-            }
-
-            Bundle args = pref.getExtras();
-            args.putString(AutofillAndPaymentsPreferences.AUTOFILL_GUID, card.getGUID());
-            getPreferenceScreen().addPreference(pref);
-        }
-
-        // Add 'Add credit card' button. Tap of it brings up card editor which allows users type in
-        // new credit cards.
-        Preference pref = new Preference(getActivity());
-        Drawable plusIcon = ApiCompatibilityUtils.getDrawable(getResources(), R.drawable.plus);
-        plusIcon.mutate();
-        plusIcon.setColorFilter(
-                ApiCompatibilityUtils.getColor(getResources(), R.color.pref_accent_color),
-                PorterDuff.Mode.SRC_IN);
-        pref.setIcon(plusIcon);
-        pref.setTitle(R.string.autofill_create_credit_card);
-        pref.setFragment(AutofillLocalCardEditor.class.getName());
-        pref.setEnabled(PersonalDataManager.isAutofillCreditCardEnabled());
-        getPreferenceScreen().addPreference(pref);
-    }
-
-    @Override
-    public void onPersonalDataChanged() {
-        rebuildCreditCardList();
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        PersonalDataManager.getInstance().registerDataObserver(this);
-    }
-
-    @Override
-    public void onDestroyView() {
-        PersonalDataManager.getInstance().unregisterDataObserver(this);
-        super.onDestroyView();
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java
new file mode 100644
index 0000000..e148288
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java
@@ -0,0 +1,163 @@
+// Copyright 2017 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.preferences.autofill;
+
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceFragment;
+import android.support.v7.content.res.AppCompatResources;
+
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.autofill.PersonalDataManager;
+import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.payments.AndroidPaymentAppFactory;
+import org.chromium.chrome.browser.payments.ServiceWorkerPaymentAppBridge;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
+import org.chromium.chrome.browser.preferences.PreferenceUtils;
+
+/**
+ * Autofill credit cards fragment, which allows the user to edit credit cards and control
+ * payment apps.
+ */
+public class AutofillPaymentMethodsFragment
+        extends PreferenceFragment implements PersonalDataManager.PersonalDataManagerObserver {
+    private static final String PREF_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_LABEL =
+            "autofill_enable_credit_cards_toggle_label";
+
+    private static final String PREF_PAYMENT_APPS = "payment_apps";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        PreferenceUtils.addPreferencesFromResource(
+                this, R.xml.autofill_and_payments_preference_fragment_screen);
+        getActivity().setTitle(R.string.autofill_payment_methods);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        // Always rebuild our list of credit cards.  Although we could detect if credit cards are
+        // added or deleted, the credit card summary (number) might be different.  To be safe, we
+        // update all.
+        rebuildPage();
+    }
+
+    private void rebuildPage() {
+        getPreferenceScreen().removeAll();
+        getPreferenceScreen().setOrderingAsAdded(true);
+
+        ChromeSwitchPreference autofillSwitch = new ChromeSwitchPreference(getActivity(), null);
+        autofillSwitch.setTitle(R.string.autofill_enable_credit_cards_toggle_label);
+        autofillSwitch.setSummary(
+                getActivity().getString(R.string.autofill_enable_credit_cards_toggle_sublabel));
+        autofillSwitch.setKey(PREF_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_LABEL); // For testing.
+        autofillSwitch.setChecked(PersonalDataManager.isAutofillCreditCardEnabled());
+        autofillSwitch.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                PersonalDataManager.setAutofillCreditCardEnabled((boolean) newValue);
+                return true;
+            }
+        });
+        getPreferenceScreen().addPreference(autofillSwitch);
+
+        for (CreditCard card : PersonalDataManager.getInstance().getCreditCardsForSettings()) {
+            // Add a preference for the credit card.
+            Preference card_pref = new Preference(getActivity());
+            card_pref.setTitle(card.getObfuscatedNumber());
+            card_pref.setSummary(card.getFormattedExpirationDate(getActivity()));
+            card_pref.setIcon(
+                    AppCompatResources.getDrawable(getActivity(), card.getIssuerIconDrawableId()));
+
+            if (card.getIsLocal()) {
+                card_pref.setFragment(AutofillLocalCardEditor.class.getName());
+            } else {
+                card_pref.setFragment(AutofillServerCardEditor.class.getName());
+                card_pref.setWidgetLayoutResource(R.layout.autofill_server_data_label);
+            }
+
+            Bundle args = card_pref.getExtras();
+            args.putString(AutofillAndPaymentsPreferences.AUTOFILL_GUID, card.getGUID());
+            getPreferenceScreen().addPreference(card_pref);
+        }
+
+        // Add 'Add credit card' button. Tap of it brings up card editor which allows users type in
+        // new credit cards.
+        Preference add_card_pref = new Preference(getActivity());
+        Drawable plusIcon = ApiCompatibilityUtils.getDrawable(getResources(), R.drawable.plus);
+        plusIcon.mutate();
+        plusIcon.setColorFilter(
+                ApiCompatibilityUtils.getColor(getResources(), R.color.pref_accent_color),
+                PorterDuff.Mode.SRC_IN);
+        add_card_pref.setIcon(plusIcon);
+        add_card_pref.setTitle(R.string.autofill_create_credit_card);
+        add_card_pref.setFragment(AutofillLocalCardEditor.class.getName());
+        add_card_pref.setEnabled(PersonalDataManager.isAutofillCreditCardEnabled());
+        getPreferenceScreen().addPreference(add_card_pref);
+
+        // Add the link to payment apps only after the credit card list is rebuilt.
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_PAYMENT_APPS)
+                || ChromeFeatureList.isEnabled(ChromeFeatureList.SERVICE_WORKER_PAYMENT_APPS)) {
+            Preference payment_apps_pref = new Preference(getActivity());
+            payment_apps_pref.setTitle(getActivity().getString(R.string.payment_apps_title));
+            payment_apps_pref.setFragment(AndroidPaymentAppsFragment.class.getCanonicalName());
+            payment_apps_pref.setShouldDisableView(true);
+            payment_apps_pref.setKey(PREF_PAYMENT_APPS);
+            getPreferenceScreen().addPreference(payment_apps_pref);
+            refreshPaymentAppsPrefForAndroidPaymentApps(payment_apps_pref);
+        }
+    }
+
+    private void refreshPaymentAppsPrefForAndroidPaymentApps(Preference pref) {
+        if (AndroidPaymentAppFactory.hasAndroidPaymentApps()) {
+            setPaymentAppsPrefStatus(pref, true);
+        } else {
+            refreshPaymentAppsPrefForServiceWorkerPaymentApps(pref);
+        }
+    }
+
+    private void refreshPaymentAppsPrefForServiceWorkerPaymentApps(Preference pref) {
+        ServiceWorkerPaymentAppBridge.hasServiceWorkerPaymentApps(
+                new ServiceWorkerPaymentAppBridge.HasServiceWorkerPaymentAppsCallback() {
+                    @Override
+                    public void onHasServiceWorkerPaymentAppsResponse(boolean hasPaymentApps) {
+                        setPaymentAppsPrefStatus(pref, hasPaymentApps);
+                    }
+                });
+    }
+
+    private void setPaymentAppsPrefStatus(Preference pref, boolean enabled) {
+        if (enabled) {
+            pref.setSummary(null);
+            pref.setEnabled(true);
+        } else {
+            pref.setSummary(getActivity().getString(R.string.payment_no_apps_summary));
+            pref.setEnabled(false);
+        }
+    }
+
+    @Override
+    public void onPersonalDataChanged() {
+        rebuildPage();
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        PersonalDataManager.getInstance().registerDataObserver(this);
+    }
+
+    @Override
+    public void onDestroyView() {
+        PersonalDataManager.getInstance().unregisterDataObserver(this);
+        super.onDestroyView();
+    }
+}
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 3c2e083..e24bb04 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -1172,7 +1172,7 @@
   "java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppPreference.java",
   "java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java",
   "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillAndPaymentsPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillCreditCardsFragment.java",
+  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java",
   "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillCreditCardEditor.java",
   "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillEditorBase.java",
   "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillLocalCardEditor.java",