/*
 * Copyright (C) 2015 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.tv.ui;

import android.content.Context;
import android.media.tv.TvInputInfo;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.tv.MainActivity;
import com.android.tv.R;
import com.android.tv.data.api.Channel;

public class InputBannerView extends LinearLayout implements TvTransitionManager.TransitionLayout {
    private final long mShowDurationMillis;

    private final Runnable mHideRunnable =
            () ->
                    ((MainActivity) getContext())
                            .getOverlayManager()
                            .hideOverlays(
                                    TvOverlayManager.FLAG_HIDE_OVERLAYS_KEEP_DIALOG
                                            | TvOverlayManager.FLAG_HIDE_OVERLAYS_KEEP_SIDE_PANELS
                                            | TvOverlayManager.FLAG_HIDE_OVERLAYS_KEEP_PROGRAM_GUIDE
                                            | TvOverlayManager.FLAG_HIDE_OVERLAYS_KEEP_MENU
                                            | TvOverlayManager.FLAG_HIDE_OVERLAYS_KEEP_FRAGMENT);
    private TextView mInputLabelTextView;
    private TextView mSecondaryInputLabelTextView;

    public InputBannerView(Context context) {
        this(context, null, 0);
    }

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

    public InputBannerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mShowDurationMillis =
                context.getResources().getInteger(R.integer.select_input_show_duration);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mInputLabelTextView = (TextView) findViewById(R.id.input_label);
        mSecondaryInputLabelTextView = (TextView) findViewById(R.id.secondary_input_label);
    }

    public void updateLabel() {
        MainActivity mainActivity = (MainActivity) getContext();
        Channel channel = mainActivity.getCurrentChannel();
        if (channel == null || !channel.isPassthrough()) {
            return;
        }
        TvInputInfo input =
                mainActivity.getTvInputManagerHelper().getTvInputInfo(channel.getInputId());
        CharSequence customLabel = input.loadCustomLabel(getContext());
        CharSequence label = input.loadLabel(getContext());
        if (TextUtils.isEmpty(customLabel) || customLabel.equals(label)) {
            mInputLabelTextView.setText(label);
            mSecondaryInputLabelTextView.setVisibility(View.GONE);
        } else {
            mInputLabelTextView.setText(customLabel);
            mSecondaryInputLabelTextView.setText(label);
            mSecondaryInputLabelTextView.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void onEnterAction(boolean fromEmptyScene) {
        removeCallbacks(mHideRunnable);
        postDelayed(mHideRunnable, mShowDurationMillis);
    }

    @Override
    public void onExitAction() {
        removeCallbacks(mHideRunnable);
    }
}
