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