summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorAbodunrinwa Toki <toki@google.com>2018-04-24 19:19:48 +0100
committerAbodunrinwa Toki <toki@google.com>2018-04-27 00:16:13 +0100
commit253827f207be31399a21c390f90ce3ffe4b020c0 (patch)
tree2ea19b0537a2cd9d1bd461ed6da831d768f13ac4 /core/java/android
parentabab4cbd2573aa9300e56dea1b9529ca7782573e (diff)
TC: Fix null PendingIntent being passed to RemoteAction
Problem was RemoteAction(...) takes a non-null PendingIntent but TextClassification.createPendingIntent(...) returns a nullable PendingIntent. Bug: 78515224 Test: manual - Disable Contacts apps in settings - Select a phone number in a TextView - Verify that a Phone smart action is displayed Test: bit FrameworksCoreTests:android.view.textclassifier.TextClassificationManagerTest Test: bit CtsViewTestCases:android.view.textclassifier.cts.TextClassificationManagerTest Change-Id: Icab581d4eef38b4801d1b9ee3af04ffefd1eec6f
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/view/textclassifier/SystemTextClassifier.java3
-rw-r--r--core/java/android/view/textclassifier/TextClassificationManager.java5
-rw-r--r--core/java/android/view/textclassifier/TextClassifierImpl.java22
3 files changed, 23 insertions, 7 deletions
diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java
index 490c389037e5..da86b559c5db 100644
--- a/core/java/android/view/textclassifier/SystemTextClassifier.java
+++ b/core/java/android/view/textclassifier/SystemTextClassifier.java
@@ -55,7 +55,8 @@ public final class SystemTextClassifier implements TextClassifier {
mManagerService = ITextClassifierService.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.TEXT_CLASSIFICATION_SERVICE));
mSettings = Preconditions.checkNotNull(settings);
- mFallback = new TextClassifierImpl(context, settings);
+ mFallback = context.getSystemService(TextClassificationManager.class)
+ .getTextClassifier(TextClassifier.LOCAL);
mPackageName = Preconditions.checkNotNull(context.getPackageName());
}
diff --git a/core/java/android/view/textclassifier/TextClassificationManager.java b/core/java/android/view/textclassifier/TextClassificationManager.java
index 262d9b852b82..1737861ee716 100644
--- a/core/java/android/view/textclassifier/TextClassificationManager.java
+++ b/core/java/android/view/textclassifier/TextClassificationManager.java
@@ -191,10 +191,11 @@ public final class TextClassificationManager {
synchronized (mLock) {
if (mLocalTextClassifier == null) {
if (mSettings.isLocalTextClassifierEnabled()) {
- mLocalTextClassifier = new TextClassifierImpl(mContext, mSettings);
+ mLocalTextClassifier =
+ new TextClassifierImpl(mContext, mSettings, TextClassifier.NO_OP);
} else {
Log.d(LOG_TAG, "Local TextClassifier disabled");
- mLocalTextClassifier = TextClassifierImpl.NO_OP;
+ mLocalTextClassifier = TextClassifier.NO_OP;
}
}
return mLocalTextClassifier;
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index 910fcaace159..2cf265d58b74 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -21,6 +21,7 @@ import static java.time.temporal.ChronoUnit.MILLIS;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.WorkerThread;
+import android.app.PendingIntent;
import android.app.RemoteAction;
import android.app.SearchManager;
import android.content.ComponentName;
@@ -98,13 +99,18 @@ public final class TextClassifierImpl implements TextClassifier {
private final TextClassificationConstants mSettings;
- public TextClassifierImpl(Context context, TextClassificationConstants settings) {
+ public TextClassifierImpl(
+ Context context, TextClassificationConstants settings, TextClassifier fallback) {
mContext = Preconditions.checkNotNull(context);
- mFallback = TextClassifier.NO_OP;
+ mFallback = Preconditions.checkNotNull(fallback);
mSettings = Preconditions.checkNotNull(settings);
mGenerateLinksLogger = new GenerateLinksLogger(mSettings.getGenerateLinksLogSampleRate());
}
+ public TextClassifierImpl(Context context, TextClassificationConstants settings) {
+ this(context, settings, TextClassifier.NO_OP);
+ }
+
/** @inheritDoc */
@Override
@WorkerThread
@@ -413,6 +419,9 @@ public final class TextClassifierImpl implements TextClassifier {
for (LabeledIntent labeledIntent : IntentFactory.create(
mContext, referenceTime, highestScoringResult, classifiedText)) {
final RemoteAction action = labeledIntent.asRemoteAction(mContext);
+ if (action == null) {
+ continue;
+ }
if (isPrimaryAction) {
// For O backwards compatibility, the first RemoteAction is also written to the
// legacy API fields.
@@ -601,6 +610,7 @@ public final class TextClassifierImpl implements TextClassifier {
return mRequestCode;
}
+ @Nullable
RemoteAction asRemoteAction(Context context) {
final PackageManager pm = context.getPackageManager();
final ResolveInfo resolveInfo = pm.resolveActivity(mIntent, 0);
@@ -622,8 +632,12 @@ public final class TextClassifierImpl implements TextClassifier {
icon = Icon.createWithResource("android",
com.android.internal.R.drawable.ic_more_items);
}
- final RemoteAction action = new RemoteAction(icon, mTitle, mDescription,
- TextClassification.createPendingIntent(context, mIntent, mRequestCode));
+ final PendingIntent pendingIntent =
+ TextClassification.createPendingIntent(context, mIntent, mRequestCode);
+ if (pendingIntent == null) {
+ return null;
+ }
+ final RemoteAction action = new RemoteAction(icon, mTitle, mDescription, pendingIntent);
action.setShouldShowIcon(shouldShowIcon);
return action;
}