| Index: chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
|
| 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
|
| index a19d99f923cc48b05c0d84925e14b692b49a620d..be21e42ecdb815d5418855a1ff41dbe78537207a 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
|
| @@ -4,37 +4,143 @@
|
|
|
| package org.chromium.chrome.browser.datausage;
|
|
|
| +import android.app.Activity;
|
| +import android.content.Context;
|
| +import android.content.DialogInterface;
|
| +import android.content.DialogInterface.OnClickListener;
|
| +import android.preference.PreferenceManager;
|
| +import android.support.v7.app.AlertDialog;
|
| +import android.text.TextUtils;
|
| +import android.view.View;
|
| +import android.widget.CheckBox;
|
| +
|
| +import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.profiles.Profile;
|
| import org.chromium.chrome.browser.sessions.SessionTabHelper;
|
| import org.chromium.chrome.browser.tab.Tab;
|
| +import org.chromium.content_public.browser.LoadUrlParams;
|
| +import org.chromium.content_public.common.Referrer;
|
|
|
| /**
|
| * Entry point to manage all UI details for measuring data use within a Tab.
|
| */
|
| public class DataUseTabUIManager {
|
|
|
| + private static final String SHARED_PREF_DATA_USE_DIALOG_OPT_OUT = "data_use_dialog_opt_out";
|
| +
|
| /**
|
| - * Returns true if data use tracking has started within a Tab.
|
| + * Returns true if data use tracking has started within a Tab. When data use tracking has
|
| + * started, returns true only once to signify the started event.
|
| *
|
| - * @param tab The tab to see if tracking has started in.
|
| - * @return If data use tracking has started.
|
| + * @param tab The tab that may have started tracking data use.
|
| + * @return true If data use tracking has indeed started.
|
| */
|
| - public static boolean hasDataUseTrackingStarted(Tab tab) {
|
| - return nativeHasDataUseTrackingStarted(
|
| + public static boolean checkDataUseTrackingStarted(Tab tab) {
|
| + return nativeCheckDataUseTrackingStarted(
|
| SessionTabHelper.sessionIdForTab(tab.getWebContents()), tab.getProfile());
|
| }
|
|
|
| /**
|
| - * Returns true if data use tracking has ended within a Tab.
|
| + * Returns true if data use tracking has ended within a Tab. When data use tracking has
|
| + * ended, returns true only once to signify the ended event.
|
| *
|
| - * @param tab The tab to see if tracking has ended in.
|
| - * @return If data use tracking has ended.
|
| + * @param tab The tab that may have ended tracking data use.
|
| + * @return true If data use tracking has indeed ended.
|
| */
|
| - public static boolean hasDataUseTrackingEnded(Tab tab) {
|
| - return nativeHasDataUseTrackingEnded(
|
| + public static boolean checkDataUseTrackingEnded(Tab tab) {
|
| + return nativeCheckDataUseTrackingEnded(
|
| SessionTabHelper.sessionIdForTab(tab.getWebContents()), tab.getProfile());
|
| }
|
|
|
| - private static native boolean nativeHasDataUseTrackingStarted(int tabId, Profile profile);
|
| - private static native boolean nativeHasDataUseTrackingEnded(int tabId, Profile profile);
|
| + /**
|
| + * Returns whether a navigation should be paused to show a dialog telling the user that data use
|
| + * tracking has ended within a Tab. If the navigation should be paused, shows a dialog with the
|
| + * option to cancel the navigation or continue.
|
| + *
|
| + * @param activity Current activity.
|
| + * @param tab The tab to see if tracking has ended in.
|
| + * @param url URL that is pending.
|
| + * @param pageTransitionType The type of transition. see
|
| + * {@link org.chromium.content.browser.PageTransition} for valid values.
|
| + * @param referrerUrl URL for the referrer.
|
| + * @return true If the URL loading should be overriden.
|
| + */
|
| + public static boolean shouldOverrideUrlLoading(Activity activity,
|
| + final Tab tab, final String url, final int pageTransitionType,
|
| + final String referrerUrl) {
|
| + if (!getOptedOutOfDataUseDialog(activity) && checkDataUseTrackingEnded(tab)) {
|
| + startDataUseDialog(activity, tab, url, pageTransitionType, referrerUrl);
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * Shows a dialog with the option to cancel the navigation or continue. Also allows the user to
|
| + * opt out of seeing this dialog again.
|
| + *
|
| + * @param activity Current activity.
|
| + * @param tab The tab loading the url.
|
| + * @param url URL that is pending.
|
| + * @param pageTransitionType The type of transition. see
|
| + * {@link org.chromium.content.browser.PageTransition} for valid values.
|
| + * @param referrerUrl URL for the referrer.
|
| + */
|
| + private static void startDataUseDialog(final Activity activity, final Tab tab,
|
| + final String url, final int pageTransitionType, final String referrerUrl) {
|
| + View checkBoxView = View.inflate(activity, R.layout.data_use_dialog, null);
|
| + final CheckBox checkBox = (CheckBox) checkBoxView.findViewById(R.id.data_use_checkbox);
|
| + new AlertDialog.Builder(activity, R.style.AlertDialogTheme)
|
| + .setTitle(R.string.data_use_tracking_ended_title)
|
| + .setMessage(R.string.data_use_tracking_ended_message)
|
| + .setView(checkBoxView)
|
| + .setPositiveButton(R.string.data_use_tracking_ended_continue,
|
| + new OnClickListener() {
|
| + @Override
|
| + public void onClick(DialogInterface dialog, int which) {
|
| + setOptedOutOfDataUseDialog(activity, checkBox.isChecked());
|
| + LoadUrlParams loadUrlParams = new LoadUrlParams(url,
|
| + pageTransitionType);
|
| + if (!TextUtils.isEmpty(referrerUrl)) {
|
| + Referrer referrer = new Referrer(referrerUrl,
|
| + Referrer.REFERRER_POLICY_ALWAYS);
|
| + loadUrlParams.setReferrer(referrer);
|
| + }
|
| + tab.loadUrl(loadUrlParams);
|
| + }
|
| + })
|
| + .setNegativeButton(R.string.cancel, new OnClickListener() {
|
| + @Override
|
| + public void onClick(DialogInterface dialog, int which) {
|
| + setOptedOutOfDataUseDialog(activity, checkBox.isChecked());
|
| + }
|
| + })
|
| + .show();
|
| + }
|
| +
|
| + /**
|
| + * Returns true if the user has opted out of seeing the data use dialog.
|
| + *
|
| + * @param context An Android context.
|
| + * @return true If the user has opted out of seeing the data use dialog.
|
| + */
|
| + public static boolean getOptedOutOfDataUseDialog(Context context) {
|
| + return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
|
| + SHARED_PREF_DATA_USE_DIALOG_OPT_OUT, false);
|
| + }
|
| +
|
| + /**
|
| + * Sets whether the user has opted out of seeing the data use dialog.
|
| + *
|
| + * @param context An Android context.
|
| + * @param optedOut Whether the user has opted out of seeing the data use dialog.
|
| + */
|
| + private static void setOptedOutOfDataUseDialog(Context context, boolean optedOut) {
|
| + PreferenceManager.getDefaultSharedPreferences(context).edit()
|
| + .putBoolean(SHARED_PREF_DATA_USE_DIALOG_OPT_OUT, optedOut)
|
| + .apply();
|
| + }
|
| +
|
| + private static native boolean nativeCheckDataUseTrackingStarted(int tabId, Profile profile);
|
| + private static native boolean nativeCheckDataUseTrackingEnded(int tabId, Profile profile);
|
| }
|
|
|