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

Commit 0f3dd6d1 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Allow users to pick a notification assistant.

Test: manual. select and deselect an assistant, and verify that
the assistant can and then cannot get notification events.

Change-Id: If89c77f37170a44c827f997631aa7413da5a83e2
parent e185c5cc
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -6252,6 +6252,9 @@
    <!-- [CHAR LIMIT=180] Notification importance summary -->
    <string name="show_silently_summary">Don\'t make sound, vibrate, or peek these notifications into view on the current screen.</string>
    <!-- Default Apps > Default notification assistant -->
    <string name="default_notification_assistant">Notification assistant</string>
    <!-- Sound & notification > Advanced section: Title for managing notification listeners option. [CHAR LIMIT=30] -->
    <string name="manage_notification_access_title">Notification access</string>
+4 −0
Original line number Diff line number Diff line
@@ -66,6 +66,10 @@
            android:title="@string/sms_application_title"
            settings:keywords="@string/keywords_more_default_sms_app" />

        <com.android.settings.applications.DefaultNotificationAssistantPreference
            android:key="default_notification_asst_app"
            android:title="@string/default_notification_assistant" />

    </PreferenceCategory>

    <com.android.settings.WorkOnlyCategory
+5 −0
Original line number Diff line number Diff line
@@ -56,6 +56,11 @@
        settings:keywords="@string/keywords_emergency_app"
        android:order="-15"/>

    <com.android.settings.applications.DefaultNotificationAssistantPreference
        android:key="default_notification_asst_app"
        android:title="@string/default_notification_assistant"
        android:order="-14"/>

    <Preference
        android:key="domain_urls"
        android:title="@string/domain_urls_title"
+12 −5
Original line number Diff line number Diff line
@@ -201,14 +201,21 @@ public class AppListPreference extends CustomListPreference {
            try {
                ActivityInfo activityInfo = AppGlobals.getPackageManager().getActivityInfo(
                        componentNames[i], 0, mUserId);
                if (activityInfo == null) continue;
                if (activityInfo != null) {
                    applicationNames.add(activityInfo.loadLabel(pm));
                    validatedComponentNames.add(componentNames[i].flattenToString());
                    entryDrawables.add(activityInfo.loadIcon(pm));
                } else {
                    ApplicationInfo appInfo = pm.getApplicationInfoAsUser(
                            componentNames[i].getPackageName().toString(), 0, mUserId);
                    applicationNames.add(appInfo.loadLabel(pm));
                    validatedComponentNames.add(componentNames[i].flattenToString());
                    entryDrawables.add(appInfo.loadIcon(pm));
                }
                if (defaultCN != null && componentNames[i].equals(defaultCN)) {
                    selectedIndex = i;
                }
            } catch (RemoteException e) {
            } catch (RemoteException|NameNotFoundException e) {
                // Skip unknown packages.
            }
        }
+111 −0
Original line number Diff line number Diff line
/**
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.applications;

import com.android.settings.AppListPreference;

import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.provider.Settings;
import android.service.notification.NotificationAssistantService;
import android.util.AttributeSet;
import android.util.Slog;

import java.util.ArrayList;
import java.util.List;

import com.android.settings.R;
import com.android.settings.utils.ManagedServiceSettings;

public class DefaultNotificationAssistantPreference extends AppListPreference {
    private static final String TAG = "DefaultNotiAssist";

    private PackageManager mPm;
    private final ManagedServiceSettings.Config mConfig;
    private final Context mContext;

    public DefaultNotificationAssistantPreference(Context context, AttributeSet attrs) {
        super(context, attrs);

        mContext = context;
        mPm = context.getPackageManager();
        mConfig = getConfig();
        setShowItemNone(true);
        updateList(getServices());
    }

    @Override
    protected boolean persistString(String value) {
        Settings.Secure.putString(mContext.getContentResolver(), mConfig.setting, value);
        setSummary(getEntry());
        return true;
    }

    private void updateList(List<ServiceInfo> services) {
        final ComponentName[] assistants = new ComponentName[services.size()];
        for (int i = 0; i < services.size(); i++) {
            assistants[i] = new ComponentName(services.get(i).packageName, services.get(i).name);
        }
        final String assistant =
                Settings.Secure.getString(mContext.getContentResolver(), mConfig.setting);
        setComponentNames(assistants, assistant == null ? null
                : ComponentName.unflattenFromString(assistant));
    }

    private List<ServiceInfo> getServices() {
        List<ServiceInfo> services = new ArrayList<>();
        final int user = ActivityManager.getCurrentUser();

        List<ResolveInfo> installedServices = mPm.queryIntentServicesAsUser(
                new Intent(mConfig.intentAction),
                PackageManager.GET_SERVICES | PackageManager.GET_META_DATA,
                user);

        for (int i = 0, count = installedServices.size(); i < count; i++) {
            ResolveInfo resolveInfo = installedServices.get(i);
            ServiceInfo info = resolveInfo.serviceInfo;

            if (!mConfig.permission.equals(info.permission)) {
                Slog.w(mConfig.tag, "Skipping " + mConfig.noun + " service "
                        + info.packageName + "/" + info.name
                        + ": it does not require the permission "
                        + mConfig.permission);
                continue;
            }
            services.add(info);
        }
        return services;
    }

    private ManagedServiceSettings.Config getConfig() {
        final ManagedServiceSettings.Config c = new ManagedServiceSettings.Config();
        c.tag = TAG;
        c.setting = Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT;
        c.intentAction = NotificationAssistantService.SERVICE_INTERFACE;
        c.permission = android.Manifest.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE;
        c.noun = "notification assistant";
        c.warningDialogTitle = R.string.notification_listener_security_warning_title;
        c.warningDialogSummary = R.string.notification_listener_security_warning_summary;
        c.emptyText = R.string.no_notification_listeners;
        return c;
    }
}
 No newline at end of file