diff --git a/src/com/android/settings/AppListPreference.java b/src/com/android/settings/AppListPreference.java index 61b42606de9..1ebeeaaf93d 100644 --- a/src/com/android/settings/AppListPreference.java +++ b/src/com/android/settings/AppListPreference.java @@ -32,6 +32,7 @@ import android.os.Parcelable; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; +import android.text.TextUtils; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -265,6 +266,24 @@ public class AppListPreference extends CustomListPreference { } } + /** + * Sets app label as summary if there is only 1 app applicable to this preference. + */ + protected void setSoleAppLabelAsSummary() { + final CharSequence soleLauncherLabel = getSoleAppLabel(); + if (!TextUtils.isEmpty(soleLauncherLabel)) { + setSummary(soleLauncherLabel); + } + } + + /** + * Returns app label if there is only 1 app applicable to this preference. + */ + protected CharSequence getSoleAppLabel() { + // Intentionally left empty so subclasses can override with necessary logic. + return null; + } + private static class SavedState implements Parcelable { public final CharSequence[] entryValues; diff --git a/src/com/android/settings/applications/DefaultBrowserPreference.java b/src/com/android/settings/applications/DefaultBrowserPreference.java index d25e2242344..9d84e1ecf97 100644 --- a/src/com/android/settings/applications/DefaultBrowserPreference.java +++ b/src/com/android/settings/applications/DefaultBrowserPreference.java @@ -26,6 +26,7 @@ import android.os.UserHandle; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; + import com.android.internal.content.PackageMonitor; import com.android.settings.AppListPreference; import com.android.settings.R; @@ -36,12 +37,16 @@ import java.util.List; public class DefaultBrowserPreference extends AppListPreference { private static final String TAG = "DefaultBrowserPref"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final long DELAY_UPDATE_BROWSER_MILLIS = 500; + private static final Intent BROWSE_PROBE = new Intent() + .setAction(Intent.ACTION_VIEW) + .addCategory(Intent.CATEGORY_BROWSABLE) + .setData(Uri.parse("http:")); private final Handler mHandler = new Handler(); - - final private PackageManager mPm; + private final PackageManager mPm; public DefaultBrowserPreference(Context context, AttributeSet attrs) { super(context, attrs); @@ -65,11 +70,7 @@ public class DefaultBrowserPreference extends AppListPreference { @Override protected boolean persistString(String newValue) { - - if (newValue == null) { - return false; - } - final CharSequence packageName = (CharSequence) newValue; + final CharSequence packageName = newValue; if (TextUtils.isEmpty(packageName)) { return false; } @@ -95,13 +96,10 @@ public class DefaultBrowserPreference extends AppListPreference { String packageName = pm.getDefaultBrowserPackageNameAsUser(mUserId); if (!TextUtils.isEmpty(packageName)) { // Check if the default Browser package is still there - Intent intent = new Intent(); - intent.setPackage(packageName); - intent.setAction(Intent.ACTION_VIEW); - intent.addCategory(Intent.CATEGORY_BROWSABLE); - intent.setData(Uri.parse("http:")); + final Intent intent = new Intent(BROWSE_PROBE) + .setPackage(packageName); - ResolveInfo info = mPm.resolveActivityAsUser(intent, 0, mUserId); + final ResolveInfo info = mPm.resolveActivityAsUser(intent, 0, mUserId); if (info != null) { setValue(packageName); setSummary("%s"); @@ -109,26 +107,20 @@ public class DefaultBrowserPreference extends AppListPreference { setSummary(R.string.default_browser_title_none); } } else { - setSummary(R.string.default_browser_title_none); - Log.d(TAG, "Cannot set empty default Browser value!"); + if (DEBUG) Log.d(TAG, "No default browser app."); + setSoleAppLabelAsSummary(); } } private List resolveBrowserApps() { List result = new ArrayList<>(); - // Create an Intent that will match ALL Browser Apps - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_VIEW); - intent.addCategory(Intent.CATEGORY_BROWSABLE); - intent.setData(Uri.parse("http:")); - // Resolve that intent and check that the handleAllWebDataURI boolean is set - List list = mPm.queryIntentActivitiesAsUser(intent, PackageManager.MATCH_ALL, - mUserId); + List list = mPm.queryIntentActivitiesAsUser(BROWSE_PROBE, + PackageManager.MATCH_ALL, mUserId); final int count = list.size(); - for (int i=0; i list = mPm.queryIntentActivitiesAsUser(BROWSE_PROBE, + PackageManager.MATCH_ALL, mUserId); + if (list.size() == 1) { + return list.get(0).loadLabel(mPm); + } + return null; + } + private final Runnable mUpdateRunnable = new Runnable() { @Override public void run() { diff --git a/src/com/android/settings/applications/DefaultHomePreference.java b/src/com/android/settings/applications/DefaultHomePreference.java index 9f4a9130779..46fba66bb25 100644 --- a/src/com/android/settings/applications/DefaultHomePreference.java +++ b/src/com/android/settings/applications/DefaultHomePreference.java @@ -26,6 +26,7 @@ import android.content.pm.UserInfo; import android.os.Build; import android.os.UserManager; import android.util.AttributeSet; + import com.android.settings.AppListPreference; import com.android.settings.R; @@ -36,9 +37,11 @@ public class DefaultHomePreference extends AppListPreference { private final ArrayList mAllHomeComponents = new ArrayList<>(); private final IntentFilter mHomeFilter; + private final String mPackageName; public DefaultHomePreference(Context context, AttributeSet attrs) { super(context, attrs); + mPackageName = getContext().getPackageName(); mHomeFilter = new IntentFilter(Intent.ACTION_MAIN); mHomeFilter.addCategory(Intent.CATEGORY_HOME); mHomeFilter.addCategory(Intent.CATEGORY_DEFAULT); @@ -59,26 +62,44 @@ public class DefaultHomePreference extends AppListPreference { IntentFilter.MATCH_CATEGORY_EMPTY, mAllHomeComponents.toArray(new ComponentName[0]), component); setSummary(getEntry()); + } else { + // If there is only 1 launcher, use its label as summary text. + setSoleAppLabelAsSummary(); } return super.persistString(value); } + @Override + protected CharSequence getSoleAppLabel() { + final PackageManager pm = getContext().getPackageManager(); + final List homeActivities = new ArrayList<>(); + final List appLabels = new ArrayList<>(); + + pm.getHomeActivities(homeActivities); + for (ResolveInfo candidate : homeActivities) { + final ActivityInfo info = candidate.activityInfo; + if (info.packageName.equals(mPackageName)) { + continue; + } + appLabels.add(info.loadLabel(pm)); + } + return appLabels.size() == 1 ? appLabels.get(0) : null; + } + public void refreshHomeOptions() { - final String myPkg = getContext().getPackageName(); - ArrayList homeActivities = new ArrayList(); + ArrayList homeActivities = new ArrayList<>(); PackageManager pm = getContext().getPackageManager(); - ComponentName currentDefaultHome = pm.getHomeActivities(homeActivities); + ComponentName currentDefaultHome = pm.getHomeActivities(homeActivities); ArrayList components = new ArrayList<>(); mAllHomeComponents.clear(); List summaries = new ArrayList<>(); boolean mustSupportManagedProfile = hasManagedProfile(); - for (int i = 0; i < homeActivities.size(); i++) { - final ResolveInfo candidate = homeActivities.get(i); + for (ResolveInfo candidate : homeActivities) { final ActivityInfo info = candidate.activityInfo; ComponentName activityName = new ComponentName(info.packageName, info.name); mAllHomeComponents.add(activityName); - if (info.packageName.equals(myPkg)) { + if (info.packageName.equals(mPackageName)) { continue; } components.add(activityName);