diff options
author | sh919.park <sh919.park@samsung.com> | 2015-05-10 14:30:08 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-10 21:30:30 +0000 |
commit | 1593bf8e67c4e99be94a85bec217463961a9c07c (patch) | |
tree | 194083665c283a8b6da11a9c2859c0ec9f6a17d4 | |
parent | acfa566d3a46f7b9734241192c0c2cad5db24f9f (diff) | |
download | chromium_src-1593bf8e67c4e99be94a85bec217463961a9c07c.zip chromium_src-1593bf8e67c4e99be94a85bec217463961a9c07c.tar.gz chromium_src-1593bf8e67c4e99be94a85bec217463961a9c07c.tar.bz2 |
Implement support for notification.vibrate
This patch implements support for notification.vibrate, which allow a
Web developer to set the "vibrate" key when creating a notification,
that will set up a vibration.
This operation depends on the device capability.
Currently this only works on Android.
The Web Notification specification:
https://notifications.spec.whatwg.org/#dom-notificationoptions-vibrate
BUG=442132
Review URL: https://codereview.chromium.org/1054573002
Cr-Commit-Position: refs/heads/master@{#329082}
17 files changed, 221 insertions, 8 deletions
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java index 602d354..a74a24c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java @@ -293,6 +293,49 @@ public class NotificationUIManager { } /** + * Generates the notfiication defaults from vibrationPattern's size and silent. + * + * Use the system's default ringtone, vibration and indicator lights unless the notification + * has been marked as being silent. + * If a vibration pattern is set, the notification should use the provided pattern + * rather than the defaulting to system settings. + * + * @param vibrationPatternLength Vibration pattern's size for the Notification. + * @param silent Whether the default sound, vibration and lights should be suppressed. + * @return The generated notification's default value. + */ + @VisibleForTesting + static int makeDefaults(int vibrationPatternLength, boolean silent) { + assert !silent || vibrationPatternLength == 0; + + if (silent) return 0; + + int defaults = Notification.DEFAULT_ALL; + if (vibrationPatternLength > 0) { + defaults &= ~Notification.DEFAULT_VIBRATE; + } + return defaults; + } + + /** + * Generates the vibration pattern used in Android notification. + * + * Android takes a long array where the first entry indicates the number of milliseconds to wait + * prior to starting the vibration, whereas Chrome follows the syntax of the Web Vibration API. + * + * @param vibrationPattern Vibration pattern following the Web Vibration API syntax. + * @return Vibration pattern following the Android syntax. + */ + @VisibleForTesting + static long[] makeVibrationPattern(int[] vibrationPattern) { + long[] pattern = new long[vibrationPattern.length + 1]; + for (int i = 0; i < vibrationPattern.length; ++i) { + pattern[i + 1] = vibrationPattern[i]; + } + return pattern; + } + + /** * Displays a notification with the given details. * * @param persistentNotificationId The persistent id of the notification. @@ -306,11 +349,13 @@ public class NotificationUIManager { * text by the Android notification system. * @param icon Icon to be displayed in the notification. When this isn't a valid Bitmap, a * default icon will be generated instead. + * @param vibrationPattern Vibration pattern following the Web Vibration syntax. * @param silent Whether the default sound, vibration and lights should be suppressed. + * @see https://developer.android.com/reference/android/app/Notification.html */ @CalledByNative private void displayNotification(long persistentNotificationId, String origin, String tag, - String title, String body, Bitmap icon, boolean silent) { + String title, String body, Bitmap icon, int[] vibrationPattern, boolean silent) { if (icon == null || icon.getWidth() == 0) { icon = getIconGenerator().generateIconForUrl(origin, true); } @@ -351,9 +396,10 @@ public class NotificationUIManager { .setTicker(createTickerText(title, body)) .setSubText(origin); - // Use the system's default ringtone, vibration and indicator lights unless the notification - // has been marked as being silent, for example because it's low priority. - if (!silent) notificationBuilder.setDefaults(Notification.DEFAULT_ALL); + notificationBuilder.setDefaults(makeDefaults(vibrationPattern.length, silent)); + if (vibrationPattern.length > 0) { + notificationBuilder.setVibrate(makeVibrationPattern(vibrationPattern)); + } String platformTag = makePlatformTag(persistentNotificationId, origin, tag); mNotificationManager.notify(platformTag, PLATFORM_ID, notificationBuilder.build()); diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java index b653417..71b1f91 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java @@ -27,6 +27,7 @@ import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content.browser.test.util.JavaScriptUtils; +import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeoutException; @@ -383,4 +384,35 @@ public class NotificationUIManagerTest extends ChromeShellTestBase { assertNull(NotificationUIManager.getOriginFromTag( "NotificationUIManager;SystemDownloadNotifier;42")); } + + /** + * Verifies that the makeDefaults method returns the generated notification defaults. + */ + @SmallTest + @Feature({"Browser", "Notifications"}) + public void testMakeDefaults() throws Exception { + // 0 should be returned if silent is true and vibration's length is 0. + assertEquals(0, NotificationUIManager.makeDefaults(0, true)); + + // Notification.DEFAULT_ALL should be returned if silent is false and + // vibration's length is 0. + assertEquals(Notification.DEFAULT_ALL, + NotificationUIManager.makeDefaults(0, false)); + + // Notification.DEFAULT_ALL & ~Notification.DEFAULT_VIBRATE should be returned + // if silent is false and vibration's length is greater than 0. + assertEquals(Notification.DEFAULT_ALL & ~Notification.DEFAULT_VIBRATE, + NotificationUIManager.makeDefaults(10, false)); + } + + /** + * Verifies that the makeVibrationPattern method returns vibration pattern used + * in Android notification. + */ + @SmallTest + @Feature({"Browser", "Notifications"}) + public void testMakeVibrationPattern() throws Exception { + assertTrue(Arrays.equals(new long[] {0, 100, 200, 300}, + NotificationUIManager.makeVibrationPattern(new int[] {100, 200, 300}))); + } } diff --git a/chrome/browser/notifications/notification_ui_manager_android.cc b/chrome/browser/notifications/notification_ui_manager_android.cc index 1d8f482..4ee7219 100644 --- a/chrome/browser/notifications/notification_ui_manager_android.cc +++ b/chrome/browser/notifications/notification_ui_manager_android.cc @@ -130,6 +130,9 @@ void NotificationUIManagerAndroid::Add(const Notification& notification, if (!icon_bitmap.isNull()) icon = gfx::ConvertToJavaBitmap(&icon_bitmap); + ScopedJavaLocalRef<jintArray> vibration_pattern = + base::android::ToJavaIntArray(env, notification.vibration_pattern()); + Java_NotificationUIManager_displayNotification( env, java_object_.obj(), @@ -139,6 +142,7 @@ void NotificationUIManagerAndroid::Add(const Notification& notification, title.obj(), body.obj(), icon.obj(), + vibration_pattern.obj(), notification.silent()); regenerated_notification_infos_[persistent_notification_id] = diff --git a/chrome/browser/notifications/platform_notification_service_browsertest.cc b/chrome/browser/notifications/platform_notification_service_browsertest.cc index 335e838..587f545 100644 --- a/chrome/browser/notifications/platform_notification_service_browsertest.cc +++ b/chrome/browser/notifications/platform_notification_service_browsertest.cc @@ -23,6 +23,7 @@ #include "content/public/test/browser_test_utils.h" #include "net/base/filename_util.h" #include "net/test/spawned_test_server/spawned_test_server.h" +#include "testing/gmock/include/gmock/gmock.h" // ----------------------------------------------------------------------------- @@ -30,6 +31,8 @@ const int kIconWidth = 100; const int kIconHeight = 100; +const int kNotificationVibrationPattern[] = { 100, 200, 300 }; + class PlatformNotificationServiceBrowserTest : public InProcessBrowserTest { public: PlatformNotificationServiceBrowserTest(); @@ -219,6 +222,28 @@ IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, } IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, + WebNotificationOptionsVibrationPattern) { + std::string script_result; + + InfoBarResponder accepting_responder(GetInfoBarService(), true); + ASSERT_TRUE(RunScript("RequestPermission()", &script_result)); + EXPECT_EQ("granted", script_result); + + ASSERT_TRUE(RunScript("DisplayPersistentNotificationVibrate()", + &script_result)); + EXPECT_EQ("ok", script_result); + + ASSERT_EQ(1u, ui_manager()->GetNotificationCount()); + + const Notification& notification = ui_manager()->GetNotificationAt(0); + EXPECT_EQ("Title", base::UTF16ToUTF8(notification.title())); + EXPECT_EQ("Contents", base::UTF16ToUTF8(notification.message())); + + EXPECT_THAT(notification.vibration_pattern(), + testing::ElementsAreArray(kNotificationVibrationPattern)); +} + +IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest, CloseDisplayedPersistentNotification) { std::string script_result; diff --git a/chrome/browser/notifications/platform_notification_service_impl.cc b/chrome/browser/notifications/platform_notification_service_impl.cc index a2127fe..21baeb7 100644 --- a/chrome/browser/notifications/platform_notification_service_impl.cc +++ b/chrome/browser/notifications/platform_notification_service_impl.cc @@ -323,6 +323,7 @@ Notification PlatformNotificationServiceImpl::CreateNotificationFromData( display_source, notification_data.tag, delegate); notification.set_context_message(display_source); + notification.set_vibration_pattern(notification_data.vibration_pattern); notification.set_silent(notification_data.silent); // Web Notifications do not timeout. diff --git a/chrome/browser/notifications/platform_notification_service_unittest.cc b/chrome/browser/notifications/platform_notification_service_unittest.cc index 40a8eec..ee0e7c7 100644 --- a/chrome/browser/notifications/platform_notification_service_unittest.cc +++ b/chrome/browser/notifications/platform_notification_service_unittest.cc @@ -12,11 +12,14 @@ #include "content/public/browser/desktop_notification_delegate.h" #include "content/public/common/platform_notification_data.h" #include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkBitmap.h" namespace { +const int kNotificationVibrationPattern[] = { 100, 200, 300 }; + #if !defined(OS_ANDROID) const int64_t kPersistentNotificationId = 42; #endif @@ -157,9 +160,14 @@ TEST_F(PlatformNotificationServiceTest, PersistentNotificationDisplay) { #endif // !defined(OS_ANDROID) TEST_F(PlatformNotificationServiceTest, DisplayPageNotificationMatches) { + std::vector<int> vibration_pattern( + kNotificationVibrationPattern, + kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern)); + content::PlatformNotificationData notification_data; notification_data.title = base::ASCIIToUTF16("My notification's title"); notification_data.body = base::ASCIIToUTF16("Hello, world!"); + notification_data.vibration_pattern = vibration_pattern; notification_data.silent = true; MockDesktopNotificationDelegate* delegate @@ -179,6 +187,10 @@ TEST_F(PlatformNotificationServiceTest, DisplayPageNotificationMatches) { base::UTF16ToUTF8(notification.title())); EXPECT_EQ("Hello, world!", base::UTF16ToUTF8(notification.message())); + + EXPECT_THAT(notification.vibration_pattern(), + testing::ElementsAreArray(kNotificationVibrationPattern)); + EXPECT_TRUE(notification.silent()); } diff --git a/chrome/test/data/notifications/platform_notification_service.html b/chrome/test/data/notifications/platform_notification_service.html index d0b4124..5d42c3c 100644 --- a/chrome/test/data/notifications/platform_notification_service.html +++ b/chrome/test/data/notifications/platform_notification_service.html @@ -61,6 +61,14 @@ }); } + // Displays a persistent notification with vibrate field. + function DisplayPersistentNotificationVibrate() { + DisplayPersistentNotification('Title', { + body: 'Contents', + vibrate: [100, 200, 300] + }); + } + // Displays a persistent notification with a data: URL as its image. function DisplayPersistentNotificationDataUrlImage() { fetch('icon.png').then(function(response) { diff --git a/content/browser/notifications/notification_database_data.proto b/content/browser/notifications/notification_database_data.proto index 1fb6808..5d8fe20 100644 --- a/content/browser/notifications/notification_database_data.proto +++ b/content/browser/notifications/notification_database_data.proto @@ -21,7 +21,7 @@ message NotificationDatabaseDataProto { // Actual data payload of the notification. This message is the protocol // buffer meant to serialize the content::PlatformNotificationData structure. // - // Next tag: 8 + // Next tag: 10 message NotificationData { enum Direction { LEFT_TO_RIGHT = 0; @@ -34,6 +34,7 @@ message NotificationDatabaseDataProto { optional string body = 4; optional string tag = 5; optional string icon = 6; + repeated int32 vibration_pattern = 9 [packed=true]; optional bool silent = 7; optional bytes data = 8; } diff --git a/content/browser/notifications/notification_database_data_conversions.cc b/content/browser/notifications/notification_database_data_conversions.cc index d656f7d..349b9c8 100644 --- a/content/browser/notifications/notification_database_data_conversions.cc +++ b/content/browser/notifications/notification_database_data_conversions.cc @@ -38,6 +38,13 @@ bool DeserializeNotificationDatabaseData(const std::string& input, notification_data->body = base::UTF8ToUTF16(payload.body()); notification_data->tag = payload.tag(); notification_data->icon = GURL(payload.icon()); + + if (payload.vibration_pattern().size() > 0) { + notification_data->vibration_pattern.assign( + payload.vibration_pattern().begin(), + payload.vibration_pattern().end()); + } + notification_data->silent = payload.silent(); if (payload.data().length()) { @@ -67,6 +74,10 @@ bool SerializeNotificationDatabaseData(const NotificationDatabaseData& input, payload->set_body(base::UTF16ToUTF8(notification_data.body)); payload->set_tag(notification_data.tag); payload->set_icon(notification_data.icon.spec()); + + for (size_t i = 0; i < notification_data.vibration_pattern.size(); ++i) + payload->add_vibration_pattern(notification_data.vibration_pattern[i]); + payload->set_silent(notification_data.silent); if (notification_data.data.size()) { diff --git a/content/browser/notifications/notification_database_data_unittest.cc b/content/browser/notifications/notification_database_data_unittest.cc index f57bfa8..2613108 100644 --- a/content/browser/notifications/notification_database_data_unittest.cc +++ b/content/browser/notifications/notification_database_data_unittest.cc @@ -6,6 +6,7 @@ #include "content/browser/notifications/notification_database_data.pb.h" #include "content/browser/notifications/notification_database_data_conversions.h" #include "content/public/browser/notification_database_data.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace content { @@ -19,9 +20,14 @@ const char kNotificationLang[] = "nl"; const char kNotificationBody[] = "Hello, world!"; const char kNotificationTag[] = "my_tag"; const char kNotificationIconUrl[] = "https://example.com/icon.png"; +const int kNotificationVibrationPattern[] = { 100, 200, 300 }; const unsigned char kNotificationData[] = { 0xdf, 0xff, 0x0, 0x0, 0xff, 0xdf }; TEST(NotificationDatabaseDataTest, SerializeAndDeserializeData) { + std::vector<int> vibration_pattern( + kNotificationVibrationPattern, + kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern)); + std::vector<char> developer_data( kNotificationData, kNotificationData + arraysize(kNotificationData)); @@ -33,6 +39,7 @@ TEST(NotificationDatabaseDataTest, SerializeAndDeserializeData) { notification_data.body = base::ASCIIToUTF16(kNotificationBody); notification_data.tag = kNotificationTag; notification_data.icon = GURL(kNotificationIconUrl); + notification_data.vibration_pattern = vibration_pattern; notification_data.silent = true; notification_data.data = developer_data; @@ -68,6 +75,10 @@ TEST(NotificationDatabaseDataTest, SerializeAndDeserializeData) { EXPECT_EQ(notification_data.body, copied_notification_data.body); EXPECT_EQ(notification_data.tag, copied_notification_data.tag); EXPECT_EQ(notification_data.icon, copied_notification_data.icon); + + EXPECT_THAT(copied_notification_data.vibration_pattern, + testing::ElementsAreArray(kNotificationVibrationPattern)); + EXPECT_EQ(notification_data.silent, copied_notification_data.silent); ASSERT_EQ(developer_data.size(), copied_notification_data.data.size()); diff --git a/content/browser/notifications/notification_message_filter.cc b/content/browser/notifications/notification_message_filter.cc index 622fd1e..9b9d381 100644 --- a/content/browser/notifications/notification_message_filter.cc +++ b/content/browser/notifications/notification_message_filter.cc @@ -19,6 +19,26 @@ namespace content { +namespace { + +const int kMinimumVibrationDurationMs = 1; // 1 millisecond +const int kMaximumVibrationDurationMs = 10000; // 10 seconds + +PlatformNotificationData SanitizeNotificationData( + const PlatformNotificationData& notification_data) { + PlatformNotificationData sanitized_data = notification_data; + + // Make sure that the vibration values are within reasonable bounds. + for (int& pattern : sanitized_data.vibration_pattern) { + pattern = std::min(kMaximumVibrationDurationMs, + std::max(kMinimumVibrationDurationMs, pattern)); + } + + return sanitized_data; +} + +} // namespace + NotificationMessageFilter::NotificationMessageFilter( int process_id, PlatformNotificationContextImpl* notification_context, @@ -101,7 +121,7 @@ void NotificationMessageFilter::OnShowPlatformNotification( service->DisplayNotification(browser_context_, origin, icon, - notification_data, + SanitizeNotificationData(notification_data), delegate.Pass(), &close_closure); @@ -125,7 +145,10 @@ void NotificationMessageFilter::OnShowPersistentNotification( NotificationDatabaseData database_data; database_data.origin = origin; database_data.service_worker_registration_id = service_worker_registration_id; - database_data.notification_data = notification_data; + + PlatformNotificationData sanitized_notification_data = + SanitizeNotificationData(notification_data); + database_data.notification_data = sanitized_notification_data; // TODO(peter): Significantly reduce the amount of information we need to // retain outside of the database for displaying notifications. @@ -137,7 +160,7 @@ void NotificationMessageFilter::OnShowPersistentNotification( request_id, origin, icon, - notification_data)); + sanitized_notification_data)); } void NotificationMessageFilter::DidWritePersistentNotificationData( diff --git a/content/child/notifications/notification_data_conversions.cc b/content/child/notifications/notification_data_conversions.cc index 639e555..f5fe5bb 100644 --- a/content/child/notifications/notification_data_conversions.cc +++ b/content/child/notifications/notification_data_conversions.cc @@ -24,6 +24,8 @@ PlatformNotificationData ToPlatformNotificationData( platform_data.body = web_data.body; platform_data.tag = base::UTF16ToUTF8(web_data.tag); platform_data.icon = GURL(web_data.icon.string()); + platform_data.vibration_pattern.assign(web_data.vibrate.begin(), + web_data.vibrate.end()); platform_data.silent = web_data.silent; platform_data.data.assign(web_data.data.begin(), web_data.data.end()); @@ -43,6 +45,7 @@ WebNotificationData ToWebNotificationData( web_data.body = platform_data.body; web_data.tag = blink::WebString::fromUTF8(platform_data.tag); web_data.icon = blink::WebURL(platform_data.icon); + web_data.vibrate = platform_data.vibration_pattern; web_data.silent = platform_data.silent; web_data.data = platform_data.data; diff --git a/content/child/notifications/notification_data_conversions_unittest.cc b/content/child/notifications/notification_data_conversions_unittest.cc index daded25..c124e4f 100644 --- a/content/child/notifications/notification_data_conversions_unittest.cc +++ b/content/child/notifications/notification_data_conversions_unittest.cc @@ -8,6 +8,7 @@ #include "base/strings/utf_string_conversions.h" #include "content/public/common/platform_notification_data.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/platform/WebURL.h" @@ -20,9 +21,14 @@ const char kNotificationLang[] = "nl"; const char kNotificationBody[] = "Hello, world!"; const char kNotificationTag[] = "my_tag"; const char kNotificationIconUrl[] = "https://example.com/icon.png"; +const int kNotificationVibrationPattern[] = { 100, 200, 300 }; const unsigned char kNotificationData[] = { 0xdf, 0xff, 0x0, 0x0, 0xff, 0xdf }; TEST(NotificationDataConversionsTest, ToPlatformNotificationData) { + std::vector<int> vibration_pattern( + kNotificationVibrationPattern, + kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern)); + std::vector<char> developer_data( kNotificationData, kNotificationData + arraysize(kNotificationData)); @@ -33,6 +39,7 @@ TEST(NotificationDataConversionsTest, ToPlatformNotificationData) { blink::WebString::fromUTF8(kNotificationBody), blink::WebString::fromUTF8(kNotificationTag), blink::WebURL(GURL(kNotificationIconUrl)), + blink::WebVector<int>(vibration_pattern), true /* silent */, blink::WebVector<char>(developer_data)); @@ -46,6 +53,9 @@ TEST(NotificationDataConversionsTest, ToPlatformNotificationData) { EXPECT_EQ(kNotificationIconUrl, platform_data.icon.spec()); EXPECT_TRUE(platform_data.silent); + EXPECT_THAT(platform_data.vibration_pattern, + testing::ElementsAreArray(kNotificationVibrationPattern)); + ASSERT_EQ(developer_data.size(), platform_data.data.size()); for (size_t i = 0; i < developer_data.size(); ++i) EXPECT_EQ(developer_data[i], platform_data.data[i]); @@ -68,6 +78,10 @@ TEST(NotificationDataConversionsTest, } TEST(NotificationDataConversionsTest, ToWebNotificationData) { + std::vector<int> vibration_pattern( + kNotificationVibrationPattern, + kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern)); + std::vector<char> developer_data( kNotificationData, kNotificationData + arraysize(kNotificationData)); @@ -79,6 +93,7 @@ TEST(NotificationDataConversionsTest, ToWebNotificationData) { platform_data.body = base::ASCIIToUTF16(kNotificationBody); platform_data.tag = kNotificationTag; platform_data.icon = GURL(kNotificationIconUrl); + platform_data.vibration_pattern = vibration_pattern; platform_data.silent = true; platform_data.data = developer_data; @@ -90,6 +105,11 @@ TEST(NotificationDataConversionsTest, ToWebNotificationData) { EXPECT_EQ(kNotificationBody, web_data.body); EXPECT_EQ(kNotificationTag, web_data.tag); EXPECT_EQ(kNotificationIconUrl, web_data.icon.string()); + + ASSERT_EQ(vibration_pattern.size(), web_data.vibrate.size()); + for (size_t i = 0; i < vibration_pattern.size(); ++i) + EXPECT_EQ(vibration_pattern[i], web_data.vibrate[i]); + EXPECT_TRUE(web_data.silent); ASSERT_EQ(developer_data.size(), web_data.data.size()); diff --git a/content/common/platform_notification_messages.h b/content/common/platform_notification_messages.h index f21713f..009ff61 100644 --- a/content/common/platform_notification_messages.h +++ b/content/common/platform_notification_messages.h @@ -42,6 +42,7 @@ IPC_STRUCT_TRAITS_BEGIN(content::PlatformNotificationData) IPC_STRUCT_TRAITS_MEMBER(body) IPC_STRUCT_TRAITS_MEMBER(tag) IPC_STRUCT_TRAITS_MEMBER(icon) + IPC_STRUCT_TRAITS_MEMBER(vibration_pattern) IPC_STRUCT_TRAITS_MEMBER(silent) IPC_STRUCT_TRAITS_MEMBER(data) IPC_STRUCT_TRAITS_END() diff --git a/content/public/common/platform_notification_data.h b/content/public/common/platform_notification_data.h index 5b608c0..40bd98d 100644 --- a/content/public/common/platform_notification_data.h +++ b/content/public/common/platform_notification_data.h @@ -51,6 +51,10 @@ struct CONTENT_EXPORT PlatformNotificationData { // URL of the icon which is to be displayed with the notification. GURL icon; + // Vibration pattern for the notification, following the syntax of the + // Vibration API. https://www.w3.org/TR/vibration/ + std::vector<int> vibration_pattern; + // Whether default notification indicators (sound, vibration, light) should // be suppressed. bool silent = false; diff --git a/ui/message_center/notification.cc b/ui/message_center/notification.cc index 6056620..6633a01 100644 --- a/ui/message_center/notification.cc +++ b/ui/message_center/notification.cc @@ -46,6 +46,7 @@ RichNotificationData::RichNotificationData(const RichNotificationData& other) should_make_spoken_feedback_for_popup_updates( other.should_make_spoken_feedback_for_popup_updates), clickable(other.clickable), + vibration_pattern(other.vibration_pattern), silent(other.silent) {} RichNotificationData::~RichNotificationData() {} diff --git a/ui/message_center/notification.h b/ui/message_center/notification.h index 060cdda..122cd67 100644 --- a/ui/message_center/notification.h +++ b/ui/message_center/notification.h @@ -50,6 +50,7 @@ class MESSAGE_CENTER_EXPORT RichNotificationData { std::vector<ButtonInfo> buttons; bool should_make_spoken_feedback_for_popup_updates; bool clickable; + std::vector<int> vibration_pattern; bool silent; }; @@ -104,6 +105,15 @@ class MESSAGE_CENTER_EXPORT Notification { int priority() const { return optional_fields_.priority; } void set_priority(int priority) { optional_fields_.priority = priority; } + // This vibration_pattern property currently has no effect on + // non-Android platforms. + const std::vector<int>& vibration_pattern() const { + return optional_fields_.vibration_pattern; + } + void set_vibration_pattern(const std::vector<int>& vibration_pattern) { + optional_fields_.vibration_pattern = vibration_pattern; + } + // This property currently has no effect on non-Android platforms. bool silent() const { return optional_fields_.silent; } void set_silent(bool silent) { optional_fields_.silent = silent; } |