/* * 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.support.annotation.MainThread; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.ArraySet; import com.android.tv.data.Channel; import java.util.Set; /** * A wrapper for safely getting the current {@link MainActivity}. * Note that this class is not thread-safe. All the public methods should be called on main thread. */ @MainThread public final class MainActivityWrapper { private MainActivity mActivity; private final Set mListeners = new ArraySet<>(); /** * Returns the current main activity. * WARNING do not keep a reference to MainActivity, leaking activities is expensive. */ MainActivity getMainActivity() { return mActivity; } /** * Checks if the given {@code activity} is the current main activity. */ boolean isCurrent(MainActivity activity) { return activity != null && mActivity == activity; } /** * Sets the currently created main activity instance. */ public void onMainActivityCreated(@NonNull MainActivity activity) { mActivity = activity; } /** * Unsets the main activity instance. */ public void onMainActivityDestroyed(@NonNull MainActivity activity) { if (mActivity != activity) { mActivity = null; } } /** * Notifies the current channel change. */ void notifyCurrentChannelChange(@NonNull MainActivity caller, @Nullable Channel channel) { if (mActivity == caller) { for (OnCurrentChannelChangeListener listener : mListeners) { listener.onCurrentChannelChange(channel); } } } /** * Checks if the main activity is created. */ public boolean isCreated() { return mActivity != null; } /** * Checks if the main activity is started. */ public boolean isStarted() { return mActivity != null && mActivity.isActivityStarted(); } /** * Checks if the main activity is resumed. */ public boolean isResumed() { return mActivity != null && mActivity.isActivityResumed(); } /** * Adds OnCurrentChannelChangeListener. */ public void addOnCurrentChannelChangeListener(OnCurrentChannelChangeListener listener) { mListeners.add(listener); } /** * Removes OnCurrentChannelChangeListener. */ public void removeOnCurrentChannelChangeListener(OnCurrentChannelChangeListener listener) { mListeners.remove(listener); } /** * Listener for the current channel change in main activity. */ public interface OnCurrentChannelChangeListener { /** * Called when the current channel changes. */ void onCurrentChannelChange(@Nullable Channel channel); } }