| Index: chrome/browser/android/banners/app_banner_manager.cc
|
| diff --git a/chrome/browser/android/banners/app_banner_manager.cc b/chrome/browser/android/banners/app_banner_manager.cc
|
| index 14dadaa71e15d58416b82f002948b8bcd557a966..e046f3b39d46b150b34ad92f56e816075ebc60b7 100644
|
| --- a/chrome/browser/android/banners/app_banner_manager.cc
|
| +++ b/chrome/browser/android/banners/app_banner_manager.cc
|
| @@ -9,10 +9,12 @@
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "chrome/browser/android/banners/app_banner_infobar_delegate.h"
|
| #include "chrome/browser/android/banners/app_banner_metrics_ids.h"
|
| #include "chrome/browser/android/banners/app_banner_settings_helper.h"
|
| #include "chrome/browser/android/banners/app_banner_utilities.h"
|
| #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
|
| +#include "chrome/browser/infobars/infobar_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/chrome_constants.h"
|
| #include "chrome/common/chrome_switches.h"
|
| @@ -29,6 +31,7 @@
|
|
|
| using base::android::ConvertJavaStringToUTF8;
|
| using base::android::ConvertUTF8ToJavaString;
|
| +using base::android::ConvertUTF16ToJavaString;
|
|
|
| namespace {
|
| const char kBannerTag[] = "google-play-id";
|
| @@ -58,6 +61,28 @@ void AppBannerManager::BlockBanner(JNIEnv* env,
|
| AppBannerSettingsHelper::Block(web_contents(), url, package_name);
|
| }
|
|
|
| +void AppBannerManager::Block() const {
|
| + if (!web_contents() || manifest_.IsEmpty())
|
| + return;
|
| +
|
| + AppBannerSettingsHelper::Block(web_contents(),
|
| + web_contents()->GetURL(),
|
| + manifest_.start_url.spec());
|
| +}
|
| +
|
| +void AppBannerManager::Install() const {
|
| + if (!web_contents())
|
| + return;
|
| +
|
| + if (!manifest_.IsEmpty()) {
|
| + // TODO(dfalcantara): Trigger shortcut creation.
|
| + }
|
| +}
|
| +
|
| +gfx::Image AppBannerManager::GetIcon() const {
|
| + return gfx::Image::CreateFrom1xBitmap(*app_icon_.get());
|
| +}
|
| +
|
| void AppBannerManager::ReplaceWebContents(JNIEnv* env,
|
| jobject obj,
|
| jobject jweb_contents) {
|
| @@ -69,6 +94,11 @@ void AppBannerManager::ReplaceWebContents(JNIEnv* env,
|
| void AppBannerManager::DidNavigateMainFrame(
|
| const content::LoadCommittedDetails& details,
|
| const content::FrameNavigateParams& params) {
|
| + // Clear current state.
|
| + fetcher_.reset();
|
| + manifest_ = content::Manifest();
|
| + app_icon_.reset();
|
| +
|
| // Get rid of the current banner.
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env);
|
| @@ -105,7 +135,23 @@ void AppBannerManager::OnDidGetManifest(const content::Manifest& manifest) {
|
|
|
| // TODO(benwells): Check triggering parameters here and if there is a meta
|
| // tag.
|
| - // TODO(dfalcantara): Show banner for web site with manifest.
|
| +
|
| + // Create an infobar to promote the manifest's app.
|
| + manifest_ = manifest;
|
| +
|
| + /* TODO(dfalcantara): Use after landing https://crrev.com/880203004.
|
| + GURL icon_url =
|
| + ManifestIconSelector::FindBestMatchingIcon(manifest.icons,
|
| + GetPreferredIconSize(),
|
| + web_contents());
|
| + if (icon_url.is_empty())
|
| + return;
|
| + */
|
| + if (manifest.icons.empty())
|
| + return;
|
| + GURL icon_url = manifest.icons.back().src;
|
| +
|
| + FetchIcon(icon_url);
|
| }
|
|
|
| bool AppBannerManager::OnMessageReceived(const IPC::Message& message) {
|
| @@ -126,13 +172,26 @@ void AppBannerManager::OnFetchComplete(const GURL url, const SkBitmap* bitmap) {
|
| if (jobj.is_null())
|
| return;
|
|
|
| - ScopedJavaLocalRef<jstring> jimage_url(
|
| - ConvertUTF8ToJavaString(env, url.spec()));
|
| - ScopedJavaLocalRef<jobject> jimage = gfx::ConvertToJavaBitmap(bitmap);
|
| - bool displayed = Java_AppBannerManager_createBanner(env,
|
| - jobj.obj(),
|
| - jimage_url.obj(),
|
| - jimage.obj());
|
| + bool displayed;
|
| + if (manifest_.IsEmpty()) {
|
| + ScopedJavaLocalRef<jobject> jimage = gfx::ConvertToJavaBitmap(bitmap);
|
| + ScopedJavaLocalRef<jstring> jimage_url(
|
| + ConvertUTF8ToJavaString(env, url.spec()));
|
| +
|
| + displayed = Java_AppBannerManager_createBanner(env,
|
| + jobj.obj(),
|
| + jimage_url.obj(),
|
| + jimage.obj());
|
| + } else {
|
| + app_icon_.reset(new SkBitmap(*bitmap));
|
| + InfoBarService* service = InfoBarService::FromWebContents(web_contents());
|
| + displayed = AppBannerInfoBarDelegate::CreateForWebApp(
|
| + service,
|
| + this,
|
| + manifest_.name.string(),
|
| + manifest_.start_url) != NULL;
|
| + }
|
| +
|
| if (displayed)
|
| banners::TrackDisplayEvent(DISPLAY_CREATED);
|
| } else {
|
| @@ -181,13 +240,17 @@ bool AppBannerManager::FetchIcon(JNIEnv* env,
|
| jobject obj,
|
| jstring jimage_url) {
|
| std::string image_url = ConvertJavaStringToUTF8(env, jimage_url);
|
| + return FetchIcon(GURL(image_url));
|
| +}
|
| +
|
| +bool AppBannerManager::FetchIcon(const GURL& image_url) {
|
| if (!web_contents())
|
| return false;
|
|
|
| // Begin asynchronously fetching the app icon.
|
| Profile* profile =
|
| Profile::FromBrowserContext(web_contents()->GetBrowserContext());
|
| - fetcher_.reset(new chrome::BitmapFetcher(GURL(image_url), this));
|
| + fetcher_.reset(new chrome::BitmapFetcher(image_url, this));
|
| fetcher_.get()->Start(
|
| profile->GetRequestContext(),
|
| std::string(),
|
| @@ -196,6 +259,15 @@ bool AppBannerManager::FetchIcon(JNIEnv* env,
|
| return true;
|
| }
|
|
|
| +int AppBannerManager::GetPreferredIconSize() {
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env);
|
| + if (jobj.is_null())
|
| + return 0;
|
| +
|
| + return Java_AppBannerManager_getPreferredIconSize(env, jobj.obj());
|
| +}
|
| +
|
| void RecordDismissEvent(JNIEnv* env, jclass clazz, jint metric) {
|
| banners::TrackDismissEvent(metric);
|
| }
|
|
|