• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.tv.menu;
18 
19 import android.content.Context;
20 import android.media.tv.TvTrackInfo;
21 import android.support.annotation.VisibleForTesting;
22 import com.android.tv.TvFeatures;
23 import com.android.tv.TvOptionsManager;
24 import com.android.tv.common.customization.CustomAction;
25 import com.android.tv.common.util.CommonUtils;
26 import com.android.tv.data.DisplayMode;
27 import com.android.tv.ui.TvViewUiManager;
28 import com.android.tv.ui.sidepanel.ClosedCaptionFragment;
29 import com.android.tv.ui.sidepanel.DeveloperOptionFragment;
30 import com.android.tv.ui.sidepanel.DisplayModeFragment;
31 import com.android.tv.ui.sidepanel.MultiAudioFragment;
32 import java.util.ArrayList;
33 import java.util.List;
34 
35 /*
36  * An adapter of options.
37  */
38 public class TvOptionsRowAdapter extends CustomizableOptionsRowAdapter {
TvOptionsRowAdapter(Context context, List<CustomAction> customActions)39     public TvOptionsRowAdapter(Context context, List<CustomAction> customActions) {
40         super(context, customActions);
41     }
42 
43     @Override
createBaseActions()44     protected List<MenuAction> createBaseActions() {
45         List<MenuAction> actionList = new ArrayList<>();
46         actionList.add(MenuAction.SELECT_CLOSED_CAPTION_ACTION);
47         actionList.add(MenuAction.SELECT_DISPLAY_MODE_ACTION);
48         if (TvFeatures.PICTURE_IN_PICTURE.isEnabled(getMainActivity())) {
49             actionList.add(MenuAction.SYSTEMWIDE_PIP_ACTION);
50         }
51         actionList.add(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION);
52         actionList.add(MenuAction.MORE_CHANNELS_ACTION);
53         if (CommonUtils.isDeveloper()) {
54             actionList.add(MenuAction.DEV_ACTION);
55         }
56         actionList.add(MenuAction.SETTINGS_ACTION);
57 
58         updateClosedCaptionAction();
59         updatePipAction();
60         updateMultiAudioAction();
61         updateDisplayModeAction();
62         return actionList;
63     }
64 
65     @Override
updateActions()66     protected void updateActions() {
67         if (updateClosedCaptionAction()) {
68             notifyItemChanged(getItemPosition(MenuAction.SELECT_CLOSED_CAPTION_ACTION));
69         }
70         if (updatePipAction()) {
71             notifyItemChanged(getItemPosition(MenuAction.SYSTEMWIDE_PIP_ACTION));
72         }
73         if (updateMultiAudioAction()) {
74             notifyItemChanged(getItemPosition(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION));
75         }
76         if (updateDisplayModeAction()) {
77             notifyItemChanged(getItemPosition(MenuAction.SELECT_DISPLAY_MODE_ACTION));
78         }
79     }
80 
81     @VisibleForTesting
updateClosedCaptionAction()82     private boolean updateClosedCaptionAction() {
83         return updateActionDescription(MenuAction.SELECT_CLOSED_CAPTION_ACTION);
84     }
85 
updatePipAction()86     private boolean updatePipAction() {
87         if (containsItem(MenuAction.SYSTEMWIDE_PIP_ACTION)) {
88             return MenuAction.setEnabled(
89                     MenuAction.SYSTEMWIDE_PIP_ACTION,
90                     !getMainActivity().isScreenBlockedByResourceConflictOrParentalControl());
91         }
92         return false;
93     }
94 
updateMultiAudioAction()95     boolean updateMultiAudioAction() {
96         List<TvTrackInfo> audioTracks = getMainActivity().getTracks(TvTrackInfo.TYPE_AUDIO);
97         boolean enabled = audioTracks != null && audioTracks.size() > 1;
98         // Use "|" operator for non-short-circuit evaluation.
99         return MenuAction.setEnabled(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION, enabled)
100                 | updateActionDescription(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION);
101     }
102 
updateDisplayModeAction()103     private boolean updateDisplayModeAction() {
104         TvViewUiManager uiManager = getMainActivity().getTvViewUiManager();
105         boolean enabled =
106                 uiManager.isDisplayModeAvailable(DisplayMode.MODE_FULL)
107                         || uiManager.isDisplayModeAvailable(DisplayMode.MODE_ZOOM);
108         // Use "|" operator for non-short-circuit evaluation.
109         return MenuAction.setEnabled(MenuAction.SELECT_DISPLAY_MODE_ACTION, enabled)
110                 | updateActionDescription(MenuAction.SELECT_DISPLAY_MODE_ACTION);
111     }
112 
updateActionDescription(MenuAction action)113     private boolean updateActionDescription(MenuAction action) {
114         return MenuAction.setActionDescription(
115                 action, getMainActivity().getTvOptionsManager().getOptionString(action.getType()));
116     }
117 
118     @Override
executeBaseAction(int type)119     protected void executeBaseAction(int type) {
120         switch (type) {
121             case TvOptionsManager.OPTION_CLOSED_CAPTIONS:
122                 getMainActivity()
123                         .getOverlayManager()
124                         .getSideFragmentManager()
125                         .show(new ClosedCaptionFragment());
126                 break;
127             case TvOptionsManager.OPTION_DISPLAY_MODE:
128                 getMainActivity()
129                         .getOverlayManager()
130                         .getSideFragmentManager()
131                         .show(new DisplayModeFragment());
132                 break;
133             case TvOptionsManager.OPTION_SYSTEMWIDE_PIP:
134                 getMainActivity().enterPictureInPictureMode();
135                 break;
136             case TvOptionsManager.OPTION_MULTI_AUDIO:
137                 getMainActivity()
138                         .getOverlayManager()
139                         .getSideFragmentManager()
140                         .show(new MultiAudioFragment());
141                 break;
142             case TvOptionsManager.OPTION_MORE_CHANNELS:
143                 getMainActivity().showMerchantCollection();
144                 break;
145             case TvOptionsManager.OPTION_DEVELOPER:
146                 getMainActivity()
147                         .getOverlayManager()
148                         .getSideFragmentManager()
149                         .show(new DeveloperOptionFragment());
150                 break;
151             case TvOptionsManager.OPTION_SETTINGS:
152                 getMainActivity().showSettingsFragment();
153                 break;
154         }
155     }
156 }
157