chromium/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimProperties.java

// Copyright 2020 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.components.browser_ui.widget.scrim;

import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.view.GestureDetector;
import android.view.View;

import androidx.annotation.ColorInt;

import org.chromium.base.Callback;
import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModel.ReadableBooleanPropertyKey;
import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey;
import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey;
import org.chromium.ui.modelutil.PropertyModel.WritableFloatPropertyKey;
import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey;
import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;

/** The properties that can be used to describe the behavior of the scrim widget. */
public class ScrimProperties {
    /**
     * An invalid color that can be specified for {@link #BACKGROUND_COLOR}. This will trigger the
     * use of the default color set when the {@link ScrimCoordinator} was constructed.
     */
    @ColorInt public static final int INVALID_COLOR = Color.TRANSPARENT;

    /**
     * The top margin of the scrim. This can be used to shrink the scrim to show items at the top of
     * the screen.
     */
    public static final WritableIntPropertyKey TOP_MARGIN = new WritableIntPropertyKey();

    /** Whether the scrim should affect the status bar color. */
    public static final ReadableBooleanPropertyKey AFFECTS_STATUS_BAR =
            new ReadableBooleanPropertyKey();

    /** The view that the scrim is using to place itself in the hierarchy. */
    public static final ReadableObjectPropertyKey<View> ANCHOR_VIEW =
            new ReadableObjectPropertyKey<>();

    /** Whether the scrim should show in front of the anchor view. */
    public static final ReadableBooleanPropertyKey SHOW_IN_FRONT_OF_ANCHOR_VIEW =
            new ReadableBooleanPropertyKey();

    /** A callback for updates to the scrim's visibility. */
    public static final ReadableObjectPropertyKey<Callback<Boolean>> VISIBILITY_CALLBACK =
            new ReadableObjectPropertyKey<>();

    /** A callback to be run when the scrim is clicked. */
    public static final ReadableObjectPropertyKey<Runnable> CLICK_DELEGATE =
            new ReadableObjectPropertyKey<>();

    /** The transparency of the scrim. This is an internal property that only the scrim knows about. */
    static final WritableFloatPropertyKey ALPHA = new WritableFloatPropertyKey();

    /**
     * The background color for the scrim. If null, a default color will be set as the background,
     * unless {@link #BACKGROUND_DRAWABLE} is set.
     */
    public static final WritableIntPropertyKey BACKGROUND_COLOR = new WritableIntPropertyKey();

    /**
     * Background of the scrim.
     *
     * <p>When this is set, no default background color applies and {@link #BACKGROUND_COLOR} is
     * ignored.
     *
     * <p>The drawable is responsible for filling in the background with the appropriate color.
     * When the scrim should cover the status bar, the background color drawn by this drawable
     * must be consistent with the status bar's color.
     */
    public static final WritableObjectPropertyKey<Drawable> BACKGROUND_DRAWABLE =
            new WritableObjectPropertyKey<>();

    /**
     * A filter for touch event that happen on this view.
     *
     * <p>The filter intercepts click events, which means that {@link #CLICK_DELEGATE} will not be
     * called when an event filter is set.
     */
    public static final WritableObjectPropertyKey<GestureDetector> GESTURE_DETECTOR =
            new WritableObjectPropertyKey<>();

    /** Whether the scrim should affect the navigation bar color. */
    public static final WritableBooleanPropertyKey AFFECTS_NAVIGATION_BAR =
            new WritableBooleanPropertyKey();

    /** A subset of {@link #ALL_KEYS} that are required to use the scrim. */
    public static final PropertyKey[] REQUIRED_KEYS =
            new PropertyKey[] {
                TOP_MARGIN,
                AFFECTS_STATUS_BAR,
                ANCHOR_VIEW,
                SHOW_IN_FRONT_OF_ANCHOR_VIEW,
                VISIBILITY_CALLBACK,
                CLICK_DELEGATE,
                ALPHA
            };

    /** All keys used for the scrim, including optional ones (see {@link #REQUIRED_KEYS}). */
    public static final PropertyKey[] ALL_KEYS =
            PropertyModel.concatKeys(
                    REQUIRED_KEYS,
                    new PropertyKey[] {
                        BACKGROUND_COLOR,
                        BACKGROUND_DRAWABLE,
                        GESTURE_DETECTOR,
                        AFFECTS_NAVIGATION_BAR
                    });
}