blob: db7da71a856e82d9ab2be7b3a2e6cb7d963f34a4 [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.car.settings.applications;
import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
import android.app.INotificationManager;
import android.app.NotificationChannel;
import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.os.ServiceManager;
import androidx.preference.TwoStatePreference;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
import com.android.car.settings.common.PreferenceController;
import com.android.internal.annotations.VisibleForTesting;
/**
* Controller for preference which enables / disables showing notifications for an application.
*/
public class NotificationsPreferenceController extends PreferenceController<TwoStatePreference> {
private static final Logger LOG = new Logger(NotificationsPreferenceController.class);
private String mPackageName;
private int mUid;
@VisibleForTesting
INotificationManager mNotificationManager =
INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
public NotificationsPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
}
/**
* Set the package info of the application.
*/
public void setPackageInfo(PackageInfo packageInfo) {
mPackageName = packageInfo.packageName;
mUid = packageInfo.applicationInfo.uid;
}
@Override
protected Class<TwoStatePreference> getPreferenceType() {
return TwoStatePreference.class;
}
@Override
protected void updateState(TwoStatePreference preference) {
preference.setChecked(isNotificationsEnabled());
}
@Override
protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
boolean enabled = (boolean) newValue;
try {
if (mNotificationManager.onlyHasDefaultChannel(mPackageName, mUid)) {
NotificationChannel defaultChannel =
mNotificationManager.getNotificationChannelForPackage(
mPackageName,
mUid,
NotificationChannel.DEFAULT_CHANNEL_ID,
/* includeDeleted= */ true);
defaultChannel.setImportance(enabled ? IMPORTANCE_UNSPECIFIED : IMPORTANCE_NONE);
mNotificationManager
.updateNotificationChannelForPackage(mPackageName, mUid, defaultChannel);
}
mNotificationManager.setNotificationsEnabledForPackage(mPackageName, mUid, enabled);
} catch (Exception e) {
LOG.w("Error querying notification setting for package");
return false;
}
return true;
}
private boolean isNotificationsEnabled() {
try {
return mNotificationManager.areNotificationsEnabledForPackage(mPackageName, mUid);
} catch (Exception e) {
LOG.w("Error querying notification setting for package");
return false;
}
}
}