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