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.
5 #include "chrome/browser/android/banners/app_banner_manager.h"
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/command_line.h"
10 #include "base/metrics/histogram.h"
11 #include "chrome/browser/android/banners/app_banner_metrics_ids.h"
12 #include "chrome/browser/android/banners/app_banner_settings_helper.h"
13 #include "chrome/browser/android/banners/app_banner_utilities.h"
14 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/common/chrome_switches.h"
17 #include "content/public/browser/android/content_view_core.h"
18 #include "content/public/browser/navigation_details.h"
19 #include "content/public/browser/web_contents.h"
20 #include "content/public/common/frame_navigate_params.h"
21 #include "jni/AppBannerManager_jni.h"
22 #include "net/base/load_flags.h"
23 #include "ui/gfx/android/java_bitmap.h"
25 using base::android::ConvertJavaStringToUTF8
;
26 using base::android::ConvertUTF8ToJavaString
;
29 const char kBannerTag
[] = "google-play-id";
34 AppBannerManager::AppBannerManager(JNIEnv
* env
, jobject obj
)
35 : MetaTagObserver(kBannerTag
),
36 weak_java_banner_view_manager_(env
, obj
) {}
38 AppBannerManager::~AppBannerManager() {
41 void AppBannerManager::Destroy(JNIEnv
* env
, jobject obj
) {
45 void AppBannerManager::BlockBanner(JNIEnv
* env
,
52 GURL
url(ConvertJavaStringToUTF8(env
, jurl
));
53 std::string package_name
= ConvertJavaStringToUTF8(env
, jpackage
);
54 AppBannerSettingsHelper::Block(web_contents(), url
, package_name
);
57 void AppBannerManager::ReplaceWebContents(JNIEnv
* env
,
59 jobject jweb_contents
) {
60 content::WebContents
* web_contents
=
61 content::WebContents::FromJavaWebContents(jweb_contents
);
62 Observe(web_contents
);
65 void AppBannerManager::DidNavigateMainFrame(
66 const content::LoadCommittedDetails
& details
,
67 const content::FrameNavigateParams
& params
) {
68 // Get rid of the current banner.
69 JNIEnv
* env
= base::android::AttachCurrentThread();
70 ScopedJavaLocalRef
<jobject
> jobj
= weak_java_banner_view_manager_
.get(env
);
73 Java_AppBannerManager_dismissCurrentBanner(env
, jobj
.obj(), DISMISS_NAVIGATE
);
76 void AppBannerManager::OnFetchComplete(const GURL url
, const SkBitmap
* bitmap
) {
78 JNIEnv
* env
= base::android::AttachCurrentThread();
80 ScopedJavaLocalRef
<jobject
> jobj
= weak_java_banner_view_manager_
.get(env
);
84 ScopedJavaLocalRef
<jstring
> jimage_url(
85 ConvertUTF8ToJavaString(env
, url
.spec()));
86 ScopedJavaLocalRef
<jobject
> jimage
= gfx::ConvertToJavaBitmap(bitmap
);
87 bool displayed
= Java_AppBannerManager_createBanner(env
,
92 banners::TrackDisplayEvent(DISPLAY_CREATED
);
94 DVLOG(1) << "Failed to retrieve image: " << url
;
100 void AppBannerManager::HandleMetaTagContent(const std::string
& tag_content
,
101 const GURL
& expected_url
) {
102 DCHECK(web_contents());
103 banners::TrackDisplayEvent(DISPLAY_BANNER_REQUESTED
);
105 if (!AppBannerSettingsHelper::IsAllowed(web_contents(),
111 // Send the info to the Java side to get info about the app.
112 JNIEnv
* env
= base::android::AttachCurrentThread();
113 ScopedJavaLocalRef
<jobject
> jobj
= weak_java_banner_view_manager_
.get(env
);
117 ScopedJavaLocalRef
<jstring
> jurl(
118 ConvertUTF8ToJavaString(env
, expected_url
.spec()));
119 ScopedJavaLocalRef
<jstring
> jpackage(
120 ConvertUTF8ToJavaString(env
, tag_content
));
121 Java_AppBannerManager_prepareBanner(env
,
127 bool AppBannerManager::FetchIcon(JNIEnv
* env
,
129 jstring jimage_url
) {
130 std::string image_url
= ConvertJavaStringToUTF8(env
, jimage_url
);
134 // Begin asynchronously fetching the app icon.
136 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
137 fetcher_
.reset(new chrome::BitmapFetcher(GURL(image_url
), this));
138 fetcher_
.get()->Start(
139 profile
->GetRequestContext(),
141 net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE
,
146 void RecordDismissEvent(JNIEnv
* env
, jclass clazz
, jint metric
) {
147 banners::TrackDismissEvent(metric
);
150 void RecordInstallEvent(JNIEnv
* env
, jclass clazz
, jint metric
) {
151 banners::TrackInstallEvent(metric
);
154 jlong
Init(JNIEnv
* env
, jobject obj
) {
155 AppBannerManager
* manager
= new AppBannerManager(env
, obj
);
156 return reinterpret_cast<intptr_t>(manager
);
159 jboolean
IsEnabled(JNIEnv
* env
, jclass clazz
) {
160 return base::CommandLine::ForCurrentProcess()->HasSwitch(
161 switches::kEnableAppInstallAlerts
);
164 // Register native methods
165 bool RegisterAppBannerManager(JNIEnv
* env
) {
166 return RegisterNativesImpl(env
);
169 } // namespace banners