OSDN Git Service

Show default app icon in default app screen.
authorFan Zhang <zhfan@google.com>
Tue, 11 Jul 2017 23:26:58 +0000 (16:26 -0700)
committerFan Zhang <zhfan@google.com>
Thu, 13 Jul 2017 20:49:28 +0000 (13:49 -0700)
- Renamed AdvancedAppSettings to DefaultAppSettings.
- Add logic to DefaultAppPreferenceController to also display icon.
- Modified DefautlAssistPrefController to suppress gear icon, and use
  the controller in default app setting UI to display icon.
- Remove dynamic injected payment setting activity and create the
  setting statically in xml.
- Add DefaultPaymentSettingsPreference to display default payment app
  title (no icon because we can't get it)

Change-Id: I6b8c768da0bafe5ec9a85ba9c79c7993b449be25
Fix: 36458534
Test: robotests

25 files changed:
AndroidManifest.xml
res/xml/app_default_settings.xml
src/com/android/settings/SettingsActivity.java
src/com/android/settings/applications/DefaultAppSettings.java [moved from src/com/android/settings/applications/AdvancedAppSettings.java with 91% similarity]
src/com/android/settings/applications/InstalledAppDetails.java
src/com/android/settings/applications/ManageApplications.java
src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
src/com/android/settings/applications/assist/ManageAssist.java
src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceController.java [new file with mode: 0644]
src/com/android/settings/core/gateway/SettingsGateway.java
src/com/android/settings/dashboard/DashboardFragmentRegistry.java
src/com/android/settings/nfc/PaymentBackend.java
src/com/android/settings/nfc/PaymentSettings.java
src/com/android/settings/search/SearchIndexableResources.java
src/com/android/settings/security/SecurityFeatureProviderImpl.java
src/com/android/settings/webview/WebViewAppPreferenceController.java
tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java [moved from tests/app/src/com/android/settings/applications/AdvancedAppSettingsTest.java with 97% similarity]
tests/robotests/src/com/android/settings/applications/DefaultAppSettingsTest.java [moved from tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java with 93% similarity]
tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceControllerTest.java
tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceControllerTest.java [new file with mode: 0644]

index 6bf3d40..48edd19 100644 (file)
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
-            <intent-filter android:priority="10">
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.ia.apps.default" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.nfc.PaymentSettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
             <meta-data android:name="com.android.settings.category"
                        android:value="com.android.settings.category.ia.apps"/>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.applications.AdvancedAppSettings" />
+                       android:value="com.android.settings.applications.DefaultAppSettings" />
             <meta-data android:name="com.android.settings.summary"
                        android:resource="@string/summary_empty"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
index 11acb24..196ed9f 100644 (file)
     <Preference
         android:key="assist_and_voice_input"
         android:title="@string/assist_and_voice_input_title"
-        android:fragment="com.android.settings.applications.assist.ManageAssist"
-        android:order="-20"/>
+        android:fragment="com.android.settings.applications.assist.ManageAssist" />
 
     <Preference
         android:key="default_browser"
         android:title="@string/default_browser_title"
-        android:fragment="com.android.settings.applications.defaultapps.DefaultBrowserPicker"
-        android:order="-19">
-        <extra android:name="for_work" android:value="false"/>
+        android:fragment="com.android.settings.applications.defaultapps.DefaultBrowserPicker">
+        <extra android:name="for_work" android:value="false" />
     </Preference>
 
     <Preference
         android:key="default_home"
         android:title="@string/home_app"
         android:fragment="com.android.settings.applications.defaultapps.DefaultHomePicker"
-        settings:keywords="@string/keywords_home"
-        android:order="-18"/>
+        settings:keywords="@string/keywords_home" />
 
     <Preference
         android:key="default_phone_app"
         android:title="@string/default_phone_title"
         android:fragment="com.android.settings.applications.defaultapps.DefaultPhonePicker"
-        settings:keywords="@string/keywords_default_phone_app"
-        android:order="-17"/>
+        settings:keywords="@string/keywords_default_phone_app" />
 
     <Preference
         android:key="default_sms_app"
         android:title="@string/sms_application_title"
         android:fragment="com.android.settings.applications.defaultapps.DefaultSmsPicker"
-        settings:keywords="@string/keywords_more_default_sms_app"
-        android:order="-16"/>
+        settings:keywords="@string/keywords_more_default_sms_app" />
+
+    <Preference
+        android:key="default_payment_app"
+        android:title="@string/nfc_payment_settings_title"
+        android:summary="@string/summary_placeholder"
+        android:fragment="com.android.settings.nfc.PaymentSettings" />
 
     <Preference
         android:key="default_emergency_app"
         android:title="@string/default_emergency_app"
-        settings:keywords="@string/keywords_emergency_app"
-        android:order="-15"/>
+        settings:keywords="@string/keywords_emergency_app" />
 
     <!--
     <Preference
         android:key="default_notification_asst_app"
         android:title="@string/default_notification_assistant"
         android:fragment="com.android.settings.applications.defaultapps.DefaultNotificationAssistantPicker"
-        android:order="-13"/>
+        />
      -->
 
     <Preference
         android:key="domain_urls"
         android:title="@string/domain_urls_title"
-        android:fragment="com.android.settings.applications.ManageDomainUrls"/>
+        android:fragment="com.android.settings.applications.ManageDomainUrls" />
 
     <com.android.settings.WorkOnlyCategory
         android:key="work_defaults"
@@ -82,7 +82,7 @@
             android:key="work_default_browser"
             android:title="@string/default_browser_title"
             android:fragment="com.android.settings.applications.defaultapps.DefaultBrowserPicker">
-            <extra android:name="for_work" android:value="true"/>
+            <extra android:name="for_work" android:value="true" />
         </Preference>
 
         <Preference
@@ -90,7 +90,7 @@
             android:title="@string/default_phone_title"
             android:fragment="com.android.settings.applications.defaultapps.DefaultPhonePicker"
             settings:keywords="@string/keywords_default_phone_app">
-            <extra android:name="for_work" android:value="true"/>
+            <extra android:name="for_work" android:value="true" />
         </Preference>
 
     </com.android.settings.WorkOnlyCategory>
index a7d9afc..225c5ea 100644 (file)
@@ -813,13 +813,6 @@ public class SettingsActivity extends SettingsDrawerActivity
                         Settings.DateTimeSettingsActivity.class.getName()),
                 !UserManager.isDeviceInDemoMode(this), isAdmin)
                 || somethingChanged;
-        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
-        somethingChanged = setTileEnabled(new ComponentName(packageName,
-                        Settings.PaymentSettingsActivity.class.getName()),
-                pm.hasSystemFeature(PackageManager.FEATURE_NFC)
-                        && pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
-                        && adapter != null && adapter.isEnabled(), isAdmin)
-                || somethingChanged;
 
         somethingChanged = setTileEnabled(new ComponentName(packageName,
                         Settings.PrintSettingsActivity.class.getName()),
@@ -22,6 +22,7 @@ import android.text.TextUtils;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.applications.assist.DefaultAssistPreferenceController;
 import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
 import com.android.settings.applications.defaultapps.DefaultEmergencyPreferenceController;
 import com.android.settings.applications.defaultapps.DefaultHomePreferenceController;
@@ -29,6 +30,7 @@ import com.android.settings.applications.defaultapps.DefaultPhonePreferenceContr
 import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
 import com.android.settings.applications.defaultapps.DefaultWorkBrowserPreferenceController;
 import com.android.settings.applications.defaultapps.DefaultWorkPhonePreferenceController;
+import com.android.settings.applications.defaultapps.DefaultPaymentSettingsPreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -39,9 +41,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-public class AdvancedAppSettings extends DashboardFragment {
+public class DefaultAppSettings extends DashboardFragment {
 
-    static final String TAG = "AdvancedAppSettings";
+    static final String TAG = "DefaultAppSettings";
 
     private static final String KEY_ASSIST_VOICE_INPUT = "assist_and_voice_input";
 
@@ -67,6 +69,8 @@ public class AdvancedAppSettings extends DashboardFragment {
 
     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        controllers.add(new DefaultAssistPreferenceController(context, KEY_ASSIST_VOICE_INPUT,
+                false /* showSetting */));
         controllers.add(new DefaultBrowserPreferenceController(context));
         controllers.add(new DefaultWorkBrowserPreferenceController(context));
         controllers.add(new DefaultPhonePreferenceController(context));
@@ -74,6 +78,7 @@ public class AdvancedAppSettings extends DashboardFragment {
         controllers.add(new DefaultSmsPreferenceController(context));
         controllers.add(new DefaultEmergencyPreferenceController(context));
         controllers.add(new DefaultHomePreferenceController(context));
+        controllers.add(new DefaultPaymentSettingsPreferenceController(context));
         return controllers;
     }
 
@@ -100,7 +105,8 @@ public class AdvancedAppSettings extends DashboardFragment {
                 }
 
                 @Override
-                public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+                public List<AbstractPreferenceController> getPreferenceControllers(
+                        Context context) {
                     return buildPreferenceControllers(context);
                 }
             };
@@ -152,7 +158,7 @@ public class AdvancedAppSettings extends DashboardFragment {
                 @Override
                 public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
                         SummaryLoader summaryLoader) {
-                    return new AdvancedAppSettings.SummaryProvider(activity, summaryLoader);
+                    return new DefaultAppSettings.SummaryProvider(activity, summaryLoader);
                 }
             };
 }
index d12fcf8..f339c58 100755 (executable)
@@ -1070,27 +1070,27 @@ public class InstalledAppDetails extends AppInfoBase
         final Context context = getContext();
         if (DefaultHomePreferenceController.hasHomePreference(mPackageName, context)) {
             screen.addPreference(new ShortcutPreference(getPrefContext(),
-                    AdvancedAppSettings.class, "default_home", R.string.home_app,
+                    DefaultAppSettings.class, "default_home", R.string.home_app,
                     R.string.configure_apps));
         }
         if (DefaultBrowserPreferenceController.hasBrowserPreference(mPackageName, context)) {
             screen.addPreference(new ShortcutPreference(getPrefContext(),
-                    AdvancedAppSettings.class, "default_browser", R.string.default_browser_title,
+                    DefaultAppSettings.class, "default_browser", R.string.default_browser_title,
                     R.string.configure_apps));
         }
         if (DefaultPhonePreferenceController.hasPhonePreference(mPackageName, context)) {
             screen.addPreference(new ShortcutPreference(getPrefContext(),
-                    AdvancedAppSettings.class, "default_phone_app", R.string.default_phone_title,
+                    DefaultAppSettings.class, "default_phone_app", R.string.default_phone_title,
                     R.string.configure_apps));
         }
         if (DefaultEmergencyPreferenceController.hasEmergencyPreference(mPackageName, context)) {
             screen.addPreference(new ShortcutPreference(getPrefContext(),
-                    AdvancedAppSettings.class, "default_emergency_app",
+                    DefaultAppSettings.class, "default_emergency_app",
                     R.string.default_emergency_app, R.string.configure_apps));
         }
         if (DefaultSmsPreferenceController.hasSmsPreference(mPackageName, context)) {
             screen.addPreference(new ShortcutPreference(getPrefContext(),
-                    AdvancedAppSettings.class, "default_sms_app", R.string.sms_application_title,
+                    DefaultAppSettings.class, "default_sms_app", R.string.sms_application_title,
                     R.string.configure_apps));
         }
 
index 720f826..b5e8db7 100644 (file)
@@ -687,7 +687,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment
                             ADVANCED_SETTINGS);
                 } else {
                     ((SettingsActivity) getActivity()).startPreferencePanel(this,
-                            AdvancedAppSettings.class.getName(), null, R.string.configure_apps,
+                            DefaultAppSettings.class.getName(), null, R.string.configure_apps,
                             null, this, ADVANCED_SETTINGS);
                 }
                 return true;
index b8d6a87..7520155 100644 (file)
@@ -23,8 +23,8 @@ import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.service.voice.VoiceInteractionService;
 import android.service.voice.VoiceInteractionServiceInfo;
-
 import android.support.annotation.VisibleForTesting;
+
 import com.android.internal.app.AssistUtils;
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
 import com.android.settings.applications.defaultapps.DefaultAppPreferenceController;
@@ -33,17 +33,23 @@ import java.util.List;
 
 public class DefaultAssistPreferenceController extends DefaultAppPreferenceController {
 
-    private static final String KEY_DEFAULT_ASSIST = "default_assist";
-
-    private AssistUtils mAssistUtils;
+    private final AssistUtils mAssistUtils;
+    private final boolean mShowSetting;
+    private final String mPrefKey;
 
-    public DefaultAssistPreferenceController(Context context) {
+    public DefaultAssistPreferenceController(Context context, String prefKey,
+            boolean showSetting) {
         super(context);
+        mPrefKey = prefKey;
+        mShowSetting = showSetting;
         mAssistUtils = new AssistUtils(context);
     }
 
     @Override
     protected Intent getSettingIntent(DefaultAppInfo info) {
+        if (!mShowSetting) {
+            return null;
+        }
         final ComponentName cn = mAssistUtils.getAssistComponentForUser(mUserId);
         if (cn == null) {
             return null;
@@ -72,7 +78,7 @@ public class DefaultAssistPreferenceController extends DefaultAppPreferenceContr
 
     @Override
     public String getPreferenceKey() {
-        return KEY_DEFAULT_ASSIST;
+        return mPrefKey;
     }
 
     @Override
index a34d3f1..eb14ea1 100644 (file)
@@ -71,7 +71,8 @@ public class ManageAssist extends DashboardFragment {
     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
             Lifecycle lifecycle) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        controllers.add(new DefaultAssistPreferenceController(context));
+        controllers.add(new DefaultAssistPreferenceController(context, "default_assist",
+                true /* showSetting */));
         controllers.add(new AssistGesturePreferenceController(context, lifecycle, KEY_ASSIST,
                 true /* assistOnly */));
         controllers.add(new AssistContextPreferenceController(context, lifecycle));
@@ -81,7 +82,6 @@ public class ManageAssist extends DashboardFragment {
         return controllers;
     }
 
-
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
index b40943f..12470eb 100644 (file)
@@ -18,7 +18,6 @@ package com.android.settings.applications.defaultapps;
 
 import android.app.AppGlobals;
 import android.content.ComponentName;
-import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ComponentInfo;
 import android.content.pm.PackageItemInfo;
index 6b60abc..c7b450e 100644 (file)
@@ -18,6 +18,7 @@ package com.android.settings.applications.defaultapps;
 
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.drawable.Drawable;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
@@ -54,9 +55,11 @@ public abstract class DefaultAppPreferenceController extends AbstractPreferenceC
         CharSequence defaultAppLabel = getDefaultAppLabel();
         if (!TextUtils.isEmpty(defaultAppLabel)) {
             preference.setSummary(defaultAppLabel);
+            preference.setIcon(getDefaultAppIcon());
         } else {
             Log.d(TAG, "No default app");
             preference.setSummary(R.string.app_list_preference_none);
+            preference.setIcon(null);
         }
         mayUpdateGearIcon(app, preference);
     }
@@ -84,6 +87,17 @@ public abstract class DefaultAppPreferenceController extends AbstractPreferenceC
         return null;
     }
 
+    public Drawable getDefaultAppIcon() {
+        if (!isAvailable()) {
+            return null;
+        }
+        final DefaultAppInfo app = getDefaultAppInfo();
+        if (app != null) {
+            return app.loadIcon();
+        }
+        return null;
+    }
+
     public CharSequence getDefaultAppLabel() {
         if (!isAvailable()) {
             return null;
index 219ce0f..a0bf0ca 100644 (file)
@@ -21,6 +21,7 @@ import android.content.Intent;
 import android.content.pm.ComponentInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.support.v7.preference.Preference;
 import android.text.TextUtils;
@@ -86,6 +87,18 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
         return getOnlyAppLabel();
     }
 
+    @Override
+    public Drawable getDefaultAppIcon() {
+        if (!isAvailable()) {
+            return null;
+        }
+        final DefaultAppInfo defaultApp = getDefaultAppInfo();
+        if (defaultApp != null) {
+            return defaultApp.loadIcon();
+        }
+        return getOnlyAppIcon();
+    }
+
     private List<ResolveInfo> getCandidates() {
         return mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, PackageManager.MATCH_ALL,
                 mUserId);
@@ -105,6 +118,18 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
         return null;
     }
 
+    private Drawable getOnlyAppIcon() {
+        final List<ResolveInfo> list = getCandidates();
+        if (list != null && list.size() == 1) {
+            final ResolveInfo info = list.get(0);
+            final ComponentInfo cn = info.getComponentInfo();
+            final String packageName = cn == null ? null : cn.packageName;
+            Log.d(TAG, "Getting icon for the only browser app: " + packageName);
+            return info.loadIcon(mPackageManager.getPackageManager());
+        }
+        return null;
+    }
+
     /**
      * Whether or not the pkg contains browser capability
      */
index a89766f..88b36b2 100644 (file)
@@ -23,8 +23,6 @@ import android.content.IntentFilter;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.support.v7.preference.Preference;
-import android.text.TextUtils;
 
 import com.android.settings.applications.PackageManagerWrapper;
 
@@ -59,27 +57,20 @@ public class DefaultHomePreferenceController extends DefaultAppPreferenceControl
     }
 
     @Override
-    public void updateState(Preference preference) {
-        super.updateState(preference);
-        final DefaultAppInfo defaultApp = getDefaultAppInfo();
-        final CharSequence defaultAppLabel = defaultApp != null ? defaultApp.loadLabel() : null;
-        if (TextUtils.isEmpty(defaultAppLabel)) {
-            final String onlyAppLabel = getOnlyAppLabel();
-            if (!TextUtils.isEmpty(onlyAppLabel)) {
-                preference.setSummary(onlyAppLabel);
-            }
-        }
-    }
-
-    @Override
     protected DefaultAppInfo getDefaultAppInfo() {
         final ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
         final ComponentName currentDefaultHome = mPackageManager.getHomeActivities(homeActivities);
-
-        return new DefaultAppInfo(mPackageManager, mUserId, currentDefaultHome);
+        if (currentDefaultHome != null) {
+            return new DefaultAppInfo(mPackageManager, mUserId, currentDefaultHome);
+        }
+        final ActivityInfo onlyAppInfo = getOnlyAppInfo();
+        if (onlyAppInfo != null) {
+            return new DefaultAppInfo(mPackageManager, mUserId, onlyAppInfo.getComponentName());
+        }
+        return null;
     }
 
-    private String getOnlyAppLabel() {
+    private ActivityInfo getOnlyAppInfo() {
         final List<ResolveInfo> homeActivities = new ArrayList<>();
         final List<ActivityInfo> appLabels = new ArrayList<>();
 
@@ -92,7 +83,7 @@ public class DefaultHomePreferenceController extends DefaultAppPreferenceControl
             appLabels.add(info);
         }
         return appLabels.size() == 1
-                ? appLabels.get(0).loadLabel(mPackageManager.getPackageManager()).toString()
+                ? appLabels.get(0)
                 : null;
     }
 
diff --git a/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceController.java
new file mode 100644 (file)
index 0000000..413e1d5
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.applications.defaultapps;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.nfc.NfcAdapter;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.nfc.PaymentBackend;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+public class DefaultPaymentSettingsPreferenceController extends AbstractPreferenceController
+        implements PreferenceControllerMixin {
+
+    private final NfcAdapter mNfcAdapter;
+    private final PackageManager mPackageManager;
+    private final UserManager mUserManager;
+    private PaymentBackend mPaymentBackend;
+
+    public DefaultPaymentSettingsPreferenceController(Context context) {
+        super(context);
+        mPackageManager = context.getPackageManager();
+        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)
+                && mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
+                && mUserManager.isAdminUser()
+                && mNfcAdapter != null
+                && mNfcAdapter.isEnabled();
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        if (mPaymentBackend == null) {
+            if (mNfcAdapter != null) {
+                mPaymentBackend = new PaymentBackend(mContext);
+            } else {
+                mPaymentBackend = null;
+            }
+        }
+        if (mPaymentBackend == null) {
+            return;
+        }
+        mPaymentBackend.refresh();
+        final PaymentBackend.PaymentAppInfo app = mPaymentBackend.getDefaultApp();
+        if (app != null) {
+            preference.setSummary(app.label);
+        } else {
+            preference.setSummary(R.string.app_list_preference_none);
+        }
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return "default_payment_app";
+    }
+}
index 273c313..da92c3b 100644 (file)
@@ -41,7 +41,7 @@ import com.android.settings.accounts.AccountSyncSettings;
 import com.android.settings.accounts.ChooseAccountActivity;
 import com.android.settings.accounts.ManagedProfileSettings;
 import com.android.settings.accounts.UserAndAccountDashboardFragment;
-import com.android.settings.applications.AdvancedAppSettings;
+import com.android.settings.applications.DefaultAppSettings;
 import com.android.settings.applications.AppAndNotificationDashboardFragment;
 import com.android.settings.applications.DrawOverlayDetails;
 import com.android.settings.applications.ExternalSourcesDetails;
@@ -220,7 +220,7 @@ public class SettingsGateway {
             DrawOverlayDetails.class.getName(),
             WriteSettingsDetails.class.getName(),
             ExternalSourcesDetails.class.getName(),
-            AdvancedAppSettings.class.getName(),
+            DefaultAppSettings.class.getName(),
             WallpaperTypeSettings.class.getName(),
             VrListenerSettings.class.getName(),
             PictureInPictureSettings.class.getName(),
@@ -254,7 +254,6 @@ public class SettingsGateway {
     };
 
     public static final String[] SETTINGS_FOR_RESTRICTED = {
-            // New IA
             // Home page
             Settings.NetworkDashboardActivity.class.getName(),
             Settings.ConnectedDeviceDashboardActivity.class.getName(),
index 7c8c8f1..fddd522 100644 (file)
@@ -22,8 +22,8 @@ import com.android.settings.DisplaySettings;
 import com.android.settings.SecuritySettings;
 import com.android.settings.accounts.AccountDetailDashboardFragment;
 import com.android.settings.accounts.UserAndAccountDashboardFragment;
-import com.android.settings.applications.AdvancedAppSettings;
 import com.android.settings.applications.AppAndNotificationDashboardFragment;
+import com.android.settings.applications.DefaultAppSettings;
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
 import com.android.settings.development.DevelopmentSettings;
 import com.android.settings.deviceinfo.StorageDashboardFragment;
@@ -65,7 +65,7 @@ public class DashboardFragmentRegistry {
                 CategoryKey.CATEGORY_APPS);
         PARENT_TO_CATEGORY_KEY_MAP.put(PowerUsageSummary.class.getName(),
                 CategoryKey.CATEGORY_BATTERY);
-        PARENT_TO_CATEGORY_KEY_MAP.put(AdvancedAppSettings.class.getName(),
+        PARENT_TO_CATEGORY_KEY_MAP.put(DefaultAppSettings.class.getName(),
                 CategoryKey.CATEGORY_APPS_DEFAULT);
         PARENT_TO_CATEGORY_KEY_MAP.put(DisplaySettings.class.getName(),
                 CategoryKey.CATEGORY_DISPLAY);
index eeb43e2..bc9dbbe 100644 (file)
@@ -42,7 +42,7 @@ public class PaymentBackend {
     }
 
     public static class PaymentAppInfo {
-        CharSequence label;
+        public CharSequence label;
         CharSequence description;
         Drawable banner;
         boolean isDefault;
index d914cd8..10f1154 100644 (file)
 
 package com.android.settings.nfc;
 
-import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
-import android.nfc.NfcAdapter;
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceManager;
 import android.support.v7.preference.PreferenceScreen;
@@ -34,8 +32,6 @@ import android.view.ViewGroup;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.nfc.PaymentBackend.PaymentAppInfo;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
@@ -109,40 +105,6 @@ public class PaymentSettings extends SettingsPreferenceFragment implements Index
         menuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_NEVER);
     }
 
-    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
-
-        private final Context mContext;
-        private final SummaryLoader mSummaryLoader;
-
-        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
-            mContext = context;
-            mSummaryLoader = summaryLoader;
-        }
-
-        @Override
-        public void setListening(boolean listening) {
-            if (listening && NfcAdapter.getDefaultAdapter(mContext) != null) {
-                PaymentBackend paymentBackend = new PaymentBackend(mContext);
-                paymentBackend.refresh();
-                PaymentAppInfo app = paymentBackend.getDefaultApp();
-                String summary = null;
-                if (app != null) {
-                    summary = mContext.getString(R.string.payment_summary, app.label);
-                }
-                mSummaryLoader.setSummary(this, summary);
-            }
-        }
-    }
-
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
-            = new SummaryLoader.SummaryProviderFactory() {
-        @Override
-        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                                                                   SummaryLoader summaryLoader) {
-            return new SummaryProvider(activity, summaryLoader);
-        }
-    };
-
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
         new BaseSearchIndexProvider() {
             @Override
index 9b84bf1..dccdc65 100644 (file)
@@ -20,8 +20,8 @@ import android.provider.SearchIndexableResource;
 import android.support.annotation.DrawableRes;
 import android.support.annotation.VisibleForTesting;
 import android.support.annotation.XmlRes;
-
 import android.text.TextUtils;
+
 import com.android.settings.DateTimeSettings;
 import com.android.settings.DeviceInfoSettings;
 import com.android.settings.DisplaySettings;
@@ -34,15 +34,14 @@ import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment;
 import com.android.settings.accessibility.MagnificationPreferenceFragment;
 import com.android.settings.accounts.UserAndAccountDashboardFragment;
-import com.android.settings.applications.AdvancedAppSettings;
 import com.android.settings.applications.AppAndNotificationDashboardFragment;
+import com.android.settings.applications.DefaultAppSettings;
 import com.android.settings.applications.SpecialAccessSettings;
 import com.android.settings.applications.assist.ManageAssist;
 import com.android.settings.backup.BackupSettingsActivity;
 import com.android.settings.backup.BackupSettingsFragment;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
-import com.android.settings.support.SupportDashboardActivity;
 import com.android.settings.datausage.DataUsageMeteredSettings;
 import com.android.settings.datausage.DataUsageSummary;
 import com.android.settings.development.DevelopmentSettings;
@@ -78,6 +77,7 @@ import com.android.settings.notification.ZenModeVisualInterruptionSettings;
 import com.android.settings.print.PrintSettingsFragment;
 import com.android.settings.security.LockscreenDashboardFragment;
 import com.android.settings.sim.SimSettings;
+import com.android.settings.support.SupportDashboardActivity;
 import com.android.settings.system.ResetDashboardFragment;
 import com.android.settings.system.SystemDashboardFragment;
 import com.android.settings.tts.TtsEnginePreferenceFragment;
@@ -101,7 +101,7 @@ public final class SearchIndexableResources {
     @XmlRes
     public static final int NO_DATA_RES_ID = 0;
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     static final HashMap<String, SearchIndexableResource> sResMap = new HashMap<>();
 
     @VisibleForTesting
@@ -156,7 +156,7 @@ public final class SearchIndexableResources {
         addIndex(PowerUsageAdvanced.class, NO_DATA_RES_ID, R.drawable.ic_settings_battery);
         addIndex(BatterySaverSettings.class,
                 R.xml.battery_saver_settings, R.drawable.ic_settings_battery);
-        addIndex(AdvancedAppSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications);
+        addIndex(DefaultAppSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications);
         addIndex(ManageAssist.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications);
         addIndex(SpecialAccessSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications);
         addIndex(UserSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_multiuser);
@@ -201,7 +201,7 @@ public final class SearchIndexableResources {
         addIndex(
                 TtsEnginePreferenceFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language);
         addIndex(LockscreenDashboardFragment.class, R.xml.security_lockscreen_settings,
-            R.drawable.ic_settings_security);
+                R.drawable.ic_settings_security);
         addIndex(MagnificationPreferenceFragment.class, NO_DATA_RES_ID,
                 R.drawable.ic_settings_accessibility);
         addIndex(AccessibilityShortcutPreferenceFragment.class, NO_DATA_RES_ID,
index 8c6d343..47f7a1b 100644 (file)
 package com.android.settings.security;
 
 import android.content.Context;
-import android.content.Intent;
 import android.content.IContentProvider;
+import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.os.Looper;
-import com.android.settings.R;
-import com.android.settings.trustagent.TrustAgentManager;
-import com.android.settings.trustagent.TrustAgentManagerImpl;
-import com.android.settingslib.drawer.DashboardCategory;
 import android.support.annotation.VisibleForTesting;
-import android.support.v4.content.ContextCompat;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.Pair;
 
+import com.android.settings.R;
+import com.android.settings.trustagent.TrustAgentManager;
+import com.android.settings.trustagent.TrustAgentManagerImpl;
+import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
 import com.android.settingslib.drawer.TileUtils;
 
-import java.util.concurrent.Executors;
-import java.util.TreeMap;
 import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.Executors;
 
 /** Implementation for {@code SecurityFeatureProvider}. */
 public class SecurityFeatureProviderImpl implements SecurityFeatureProvider {
index 2f3246c..c774093 100644 (file)
@@ -26,7 +26,6 @@ public class WebViewAppPreferenceController extends DefaultAppPreferenceControll
 
     private static final String WEBVIEW_APP_KEY = "select_webview_provider";
 
-    private final Context mContext;
     private final WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;
     private Preference mPreference;
 
@@ -37,7 +36,6 @@ public class WebViewAppPreferenceController extends DefaultAppPreferenceControll
     public WebViewAppPreferenceController(Context context,
             WebViewUpdateServiceWrapper webviewUpdateServiceWrapper) {
         super(context);
-        mContext = context;
         mWebViewUpdateServiceWrapper = webviewUpdateServiceWrapper;
     }
 
@@ -32,7 +32,7 @@ import org.junit.Test;
  * Test for Advanced App preferences.
  */
 @SmallTest
-public class AdvancedAppSettingsTest extends InstrumentationTestCase {
+public class DefaultAppSettingsTest extends InstrumentationTestCase {
 
     private UiDevice mDevice;
     private Context mTargetContext;
 
 package com.android.settings.applications;
 
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.UserManager;
 import android.telephony.TelephonyManager;
 
 import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
 import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
 import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
 import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.XmlTestUtils;
 
 import org.junit.Before;
@@ -40,31 +51,19 @@ import org.robolectric.util.ReflectionHelpers;
 
 import java.util.List;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class AdvancedAppSettingsTest {
+public class DefaultAppSettingsTest {
 
     private Context mContext;
 
-    private AdvancedAppSettings mFragment;
+    private DefaultAppSettings mFragment;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-
         mContext = RuntimeEnvironment.application;
-        mFragment = new AdvancedAppSettings();
+        mFragment = new DefaultAppSettings();
         mFragment.onAttach(mContext);
     }
 
@@ -77,8 +76,8 @@ public class AdvancedAppSettingsTest {
     @Test
     public void setListening_shouldUpdateSummary() {
         final SummaryLoader summaryLoader = mock(SummaryLoader.class);
-        final AdvancedAppSettings.SummaryProvider summaryProvider =
-                new AdvancedAppSettings.SummaryProvider(mContext, summaryLoader);
+        final DefaultAppSettings.SummaryProvider summaryProvider =
+                new DefaultAppSettings.SummaryProvider(mContext, summaryLoader);
         final DefaultSmsPreferenceController defaultSms =
                 mock(DefaultSmsPreferenceController.class);
         final DefaultBrowserPreferenceController defaultBrowser =
@@ -149,6 +148,7 @@ public class AdvancedAppSettingsTest {
     public void testNonIndexableKeys_existInXmlLayout() {
         final Context context = spy(RuntimeEnvironment.application);
         final Context mockContext = mock(Context.class);
+        when(mockContext.getApplicationContext()).thenReturn(mockContext);
         final UserManager userManager = mock(UserManager.class, RETURNS_DEEP_STUBS);
 
         when(mockContext.getSystemService(Context.USER_SERVICE))
@@ -159,10 +159,10 @@ public class AdvancedAppSettingsTest {
                 .thenReturn(mock(TelephonyManager.class));
         when(mockContext.getPackageManager())
                 .thenReturn(mock(PackageManager.class));
-        final List<String> niks = AdvancedAppSettings.SEARCH_INDEX_DATA_PROVIDER
+        final List<String> niks = DefaultAppSettings.SEARCH_INDEX_DATA_PROVIDER
                 .getNonIndexableKeys(mockContext);
 
-        final int xmlId = (new AdvancedAppSettings()).getPreferenceScreenResId();
+        final int xmlId = (new DefaultAppSettings()).getPreferenceScreenResId();
 
         final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
 
index f382b90..180abbb 100644 (file)
 
 package com.android.settings.applications.assist;
 
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
 import android.Manifest;
 import android.app.SearchManager;
 import android.content.ComponentName;
@@ -28,33 +38,29 @@ import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.provider.Settings;
 
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.internal.app.AssistUtils;
 import com.android.settings.TestConfig;
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
 
-import java.util.ArrayList;
-import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+import java.util.List;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DefaultAssistPreferenceControllerTest {
 
+    private static final String TEST_KEY = "test_pref_key";
+
     @Mock
     private Context mContext;
     @Mock
@@ -66,7 +72,8 @@ public class DefaultAssistPreferenceControllerTest {
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mController = new DefaultAssistPreferenceController(mContext);
+        mController = new DefaultAssistPreferenceController(mContext, TEST_KEY,
+                true /* showSetting */);
     }
 
     @Test
@@ -75,6 +82,12 @@ public class DefaultAssistPreferenceControllerTest {
     }
 
     @Test
+    public void getPrefKey_shouldReturnKey() {
+        assertThat(mController.getPreferenceKey())
+                .isEqualTo(TEST_KEY);
+    }
+
+    @Test
     @Config(shadows = {ShadowSecureSettings.class})
     public void getDefaultAppInfo_hasDefaultAssist_shouldReturnKey() {
         final String flattenKey = "com.android.settings/assist";
@@ -89,15 +102,15 @@ public class DefaultAssistPreferenceControllerTest {
         final String flattenKey = "com.android.settings/assist";
         Settings.Secure.putString(null, Settings.Secure.ASSISTANT, flattenKey);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
-        DefaultAssistPreferenceController controller =
-            spy(new DefaultAssistPreferenceController(mContext));
+        DefaultAssistPreferenceController controller = spy(
+                new DefaultAssistPreferenceController(mContext, TEST_KEY, true /* showSetting */));
         final ResolveInfo resolveInfo = new ResolveInfo();
         resolveInfo.activityInfo = new ActivityInfo();
         resolveInfo.activityInfo.name = "assist";
         resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
         resolveInfo.activityInfo.applicationInfo.packageName = "com.android.settings";
         when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
-            .thenReturn(resolveInfo);
+                .thenReturn(resolveInfo);
         when(mContext.getSystemService(Context.SEARCH_SERVICE)).thenReturn(mSearchManager);
         when(mSearchManager.getAssistIntent(anyBoolean())).thenReturn(mock(Intent.class));
         final ServiceInfo serviceInfo = new ServiceInfo();
@@ -107,9 +120,21 @@ public class DefaultAssistPreferenceControllerTest {
         services.add(resolveInfo);
         when(mPackageManager.queryIntentServices(any(Intent.class), anyInt())).thenReturn(services);
         doReturn(null).when(controller).getAssistSettingsActivity(
-            ComponentName.unflattenFromString(flattenKey), resolveInfo, mPackageManager);
+                ComponentName.unflattenFromString(flattenKey), resolveInfo, mPackageManager);
 
         controller.getSettingIntent(null);
         // should not crash
     }
+
+    @Test
+    public void getSettingIntent_doNotShowSetting_shouldNotTryToGetSettingIntent() {
+        final AssistUtils assistUtils = mock(AssistUtils.class);
+        final DefaultAssistPreferenceController controller = new DefaultAssistPreferenceController(
+                mContext, TEST_KEY, false /* showSetting */);
+        ReflectionHelpers.setField(controller, "mAssistUtils", assistUtils);
+
+        controller.getSettingIntent(null);
+
+        verifyZeroInteractions(assistUtils);
+    }
 }
index d7e5192..22b30bd 100644 (file)
 package com.android.settings.applications.defaultapps;
 
 
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyList;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
 
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.applications.PackageManagerWrapper;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -35,14 +43,6 @@ import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyList;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DefaultHomePreferenceControllerTest {
@@ -79,11 +79,10 @@ public class DefaultHomePreferenceControllerTest {
 
     @Test
     public void updateState_noDefaultApp_shouldAskPackageManagerForOnlyApp() {
-        doReturn(null).when(mController).getDefaultAppInfo();
-
+        when(mPackageManager.getHomeActivities(anyList())).thenReturn(null);
         mController.updateState(mock(Preference.class));
 
-        verify(mPackageManager).getHomeActivities(anyList());
+        verify(mPackageManager, atLeastOnce()).getHomeActivities(anyList());
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPaymentSettingsPreferenceControllerTest.java
new file mode 100644 (file)
index 0000000..6a73269
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.applications.defaultapps;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.nfc.NfcAdapter;
+import android.os.UserManager;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.TestConfig;
+import com.android.settings.nfc.PaymentBackend;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DefaultPaymentSettingsPreferenceControllerTest {
+
+    @Mock
+    private NfcAdapter mNfcAdapter;
+    @Mock
+    private Context mContext;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private PaymentBackend mPaymentBackend;
+
+    private DefaultPaymentSettingsPreferenceController mController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        when(mContext.getApplicationContext()).thenReturn(mContext);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        mController = new DefaultPaymentSettingsPreferenceController(mContext);
+        ReflectionHelpers.setField(mController, "mNfcAdapter", mNfcAdapter);
+
+        mPreference = new Preference(RuntimeEnvironment.application);
+    }
+
+    @Test
+    public void isAvailable_hasNfc_shouldReturnTrue() {
+        when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        when(mNfcAdapter.isEnabled()).thenReturn(true);
+
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_noNfcAdapter_shouldReturnFalse() {
+        when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        ReflectionHelpers.setField(mController, "mNfcAdapter", null);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void updateState_shouldSetSummaryToDefaultPaymentApp() {
+        final PaymentBackend.PaymentAppInfo defaultApp = mock(PaymentBackend.PaymentAppInfo.class);
+        defaultApp.label = "test_payment_app";
+        when(mPaymentBackend.getDefaultApp()).thenReturn(defaultApp);
+        ReflectionHelpers.setField(mController, "mPaymentBackend", mPaymentBackend);
+
+        mController.updateState(mPreference);
+
+        verify(mPaymentBackend).refresh();
+        assertThat(mPreference.getSummary()).isEqualTo(defaultApp.label);
+    }
+}