| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/banners/app_banner_manager.h" | 5 #include "chrome/browser/android/banners/app_banner_manager.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 #include "ui/gfx/screen.h" | 38 #include "ui/gfx/screen.h" |
| 39 | 39 |
| 40 using base::android::ConvertJavaStringToUTF8; | 40 using base::android::ConvertJavaStringToUTF8; |
| 41 using base::android::ConvertJavaStringToUTF16; | 41 using base::android::ConvertJavaStringToUTF16; |
| 42 using base::android::ConvertUTF8ToJavaString; | 42 using base::android::ConvertUTF8ToJavaString; |
| 43 using base::android::ConvertUTF16ToJavaString; | 43 using base::android::ConvertUTF16ToJavaString; |
| 44 | 44 |
| 45 namespace { | 45 namespace { |
| 46 const char kBannerTag[] = "google-play-id"; | 46 const char kBannerTag[] = "google-play-id"; |
| 47 base::TimeDelta gTimeDeltaForTesting; | 47 base::TimeDelta gTimeDeltaForTesting; |
| 48 } | 48 } // namespace |
| 49 | 49 |
| 50 namespace banners { | 50 namespace banners { |
| 51 | 51 |
| 52 // Fetches a bitmap and deletes itself when completed. |
| 53 class AppBannerManager::BannerBitmapFetcher |
| 54 : public chrome::BitmapFetcher, |
| 55 public chrome::BitmapFetcherDelegate { |
| 56 public: |
| 57 BannerBitmapFetcher(const GURL& image_url, |
| 58 banners::AppBannerManager* manager); |
| 59 |
| 60 // Prevents informing the AppBannerManager that the fetch has completed. |
| 61 void Cancel(); |
| 62 |
| 63 // chrome::BitmapFetcherDelegate overrides |
| 64 void OnFetchComplete(const GURL url, const SkBitmap* icon) override; |
| 65 |
| 66 private: |
| 67 banners::AppBannerManager* manager_; |
| 68 bool is_cancelled_; |
| 69 }; |
| 70 |
| 71 AppBannerManager::BannerBitmapFetcher::BannerBitmapFetcher( |
| 72 const GURL& image_url, |
| 73 banners::AppBannerManager* manager) |
| 74 : chrome::BitmapFetcher(image_url, this), |
| 75 manager_(manager), |
| 76 is_cancelled_(false) { |
| 77 } |
| 78 |
| 79 void AppBannerManager::BannerBitmapFetcher::Cancel() { |
| 80 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 81 is_cancelled_ = true; |
| 82 } |
| 83 |
| 84 void AppBannerManager::BannerBitmapFetcher::OnFetchComplete( |
| 85 const GURL url, |
| 86 const SkBitmap* icon) { |
| 87 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 88 |
| 89 if (!is_cancelled_) |
| 90 manager_->OnFetchComplete(this, url, icon); |
| 91 |
| 92 delete this; |
| 93 } |
| 94 |
| 52 AppBannerManager::AppBannerManager(JNIEnv* env, jobject obj) | 95 AppBannerManager::AppBannerManager(JNIEnv* env, jobject obj) |
| 53 : weak_java_banner_view_manager_(env, obj), weak_factory_(this) { | 96 : fetcher_(nullptr), |
| 97 weak_java_banner_view_manager_(env, obj), |
| 98 weak_factory_(this) { |
| 54 } | 99 } |
| 55 | 100 |
| 56 AppBannerManager::~AppBannerManager() { | 101 AppBannerManager::~AppBannerManager() { |
| 102 CancelActiveFetcher(); |
| 57 } | 103 } |
| 58 | 104 |
| 59 void AppBannerManager::Destroy(JNIEnv* env, jobject obj) { | 105 void AppBannerManager::Destroy(JNIEnv* env, jobject obj) { |
| 60 delete this; | 106 delete this; |
| 61 } | 107 } |
| 62 | 108 |
| 63 void AppBannerManager::ReplaceWebContents(JNIEnv* env, | 109 void AppBannerManager::ReplaceWebContents(JNIEnv* env, |
| 64 jobject obj, | 110 jobject obj, |
| 65 jobject jweb_contents) { | 111 jobject jweb_contents) { |
| 66 content::WebContents* web_contents = | 112 content::WebContents* web_contents = |
| 67 content::WebContents::FromJavaWebContents(jweb_contents); | 113 content::WebContents::FromJavaWebContents(jweb_contents); |
| 68 Observe(web_contents); | 114 Observe(web_contents); |
| 69 } | 115 } |
| 70 | 116 |
| 71 void AppBannerManager::DidNavigateMainFrame( | 117 void AppBannerManager::DidNavigateMainFrame( |
| 72 const content::LoadCommittedDetails& details, | 118 const content::LoadCommittedDetails& details, |
| 73 const content::FrameNavigateParams& params) { | 119 const content::FrameNavigateParams& params) { |
| 74 // Clear current state. | 120 // Clear current state. |
| 75 fetcher_.reset(); | 121 CancelActiveFetcher(); |
| 76 app_title_ = base::string16(); | 122 app_title_ = base::string16(); |
| 77 web_app_data_ = content::Manifest(); | 123 web_app_data_ = content::Manifest(); |
| 78 native_app_data_.Reset(); | 124 native_app_data_.Reset(); |
| 79 native_app_package_ = std::string(); | 125 native_app_package_ = std::string(); |
| 80 } | 126 } |
| 81 | 127 |
| 82 void AppBannerManager::DidFinishLoad( | 128 void AppBannerManager::DidFinishLoad( |
| 83 content::RenderFrameHost* render_frame_host, | 129 content::RenderFrameHost* render_frame_host, |
| 84 const GURL& validated_url) { | 130 const GURL& validated_url) { |
| 85 if (render_frame_host->GetParent()) | 131 if (render_frame_host->GetParent()) |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 GetCurrentTime())) { | 201 GetCurrentTime())) { |
| 156 return false; | 202 return false; |
| 157 } | 203 } |
| 158 | 204 |
| 159 AppBannerSettingsHelper::RecordBannerEvent( | 205 AppBannerSettingsHelper::RecordBannerEvent( |
| 160 web_contents(), validated_url_, package_or_start_url, | 206 web_contents(), validated_url_, package_or_start_url, |
| 161 AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, GetCurrentTime()); | 207 AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, GetCurrentTime()); |
| 162 return true; | 208 return true; |
| 163 } | 209 } |
| 164 | 210 |
| 211 void AppBannerManager::CancelActiveFetcher() { |
| 212 // Fetchers delete themselves. |
| 213 if (fetcher_ != nullptr) { |
| 214 fetcher_->Cancel(); |
| 215 fetcher_ = nullptr; |
| 216 } |
| 217 } |
| 218 |
| 165 bool AppBannerManager::OnMessageReceived(const IPC::Message& message) { | 219 bool AppBannerManager::OnMessageReceived(const IPC::Message& message) { |
| 166 bool handled = true; | 220 bool handled = true; |
| 167 IPC_BEGIN_MESSAGE_MAP(AppBannerManager, message) | 221 IPC_BEGIN_MESSAGE_MAP(AppBannerManager, message) |
| 168 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidRetrieveMetaTagContent, | 222 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidRetrieveMetaTagContent, |
| 169 OnDidRetrieveMetaTagContent) | 223 OnDidRetrieveMetaTagContent) |
| 170 IPC_MESSAGE_UNHANDLED(handled = false) | 224 IPC_MESSAGE_UNHANDLED(handled = false) |
| 171 IPC_END_MESSAGE_MAP() | 225 IPC_END_MESSAGE_MAP() |
| 172 return handled; | 226 return handled; |
| 173 } | 227 } |
| 174 | 228 |
| 175 void AppBannerManager::OnFetchComplete(const GURL url, const SkBitmap* bitmap) { | 229 void AppBannerManager::OnFetchComplete(BannerBitmapFetcher* fetcher, |
| 176 fetcher_.reset(); | 230 const GURL url, |
| 177 if (!bitmap || url != app_icon_url_) { | 231 const SkBitmap* bitmap) { |
| 178 DVLOG(1) << "Failed to retrieve image: " << url; | 232 if (fetcher_ != fetcher) |
| 179 return; | 233 return; |
| 180 } | 234 fetcher_ = nullptr; |
| 235 |
| 236 if (!bitmap || url != app_icon_url_) |
| 237 return; |
| 181 | 238 |
| 182 JNIEnv* env = base::android::AttachCurrentThread(); | 239 JNIEnv* env = base::android::AttachCurrentThread(); |
| 183 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env); | 240 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env); |
| 184 if (jobj.is_null()) | 241 if (jobj.is_null()) |
| 185 return; | 242 return; |
| 186 | 243 |
| 187 InfoBarService* service = InfoBarService::FromWebContents(web_contents()); | 244 InfoBarService* service = InfoBarService::FromWebContents(web_contents()); |
| 188 | 245 |
| 189 AppBannerInfoBar* weak_infobar_ptr = nullptr; | 246 AppBannerInfoBar* weak_infobar_ptr = nullptr; |
| 190 if (!native_app_data_.is_null()) { | 247 if (!native_app_data_.is_null()) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 if (validated_url_ != web_contents()->GetURL()) | 309 if (validated_url_ != web_contents()->GetURL()) |
| 253 return false; | 310 return false; |
| 254 | 311 |
| 255 std::string image_url = ConvertJavaStringToUTF8(env, jicon_url); | 312 std::string image_url = ConvertJavaStringToUTF8(env, jicon_url); |
| 256 app_title_ = ConvertJavaStringToUTF16(env, japp_title); | 313 app_title_ = ConvertJavaStringToUTF16(env, japp_title); |
| 257 native_app_package_ = ConvertJavaStringToUTF8(env, japp_package); | 314 native_app_package_ = ConvertJavaStringToUTF8(env, japp_package); |
| 258 native_app_data_.Reset(env, japp_data); | 315 native_app_data_.Reset(env, japp_data); |
| 259 return FetchIcon(GURL(image_url)); | 316 return FetchIcon(GURL(image_url)); |
| 260 } | 317 } |
| 261 | 318 |
| 262 int AppBannerManager::GetNumActiveFetchers(JNIEnv* env, jobject obj) { | 319 bool AppBannerManager::IsFetcherActive(JNIEnv* env, jobject obj) { |
| 263 return fetcher_.get() ? 1 : 0; | 320 return fetcher_ != nullptr; |
| 264 } | 321 } |
| 265 | 322 |
| 266 bool AppBannerManager::FetchIcon(const GURL& image_url) { | 323 bool AppBannerManager::FetchIcon(const GURL& image_url) { |
| 267 if (!web_contents()) | 324 if (!web_contents()) |
| 268 return false; | 325 return false; |
| 269 | 326 |
| 270 // Begin asynchronously fetching the app icon. | 327 // Begin asynchronously fetching the app icon. |
| 271 Profile* profile = | 328 Profile* profile = |
| 272 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | 329 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
| 273 fetcher_.reset(new chrome::BitmapFetcher(image_url, this)); | 330 |
| 274 fetcher_.get()->Start( | 331 CancelActiveFetcher(); |
| 332 fetcher_ = new BannerBitmapFetcher(image_url, this); |
| 333 fetcher_->Start( |
| 275 profile->GetRequestContext(), | 334 profile->GetRequestContext(), |
| 276 std::string(), | 335 std::string(), |
| 277 net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE, | 336 net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE, |
| 278 net::LOAD_NORMAL); | 337 net::LOAD_NORMAL); |
| 279 app_icon_url_ = image_url; | 338 app_icon_url_ = image_url; |
| 280 return true; | 339 return true; |
| 281 } | 340 } |
| 282 | 341 |
| 283 int AppBannerManager::GetPreferredIconSize() { | 342 int AppBannerManager::GetPreferredIconSize() { |
| 284 JNIEnv* env = base::android::AttachCurrentThread(); | 343 JNIEnv* env = base::android::AttachCurrentThread(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 315 void SetTimeDeltaForTesting(JNIEnv* env, jclass clazz, jint days) { | 374 void SetTimeDeltaForTesting(JNIEnv* env, jclass clazz, jint days) { |
| 316 gTimeDeltaForTesting = base::TimeDelta::FromDays(days); | 375 gTimeDeltaForTesting = base::TimeDelta::FromDays(days); |
| 317 } | 376 } |
| 318 | 377 |
| 319 // Register native methods | 378 // Register native methods |
| 320 bool RegisterAppBannerManager(JNIEnv* env) { | 379 bool RegisterAppBannerManager(JNIEnv* env) { |
| 321 return RegisterNativesImpl(env); | 380 return RegisterNativesImpl(env); |
| 322 } | 381 } |
| 323 | 382 |
| 324 } // namespace banners | 383 } // namespace banners |
| OLD | NEW |