[sql] Remove _HAS_EXCEPTIONS=0 from build info.
[chromium-blink-merge.git] / chrome / browser / android / banners / app_banner_manager_android.cc
blob9c5cb610c69c076c9a0ea5d47f83e7cc63831be3
1 // Copyright 2015 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_android.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/field_trial.h"
11 #include "chrome/browser/android/banners/app_banner_data_fetcher_android.h"
12 #include "chrome/browser/banners/app_banner_metrics.h"
13 #include "chrome/common/chrome_constants.h"
14 #include "content/public/browser/web_contents.h"
15 #include "content/public/common/frame_navigate_params.h"
16 #include "jni/AppBannerManager_jni.h"
18 using base::android::ConvertJavaStringToUTF8;
19 using base::android::ConvertJavaStringToUTF16;
20 using base::android::ConvertUTF8ToJavaString;
21 using base::android::ConvertUTF16ToJavaString;
23 namespace {
24 const char kPlayPlatform[] = "play";
25 } // anonymous namespace
27 namespace banners {
29 AppBannerManagerAndroid::AppBannerManagerAndroid(JNIEnv* env,
30 jobject obj,
31 int icon_size)
32 : AppBannerManager(icon_size),
33 weak_java_banner_view_manager_(env, obj) {
36 AppBannerManagerAndroid::~AppBannerManagerAndroid() {
39 void AppBannerManagerAndroid::Destroy(JNIEnv* env, jobject obj) {
40 delete this;
43 void AppBannerManagerAndroid::ReplaceWebContents(JNIEnv* env,
44 jobject obj,
45 jobject jweb_contents) {
46 content::WebContents* web_contents =
47 content::WebContents::FromJavaWebContents(jweb_contents);
48 AppBannerManager::ReplaceWebContents(web_contents);
51 bool AppBannerManagerAndroid::HandleNonWebApp(const std::string& platform,
52 const GURL& url,
53 const std::string& id) {
54 if (!CheckPlatformAndId(platform, id))
55 return false;
57 banners::TrackDisplayEvent(DISPLAY_EVENT_NATIVE_APP_BANNER_REQUESTED);
59 // Send the info to the Java side to get info about the app.
60 JNIEnv* env = base::android::AttachCurrentThread();
61 ScopedJavaLocalRef<jobject> jobj = weak_java_banner_view_manager_.get(env);
62 if (jobj.is_null())
63 return false;
65 ScopedJavaLocalRef<jstring> jurl(
66 ConvertUTF8ToJavaString(env, data_fetcher()->validated_url().spec()));
67 ScopedJavaLocalRef<jstring> jpackage(
68 ConvertUTF8ToJavaString(env, id));
69 Java_AppBannerManager_fetchAppDetails(
70 env, jobj.obj(), jurl.obj(), jpackage.obj(), ideal_icon_size());
71 return true;
74 bool AppBannerManagerAndroid::CheckPlatformAndId(const std::string& platform,
75 const std::string& id) {
76 if (platform != kPlayPlatform) {
77 banners::OutputDeveloperDebugMessage(
78 web_contents(), platform + banners::kIgnoredNotSupportedOnAndroid);
79 return false;
81 if (id.empty()) {
82 banners::OutputDeveloperDebugMessage(web_contents(), banners::kIgnoredNoId);
83 return false;
85 return true;
88 bool AppBannerManagerAndroid::CheckFetcherMatchesContents() {
89 if (!web_contents()) {
90 return false;
92 if (!data_fetcher() ||
93 data_fetcher()->validated_url() != web_contents()->GetURL()) {
94 banners::OutputDeveloperNotShownMessage(
95 web_contents(), banners::kUserNavigatedBeforeBannerShown);
96 return false;
98 return true;
101 AppBannerDataFetcher* AppBannerManagerAndroid::CreateAppBannerDataFetcher(
102 base::WeakPtr<Delegate> weak_delegate,
103 const int ideal_icon_size) {
104 return new AppBannerDataFetcherAndroid(web_contents(), weak_delegate,
105 ideal_icon_size);
108 bool AppBannerManagerAndroid::OnAppDetailsRetrieved(JNIEnv* env,
109 jobject obj,
110 jobject japp_data,
111 jstring japp_title,
112 jstring japp_package,
113 jstring jicon_url) {
114 if (!CheckFetcherMatchesContents())
115 return false;
117 base::android::ScopedJavaLocalRef<jobject> native_app_data;
118 native_app_data.Reset(env, japp_data);
119 GURL image_url = GURL(ConvertJavaStringToUTF8(env, jicon_url));
121 AppBannerDataFetcherAndroid* android_fetcher =
122 static_cast<AppBannerDataFetcherAndroid*>(data_fetcher().get());
123 return android_fetcher->ContinueFetching(
124 ConvertJavaStringToUTF16(env, japp_title),
125 ConvertJavaStringToUTF8(env, japp_package),
126 native_app_data, image_url);
129 bool AppBannerManagerAndroid::IsFetcherActive(JNIEnv* env, jobject obj) {
130 return AppBannerManager::IsFetcherActive();
133 // static
134 bool AppBannerManagerAndroid::Register(JNIEnv* env) {
135 return RegisterNativesImpl(env);
138 jlong Init(JNIEnv* env, jobject obj, jint icon_size) {
139 AppBannerManagerAndroid* manager =
140 new AppBannerManagerAndroid(env, obj, icon_size);
141 return reinterpret_cast<intptr_t>(manager);
144 void SetTimeDeltaForTesting(JNIEnv* env, jclass clazz, jint days) {
145 AppBannerDataFetcher::SetTimeDeltaForTesting(days);
148 void DisableSecureSchemeCheckForTesting(JNIEnv* env, jclass clazz) {
149 AppBannerManager::DisableSecureSchemeCheckForTesting();
152 void ForceEngagementWeightsForTesting(JNIEnv* env,
153 jclass clazz,
154 jdouble direct_engagement,
155 jdouble indirect_engagement) {
156 AppBannerManager::ForceEngagementWeightsForTesting(direct_engagement,
157 indirect_engagement);
160 jboolean IsEnabled(JNIEnv* env, jclass clazz) {
161 return base::FieldTrialList::FindFullName("AppBanners") == "Enabled";
164 } // namespace banners