1 // Copyright 2014 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/notifications/sync_notifier/synced_notification_app_info.h"
6
7 #include "chrome/browser/notifications/sync_notifier/synced_notification_app_info_service.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "sync/api/sync_data.h"
10 #include "sync/protocol/synced_notification_app_info_specifics.pb.h"
11
12 using chrome::ImageHolder;
13 using chrome::ImageHolderDelegate;
14
15 namespace notifier {
16
SyncedNotificationAppInfo(Profile * const profile,const std::string & settings_display_name,SyncedNotificationAppInfoService * synced_notification_app_info_service)17 SyncedNotificationAppInfo::SyncedNotificationAppInfo(
18 Profile* const profile,
19 const std::string& settings_display_name,
20 SyncedNotificationAppInfoService* synced_notification_app_info_service)
21 : profile_(profile),
22 settings_display_name_(settings_display_name),
23 synced_notification_app_info_service_(
24 synced_notification_app_info_service) {}
25
~SyncedNotificationAppInfo()26 SyncedNotificationAppInfo::~SyncedNotificationAppInfo() {}
27
settings_icon_url()28 GURL SyncedNotificationAppInfo::settings_icon_url() {
29 if (settings_holder_ != NULL)
30 return settings_holder_->low_dpi_url();
31 else
32 return GURL();
33 }
34
HasAppId(const std::string & app_id)35 bool SyncedNotificationAppInfo::HasAppId(const std::string& app_id) {
36 std::vector<std::string>::iterator it;
37
38 for (it = app_ids_.begin(); it != app_ids_.end(); ++it) {
39 if (app_id == *it)
40 return true;
41 }
42
43 return false;
44 }
45
AddAppId(const std::string & app_id)46 void SyncedNotificationAppInfo::AddAppId(const std::string& app_id) {
47 if (HasAppId(app_id))
48 return;
49
50 app_ids_.push_back(app_id);
51 }
52
RemoveAppId(const std::string & app_id)53 void SyncedNotificationAppInfo::RemoveAppId(const std::string& app_id) {
54 std::vector<std::string>::iterator it;
55
56 for (it = app_ids_.begin(); it != app_ids_.end(); ++it) {
57 if (app_id == *it) {
58 app_ids_.erase(it);
59 return;
60 }
61 }
62 }
63
SetWelcomeLinkUrl(const GURL & welcome_link_url)64 void SyncedNotificationAppInfo::SetWelcomeLinkUrl(
65 const GURL& welcome_link_url) {
66 welcome_link_url_ = welcome_link_url;
67 }
68
SetSettingsURLs(const GURL & settings_low_dpi,const GURL & settings_high_dpi)69 void SyncedNotificationAppInfo::SetSettingsURLs(
70 const GURL& settings_low_dpi, const GURL& settings_high_dpi) {
71 settings_holder_.reset(new ImageHolder(settings_low_dpi,
72 settings_high_dpi,
73 profile_,
74 this));
75 }
76
SetMonochromeURLs(const GURL & monochrome_low_dpi,const GURL & monochrome_high_dpi)77 void SyncedNotificationAppInfo::SetMonochromeURLs(
78 const GURL& monochrome_low_dpi, const GURL& monochrome_high_dpi) {
79 monochrome_holder_.reset(new ImageHolder(monochrome_low_dpi,
80 monochrome_high_dpi,
81 profile_,
82 this));
83 }
84
SetWelcomeURLs(const GURL & welcome_low_dpi,const GURL & welcome_high_dpi)85 void SyncedNotificationAppInfo::SetWelcomeURLs(
86 const GURL& welcome_low_dpi, const GURL& welcome_high_dpi) {
87 welcome_holder_.reset(new ImageHolder(welcome_low_dpi,
88 welcome_high_dpi,
89 profile_,
90 this));
91 }
92
icon()93 gfx::Image SyncedNotificationAppInfo::icon() {
94 if (settings_holder_ != NULL)
95 return settings_holder_->low_dpi_image();
96 else
97 return gfx::Image();
98 }
99
GetAppIdList()100 std::vector<std::string> SyncedNotificationAppInfo::GetAppIdList() {
101 std::vector<std::string> app_id_list;
102 std::vector<std::string>::iterator it;
103 for (it = app_ids_.begin(); it != app_ids_.end(); ++it) {
104 app_id_list.push_back(*it);
105 }
106
107 return app_id_list;
108 }
109
110 // TODO: rename, queing now happens elsewhere.
111 // Fill up the queue of bitmaps to fetch.
QueueBitmapFetchJobs()112 void SyncedNotificationAppInfo::QueueBitmapFetchJobs() {
113 // If there are no bitmaps to fetch, call OnBitmapFetchesDone.
114 if (AreAllBitmapsFetched()) {
115 synced_notification_app_info_service_->OnBitmapFetchesDone(
116 added_app_ids_, removed_app_ids_);
117 DVLOG(2) << "AppInfo object with no bitmaps, we should add some. "
118 << this->settings_display_name_;
119 return;
120 }
121 }
122
123 // Start the bitmap fetching. When it is complete, the callback
124 // will notify the ChromeNotifierService of the new app info availablity.
StartBitmapFetch()125 void SyncedNotificationAppInfo::StartBitmapFetch() {
126 if (settings_holder_.get() != NULL)
127 settings_holder_->StartFetch();
128 if (monochrome_holder_.get() != NULL)
129 monochrome_holder_->StartFetch();
130 if (welcome_holder_.get() != NULL)
131 welcome_holder_->StartFetch();
132 }
133
134 // Method inherited from ImageHolderDelegate
OnFetchComplete()135 void SyncedNotificationAppInfo::OnFetchComplete() {
136 if (AreAllBitmapsFetched()) {
137 if (synced_notification_app_info_service_ != NULL) {
138 synced_notification_app_info_service_->OnBitmapFetchesDone(
139 added_app_ids_, removed_app_ids_);
140 }
141 }
142 }
143
144 // Check to see if we have responses for all the bitmaps we got a URL for.
AreAllBitmapsFetched()145 bool SyncedNotificationAppInfo::AreAllBitmapsFetched() {
146 bool done =
147 (settings_holder_.get() == NULL || settings_holder_->IsFetchingDone()) &&
148 (monochrome_holder_.get() == NULL ||
149 monochrome_holder_->IsFetchingDone()) &&
150 (welcome_holder_.get() == NULL || welcome_holder_->IsFetchingDone());
151
152 return done;
153 }
154
GetNotifierId()155 message_center::NotifierId SyncedNotificationAppInfo::GetNotifierId() {
156 return message_center::NotifierId(
157 message_center::NotifierId::SYNCED_NOTIFICATION_SERVICE,
158 settings_display_name_);
159 }
160
161 } // namespace notifier
162