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
17ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkerstenpackage com.android.tv.ui.sidepanel;
18ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten
19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.media.tv.TvTrackInfo;
20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.Bundle;
216ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.text.TextUtils;
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.KeyEvent;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.LayoutInflater;
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.View;
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.ViewGroup;
26ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten
27ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkerstenimport com.android.tv.R;
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.CaptionSettings;
29ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten
30ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkerstenimport java.util.ArrayList;
31ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkerstenimport java.util.List;
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.Locale;
33ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten
34ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkerstenpublic class ClosedCaptionFragment extends SideFragment {
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final String TRACKER_LABEL ="closed caption" ;
36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private boolean mResetClosedCaption;
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private int mClosedCaptionOption;
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private String mClosedCaptionLanguage;
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private String mClosedCaptionTrackId;
40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private ClosedCaptionOptionItem mSelectedItem;
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public ClosedCaptionFragment() {
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super(KeyEvent.KEYCODE_CAPTIONS, KeyEvent.KEYCODE_S);
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
46ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten    @Override
47ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten    protected String getTitle() {
48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return getString(R.string.side_panel_title_closed_caption);
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public String getTrackerLabel() {
53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return TRACKER_LABEL;
54ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten    }
55ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten
56ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten    @Override
57ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten    protected List<Item> getItemList() {
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        CaptionSettings captionSettings = getMainActivity().getCaptionSettings();
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mResetClosedCaption = true;
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mClosedCaptionOption = captionSettings.getEnableOption();
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mClosedCaptionLanguage = captionSettings.getLanguage();
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mClosedCaptionTrackId = captionSettings.getTrackId();
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
646ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        List<Item> items = new ArrayList<>();
65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mSelectedItem = null;
66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<TvTrackInfo> tracks = getMainActivity().getTracks(TvTrackInfo.TYPE_SUBTITLE);
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (tracks != null && !tracks.isEmpty()) {
696ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            String selectedTrackId = captionSettings.isEnabled() ?
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    getMainActivity().getSelectedTrack(TvTrackInfo.TYPE_SUBTITLE) : null;
716ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            ClosedCaptionOptionItem item = new ClosedCaptionOptionItem(null, null);
726ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            items.add(item);
736ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            if (selectedTrackId == null) {
746ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                mSelectedItem = item;
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                item.setChecked(true);
766ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                setSelectedPosition(0);
77ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten            }
786ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            for (int i = 0; i < tracks.size(); i++) {
796ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                item = new ClosedCaptionOptionItem(tracks.get(i), i);
806ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                if (TextUtils.equals(selectedTrackId, tracks.get(i).getId())) {
81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    mSelectedItem = item;
826ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    item.setChecked(true);
836ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    setSelectedPosition(i + 1);
84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                }
856ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                items.add(item);
86ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten            }
87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (getMainActivity().hasCaptioningSettingsActivity()) {
896ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            items.add(new ActionItem(getString(R.string.closed_caption_system_settings),
90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    getString(R.string.closed_caption_system_settings_description)) {
91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                @Override
92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                protected void onSelected() {
93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    getMainActivity().startSystemCaptioningSettingsActivity();
94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                }
95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                @Override
97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                protected void onFocused() {
98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    super.onFocused();
996ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    if (mSelectedItem != null) {
100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                        getMainActivity().selectSubtitleTrack(
101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                                mSelectedItem.mOption, mSelectedItem.mTrackId);
102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    }
103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                }
104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            });
105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
1066ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return items;
107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public View onCreateView(LayoutInflater inflater, ViewGroup container,
111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            Bundle savedInstanceState) {
112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return super.onCreateView(inflater, container, savedInstanceState);
113ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten    }
114ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten
115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onDestroyView() {
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (mResetClosedCaption) {
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            getMainActivity().selectSubtitleLanguage(mClosedCaptionOption, mClosedCaptionLanguage,
119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    mClosedCaptionTrackId);
120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super.onDestroyView();
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
1246ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    private String getLabel(TvTrackInfo track, Integer trackIndex) {
1256ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        if (track == null) {
1266ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            return getString(R.string.closed_caption_option_item_off);
1276ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        } else if (track.getLanguage() != null) {
128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            return new Locale(track.getLanguage()).getDisplayName();
129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
1306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return getString(R.string.closed_caption_unknown_language, trackIndex + 1);
131816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private class ClosedCaptionOptionItem extends RadioButtonItem {
134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private final int mOption;
135816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private final String mTrackId;
136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
1376ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        private ClosedCaptionOptionItem(TvTrackInfo track, Integer trackIndex) {
1386ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            super(getLabel(track, trackIndex));
1396ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            if (track == null) {
1406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                mOption = CaptionSettings.OPTION_OFF;
1416ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                mTrackId = null;
1426ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            } else {
1436ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                mOption = CaptionSettings.OPTION_ON;
1446ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                mTrackId = track.getId();
1456ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            }
146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
148816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
149816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onSelected() {
150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onSelected();
151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mSelectedItem = this;
152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            getMainActivity().selectSubtitleTrack(mOption, mTrackId);
153816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mResetClosedCaption = false;
154816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            closeFragment();
155816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
157816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
158816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onFocused() {
159816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onFocused();
160816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            getMainActivity().selectSubtitleTrack(mOption, mTrackId);
161816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
162ad8bb145f00812459b96e54fdaad36f3a7a3612cChristofer Åkersten    }
163816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
164