You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.6 KiB
Kotlin
97 lines
3.6 KiB
Kotlin
/* 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.customtabs
|
|
|
|
import android.app.Notification
|
|
import android.app.NotificationChannel
|
|
import android.app.NotificationManager
|
|
import android.content.Context
|
|
import android.os.Build
|
|
import android.os.Build.VERSION.SDK_INT
|
|
import androidx.core.app.NotificationCompat
|
|
import androidx.core.app.NotificationCompat.BADGE_ICON_NONE
|
|
import androidx.core.app.NotificationManagerCompat
|
|
import androidx.core.content.ContextCompat
|
|
import androidx.core.content.getSystemService
|
|
import androidx.lifecycle.Lifecycle
|
|
import androidx.lifecycle.LifecycleObserver
|
|
import androidx.lifecycle.OnLifecycleEvent
|
|
import mozilla.components.browser.state.selector.findCustomTab
|
|
import mozilla.components.browser.state.state.ExternalAppType
|
|
import mozilla.components.browser.state.store.BrowserStore
|
|
import mozilla.components.support.base.ids.cancel
|
|
import mozilla.components.support.base.ids.notify
|
|
import org.mozilla.fenix.R
|
|
|
|
/**
|
|
* Displays a "Powered by Firefox Preview" notification when a Trusted Web Activity is running.
|
|
*/
|
|
class PoweredByNotification(
|
|
private val applicationContext: Context,
|
|
private val store: BrowserStore,
|
|
private val customTabId: String
|
|
) : LifecycleObserver {
|
|
|
|
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
|
|
fun onResume() {
|
|
if (store.state.findCustomTab(customTabId)?.config?.externalAppType === ExternalAppType.TRUSTED_WEB_ACTIVITY) {
|
|
NotificationManagerCompat.from(applicationContext)
|
|
.notify(applicationContext, NOTIFICATION_TAG, buildNotification())
|
|
}
|
|
}
|
|
|
|
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
|
|
fun onPause() {
|
|
NotificationManagerCompat.from(applicationContext)
|
|
.cancel(applicationContext, NOTIFICATION_TAG)
|
|
}
|
|
|
|
/**
|
|
* Build the notification with site controls to be displayed while the web app is active.
|
|
*/
|
|
private fun buildNotification(): Notification {
|
|
val channelId = ensureChannelExists()
|
|
|
|
with(applicationContext) {
|
|
val appName = getString(R.string.app_name)
|
|
return NotificationCompat.Builder(this, channelId)
|
|
.setSmallIcon(R.drawable.ic_status_logo)
|
|
.setContentTitle(getString(R.string.browser_menu_powered_by2, appName))
|
|
.setBadgeIconType(BADGE_ICON_NONE)
|
|
.setColor(ContextCompat.getColor(this, R.color.primary_text_light_theme))
|
|
.setPriority(NotificationCompat.PRIORITY_MIN)
|
|
.setShowWhen(false)
|
|
.setOngoing(true)
|
|
.build()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Make sure a notification channel for the powered by notifications exists.
|
|
*
|
|
* Returns the channel id to be used for notifications.
|
|
*/
|
|
private fun ensureChannelExists(): String {
|
|
if (SDK_INT >= Build.VERSION_CODES.O) {
|
|
val notificationManager: NotificationManager = applicationContext.getSystemService()!!
|
|
|
|
val channel = NotificationChannel(
|
|
NOTIFICATION_CHANNEL_ID,
|
|
applicationContext.getString(R.string.mozac_feature_pwa_site_controls_notification_channel),
|
|
NotificationManager.IMPORTANCE_MIN
|
|
)
|
|
|
|
notificationManager.createNotificationChannel(channel)
|
|
}
|
|
|
|
return NOTIFICATION_CHANNEL_ID
|
|
}
|
|
|
|
companion object {
|
|
private const val NOTIFICATION_CHANNEL_ID = "Powered By"
|
|
private const val NOTIFICATION_TAG = "PoweredBy"
|
|
}
|
|
}
|