Merge "[CDM][NLS] Check if the NLS service has an intent-filter" into main
diff --git a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java
index 3f300c0..1adeb64 100644
--- a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java
+++ b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java
@@ -30,13 +30,15 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
-import android.content.pm.ServiceInfo;
+import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
+import android.service.notification.NotificationListenerService;
import android.text.TextUtils;
import android.util.Slog;
import android.view.WindowManager;
@@ -49,6 +51,8 @@
import com.android.internal.app.AlertController;
import com.android.settings.R;
+import java.util.List;
+
/** @hide */
public class NotificationAccessConfirmationActivity extends Activity
implements DialogInterface {
@@ -113,6 +117,31 @@
return;
}
+ // Check NLS service info.
+ String requiredPermission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
+ Intent NLSIntent = new Intent(NotificationListenerService.SERVICE_INTERFACE);
+ List<ResolveInfo> matchedServiceList = getPackageManager().queryIntentServicesAsUser(
+ NLSIntent, /* flags */ 0, mUserId);
+ boolean hasNLSIntentFilter = false;
+ for (ResolveInfo service : matchedServiceList) {
+ if (service.serviceInfo.packageName.equals(mComponentName.getPackageName())) {
+ if (!requiredPermission.equals(service.serviceInfo.permission)) {
+ Slog.e(LOG_TAG, "Service " + mComponentName + " lacks permission "
+ + requiredPermission);
+ finish();
+ return;
+ }
+ hasNLSIntentFilter = true;
+ break;
+ }
+ }
+ if (!hasNLSIntentFilter) {
+ Slog.e(LOG_TAG, "Service " + mComponentName + " lacks an intent-filter action "
+ + "for android.service.notification.NotificationListenerService.");
+ finish();
+ return;
+ }
+
AlertController.AlertParams p = new AlertController.AlertParams(this);
p.mTitle = getString(
R.string.notification_listener_security_warning_title,
@@ -147,19 +176,6 @@
}
private void onAllow() {
- String requiredPermission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
- try {
- ServiceInfo serviceInfo = getPackageManager().getServiceInfo(mComponentName, 0);
- if (!requiredPermission.equals(serviceInfo.permission)) {
- Slog.e(LOG_TAG,
- "Service " + mComponentName + " lacks permission " + requiredPermission);
- return;
- }
- } catch (PackageManager.NameNotFoundException e) {
- Slog.e(LOG_TAG, "Failed to get service info for " + mComponentName, e);
- return;
- }
-
mNm.setNotificationListenerAccessGranted(mComponentName, true);
finish();
@@ -171,12 +187,6 @@
}
@Override
- public void onBackPressed() {
- // Suppress finishing the activity on back button press,
- // consistently with the permission dialog behavior
- }
-
- @Override
public void cancel() {
finish();
}
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationAccessConfirmationActivityTest.java b/tests/robotests/src/com/android/settings/notification/NotificationAccessConfirmationActivityTest.java
index 9b510fb..0a95361 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationAccessConfirmationActivityTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationAccessConfirmationActivityTest.java
@@ -31,8 +31,6 @@
import androidx.annotation.Nullable;
-import com.android.settings.R;
-
import com.google.common.base.Strings;
import org.junit.Test;
@@ -45,15 +43,14 @@
public class NotificationAccessConfirmationActivityTest {
@Test
- public void start_showsDialog() {
+ public void start_withMissingIntentFilter_finishes() {
ComponentName cn = new ComponentName("com.example", "com.example.SomeService");
installPackage(cn.getPackageName(), "X");
NotificationAccessConfirmationActivity activity = startActivityWithIntent(cn);
- assertThat(activity.isFinishing()).isFalse();
- assertThat(getDialogText(activity)).isEqualTo(
- activity.getString(R.string.notification_listener_security_warning_summary, "X"));
+ assertThat(getDialogText(activity)).isNull();
+ assertThat(activity.isFinishing()).isTrue();
}
@Test