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.
73 lines
3.2 KiB
Kotlin
73 lines
3.2 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.session
|
|
|
|
import android.annotation.SuppressLint
|
|
import android.content.Intent
|
|
import androidx.core.app.NotificationCompat
|
|
import androidx.core.content.ContextCompat
|
|
import mozilla.components.browser.state.selector.selectedTab
|
|
import mozilla.components.browser.state.store.BrowserStore
|
|
import mozilla.components.feature.privatemode.notification.AbstractPrivateNotificationService
|
|
import org.mozilla.fenix.HomeActivity
|
|
import org.mozilla.fenix.R
|
|
import org.mozilla.fenix.components.metrics.Event
|
|
import org.mozilla.fenix.ext.components
|
|
import org.mozilla.fenix.ext.metrics
|
|
|
|
/**
|
|
* Manages notifications for private tabs.
|
|
*
|
|
* Private tab notifications solve two problems for us:
|
|
* 1 - They allow users to interact with us from outside of the app (example: by closing all
|
|
* private tabs).
|
|
* 2 - The notification will keep our process alive, allowing us to keep private tabs in memory.
|
|
*
|
|
* As long as a session is active this service will keep its notification alive.
|
|
*/
|
|
class PrivateNotificationService : AbstractPrivateNotificationService() {
|
|
|
|
override val store: BrowserStore by lazy { components.core.store }
|
|
|
|
override fun NotificationCompat.Builder.buildNotification() {
|
|
setSmallIcon(R.drawable.ic_private_browsing)
|
|
setContentTitle(applicationContext.getString(R.string.app_name_private_4, getString(R.string.app_name)))
|
|
setContentText(applicationContext.getString(R.string.notification_pbm_delete_text_2))
|
|
color = ContextCompat.getColor(this@PrivateNotificationService, R.color.pbm_notification_color)
|
|
}
|
|
|
|
@SuppressLint("MissingSuperCall")
|
|
override fun erasePrivateTabs() {
|
|
val inPrivateMode = store.state.selectedTab?.content?.private ?: false
|
|
|
|
// Trigger use case directly for now (instead of calling super.erasePrivateTabs)
|
|
// as otherwise SessionManager and the store will be out of sync.
|
|
components.useCases.tabsUseCases.removePrivateTabs()
|
|
|
|
metrics.track(Event.PrivateBrowsingNotificationTapped)
|
|
|
|
// If the app is in private mode we launch to the private mode home screen as a
|
|
// confirmation that all private tabs have been deleted. If we don't do this the user
|
|
// will end up on a new selected tab in normal mode which isn't desired.
|
|
// If the app is in normal mode there's no reason to direct the user away to
|
|
// private mode as all private tabs have been deleted.
|
|
if (inPrivateMode) {
|
|
val homeScreenIntent = Intent(this, HomeActivity::class.java).apply {
|
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
|
putExtra(HomeActivity.PRIVATE_BROWSING_MODE, true)
|
|
}
|
|
|
|
if (VisibilityLifecycleCallback.finishAndRemoveTaskIfInBackground(this)) {
|
|
// Set start mode to be in background (recents screen)
|
|
homeScreenIntent.apply {
|
|
putExtra(HomeActivity.START_IN_RECENTS_SCREEN, true)
|
|
}
|
|
}
|
|
|
|
startActivity(homeScreenIntent)
|
|
}
|
|
}
|
|
}
|