diff options
Diffstat (limited to 'src/com/android/tv/TvOptionsManager.java')
-rw-r--r-- | src/com/android/tv/TvOptionsManager.java | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/src/com/android/tv/TvOptionsManager.java b/src/com/android/tv/TvOptionsManager.java new file mode 100644 index 00000000..8af35fae --- /dev/null +++ b/src/com/android/tv/TvOptionsManager.java @@ -0,0 +1,194 @@ +/* + * 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_PIP = 2; + public static final int OPTION_MULTI_AUDIO = 3; + public static final int OPTION_CHANNEL_SOURCES = 4; + public static final int OPTION_PARENTAL_CONTROLS = 5; + public static final int OPTION_ABOUT = 6; + + 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<OptionChangedListener> mOptionChangedListeners = new SparseArray<>(); + + private String mClosedCaptionsLanguage; + private int mDisplayMode; + private boolean mPip; + private String mMultiAudio; + private boolean mIsParentalControlEnabled; + 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_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_PARENTAL_CONTROLS: + return mContext.getString( + mIsParentalControlEnabled ? R.string.option_toggle_parental_controls_on + : R.string.option_toggle_parental_controls_off); + 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_PIP); + } + + public void onMultiAudioChanged(String multiAudio) { + mMultiAudio = multiAudio; + notifyOptionChanged(OPTION_MULTI_AUDIO); + } + + public void onParentalControlChanged(boolean isParentalControlEnabled) { + mIsParentalControlEnabled = isParentalControlEnabled; + notifyOptionChanged(OPTION_PARENTAL_CONTROLS); + } + + 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); + } +} |