/* * 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; import android.content.Context; import android.media.tv.TvTrackInfo; import android.util.SparseArray; import com.android.tv.data.DisplayMode; import com.android.tv.util.TvSettings; import com.android.tv.util.TvSettings.PipLayout; import com.android.tv.util.TvSettings.PipSize; import com.android.tv.util.TvSettings.PipSound; import java.util.Locale; /** * The TvOptionsManager is responsible for keeping track of current TV options such as closed * captions and display mode. Can be also used to create MenuAction items to control such options. */ public class TvOptionsManager { public static final int OPTION_CLOSED_CAPTIONS = 0; public static final int OPTION_DISPLAY_MODE = 1; public static final int OPTION_IN_APP_PIP = 2; public static final int OPTION_SYSTEMWIDE_PIP = 3; public static final int OPTION_MULTI_AUDIO = 4; public static final int OPTION_MORE_CHANNELS = 5; public static final int OPTION_DEVELOPER = 6; public static final int OPTION_SETTINGS = 7; public static final int OPTION_PIP_INPUT = 100; public static final int OPTION_PIP_SWAP = 101; public static final int OPTION_PIP_SOUND = 102; public static final int OPTION_PIP_LAYOUT = 103 ; public static final int OPTION_PIP_SIZE = 104; private final Context mContext; private final SparseArray mOptionChangedListeners = new SparseArray<>(); private String mClosedCaptionsLanguage; private int mDisplayMode; private boolean mPip; private String mMultiAudio; private String mPipInput; private boolean mPipSwap; @PipSound private int mPipSound; @PipLayout private int mPipLayout; @PipSize private int mPipSize; public TvOptionsManager(Context context) { mContext = context; } public String getOptionString(int option) { switch (option) { case OPTION_CLOSED_CAPTIONS: if (mClosedCaptionsLanguage == null) { return mContext.getString(R.string.closed_caption_option_item_off); } return new Locale(mClosedCaptionsLanguage).getDisplayName(); case OPTION_DISPLAY_MODE: return ((MainActivity) mContext).getTvViewUiManager() .isDisplayModeAvailable(mDisplayMode) ? DisplayMode.getLabel(mDisplayMode, mContext) : DisplayMode.getLabel(DisplayMode.MODE_NORMAL, mContext); case OPTION_IN_APP_PIP: return mContext.getString( mPip ? R.string.options_item_pip_on : R.string.options_item_pip_off); case OPTION_MULTI_AUDIO: return mMultiAudio; case OPTION_PIP_INPUT: return mPipInput; case OPTION_PIP_SWAP: return mContext.getString(mPipSwap ? R.string.pip_options_item_swap_on : R.string.pip_options_item_swap_off); case OPTION_PIP_SOUND: if (mPipSound == TvSettings.PIP_SOUND_MAIN) { return mContext.getString(R.string.pip_options_item_sound_main); } else if (mPipSound == TvSettings.PIP_SOUND_PIP_WINDOW) { return mContext.getString(R.string.pip_options_item_sound_pip_window); } break; case OPTION_PIP_LAYOUT: if (mPipLayout == TvSettings.PIP_LAYOUT_BOTTOM_RIGHT) { return mContext.getString(R.string.pip_options_item_layout_bottom_right); } else if (mPipLayout == TvSettings.PIP_LAYOUT_TOP_RIGHT) { return mContext.getString(R.string.pip_options_item_layout_top_right); } else if (mPipLayout == TvSettings.PIP_LAYOUT_TOP_LEFT) { return mContext.getString(R.string.pip_options_item_layout_top_left); } else if (mPipLayout == TvSettings.PIP_LAYOUT_BOTTOM_LEFT) { return mContext.getString(R.string.pip_options_item_layout_bottom_left); } else if (mPipLayout == TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) { return mContext.getString(R.string.pip_options_item_layout_side_by_side); } break; case OPTION_PIP_SIZE: if (mPipSize == TvSettings.PIP_SIZE_BIG) { return mContext.getString(R.string.pip_options_item_size_big); } else if (mPipSize == TvSettings.PIP_SIZE_SMALL) { return mContext.getString(R.string.pip_options_item_size_small); } break; } return ""; } public void onClosedCaptionsChanged(TvTrackInfo track) { mClosedCaptionsLanguage = (track == null) ? null : (track.getLanguage() != null) ? track.getLanguage() : mContext.getString(R.string.default_language); notifyOptionChanged(OPTION_CLOSED_CAPTIONS); } public void onDisplayModeChanged(int displayMode) { mDisplayMode = displayMode; notifyOptionChanged(OPTION_DISPLAY_MODE); } public void onPipChanged(boolean pip) { mPip = pip; notifyOptionChanged(OPTION_IN_APP_PIP); } public void onMultiAudioChanged(String multiAudio) { mMultiAudio = multiAudio; notifyOptionChanged(OPTION_MULTI_AUDIO); } public void onPipInputChanged(String pipInput) { mPipInput = pipInput; notifyOptionChanged(OPTION_PIP_INPUT); } public void onPipSwapChanged(boolean pipSwap) { mPipSwap = pipSwap; notifyOptionChanged(OPTION_PIP_SWAP); } public void onPipSoundChanged(@PipSound int pipSound) { mPipSound = pipSound; notifyOptionChanged(OPTION_PIP_SOUND); } public void onPipLayoutChanged(@PipLayout int pipLayout) { mPipLayout = pipLayout; notifyOptionChanged(OPTION_PIP_LAYOUT); } public void onPipSizeChanged(@PipSize int pipSize) { mPipSize = pipSize; notifyOptionChanged(OPTION_PIP_SIZE); } private void notifyOptionChanged(int option) { OptionChangedListener listener = mOptionChangedListeners.get(option); if (listener != null) { listener.onOptionChanged(getOptionString(option)); } } public void setOptionChangedListener(int option, OptionChangedListener listener) { mOptionChangedListeners.put(option, listener); } /** * An interface used to monitor option changes. */ public interface OptionChangedListener { void onOptionChanged(String newOption); } }