Revision control
Copy as Markdown
/* 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
package org.mozilla.reference.browser.tabs
import android.app.Activity
import mozilla.components.browser.state.selector.findTabOrCustomTabOrSelectedTab
import mozilla.components.browser.state.state.SessionState
import mozilla.components.browser.state.state.TabSessionState
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.support.base.feature.LifecycleAwareFeature
import mozilla.components.support.base.feature.UserInteractionHandler
/**
 * A feature that removes the tab and selects the parent, if one exists.
 */
class LastTabFeature(
    private val store: BrowserStore,
    private val tabId: String? = null,
    private val removeTabUseCase: TabsUseCases.RemoveTabUseCase,
    private val activity: Activity,
) : LifecycleAwareFeature,
    UserInteractionHandler {
        override fun start() = Unit
    override fun stop() = Unit
    /**
     * Removes the session if it was opened by an ACTION_VIEW intent
     * or if it has a parent session and no more history.
     */
    override fun onBackPressed(): Boolean {
        val tab = store.state.findTabOrCustomTabOrSelectedTab(tabId) ?: return false
        val isExternalOrCustomTab = tab.source is SessionState.Source.External ||
            tab.source is SessionState.Source.Internal.CustomTab
        return if (isExternalOrCustomTab && !tab.restored) {
            activity.finish()
            removeTabUseCase(tab.id)
            true
        } else {
            val hasParent = tab is TabSessionState && tab.parentId != null
            removeTabUseCase(tab.id, selectParentIfExists = hasParent) // Alternatively, set this to always true.
            // We want to return to home if this session didn't have a parent session to select.
            hasParent
        }
    }
}