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; 18 19 import android.support.annotation.MainThread; 20 import android.support.annotation.NonNull; 21 import android.support.annotation.Nullable; 22 import android.util.ArraySet; 23 24 import com.android.tv.data.Channel; 25 26 import java.util.Set; 27 28 /** 29 * A wrapper for safely getting the current {@link MainActivity}. 30 * Note that this class is not thread-safe. All the public methods should be called on main thread. 31 */ 32 @MainThread 33 public final class MainActivityWrapper { 34 private MainActivity mActivity; 35 36 private final Set<OnCurrentChannelChangeListener> mListeners = new ArraySet<>(); 37 38 /** 39 * Returns the current main activity. 40 * <b>WARNING</b> do not keep a reference to MainActivity, leaking activities is expensive. 41 */ getMainActivity()42 MainActivity getMainActivity() { 43 return mActivity; 44 } 45 46 /** 47 * Checks if the given {@code activity} is the current main activity. 48 */ isCurrent(MainActivity activity)49 boolean isCurrent(MainActivity activity) { 50 return activity != null && mActivity == activity; 51 } 52 53 /** 54 * Sets the currently created main activity instance. 55 */ onMainActivityCreated(@onNull MainActivity activity)56 public void onMainActivityCreated(@NonNull MainActivity activity) { 57 mActivity = activity; 58 } 59 60 /** 61 * Unsets the main activity instance. 62 */ onMainActivityDestroyed(@onNull MainActivity activity)63 public void onMainActivityDestroyed(@NonNull MainActivity activity) { 64 if (mActivity != activity) { 65 mActivity = null; 66 } 67 } 68 69 /** 70 * Notifies the current channel change. 71 */ notifyCurrentChannelChange(@onNull MainActivity caller, @Nullable Channel channel)72 void notifyCurrentChannelChange(@NonNull MainActivity caller, @Nullable Channel channel) { 73 if (mActivity == caller) { 74 for (OnCurrentChannelChangeListener listener : mListeners) { 75 listener.onCurrentChannelChange(channel); 76 } 77 } 78 } 79 80 /** 81 * Checks if the main activity is created. 82 */ isCreated()83 public boolean isCreated() { 84 return mActivity != null; 85 } 86 87 /** 88 * Checks if the main activity is started. 89 */ isStarted()90 public boolean isStarted() { 91 return mActivity != null && mActivity.isActivityStarted(); 92 } 93 94 /** 95 * Checks if the main activity is resumed. 96 */ isResumed()97 public boolean isResumed() { 98 return mActivity != null && mActivity.isActivityResumed(); 99 } 100 101 /** 102 * Adds OnCurrentChannelChangeListener. 103 */ addOnCurrentChannelChangeListener(OnCurrentChannelChangeListener listener)104 public void addOnCurrentChannelChangeListener(OnCurrentChannelChangeListener listener) { 105 mListeners.add(listener); 106 } 107 108 /** 109 * Removes OnCurrentChannelChangeListener. 110 */ removeOnCurrentChannelChangeListener(OnCurrentChannelChangeListener listener)111 public void removeOnCurrentChannelChangeListener(OnCurrentChannelChangeListener listener) { 112 mListeners.remove(listener); 113 } 114 115 /** 116 * Listener for the current channel change in main activity. 117 */ 118 public interface OnCurrentChannelChangeListener { 119 /** 120 * Called when the current channel changes. 121 */ onCurrentChannelChange(@ullable Channel channel)122 void onCurrentChannelChange(@Nullable Channel channel); 123 } 124 } 125