Search code examples
androidandroid-notificationsandroid-preferences

How to turn off App notification from inside the app


How do you turn off Notification programmatically from a settings options inside an app?

The approach of creating the Notification channel inside an if statement in a Preference change listener seems to be doing the job. I'm concerned that the I'm creating multiple Notification channels now.

Preference.xml

<PreferenceCategory
    app:key="notification_category"
    app:title="Notification"
    <SwitchPreferenceCompat
         app:key="notification_state"
         app:title="Enable notification message"/>
</PrefenceCategory>

MainActivity.class

boolean mNotificationState;
Notification mNotification;

SharedPreferences.OnSharedPreferenceChangeListener listener;


@Override
protected void onCreate(Bundle saveInstanceState) {
    ...
    // Create notification object.
    mNotification = Notification(this);

    // Prefernce Listener
    listner = (sharedPrefences, s) -> {
        mNotificationState = SharedPreferences.getBoolean("notification_state", true);
    if(mNotificationState) {
        // concerned that a memory leak migh occur.
        notification.createNotificationChannel();
    } else {
        notification.getNotificationManager().cancelAll();
    }
}

/**
 * registerOnSharedPreferenceChangeListener
 */
@Override
public void onResume() {   
    super.onResume();
PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()).registerOnSharedPreferenceChangeListener(listener);
} 

/*
 * unregisterOnSharedPreferenceChangeListener.
 */
@Override
public void onDestroy() {
    PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()).unregisterOnSharedPreferenceChangeListener(listener);
    super.onDestroy(); 
}   

Notification.class, contains a NotificationChannel method, notfication method, and getNotificationManager (gettter).

private Context mContext;

// Constructor
public Notification(Context context) {
    this.context = context;
}

// Notification channel. 
public void createNotificationChannel() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = "notification_ID";
        String description = "My Notificatin";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
    }
    // Set NotificationChannel ch = new NotificationChannel(NOTIFICATION_ID, name, importance);
    ch.setDescription(description);

    // Register the channel.
    notificationManager = context.getSystemService(NotificationManager.class);

    notificationManager.createNotificationChannel(ch);
}

public NotificationManager getNotificationManager() {
    return notificationManager;
}

Solution

  • If the notif not push messages type, then :

    1. Disable all currently shown notification and toggle off sharedPrefs value
    
    checkbox.setOnCheckedChangeListener { _, isChecked ->
    
            if (isChecked) {
    
                mSharedPrefs.save(MySharedPrefs.NOTIFICATION_ENABLED, true)
    
            } else {
    
                NotificationManagerCompat.from(this).cancelAll()
    
                mSharedPrefs.save(MySharedPrefs.NOTIFICATION_ENABLED, false)
    
            }
    
        }
    
    1. Check MySharedPrefs.NOTIFICATION_ENABLED state at part of the code where you actually build and show the notification(eg. BroadcastReceiver)
    if (mSharedPrefs.getValueBoolean(MySharedPrefs.NOTIFICATION_ENABLED)) {
        val builder = NotificationCompat.Builder(context, Constants.CHANNEL_ID)
    
         NotificationManagerCompat.from(context).notify(Constants.NOTIFICATION_ID, builder.build())
    }