Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/notifier/synced_notification.h" | |
| 6 | |
| 7 #include "sync/protocol/sync.pb.h" | |
| 8 #include "sync/protocol/synced_notification_specifics.pb.h" | |
| 9 | |
| 10 using namespace sync_pb; | |
| 11 | |
| 12 namespace { | |
| 13 const char kExtensionScheme[] = "chrome-extension://"; | |
| 14 } // namespace | |
| 15 | |
| 16 namespace notifier { | |
| 17 | |
| 18 // An important side effect of the constructor is that it keeps the | |
| 19 // SyncNotificationSpecifics alive by putting it into the contained sync entity. | |
| 20 SyncedNotification::SyncedNotification(const syncer::SyncData& sync_data) | |
| 21 : sync_data_(sync_data), has_local_changes_(false) { | |
| 22 } | |
| 23 | |
| 24 SyncedNotification::~SyncedNotification() {} | |
| 25 | |
| 26 // TODO(petewil): Consider the timestamp too once it gets added to the protobuf. | |
| 27 bool SyncedNotification::Equals(const SyncedNotification& other) const { | |
| 28 // Two notifications are equal if the <appId/coalescingKey> pair matches. | |
| 29 return (GetNotificationId() == other.GetNotificationId()); | |
| 30 } | |
| 31 | |
| 32 // Set the read state on the notification, returns true for success. | |
| 33 bool SyncedNotification::SetReadState( | |
| 34 sync_pb::SyncedNotificationCoalesced_ReadState readState) { | |
| 35 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 36 has_coalesced_notification()) | |
| 37 return false; | |
| 38 | |
| 39 // TODO(petewil): implement | |
| 40 return true; | |
| 41 } | |
| 42 | |
| 43 // Mark this notification as having been read locally. | |
| 44 void SyncedNotification::NotificationHasBeenRead() { | |
| 45 // We set the is_local_ flag to true since we modified it locally | |
| 46 // then we create a sync change object to pass back up. | |
| 47 has_local_changes_ = true; | |
| 48 | |
| 49 bool success = SetReadState( | |
| 50 sync_pb::SyncedNotificationCoalesced_ReadState_READ); | |
| 51 DCHECK(success); | |
| 52 } | |
| 53 | |
| 54 // mark this notification as having been dismissed locally | |
| 55 void SyncedNotification::NotificationHasBeenDeleted() { | |
| 56 // We set the is_deleted_ flag to true since we modified it locally | |
| 57 // then we create a sync change object to pass back up. | |
| 58 has_local_changes_ = true; | |
| 59 | |
| 60 bool success = SetReadState( | |
| 61 sync_pb::SyncedNotificationCoalesced_ReadState_DISMISSED); | |
| 62 DCHECK(success); | |
| 63 } | |
| 64 | |
| 65 // TODO(petewil): Consider whether the repeated code below can be re-used. | |
| 66 // A first attempt to do so failed. | |
| 67 | |
| 68 const sync_pb::SyncedNotificationSpecifics* | |
| 69 SyncedNotification::GetSyncedNotificationSpecifics() { | |
| 70 return &(sync_data_.GetSpecifics().synced_notification()); | |
| 71 } | |
| 72 | |
| 73 std::string SyncedNotification::GetFirstExternalId() const { | |
| 74 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 75 has_coalesced_notification()) | |
| 76 return ""; | |
| 77 if (sync_data_.GetSpecifics().synced_notification(). | |
| 78 coalesced_notification().notification_size() < 1) | |
| 79 return ""; | |
| 80 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 81 coalesced_notification().notification(0).has_external_id()) | |
| 82 return ""; | |
| 83 | |
| 84 return sync_data_.GetSpecifics().synced_notification(). | |
| 85 coalesced_notification().notification(0).external_id(); | |
| 86 } | |
| 87 | |
| 88 std::string SyncedNotification::GetTitle() const { | |
| 89 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 90 coalesced_notification().render_info().layout().has_layout_type()) | |
| 91 return ""; | |
| 92 | |
| 93 const SyncedNotificationRenderInfo_Layout_LayoutType layout_type = | |
| 94 sync_data_.GetSpecifics().synced_notification(). | |
| 95 coalesced_notification().render_info().layout().layout_type(); | |
| 96 | |
| 97 // Depending on the layout type, get the proper title. | |
| 98 switch (layout_type) { | |
| 99 case SyncedNotificationRenderInfo_Layout_LayoutType_TITLE_AND_SUBTEXT: { | |
| 100 // If we have title and subtext, get that title. | |
| 101 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 102 coalesced_notification().render_info().layout(). | |
| 103 title_and_subtext_data().has_title()) | |
| 104 return ""; | |
| 105 | |
| 106 return sync_data_.GetSpecifics().synced_notification(). | |
| 107 coalesced_notification().render_info().layout(). | |
| 108 title_and_subtext_data().title(); | |
| 109 } | |
| 110 | |
| 111 case SyncedNotificationRenderInfo_Layout_LayoutType_TITLE_AND_IMAGE: { | |
| 112 // If we have title and image, get that title. | |
| 113 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 114 coalesced_notification().render_info().layout(). | |
| 115 title_and_image_data().has_title()) | |
| 116 return ""; | |
| 117 | |
| 118 return sync_data_.GetSpecifics().synced_notification(). | |
| 119 coalesced_notification().render_info().layout(). | |
| 120 title_and_image_data().title(); | |
| 121 } | |
| 122 default: { | |
| 123 // This is an error case, we should never get here unless the protobuf | |
| 124 // is bad, or a new type is introduced and this code does not get updated. | |
| 125 DCHECK(false); | |
| 126 return ""; | |
| 127 } | |
| 128 } | |
| 129 } | |
| 130 | |
| 131 std::string SyncedNotification::GetAppId() const { | |
| 132 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 133 coalesced_notification().id(). | |
| 134 has_app_id()) | |
| 135 return ""; | |
| 136 return sync_data_.GetSpecifics().synced_notification(). | |
| 137 coalesced_notification().id().app_id(); | |
| 138 } | |
| 139 | |
| 140 std::string SyncedNotification::GetCoalescingKey() const { | |
| 141 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 142 coalesced_notification().id(). | |
| 143 has_coalescing_key()) | |
| 144 return ""; | |
| 145 return sync_data_.GetSpecifics().synced_notification(). | |
| 146 coalesced_notification().id().coalescing_key(); | |
| 147 } | |
| 148 | |
| 149 GURL SyncedNotification::GetOriginUrl() const { | |
| 150 std::string origin_url(kExtensionScheme); | |
| 151 origin_url += GetAppId(); | |
| 152 return GURL(origin_url); | |
| 153 } | |
| 154 | |
| 155 GURL SyncedNotification::GetIconUrl() const { | |
| 156 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 157 coalesced_notification().render_info().layout().has_layout_type()) | |
| 158 return GURL(""); | |
|
dcheng
2013/01/23 18:39:43
GURL() instead of GURL("")
Pete Williamson
2013/01/24 01:48:11
Done.
| |
| 159 | |
| 160 const SyncedNotificationRenderInfo_Layout_LayoutType layout_type = | |
| 161 sync_data_.GetSpecifics().synced_notification(). | |
| 162 coalesced_notification().render_info().layout().layout_type(); | |
| 163 | |
| 164 // Depending on the layout type, get the icon. | |
| 165 if (SyncedNotificationRenderInfo_Layout_LayoutType_TITLE_AND_SUBTEXT | |
| 166 == layout_type) { | |
| 167 | |
| 168 // If we have title and subtext, get that icon. | |
| 169 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 170 coalesced_notification().render_info().layout(). | |
| 171 title_and_subtext_data().icon().has_url()) | |
| 172 return GURL(""); | |
| 173 | |
| 174 return GURL(sync_data_.GetSpecifics().synced_notification(). | |
| 175 coalesced_notification().render_info().layout(). | |
| 176 title_and_subtext_data().icon().url()); | |
| 177 | |
| 178 } | |
| 179 return GURL(""); | |
| 180 } | |
| 181 | |
| 182 std::string SyncedNotification::GetBody() const { | |
| 183 // If we have subtext data, concatenate the text lines and return it. | |
| 184 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 185 coalesced_notification().render_info().layout().has_layout_type()) | |
| 186 return ""; | |
| 187 | |
| 188 const SyncedNotificationRenderInfo_Layout_LayoutType layout_type = | |
| 189 sync_data_.GetSpecifics().synced_notification(). | |
| 190 coalesced_notification().render_info().layout().layout_type(); | |
| 191 | |
| 192 // Check if this layout type includes body text. | |
| 193 if (SyncedNotificationRenderInfo_Layout_LayoutType_TITLE_AND_SUBTEXT | |
| 194 == layout_type) { | |
| 195 | |
| 196 // If we have title and subtext, get the text. | |
| 197 if (!sync_data_.GetSpecifics().synced_notification(). | |
| 198 coalesced_notification().render_info().layout(). | |
| 199 has_title_and_subtext_data()) | |
| 200 return ""; | |
| 201 int subtext_lines = sync_data_.GetSpecifics().synced_notification(). | |
| 202 coalesced_notification().render_info().layout(). | |
| 203 title_and_subtext_data().subtext_size(); | |
| 204 if (subtext_lines < 1) | |
| 205 return ""; | |
| 206 | |
| 207 std::string subtext; | |
| 208 for (int ii = 0; ii < subtext_lines; ++ii) { | |
| 209 subtext += sync_data_.GetSpecifics().synced_notification(). | |
| 210 coalesced_notification().render_info().layout(). | |
| 211 title_and_subtext_data().subtext(ii); | |
| 212 if ( ii < subtext_lines - 1) | |
| 213 subtext += '\n'; | |
| 214 } | |
| 215 return subtext; | |
| 216 } | |
| 217 return ""; | |
| 218 } | |
| 219 | |
| 220 std::string SyncedNotification::GetNotificationId() const { | |
| 221 // Append the coalescing key to the app id to get the unique id. | |
| 222 std::string id = GetAppId(); | |
| 223 id += "/"; | |
| 224 id += GetCoalescingKey(); | |
| 225 | |
| 226 return id; | |
| 227 } | |
| 228 | |
| 229 } // namespace notifier | |
| OLD | NEW |