Add default app prefs to app info

This makes them easier to discover and to know the state of them.

Bug: 27276982
Change-Id: I24a9d34d7e189b19df39cc0b9028b6412f76aa05
This commit is contained in:
Jason Monk
2016-02-23 17:28:29 -05:00
parent 91e2f89b0f
commit 2108d361bb
11 changed files with 270 additions and 12 deletions

View File

@@ -136,7 +136,8 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
PackageManager.GET_DISABLED_COMPONENTS |
PackageManager.GET_UNINSTALLED_PACKAGES |
PackageManager.GET_SIGNATURES);
PackageManager.GET_SIGNATURES |
PackageManager.GET_PERMISSIONS);
} catch (NameNotFoundException e) {
Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
}

View File

@@ -43,7 +43,8 @@ public abstract class AppStateBaseBridge implements ApplicationsState.Callbacks
// Running on the same background thread as the ApplicationsState lets
// us run in the background and make sure they aren't doing updates at
// the same time as us as well.
mHandler = new BackgroundHandler(mAppState.getBackgroundLooper());
mHandler = new BackgroundHandler(mAppState != null ? mAppState.getBackgroundLooper()
: Looper.getMainLooper());
mMainHandler = new MainHandler();
}

View File

@@ -22,6 +22,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
@@ -172,4 +173,21 @@ public class DefaultBrowserPreference extends AppListPreference {
mHandler.postDelayed(mUpdateRunnable, DELAY_UPDATE_BROWSER_MILLIS);
}
};
public static boolean hasBrowserPreference(String pkg, Context context) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse("http:"));
intent.setPackage(pkg);
final List<ResolveInfo> resolveInfos =
context.getPackageManager().queryIntentActivities(intent, 0);
return resolveInfos != null && resolveInfos.size() != 0;
}
public static boolean isBrowserDefault(String pkg, Context context) {
String defaultPackage = context.getPackageManager()
.getDefaultBrowserPackageNameAsUser(UserHandle.myUserId());
return defaultPackage != null && defaultPackage.equals(pkg);
}
}

View File

@@ -16,6 +16,7 @@
package com.android.settings.applications;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
@@ -29,6 +30,7 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.AttributeSet;
import com.android.internal.telephony.SmsApplication;
import com.android.settings.AppListPreference;
import com.android.settings.SelfAvailablePreference;
@@ -146,4 +148,18 @@ public class DefaultEmergencyPreference extends AppListPreference
return isCapable(context)
&& context.getPackageManager().resolveActivity(QUERY_INTENT, 0) != null;
}
public static boolean hasEmergencyPreference(String pkg, Context context) {
Intent i = new Intent(QUERY_INTENT);
i.setPackage(pkg);
final List<ResolveInfo> resolveInfos =
context.getPackageManager().queryIntentActivities(i, 0);
return resolveInfos != null && resolveInfos.size() != 0;
}
public static boolean isEmergencyDefault(String pkg, Context context) {
String defaultPackage = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION);
return defaultPackage != null && defaultPackage.equals(pkg);
}
}

View File

@@ -114,4 +114,24 @@ public class DefaultHomePreference extends AppListPreference {
}
return false;
}
public static boolean hasHomePreference(String pkg, Context context) {
ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
PackageManager pm = context.getPackageManager();
pm.getHomeActivities(homeActivities);
for (int i = 0; i < homeActivities.size(); i++) {
if (homeActivities.get(i).activityInfo.packageName.equals(pkg)) {
return true;
}
}
return false;
}
public static boolean isHomeDefault(String pkg, Context context) {
ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
PackageManager pm = context.getPackageManager();
ComponentName def = pm.getHomeActivities(homeActivities);
return def != null && def.getPackageName().equals(pkg);
}
}

View File

@@ -17,6 +17,7 @@
package com.android.settings.applications;
import android.content.Context;
import android.os.UserHandle;
import android.os.UserManager;
import android.telecom.DefaultDialerManager;
import android.telephony.TelephonyManager;
@@ -74,4 +75,16 @@ public class DefaultPhonePreference extends AppListPreference implements SelfAva
(UserManager) context.getSystemService(Context.USER_SERVICE);
return !um.hasUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS);
}
public static boolean hasPhonePreference(String pkg, Context context) {
List<String> dialerPackages =
DefaultDialerManager.getInstalledDialerApplications(context, UserHandle.myUserId());
return dialerPackages.contains(pkg);
}
public static boolean isPhoneDefault(String pkg, Context context) {
String def = DefaultDialerManager.getDefaultDialerApplication(context,
UserHandle.myUserId());
return def != null && def.equals(pkg);
}
}

View File

@@ -77,4 +77,20 @@ public class DefaultSmsPreference extends AppListPreference implements SelfAvail
(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return !isRestrictedUser && tm.isSmsCapable();
}
public static boolean hasSmsPreference(String pkg, Context context) {
Collection<SmsApplicationData> smsApplications =
SmsApplication.getApplicationCollection(context);
for (SmsApplicationData data : smsApplications) {
if (data.mPackageName.equals(pkg)) {
return true;
}
}
return false;
}
public static boolean isSmsDefault(String pkg, Context context) {
ComponentName appName = SmsApplication.getDefaultSmsApplication(context, true);
return appName != null && appName.getPackageName().equals(pkg);
}
}

View File

@@ -156,13 +156,17 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc
}
public static CharSequence getSummary(Context context, AppEntry entry) {
if (entry.extraInfo != null) {
return getSummary(context, new OverlayState((PermissionState)entry.extraInfo));
OverlayState state;
if (entry.extraInfo instanceof OverlayState) {
state = (OverlayState) entry.extraInfo;
} else if (entry.extraInfo instanceof PermissionState) {
state = new OverlayState((PermissionState) entry.extraInfo);
} else {
state = new AppStateOverlayBridge(context, null, null).getOverlayInfo(
entry.info.packageName, entry.info.uid);
}
// fallback if for whatever reason entry.extrainfo is null - the result
// may be less accurate
return getSummary(context, entry.info.packageName);
return getSummary(context, state);
}
public static CharSequence getSummary(Context context, OverlayState overlayState) {

View File

@@ -16,6 +16,7 @@
package com.android.settings.applications;
import android.Manifest.permission;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
@@ -51,6 +52,8 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.format.Formatter;
@@ -285,6 +288,7 @@ public class InstalledAppDetails extends AppInfoBase
setHasOptionsMenu(true);
addPreferencesFromResource(R.xml.installed_app_details);
addDynamicPrefs();
if (Utils.isBandwidthControlEnabled()) {
INetworkStatsService statsService = INetworkStatsService.Stub.asInterface(
@@ -321,6 +325,7 @@ public class InstalledAppDetails extends AppInfoBase
}
new BatteryUpdater().execute();
new MemoryUpdater().execute();
updateDynamicPrefs();
}
@Override
@@ -806,6 +811,119 @@ public class InstalledAppDetails extends AppInfoBase
return true;
}
private void addDynamicPrefs() {
if (Utils.isManagedProfile(UserManager.get(getContext()))) {
return;
}
final PreferenceScreen screen = getPreferenceScreen();
if (DefaultHomePreference.hasHomePreference(mPackageName, getContext())) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
AdvancedAppSettings.class, "default_home", R.string.home_app,
R.string.configure_apps));
}
if (DefaultBrowserPreference.hasBrowserPreference(mPackageName, getContext())) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
AdvancedAppSettings.class, "default_browser", R.string.default_browser_title,
R.string.configure_apps));
}
if (DefaultPhonePreference.hasPhonePreference(mPackageName, getContext())) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
AdvancedAppSettings.class, "default_phone_app", R.string.default_phone_title,
R.string.configure_apps));
}
if (DefaultEmergencyPreference.hasEmergencyPreference(mPackageName, getContext())) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
AdvancedAppSettings.class, "default_emergency_app",
R.string.default_emergency_app, R.string.configure_apps));
}
if (DefaultSmsPreference.hasSmsPreference(mPackageName, getContext())) {
screen.addPreference(new ShortcutPreference(getPrefContext(),
AdvancedAppSettings.class, "default_sms_app", R.string.sms_application_title,
R.string.configure_apps));
}
boolean hasDrawOverOtherApps = hasPermission(permission.SYSTEM_ALERT_WINDOW);
boolean hasWriteSettings = hasPermission(permission.WRITE_SETTINGS);
if (hasDrawOverOtherApps || hasWriteSettings) {
PreferenceCategory category = new PreferenceCategory(getPrefContext());
category.setTitle(R.string.advanced_apps);
screen.addPreference(category);
if (hasDrawOverOtherApps) {
Preference pref = new Preference(getPrefContext());
pref.setTitle(R.string.draw_overlay);
pref.setKey("system_alert_window");
pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startAppInfoFragment(DrawOverlayDetails.class,
getString(R.string.draw_overlay));
return true;
}
});
category.addPreference(pref);
}
if (hasWriteSettings) {
Preference pref = new Preference(getPrefContext());
pref.setTitle(R.string.write_settings);
pref.setKey("write_settings_apps");
pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startAppInfoFragment(WriteSettingsDetails.class,
getString(R.string.write_settings));
return true;
}
});
category.addPreference(pref);
}
}
}
private boolean hasPermission(String permission) {
for (int i = 0; i < mPackageInfo.requestedPermissions.length; i++) {
if (mPackageInfo.requestedPermissions[i].equals(permission)) {
return true;
}
}
return false;
}
private void updateDynamicPrefs() {
Preference pref = findPreference("default_home");
if (pref != null) {
pref.setSummary(DefaultHomePreference.isHomeDefault(mPackageName, getContext())
? R.string.yes : R.string.no);
}
pref = findPreference("default_browser");
if (pref != null) {
pref.setSummary(DefaultBrowserPreference.isBrowserDefault(mPackageName, getContext())
? R.string.yes : R.string.no);
}
pref = findPreference("default_phone_app");
if (pref != null) {
pref.setSummary(DefaultPhonePreference.isPhoneDefault(mPackageName, getContext())
? R.string.yes : R.string.no);
}
pref = findPreference("default_emergency_app");
if (pref != null) {
pref.setSummary(DefaultEmergencyPreference.isEmergencyDefault(mPackageName,
getContext()) ? R.string.yes : R.string.no);
}
pref = findPreference("default_sms_app");
if (pref != null) {
pref.setSummary(DefaultSmsPreference.isSmsDefault(mPackageName, getContext())
? R.string.yes : R.string.no);
}
pref = findPreference("system_alert_window");
if (pref != null) {
pref.setSummary(DrawOverlayDetails.getSummary(getContext(), mAppEntry));
}
pref = findPreference("write_settings_apps");
if (pref != null) {
pref.setSummary(WriteSettingsDetails.getSummary(getContext(), mAppEntry));
}
}
public static void setupAppSnippet(View appSnippet, CharSequence label, Drawable icon,
CharSequence versionName) {
LayoutInflater.from(appSnippet.getContext()).inflate(R.layout.widget_text_views,

View File

@@ -0,0 +1,47 @@
/*
* Copyright (C) 2016 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;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
public class ShortcutPreference extends Preference {
private final Class mTarget;
private final String mPrefKey;
private final int mTitle;
public ShortcutPreference(Context context, Class target, String prefKey, int prefTitle,
int title) {
super(context);
mTarget = target;
mPrefKey = prefKey;
mTitle = title;
setTitle(prefTitle);
setKey(mPrefKey);
}
@Override
public void performClick() {
super.performClick();
Bundle bundle = new Bundle();
bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, mPrefKey);
Utils.startWithFragment(getContext(), mTarget.getName(), bundle, null, 0,
mTitle, null);
}
}

View File

@@ -158,13 +158,17 @@ public class WriteSettingsDetails extends AppInfoWithHeader implements OnPrefere
}
public static CharSequence getSummary(Context context, AppEntry entry) {
if (entry.extraInfo != null) {
return getSummary(context, new WriteSettingsState((PermissionState)entry
.extraInfo));
WriteSettingsState state;
if (entry.extraInfo instanceof WriteSettingsState) {
state = (WriteSettingsState) entry.extraInfo;
} else if (entry.extraInfo instanceof PermissionState) {
state = new WriteSettingsState((PermissionState) entry.extraInfo);
} else {
state = new AppStateWriteSettingsBridge(context, null, null).getWriteSettingsInfo(
entry.info.packageName, entry.info.uid);
}
// fallback if entry.extrainfo is null - although this should not happen
return getSummary(context, entry.info.packageName);
return getSummary(context, state);
}
public static CharSequence getSummary(Context context, WriteSettingsState writeSettingsState) {