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