blob: 7e8073565df676da335e0d86c6ea0c5f3ebf4ee7 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_ANDROID_ROUTER_MEDIA_ROUTER_ANDROID_H_
#define CHROME_BROWSER_MEDIA_ANDROID_ROUTER_MEDIA_ROUTER_ANDROID_H_
#include <jni.h>
#include <stdint.h>
#include "base/android/scoped_java_ref.h"
#include "base/containers/scoped_ptr_hash_map.h"
#include "base/id_map.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "chrome/browser/media/router/media_router_base.h"
namespace content {
class BrowserContext;
}
namespace media_router {
// A stub implementation of MediaRouter interface on Android.
class MediaRouterAndroid : public MediaRouterBase {
public:
~MediaRouterAndroid() override;
static bool Register(JNIEnv* env);
const MediaRoute* FindRouteBySource(const MediaSource::Id& source_id) const;
// MediaRouter implementation.
void CreateRoute(
const MediaSource::Id& source_id,
const MediaSink::Id& sink_id,
const GURL& origin,
content::WebContents* web_contents,
const std::vector<MediaRouteResponseCallback>& callbacks) override;
void JoinRoute(
const MediaSource::Id& source,
const std::string& presentation_id,
const GURL& origin,
content::WebContents* web_contents,
const std::vector<MediaRouteResponseCallback>& callbacks) override;
void ConnectRouteByRouteId(
const MediaSource::Id& source,
const MediaRoute::Id& route_id,
const GURL& origin,
content::WebContents* web_contents,
const std::vector<MediaRouteResponseCallback>& callbacks) override;
void DetachRoute(const MediaRoute::Id& route_id) override;
void TerminateRoute(const MediaRoute::Id& route_id) override;
void SendRouteMessage(const MediaRoute::Id& route_id,
const std::string& message,
const SendRouteMessageCallback& callback) override;
void SendRouteBinaryMessage(
const MediaRoute::Id& route_id,
scoped_ptr<std::vector<uint8_t>> data,
const SendRouteMessageCallback& callback) override;
void AddIssue(const Issue& issue) override;
void ClearIssue(const Issue::Id& issue_id) override;
bool HasLocalDisplayRoute() const override;
// The methods called by the Java counterpart.
// Notifies the media router that information about sinks is received for
// a specific source URN.
void OnSinksReceived(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& jsource_urn,
jint jcount);
// Notifies the media router about a successful route creation.
void OnRouteCreated(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& jmedia_route_id,
const base::android::JavaParamRef<jstring>& jmedia_sink_id,
jint jroute_request_id,
jboolean jis_local);
// Notifies the media router that route creation or joining failed.
void OnRouteRequestError(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& jerror_text,
jint jroute_request_id);
// Notifies the media router when the route was closed.
void OnRouteClosed(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& jmedia_route_id);
// Notifies the media router about the result of sending a message.
void OnMessageSentResult(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean jsuccess,
jint jcallback_id);
// Notifies the media router about a message received from the media route.
void OnMessage(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& jmedia_route_id,
const base::android::JavaParamRef<jstring>& jmessage);
private:
friend class MediaRouterFactory;
explicit MediaRouterAndroid(content::BrowserContext*);
// MediaRouter implementation.
bool RegisterMediaSinksObserver(MediaSinksObserver* observer) override;
void UnregisterMediaSinksObserver(MediaSinksObserver* observer) override;
void RegisterMediaRoutesObserver(MediaRoutesObserver* observer) override;
void UnregisterMediaRoutesObserver(MediaRoutesObserver* observer) override;
void RegisterIssuesObserver(IssuesObserver* observer) override;
void UnregisterIssuesObserver(IssuesObserver* observer) override;
void RegisterPresentationSessionMessagesObserver(
PresentationSessionMessagesObserver* observer) override;
void UnregisterPresentationSessionMessagesObserver(
PresentationSessionMessagesObserver* observer) override;
void RegisterLocalMediaRoutesObserver(
LocalMediaRoutesObserver* observer) override;
void UnregisterLocalMediaRoutesObserver(
LocalMediaRoutesObserver* observer) override;
base::android::ScopedJavaGlobalRef<jobject> java_media_router_;
using MediaSinkObservers = base::ScopedPtrHashMap<
MediaSource::Id,
scoped_ptr<base::ObserverList<MediaSinksObserver>>>;
MediaSinkObservers sinks_observers_;
base::ObserverList<MediaRoutesObserver> routes_observers_;
struct MediaRouteRequest {
MediaRouteRequest(
const MediaSource& source,
const std::string& presentation_id,
const std::vector<MediaRouteResponseCallback>& callbacks);
~MediaRouteRequest();
MediaSource media_source;
std::string presentation_id;
std::vector<MediaRouteResponseCallback> callbacks;
};
using MediaRouteRequests =
IDMap<MediaRouteRequest, IDMapOwnPointer>;
MediaRouteRequests route_requests_;
using MediaRoutes = std::vector<MediaRoute>;
MediaRoutes active_routes_;
using SendMessageCallbacks = IDMap<SendRouteMessageCallback, IDMapOwnPointer>;
SendMessageCallbacks message_callbacks_;
using MessagesObservers = base::ScopedPtrHashMap<
MediaRoute::Id,
scoped_ptr<base::ObserverList<PresentationSessionMessagesObserver>>>;
MessagesObservers messages_observers_;
DISALLOW_COPY_AND_ASSIGN(MediaRouterAndroid);
};
} // namespace media_router
#endif // CHROME_BROWSER_MEDIA_ANDROID_ROUTER_MEDIA_ROUTER_ANDROID_H_