From 702c59f80ab9c21d6b4d673d50380e18c477f88c Mon Sep 17 00:00:00 2001 From: Sanket Agarwal Date: Fri, 22 Jan 2016 12:26:36 -0800 Subject: [PATCH] Add MediaBrowser implementaion for A2DP. MediaBrowser is a way to control playback of any generic media application and to conform to this framework API the a2dpsink client uses the same format. This middleware provides a way to use A2DP via the MediaBrowserService and a user for A2DP sink should not need to use the raw Bluetooth APIs. Change-Id: I73b4a51acc469f503286bfd6d33a1766e30fc50d --- services/A2dpMediaBrowserService/Android.mk | 19 + .../A2dpMediaBrowserService/AndroidManifest.xml | 51 +++ .../res/drawable-hdpi/ic_launcher.png | Bin 0 -> 4151 bytes .../res/drawable-hdpi/ic_notification.png | Bin 0 -> 4151 bytes .../res/values-v21/styles.xml | 23 ++ .../A2dpMediaBrowserService/res/values/strings.xml | 21 ++ .../A2dpMediaBrowserService/res/values/styles.xml | 20 ++ .../res/xml/automotive_app_desc.xml | 19 + .../a2dpsink/mbs/A2dpMediaBrowserService.java | 385 +++++++++++++++++++++ .../android/a2dpsink/mbs/BootCompleteReceiver.java | 31 ++ 10 files changed, 569 insertions(+) create mode 100644 services/A2dpMediaBrowserService/Android.mk create mode 100644 services/A2dpMediaBrowserService/AndroidManifest.xml create mode 100644 services/A2dpMediaBrowserService/res/drawable-hdpi/ic_launcher.png create mode 100644 services/A2dpMediaBrowserService/res/drawable-hdpi/ic_notification.png create mode 100644 services/A2dpMediaBrowserService/res/values-v21/styles.xml create mode 100644 services/A2dpMediaBrowserService/res/values/strings.xml create mode 100644 services/A2dpMediaBrowserService/res/values/styles.xml create mode 100644 services/A2dpMediaBrowserService/res/xml/automotive_app_desc.xml create mode 100644 services/A2dpMediaBrowserService/src/com/google/android/a2dpsink/mbs/A2dpMediaBrowserService.java create mode 100644 services/A2dpMediaBrowserService/src/com/google/android/a2dpsink/mbs/BootCompleteReceiver.java diff --git a/services/A2dpMediaBrowserService/Android.mk b/services/A2dpMediaBrowserService/Android.mk new file mode 100644 index 00000000..f7a5e97f --- /dev/null +++ b/services/A2dpMediaBrowserService/Android.mk @@ -0,0 +1,19 @@ +# Copyright 2015 Google Inc. All Rights Reserved. + +LOCAL_PATH := $(call my-dir) + +# Build the application. +include $(CLEAR_VARS) + +LOCAL_PACKAGE_NAME := A2dpMediaBrowserService +LOCAL_MODULE_TAGS := optional +LOCAL_CERTIFICATE := platform + +LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_RESOURCE_DIR = $(LOCAL_PATH)/res + +LOCAL_PROGUARD_ENABLED := disabled + +include $(BUILD_PACKAGE) + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/services/A2dpMediaBrowserService/AndroidManifest.xml b/services/A2dpMediaBrowserService/AndroidManifest.xml new file mode 100644 index 00000000..fa63ff48 --- /dev/null +++ b/services/A2dpMediaBrowserService/AndroidManifest.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_launcher.png b/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9075ff1bd1a81359d50b59dba7c113c88c6261fe GIT binary patch literal 4151 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 Bu>$}A literal 0 HcmV?d00001 diff --git a/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_notification.png b/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..9075ff1bd1a81359d50b59dba7c113c88c6261fe GIT binary patch literal 4151 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 Bu>$}A literal 0 HcmV?d00001 diff --git a/services/A2dpMediaBrowserService/res/values-v21/styles.xml b/services/A2dpMediaBrowserService/res/values-v21/styles.xml new file mode 100644 index 00000000..7caef1f6 --- /dev/null +++ b/services/A2dpMediaBrowserService/res/values-v21/styles.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/services/A2dpMediaBrowserService/res/values/strings.xml b/services/A2dpMediaBrowserService/res/values/strings.xml new file mode 100644 index 00000000..588a124e --- /dev/null +++ b/services/A2dpMediaBrowserService/res/values/strings.xml @@ -0,0 +1,21 @@ + + + + Bluetooth Audio + Bluetooth audio connected + Bluetooth audio disconnected" + diff --git a/services/A2dpMediaBrowserService/res/values/styles.xml b/services/A2dpMediaBrowserService/res/values/styles.xml new file mode 100644 index 00000000..45c2579e --- /dev/null +++ b/services/A2dpMediaBrowserService/res/values/styles.xml @@ -0,0 +1,20 @@ + + + +