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