diff --git a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java index 9ea8c58024f..74b8102ee2c 100644 --- a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java +++ b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java @@ -31,13 +31,15 @@ import android.app.admin.DevicePolicyManager; 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; @@ -48,6 +50,8 @@ import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; import com.android.settings.R; +import java.util.List; + /** @hide */ public class NotificationAccessConfirmationActivity extends Activity implements DialogInterface { @@ -112,6 +116,31 @@ public class NotificationAccessConfirmationActivity extends Activity return; } + // Check NLS service info. + String requiredPermission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE; + Intent NLSIntent = new Intent(NotificationListenerService.SERVICE_INTERFACE); + List 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, @@ -146,19 +175,6 @@ public class NotificationAccessConfirmationActivity extends Activity } 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(); @@ -169,12 +185,6 @@ public class NotificationAccessConfirmationActivity extends Activity return AlertActivity.dispatchPopulateAccessibilityEvent(this, event); } - @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 86631ffb2d4..788f853e19b 100644 --- a/tests/robotests/src/com/android/settings/notification/NotificationAccessConfirmationActivityTest.java +++ b/tests/robotests/src/com/android/settings/notification/NotificationAccessConfirmationActivityTest.java @@ -30,8 +30,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.widget.TextView; -import com.android.settings.R; - import com.google.common.base.Strings; import org.junit.Test; @@ -44,15 +42,14 @@ import org.robolectric.RuntimeEnvironment; 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