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
;
24 const char kPlayPlatform
[] = "play";
25 } // anonymous namespace
29 AppBannerManagerAndroid::AppBannerManagerAndroid(JNIEnv
* env
,
32 : AppBannerManager(icon_size
),
33 weak_java_banner_view_manager_(env
, obj
) {
36 AppBannerManagerAndroid::~AppBannerManagerAndroid() {
39 void AppBannerManagerAndroid::Destroy(JNIEnv
* env
, jobject obj
) {
43 void AppBannerManagerAndroid::ReplaceWebContents(JNIEnv
* env
,
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
,
53 const std::string
& id
) {
54 if (!CheckPlatformAndId(platform
, id
))
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
);
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());
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
);
82 banners::OutputDeveloperDebugMessage(web_contents(), banners::kIgnoredNoId
);
88 bool AppBannerManagerAndroid::CheckFetcherMatchesContents() {
89 if (!web_contents()) {
92 if (!data_fetcher() ||
93 data_fetcher()->validated_url() != web_contents()->GetURL()) {
94 banners::OutputDeveloperNotShownMessage(
95 web_contents(), banners::kUserNavigatedBeforeBannerShown
);
101 AppBannerDataFetcher
* AppBannerManagerAndroid::CreateAppBannerDataFetcher(
102 base::WeakPtr
<Delegate
> weak_delegate
,
103 const int ideal_icon_size
) {
104 return new AppBannerDataFetcherAndroid(web_contents(), weak_delegate
,
108 bool AppBannerManagerAndroid::OnAppDetailsRetrieved(JNIEnv
* env
,
112 jstring japp_package
,
114 if (!CheckFetcherMatchesContents())
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();
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
,
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