Show default app icon in default app screen.

- 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
This commit is contained in:
Fan Zhang
2017-07-11 16:26:58 -07:00
parent b3e20232d4
commit 2ea6700336
25 changed files with 372 additions and 177 deletions

View File

@@ -2495,11 +2495,6 @@
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </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" <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.nfc.PaymentSettings" /> android:value="com.android.settings.nfc.PaymentSettings" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED" <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
@@ -3000,7 +2995,7 @@
<meta-data android:name="com.android.settings.category" <meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.apps"/> android:value="com.android.settings.category.ia.apps"/>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS" <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" <meta-data android:name="com.android.settings.summary"
android:resource="@string/summary_empty"/> android:resource="@string/summary_empty"/>
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED" <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"

View File

@@ -23,56 +23,56 @@
<Preference <Preference
android:key="assist_and_voice_input" android:key="assist_and_voice_input"
android:title="@string/assist_and_voice_input_title" android:title="@string/assist_and_voice_input_title"
android:fragment="com.android.settings.applications.assist.ManageAssist" android:fragment="com.android.settings.applications.assist.ManageAssist" />
android:order="-20"/>
<Preference <Preference
android:key="default_browser" android:key="default_browser"
android:title="@string/default_browser_title" android:title="@string/default_browser_title"
android:fragment="com.android.settings.applications.defaultapps.DefaultBrowserPicker" android:fragment="com.android.settings.applications.defaultapps.DefaultBrowserPicker">
android:order="-19"> <extra android:name="for_work" android:value="false" />
<extra android:name="for_work" android:value="false"/>
</Preference> </Preference>
<Preference <Preference
android:key="default_home" android:key="default_home"
android:title="@string/home_app" android:title="@string/home_app"
android:fragment="com.android.settings.applications.defaultapps.DefaultHomePicker" android:fragment="com.android.settings.applications.defaultapps.DefaultHomePicker"
settings:keywords="@string/keywords_home" settings:keywords="@string/keywords_home" />
android:order="-18"/>
<Preference <Preference
android:key="default_phone_app" android:key="default_phone_app"
android:title="@string/default_phone_title" android:title="@string/default_phone_title"
android:fragment="com.android.settings.applications.defaultapps.DefaultPhonePicker" android:fragment="com.android.settings.applications.defaultapps.DefaultPhonePicker"
settings:keywords="@string/keywords_default_phone_app" settings:keywords="@string/keywords_default_phone_app" />
android:order="-17"/>
<Preference <Preference
android:key="default_sms_app" android:key="default_sms_app"
android:title="@string/sms_application_title" android:title="@string/sms_application_title"
android:fragment="com.android.settings.applications.defaultapps.DefaultSmsPicker" android:fragment="com.android.settings.applications.defaultapps.DefaultSmsPicker"
settings:keywords="@string/keywords_more_default_sms_app" settings:keywords="@string/keywords_more_default_sms_app" />
android:order="-16"/>
<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 <Preference
android:key="default_emergency_app" android:key="default_emergency_app"
android:title="@string/default_emergency_app" android:title="@string/default_emergency_app"
settings:keywords="@string/keywords_emergency_app" settings:keywords="@string/keywords_emergency_app" />
android:order="-15"/>
<!-- <!--
<Preference <Preference
android:key="default_notification_asst_app" android:key="default_notification_asst_app"
android:title="@string/default_notification_assistant" android:title="@string/default_notification_assistant"
android:fragment="com.android.settings.applications.defaultapps.DefaultNotificationAssistantPicker" android:fragment="com.android.settings.applications.defaultapps.DefaultNotificationAssistantPicker"
android:order="-13"/> />
--> -->
<Preference <Preference
android:key="domain_urls" android:key="domain_urls"
android:title="@string/domain_urls_title" android:title="@string/domain_urls_title"
android:fragment="com.android.settings.applications.ManageDomainUrls"/> android:fragment="com.android.settings.applications.ManageDomainUrls" />
<com.android.settings.WorkOnlyCategory <com.android.settings.WorkOnlyCategory
android:key="work_defaults" android:key="work_defaults"
@@ -82,7 +82,7 @@
android:key="work_default_browser" android:key="work_default_browser"
android:title="@string/default_browser_title" android:title="@string/default_browser_title"
android:fragment="com.android.settings.applications.defaultapps.DefaultBrowserPicker"> 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>
<Preference <Preference
@@ -90,7 +90,7 @@
android:title="@string/default_phone_title" android:title="@string/default_phone_title"
android:fragment="com.android.settings.applications.defaultapps.DefaultPhonePicker" android:fragment="com.android.settings.applications.defaultapps.DefaultPhonePicker"
settings:keywords="@string/keywords_default_phone_app"> settings:keywords="@string/keywords_default_phone_app">
<extra android:name="for_work" android:value="true"/> <extra android:name="for_work" android:value="true" />
</Preference> </Preference>
</com.android.settings.WorkOnlyCategory> </com.android.settings.WorkOnlyCategory>

View File

@@ -813,13 +813,6 @@ public class SettingsActivity extends SettingsDrawerActivity
Settings.DateTimeSettingsActivity.class.getName()), Settings.DateTimeSettingsActivity.class.getName()),
!UserManager.isDeviceInDemoMode(this), isAdmin) !UserManager.isDeviceInDemoMode(this), isAdmin)
|| somethingChanged; || 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, somethingChanged = setTileEnabled(new ComponentName(packageName,
Settings.PrintSettingsActivity.class.getName()), Settings.PrintSettingsActivity.class.getName()),

View File

@@ -22,6 +22,7 @@ import android.text.TextUtils;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R; 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.DefaultBrowserPreferenceController;
import com.android.settings.applications.defaultapps.DefaultEmergencyPreferenceController; import com.android.settings.applications.defaultapps.DefaultEmergencyPreferenceController;
import com.android.settings.applications.defaultapps.DefaultHomePreferenceController; 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.DefaultSmsPreferenceController;
import com.android.settings.applications.defaultapps.DefaultWorkBrowserPreferenceController; import com.android.settings.applications.defaultapps.DefaultWorkBrowserPreferenceController;
import com.android.settings.applications.defaultapps.DefaultWorkPhonePreferenceController; 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.DashboardFragment;
import com.android.settings.dashboard.SummaryLoader; import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
@@ -39,9 +41,9 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; 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"; 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) { private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>(); 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 DefaultBrowserPreferenceController(context));
controllers.add(new DefaultWorkBrowserPreferenceController(context)); controllers.add(new DefaultWorkBrowserPreferenceController(context));
controllers.add(new DefaultPhonePreferenceController(context)); controllers.add(new DefaultPhonePreferenceController(context));
@@ -74,6 +78,7 @@ public class AdvancedAppSettings extends DashboardFragment {
controllers.add(new DefaultSmsPreferenceController(context)); controllers.add(new DefaultSmsPreferenceController(context));
controllers.add(new DefaultEmergencyPreferenceController(context)); controllers.add(new DefaultEmergencyPreferenceController(context));
controllers.add(new DefaultHomePreferenceController(context)); controllers.add(new DefaultHomePreferenceController(context));
controllers.add(new DefaultPaymentSettingsPreferenceController(context));
return controllers; return controllers;
} }
@@ -100,7 +105,8 @@ public class AdvancedAppSettings extends DashboardFragment {
} }
@Override @Override
public List<AbstractPreferenceController> getPreferenceControllers(Context context) { public List<AbstractPreferenceController> getPreferenceControllers(
Context context) {
return buildPreferenceControllers(context); return buildPreferenceControllers(context);
} }
}; };
@@ -152,7 +158,7 @@ public class AdvancedAppSettings extends DashboardFragment {
@Override @Override
public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity, public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
SummaryLoader summaryLoader) { SummaryLoader summaryLoader) {
return new AdvancedAppSettings.SummaryProvider(activity, summaryLoader); return new DefaultAppSettings.SummaryProvider(activity, summaryLoader);
} }
}; };
} }

View File

@@ -1070,27 +1070,27 @@ public class InstalledAppDetails extends AppInfoBase
final Context context = getContext(); final Context context = getContext();
if (DefaultHomePreferenceController.hasHomePreference(mPackageName, context)) { if (DefaultHomePreferenceController.hasHomePreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(), 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)); R.string.configure_apps));
} }
if (DefaultBrowserPreferenceController.hasBrowserPreference(mPackageName, context)) { if (DefaultBrowserPreferenceController.hasBrowserPreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(), 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)); R.string.configure_apps));
} }
if (DefaultPhonePreferenceController.hasPhonePreference(mPackageName, context)) { if (DefaultPhonePreferenceController.hasPhonePreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(), 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)); R.string.configure_apps));
} }
if (DefaultEmergencyPreferenceController.hasEmergencyPreference(mPackageName, context)) { if (DefaultEmergencyPreferenceController.hasEmergencyPreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(), screen.addPreference(new ShortcutPreference(getPrefContext(),
AdvancedAppSettings.class, "default_emergency_app", DefaultAppSettings.class, "default_emergency_app",
R.string.default_emergency_app, R.string.configure_apps)); R.string.default_emergency_app, R.string.configure_apps));
} }
if (DefaultSmsPreferenceController.hasSmsPreference(mPackageName, context)) { if (DefaultSmsPreferenceController.hasSmsPreference(mPackageName, context)) {
screen.addPreference(new ShortcutPreference(getPrefContext(), 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)); R.string.configure_apps));
} }

View File

@@ -687,7 +687,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment
ADVANCED_SETTINGS); ADVANCED_SETTINGS);
} else { } else {
((SettingsActivity) getActivity()).startPreferencePanel(this, ((SettingsActivity) getActivity()).startPreferencePanel(this,
AdvancedAppSettings.class.getName(), null, R.string.configure_apps, DefaultAppSettings.class.getName(), null, R.string.configure_apps,
null, this, ADVANCED_SETTINGS); null, this, ADVANCED_SETTINGS);
} }
return true; return true;

View File

@@ -23,8 +23,8 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.service.voice.VoiceInteractionService; import android.service.voice.VoiceInteractionService;
import android.service.voice.VoiceInteractionServiceInfo; import android.service.voice.VoiceInteractionServiceInfo;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
import com.android.internal.app.AssistUtils; import com.android.internal.app.AssistUtils;
import com.android.settings.applications.defaultapps.DefaultAppInfo; import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.applications.defaultapps.DefaultAppPreferenceController; import com.android.settings.applications.defaultapps.DefaultAppPreferenceController;
@@ -33,17 +33,23 @@ import java.util.List;
public class DefaultAssistPreferenceController extends DefaultAppPreferenceController { public class DefaultAssistPreferenceController extends DefaultAppPreferenceController {
private static final String KEY_DEFAULT_ASSIST = "default_assist"; private final AssistUtils mAssistUtils;
private final boolean mShowSetting;
private final String mPrefKey;
private AssistUtils mAssistUtils; public DefaultAssistPreferenceController(Context context, String prefKey,
boolean showSetting) {
public DefaultAssistPreferenceController(Context context) {
super(context); super(context);
mPrefKey = prefKey;
mShowSetting = showSetting;
mAssistUtils = new AssistUtils(context); mAssistUtils = new AssistUtils(context);
} }
@Override @Override
protected Intent getSettingIntent(DefaultAppInfo info) { protected Intent getSettingIntent(DefaultAppInfo info) {
if (!mShowSetting) {
return null;
}
final ComponentName cn = mAssistUtils.getAssistComponentForUser(mUserId); final ComponentName cn = mAssistUtils.getAssistComponentForUser(mUserId);
if (cn == null) { if (cn == null) {
return null; return null;
@@ -72,7 +78,7 @@ public class DefaultAssistPreferenceController extends DefaultAppPreferenceContr
@Override @Override
public String getPreferenceKey() { public String getPreferenceKey() {
return KEY_DEFAULT_ASSIST; return mPrefKey;
} }
@Override @Override

View File

@@ -71,7 +71,8 @@ public class ManageAssist extends DashboardFragment {
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) { Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>(); 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, controllers.add(new AssistGesturePreferenceController(context, lifecycle, KEY_ASSIST,
true /* assistOnly */)); true /* assistOnly */));
controllers.add(new AssistContextPreferenceController(context, lifecycle)); controllers.add(new AssistContextPreferenceController(context, lifecycle));
@@ -81,7 +82,6 @@ public class ManageAssist extends DashboardFragment {
return controllers; return controllers;
} }
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider() {
@Override @Override

View File

@@ -18,7 +18,6 @@ package com.android.settings.applications.defaultapps;
import android.app.AppGlobals; import android.app.AppGlobals;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo; import android.content.pm.ComponentInfo;
import android.content.pm.PackageItemInfo; import android.content.pm.PackageItemInfo;

View File

@@ -18,6 +18,7 @@ package com.android.settings.applications.defaultapps;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
@@ -54,9 +55,11 @@ public abstract class DefaultAppPreferenceController extends AbstractPreferenceC
CharSequence defaultAppLabel = getDefaultAppLabel(); CharSequence defaultAppLabel = getDefaultAppLabel();
if (!TextUtils.isEmpty(defaultAppLabel)) { if (!TextUtils.isEmpty(defaultAppLabel)) {
preference.setSummary(defaultAppLabel); preference.setSummary(defaultAppLabel);
preference.setIcon(getDefaultAppIcon());
} else { } else {
Log.d(TAG, "No default app"); Log.d(TAG, "No default app");
preference.setSummary(R.string.app_list_preference_none); preference.setSummary(R.string.app_list_preference_none);
preference.setIcon(null);
} }
mayUpdateGearIcon(app, preference); mayUpdateGearIcon(app, preference);
} }
@@ -84,6 +87,17 @@ public abstract class DefaultAppPreferenceController extends AbstractPreferenceC
return null; return null;
} }
public Drawable getDefaultAppIcon() {
if (!isAvailable()) {
return null;
}
final DefaultAppInfo app = getDefaultAppInfo();
if (app != null) {
return app.loadIcon();
}
return null;
}
public CharSequence getDefaultAppLabel() { public CharSequence getDefaultAppLabel() {
if (!isAvailable()) { if (!isAvailable()) {
return null; return null;

View File

@@ -21,6 +21,7 @@ import android.content.Intent;
import android.content.pm.ComponentInfo; import android.content.pm.ComponentInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.text.TextUtils; import android.text.TextUtils;
@@ -86,6 +87,18 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
return getOnlyAppLabel(); 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() { private List<ResolveInfo> getCandidates() {
return mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, PackageManager.MATCH_ALL, return mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, PackageManager.MATCH_ALL,
mUserId); mUserId);
@@ -105,6 +118,18 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
return null; 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 * Whether or not the pkg contains browser capability
*/ */

View File

@@ -23,8 +23,6 @@ import android.content.IntentFilter;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.support.v7.preference.Preference;
import android.text.TextUtils;
import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.applications.PackageManagerWrapper;
@@ -58,28 +56,21 @@ public class DefaultHomePreferenceController extends DefaultAppPreferenceControl
return true; return true;
} }
@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 @Override
protected DefaultAppInfo getDefaultAppInfo() { protected DefaultAppInfo getDefaultAppInfo() {
final ArrayList<ResolveInfo> homeActivities = new ArrayList<>(); final ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
final ComponentName currentDefaultHome = mPackageManager.getHomeActivities(homeActivities); final ComponentName currentDefaultHome = mPackageManager.getHomeActivities(homeActivities);
if (currentDefaultHome != null) {
return new DefaultAppInfo(mPackageManager, mUserId, currentDefaultHome); 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<ResolveInfo> homeActivities = new ArrayList<>();
final List<ActivityInfo> appLabels = new ArrayList<>(); final List<ActivityInfo> appLabels = new ArrayList<>();
@@ -92,7 +83,7 @@ public class DefaultHomePreferenceController extends DefaultAppPreferenceControl
appLabels.add(info); appLabels.add(info);
} }
return appLabels.size() == 1 return appLabels.size() == 1
? appLabels.get(0).loadLabel(mPackageManager.getPackageManager()).toString() ? appLabels.get(0)
: null; : null;
} }

View File

@@ -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";
}
}

View File

@@ -41,7 +41,7 @@ import com.android.settings.accounts.AccountSyncSettings;
import com.android.settings.accounts.ChooseAccountActivity; import com.android.settings.accounts.ChooseAccountActivity;
import com.android.settings.accounts.ManagedProfileSettings; import com.android.settings.accounts.ManagedProfileSettings;
import com.android.settings.accounts.UserAndAccountDashboardFragment; 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.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DrawOverlayDetails; import com.android.settings.applications.DrawOverlayDetails;
import com.android.settings.applications.ExternalSourcesDetails; import com.android.settings.applications.ExternalSourcesDetails;
@@ -220,7 +220,7 @@ public class SettingsGateway {
DrawOverlayDetails.class.getName(), DrawOverlayDetails.class.getName(),
WriteSettingsDetails.class.getName(), WriteSettingsDetails.class.getName(),
ExternalSourcesDetails.class.getName(), ExternalSourcesDetails.class.getName(),
AdvancedAppSettings.class.getName(), DefaultAppSettings.class.getName(),
WallpaperTypeSettings.class.getName(), WallpaperTypeSettings.class.getName(),
VrListenerSettings.class.getName(), VrListenerSettings.class.getName(),
PictureInPictureSettings.class.getName(), PictureInPictureSettings.class.getName(),
@@ -254,7 +254,6 @@ public class SettingsGateway {
}; };
public static final String[] SETTINGS_FOR_RESTRICTED = { public static final String[] SETTINGS_FOR_RESTRICTED = {
// New IA
// Home page // Home page
Settings.NetworkDashboardActivity.class.getName(), Settings.NetworkDashboardActivity.class.getName(),
Settings.ConnectedDeviceDashboardActivity.class.getName(), Settings.ConnectedDeviceDashboardActivity.class.getName(),

View File

@@ -22,8 +22,8 @@ import com.android.settings.DisplaySettings;
import com.android.settings.SecuritySettings; import com.android.settings.SecuritySettings;
import com.android.settings.accounts.AccountDetailDashboardFragment; import com.android.settings.accounts.AccountDetailDashboardFragment;
import com.android.settings.accounts.UserAndAccountDashboardFragment; import com.android.settings.accounts.UserAndAccountDashboardFragment;
import com.android.settings.applications.AdvancedAppSettings;
import com.android.settings.applications.AppAndNotificationDashboardFragment; import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment; import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.development.DevelopmentSettings; import com.android.settings.development.DevelopmentSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment; import com.android.settings.deviceinfo.StorageDashboardFragment;
@@ -65,7 +65,7 @@ public class DashboardFragmentRegistry {
CategoryKey.CATEGORY_APPS); CategoryKey.CATEGORY_APPS);
PARENT_TO_CATEGORY_KEY_MAP.put(PowerUsageSummary.class.getName(), PARENT_TO_CATEGORY_KEY_MAP.put(PowerUsageSummary.class.getName(),
CategoryKey.CATEGORY_BATTERY); 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); CategoryKey.CATEGORY_APPS_DEFAULT);
PARENT_TO_CATEGORY_KEY_MAP.put(DisplaySettings.class.getName(), PARENT_TO_CATEGORY_KEY_MAP.put(DisplaySettings.class.getName(),
CategoryKey.CATEGORY_DISPLAY); CategoryKey.CATEGORY_DISPLAY);

View File

@@ -42,7 +42,7 @@ public class PaymentBackend {
} }
public static class PaymentAppInfo { public static class PaymentAppInfo {
CharSequence label; public CharSequence label;
CharSequence description; CharSequence description;
Drawable banner; Drawable banner;
boolean isDefault; boolean isDefault;

View File

@@ -16,12 +16,10 @@
package com.android.settings.nfc; package com.android.settings.nfc;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.nfc.NfcAdapter;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen; 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.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment; 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.BaseSearchIndexProvider;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw;
@@ -109,40 +105,6 @@ public class PaymentSettings extends SettingsPreferenceFragment implements Index
menuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_NEVER); 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 = public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider() {
@Override @Override

View File

@@ -20,8 +20,8 @@ import android.provider.SearchIndexableResource;
import android.support.annotation.DrawableRes; import android.support.annotation.DrawableRes;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
import android.support.annotation.XmlRes; import android.support.annotation.XmlRes;
import android.text.TextUtils; import android.text.TextUtils;
import com.android.settings.DateTimeSettings; import com.android.settings.DateTimeSettings;
import com.android.settings.DeviceInfoSettings; import com.android.settings.DeviceInfoSettings;
import com.android.settings.DisplaySettings; 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.AccessibilityShortcutPreferenceFragment;
import com.android.settings.accessibility.MagnificationPreferenceFragment; import com.android.settings.accessibility.MagnificationPreferenceFragment;
import com.android.settings.accounts.UserAndAccountDashboardFragment; import com.android.settings.accounts.UserAndAccountDashboardFragment;
import com.android.settings.applications.AdvancedAppSettings;
import com.android.settings.applications.AppAndNotificationDashboardFragment; import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.applications.SpecialAccessSettings; import com.android.settings.applications.SpecialAccessSettings;
import com.android.settings.applications.assist.ManageAssist; import com.android.settings.applications.assist.ManageAssist;
import com.android.settings.backup.BackupSettingsActivity; import com.android.settings.backup.BackupSettingsActivity;
import com.android.settings.backup.BackupSettingsFragment; import com.android.settings.backup.BackupSettingsFragment;
import com.android.settings.bluetooth.BluetoothSettings; import com.android.settings.bluetooth.BluetoothSettings;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment; import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.support.SupportDashboardActivity;
import com.android.settings.datausage.DataUsageMeteredSettings; import com.android.settings.datausage.DataUsageMeteredSettings;
import com.android.settings.datausage.DataUsageSummary; import com.android.settings.datausage.DataUsageSummary;
import com.android.settings.development.DevelopmentSettings; 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.print.PrintSettingsFragment;
import com.android.settings.security.LockscreenDashboardFragment; import com.android.settings.security.LockscreenDashboardFragment;
import com.android.settings.sim.SimSettings; import com.android.settings.sim.SimSettings;
import com.android.settings.support.SupportDashboardActivity;
import com.android.settings.system.ResetDashboardFragment; import com.android.settings.system.ResetDashboardFragment;
import com.android.settings.system.SystemDashboardFragment; import com.android.settings.system.SystemDashboardFragment;
import com.android.settings.tts.TtsEnginePreferenceFragment; import com.android.settings.tts.TtsEnginePreferenceFragment;
@@ -101,7 +101,7 @@ public final class SearchIndexableResources {
@XmlRes @XmlRes
public static final int NO_DATA_RES_ID = 0; public static final int NO_DATA_RES_ID = 0;
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) @VisibleForTesting
static final HashMap<String, SearchIndexableResource> sResMap = new HashMap<>(); static final HashMap<String, SearchIndexableResource> sResMap = new HashMap<>();
@VisibleForTesting @VisibleForTesting
@@ -156,7 +156,7 @@ public final class SearchIndexableResources {
addIndex(PowerUsageAdvanced.class, NO_DATA_RES_ID, R.drawable.ic_settings_battery); addIndex(PowerUsageAdvanced.class, NO_DATA_RES_ID, R.drawable.ic_settings_battery);
addIndex(BatterySaverSettings.class, addIndex(BatterySaverSettings.class,
R.xml.battery_saver_settings, R.drawable.ic_settings_battery); 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(ManageAssist.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications);
addIndex(SpecialAccessSettings.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); addIndex(UserSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_multiuser);
@@ -201,7 +201,7 @@ public final class SearchIndexableResources {
addIndex( addIndex(
TtsEnginePreferenceFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language); TtsEnginePreferenceFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language);
addIndex(LockscreenDashboardFragment.class, R.xml.security_lockscreen_settings, 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, addIndex(MagnificationPreferenceFragment.class, NO_DATA_RES_ID,
R.drawable.ic_settings_accessibility); R.drawable.ic_settings_accessibility);
addIndex(AccessibilityShortcutPreferenceFragment.class, NO_DATA_RES_ID, addIndex(AccessibilityShortcutPreferenceFragment.class, NO_DATA_RES_ID,

View File

@@ -17,31 +17,30 @@
package com.android.settings.security; package com.android.settings.security;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.IContentProvider; import android.content.IContentProvider;
import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; 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.annotation.VisibleForTesting;
import android.support.v4.content.ContextCompat;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Pair; 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.Tile;
import com.android.settingslib.drawer.TileUtils; import com.android.settingslib.drawer.TileUtils;
import java.util.concurrent.Executors;
import java.util.TreeMap;
import java.util.Map; import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.Executors;
/** Implementation for {@code SecurityFeatureProvider}. */ /** Implementation for {@code SecurityFeatureProvider}. */
public class SecurityFeatureProviderImpl implements SecurityFeatureProvider { public class SecurityFeatureProviderImpl implements SecurityFeatureProvider {

View File

@@ -26,7 +26,6 @@ public class WebViewAppPreferenceController extends DefaultAppPreferenceControll
private static final String WEBVIEW_APP_KEY = "select_webview_provider"; private static final String WEBVIEW_APP_KEY = "select_webview_provider";
private final Context mContext;
private final WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper; private final WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;
private Preference mPreference; private Preference mPreference;
@@ -37,7 +36,6 @@ public class WebViewAppPreferenceController extends DefaultAppPreferenceControll
public WebViewAppPreferenceController(Context context, public WebViewAppPreferenceController(Context context,
WebViewUpdateServiceWrapper webviewUpdateServiceWrapper) { WebViewUpdateServiceWrapper webviewUpdateServiceWrapper) {
super(context); super(context);
mContext = context;
mWebViewUpdateServiceWrapper = webviewUpdateServiceWrapper; mWebViewUpdateServiceWrapper = webviewUpdateServiceWrapper;
} }

View File

@@ -32,7 +32,7 @@ import org.junit.Test;
* Test for Advanced App preferences. * Test for Advanced App preferences.
*/ */
@SmallTest @SmallTest
public class AdvancedAppSettingsTest extends InstrumentationTestCase { public class DefaultAppSettingsTest extends InstrumentationTestCase {
private UiDevice mDevice; private UiDevice mDevice;
private Context mTargetContext; private Context mTargetContext;

View File

@@ -16,18 +16,29 @@
package com.android.settings.applications; 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.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.UserManager; import android.os.UserManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController; import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController; import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController; import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
import com.android.settings.dashboard.SummaryLoader; import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.XmlTestUtils;
import org.junit.Before; import org.junit.Before;
@@ -40,31 +51,19 @@ import org.robolectric.util.ReflectionHelpers;
import java.util.List; 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) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class AdvancedAppSettingsTest { public class DefaultAppSettingsTest {
private Context mContext; private Context mContext;
private AdvancedAppSettings mFragment; private DefaultAppSettings mFragment;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
mFragment = new AdvancedAppSettings(); mFragment = new DefaultAppSettings();
mFragment.onAttach(mContext); mFragment.onAttach(mContext);
} }
@@ -77,8 +76,8 @@ public class AdvancedAppSettingsTest {
@Test @Test
public void setListening_shouldUpdateSummary() { public void setListening_shouldUpdateSummary() {
final SummaryLoader summaryLoader = mock(SummaryLoader.class); final SummaryLoader summaryLoader = mock(SummaryLoader.class);
final AdvancedAppSettings.SummaryProvider summaryProvider = final DefaultAppSettings.SummaryProvider summaryProvider =
new AdvancedAppSettings.SummaryProvider(mContext, summaryLoader); new DefaultAppSettings.SummaryProvider(mContext, summaryLoader);
final DefaultSmsPreferenceController defaultSms = final DefaultSmsPreferenceController defaultSms =
mock(DefaultSmsPreferenceController.class); mock(DefaultSmsPreferenceController.class);
final DefaultBrowserPreferenceController defaultBrowser = final DefaultBrowserPreferenceController defaultBrowser =
@@ -149,6 +148,7 @@ public class AdvancedAppSettingsTest {
public void testNonIndexableKeys_existInXmlLayout() { public void testNonIndexableKeys_existInXmlLayout() {
final Context context = spy(RuntimeEnvironment.application); final Context context = spy(RuntimeEnvironment.application);
final Context mockContext = mock(Context.class); final Context mockContext = mock(Context.class);
when(mockContext.getApplicationContext()).thenReturn(mockContext);
final UserManager userManager = mock(UserManager.class, RETURNS_DEEP_STUBS); final UserManager userManager = mock(UserManager.class, RETURNS_DEEP_STUBS);
when(mockContext.getSystemService(Context.USER_SERVICE)) when(mockContext.getSystemService(Context.USER_SERVICE))
@@ -159,10 +159,10 @@ public class AdvancedAppSettingsTest {
.thenReturn(mock(TelephonyManager.class)); .thenReturn(mock(TelephonyManager.class));
when(mockContext.getPackageManager()) when(mockContext.getPackageManager())
.thenReturn(mock(PackageManager.class)); .thenReturn(mock(PackageManager.class));
final List<String> niks = AdvancedAppSettings.SEARCH_INDEX_DATA_PROVIDER final List<String> niks = DefaultAppSettings.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(mockContext); .getNonIndexableKeys(mockContext);
final int xmlId = (new AdvancedAppSettings()).getPreferenceScreenResId(); final int xmlId = (new DefaultAppSettings()).getPreferenceScreenResId();
final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId); final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);

View File

@@ -16,6 +16,16 @@
package com.android.settings.applications.assist; 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.Manifest;
import android.app.SearchManager; import android.app.SearchManager;
import android.content.ComponentName; import android.content.ComponentName;
@@ -28,33 +38,29 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.provider.Settings; 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.TestConfig;
import com.android.settings.applications.defaultapps.DefaultAppInfo; import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSecureSettings; import com.android.settings.testutils.shadow.ShadowSecureSettings;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
import static com.google.common.truth.Truth.assertThat; import java.util.ArrayList;
import static org.mockito.Matchers.any; import java.util.List;
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;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DefaultAssistPreferenceControllerTest { public class DefaultAssistPreferenceControllerTest {
private static final String TEST_KEY = "test_pref_key";
@Mock @Mock
private Context mContext; private Context mContext;
@Mock @Mock
@@ -66,7 +72,8 @@ public class DefaultAssistPreferenceControllerTest {
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mController = new DefaultAssistPreferenceController(mContext); mController = new DefaultAssistPreferenceController(mContext, TEST_KEY,
true /* showSetting */);
} }
@Test @Test
@@ -74,6 +81,12 @@ public class DefaultAssistPreferenceControllerTest {
assertThat(mController.isAvailable()).isTrue(); assertThat(mController.isAvailable()).isTrue();
} }
@Test
public void getPrefKey_shouldReturnKey() {
assertThat(mController.getPreferenceKey())
.isEqualTo(TEST_KEY);
}
@Test @Test
@Config(shadows = {ShadowSecureSettings.class}) @Config(shadows = {ShadowSecureSettings.class})
public void getDefaultAppInfo_hasDefaultAssist_shouldReturnKey() { public void getDefaultAppInfo_hasDefaultAssist_shouldReturnKey() {
@@ -89,15 +102,15 @@ public class DefaultAssistPreferenceControllerTest {
final String flattenKey = "com.android.settings/assist"; final String flattenKey = "com.android.settings/assist";
Settings.Secure.putString(null, Settings.Secure.ASSISTANT, flattenKey); Settings.Secure.putString(null, Settings.Secure.ASSISTANT, flattenKey);
when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getPackageManager()).thenReturn(mPackageManager);
DefaultAssistPreferenceController controller = DefaultAssistPreferenceController controller = spy(
spy(new DefaultAssistPreferenceController(mContext)); new DefaultAssistPreferenceController(mContext, TEST_KEY, true /* showSetting */));
final ResolveInfo resolveInfo = new ResolveInfo(); final ResolveInfo resolveInfo = new ResolveInfo();
resolveInfo.activityInfo = new ActivityInfo(); resolveInfo.activityInfo = new ActivityInfo();
resolveInfo.activityInfo.name = "assist"; resolveInfo.activityInfo.name = "assist";
resolveInfo.activityInfo.applicationInfo = new ApplicationInfo(); resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
resolveInfo.activityInfo.applicationInfo.packageName = "com.android.settings"; resolveInfo.activityInfo.applicationInfo.packageName = "com.android.settings";
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt())) when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(resolveInfo); .thenReturn(resolveInfo);
when(mContext.getSystemService(Context.SEARCH_SERVICE)).thenReturn(mSearchManager); when(mContext.getSystemService(Context.SEARCH_SERVICE)).thenReturn(mSearchManager);
when(mSearchManager.getAssistIntent(anyBoolean())).thenReturn(mock(Intent.class)); when(mSearchManager.getAssistIntent(anyBoolean())).thenReturn(mock(Intent.class));
final ServiceInfo serviceInfo = new ServiceInfo(); final ServiceInfo serviceInfo = new ServiceInfo();
@@ -107,9 +120,21 @@ public class DefaultAssistPreferenceControllerTest {
services.add(resolveInfo); services.add(resolveInfo);
when(mPackageManager.queryIntentServices(any(Intent.class), anyInt())).thenReturn(services); when(mPackageManager.queryIntentServices(any(Intent.class), anyInt())).thenReturn(services);
doReturn(null).when(controller).getAssistSettingsActivity( doReturn(null).when(controller).getAssistSettingsActivity(
ComponentName.unflattenFromString(flattenKey), resolveInfo, mPackageManager); ComponentName.unflattenFromString(flattenKey), resolveInfo, mPackageManager);
controller.getSettingIntent(null); controller.getSettingIntent(null);
// should not crash // 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);
}
} }

View File

@@ -17,14 +17,22 @@
package com.android.settings.applications.defaultapps; 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.ComponentName;
import android.content.Context; import android.content.Context;
import android.os.UserManager; import android.os.UserManager;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.applications.PackageManagerWrapper;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -35,14 +43,6 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers; 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) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DefaultHomePreferenceControllerTest { public class DefaultHomePreferenceControllerTest {
@@ -79,11 +79,10 @@ public class DefaultHomePreferenceControllerTest {
@Test @Test
public void updateState_noDefaultApp_shouldAskPackageManagerForOnlyApp() { public void updateState_noDefaultApp_shouldAskPackageManagerForOnlyApp() {
doReturn(null).when(mController).getDefaultAppInfo(); when(mPackageManager.getHomeActivities(anyList())).thenReturn(null);
mController.updateState(mock(Preference.class)); mController.updateState(mock(Preference.class));
verify(mPackageManager).getHomeActivities(anyList()); verify(mPackageManager, atLeastOnce()).getHomeActivities(anyList());
} }
@Test @Test

View File

@@ -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);
}
}