mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-30 21:55:31 +00:00
bfe19431c6
Bug 1305498 - 1. Remove NotificationClient task queue; r=sebastian Not sure why we needed a task queue for NotificationClient actions. The actions all go through IPC and are non-blocking, so it's perfectly fine to perform them off of whatever thread we're on. Bug 1305498 - 2. Integrate NotificationHandler et al into NotificationCllient; r=sebastian There's no reason to have NotificationHandler, AppNotificationClient, and ServiceNotificationClient all separate from the base NotificationClient class. This patch adds the functionality of those three classes to NotificationClient. The notifications hash map is changed from a ConcurrentHashMap to a regular HashMap with synchronization because I think the use case here doesn't warrant the added performance and overhead of ConcurrentHashMap. NotificationService is changed to match the new NotificationClient. Now the only job for NotificationService is to set a notification as foreground, rather than to manage all notifications like before. NotificationHandler, AppNotificationClient, and ServiceNotificationClient will be removed in a later patch. Bug 1305498 - 3. Set NotificationListener in GeckoApplication; r=sebastian Set NotificationListener once in GeckoApplication.onCreate, instead of spreading it out in GeckoApp, BrowserApp, and GeckoService. This is possible because there's no longer a distinction between AppNotificationClient and ServiceNotificationClient in the new, consolidated NotificationClient. Bug 1305498 - 4. Remove obsolete notification classes; r=sebastian Remove AppNotificationClient, ServiceNotificationClient, and NotificationHandler, now that they've all been replaced by the new, consolidated NotificationClient. Bug 1305498 - 5. Use NotificationReceiver for web notification callbacks; r=sebastian Previously, web notification callbacks went to GeckoApp directly, but that presented some problems such as not being able to implement the on-close callback, because we don't want to launch GeckoApp when the notification is closed by swiping. This patch makes us use NotificationReceiver for callbacks, and let NotificationReceiver launch GeckoApp if necessary. Bug 1305498 - 6. Don't keep notification cookie in native code; r=sebastian Keep the notification cookie a single location (in the notification intent itself), and simplify the native notification handling code. Bug 1305498 - 7. Use NotificationReceiver for persistent notifications; r=sebastian Currently, persistent notification callbacks go through a different code path, but it'd be more consistent and correct to let persistent notification callbacks go through NotificationReceiver as well. This takes care of some housekeeping work that was missing for persistent notifications, such as deleting the mNotifications entry when the notification is closed.
126 lines
4.0 KiB
C++
126 lines
4.0 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)
|
|
{
|
|
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
|