forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			126 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: c++; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 4; -*- */
 | |
| /* 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 "AndroidAlerts.h"
 | |
| #include "GeneratedJNIWrappers.h"
 | |
| #include "nsAlertsUtils.h"
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace widget {
 | |
| 
 | |
| NS_IMPL_ISUPPORTS(AndroidAlerts, nsIAlertsService)
 | |
| 
 | |
| StaticAutoPtr<AndroidAlerts::ListenerMap> AndroidAlerts::sListenerMap;
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| AndroidAlerts::ShowAlertNotification(const nsAString & aImageUrl,
 | |
|                                      const nsAString & aAlertTitle,
 | |
|                                      const nsAString & aAlertText,
 | |
|                                      bool aAlertTextClickable,
 | |
|                                      const nsAString & aAlertCookie,
 | |
|                                      nsIObserver * aAlertListener,
 | |
|                                      const nsAString & aAlertName,
 | |
|                                      const nsAString & aBidi,
 | |
|                                      const nsAString & aLang,
 | |
|                                      const nsAString & aData,
 | |
|                                      nsIPrincipal * aPrincipal,
 | |
|                                      bool aInPrivateBrowsing,
 | |
|                                      bool aRequireInteraction)
 | |
| {
 | |
|     MOZ_ASSERT_UNREACHABLE("Should be implemented by nsAlertsService.");
 | |
|     return NS_ERROR_NOT_IMPLEMENTED;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| AndroidAlerts::ShowAlert(nsIAlertNotification* aAlert,
 | |
|                          nsIObserver* aAlertListener)
 | |
| {
 | |
|     return ShowPersistentNotification(EmptyString(), aAlert, aAlertListener);
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| AndroidAlerts::ShowPersistentNotification(const nsAString& aPersistentData,
 | |
|                                           nsIAlertNotification* aAlert,
 | |
|                                           nsIObserver* aAlertListener)
 | |
| {
 | |
|     // nsAlertsService disables our alerts backend if we ever return failure
 | |
|     // here. To keep the backend enabled, we always return NS_OK even if we
 | |
|     // encounter an error here.
 | |
|     nsresult rv;
 | |
| 
 | |
|     nsAutoString imageUrl;
 | |
|     rv = aAlert->GetImageURL(imageUrl);
 | |
|     NS_ENSURE_SUCCESS(rv, NS_OK);
 | |
| 
 | |
|     nsAutoString title;
 | |
|     rv = aAlert->GetTitle(title);
 | |
|     NS_ENSURE_SUCCESS(rv, NS_OK);
 | |
| 
 | |
|     nsAutoString text;
 | |
|     rv = aAlert->GetText(text);
 | |
|     NS_ENSURE_SUCCESS(rv, NS_OK);
 | |
| 
 | |
|     nsAutoString cookie;
 | |
|     rv = aAlert->GetCookie(cookie);
 | |
|     NS_ENSURE_SUCCESS(rv, NS_OK);
 | |
| 
 | |
|     nsAutoString name;
 | |
|     rv = aAlert->GetName(name);
 | |
|     NS_ENSURE_SUCCESS(rv, NS_OK);
 | |
| 
 | |
|     nsCOMPtr<nsIPrincipal> principal;
 | |
|     rv = aAlert->GetPrincipal(getter_AddRefs(principal));
 | |
|     NS_ENSURE_SUCCESS(rv, NS_OK);
 | |
| 
 | |
|     nsAutoString host;
 | |
|     nsAlertsUtils::GetSourceHostPort(principal, host);
 | |
| 
 | |
|     if (aPersistentData.IsEmpty() && aAlertListener) {
 | |
|         if (!sListenerMap) {
 | |
|             sListenerMap = new ListenerMap();
 | |
|         }
 | |
|         // This will remove any observers already registered for this name.
 | |
|         sListenerMap->Put(name, aAlertListener);
 | |
|     }
 | |
| 
 | |
|     java::GeckoAppShell::ShowNotification(
 | |
|             name, cookie, title, text, host, imageUrl,
 | |
|             !aPersistentData.IsEmpty() ? jni::StringParam(aPersistentData)
 | |
|                                        : jni::StringParam(nullptr));
 | |
|     return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| AndroidAlerts::CloseAlert(const nsAString& aAlertName,
 | |
|                           nsIPrincipal* aPrincipal)
 | |
| {
 | |
|     // We delete the entry in sListenerMap later, when CloseNotification calls
 | |
|     // NotifyListener.
 | |
|     java::GeckoAppShell::CloseNotification(aAlertName);
 | |
|     return NS_OK;
 | |
| }
 | |
| 
 | |
| void
 | |
| AndroidAlerts::NotifyListener(const nsAString& aName, const char* aTopic,
 | |
|                               const char16_t* aCookie)
 | |
| {
 | |
|     if (!sListenerMap) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     nsCOMPtr<nsIObserver> listener = sListenerMap->Get(aName);
 | |
|     if (!listener) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     listener->Observe(nullptr, aTopic, aCookie);
 | |
| 
 | |
|     if (NS_LITERAL_CSTRING("alertfinished").Equals(aTopic)) {
 | |
|         sListenerMap->Remove(aName);
 | |
|     }
 | |
| }
 | |
| 
 | |
| } // namespace widget
 | |
| } // namespace mozilla
 | 
