[fenix] Bug 1810114 - Part 1: Add isNotificationChannelEnabled helper function and tests for NotificationManagerCompat.kt

pull/600/head
rahulsainani 2 years ago committed by mergify[bot]
parent a4573bcb47
commit 2c8869f666

@ -4,6 +4,8 @@
package org.mozilla.fenix.ext
import android.os.Build
import androidx.core.app.NotificationChannelCompat
import androidx.core.app.NotificationManagerCompat
/**
@ -18,3 +20,41 @@ fun NotificationManagerCompat.areNotificationsEnabledSafe(): Boolean {
false
}
}
/**
* If the channel does not exist or is null, this returns false.
* If the channel exists with importance more than [NotificationManagerCompat.IMPORTANCE_NONE] and
* notifications are enabled for the app, this returns true.
* On <= SDK 26, this checks if notifications are enabled for the app.
*
* @param channelId the id of the notification channel to check.
* @return true if the channel is enabled, false otherwise.
*/
fun NotificationManagerCompat.isNotificationChannelEnabled(channelId: String): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = getNotificationChannelSafe(channelId)
if (channel == null) {
false
} else {
areNotificationsEnabledSafe() && channel.importance != NotificationManagerCompat.IMPORTANCE_NONE
}
} else {
areNotificationsEnabledSafe()
}
}
/**
* Returns the notification channel with the given [channelId], or null if the channel does not
* exist, catches any exception that was thrown by
* [NotificationManagerCompat.getNotificationChannelCompat] and returns null.
*
* @param channelId the id of the notification channel to check.
*/
@Suppress("TooGenericExceptionCaught")
private fun NotificationManagerCompat.getNotificationChannelSafe(channelId: String): NotificationChannelCompat? {
return try {
getNotificationChannelCompat(channelId)
} catch (e: Exception) {
null
}
}

@ -0,0 +1,119 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ext
import android.os.Build
import androidx.core.app.NotificationChannelCompat
import androidx.core.app.NotificationManagerCompat
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.robolectric.util.ReflectionHelpers
@RunWith(FenixRobolectricTestRunner::class)
class NotificationManagerCompatTest {
private lateinit var tested: NotificationManagerCompat
@Before
fun setup() {
tested = mockk(relaxed = true)
mockkStatic("org.mozilla.fenix.ext.NotificationManagerCompatKt")
}
@Test
fun `WHEN areNotificationsEnabled throws an exception THEN areNotificationsEnabledSafe returns false`() {
every { tested.areNotificationsEnabled() } throws RuntimeException()
assertFalse(tested.areNotificationsEnabledSafe())
}
@Test
fun `WHEN areNotificationsEnabled returns false THEN areNotificationsEnabledSafe returns false`() {
every { tested.areNotificationsEnabled() } returns false
assertFalse(tested.areNotificationsEnabledSafe())
}
@Test
fun `WHEN areNotificationsEnabled returns true THEN areNotificationsEnabledSafe returns true`() {
every { tested.areNotificationsEnabled() } returns true
assertTrue(tested.areNotificationsEnabledSafe())
}
@Test
fun `WHEN getNotificationChannelCompat returns a channel with IMPORTANCE_DEFAULT and areNotificationsEnabled returns true THEN isNotificationChannelEnabled returns true`() {
val testChannel = "test-channel"
val notificationChannelCompat =
NotificationChannelCompat.Builder(
testChannel,
NotificationManagerCompat.IMPORTANCE_DEFAULT,
).build()
every { tested.getNotificationChannelCompat(testChannel) } returns notificationChannelCompat
every { tested.areNotificationsEnabled() } returns true
assertTrue(tested.isNotificationChannelEnabled(testChannel))
}
@Test
fun `WHEN getNotificationChannelCompat returns a channel with IMPORTANCE_NONE and areNotificationsEnabled returns true THEN isNotificationChannelEnabled returns false`() {
val testChannel = "test-channel"
val notificationChannelCompat =
NotificationChannelCompat.Builder(
testChannel,
NotificationManagerCompat.IMPORTANCE_NONE,
).build()
every { tested.getNotificationChannelCompat(testChannel) } returns notificationChannelCompat
every { tested.areNotificationsEnabled() } returns true
assertFalse(tested.isNotificationChannelEnabled(testChannel))
}
@Test
fun `WHEN getNotificationChannelCompat returns a channel and areNotificationsEnabled returns false THEN isNotificationChannelEnabled returns false`() {
val testChannel = "test-channel"
val notificationChannelCompat =
NotificationChannelCompat.Builder(
testChannel,
NotificationManagerCompat.IMPORTANCE_DEFAULT,
).build()
every { tested.getNotificationChannelCompat(testChannel) } returns notificationChannelCompat
every { tested.areNotificationsEnabled() } returns false
assertFalse(tested.isNotificationChannelEnabled(testChannel))
}
@Test
fun `WHEN getNotificationChannelCompat returns null THEN isNotificationChannelEnabled returns false`() {
val testChannel = "test-channel"
every { tested.getNotificationChannelCompat(testChannel) } returns null
every { tested.areNotificationsEnabled() } returns true
assertFalse(tested.isNotificationChannelEnabled(testChannel))
}
@Test
fun `WHEN sdk less than 26 and areNotificationsEnabled returns true THEN isNotificationChannelEnabled returns true`() {
val testChannel = "test-channel"
ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 25)
every { tested.areNotificationsEnabled() } returns true
assertTrue(tested.isNotificationChannelEnabled(testChannel))
}
}
Loading…
Cancel
Save