Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1116)

Unified Diff: chrome/browser/android/banners/app_banner_manager.cc

Issue 893073002: Start showing basic infobars for manifest apps (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing comments Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/android/banners/app_banner_manager.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « chrome/browser/android/banners/app_banner_manager.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698