diff options
| author | Makoto Onuki <omakoto@google.com> | 2018-02-21 17:22:28 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-02-21 17:22:28 +0000 |
| commit | 2ebb02123122d6ef3b0cf5c115c2ea4e19319496 (patch) | |
| tree | ece8f5b017c174f0d40f9f7440f06f9bac0c837c /core/java/android | |
| parent | f1862955845e8faaea1b40f179cae578a70119ff (diff) | |
| parent | 700feef8a60e06784d28d1db9502e650df854cad (diff) | |
Merge "Shortcut permissions for default text classifier"
Diffstat (limited to 'core/java/android')
7 files changed, 127 insertions, 26 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 13117bcbc929..f8f50a278511 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -2802,4 +2802,13 @@ public class ApplicationPackageManager extends PackageManager { return mArtManager; } } + + @Override + public String getSystemTextClassifierPackageName() { + try { + return mPM.getSystemTextClassifierPackageName(); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 379bff49c911..36a74a489890 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -660,4 +660,6 @@ interface IPackageManager { boolean hasSigningCertificate(String packageName, in byte[] signingCertificate, int flags); boolean hasUidSigningCertificate(int uid, in byte[] signingCertificate, int flags); + + String getSystemTextClassifierPackageName(); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 07a991188a49..bd7961fffca8 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -6022,4 +6022,14 @@ public abstract class PackageManager { throw new UnsupportedOperationException( "hasSigningCertificate not implemented in subclass"); } + + /** + * @return the system defined text classifier package name, or null if there's none. + * + * @hide + */ + public String getSystemTextClassifierPackageName() { + throw new UnsupportedOperationException( + "getSystemTextClassifierPackageName not implemented in subclass"); + } } diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 6f093ba8d005..41aa9c374978 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -43,12 +43,14 @@ public abstract class PackageManagerInternal { public static final int PACKAGE_INSTALLER = 2; public static final int PACKAGE_VERIFIER = 3; public static final int PACKAGE_BROWSER = 4; + public static final int PACKAGE_SYSTEM_TEXT_CLASSIFIER = 5; @IntDef(value = { PACKAGE_SYSTEM, PACKAGE_SETUP_WIZARD, PACKAGE_INSTALLER, PACKAGE_VERIFIER, PACKAGE_BROWSER, + PACKAGE_SYSTEM_TEXT_CLASSIFIER, }) @Retention(RetentionPolicy.SOURCE) public @interface KnownPackage {} diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 9e4166eaec1b..2420b639d678 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3185,7 +3185,7 @@ public class PackageParser { perm.info.protectionLevel = PermissionInfo.fixProtectionLevel(perm.info.protectionLevel); - if ((perm.info.protectionLevel&PermissionInfo.PROTECTION_MASK_FLAGS) != 0) { + if (perm.info.getProtectionFlags() != 0) { if ( (perm.info.protectionLevel&PermissionInfo.PROTECTION_FLAG_INSTANT) == 0 && (perm.info.protectionLevel&PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) == 0 && (perm.info.protectionLevel&PermissionInfo.PROTECTION_MASK_BASE) != diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index 21bd7f0ce763..938409af90e9 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -16,12 +16,16 @@ package android.content.pm; +import android.annotation.IntDef; import android.annotation.SystemApi; import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Information you can retrieve about a particular security permission * known to the system. This corresponds to information collected from the @@ -56,6 +60,16 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { @Deprecated public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3; + /** @hide */ + @IntDef(flag = false, prefix = { "PROTECTION_" }, value = { + PROTECTION_NORMAL, + PROTECTION_DANGEROUS, + PROTECTION_SIGNATURE, + PROTECTION_SIGNATURE_OR_SYSTEM, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface Protection {} + /** * Additional flag for {@link #protectionLevel}, corresponding * to the <code>privileged</code> value of @@ -155,30 +169,71 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 0x8000; /** + * Additional flag for {@link #protectionLevel}, corresponding + * to the <code>text_classifier</code> value of + * {@link android.R.attr#protectionLevel}. + * + * @hide + */ + @SystemApi + @TestApi + public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 0x10000; + + /** @hide */ + @IntDef(flag = true, prefix = { "PROTECTION_FLAG_" }, value = { + PROTECTION_FLAG_PRIVILEGED, + PROTECTION_FLAG_SYSTEM, + PROTECTION_FLAG_DEVELOPMENT, + PROTECTION_FLAG_APPOP, + PROTECTION_FLAG_PRE23, + PROTECTION_FLAG_INSTALLER, + PROTECTION_FLAG_VERIFIER, + PROTECTION_FLAG_PREINSTALLED, + PROTECTION_FLAG_SETUP, + PROTECTION_FLAG_INSTANT, + PROTECTION_FLAG_RUNTIME_ONLY, + PROTECTION_FLAG_OEM, + PROTECTION_FLAG_VENDOR_PRIVILEGED, + PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ProtectionFlags {} + + /** * Mask for {@link #protectionLevel}: the basic protection type. + * + * @deprecated Use #getProtection() instead. */ + @Deprecated public static final int PROTECTION_MASK_BASE = 0xf; /** * Mask for {@link #protectionLevel}: additional flag bits. + * + * @deprecated Use #getProtectionFlags() instead. */ + @Deprecated public static final int PROTECTION_MASK_FLAGS = 0xfff0; /** * The level of access this permission is protecting, as per * {@link android.R.attr#protectionLevel}. Consists of - * a base permission type and zero or more flags: + * a base permission type and zero or more flags. Use the following functions + * to extract them. * * <pre> - * int basePermissionType = protectionLevel & {@link #PROTECTION_MASK_BASE}; - * int permissionFlags = protectionLevel & {@link #PROTECTION_MASK_FLAGS}; + * int basePermissionType = permissionInfo.getProtection(); + * int permissionFlags = permissionInfo.getProtectionFlags(); * </pre> * * <p></p>Base permission types are {@link #PROTECTION_NORMAL}, * {@link #PROTECTION_DANGEROUS}, {@link #PROTECTION_SIGNATURE} * and the deprecated {@link #PROTECTION_SIGNATURE_OR_SYSTEM}. * Flags are listed under {@link android.R.attr#protectionLevel}. + * + * @deprecated Use #getProtection() and #getProtectionFlags() instead. */ + @Deprecated public int protectionLevel; /** @@ -304,6 +359,9 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { if ((level & PermissionInfo.PROTECTION_FLAG_VENDOR_PRIVILEGED) != 0) { protLevel += "|vendorPrivileged"; } + if ((level & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER) != 0) { + protLevel += "|textClassifier"; + } return protLevel; } @@ -344,6 +402,22 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { return null; } + /** + * Return the base permission type. + */ + @Protection + public int getProtection() { + return protectionLevel & PROTECTION_MASK_BASE; + } + + /** + * Return the additional flags in {@link #protectionLevel}. + */ + @ProtectionFlags + public int getProtectionFlags() { + return protectionLevel & ~PROTECTION_MASK_BASE; + } + @Override public String toString() { return "PermissionInfo{" diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java index 6c8c8bc36127..2c8c4ecaa610 100644 --- a/core/java/android/service/textclassifier/TextClassifierService.java +++ b/core/java/android/service/textclassifier/TextClassifierService.java @@ -26,6 +26,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.os.CancellationSignal; import android.os.IBinder; @@ -37,8 +38,6 @@ import android.view.textclassifier.TextClassifier; import android.view.textclassifier.TextLinks; import android.view.textclassifier.TextSelection; -import com.android.internal.R; - /** * Abstract base class for the TextClassifier service. * @@ -263,28 +262,33 @@ public abstract class TextClassifierService extends Service { */ @Nullable public static ComponentName getServiceComponentName(Context context) { - final String str = context.getString(R.string.config_defaultTextClassifierService); - if (!TextUtils.isEmpty(str)) { - try { - final ComponentName componentName = ComponentName.unflattenFromString(str); - final Intent intent = new Intent(SERVICE_INTERFACE).setComponent(componentName); - final ServiceInfo si = context.getPackageManager() - .getServiceInfo(intent.getComponent(), 0); - final String permission = si == null ? null : si.permission; - if (Manifest.permission.BIND_TEXTCLASSIFIER_SERVICE.equals(permission)) { - return componentName; - } - Slog.w(LOG_TAG, String.format( - "Service %s should require %s permission. Found %s permission", - intent.getComponent().flattenToString(), - Manifest.permission.BIND_TEXTCLASSIFIER_SERVICE, - si.permission)); - } catch (PackageManager.NameNotFoundException e) { - Slog.w(LOG_TAG, String.format("Service %s not found", str)); - } - } else { + final String packageName = context.getPackageManager().getSystemTextClassifierPackageName(); + if (TextUtils.isEmpty(packageName)) { Slog.d(LOG_TAG, "No configured system TextClassifierService"); + return null; + } + + final Intent intent = new Intent(SERVICE_INTERFACE).setPackage(packageName); + + final ResolveInfo ri = context.getPackageManager().resolveService(intent, + PackageManager.MATCH_SYSTEM_ONLY); + + if ((ri == null) || (ri.serviceInfo == null)) { + Slog.w(LOG_TAG, String.format("Package or service not found in package %s", + packageName)); + return null; + } + final ServiceInfo si = ri.serviceInfo; + + final String permission = si.permission; + if (Manifest.permission.BIND_TEXTCLASSIFIER_SERVICE.equals(permission)) { + return si.getComponentName(); } + Slog.w(LOG_TAG, String.format( + "Service %s should require %s permission. Found %s permission", + si.getComponentName(), + Manifest.permission.BIND_TEXTCLASSIFIER_SERVICE, + si.permission)); return null; } } |
