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.TvContract.Channels; 20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.Bundle; 21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.support.v17.leanback.widget.VerticalGridView; 22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.KeyEvent; 23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.LayoutInflater; 24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.View; 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.ViewGroup; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.widget.TextView; 27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.MainActivity; 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.R; 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.Channel; 31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.ChannelNumber; 3207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport com.android.tv.ui.OnRepeatedKeyInterceptListener; 33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.TvInputManagerHelper; 34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.Utils; 35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.ArrayList; 37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.Collections; 38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.Comparator; 39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List; 4048dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport java.util.Iterator; 41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class CustomizeChannelListFragment extends SideFragment { 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final int GROUP_BY_SOURCE = 0; 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final int GROUP_BY_HD_SD = 1; 45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final String TRACKER_LABEL = "customize channel list"; 46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final List<Channel> mChannels = new ArrayList<>(); 48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final long mInitialChannelId; 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private long mLastFocusedChannelId = Channel.INVALID_ID; 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private int mGroupingType = GROUP_BY_SOURCE; 53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private TvInputManagerHelper mInputManager; 54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private Channel.DefaultComparator mChannelComparator; 55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private boolean mGroupByFragmentRunning; 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final List<Item> mItems = new ArrayList<>(); 58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public CustomizeChannelListFragment() { 60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko this(Channel.INVALID_ID); 61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public CustomizeChannelListFragment(long initialChannelId) { 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mInitialChannelId = initialChannelId; 65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void onCreate(Bundle savedInstanceState) { 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onCreate(savedInstanceState); 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mInputManager = getMainActivity().getTvInputManagerHelper(); 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mChannelComparator = new Channel.DefaultComparator(getActivity(), mInputManager); 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public View onCreateView(LayoutInflater inflater, ViewGroup container, 76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Bundle savedInstanceState) { 77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko View view = super.onCreateView(inflater, container, savedInstanceState); 78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko VerticalGridView listView = (VerticalGridView) view.findViewById(R.id.side_panel_list); 7907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko listView.setOnKeyInterceptListener(new OnRepeatedKeyInterceptListener(listView) { 8007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko @Override 8107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko public boolean onInterceptKeyEvent(KeyEvent event) { 8207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko // In order to send tune operation once for continuous channel up/down events, 8307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko // we only call the moveToChannel method on ACTION_UP event of channel switch keys. 8407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko if (event.getAction() == KeyEvent.ACTION_UP) { 8507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko switch (event.getKeyCode()) { 8607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko case KeyEvent.KEYCODE_DPAD_UP: 8707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko case KeyEvent.KEYCODE_DPAD_DOWN: 8807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko if (mLastFocusedChannelId != Channel.INVALID_ID) { 8907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko getMainActivity().tuneToChannel( 9007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko getChannelDataManager().getChannel(mLastFocusedChannelId)); 9107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko } 9207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko break; 9307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko } 9407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko } 9507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko return super.onInterceptKeyEvent(event); 9607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko } 9707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko }); 98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (!mGroupByFragmentRunning) { 100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getMainActivity().startShrunkenTvView(false, true); 101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko int initialChannelPosition = INVALID_POSITION; 103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko int i = 0; 104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (Item item : mItems) { 105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (item instanceof ChannelItem 106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko && ((ChannelItem) item).getChannel().getId() == mInitialChannelId) { 107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko initialChannelPosition = i; 108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko break; 109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ++i; 111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (initialChannelPosition != INVALID_POSITION) { 113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko setSelectedPosition(initialChannelPosition); 114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko setSelectedPosition(0); 116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mLastFocusedChannelId = mInitialChannelId; 118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko MainActivity tvActivity = getMainActivity(); 119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mLastFocusedChannelId != Channel.INVALID_ID && 120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mLastFocusedChannelId != tvActivity.getCurrentChannelId()) { 121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko tvActivity.tuneToChannel(getChannelDataManager().getChannel(mLastFocusedChannelId)); 122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mGroupByFragmentRunning = false; 125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return view; 126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void onDestroyView() { 130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getChannelDataManager().applyUpdatedValuesToDb(); 131816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (!mGroupByFragmentRunning) { 132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getMainActivity().endShrunkenTvView(); 133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onDestroyView(); 135816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 138816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected String getTitle() { 139816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return getString(R.string.side_panel_title_edit_channels_for_an_input); 140816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public String getTrackerLabel() { 144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return TRACKER_LABEL; 145816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 148816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected List<Item> getItemList() { 149816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mItems.clear(); 150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mChannels.clear(); 151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mChannels.addAll(getChannelDataManager().getChannelList()); 152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mGroupingType == GROUP_BY_SOURCE) { 153816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko addItemForGroupBySource(mItems); 154816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 155816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // GROUP_BY_HD_SD 156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko addItemForGroupByHdSd(mItems); 157816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 158816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return mItems; 159816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 160816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 16148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private void cleanUpOneChannelGroupItem(List<Item> items) { 16248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho Iterator<Item> iter = items.iterator(); 16348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho while (iter.hasNext()) { 16448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho Item item = iter.next(); 16548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho if (item instanceof SelectGroupItem) { 16648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho SelectGroupItem selectGroupItem = (SelectGroupItem) item; 16748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho if (selectGroupItem.mChannelItemsInGroup.size() == 1) { 16848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho ((ChannelItem) selectGroupItem.mChannelItemsInGroup.get(0)) 16948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho .mSelectGroupItem = null; 17048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho iter.remove(); 17148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 17248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 17348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 17448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 17548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho 176816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private void addItemForGroupBySource(List<Item> items) { 177816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(new GroupBySubMenu(getString(R.string.edit_channels_group_by_sources))); 178816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko SelectGroupItem selectGroupItem = null; 179816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ArrayList<Channel> channels = new ArrayList<>(mChannels); 180816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Collections.sort(channels, mChannelComparator); 181816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 182816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko String inputId = null; 183816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (Channel channel: channels) { 184816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (!channel.getInputId().equals(inputId)) { 185816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko inputId = channel.getInputId(); 186816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko String inputLabel = Utils.loadLabel(getActivity(), 187816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mInputManager.getTvInputInfo(inputId)); 188816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(new DividerItem(inputLabel)); 189816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko selectGroupItem = new SelectGroupItem(); 190816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(selectGroupItem); 191816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 192816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ChannelItem channelItem = new ChannelItem(channel, selectGroupItem); 193816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(channelItem); 194816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko selectGroupItem.addChannelItem(channelItem); 195816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 19648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho cleanUpOneChannelGroupItem(items); 197816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 198816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 199816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private void addItemForGroupByHdSd(List<Item> items) { 200816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(new GroupBySubMenu(getString(R.string.edit_channels_group_by_hd_sd))); 201816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko SelectGroupItem selectGroupItem = null; 202816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ArrayList<Channel> channels = new ArrayList<>(mChannels); 203816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Collections.sort(channels, new Comparator<Channel>() { 204816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 205816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public int compare(Channel lhs, Channel rhs) { 206816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko boolean lhsHd = isHdChannel(lhs); 207816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko boolean rhsHd = isHdChannel(rhs); 208816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (lhsHd == rhsHd) { 209816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return ChannelNumber.compare(lhs.getDisplayNumber(), rhs.getDisplayNumber()); 210816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 211816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return lhsHd ? -1 : 1; 212816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 213816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 214816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko }); 215816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 216816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Boolean isHdGroup = null; 217816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (Channel channel: channels) { 218816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko boolean isHd = isHdChannel(channel); 219816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (isHdGroup == null || isHd != isHdGroup) { 220816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko isHdGroup = isHd; 221816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(new DividerItem(isHd 222816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ? getString(R.string.edit_channels_group_divider_for_hd) 223816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko : getString(R.string.edit_channels_group_divider_for_sd))); 224816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko selectGroupItem = new SelectGroupItem(); 225816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(selectGroupItem); 226816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 227816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ChannelItem channelItem = new ChannelItem(channel, selectGroupItem); 228816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(channelItem); 229816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko selectGroupItem.addChannelItem(channelItem); 230816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 23148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho cleanUpOneChannelGroupItem(items); 232816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 233816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 234816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static boolean isHdChannel(Channel channel) { 235816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko String videoFormat = channel.getVideoFormat(); 236816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return videoFormat != null && 237816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko (Channels.VIDEO_FORMAT_720P.equals(videoFormat) 238816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko || Channels.VIDEO_FORMAT_1080I.equals(videoFormat) 239816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko || Channels.VIDEO_FORMAT_1080P.equals(videoFormat) 240816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko || Channels.VIDEO_FORMAT_2160P.equals(videoFormat) 241816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko || Channels.VIDEO_FORMAT_4320P.equals(videoFormat)); 242816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 243816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 244816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private class SelectGroupItem extends ActionItem { 245816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final List<ChannelItem> mChannelItemsInGroup = new ArrayList<>(); 246816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private TextView mTextView; 247816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private boolean mAllChecked; 248816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 249816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public SelectGroupItem() { 250816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super(null); 251816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 252816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 253816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private void addChannelItem(ChannelItem channelItem) { 254816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mChannelItemsInGroup.add(channelItem); 255816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 256816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 257816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 258816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onBind(View view) { 259816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onBind(view); 260816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTextView = (TextView) view.findViewById(R.id.title); 261816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 262816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 263816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 264816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onUpdate() { 265816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onUpdate(); 266816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mAllChecked = true; 267816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (ChannelItem channelItem : mChannelItemsInGroup) { 268816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (!channelItem.getChannel().isBrowsable()) { 269816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mAllChecked = false; 270816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko break; 271816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 272816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 273816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTextView.setText(getString(mAllChecked 274816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ? R.string.edit_channels_item_deselect_group 275816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko : R.string.edit_channels_item_select_group)); 276816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 277816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 278816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 279816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onSelected() { 280816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (ChannelItem channelItem : mChannelItemsInGroup) { 281816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Channel channel = channelItem.getChannel(); 282816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (channel.isBrowsable() == mAllChecked) { 283816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getChannelDataManager().updateBrowsable(channel.getId(), !mAllChecked, true); 284816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko channelItem.notifyUpdated(); 285816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 286816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 287816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getChannelDataManager().notifyChannelBrowsableChanged(); 288816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mAllChecked = !mAllChecked; 289816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTextView.setText(getString(mAllChecked 290816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ? R.string.edit_channels_item_deselect_group 291816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko : R.string.edit_channels_item_select_group)); 292816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 293816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 294816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 295816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private class ChannelItem extends ChannelCheckItem { 29648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private SelectGroupItem mSelectGroupItem; 297816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 298816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public ChannelItem(Channel channel, SelectGroupItem selectGroupItem) { 299816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super(channel, getChannelDataManager(), getProgramDataManager()); 300816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mSelectGroupItem = selectGroupItem; 301816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 302816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 303816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 304816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onUpdate() { 305816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onUpdate(); 306816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko setChecked(getChannel().isBrowsable()); 307816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 308816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 309816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 310816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onSelected() { 311816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onSelected(); 312816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getChannelDataManager().updateBrowsable(getChannel().getId(), isChecked()); 31348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho if (mSelectGroupItem != null) { 31448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho mSelectGroupItem.notifyUpdated(); 31548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho } 316816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 317816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 318816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 319816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onFocused() { 320816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onFocused(); 321816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mLastFocusedChannelId = getChannel().getId(); 322816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 323816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 324816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 325816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private class GroupBySubMenu extends SubMenuItem { 326816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final String TRACKER_LABEL = "Group by"; 327816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public GroupBySubMenu(String description) { 328816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super(getString(R.string.edit_channels_item_group_by), description, 329816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getMainActivity().getOverlayManager().getSideFragmentManager()); 330816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 331816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 332816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 333816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected SideFragment getFragment() { 334816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return new SideFragment() { 335816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 336816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected String getTitle() { 337816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return getString(R.string.side_panel_title_group_by); 338816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 339816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 340816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public String getTrackerLabel() { 341816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return GroupBySubMenu.TRACKER_LABEL; 342816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 343816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 344816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 345816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected List<Item> getItemList() { 346816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko List<Item> items = new ArrayList<>(); 347816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(new RadioButtonItem( 348816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getString(R.string.edit_channels_group_by_sources)) { 349816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 350816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onSelected() { 351816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onSelected(); 352816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mGroupingType = GROUP_BY_SOURCE; 353816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko closeFragment(); 354816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 355816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko }); 356816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko items.add(new RadioButtonItem( 357816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getString(R.string.edit_channels_group_by_hd_sd)) { 358816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 359816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onSelected() { 360816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onSelected(); 361816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mGroupingType = GROUP_BY_HD_SD; 362816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko closeFragment(); 363816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 364816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko }); 365816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ((RadioButtonItem) items.get(mGroupingType)).setChecked(true); 366816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return items; 367816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 368816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko }; 369816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 370816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 371816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 372816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onSelected() { 373816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mGroupByFragmentRunning = true; 374816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onSelected(); 375816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 376816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 377816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 378