Bug 1126720: Implement Bluetooth backend selection; use Bluedroid by default (under bluetooth2/), r=btian
authorThomas Zimmermann <tdz@users.sourceforge.net>
Thu, 12 Feb 2015 10:12:07 +0100
changeset 256089 562b55f88c647ff8b9e1dd7df6b4bd2465352a00
parent 256088 2cdf7ddcfc457694821f3c00af31a5969f6c0727
child 256090 1576606baf6a361ede7897f693a3efa3999f3bf4
push id4610
push userjlund@mozilla.com
push dateMon, 30 Mar 2015 18:32:55 +0000
treeherdermozilla-beta@4df54044d9ef [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbtian
bugs1126720, 1065336, 1124565
milestone38.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1126720: Implement Bluetooth backend selection; use Bluedroid by default (under bluetooth2/), r=btian This patch adds proper selection of the Bluetooth backend. The backend is configurable via environment property 'ro.moz.bluetooth.backend'. The default value is still Bluedroid. On systems that are not Android 4.2 or later, the code does not return a backend. These systems should use BlueZ instead. This patch is based on bug 1065336, patch [01] and bug 1124565, patch [01]. It also contains an extra fix in 'moz.build' to set the pre-processor constant 'MOZ_B2G_BT_DAEMON'.
dom/bluetooth2/BluetoothInterface.cpp
dom/bluetooth2/moz.build
--- a/dom/bluetooth2/BluetoothInterface.cpp
+++ b/dom/bluetooth2/BluetoothInterface.cpp
@@ -1,15 +1,18 @@
 /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
 /* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "BluetoothInterface.h"
+#if ANDROID_VERSION >= 17
+#include <cutils/properties.h>
+#endif
 #ifdef MOZ_B2G_BT_BLUEDROID
 #include "BluetoothHALInterface.h"
 #endif
 #ifdef MOZ_B2G_BT_DAEMON
 #include "BluetoothDaemonInterface.h"
 #endif
 
 BEGIN_BLUETOOTH_NAMESPACE
@@ -121,30 +124,70 @@ BluetoothNotificationHandler::~Bluetooth
 { }
 
 // Interface
 //
 
 BluetoothInterface*
 BluetoothInterface::GetInstance()
 {
+#if ANDROID_VERSION >= 17
+  /* We pick a default backend from the available ones. The branches
+   * are ordered by preference.
+   */
+#ifdef MOZ_B2G_BT_BLUEDROID
+  static const char sDefaultBackend[] = "bluedroid";
+#else
+#ifdef MOZ_B2G_BT_DAEMON
+  static const char sDefaultBackend[] = "bluetoothd";
+#else
+  static const char* const sDefaultBackend = nullptr;
+#endif
+#endif
+
   /* Here's where we decide which implementation to use. Currently
    * there is only Bluedroid and the Bluetooth daemon, but others are
    * possible. Having multiple interfaces built-in and selecting the
-   * correct one at runtime could also be an option.
+   * correct one at runtime is also an option.
    */
+
+  char value[PROPERTY_VALUE_MAX];
+  int len;
+
+  len = property_get("ro.moz.bluetooth.backend", value, sDefaultBackend);
+  if (len < 0) {
+    BT_WARNING("No Bluetooth backend available.");
+    return nullptr;
+  }
+
+  const nsDependentCString backend(value, len);
+
 #ifdef MOZ_B2G_BT_BLUEDROID
-  return BluetoothHALInterface::GetInstance();
+  if (backend.LowerCaseEqualsLiteral("bluedroid")) {
+    return BluetoothHALInterface::GetInstance();
+  } else
+#endif
+#ifdef MOZ_B2G_BT_DAEMON
+  if (backend.LowerCaseEqualsLiteral("bluetoothd")) {
+    return BluetoothDaemonInterface::GetInstance();
+  } else
+#endif
+  {
+    BT_WARNING("Bluetooth backend '%s' is unknown or not available.",
+               backend.get());
+  }
+  return nullptr;
+
 #else
-#ifdef MOZ_B2G_BT_DAEMON
-  return BluetoothDaemonInterface::GetInstance();
-#else
+  /* Anything that's not Android 4.2 or later uses BlueZ instead. The
+   * code should actually never reach this point.
+   */
+  BT_WARNING("No Bluetooth backend available for your system.");
   return nullptr;
 #endif
-#endif
 }
 
 BluetoothInterface::BluetoothInterface()
 { }
 
 BluetoothInterface::~BluetoothInterface()
 { }
 
--- a/dom/bluetooth2/moz.build
+++ b/dom/bluetooth2/moz.build
@@ -84,16 +84,18 @@ if CONFIG['MOZ_B2G_BT']:
                 SOURCES += [
                     'bluedroid/hfp-fallback/BluetoothHfpManager.cpp',
                 ]
                 LOCAL_INCLUDES += [
                     'bluedroid/hfp-fallback',
                 ]
 
             DEFINES['MOZ_B2G_BT_BLUEDROID'] = True
+            if CONFIG['MOZ_B2G_BT_DAEMON']:
+                DEFINES['MOZ_B2G_BT_DAEMON'] = True
     elif CONFIG['MOZ_ENABLE_DBUS']:
         CFLAGS += CONFIG['MOZ_DBUS_CFLAGS']
         CFLAGS += CONFIG['MOZ_DBUS_GLIB_CFLAGS']
         CXXFLAGS += CONFIG['MOZ_DBUS_CFLAGS']
         CXXFLAGS += CONFIG['MOZ_DBUS_GLIB_CFLAGS']
         SOURCES += [
             'bluez/BluetoothDBusService.cpp',
             'bluez/BluetoothHfpManager.cpp',