1ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko/* 2ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Copyright (C) 2015 The Android Open Source Project 3ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * 4ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 5ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * you may not use this file except in compliance with the License. 6ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * You may obtain a copy of the License at 7ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * 8ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 9ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * 10ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Unless required by applicable law or agreed to in writing, software 11ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 12ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * See the License for the specific language governing permissions and 14ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * limitations under the License. 15ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 16ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 17ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopackage com.android.tv; 18ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 19ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.support.annotation.MainThread; 20ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.support.annotation.NonNull; 21ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.support.annotation.Nullable; 22ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.support.annotation.UiThread; 2348dadb49248271b01997862e1335912a4f2e189fYoungsang Choimport android.util.ArraySet; 24ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 25ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport com.android.tv.data.Channel; 26ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 27ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport java.util.Set; 28ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 29ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko/** 30ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * A wrapper for safely getting the current {@link MainActivity}. 31ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Note that this class is not thread-safe. All the public methods should be called on main thread. 32ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 33ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko@MainThread 34ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopublic final class MainActivityWrapper { 35ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko private MainActivity mActivity; 36ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 3748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho private final Set<OnCurrentChannelChangeListener> mListeners = new ArraySet<>(); 38ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 39ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 40ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Returns the current main activity. 41ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * <b>WARNING</b> do not keep a reference to MainActivity, leaking activities is expensive. 42ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 43ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko MainActivity getMainActivity() { 44ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return mActivity; 45ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 46ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 47ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 48ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Checks if the given {@code activity} is the current main activity. 49ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 50ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko boolean isCurrent(MainActivity activity) { 51ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return activity != null && mActivity == activity; 52ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 53ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 54ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 55ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Sets the currently created main activity instance. 56ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 57ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko @UiThread 58ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public void onMainActivityCreated(@NonNull MainActivity activity) { 59ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko mActivity = activity; 60ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 61ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 62ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 63ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Unsets the main activity instance. 64ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 65ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko @UiThread 66ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public void onMainActivityDestroyed(@NonNull MainActivity activity) { 67ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko if (mActivity != activity) { 68ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko mActivity = null; 69ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 70ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 71ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 72ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 73ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Notifies the current channel change. 74ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 75ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko void notifyCurrentChannelChange(@NonNull MainActivity caller, @Nullable Channel channel) { 76ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko if (mActivity == caller) { 77ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko for (OnCurrentChannelChangeListener listener : mListeners) { 78ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko listener.onCurrentChannelChange(channel); 79ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 80ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 81ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 82ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 83ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 84ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Checks if the main activity is created. 85ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 86ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public boolean isCreated() { 87ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return mActivity != null; 88ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 89ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 90ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 91ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Checks if the main activity is started. 92ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 93ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public boolean isStarted() { 94ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return mActivity != null && mActivity.isActivityStarted(); 95ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 96ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 97ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 98ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Checks if the main activity is resumed. 99ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 100ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public boolean isResumed() { 101ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return mActivity != null && mActivity.isActivityResumed(); 102ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 103ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 104ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 105ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Adds OnCurrentChannelChangeListener. 106ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 107ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko @UiThread 108ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public void addOnCurrentChannelChangeListener(OnCurrentChannelChangeListener listener) { 109ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko mListeners.add(listener); 110ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 111ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 112ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 113ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Removes OnCurrentChannelChangeListener. 114ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 115ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko @UiThread 116ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public void removeOnCurrentChannelChangeListener(OnCurrentChannelChangeListener listener) { 117ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko mListeners.remove(listener); 118ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 119ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 120ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 121ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Listener for the current channel change in main activity. 122ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 123ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public interface OnCurrentChannelChangeListener { 124ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 125ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Called when the current channel changes. 126ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 127ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko void onCurrentChannelChange(@Nullable Channel channel); 128ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 129ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko} 130