Loading src/com/android/settings/notification/NotificationAccessConfirmationActivity.java +30 −20 Original line number Diff line number Diff line Loading @@ -30,13 +30,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; Loading @@ -49,6 +51,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 { Loading Loading @@ -113,6 +117,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<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, Loading Loading @@ -147,19 +176,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(); Loading @@ -170,12 +186,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(); Loading tests/robotests/src/com/android/settings/notification/NotificationAccessConfirmationActivityTest.java +3 −6 Original line number Diff line number Diff line Loading @@ -31,8 +31,6 @@ import android.widget.TextView; import androidx.annotation.Nullable; import com.android.settings.R; import com.google.common.base.Strings; import org.junit.Test; Loading @@ -45,15 +43,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 Loading Loading
src/com/android/settings/notification/NotificationAccessConfirmationActivity.java +30 −20 Original line number Diff line number Diff line Loading @@ -30,13 +30,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; Loading @@ -49,6 +51,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 { Loading Loading @@ -113,6 +117,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<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, Loading Loading @@ -147,19 +176,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(); Loading @@ -170,12 +186,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(); Loading
tests/robotests/src/com/android/settings/notification/NotificationAccessConfirmationActivityTest.java +3 −6 Original line number Diff line number Diff line Loading @@ -31,8 +31,6 @@ import android.widget.TextView; import androidx.annotation.Nullable; import com.android.settings.R; import com.google.common.base.Strings; import org.junit.Test; Loading @@ -45,15 +43,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 Loading