1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/*
2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License.
6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at
7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software
11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and
14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License.
15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.ui.sidepanel;
18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.media.tv.TvInputInfo;
20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.Bundle;
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.text.TextUtils;
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.Log;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.LayoutInflater;
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.View;
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.ViewGroup;
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.R;
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.PipInputManager;
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.PipInputManager.PipInput;
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.ArrayList;
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List;
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.Objects;
34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class PipInputSelectorFragment extends SideFragment {
36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final String TAG = "PipInputSelector";
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final String TRACKER_LABEL = "PIP input source";
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final List<Item> mInputItems = new ArrayList<>();
40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private PipInputManager mPipInputManager;
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private PipInput mInitialPipInput;
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private boolean mSelected;
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final PipInputManager.Listener mPipInputListener = new PipInputManager.Listener() {
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        public void onPipInputStateUpdated() {
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            notifyDataSetChanged();
48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        public void onPipInputListUpdated() {
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            refreshInputList();
53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            setItems(mInputItems);
54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    };
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public View onCreateView(LayoutInflater inflater, ViewGroup container,
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            Bundle savedInstanceState) {
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mPipInputManager = getMainActivity().getPipInputManager();
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mPipInputManager.addListener(mPipInputListener);
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        getMainActivity().startShrunkenTvView(false, false);
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return super.onCreateView(inflater, container, savedInstanceState);
64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onStart() {
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super.onStart();
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mInitialPipInput = mPipInputManager.getPipInput(getMainActivity().getPipChannel());
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (mInitialPipInput == null) {
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            Log.w(TAG, "PIP should be on");
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            closeFragment();
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        int count = 0;
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        for (Item item : mInputItems) {
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            InputItem inputItem = (InputItem) item;
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (Objects.equals(inputItem.mPipInput, mInitialPipInput)) {
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                setSelectedPosition(count);
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                break;
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            ++count;
82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onDestroyView() {
87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super.onDestroyView();
88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mPipInputManager.removeListener(mPipInputListener);
89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (!mSelected) {
90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            getMainActivity().tuneToChannelForPip(mInitialPipInput.getChannel());
91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        getMainActivity().endShrunkenTvView();
93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected String getTitle() {
97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return getString(R.string.side_panel_title_pip_input_source);
98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public String getTrackerLabel() {
102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return TRACKER_LABEL;
103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected List<Item> getItemList() {
107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        refreshInputList();
108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mInputItems;
109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void refreshInputList() {
112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mInputItems.clear();
113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        for (PipInput input : mPipInputManager.getPipInputList(false)) {
114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mInputItems.add(new InputItem(input));
115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private class InputItem extends RadioButtonItem {
119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private final PipInput mPipInput;
120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private InputItem(PipInput input) {
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super(input.getLongLabel());
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mPipInput = input;
124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            setEnabled(isAvailable());
125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onUpdate() {
129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onUpdate();
130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            setEnabled(mPipInput.isAvailable());
131816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            setChecked(mPipInput == mInitialPipInput);
132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
135816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onFocused() {
136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onFocused();
137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (isEnabled()) {
138816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                getMainActivity().tuneToChannelForPip(mPipInput.getChannel());
139816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
140816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onSelected() {
144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onSelected();
145816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (isEnabled()) {
146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                mSelected = true;
147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                closeFragment();
148816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
149816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private boolean isAvailable() {
152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (!mPipInput.isAvailable()) {
153816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                return false;
154816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
155816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            // If this input shares the same parent with the current main input, you cannot select
157816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            // it. (E.g. two HDMI CEC devices that are connected to HDMI port 1 through an A/V
158816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            // receiver.)
1592e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            PipInput pipInput = mPipInputManager.getPipInput(getMainActivity().getCurrentChannel());
1602e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            if (pipInput == null) {
1612e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                return false;
1622e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            }
1632e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            TvInputInfo mainInputInfo = pipInput.getInputInfo();
164816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            TvInputInfo pipInputInfo = mPipInput.getInputInfo();
165816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            return mainInputInfo == null || pipInputInfo == null
166816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    || !TextUtils.equals(mainInputInfo.getId(), pipInputInfo.getId())
167816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    && !TextUtils.equals(mainInputInfo.getParentId(), pipInputInfo.getParentId());
168816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
169816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
170816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
171