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 "chrome/browser/android/banners/app_banner_data_fetcher_android.h"
11 #include "chrome/browser/banners/app_banner_metrics.h"
12 #include "chrome/common/chrome_constants.h"
13 #include "chrome/common/chrome_switches.h"
14 #include "chrome/common/render_messages.h"
15 #include "content/public/browser/web_contents.h"
16 #include "content/public/common/frame_navigate_params.h"
17 #include "jni/AppBannerManager_jni.h"
19 using base::android::ConvertJavaStringToUTF8
;
20 using base::android::ConvertJavaStringToUTF16
;
21 using base::android::ConvertUTF8ToJavaString
;
22 using base::android::ConvertUTF16ToJavaString
;
25 const char kBannerTag
[] = "google-play-id";
26 } // anonymous namespace
30 AppBannerManagerAndroid::AppBannerManagerAndroid(JNIEnv
* env
,
33 : AppBannerManager(icon_size
),
34 weak_java_banner_view_manager_(env
, obj
) {
37 AppBannerManagerAndroid::~AppBannerManagerAndroid() {
40 void AppBannerManagerAndroid::Destroy(JNIEnv
* env
, jobject obj
) {
44 void AppBannerManagerAndroid::ReplaceWebContents(JNIEnv
* env
,
46 jobject jweb_contents
) {
47 content::WebContents
* web_contents
=
48 content::WebContents::FromJavaWebContents(jweb_contents
);
49 AppBannerManager::ReplaceWebContents(web_contents
);
52 bool AppBannerManagerAndroid::OnMessageReceived(
53 const IPC::Message
& message
) {
55 IPC_BEGIN_MESSAGE_MAP(AppBannerManagerAndroid
, message
)
56 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidRetrieveMetaTagContent
,
57 OnDidRetrieveMetaTagContent
)
58 IPC_MESSAGE_UNHANDLED(handled
= false)
63 bool AppBannerManagerAndroid::OnInvalidManifest(AppBannerDataFetcher
* fetcher
) {
64 DCHECK(data_fetcher() == fetcher
);
65 if (web_contents()->IsBeingDestroyed() || !IsEnabledForNativeApps()) {
69 Send(new ChromeViewMsg_RetrieveMetaTagContent(routing_id(),
70 fetcher
->validated_url(),
75 AppBannerDataFetcher
* AppBannerManagerAndroid::CreateAppBannerDataFetcher(
76 base::WeakPtr
<Delegate
> weak_delegate
,
77 const int ideal_icon_size
) {
78 return new AppBannerDataFetcherAndroid(web_contents(), weak_delegate
,
82 void AppBannerManagerAndroid::OnDidRetrieveMetaTagContent(
84 const std::string
& tag_name
,
85 const std::string
& tag_content
,
86 const GURL
& expected_url
) {
87 DCHECK(web_contents());
89 || tag_name
!= kBannerTag
91 || data_fetcher()->validated_url() != expected_url
92 || tag_content
.size() >= chrome::kMaxMetaTagAttributeLength
) {
96 banners::TrackDisplayEvent(DISPLAY_EVENT_BANNER_REQUESTED
);
98 // Send the info to the Java side to get info about the app.
99 JNIEnv
* env
= base::android::AttachCurrentThread();
100 ScopedJavaLocalRef
<jobject
> jobj
= weak_java_banner_view_manager_
.get(env
);
104 ScopedJavaLocalRef
<jstring
> jurl(
105 ConvertUTF8ToJavaString(env
, expected_url
.spec()));
106 ScopedJavaLocalRef
<jstring
> jpackage(
107 ConvertUTF8ToJavaString(env
, tag_content
));
108 Java_AppBannerManager_fetchAppDetails(
109 env
, jobj
.obj(), jurl
.obj(), jpackage
.obj(), ideal_icon_size());
112 bool AppBannerManagerAndroid::OnAppDetailsRetrieved(JNIEnv
* env
,
116 jstring japp_package
,
118 if (!data_fetcher() || !web_contents()
119 || data_fetcher()->validated_url() != web_contents()->GetURL()) {
123 base::android::ScopedJavaLocalRef
<jobject
> native_app_data
;
124 native_app_data
.Reset(env
, japp_data
);
125 GURL image_url
= GURL(ConvertJavaStringToUTF8(env
, jicon_url
));
127 AppBannerDataFetcherAndroid
* android_fetcher
=
128 static_cast<AppBannerDataFetcherAndroid
*>(data_fetcher().get());
129 return android_fetcher
->ContinueFetching(
130 ConvertJavaStringToUTF16(env
, japp_title
),
131 ConvertJavaStringToUTF8(env
, japp_package
),
132 native_app_data
, image_url
);
135 bool AppBannerManagerAndroid::IsFetcherActive(JNIEnv
* env
, jobject obj
) {
136 return AppBannerManager::IsFetcherActive();
141 bool AppBannerManagerAndroid::IsEnabledForNativeApps() {
142 return base::CommandLine::ForCurrentProcess()->HasSwitch(
143 switches::kEnableAppInstallAlerts
);
147 bool AppBannerManagerAndroid::Register(JNIEnv
* env
) {
148 return RegisterNativesImpl(env
);
151 jlong
Init(JNIEnv
* env
, jobject obj
, jint icon_size
) {
152 AppBannerManagerAndroid
* manager
=
153 new AppBannerManagerAndroid(env
, obj
, icon_size
);
154 return reinterpret_cast<intptr_t>(manager
);
157 void SetTimeDeltaForTesting(JNIEnv
* env
, jclass clazz
, jint days
) {
158 AppBannerDataFetcher::SetTimeDeltaForTesting(days
);
161 void DisableSecureSchemeCheckForTesting(JNIEnv
* env
, jclass clazz
) {
162 AppBannerManager::DisableSecureSchemeCheckForTesting();
165 jboolean
IsEnabled(JNIEnv
* env
, jclass clazz
) {
166 return AppBannerManager::IsEnabled();
169 } // namespace banners