diff options
author | megjablon <megjablon@chromium.org> | 2015-11-06 16:43:03 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-07 00:43:51 +0000 |
commit | 3baafe787886e82e9f6484d14080ec8b28b8a925 (patch) | |
tree | a6ea43da3d55e0337bbfbf19053c7087d54294f8 | |
parent | 8a03787d221768165603d4145ba9887ef408fbc5 (diff) | |
download | chromium_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}
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', |