MenuUpdater.java revision 633eb826b8c97731dfc5ef12c7bf78a63734275d
1/* 2 * Copyright (C) 2016 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 17package com.android.tv.menu; 18 19import android.support.annotation.Nullable; 20 21import com.android.tv.ChannelTuner; 22import com.android.tv.TvOptionsManager; 23import com.android.tv.TvOptionsManager.OptionChangedListener; 24import com.android.tv.TvOptionsManager.OptionType; 25import com.android.tv.data.Channel; 26import com.android.tv.menu.MenuRowFactory.TvOptionsRow; 27import com.android.tv.ui.TunableTvView; 28import com.android.tv.ui.TunableTvView.OnScreenBlockingChangedListener; 29 30/** 31 * Update menu items when needed. 32 * 33 * <p>As the menu is updated when it shows up, this class handles only the dynamic updates. 34 */ 35public class MenuUpdater { 36 private final Menu mMenu; 37 // Can be null for testing. 38 @Nullable private final TunableTvView mTvView; 39 @Nullable private final TvOptionsManager mOptionsManager; 40 private ChannelTuner mChannelTuner; 41 42 private final ChannelTuner.Listener mChannelTunerListener = new ChannelTuner.Listener() { 43 @Override 44 public void onLoadFinished() {} 45 46 @Override 47 public void onBrowsableChannelListChanged() { 48 mMenu.update(ChannelsRow.ID); 49 } 50 51 @Override 52 public void onCurrentChannelUnavailable(Channel channel) {} 53 54 @Override 55 public void onChannelChanged(Channel previousChannel, Channel currentChannel) { 56 mMenu.update(ChannelsRow.ID); 57 } 58 }; 59 private final OptionChangedListener mOptionChangeListener = new OptionChangedListener() { 60 @Override 61 public void onOptionChanged(@OptionType int optionType, String newString) { 62 mMenu.update(TvOptionsRow.ID); 63 } 64 }; 65 66 public MenuUpdater(Menu menu, TunableTvView tvView, TvOptionsManager optionsManager) { 67 mMenu = menu; 68 mTvView = tvView; 69 mOptionsManager = optionsManager; 70 if (mTvView != null) { 71 mTvView.setOnScreenBlockedListener(new OnScreenBlockingChangedListener() { 72 @Override 73 public void onScreenBlockingChanged(boolean blocked) { 74 mMenu.update(PlayControlsRow.ID); 75 } 76 }); 77 } 78 if (mOptionsManager != null) { 79 mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_CLOSED_CAPTIONS, 80 mOptionChangeListener); 81 mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_DISPLAY_MODE, 82 mOptionChangeListener); 83 mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_MULTI_AUDIO, 84 mOptionChangeListener); 85 } 86 } 87 88 /** 89 * Sets the instance of {@link ChannelTuner}. Call this method when the channel tuner is ready. 90 */ 91 public void setChannelTuner(ChannelTuner channelTuner) { 92 if (mChannelTuner != null) { 93 mChannelTuner.removeListener(mChannelTunerListener); 94 } 95 mChannelTuner = channelTuner; 96 if (mChannelTuner != null) { 97 mChannelTuner.addListener(mChannelTunerListener); 98 } 99 } 100 101 /** 102 * Called when the stream information changes. 103 */ 104 public void onStreamInfoChanged() { 105 mMenu.update(TvOptionsRow.ID); 106 } 107 108 /** 109 * Called at the end of the menu's lifetime. 110 */ 111 public void release() { 112 if (mChannelTuner != null) { 113 mChannelTuner.removeListener(mChannelTunerListener); 114 } 115 if (mTvView != null) { 116 mTvView.setOnScreenBlockedListener(null); 117 } 118 if (mOptionsManager != null) { 119 mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_CLOSED_CAPTIONS, null); 120 mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_DISPLAY_MODE, null); 121 mOptionsManager.setOptionChangedListener(TvOptionsManager.OPTION_MULTI_AUDIO, null); 122 } 123 } 124} 125