/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.statusbar.policy;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import androidx.core.graphics.ColorUtils;

import com.android.keyguard.KeyguardConstants;
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.qs.tiles.UserDetailItemView;

/**
 * Displays a user on the keyguard user switcher.
 */
public class KeyguardUserDetailItemView extends UserDetailItemView {

    private static final String TAG = "KeyguardUserDetailItemView";
    private static final boolean DEBUG = KeyguardConstants.DEBUG;

    private static final int ANIMATION_DURATION_FADE_NAME = 240;

    private float mDarkAmount;
    private int mTextColor;

    public KeyguardUserDetailItemView(Context context) {
        this(context, null);
    }

    public KeyguardUserDetailItemView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public KeyguardUserDetailItemView(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    public KeyguardUserDetailItemView(Context context, AttributeSet attrs, int defStyleAttr,
            int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected int getFontSizeDimen() {
        return R.dimen.kg_user_switcher_text_size;
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mTextColor = mName.getCurrentTextColor();
        updateDark();
    }

    /**
     * Update visibility of this view.
     *
     * @param showItem If true, this item is visible on the screen to the user. Generally this
     *                 means that the item would be clickable. If false, item visibility will be
     *                 set to GONE and hidden entirely.
     * @param showTextName Whether or not the name should be shown next to the icon. If false,
     *                     only the icon is shown.
     * @param animate Whether the transition should be animated. Note, this only applies to
     *                animating the text name. The item itself will not animate (i.e. fade in/out).
     *                Instead, we delegate that to the parent view.
     */
    void updateVisibilities(boolean showItem, boolean showTextName, boolean animate) {
        if (DEBUG) {
            Log.d(TAG, String.format("updateVisibilities itemIsShown=%b nameIsShown=%b animate=%b",
                    showItem, showTextName, animate));
        }

        getBackground().setAlpha((showItem && showTextName) ? 255 : 0);

        if (showItem) {
            if (showTextName) {
                mName.setVisibility(View.VISIBLE);
                if (animate) {
                    mName.setAlpha(0f);
                    mName.animate()
                            .alpha(1f)
                            .setDuration(ANIMATION_DURATION_FADE_NAME)
                            .setInterpolator(Interpolators.ALPHA_IN);
                } else {
                    mName.setAlpha(1f);
                }
            } else {
                if (animate) {
                    mName.setVisibility(View.VISIBLE);
                    mName.setAlpha(1f);
                    mName.animate()
                            .alpha(0f)
                            .setDuration(ANIMATION_DURATION_FADE_NAME)
                            .setInterpolator(Interpolators.ALPHA_OUT)
                            .withEndAction(() -> {
                                mName.setVisibility(View.GONE);
                                mName.setAlpha(1f);
                            });
                } else {
                    mName.setVisibility(View.GONE);
                    mName.setAlpha(1f);
                }
            }
            setVisibility(View.VISIBLE);
            setAlpha(1f);
        } else {
            // If item isn't shown, don't animate. The parent class will animate the view instead
            setVisibility(View.GONE);
            setAlpha(1f);
            mName.setVisibility(showTextName ? View.VISIBLE : View.GONE);
            mName.setAlpha(1f);
        }
    }

    /**
     * Set the amount (ratio) that the device has transitioned to doze.
     *
     * @param darkAmount Amount of transition to doze: 1f for doze and 0f for awake.
     */
    public void setDarkAmount(float darkAmount) {
        if (mDarkAmount == darkAmount) {
            return;
        }
        mDarkAmount = darkAmount;
        updateDark();
    }

    private void updateDark() {
        final int blendedTextColor = ColorUtils.blendARGB(mTextColor, Color.WHITE, mDarkAmount);
        mName.setTextColor(blendedTextColor);
    }
}
