/* * Copyright (C) 2013 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 android.support.v7.app; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.media.MediaRouter; import android.support.v7.media.MediaRouteSelector; /** * Media route discovery fragment. * <p> * This fragment takes care of registering a callback for media route discovery * during the activity's {@link android.app.Activity#onStart onStart()} phase * and removing it during the {@link android.app.Activity#onStart onStop()} phase. * </p><p> * The application must supply a route selector to specify the kinds of routes * to discover. The application may also override {@link #onCreateCallback} to * provide the {@link MediaRouter} callback to register. * </p> */ public class MediaRouteDiscoveryFragment extends Fragment { private final String ARGUMENT_SELECTOR = "selector"; private MediaRouter mRouter; private MediaRouteSelector mSelector; private MediaRouter.Callback mCallback; public MediaRouteDiscoveryFragment() { } /** * Gets the media router instance. */ public MediaRouter getMediaRouter() { ensureRouter(); return mRouter; } private void ensureRouter() { if (mRouter == null) { mRouter = MediaRouter.getInstance(getActivity()); } } /** * Gets the media route selector for filtering the routes to be discovered. * * @return The selector, never null. */ public MediaRouteSelector getRouteSelector() { ensureRouteSelector(); return mSelector; } /** * Sets the media route selector for filtering the routes to be discovered. * This method must be called before the fragment is added. * * @param selector The selector to set. */ public void setRouteSelector(MediaRouteSelector selector) { if (selector == null) { throw new IllegalArgumentException("selector must not be null"); } ensureRouteSelector(); if (!mSelector.equals(selector)) { mSelector = selector; Bundle args = getArguments(); if (args == null) { args = new Bundle(); } args.putBundle(ARGUMENT_SELECTOR, selector.asBundle()); setArguments(args); if (mCallback != null) { mRouter.removeCallback(mCallback); mRouter.addCallback(mSelector, mCallback, onPrepareCallbackFlags()); } } } private void ensureRouteSelector() { if (mSelector == null) { Bundle args = getArguments(); if (args != null) { mSelector = MediaRouteSelector.fromBundle(args.getBundle(ARGUMENT_SELECTOR)); } if (mSelector == null) { mSelector = MediaRouteSelector.EMPTY; } } } /** * Called to create the {@link android.support.v7.media.MediaRouter.Callback callback} * that will be registered. * <p> * The default callback does nothing. The application may override this method to * supply its own callback. * </p> * * @return The new callback, or null if no callback should be registered. */ public MediaRouter.Callback onCreateCallback() { return new MediaRouter.Callback() { }; } /** * Called to prepare the callback flags that will be used when the * {@link android.support.v7.media.MediaRouter.Callback callback} is registered. * <p> * The default implementation returns {@link MediaRouter#CALLBACK_FLAG_REQUEST_DISCOVERY}. * </p> * * @return The desired callback flags. */ public int onPrepareCallbackFlags() { return MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY; } @Override public void onStart() { super.onStart(); ensureRouteSelector(); ensureRouter(); mCallback = onCreateCallback(); if (mCallback != null) { mRouter.addCallback(mSelector, mCallback, onPrepareCallbackFlags()); } } @Override public void onStop() { if (mCallback != null) { mRouter.removeCallback(mCallback); mCallback = null; } super.onStop(); } }