NS_IMETHODIMP SpeakerManager::HandleEvent(nsIDOMEvent* aEvent) { nsAutoString type; aEvent->GetType(type); if (!type.EqualsLiteral("visibilitychange")) { return NS_ERROR_FAILURE; } nsCOMPtr<nsIDocShell> docshell = do_GetInterface(GetOwner()); NS_ENSURE_TRUE(docshell, NS_ERROR_FAILURE); docshell->GetIsActive(&mVisible); // If an app that has called forcespeaker=true is switched // from the background to the foreground 'speakerforced' // switches to true in all apps. I.e. the app doesn't have to // call forcespeaker=true again when it comes into foreground. SpeakerManagerService *service = SpeakerManagerService::GetOrCreateSpeakerManagerService(); MOZ_ASSERT(service); if (mVisible && mForcespeaker) { service->ForceSpeaker(mForcespeaker, mVisible); } // If an application that has called forcespeaker=true, but no audio is // currently playing in the app itself, if application switch to // the background, we switch 'speakerforced' to false. if (!mVisible && mForcespeaker) { AudioChannelService* audioChannelService = AudioChannelService::GetOrCreateAudioChannelService(); if (audioChannelService && !audioChannelService->AnyAudioChannelIsActive()) { service->ForceSpeaker(false, mVisible); } } return NS_OK; }