CustomTabConfig.kt

/* 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 mozilla.components.browser.state.state

import android.app.PendingIntent
import android.graphics.Bitmap
import android.os.Bundle
import androidx.annotation.ColorInt
import androidx.browser.customtabs.CustomTabsIntent
import androidx.browser.customtabs.CustomTabsIntent.COLOR_SCHEME_DARK
import androidx.browser.customtabs.CustomTabsIntent.COLOR_SCHEME_LIGHT
import androidx.browser.customtabs.CustomTabsIntent.ColorScheme
import androidx.browser.customtabs.CustomTabsSessionToken

/**
 * Holds configuration data for a Custom Tab.
 *
 * @property colorScheme Optional [ColorScheme] to apply to the Custom Tab UI.
 * @property colorSchemes Optional collection of [ColorSchemeParams] for each [ColorScheme].
 * @property closeButtonIcon Optional custom icon of the back button on the toolbar.
 * @property enableUrlbarHiding Enables the toolbar to hide as the user scrolls down on the page.
 * @property actionButtonConfig Optional custom action button on the toolbar.
 * @property showCloseButton Specifies whether the close button will be shown on the toolbar.
 * @property showShareMenuItem Specifies whether a default share button will be shown in the menu.
 * @property menuItems Custom overflow menu items.
 * @property exitAnimations Optional [Bundle] containing custom exit animations for the tab.
 * @property titleVisible Whether the title should be shown in the custom tab.
 * @property sessionToken Optional token associated with the custom tab.
 * @property externalAppType How this custom tab is being displayed.
 */
data class CustomTabConfig(
    @ColorScheme val colorScheme: Int? = null,
    val colorSchemes: ColorSchemes? = null,
    val closeButtonIcon: Bitmap? = null,
    val enableUrlbarHiding: Boolean = false,
    val actionButtonConfig: CustomTabActionButtonConfig? = null,
    val showCloseButton: Boolean = true,
    val showShareMenuItem: Boolean = false,
    val menuItems: List<CustomTabMenuItem> = emptyList(),
    val exitAnimations: Bundle? = null,
    val titleVisible: Boolean = false,
    val sessionToken: CustomTabsSessionToken? = null,
    val externalAppType: ExternalAppType = ExternalAppType.CUSTOM_TAB,
)

/**
 * Represents different contexts that a custom tab session can be displayed in.
 */
enum class ExternalAppType {
    /**
     * Custom tab is displayed as a normal custom tab with toolbar.
     */
    CUSTOM_TAB,

    /**
     * Custom tab toolbar is hidden inside a Progressive Web App created by the browser.
     */
    PROGRESSIVE_WEB_APP,

    /**
     * Custom tab is displayed fullscreen inside a Trusted Web Activity from an external app.
     */
    TRUSTED_WEB_ACTIVITY,

    /**
     * Custom tab that is displayed during onboarding. It has limited options to prevent users from
     * bypassing the onboarding flow.
     */
    ONBOARDING_CUSTOM_TAB,
}

data class CustomTabActionButtonConfig(
    val description: String,
    val icon: Bitmap,
    val pendingIntent: PendingIntent,
    val id: Int = CustomTabsIntent.TOOLBAR_ACTION_BUTTON_ID,
    val tint: Boolean = false,
)

data class CustomTabMenuItem(
    val name: String,
    val pendingIntent: PendingIntent,
)

/**
 * Holds color data for Custom Tab visual elements.
 *
 * @property toolbarColor Optional background color for the toolbar.
 * @property toolbarColor Optional background color for the secondary toolbar.
 * @property navigationBarColor Optional background color for the navigation bar.
 * @property navigationBarDividerColor Optional background color for the navigation bar divider.
 */
data class ColorSchemeParams(
    @ColorInt val toolbarColor: Int? = null,
    @ColorInt val secondaryToolbarColor: Int? = null,
    @ColorInt val navigationBarColor: Int? = null,
    @ColorInt val navigationBarDividerColor: Int? = null,
)

/**
 * Holds the [ColorSchemeParams] for each possible color scheme.
 *
 * @property defaultColorSchemeParams Optional default [ColorSchemeParams].
 * @property lightColorSchemeParams Optional [ColorSchemeParams] for [COLOR_SCHEME_LIGHT].
 * @property darkColorSchemeParams Optional [ColorSchemeParams] for [COLOR_SCHEME_DARK].
 */
data class ColorSchemes(
    val defaultColorSchemeParams: ColorSchemeParams? = null,
    val lightColorSchemeParams: ColorSchemeParams? = null,
    val darkColorSchemeParams: ColorSchemeParams? = null,
)