03488077bca50f5e88188bf33eaa512080d2e597
[platform/framework/web/crosswalk.git] / src / chrome / browser / android / banners / app_banner_manager.cc
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/android/banners/app_banner_manager.h"
6
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.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 "ui/gfx/android/java_bitmap.h"
23
24 using base::android::ConvertJavaStringToUTF8;
25 using base::android::ConvertUTF8ToJavaString;
26
27 namespace {
28 const char kBannerTag[] = "google-play-id";
29 }
30
31 namespace banners {
32
33 AppBannerManager::AppBannerManager(JNIEnv* env, jobject obj)
34     : MetaTagObserver(kBannerTag),
35       weak_java_banner_view_manager_(env, obj) {}
36
37 AppBannerManager::~AppBannerManager() {
38 }
39
40 void AppBannerManager::Destroy(JNIEnv* env, jobject obj) {
41   delete this;
42 }
43
44 void AppBannerManager::BlockBanner(JNIEnv* env,
45                                    jobject obj,
46                                    jstring jurl,
47                                    jstring jpackage) {
48   if (!web_contents())
49     return;
50
51   GURL url(ConvertJavaStringToUTF8(env, jurl));
52   std::string package_name = ConvertJavaStringToUTF8(env, jpackage);
53   AppBannerSettingsHelper::Block(web_contents(), url, package_name);
54 }
55
56 void AppBannerManager::ReplaceWebContents(JNIEnv* env,
57                                           jobject obj,
58                                           jobject jweb_contents) {
59   content::WebContents* web_contents =
60       content::WebContents::FromJavaWebContents(jweb_contents);
61   Observe(web_contents);
62 }
63
64 void AppBannerManager::DidNavigateMainFrame(
65     const content::LoadCommittedDetails& details,
66     const content::FrameNavigateParams& params) {
67   // Get rid of the current banner.
68   JNIEnv* env = base::android::AttachCurrentThread();
69   ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env);
70   if (jobj.is_null())
71     return;
72   Java_AppBannerManager_dismissCurrentBanner(env, jobj.obj(), DISMISS_NAVIGATE);
73 }
74
75 void AppBannerManager::OnFetchComplete(const GURL url, const SkBitmap* bitmap) {
76   if (bitmap) {
77     JNIEnv* env = base::android::AttachCurrentThread();
78
79     ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env);
80     if (jobj.is_null())
81       return;
82
83     ScopedJavaLocalRef<jstring> jimage_url(
84         ConvertUTF8ToJavaString(env, url.spec()));
85     ScopedJavaLocalRef<jobject> jimage = gfx::ConvertToJavaBitmap(bitmap);
86     bool displayed = Java_AppBannerManager_createBanner(env,
87                                                         jobj.obj(),
88                                                         jimage_url.obj(),
89                                                         jimage.obj());
90     if (displayed)
91       banners::TrackDisplayEvent(DISPLAY_CREATED);
92   } else {
93     DVLOG(1) << "Failed to retrieve image: " << url;
94   }
95
96   fetcher_.reset();
97 }
98
99 void AppBannerManager::HandleMetaTagContent(const std::string& tag_content,
100                                             const GURL& expected_url) {
101   DCHECK(web_contents());
102   banners::TrackDisplayEvent(DISPLAY_BANNER_REQUESTED);
103
104   if (!AppBannerSettingsHelper::IsAllowed(web_contents(),
105                                           expected_url,
106                                           tag_content)) {
107     return;
108   }
109
110   // Send the info to the Java side to get info about the app.
111   JNIEnv* env = base::android::AttachCurrentThread();
112   ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env);
113   if (jobj.is_null())
114     return;
115
116   ScopedJavaLocalRef<jstring> jurl(
117       ConvertUTF8ToJavaString(env, expected_url.spec()));
118   ScopedJavaLocalRef<jstring> jpackage(
119       ConvertUTF8ToJavaString(env, tag_content));
120   Java_AppBannerManager_prepareBanner(env,
121                                       jobj.obj(),
122                                       jurl.obj(),
123                                       jpackage.obj());
124 }
125
126 bool AppBannerManager::FetchIcon(JNIEnv* env,
127                                  jobject obj,
128                                  jstring jimage_url) {
129   std::string image_url = ConvertJavaStringToUTF8(env, jimage_url);
130   if (!web_contents())
131     return false;
132
133   // Begin asynchronously fetching the app icon.
134   Profile* profile =
135       Profile::FromBrowserContext(web_contents()->GetBrowserContext());
136   fetcher_.reset(new chrome::BitmapFetcher(GURL(image_url), this));
137   fetcher_.get()->Start(profile);
138   return true;
139 }
140
141 void RecordDismissEvent(JNIEnv* env, jclass clazz, jint metric) {
142   banners::TrackDismissEvent(metric);
143 }
144
145 void RecordInstallEvent(JNIEnv* env, jclass clazz, jint metric) {
146   banners::TrackInstallEvent(metric);
147 }
148
149 jlong Init(JNIEnv* env, jobject obj) {
150   AppBannerManager* manager = new AppBannerManager(env, obj);
151   return reinterpret_cast<intptr_t>(manager);
152 }
153
154 jboolean IsEnabled(JNIEnv* env, jclass clazz) {
155   return !CommandLine::ForCurrentProcess()->HasSwitch(
156       switches::kDisableAppBanners);
157 }
158
159 // Register native methods
160 bool RegisterAppBannerManager(JNIEnv* env) {
161   return RegisterNativesImpl(env);
162 }
163
164 }  // namespace banners