Add ENABLE_MEDIA_ROUTER define to builds other than Android and iOS.
[chromium-blink-merge.git] / chrome / browser / android / banners / app_banner_manager_android.cc
blob8345a64d8b27352bb00bc08637cce867d5f0abf2
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;
24 namespace {
25 const char kBannerTag[] = "google-play-id";
26 } // anonymous namespace
28 namespace banners {
30 AppBannerManagerAndroid::AppBannerManagerAndroid(JNIEnv* env,
31 jobject obj,
32 int icon_size)
33 : AppBannerManager(icon_size),
34 weak_java_banner_view_manager_(env, obj) {
37 AppBannerManagerAndroid::~AppBannerManagerAndroid() {
40 void AppBannerManagerAndroid::Destroy(JNIEnv* env, jobject obj) {
41 delete this;
44 void AppBannerManagerAndroid::ReplaceWebContents(JNIEnv* env,
45 jobject obj,
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) {
54 bool handled = true;
55 IPC_BEGIN_MESSAGE_MAP(AppBannerManagerAndroid, message)
56 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidRetrieveMetaTagContent,
57 OnDidRetrieveMetaTagContent)
58 IPC_MESSAGE_UNHANDLED(handled = false)
59 IPC_END_MESSAGE_MAP()
60 return handled;
63 bool AppBannerManagerAndroid::OnInvalidManifest(AppBannerDataFetcher* fetcher) {
64 DCHECK(data_fetcher() == fetcher);
65 if (web_contents()->IsBeingDestroyed() || !IsEnabledForNativeApps()) {
66 return false;
69 Send(new ChromeViewMsg_RetrieveMetaTagContent(routing_id(),
70 fetcher->validated_url(),
71 kBannerTag));
72 return true;
75 AppBannerDataFetcher* AppBannerManagerAndroid::CreateAppBannerDataFetcher(
76 base::WeakPtr<Delegate> weak_delegate,
77 const int ideal_icon_size) {
78 return new AppBannerDataFetcherAndroid(web_contents(), weak_delegate,
79 ideal_icon_size);
82 void AppBannerManagerAndroid::OnDidRetrieveMetaTagContent(
83 bool success,
84 const std::string& tag_name,
85 const std::string& tag_content,
86 const GURL& expected_url) {
87 DCHECK(web_contents());
88 if (!success
89 || tag_name != kBannerTag
90 || !data_fetcher()
91 || data_fetcher()->validated_url() != expected_url
92 || tag_content.size() >= chrome::kMaxMetaTagAttributeLength) {
93 return;
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);
101 if (jobj.is_null())
102 return;
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,
113 jobject obj,
114 jobject japp_data,
115 jstring japp_title,
116 jstring japp_package,
117 jstring jicon_url) {
118 if (!data_fetcher() || !web_contents()
119 || data_fetcher()->validated_url() != web_contents()->GetURL()) {
120 return false;
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();
140 // static
141 bool AppBannerManagerAndroid::IsEnabledForNativeApps() {
142 return base::CommandLine::ForCurrentProcess()->HasSwitch(
143 switches::kEnableAppInstallAlerts);
146 // static
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