Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad0d9e01 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Grant notification listener access to overlay pkgs

Test: manual
Change-Id: I935b701507cd8eafec991b03ac67364e9830d757
parent a1d54802
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2764,4 +2764,7 @@
         and followed the pertinent sections of the escrow tokens section of the CDD <link>-->
    <!-- TODO(b/35230407) complete the link field -->
    <bool name="config_allowEscrowTokenForTrustAgent">false</bool>

    <!-- Colon separated list of package names that should be granted Notification Listener access -->
    <string name="config_defaultListenerAccessPackages" translatable="false"></string>
</resources>
+2 −0
Original line number Diff line number Diff line
@@ -2878,4 +2878,6 @@
  <java-symbol type="string" name="alert_windows_notification_turn_off_action" />
  <java-symbol type="drawable" name="alert_window_layer" />

  <!-- Colon separated list of package names that should be granted Notification Listener access -->
  <java-symbol type="string" name="config_defaultListenerAccessPackages" />
</resources>
+60 −2
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.database.Cursor;
import android.database.MatrixCursor;
@@ -58,7 +60,7 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManagerInternal;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.service.notification.NotificationListenerService;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -2735,7 +2737,7 @@ public class SettingsProvider extends ContentProvider {
        }

        private final class UpgradeController {
            private static final int SETTINGS_VERSION = 140;
            private static final int SETTINGS_VERSION = 141;

            private final int mUserId;

@@ -3204,6 +3206,62 @@ public class SettingsProvider extends ContentProvider {
                    currentVersion = 140;
                }

                if (currentVersion == 140) {
                    // Version 141: One-time grant of notification listener privileges
                    // to packages specified in overlay.
                    String defaultListenerAccess = getContext().getResources().getString(
                            com.android.internal.R.string.config_defaultListenerAccessPackages);
                    if (defaultListenerAccess != null) {
                        StringBuffer newListeners = new StringBuffer();
                        for (String whitelistPkg : defaultListenerAccess.split(":")) {
                            // Gather all notification listener components for candidate pkgs.
                            Intent serviceIntent =
                                    new Intent(NotificationListenerService.SERVICE_INTERFACE)
                                            .setPackage(whitelistPkg);
                            List<ResolveInfo> installedServices =
                                    getContext().getPackageManager().queryIntentServicesAsUser(
                                            serviceIntent,
                                            PackageManager.GET_SERVICES
                                                    | PackageManager.GET_META_DATA
                                                    | PackageManager.MATCH_DIRECT_BOOT_AWARE
                                                    | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                                            userId);

                            for (int i = 0, count = installedServices.size(); i < count; i++) {
                                ResolveInfo resolveInfo = installedServices.get(i);
                                ServiceInfo info = resolveInfo.serviceInfo;
                                if (!android.Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
                                        .equals(info.permission)) {
                                    continue;
                                }
                                newListeners.append(":")
                                        .append(info.getComponentName().flattenToString());
                            }
                        }

                        if (newListeners.length() > 0) {
                            final SettingsState secureSetting = getSecureSettingsLocked(userId);
                            final Setting existingSetting = secureSetting.getSettingLocked(
                                    Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
                            if (existingSetting.isNull()) {
                                secureSetting.insertSettingLocked(
                                        Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
                                        newListeners.toString(), null, true,
                                        SettingsState.SYSTEM_PACKAGE_NAME);
                            } else {
                                StringBuilder currentSetting =
                                        new StringBuilder(existingSetting.getValue());
                                currentSetting.append(newListeners.toString());
                                secureSetting.updateSettingLocked(
                                        Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
                                        currentSetting.toString(), null, true,
                                        SettingsState.SYSTEM_PACKAGE_NAME);
                            }
                        }
                    }
                    currentVersion = 141;
                }

                if (currentVersion != newVersion) {
                    Slog.wtf("SettingsProvider", "warning: upgrading settings database to version "
                            + newVersion + " left it at "