summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authorpaulmiller <paulmiller@chromium.org>2016-01-04 16:50:19 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-05 00:51:20 +0000
commit5bc628b55810289b6ebb269da47642b929eaf42d (patch)
treef05214cca24a1c5d209c0d82b234c54944188e5b /android_webview
parentaa1c4ced03fe5890aa8cd2e330b939ee3accf02a (diff)
downloadchromium_src-5bc628b55810289b6ebb269da47642b929eaf42d.zip
chromium_src-5bc628b55810289b6ebb269da47642b929eaf42d.tar.gz
chromium_src-5bc628b55810289b6ebb269da47642b929eaf42d.tar.bz2
WebView Metrics client implementation (Chromium part)
BUG=546754 Review URL: https://codereview.chromium.org/1474483004 Cr-Commit-Position: refs/heads/master@{#367433}
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/BUILD.gn7
-rw-r--r--android_webview/DEPS1
-rw-r--r--android_webview/android_webview.gyp7
-rw-r--r--android_webview/browser/aw_browser_context.cc11
-rw-r--r--android_webview/browser/aw_browser_context.h9
-rw-r--r--android_webview/browser/aw_browser_main_parts.cc4
-rw-r--r--android_webview/browser/aw_browser_main_parts.h1
-rw-r--r--android_webview/browser/aw_metrics_service_client.cc190
-rw-r--r--android_webview/browser/aw_metrics_service_client.h84
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java6
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java29
-rw-r--r--android_webview/java/src/org/chromium/android_webview/PlatformServiceBridge.java53
-rw-r--r--android_webview/native/BUILD.gn8
-rw-r--r--android_webview/native/android_webview_jni_registrar.cc2
-rw-r--r--android_webview/native/aw_metrics_switch.cc23
-rw-r--r--android_webview/native/aw_metrics_switch.h16
-rw-r--r--android_webview/native/webview_native.gyp8
17 files changed, 451 insertions, 8 deletions
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 9a22539..95fe942 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -394,6 +394,8 @@ source_set("common") {
"browser/aw_message_port_message_filter.cc",
"browser/aw_message_port_message_filter.h",
"browser/aw_message_port_service.h",
+ "browser/aw_metrics_service_client.cc",
+ "browser/aw_metrics_service_client.h",
"browser/aw_permission_manager.cc",
"browser/aw_permission_manager.h",
"browser/aw_pref_store.cc",
@@ -523,6 +525,11 @@ source_set("common") {
"//components/crash/content/browser",
"//components/data_reduction_proxy/core/browser",
"//components/devtools_discovery",
+ "//components/metrics",
+ "//components/metrics:gpu",
+ "//components/metrics:net",
+ "//components/metrics:profiler",
+ "//components/metrics:ui",
"//components/navigation_interception",
"//components/printing/browser",
"//components/printing/common",
diff --git a/android_webview/DEPS b/android_webview/DEPS
index d45fa05..b53964d 100644
--- a/android_webview/DEPS
+++ b/android_webview/DEPS
@@ -9,6 +9,7 @@ include_rules = [
"+components/data_reduction_proxy",
"+components/devtools_discovery",
+ "+components/metrics",
"+content/public/common",
"+crypto",
"+gpu",
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp
index 6b9e7b0..7272bf7 100644
--- a/android_webview/android_webview.gyp
+++ b/android_webview/android_webview.gyp
@@ -230,6 +230,11 @@
'../components/components.gyp:crash_component',
'../components/components.gyp:data_reduction_proxy_core_browser',
'../components/components.gyp:devtools_discovery',
+ '../components/components.gyp:metrics',
+ '../components/components.gyp:metrics_gpu',
+ '../components/components.gyp:metrics_net',
+ '../components/components.gyp:metrics_profiler',
+ '../components/components.gyp:metrics_ui',
'../components/components.gyp:navigation_interception',
'../components/components.gyp:printing_common',
'../components/components.gyp:printing_browser',
@@ -301,6 +306,8 @@
'browser/aw_message_port_message_filter.cc',
'browser/aw_message_port_message_filter.h',
'browser/aw_message_port_service.h',
+ 'browser/aw_metrics_service_client.h',
+ 'browser/aw_metrics_service_client.cc',
'browser/aw_permission_manager.cc',
'browser/aw_permission_manager.h',
'browser/aw_pref_store.cc',
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc
index 2646287..098b955 100644
--- a/android_webview/browser/aw_browser_context.cc
+++ b/android_webview/browser/aw_browser_context.cc
@@ -8,6 +8,7 @@
#include "android_webview/browser/aw_browser_policy_connector.h"
#include "android_webview/browser/aw_form_database_service.h"
+#include "android_webview/browser/aw_metrics_service_client.h"
#include "android_webview/browser/aw_permission_manager.h"
#include "android_webview/browser/aw_pref_store.h"
#include "android_webview/browser/aw_quota_manager_bridge.h"
@@ -29,6 +30,7 @@
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
#include "components/data_reduction_proxy/core/browser/data_store.h"
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
+#include "components/metrics/metrics_service.h"
#include "components/policy/core/browser/browser_policy_connector_base.h"
#include "components/policy/core/browser/configuration_policy_pref_store.h"
#include "components/policy/core/browser/url_blacklist_manager.h"
@@ -253,6 +255,13 @@ void AwBrowserContext::PreMainMessageLoopRun() {
data_reduction_proxy_settings_->MaybeActivateDataReductionProxy(true);
blacklist_manager_.reset(CreateURLBlackListManager(user_pref_service_.get()));
+
+ AwMetricsServiceClient::GetInstance()->Initialize(user_pref_service_.get(),
+ GetRequestContext());
+}
+
+void AwBrowserContext::PostMainMessageLoopRun() {
+ AwMetricsServiceClient::GetInstance()->Finalize();
}
void AwBrowserContext::AddVisitedURLs(const std::vector<GURL>& urls) {
@@ -333,6 +342,8 @@ void AwBrowserContext::InitUserPrefService() {
pref_registry->RegisterStringPref(prefs::kAuthAndroidNegotiateAccountType,
std::string());
+ metrics::MetricsService::RegisterPrefs(pref_registry);
+
base::PrefServiceFactory pref_service_factory;
pref_service_factory.set_user_prefs(make_scoped_refptr(new AwPrefStore()));
pref_service_factory.set_managed_prefs(
diff --git a/android_webview/browser/aw_browser_context.h b/android_webview/browser/aw_browser_context.h
index 47ccb80..1702617 100644
--- a/android_webview/browser/aw_browser_context.h
+++ b/android_webview/browser/aw_browser_context.h
@@ -9,6 +9,7 @@
#include "android_webview/browser/aw_download_manager_delegate.h"
#include "android_webview/browser/aw_message_port_service.h"
+#include "android_webview/browser/aw_metrics_service_client.h"
#include "android_webview/browser/aw_ssl_host_state_delegate.h"
#include "base/compiler_specific.h"
#include "base/files/file_path.h"
@@ -84,8 +85,9 @@ class AwBrowserContext : public content::BrowserContext,
static void SetDataReductionProxyEnabled(bool enabled);
static void SetLegacyCacheRemovalDelayForTest(int delay_ms);
- // Maps to BrowserMainParts::PreMainMessageLoopRun.
+ // These map to BrowserMainParts::Pre/PostMainMessageLoopRun.
void PreMainMessageLoopRun();
+ void PostMainMessageLoopRun();
// These methods map to Add methods in visitedlink::VisitedLinkMaster.
void AddVisitedURLs(const std::vector<GURL>& urls);
@@ -100,17 +102,12 @@ class AwBrowserContext : public content::BrowserContext,
content::URLRequestInterceptorScopedVector request_interceptors);
AwQuotaManagerBridge* GetQuotaManagerBridge();
-
AwFormDatabaseService* GetFormDatabaseService();
-
data_reduction_proxy::DataReductionProxySettings*
GetDataReductionProxySettings();
-
data_reduction_proxy::DataReductionProxyIOData*
GetDataReductionProxyIOData();
-
AwURLRequestContextGetter* GetAwURLRequestContext();
-
AwMessagePortService* GetMessagePortService();
policy::URLBlacklistManager* GetURLBlacklistManager();
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc
index d0fe336c..04d9c68 100644
--- a/android_webview/browser/aw_browser_main_parts.cc
+++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -90,6 +90,10 @@ void AwBrowserMainParts::PreMainMessageLoopRun() {
content::RenderFrameHost::AllowInjectingJavaScriptForAndroidWebView();
}
+void AwBrowserMainParts::PostMainMessageLoopRun() {
+ browser_context_->PostMainMessageLoopRun();
+}
+
bool AwBrowserMainParts::MainMessageLoopRun(int* result_code) {
// Android WebView does not use default MessageLoop. It has its own
// Android specific MessageLoop.
diff --git a/android_webview/browser/aw_browser_main_parts.h b/android_webview/browser/aw_browser_main_parts.h
index 976446c..2818549 100644
--- a/android_webview/browser/aw_browser_main_parts.h
+++ b/android_webview/browser/aw_browser_main_parts.h
@@ -27,6 +27,7 @@ class AwBrowserMainParts : public content::BrowserMainParts {
void PreEarlyInitialization() override;
int PreCreateThreads() override;
void PreMainMessageLoopRun() override;
+ void PostMainMessageLoopRun() override;
bool MainMessageLoopRun(int* result_code) override;
private:
diff --git a/android_webview/browser/aw_metrics_service_client.cc b/android_webview/browser/aw_metrics_service_client.cc
new file mode 100644
index 0000000..16622b0
--- /dev/null
+++ b/android_webview/browser/aw_metrics_service_client.cc
@@ -0,0 +1,190 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "android_webview/browser/aw_metrics_service_client.h"
+
+#include "android_webview/common/aw_version_info_values.h"
+#include "base/bind.h"
+#include "base/i18n/rtl.h"
+#include "base/prefs/pref_service.h"
+#include "components/metrics/call_stack_profile_metrics_provider.h"
+#include "components/metrics/gpu/gpu_metrics_provider.h"
+#include "components/metrics/metrics_service.h"
+#include "components/metrics/metrics_state_manager.h"
+#include "components/metrics/net/net_metrics_log_uploader.h"
+#include "components/metrics/profiler/profiler_metrics_provider.h"
+#include "components/metrics/ui/screen_info_metrics_provider.h"
+#include "components/metrics/url_constants.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace android_webview {
+
+base::LazyInstance<AwMetricsServiceClient>::Leaky g_lazy_instance_;
+
+namespace {
+
+const int kUploadIntervalMinutes = 30;
+
+// Callbacks for metrics::MetricsStateManager::Create. Store/LoadClientInfo
+// allow Windows Chrome to back up ClientInfo. They're no-ops for WebView.
+
+void StoreClientInfo(const metrics::ClientInfo& client_info) {}
+
+scoped_ptr<metrics::ClientInfo> LoadClientInfo() {
+ scoped_ptr<metrics::ClientInfo> client_info;
+ return client_info;
+}
+
+} // namespace
+
+// static
+AwMetricsServiceClient* AwMetricsServiceClient::GetInstance() {
+ return g_lazy_instance_.Pointer();
+}
+
+// static
+void AwMetricsServiceClient::Initialize(
+ PrefService* pref_service,
+ net::URLRequestContextGetter* request_context) {
+ DCHECK(!is_initialized_);
+
+ pref_service_ = pref_service;
+ request_context_ = request_context;
+
+ metrics_state_manager_ = metrics::MetricsStateManager::Create(
+ pref_service_, base::Bind(&AwMetricsServiceClient::is_reporting_enabled,
+ base::Unretained(this)),
+ base::Bind(&StoreClientInfo), base::Bind(&LoadClientInfo));
+
+ metrics_service_.reset(new ::metrics::MetricsService(
+ metrics_state_manager_.get(), this, pref_service_));
+
+ metrics_service_->RegisterMetricsProvider(
+ scoped_ptr<metrics::MetricsProvider>(new metrics::NetworkMetricsProvider(
+ content::BrowserThread::GetBlockingPool())));
+
+ metrics_service_->RegisterMetricsProvider(
+ scoped_ptr<metrics::MetricsProvider>(new metrics::GPUMetricsProvider));
+
+ metrics_service_->RegisterMetricsProvider(
+ scoped_ptr<metrics::MetricsProvider>(
+ new metrics::ScreenInfoMetricsProvider));
+
+ metrics_service_->RegisterMetricsProvider(
+ scoped_ptr<metrics::MetricsProvider>(
+ new metrics::ProfilerMetricsProvider()));
+
+ metrics_service_->RegisterMetricsProvider(
+ scoped_ptr<metrics::MetricsProvider>(
+ new metrics::CallStackProfileMetricsProvider));
+
+ metrics_service_->InitializeMetricsRecordingState();
+
+ is_initialized_ = true;
+
+ if (is_reporting_enabled())
+ metrics_service_->Start();
+}
+
+void AwMetricsServiceClient::Finalize() {
+ DCHECK(is_initialized_);
+ metrics_service_->Stop();
+}
+
+void AwMetricsServiceClient::SetMetricsEnabled(bool enabled) {
+ // If the client is already initialized, apply the setting immediately.
+ // Otherwise, it will be applied on initialization.
+ if (is_initialized_ && is_enabled_ != enabled) {
+ if (enabled)
+ metrics_service_->Start();
+ else
+ metrics_service_->Stop();
+ }
+ is_enabled_ = enabled;
+}
+
+metrics::MetricsService* AwMetricsServiceClient::GetMetricsService() {
+ return metrics_service_.get();
+}
+
+// In Chrome, UMA and Breakpad are enabled/disabled together by the same
+// checkbox and they share the same client ID (a.k.a. GUID). SetMetricsClientId
+// and OnRecordingDisabled are intended to provide the ID to Breakpad. In
+// WebView, UMA and Breakpad are independent, so these are no-ops.
+
+void AwMetricsServiceClient::SetMetricsClientId(const std::string& client_id) {}
+
+void AwMetricsServiceClient::OnRecordingDisabled() {}
+
+bool AwMetricsServiceClient::IsOffTheRecordSessionActive() {
+ // WebView has no incognito mode.
+ return false;
+}
+
+int32_t AwMetricsServiceClient::GetProduct() {
+ // TODO(paulmiller) Switch this to a WebView product once we have a log source
+ // for WebView.
+ return ::metrics::ChromeUserMetricsExtension::CHROME;
+}
+
+std::string AwMetricsServiceClient::GetApplicationLocale() {
+ return base::i18n::GetConfiguredLocale();
+}
+
+bool AwMetricsServiceClient::GetBrand(std::string* brand_code) {
+ // WebView doesn't use brand codes.
+ return false;
+}
+
+metrics::SystemProfileProto::Channel AwMetricsServiceClient::GetChannel() {
+ // "Channel" means stable, beta, etc. WebView doesn't have channel info yet.
+ // TODO(paulmiller) Update this once we have channel info.
+ return metrics::SystemProfileProto::CHANNEL_UNKNOWN;
+}
+
+std::string AwMetricsServiceClient::GetVersionString() {
+ return PRODUCT_VERSION;
+}
+
+void AwMetricsServiceClient::OnLogUploadComplete() {}
+
+void AwMetricsServiceClient::InitializeSystemProfileMetrics(
+ const base::Closure& done_callback) {
+ done_callback.Run();
+}
+
+void AwMetricsServiceClient::CollectFinalMetricsForLog(
+ const base::Closure& done_callback) {
+ done_callback.Run();
+}
+
+scoped_ptr<metrics::MetricsLogUploader> AwMetricsServiceClient::CreateUploader(
+ const base::Callback<void(int)>& on_upload_complete) {
+ return scoped_ptr<::metrics::MetricsLogUploader>(
+ new metrics::NetMetricsLogUploader(
+ request_context_,
+ // TODO(paulmiller): Switch this to metrics::kDefaultMetricsServerUrl
+ // once we have a log source for WebView.
+ "http://localhost:10000/uma/v2", metrics::kDefaultMetricsMimeType,
+ on_upload_complete));
+}
+
+base::TimeDelta AwMetricsServiceClient::GetStandardUploadInterval() {
+ return base::TimeDelta::FromMinutes(kUploadIntervalMinutes);
+}
+
+AwMetricsServiceClient::AwMetricsServiceClient()
+ : is_initialized_(false),
+ is_enabled_(false),
+ pref_service_(nullptr),
+ request_context_(nullptr) {}
+
+AwMetricsServiceClient::~AwMetricsServiceClient() {}
+
+bool AwMetricsServiceClient::is_reporting_enabled() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ return is_enabled_;
+}
+
+} // namespace android_webview
diff --git a/android_webview/browser/aw_metrics_service_client.h b/android_webview/browser/aw_metrics_service_client.h
new file mode 100644
index 0000000..3b6f2e0
--- /dev/null
+++ b/android_webview/browser/aw_metrics_service_client.h
@@ -0,0 +1,84 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ANDROID_WEBVIEW_BROWSER_AW_METRICS_SERVICE_CLIENT_IMPL_H_
+#define ANDROID_WEBVIEW_BROWSER_AW_METRICS_SERVICE_CLIENT_IMPL_H_
+
+#include "android_webview/browser/aw_metrics_service_client.h"
+
+#include <string>
+
+#include "base/lazy_instance.h"
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "components/metrics/metrics_service_client.h"
+
+class PrefService;
+
+namespace metrics {
+struct ClientInfo;
+class MetricsStateManager;
+}
+
+namespace net {
+class URLRequestContextGetter;
+}
+
+namespace android_webview {
+
+// This singleton manages metrics for an app using any number of WebViews.
+// Metrics is turned on and off by the homonymous Java class. It should only be
+// used on the main thread. In particular, Initialize, Finalize, and
+// SetMetricsEnabled must be called from the same thread, in order to prevent
+// enable/disable race conditions, and because MetricsService is
+// single-threaded.
+class AwMetricsServiceClient : public metrics::MetricsServiceClient {
+ friend struct base::DefaultLazyInstanceTraits<AwMetricsServiceClient>;
+
+ public:
+ static AwMetricsServiceClient* GetInstance();
+
+ void Initialize(PrefService* pref_service,
+ net::URLRequestContextGetter* request_context);
+ void Finalize();
+ void SetMetricsEnabled(bool enabled);
+
+ // metrics::MetricsServiceClient implementation
+ metrics::MetricsService* GetMetricsService() override;
+ void SetMetricsClientId(const std::string& client_id) override;
+ void OnRecordingDisabled() override;
+ bool IsOffTheRecordSessionActive() override;
+ int32_t GetProduct() override;
+ std::string GetApplicationLocale() override;
+ bool GetBrand(std::string* brand_code) override;
+ metrics::SystemProfileProto::Channel GetChannel() override;
+ std::string GetVersionString() override;
+ void OnLogUploadComplete() override;
+ void InitializeSystemProfileMetrics(
+ const base::Closure& done_callback) override;
+ void CollectFinalMetricsForLog(const base::Closure& done_callback) override;
+ scoped_ptr<metrics::MetricsLogUploader> CreateUploader(
+ const base::Callback<void(int)>& on_upload_complete) override;
+ base::TimeDelta GetStandardUploadInterval() override;
+
+ private:
+ AwMetricsServiceClient();
+ ~AwMetricsServiceClient() override;
+
+ // Callback for metrics::MetricsStateManager::Create
+ bool is_reporting_enabled();
+
+ bool is_initialized_;
+ bool is_enabled_;
+ PrefService* pref_service_;
+ net::URLRequestContextGetter* request_context_;
+ scoped_ptr<metrics::MetricsStateManager> metrics_state_manager_;
+ scoped_ptr<metrics::MetricsService> metrics_service_;
+
+ DISALLOW_COPY_AND_ASSIGN(AwMetricsServiceClient);
+};
+
+} // namespace android_webview
+
+#endif // ANDROID_WEBVIEW_BROWSER_AW_METRICS_SERVICE_CLIENT_IMPL_H_
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
index ea5a637..3d62926 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
@@ -26,9 +26,11 @@ public class AwBrowserContext {
private AwFormDatabase mFormDatabase;
private HttpAuthDatabase mHttpAuthDatabase;
private AwMessagePortService mMessagePortService;
+ private AwMetricsServiceClient mMetricsServiceClient;
public AwBrowserContext(SharedPreferences sharedPreferences, Context applicationContext) {
mSharedPreferences = sharedPreferences;
+ mMetricsServiceClient = new AwMetricsServiceClient(applicationContext);
}
public AwGeolocationPermissions getGeolocationPermissions() {
@@ -59,6 +61,10 @@ public class AwBrowserContext {
return mMessagePortService;
}
+ public AwMetricsServiceClient getMetricsServiceClient() {
+ return mMetricsServiceClient;
+ }
+
/**
* @see android.webkit.WebView#pauseTimers()
*/
diff --git a/android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java b/android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java
new file mode 100644
index 0000000..7775fb2
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java
@@ -0,0 +1,29 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview;
+
+import android.content.Context;
+import android.webkit.ValueCallback;
+
+import org.chromium.base.annotations.JNINamespace;
+
+/**
+ * Java twin of the homonymous C++ class. The Java side is only responsible for
+ * switching metrics on and off. Since the setting is a platform feature, it
+ * must be obtained through PlatformServiceBridge.
+ */
+@JNINamespace("android_webview")
+public class AwMetricsServiceClient {
+ public AwMetricsServiceClient(Context applicationContext) {
+ PlatformServiceBridge.getInstance(applicationContext)
+ .setMetricsSettingListener(new ValueCallback<Boolean>() {
+ public void onReceiveValue(Boolean enabled) {
+ nativeSetMetricsEnabled(enabled);
+ }
+ });
+ }
+
+ public static native void nativeSetMetricsEnabled(boolean enabled);
+}
diff --git a/android_webview/java/src/org/chromium/android_webview/PlatformServiceBridge.java b/android_webview/java/src/org/chromium/android_webview/PlatformServiceBridge.java
new file mode 100644
index 0000000..4051c23
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/PlatformServiceBridge.java
@@ -0,0 +1,53 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview;
+
+import android.content.Context;
+import android.webkit.ValueCallback;
+
+import org.chromium.base.Log;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * This class manages platform-specific services. (i.e. Google Services) The platform
+ * should extend this class and use this base class to fetch their specialized version.
+ */
+public class PlatformServiceBridge {
+ private static final String TAG = "PlatformServiceBrid-";
+ private static final String PLATFORM_SERVICE_BRIDGE =
+ "com.android.webview.chromium.PlatformServiceBridgeGoogle";
+
+ private static PlatformServiceBridge sInstance;
+
+ protected PlatformServiceBridge() {}
+
+ public static PlatformServiceBridge getInstance(Context applicationContext) {
+ if (sInstance != null) {
+ return sInstance;
+ }
+
+ // Try to get a specialized service bridge.
+ try {
+ Class<?> cls = Class.forName(PLATFORM_SERVICE_BRIDGE);
+ sInstance = (PlatformServiceBridge) cls.getDeclaredConstructor(Context.class)
+ .newInstance(applicationContext);
+ return sInstance;
+ } catch (ClassNotFoundException e) {
+ // This is not an error; it just means this device doesn't have specialized services.
+ } catch (IllegalAccessException | IllegalArgumentException | InstantiationException
+ | NoSuchMethodException e) {
+ Log.e(TAG, "Failed to get " + PLATFORM_SERVICE_BRIDGE + ": " + e);
+ } catch (InvocationTargetException e) {
+ Log.e(TAG, "Failed invocation to get " + PLATFORM_SERVICE_BRIDGE + ":", e.getCause());
+ }
+
+ // Otherwise, get the generic service bridge.
+ sInstance = new PlatformServiceBridge();
+ return sInstance;
+ }
+
+ public void setMetricsSettingListener(ValueCallback<Boolean> callback) {}
+}
diff --git a/android_webview/native/BUILD.gn b/android_webview/native/BUILD.gn
index cec2c0e..c4dbb20 100644
--- a/android_webview/native/BUILD.gn
+++ b/android_webview/native/BUILD.gn
@@ -28,7 +28,10 @@ source_set("native") {
"//ui/gfx/geometry:geometry",
]
- include_dirs = [ "//skia/config" ]
+ include_dirs = [
+ "//skia/config",
+ "//third_party/protobuf",
+ ]
sources = [
"android_protocol_handler.cc",
@@ -65,6 +68,8 @@ source_set("native") {
"aw_media_url_interceptor.h",
"aw_message_port_service_impl.cc",
"aw_message_port_service_impl.h",
+ "aw_metrics_switch.cc",
+ "aw_metrics_switch.h",
"aw_pdf_exporter.cc",
"aw_pdf_exporter.h",
"aw_picture.cc",
@@ -128,6 +133,7 @@ generate_jni("native_jni") {
"../java/src/org/chromium/android_webview/AwFormDatabase.java",
"../java/src/org/chromium/android_webview/AwHttpAuthHandler.java",
"../java/src/org/chromium/android_webview/AwMessagePortService.java",
+ "../java/src/org/chromium/android_webview/AwMetricsServiceClient.java",
"../java/src/org/chromium/android_webview/AwPdfExporter.java",
"../java/src/org/chromium/android_webview/AwPicture.java",
"../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java",
diff --git a/android_webview/native/android_webview_jni_registrar.cc b/android_webview/native/android_webview_jni_registrar.cc
index a585d7e..cd353ec 100644
--- a/android_webview/native/android_webview_jni_registrar.cc
+++ b/android_webview/native/android_webview_jni_registrar.cc
@@ -17,6 +17,7 @@
#include "android_webview/native/aw_form_database.h"
#include "android_webview/native/aw_http_auth_handler.h"
#include "android_webview/native/aw_message_port_service_impl.h"
+#include "android_webview/native/aw_metrics_switch.h"
#include "android_webview/native/aw_pdf_exporter.h"
#include "android_webview/native/aw_picture.h"
#include "android_webview/native/aw_quota_manager_bridge_impl.h"
@@ -50,6 +51,7 @@ static base::android::RegistrationMethod kWebViewRegisteredMethods[] = {
{ "AwPicture", RegisterAwPicture },
{ "AwSettings", RegisterAwSettings },
{ "AwHttpAuthHandler", RegisterAwHttpAuthHandler },
+ { "AwMetricsServiceClient", RegisterAwMetricsServiceClient },
{ "AwPdfExporter", RegisterAwPdfExporter },
{ "AwPermissionRequest", RegisterAwPermissionRequest },
{ "AwQuotaManagerBridge", RegisterAwQuotaManagerBridge },
diff --git a/android_webview/native/aw_metrics_switch.cc b/android_webview/native/aw_metrics_switch.cc
new file mode 100644
index 0000000..44ab70a
--- /dev/null
+++ b/android_webview/native/aw_metrics_switch.cc
@@ -0,0 +1,23 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "android_webview/native/aw_metrics_switch.h"
+
+#include "android_webview/browser/aw_metrics_service_client.h"
+#include "android_webview/jni/AwMetricsServiceClient_jni.h"
+
+namespace android_webview {
+
+static void SetMetricsEnabled(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jclass>& jcaller,
+ jboolean enabled) {
+ AwMetricsServiceClient::GetInstance()->SetMetricsEnabled(enabled);
+}
+
+bool RegisterAwMetricsServiceClient(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+} // namespace android_webview
diff --git a/android_webview/native/aw_metrics_switch.h b/android_webview/native/aw_metrics_switch.h
new file mode 100644
index 0000000..3f07a60
--- /dev/null
+++ b/android_webview/native/aw_metrics_switch.h
@@ -0,0 +1,16 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ANDROID_WEBVIEW_NATIVE_AW_METRICS_SWITCH_
+#define ANDROID_WEBVIEW_NATIVE_AW_METRICS_SWITCH_
+
+#include <jni.h>
+
+namespace android_webview {
+
+bool RegisterAwMetricsServiceClient(JNIEnv* env);
+
+} // namespace android_webview
+
+#endif // ANDROID_WEBVIEW_NATIVE_AW_METRICS_SWITCH_
diff --git a/android_webview/native/webview_native.gyp b/android_webview/native/webview_native.gyp
index 97d941e..1a89e19 100644
--- a/android_webview/native/webview_native.gyp
+++ b/android_webview/native/webview_native.gyp
@@ -4,6 +4,7 @@
{
'variables': {
'chromium_code': 1,
+ 'protoc_out_dir': '<(SHARED_INTERMEDIATE_DIR)/protoc_out',
},
'targets': [
{
@@ -32,6 +33,8 @@
'include_dirs': [
'../..',
'../../skia/config',
+ '../../third_party/protobuf/src',
+ '<(protoc_out_dir)',
],
'sources': [
'android_protocol_handler.cc',
@@ -67,7 +70,9 @@
'aw_media_url_interceptor.cc',
'aw_media_url_interceptor.h',
'aw_message_port_service_impl.cc',
- 'aw_messagE_port_service_impl.h',
+ 'aw_message_port_service_impl.h',
+ 'aw_metrics_switch.cc',
+ 'aw_metrics_switch.h',
'aw_pdf_exporter.cc',
'aw_pdf_exporter.h',
'aw_picture.cc',
@@ -145,6 +150,7 @@
'../java/src/org/chromium/android_webview/AwFormDatabase.java',
'../java/src/org/chromium/android_webview/AwHttpAuthHandler.java',
'../java/src/org/chromium/android_webview/AwMessagePortService.java',
+ '../java/src/org/chromium/android_webview/AwMetricsServiceClient.java',
'../java/src/org/chromium/android_webview/AwPdfExporter.java',
'../java/src/org/chromium/android_webview/AwPicture.java',
'../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java',