/*
 * Copyright (C) 2017 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.qs;

import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;

import com.android.systemui.qs.tileimpl.SlashImageView;


/**
 * Creates AlphaControlledSlashImageView instead of SlashImageView
 */
public class AlphaControlledSignalTileView extends SignalTileView {
    public AlphaControlledSignalTileView(Context context) {
        super(context);
    }

    @Override
    protected SlashImageView createSlashImageView(Context context) {
        return new AlphaControlledSlashImageView(context);
    }

    /**
     * Creates AlphaControlledSlashDrawable instead of regular SlashDrawables
     */
    public static class AlphaControlledSlashImageView extends SlashImageView {
        public AlphaControlledSlashImageView(Context context) {
            super(context);
        }

        public void setFinalImageTintList(ColorStateList tint) {
            super.setImageTintList(tint);
            final SlashDrawable slash = getSlash();
            if (slash != null) {
                ((AlphaControlledSlashDrawable)slash).setFinalTintList(tint);
            }
        }

        @Override
        protected void ensureSlashDrawable() {
            if (getSlash() == null) {
                final SlashDrawable slash = new AlphaControlledSlashDrawable(getDrawable());
                setSlash(slash);
                slash.setAnimationEnabled(getAnimationEnabled());
                setImageViewDrawable(slash);
            }
        }
    }

    /**
     * SlashDrawable that disobeys orders to change its drawable's tint except when you tell
     * it not to disobey. The slash still will animate its alpha.
     */
    public static class AlphaControlledSlashDrawable extends SlashDrawable {
        AlphaControlledSlashDrawable(Drawable d) {
            super(d);
        }

        @Override
        protected void setDrawableTintList(ColorStateList tint) {
        }

        /**
         * Set a target tint list instead of
         */
        public void setFinalTintList(ColorStateList tint) {
            super.setDrawableTintList(tint);
        }
    }
}

