| // Copyright 2013 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.net.spdyproxy; |
| |
| import org.chromium.base.CalledByNative; |
| import org.chromium.base.ThreadUtils; |
| |
| public class DataReductionProxySettings { |
| |
| public static class ContentLengths { |
| private final long mOriginal; |
| private final long mReceived; |
| |
| @CalledByNative("ContentLengths") |
| public static ContentLengths create(long original, long received) { |
| return new ContentLengths(original, received); |
| } |
| |
| private ContentLengths(long original, long received) { |
| mOriginal = original; |
| mReceived = received; |
| } |
| |
| public long getOriginal() { |
| return mOriginal; |
| } |
| |
| public long getReceived() { |
| return mReceived; |
| } |
| } |
| |
| private static DataReductionProxySettings sSettings; |
| |
| public static DataReductionProxySettings getInstance() { |
| ThreadUtils.assertOnUiThread(); |
| if (sSettings == null) { |
| sSettings = new DataReductionProxySettings(); |
| } |
| return sSettings; |
| } |
| |
| private final int mNativeDataReductionProxySettings; |
| |
| private DataReductionProxySettings() { |
| // Note that this technically leaks the native object, however, |
| // DataReductionProxySettings is a singleton that lives forever and there's no clean |
| // shutdown of Chrome on Android |
| mNativeDataReductionProxySettings = nativeInit(); |
| initDataReductionProxySettings(); |
| } |
| |
| /** |
| * Initializes the data reduction proxy at Chrome startup. |
| */ |
| public void initDataReductionProxySettings() { |
| nativeInitDataReductionProxySettings(mNativeDataReductionProxySettings); |
| } |
| |
| /** |
| * Add a pattern for hosts to bypass. Wildcards should be compatible with the JavaScript |
| * function shExpMatch, which can be used in proxy PAC resolution. This should be called |
| * before the proxy is used. |
| * @param pattern A pattern to match. |
| */ |
| public void bypassHostPattern(String pattern) { |
| nativeBypassHostPattern(mNativeDataReductionProxySettings, pattern); |
| } |
| |
| /** |
| * Add a pattern for URLs to bypass. Wildcards should be compatible with the JavaScript |
| * function shExpMatch, which can be used in proxy PAC resolution. This should be called |
| * before the proxy is used. |
| * @param pattern A pattern to match. |
| */ |
| public void bypassURLPattern(String pattern) { |
| nativeBypassURLPattern(mNativeDataReductionProxySettings, pattern); |
| } |
| |
| |
| /** Returns true if the SPDY proxy is allowed to be used. */ |
| public boolean isDataReductionProxyAllowed() { |
| return nativeIsDataReductionProxyAllowed(mNativeDataReductionProxySettings); |
| } |
| |
| /** Returns true if the SPDY proxy promo is allowed to be shown. */ |
| public boolean isDataReductionProxyPromoAllowed() { |
| return nativeIsDataReductionProxyPromoAllowed(mNativeDataReductionProxySettings); |
| } |
| |
| /** |
| * Returns the current data reduction proxy origin. |
| */ |
| public String getDataReductionProxyOrigin() { |
| return nativeGetDataReductionProxyOrigin(mNativeDataReductionProxySettings); |
| } |
| |
| /** |
| * Sets the preference on whether to enable/disable the SPDY proxy. This will zero out the |
| * data reduction statistics if this is the first time the SPDY proxy has been enabled. |
| */ |
| public void setDataReductionProxyEnabled(boolean enabled) { |
| nativeSetDataReductionProxyEnabled(mNativeDataReductionProxySettings, enabled); |
| } |
| |
| /** Returns true if the SPDY proxy is enabled. */ |
| public boolean isDataReductionProxyEnabled() { |
| return nativeIsDataReductionProxyEnabled(mNativeDataReductionProxySettings); |
| } |
| |
| /** Returns true if the SPDY proxy is managed by an administrator's policy. */ |
| public boolean isDataReductionProxyManaged() { |
| return nativeIsDataReductionProxyManaged(mNativeDataReductionProxySettings); |
| } |
| |
| /** |
| * Returns the time that the data reduction statistics were last updated. |
| * @return The last update time in milliseconds since the epoch. |
| */ |
| public long getDataReductionLastUpdateTime() { |
| return nativeGetDataReductionLastUpdateTime(mNativeDataReductionProxySettings); |
| } |
| |
| /** |
| * Returns aggregate original and received content lengths. |
| * @return The content lengths. |
| */ |
| public ContentLengths getContentLengths() { |
| return nativeGetContentLengths(mNativeDataReductionProxySettings); |
| } |
| |
| /** |
| * Returns true if the host and realm (as passed in to Tab.onReceivedHttpAuthRequest()) are such |
| * that a authentication token can be generated. The host must match one of the configured proxy |
| * hosts, and the realm must be prefixed with the authentication realm string used by the data |
| * reduction proxies. |
| * @param host The host requesting authentication. |
| * @param realm The authentication realm. |
| * @return True if host and realm can be authenticated. |
| */ |
| public boolean isAcceptableAuthChallenge(String host, String realm) { |
| return nativeIsAcceptableAuthChallenge(mNativeDataReductionProxySettings, host, realm); |
| } |
| |
| /** |
| * Returns an authentication token for the data reduction proxy. If the token cannot be |
| * generated, an empty string is returned. |
| * @param host The host requesting authentication. |
| * @param realm The authentication realm. |
| * @return The generated token. |
| */ |
| public String getTokenForAuthChallenge(String host, String realm) { |
| return nativeGetTokenForAuthChallenge(mNativeDataReductionProxySettings, host, realm); |
| } |
| |
| /** |
| * Retrieves the history of daily totals of bytes that would have been |
| * received if no data reducing mechanism had been applied. |
| * @return The history of daily totals |
| */ |
| public long[] getOriginalNetworkStatsHistory() { |
| return nativeGetDailyOriginalContentLengths(mNativeDataReductionProxySettings); |
| } |
| |
| /** |
| * Retrieves the history of daily totals of bytes that were received after |
| * applying a data reducing mechanism. |
| * @return The history of daily totals |
| */ |
| public long[] getReceivedNetworkStatsHistory() { |
| return nativeGetDailyReceivedContentLengths(mNativeDataReductionProxySettings); |
| } |
| |
| /** |
| * @return The data reduction settings as a string percentage. |
| */ |
| public String getContentLengthPercentSavings() { |
| ContentLengths length = getContentLengths(); |
| String percent = "0%"; |
| if (length.getOriginal() > 0L && length.getOriginal() > length.getReceived()) { |
| percent = String.format( |
| "%.0f%%", 100.0 * |
| (length.getOriginal() - length.getReceived()) / length.getOriginal()); |
| } |
| return percent; |
| } |
| |
| private native int nativeInit(); |
| private native void nativeInitDataReductionProxySettings( |
| int nativeDataReductionProxySettingsAndroid); |
| private native void nativeBypassHostPattern( |
| int nativeDataReductionProxySettingsAndroid, String pattern); |
| private native void nativeBypassURLPattern( |
| int nativeDataReductionProxySettingsAndroid, String pattern); |
| private native boolean nativeIsDataReductionProxyAllowed( |
| int nativeDataReductionProxySettingsAndroid); |
| private native boolean nativeIsDataReductionProxyPromoAllowed( |
| int nativeDataReductionProxySettingsAndroid); |
| private native String nativeGetDataReductionProxyOrigin( |
| int nativeDataReductionProxySettingsAndroid); |
| private native boolean nativeIsDataReductionProxyEnabled( |
| int nativeDataReductionProxySettingsAndroid); |
| private native boolean nativeIsDataReductionProxyManaged( |
| int nativeDataReductionProxySettingsAndroid); |
| private native void nativeSetDataReductionProxyEnabled( |
| int nativeDataReductionProxySettingsAndroid, boolean enabled); |
| private native long nativeGetDataReductionLastUpdateTime( |
| int nativeDataReductionProxySettingsAndroid); |
| private native ContentLengths nativeGetContentLengths( |
| int nativeDataReductionProxySettingsAndroid); |
| private native boolean nativeIsAcceptableAuthChallenge( |
| int nativeDataReductionProxySettingsAndroid, String host, String realm); |
| private native String nativeGetTokenForAuthChallenge( |
| int nativeDataReductionProxySettingsAndroid, String host, String realm); |
| private native long[] nativeGetDailyOriginalContentLengths( |
| int nativeDataReductionProxySettingsAndroid); |
| private native long[] nativeGetDailyReceivedContentLengths( |
| int nativeDataReductionProxySettingsAndroid); |
| } |