blob: dc29667e4cca190e808e9b4074f6fe95e378f20d [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tv.menu;
import android.content.Context;
import android.media.tv.TvTrackInfo;
import android.text.TextUtils;
import android.support.annotation.Nullable;
import com.android.tv.TvOptionsManager;
import com.android.tv.common.BuildConfig;
import com.android.tv.common.customization.CustomAction;
import com.android.tv.data.DisplayMode;
import com.android.tv.features.TvFeatures;
import com.android.tv.ui.TvViewUiManager;
import com.android.tv.ui.sidepanel.ClosedCaptionFragment;
import com.android.tv.ui.sidepanel.DeveloperOptionFragment;
import com.android.tv.ui.sidepanel.DisplayModeFragment;
import com.android.tv.ui.sidepanel.MultiAudioFragment;
import com.google.auto.factory.AutoFactory;
import com.google.auto.factory.Provided;
import com.android.tv.common.flags.LegacyFlags;
import com.android.tv.common.flags.UiFlags;
import java.util.ArrayList;
import java.util.List;
/*
* An adapter of options.
*/
@AutoFactory(implementing = TvOptionsRowAdapter.Factory.class)
public class TvOptionsRowAdapter extends CustomizableOptionsRowAdapter {
private final LegacyFlags mLegacyFlags;
private final UiFlags mUiFlags;
/** Factory for a {@link TvOptionsRowAdapter}. */
public interface Factory {
/** Creates a {@link TvOptionsRowAdapter} */
TvOptionsRowAdapter create(Context context, @Nullable List<CustomAction> customActions);
}
public TvOptionsRowAdapter(
Context context,
@Nullable List<CustomAction> customActions,
@Provided LegacyFlags mLegacyFlags,
@Provided UiFlags uiFlags) {
super(context, customActions);
this.mLegacyFlags = mLegacyFlags;
mUiFlags = uiFlags;
}
@Override
protected List<MenuAction> createBaseActions() {
List<MenuAction> actionList = new ArrayList<>();
actionList.add(MenuAction.SELECT_CLOSED_CAPTION_ACTION);
actionList.add(MenuAction.SELECT_DISPLAY_MODE_ACTION);
if (TvFeatures.PICTURE_IN_PICTURE.isEnabled(getMainActivity())) {
actionList.add(MenuAction.SYSTEMWIDE_PIP_ACTION);
}
actionList.add(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION);
if (!TextUtils.isEmpty(mUiFlags.moreChannelsUrl())) {
actionList.add(MenuAction.MORE_CHANNELS_ACTION);
}
if (BuildConfig.ENG || mLegacyFlags.enableDeveloperFeatures()) {
actionList.add(MenuAction.DEV_ACTION);
}
actionList.add(MenuAction.SETTINGS_ACTION);
updateClosedCaptionAction();
updatePipAction();
updateMultiAudioAction();
updateDisplayModeAction();
return actionList;
}
@Override
protected void updateActions() {
if (updateClosedCaptionAction()) {
notifyItemChanged(getItemPosition(MenuAction.SELECT_CLOSED_CAPTION_ACTION));
}
if (updatePipAction()) {
notifyItemChanged(getItemPosition(MenuAction.SYSTEMWIDE_PIP_ACTION));
}
if (updateMultiAudioAction()) {
notifyItemChanged(getItemPosition(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION));
}
if (updateDisplayModeAction()) {
notifyItemChanged(getItemPosition(MenuAction.SELECT_DISPLAY_MODE_ACTION));
}
}
private boolean updateClosedCaptionAction() {
return updateActionDescription(MenuAction.SELECT_CLOSED_CAPTION_ACTION);
}
private boolean updatePipAction() {
if (containsItem(MenuAction.SYSTEMWIDE_PIP_ACTION)) {
return MenuAction.setEnabled(
MenuAction.SYSTEMWIDE_PIP_ACTION,
!getMainActivity().isScreenBlockedByResourceConflictOrParentalControl());
}
return false;
}
boolean updateMultiAudioAction() {
List<TvTrackInfo> audioTracks = getMainActivity().getTracks(TvTrackInfo.TYPE_AUDIO);
boolean enabled = audioTracks != null && audioTracks.size() > 1;
// Use "|" operator for non-short-circuit evaluation.
return MenuAction.setEnabled(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION, enabled)
| updateActionDescription(MenuAction.SELECT_AUDIO_LANGUAGE_ACTION);
}
private boolean updateDisplayModeAction() {
TvViewUiManager uiManager = getMainActivity().getTvViewUiManager();
boolean enabled =
uiManager.isDisplayModeAvailable(DisplayMode.MODE_FULL)
|| uiManager.isDisplayModeAvailable(DisplayMode.MODE_ZOOM);
// Use "|" operator for non-short-circuit evaluation.
return MenuAction.setEnabled(MenuAction.SELECT_DISPLAY_MODE_ACTION, enabled)
| updateActionDescription(MenuAction.SELECT_DISPLAY_MODE_ACTION);
}
private boolean updateActionDescription(MenuAction action) {
return MenuAction.setActionDescription(
action, getMainActivity().getTvOptionsManager().getOptionString(action.getType()));
}
@Override
protected void executeBaseAction(int type) {
switch (type) {
case TvOptionsManager.OPTION_CLOSED_CAPTIONS:
getMainActivity()
.getOverlayManager()
.getSideFragmentManager()
.show(new ClosedCaptionFragment());
break;
case TvOptionsManager.OPTION_DISPLAY_MODE:
getMainActivity()
.getOverlayManager()
.getSideFragmentManager()
.show(new DisplayModeFragment());
break;
case TvOptionsManager.OPTION_SYSTEMWIDE_PIP:
getMainActivity().enterPictureInPictureMode();
break;
case TvOptionsManager.OPTION_MULTI_AUDIO:
getMainActivity()
.getOverlayManager()
.getSideFragmentManager()
.show(new MultiAudioFragment());
break;
case TvOptionsManager.OPTION_MORE_CHANNELS:
getMainActivity().showMerchantCollection();
break;
case TvOptionsManager.OPTION_DEVELOPER:
getMainActivity()
.getOverlayManager()
.getSideFragmentManager()
.show(new DeveloperOptionFragment());
break;
case TvOptionsManager.OPTION_SETTINGS:
getMainActivity().showSettingsFragment();
break;
}
}
}