blob: fcee56a702b03871925808ff762ebc1904feb667 [file] [log] [blame]
/*
* Copyright (C) 2019 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.notification;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.graphics.drawable.Drawable;
import android.provider.Settings;
import android.service.notification.NotificationAssistantService;
import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.applications.ServiceListing;
import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList;
import java.util.List;
public class NotificationAssistantPicker extends DefaultAppPickerFragment implements
ServiceListing.Callback {
private static final String TAG = "NotiAssistantPicker";
@VisibleForTesting
protected NotificationBackend mNotificationBackend;
private List<CandidateInfo> mCandidateInfos = new ArrayList<>();
@VisibleForTesting
protected Context mContext;
private ServiceListing mServiceListing;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
mNotificationBackend = new NotificationBackend();
mServiceListing = new ServiceListing.Builder(context)
.setTag(TAG)
.setSetting(Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT)
.setIntentAction(NotificationAssistantService.SERVICE_INTERFACE)
.setPermission(android.Manifest.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE)
.setNoun("notification assistant")
.build();
mServiceListing.addCallback(this);
mServiceListing.reload();
}
@Override
public void onDetach() {
super.onDetach();
mServiceListing.removeCallback(this);
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.notification_assistant_settings;
}
@Override
protected List<? extends CandidateInfo> getCandidates() {
return mCandidateInfos;
}
@Override
protected String getDefaultKey() {
ComponentName cn = mNotificationBackend.getAllowedNotificationAssistant();
return (cn != null) ? cn.flattenToString() : "";
}
@Override
protected boolean setDefaultKey(String key) {
return mNotificationBackend.setNotificationAssistantGranted(
ComponentName.unflattenFromString(key));
}
@Override
public int getMetricsCategory() {
return SettingsEnums.DEFAULT_NOTIFICATION_ASSISTANT;
}
@Override
protected CharSequence getConfirmationMessage(CandidateInfo info) {
if (TextUtils.isEmpty(info.getKey())) {
return null;
}
return mContext.getString(R.string.notification_assistant_security_warning_summary,
info.loadLabel());
}
@Override
public void onServicesReloaded(List<ServiceInfo> services) {
List<CandidateInfo> list = new ArrayList<>();
services.sort(new PackageItemInfo.DisplayNameComparator(mPm));
for (ServiceInfo service : services) {
if (mContext.getPackageManager().checkPermission(
android.Manifest.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE,
service.packageName) == PackageManager.PERMISSION_GRANTED) {
final ComponentName cn = new ComponentName(service.packageName, service.name);
list.add(new DefaultAppInfo(mContext, mPm, mUserId, cn));
}
}
list.add(new CandidateNone(mContext));
mCandidateInfos = list;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.notification_assistant_settings);
public static class CandidateNone extends CandidateInfo {
public Context mContext;
public CandidateNone(Context context) {
super(true);
mContext = context;
}
@Override
public CharSequence loadLabel() {
return mContext.getString(R.string.no_notification_assistant);
}
@Override
public Drawable loadIcon() {
return null;
}
@Override
public String getKey() {
return "";
}
}
}