chromium/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabStatusBarColorProvider.java

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.customtabs;

import static org.chromium.chrome.browser.ui.system.StatusBarColorController.DEFAULT_STATUS_BAR_COLOR;
import static org.chromium.chrome.browser.ui.system.StatusBarColorController.UNDEFINED_STATUS_BAR_COLOR;

import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarColorController;
import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarColorController.ToolbarColorType;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.ui.system.StatusBarColorController;

import javax.inject.Inject;

/** Manages the status bar color for a CustomTabActivity. */
@ActivityScope
public class CustomTabStatusBarColorProvider {
    private final BrowserServicesIntentDataProvider mIntentDataProvider;
    private final StatusBarColorController mStatusBarColorController;

    private boolean mUseTabThemeColor;

    @Inject
    public CustomTabStatusBarColorProvider(
            BrowserServicesIntentDataProvider intentDataProvider,
            StatusBarColorController statusBarColorController) {
        mIntentDataProvider = intentDataProvider;
        mStatusBarColorController = statusBarColorController;
    }

    /**
     * Sets whether the tab's theme color should be used for the status bar and triggers an update
     * of the status bar color if needed.
     */
    public void setUseTabThemeColor(boolean useTabThemeColor) {
        if (mUseTabThemeColor == useTabThemeColor) return;

        mUseTabThemeColor = useTabThemeColor;
        mStatusBarColorController.updateStatusBarColor();
    }

    int getBaseStatusBarColor(Tab tab) {
        @ToolbarColorType
        int toolbarColorType =
                CustomTabToolbarColorController.computeToolbarColorType(
                        mIntentDataProvider, mUseTabThemeColor, tab);
        return switch (toolbarColorType) {
            case ToolbarColorType.THEME_COLOR -> UNDEFINED_STATUS_BAR_COLOR;
            case ToolbarColorType.DEFAULT_COLOR -> DEFAULT_STATUS_BAR_COLOR;
            case ToolbarColorType.INTENT_TOOLBAR_COLOR -> mIntentDataProvider
                    .getColorProvider()
                    .getToolbarColor();
            default -> DEFAULT_STATUS_BAR_COLOR;
        };
    }
}