/*
 * 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.TextView;

import com.android.tv.MainActivity;
import com.android.tv.R;
import com.android.tv.data.api.Channel;

public class InputBannerView extends InputBannerViewBase
        implements TvTransitionManager.TransitionLayout {

    private TextView mInputLabelTextView;
    private TextView mSecondaryInputLabelTextView;

    public InputBannerView(Context context) {
        super(context);
    }

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

    public InputBannerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

    @Override
    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);
        }
    }
}
