111417b1cfde8f1749905f2d735623af9214148afJeff Brown/*
211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Copyright (C) 2013 The Android Open Source Project
311417b1cfde8f1749905f2d735623af9214148afJeff Brown *
411417b1cfde8f1749905f2d735623af9214148afJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
511417b1cfde8f1749905f2d735623af9214148afJeff Brown * you may not use this file except in compliance with the License.
611417b1cfde8f1749905f2d735623af9214148afJeff Brown * You may obtain a copy of the License at
711417b1cfde8f1749905f2d735623af9214148afJeff Brown *
811417b1cfde8f1749905f2d735623af9214148afJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
911417b1cfde8f1749905f2d735623af9214148afJeff Brown *
1011417b1cfde8f1749905f2d735623af9214148afJeff Brown * Unless required by applicable law or agreed to in writing, software
1111417b1cfde8f1749905f2d735623af9214148afJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1211417b1cfde8f1749905f2d735623af9214148afJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1311417b1cfde8f1749905f2d735623af9214148afJeff Brown * See the License for the specific language governing permissions and
1411417b1cfde8f1749905f2d735623af9214148afJeff Brown * limitations under the License.
1511417b1cfde8f1749905f2d735623af9214148afJeff Brown */
1611417b1cfde8f1749905f2d735623af9214148afJeff Brownpackage android.support.v7.media;
1711417b1cfde8f1749905f2d735623af9214148afJeff Brown
1811417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Bundle;
1911417b1cfde8f1749905f2d735623af9214148afJeff Brown
2011417b1cfde8f1749905f2d735623af9214148afJeff Brown/**
2111417b1cfde8f1749905f2d735623af9214148afJeff Brown * Describes the kinds of routes that the media router would like to discover
2211417b1cfde8f1749905f2d735623af9214148afJeff Brown * and whether to perform active scanning.
2311417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p>
2411417b1cfde8f1749905f2d735623af9214148afJeff Brown * This object is immutable once created.
2511417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p>
2611417b1cfde8f1749905f2d735623af9214148afJeff Brown */
2711417b1cfde8f1749905f2d735623af9214148afJeff Brownpublic final class MediaRouteDiscoveryRequest {
2811417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_SELECTOR = "selector";
2911417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_ACTIVE_SCAN = "activeScan";
3011417b1cfde8f1749905f2d735623af9214148afJeff Brown
3111417b1cfde8f1749905f2d735623af9214148afJeff Brown    private final Bundle mBundle;
3211417b1cfde8f1749905f2d735623af9214148afJeff Brown    private MediaRouteSelector mSelector;
3311417b1cfde8f1749905f2d735623af9214148afJeff Brown
3411417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
3511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Creates a media route discovery request.
3611417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
3711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @param selector The route selector that specifies the kinds of routes to discover.
3811417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @param activeScan True if active scanning should be performed.
3911417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
4011417b1cfde8f1749905f2d735623af9214148afJeff Brown    public MediaRouteDiscoveryRequest(MediaRouteSelector selector, boolean activeScan) {
4111417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (selector == null) {
4211417b1cfde8f1749905f2d735623af9214148afJeff Brown            throw new IllegalArgumentException("selector must not be null");
4311417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
4411417b1cfde8f1749905f2d735623af9214148afJeff Brown
4511417b1cfde8f1749905f2d735623af9214148afJeff Brown        mBundle = new Bundle();
4611417b1cfde8f1749905f2d735623af9214148afJeff Brown        mSelector = selector;
4711417b1cfde8f1749905f2d735623af9214148afJeff Brown        mBundle.putBundle(KEY_SELECTOR, selector.asBundle());
4811417b1cfde8f1749905f2d735623af9214148afJeff Brown        mBundle.putBoolean(KEY_ACTIVE_SCAN, activeScan);
4911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
5011417b1cfde8f1749905f2d735623af9214148afJeff Brown
5111417b1cfde8f1749905f2d735623af9214148afJeff Brown    private MediaRouteDiscoveryRequest(Bundle bundle) {
5211417b1cfde8f1749905f2d735623af9214148afJeff Brown        mBundle = bundle;
5311417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
5411417b1cfde8f1749905f2d735623af9214148afJeff Brown
5511417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
5611417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route selector that specifies the kinds of routes to discover.
5711417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
5811417b1cfde8f1749905f2d735623af9214148afJeff Brown    public MediaRouteSelector getSelector() {
5911417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureSelector();
6011417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mSelector;
6111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
6211417b1cfde8f1749905f2d735623af9214148afJeff Brown
6311417b1cfde8f1749905f2d735623af9214148afJeff Brown    private void ensureSelector() {
6411417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (mSelector == null) {
6511417b1cfde8f1749905f2d735623af9214148afJeff Brown            mSelector = MediaRouteSelector.fromBundle(mBundle.getBundle(KEY_SELECTOR));
6611417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mSelector == null) {
6711417b1cfde8f1749905f2d735623af9214148afJeff Brown                mSelector = MediaRouteSelector.EMPTY;
6811417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
6911417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
7011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
7111417b1cfde8f1749905f2d735623af9214148afJeff Brown
7211417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
7311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Returns true if active scanning should be performed.
7411417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
75f03da4a9e6cc02251c2f804eb6f25da61821d6a7Jeff Brown     * @see MediaRouter#CALLBACK_FLAG_PERFORM_ACTIVE_SCAN
7611417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
7711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isActiveScan() {
7811417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getBoolean(KEY_ACTIVE_SCAN);
7911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
8011417b1cfde8f1749905f2d735623af9214148afJeff Brown
8111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
8211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Returns true if the discovery request has all of the required fields.
8311417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
8411417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isValid() {
8511417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureSelector();
8611417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mSelector.isValid();
8711417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
8811417b1cfde8f1749905f2d735623af9214148afJeff Brown
8911417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
9011417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean equals(Object o) {
9111417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (o instanceof MediaRouteDiscoveryRequest) {
9211417b1cfde8f1749905f2d735623af9214148afJeff Brown            MediaRouteDiscoveryRequest other = (MediaRouteDiscoveryRequest)o;
9311417b1cfde8f1749905f2d735623af9214148afJeff Brown            return getSelector().equals(other.getSelector())
9411417b1cfde8f1749905f2d735623af9214148afJeff Brown                    && isActiveScan() == other.isActiveScan();
9511417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
9611417b1cfde8f1749905f2d735623af9214148afJeff Brown        return false;
9711417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
9811417b1cfde8f1749905f2d735623af9214148afJeff Brown
9911417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
10011417b1cfde8f1749905f2d735623af9214148afJeff Brown    public int hashCode() {
10111417b1cfde8f1749905f2d735623af9214148afJeff Brown        return getSelector().hashCode() ^ (isActiveScan() ? 1 : 0);
10211417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
10311417b1cfde8f1749905f2d735623af9214148afJeff Brown
10411417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
10511417b1cfde8f1749905f2d735623af9214148afJeff Brown    public String toString() {
10611417b1cfde8f1749905f2d735623af9214148afJeff Brown        StringBuilder result = new StringBuilder();
10711417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append("DiscoveryRequest{ selector=").append(getSelector());
10811417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", activeScan=").append(isActiveScan());
10911417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", isValid=").append(isValid());
11011417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(" }");
11111417b1cfde8f1749905f2d735623af9214148afJeff Brown        return result.toString();
11211417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
11311417b1cfde8f1749905f2d735623af9214148afJeff Brown
11411417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
11511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Converts this object to a bundle for serialization.
11611417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
11711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The contents of the object represented as a bundle.
11811417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
11911417b1cfde8f1749905f2d735623af9214148afJeff Brown    public Bundle asBundle() {
12011417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle;
12111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
12211417b1cfde8f1749905f2d735623af9214148afJeff Brown
12311417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
12411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Creates an instance from a bundle.
12511417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
12611417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @param bundle The bundle, or null if none.
12711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The new instance, or null if the bundle was null.
12811417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
12911417b1cfde8f1749905f2d735623af9214148afJeff Brown    public static MediaRouteDiscoveryRequest fromBundle(Bundle bundle) {
13011417b1cfde8f1749905f2d735623af9214148afJeff Brown        return bundle != null ? new MediaRouteDiscoveryRequest(bundle) : null;
13111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
13211417b1cfde8f1749905f2d735623af9214148afJeff Brown}
133