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