summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormegjablon <megjablon@chromium.org>2015-11-06 16:43:03 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-07 00:43:51 +0000
commit3baafe787886e82e9f6484d14080ec8b28b8a925 (patch)
treea6ea43da3d55e0337bbfbf19053c7087d54294f8
parent8a03787d221768165603d4145ba9887ef408fbc5 (diff)
downloadchromium_src-3baafe787886e82e9f6484d14080ec8b28b8a925.zip
chromium_src-3baafe787886e82e9f6484d14080ec8b28b8a925.tar.gz
chromium_src-3baafe787886e82e9f6484d14080ec8b28b8a925.tar.bz2
Create snackbars for Data Use accounting
Write a DataUseTabUIManager in Java that has JNI bindings to a DataUseTabUIManagerAndroid in C++ with static functions to see if a data use session is starting or finishing. Create snackbars to be shown when a data use session is starting or finishing. Modify ChromeActivity to ask DataUseTabUIManager if it should show a snackbar. BUG=550657 Review URL: https://codereview.chromium.org/1414513006 Cr-Commit-Position: refs/heads/master@{#358470}
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java17
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java40
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java68
-rw-r--r--chrome/android/java/strings/android_chrome_strings.grd11
-rw-r--r--chrome/browser/android/chrome_jni_registrar.cc2
-rw-r--r--chrome/browser/android/data_usage/data_use_tab_ui_manager_android.cc35
-rw-r--r--chrome/browser/android/data_usage/data_use_tab_ui_manager_android.h13
-rw-r--r--chrome/chrome_browser.gypi5
8 files changed, 190 insertions, 1 deletions
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index e71c16e..db8abd8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -70,6 +70,7 @@ import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchFieldTrial;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager.ContextualSearchTabPromotionDelegate;
+import org.chromium.chrome.browser.datausage.DataUseTabUIManager;
import org.chromium.chrome.browser.device.DeviceClassManager;
import org.chromium.chrome.browser.dom_distiller.DistilledPagePrefsView;
import org.chromium.chrome.browser.dom_distiller.ReaderModeActivityDelegate;
@@ -96,6 +97,7 @@ import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.preferences.PreferencesLauncher;
import org.chromium.chrome.browser.printing.TabPrinter;
import org.chromium.chrome.browser.share.ShareHelper;
+import org.chromium.chrome.browser.snackbar.DataUseSnackbarController;
import org.chromium.chrome.browser.snackbar.LoFiBarPopupController;
import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
@@ -204,6 +206,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
private ReaderModeActivityDelegate mReaderModeActivityDelegate;
private SnackbarManager mSnackbarManager;
private LoFiBarPopupController mLoFiBarPopupController;
+ private DataUseSnackbarController mDataUseSnackbarController;
private ChromeAppMenuPropertiesDelegate mAppMenuPropertiesDelegate;
private AppMenuHandler mAppMenuHandler;
private ToolbarManager mToolbarManager;
@@ -253,6 +256,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
mWindowAndroid.restoreInstanceState(getSavedInstanceState());
mSnackbarManager = new SnackbarManager(getWindow());
mLoFiBarPopupController = new LoFiBarPopupController(this, getSnackbarManager());
+ mDataUseSnackbarController = new DataUseSnackbarController(this, getSnackbarManager());
mAssistStatusHandler = createAssistStatusHandler();
if (mAssistStatusHandler != null) {
@@ -454,6 +458,17 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
if (mTabModelSelectorTabObserver != null) mTabModelSelectorTabObserver.destroy();
mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(tabModelSelector) {
@Override
+ public void onPageLoadStarted(Tab tab, String url) {
+ if (DataUseTabUIManager.hasDataUseTrackingStarted(tab)) {
+ mDataUseSnackbarController.showDataUseTrackingStartedBar();
+ }
+
+ if (DataUseTabUIManager.hasDataUseTrackingEnded(tab)) {
+ mDataUseSnackbarController.showDataUseTrackingEndedBar();
+ }
+ }
+
+ @Override
public void didFirstVisuallyNonEmptyPaint(Tab tab) {
if (!tab.isNativePage() && !tab.isIncognito()
&& DataReductionProxySettings.getInstance().wasLoFiModeActiveOnMainFrame()
@@ -482,11 +497,13 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
@Override
public void onHidden(Tab tab) {
mLoFiBarPopupController.dismissLoFiBar();
+ mDataUseSnackbarController.dismissDataUseBar();
}
@Override
public void onDestroyed(Tab tab) {
mLoFiBarPopupController.dismissLoFiBar();
+ mDataUseSnackbarController.dismissDataUseBar();
}
@Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java b/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
new file mode 100644
index 0000000..a19d99f
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
@@ -0,0 +1,40 @@
+// 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.chrome.browser.datausage;
+
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.sessions.SessionTabHelper;
+import org.chromium.chrome.browser.tab.Tab;
+
+/**
+ * Entry point to manage all UI details for measuring data use within a Tab.
+ */
+public class DataUseTabUIManager {
+
+ /**
+ * Returns true if data use tracking has started within a Tab.
+ *
+ * @param tab The tab to see if tracking has started in.
+ * @return If data use tracking has started.
+ */
+ public static boolean hasDataUseTrackingStarted(Tab tab) {
+ return nativeHasDataUseTrackingStarted(
+ SessionTabHelper.sessionIdForTab(tab.getWebContents()), tab.getProfile());
+ }
+
+ /**
+ * Returns true if data use tracking has ended within a Tab.
+ *
+ * @param tab The tab to see if tracking has ended in.
+ * @return If data use tracking has ended.
+ */
+ public static boolean hasDataUseTrackingEnded(Tab tab) {
+ return nativeHasDataUseTrackingEnded(
+ SessionTabHelper.sessionIdForTab(tab.getWebContents()), tab.getProfile());
+ }
+
+ private static native boolean nativeHasDataUseTrackingStarted(int tabId, Profile profile);
+ private static native boolean nativeHasDataUseTrackingEnded(int tabId, Profile profile);
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java
new file mode 100644
index 0000000..944ef2b
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java
@@ -0,0 +1,68 @@
+// 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.chrome.browser.snackbar;
+
+import android.content.Context;
+
+import org.chromium.chrome.R;
+
+/**
+ * The controller for the data use snackbars. This handles two snackbars:
+ *
+ * 1. When Chrome starts tracking data use in a Tab, it shows a snackbar informing the user that
+ * data use tracking has started.
+ *
+ * 2. When Chrome stops tracking data use in a Tab, it shows a snackbar informing the user that
+ * data use tracking has ended.
+ */
+public class DataUseSnackbarController implements SnackbarManager.SnackbarController {
+ private final SnackbarManager mSnackbarManager;
+ private final Context mContext;
+
+ /**
+ * Creates an instance of a {@link DataUseBarPopupController}.
+ * @param context The {@link Context} in which snackbar is shown.
+ * @param snackbarManager The manager that helps to show up snackbar.
+ */
+ public DataUseSnackbarController(Context context, SnackbarManager snackbarManager) {
+ mSnackbarManager = snackbarManager;
+ mContext = context;
+ }
+
+ public void showDataUseTrackingStartedBar() {
+ mSnackbarManager.showSnackbar(Snackbar.make(
+ mContext.getString(R.string.data_use_tracking_started_snackbar_message), this)
+ .setAction(mContext.getString(R.string.data_use_tracking_started_snackbar_action),
+ null));
+ // TODO(megjablon): Add metrics.
+ }
+
+ public void showDataUseTrackingEndedBar() {
+ mSnackbarManager.showSnackbar(Snackbar.make(
+ mContext.getString(R.string.data_use_tracking_ended_title), this));
+ // TODO(megjablon): Add metrics.
+ }
+
+ /**
+ * Dismisses the snackbar.
+ */
+ public void dismissDataUseBar() {
+ if (mSnackbarManager.isShowing()) mSnackbarManager.dismissSnackbars(this);
+ }
+
+ /**
+ * Loads the "Learn more" page.
+ */
+ @Override
+ public void onAction(Object actionData) {
+ // TODO(megjablon): Load the more page and add metrics.
+ }
+
+ @Override
+ public void onDismissNoAction(Object actionData) {}
+
+ @Override
+ public void onDismissForEachType(boolean isTimeout) {}
+}
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 1be6195..658c77a 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -776,6 +776,17 @@ To obtain new licenses, connect to the internet and play your downloaded content
Data Saver is on. Manage it in Settings.
</message>
+ <!-- Data Use -->
+ <message name="IDS_DATA_USE_TRACKING_STARTED_SNACKBAR_MESSAGE" desc="Message shown when data use tracking begins.">
+ Your data use is being tracked
+ </message>
+ <message name="IDS_DATA_USE_TRACKING_STARTED_SNACKBAR_ACTION" desc="Button to learn more when data use tracking begins.">
+ More
+ </message>
+ <message name="IDS_DATA_USE_TRACKING_ENDED_TITLE" desc="Message shown when data use tracking has ended. Used by both the snackbar and dialog.">
+ Data use tracking has ended
+ </message>
+
<!-- About Chrome preferences -->
<message name="IDS_PREFS_ABOUT_CHROME" desc="Title for the About Chrome page. [CHAR-LIMIT=32]">
About Chrome
diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc
index 4620a16..41e6895 100644
--- a/chrome/browser/android/chrome_jni_registrar.cc
+++ b/chrome/browser/android/chrome_jni_registrar.cc
@@ -31,6 +31,7 @@
#include "chrome/browser/android/contextualsearch/contextual_search_manager.h"
#include "chrome/browser/android/contextualsearch/contextual_search_tab_helper.h"
#include "chrome/browser/android/cookies/cookies_fetcher.h"
+#include "chrome/browser/android/data_usage/data_use_tab_ui_manager_android.h"
#include "chrome/browser/android/data_usage/external_data_use_observer.h"
#include "chrome/browser/android/dev_tools_server.h"
#include "chrome/browser/android/document/document_web_contents_delegate.h"
@@ -238,6 +239,7 @@ static base::android::RegistrationMethod kChromeRegisteredMethods[] = {
{"CreditCardScanner", autofill::CreditCardScannerViewAndroid::Register},
{"DataReductionProxyInfoBarDelegate", DataReductionProxyInfoBar::Register},
{"DataReductionProxySettings", DataReductionProxySettingsAndroid::Register},
+ {"DataUseTabUIManager", RegisterDataUseTabUIManager},
{"DevToolsServer", RegisterDevToolsServer},
{"DocumentWebContentsDelegate", DocumentWebContentsDelegate::Register},
{"DomDistillerServiceFactory",
diff --git a/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.cc b/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.cc
new file mode 100644
index 0000000..0f14228
--- /dev/null
+++ b/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.cc
@@ -0,0 +1,35 @@
+// 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 "chrome/browser/android/data_usage/data_use_tab_ui_manager_android.h"
+
+#include "base/android/jni_android.h"
+#include "chrome/browser/profiles/profile_android.h"
+#include "jni/DataUseTabUIManager_jni.h"
+
+// static
+jboolean HasDataUseTrackingStarted(JNIEnv* env,
+ const JavaParamRef<jclass>& clazz,
+ jint tab_id,
+ const JavaParamRef<jobject>& jprofile) {
+ // TODO(megjablon): Get the DataUseTabUIManager which is a keyed service and
+ // ask it if data use tracking has started.
+ // Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
+ return false;
+}
+
+// static
+jboolean HasDataUseTrackingEnded(JNIEnv* env,
+ const JavaParamRef<jclass>& clazz,
+ jint tab_id,
+ const JavaParamRef<jobject>& jprofile) {
+ // TODO(megjablon): Get the DataUseTabUIManager which is a keyed service and
+ // ask it if data use tracking has ended.
+ // Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
+ return false;
+}
+
+bool RegisterDataUseTabUIManager(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
diff --git a/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.h b/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.h
new file mode 100644
index 0000000..b2444c3
--- /dev/null
+++ b/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.h
@@ -0,0 +1,13 @@
+// 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 CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_TAB_UI_MANAGER_ANDROID_H_
+#define CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_TAB_UI_MANAGER_ANDROID_H_
+
+#include <jni.h>
+
+// Registers the RegisterDataUseTabUIManager's native methods through JNI.
+bool RegisterDataUseTabUIManager(JNIEnv* env);
+
+#endif // CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_TAB_UI_MANAGER_ANDROID_H_
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 9d11560..3855ee3 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -870,6 +870,8 @@
'chrome_browser_android_sources': [
'browser/android/background_sync_launcher_android.cc',
'browser/android/background_sync_launcher_android.h',
+ 'browser/android/data_usage/data_use_tab_ui_manager_android.cc',
+ 'browser/android/data_usage/data_use_tab_ui_manager_android.h',
'browser/download/download_request_infobar_delegate_android.cc',
'browser/download/download_request_infobar_delegate_android.h',
'browser/geolocation/geolocation_infobar_delegate_android.cc',
@@ -1781,9 +1783,10 @@
'android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java',
'android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java',
'android/java/src/org/chromium/chrome/browser/cookies/CookiesFetcher.java',
- 'android/java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java',
'android/java/src/org/chromium/chrome/browser/DevToolsServer.java',
'android/java/src/org/chromium/chrome/browser/database/SQLiteCursor.java',
+ 'android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java',
+ 'android/java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java',
'android/java/src/org/chromium/chrome/browser/document/DocumentWebContentsDelegate.java',
'android/java/src/org/chromium/chrome/browser/dom_distiller/DomDistillerServiceFactory.java',
'android/java/src/org/chromium/chrome/browser/dom_distiller/DomDistillerTabUtils.java',