nsresult BluetoothService::StopBluetooth(bool aIsStartup) { MOZ_ASSERT(NS_IsMainThread()); BluetoothProfileManagerBase* profile; profile = BluetoothHfpManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } else { profile->Reset(); } profile = BluetoothOppManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } profile = BluetoothA2dpManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } else { profile->Reset(); } profile = BluetoothHidManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } else { profile->Reset(); } mAdapterAddedReceived = false; /* When IsEnabled() is false, we don't switch off Bluetooth but we still * send ToggleBtAck task. One special case happens at startup stage. At * startup, the initialization of BluetoothService still has to be done * even if Bluetooth is disabled. * * Please see bug 892392 for more information. */ if (aIsStartup || sBluetoothService->IsEnabled()) { // Switch Bluetooth off if (NS_FAILED(sBluetoothService->StopInternal())) { BT_WARNING("Bluetooth service failed to stop!"); } } else { BT_WARNING("Bluetooth has already been enabled/disabled before."); nsRefPtr<nsRunnable> runnable = new BluetoothService::ToggleBtAck(false); if (NS_FAILED(NS_DispatchToMainThread(runnable))) { BT_WARNING("Failed to dispatch to main thread!"); } } return NS_OK; }
nsresult BluetoothService::StartStopBluetooth(bool aStart, bool aIsStartup) { MOZ_ASSERT(NS_IsMainThread()); if (gInShutdown) { if (aStart) { // Don't try to start if we're already shutting down. MOZ_ASSERT(false, "Start called while in shutdown!"); return NS_ERROR_FAILURE; } if (!mBluetoothThread) { // Don't create a new thread after we've begun shutdown since bluetooth // can't be running. return NS_OK; } } if (!aStart) { BluetoothProfileManagerBase* profile; profile = BluetoothHfpManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } profile = BluetoothOppManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } profile = BluetoothA2dpManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } profile = BluetoothHidManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } } if (!mBluetoothThread) { mBluetoothThread = new LazyIdleThread(DEFAULT_THREAD_TIMEOUT_MS, NS_LITERAL_CSTRING("Bluetooth"), LazyIdleThread::ManualShutdown); } mAdapterAddedReceived = false; nsCOMPtr<nsIRunnable> runnable = new ToggleBtTask(aStart, aIsStartup); nsresult rv = mBluetoothThread->Dispatch(runnable, NS_DISPATCH_NORMAL); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; }
nsresult BluetoothServiceBluedroid::StopInternal(BluetoothReplyRunnable* aRunnable) { MOZ_ASSERT(NS_IsMainThread()); BluetoothProfileManagerBase* profile; profile = BluetoothHfpManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } else { profile->Reset(); } profile = BluetoothOppManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } profile = BluetoothA2dpManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } else { profile->Reset(); } profile = BluetoothHidManager::Get(); NS_ENSURE_TRUE(profile, NS_ERROR_FAILURE); if (profile->IsConnected()) { profile->Disconnect(nullptr); } else { profile->Reset(); } // aRunnable will be a nullptr during starup and shutdown if(aRunnable) { sChangeAdapterStateRunnableArray.AppendElement(aRunnable); } nsresult ret = StopGonkBluetooth(); if (NS_FAILED(ret)) { BluetoothService::AcknowledgeToggleBt(true); // Reject Promise if(aRunnable) { DispatchReplyError(aRunnable, NS_LITERAL_STRING("StopBluetoothError")); sChangeAdapterStateRunnableArray.RemoveElement(aRunnable); } BT_LOGR("Error"); } return ret; }