package org.wikipedia.page; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.view.Gravity; import android.view.View; import org.wikipedia.R; import org.wikipedia.util.DimenUtil; import org.wikipedia.util.GradientUtil; public class PageToolbarHideHandler extends ViewHideHandler { private static final int FULL_OPACITY = 255; private boolean fadeEnabled; private boolean forceNoFade; @NonNull private final Drawable toolbarBackground; private Drawable toolbarGradient; @NonNull private final Drawable statusBar; public PageToolbarHideHandler(@NonNull View hideableView) { super(hideableView, Gravity.TOP); LayerDrawable toolbarBackgroundLayers = (LayerDrawable) hideableView.getBackground(); toolbarBackground = toolbarBackgroundLayers.findDrawableByLayerId(R.id.toolbar_background_solid).mutate(); initToolbarGradient(toolbarBackgroundLayers, ContextCompat.getColor(hideableView.getContext(), R.color.lead_gradient_start)); statusBar = hideableView.findViewById(R.id.empty_status_bar).getBackground().mutate(); } /** * Whether to enable fading in/out of the search bar when near the top of the article. * @param enabled True to enable fading, false otherwise. */ public void setFadeEnabled(boolean enabled) { fadeEnabled = enabled; update(); } /** * Whether to temporarily disable fading of the search bar, even if fading is enabled otherwise. * May be used when displaying a temporary UI element that requires the search bar to be shown * fully, e.g. when the ToC is pulled out. * @param force True to temporarily disable fading, false otherwise. */ public void setForceNoFade(boolean force) { forceNoFade = force; update(); } @Override protected void onScrolled(int oldScrollY, int scrollY) { int opacity = calculateScrollOpacity(scrollY); toolbarBackground.setAlpha(opacity); toolbarGradient.setAlpha(FULL_OPACITY - opacity); statusBar.setAlpha(opacity); } private void initToolbarGradient(LayerDrawable toolbarBackgroundLayers, @ColorInt int baseColor) { toolbarGradient = GradientUtil.getCubicGradient(baseColor, Gravity.TOP); toolbarBackgroundLayers.setDrawableByLayerId(R.id.toolbar_background_gradient, toolbarGradient); } /** @return Alpha value between 0 and 0xff. */ private int calculateScrollOpacity(int scrollY) { final int fadeHeight = 200; int opacity = FULL_OPACITY; if (fadeEnabled && !forceNoFade) { opacity = scrollY * FULL_OPACITY / (int) (fadeHeight * DimenUtil.getDensityScalar()); } opacity = Math.max(0, opacity); opacity = Math.min(FULL_OPACITY, opacity); return opacity; } }