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