14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)package org.chromium.chrome.browser.net.spdyproxy; 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.base.CalledByNative; 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.base.ThreadUtils; 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import java.text.NumberFormat; 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import java.util.Locale; 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/** 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Entry point to manage all data reduction proxy configuration details. 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) */ 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)public class DataReductionProxySettings { 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) /** 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Data structure to hold the original content length before data reduction and the received 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * content length after data reduction. 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) */ 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public static class ContentLengths { 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private final long mOriginal; 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private final long mReceived; 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @CalledByNative("ContentLengths") 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public static ContentLengths create(long original, long received) { 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return new ContentLengths(original, received); 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private ContentLengths(long original, long received) { 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mOriginal = original; 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mReceived = received; 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public long getOriginal() { 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return mOriginal; 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public long getReceived() { 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return mReceived; 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private static DataReductionProxySettings sSettings; 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) /** 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Returns a singleton instance of the settings object. 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) */ 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public static DataReductionProxySettings getInstance() { 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ThreadUtils.assertOnUiThread(); 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (sSettings == null) { 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sSettings = new DataReductionProxySettings(); 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return sSettings; 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private final long mNativeDataReductionProxySettings; 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private DataReductionProxySettings() { 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Note that this technically leaks the native object, however, 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // DataReductionProxySettings is a singleton that lives forever and there's no clean 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // shutdown of Chrome on Android 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mNativeDataReductionProxySettings = nativeInit(); 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** Returns true if the SPDY proxy is allowed to be used. */ 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public boolean isDataReductionProxyAllowed() { 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeIsDataReductionProxyAllowed(mNativeDataReductionProxySettings); 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** Returns true if the SPDY proxy promo is allowed to be shown. */ 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public boolean isDataReductionProxyPromoAllowed() { 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeIsDataReductionProxyPromoAllowed(mNativeDataReductionProxySettings); 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /** Returns true if proxy alternative field trial is running. */ 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public boolean isIncludedInAltFieldTrial() { 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return nativeIsIncludedInAltFieldTrial(mNativeDataReductionProxySettings); 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Returns the current data reduction proxy origin. 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public String getDataReductionProxyOrigin() { 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeGetDataReductionProxyOrigin(mNativeDataReductionProxySettings); 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Sets the preference on whether to enable/disable the SPDY proxy. This will zero out the 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * data reduction statistics if this is the first time the SPDY proxy has been enabled. 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void setDataReductionProxyEnabled(boolean enabled) { 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) nativeSetDataReductionProxyEnabled(mNativeDataReductionProxySettings, enabled); 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** Returns true if the SPDY proxy is enabled. */ 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public boolean isDataReductionProxyEnabled() { 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeIsDataReductionProxyEnabled(mNativeDataReductionProxySettings); 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** Returns true if the SPDY proxy is managed by an administrator's policy. */ 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public boolean isDataReductionProxyManaged() { 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeIsDataReductionProxyManaged(mNativeDataReductionProxySettings); 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Returns the time that the data reduction statistics were last updated. 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return The last update time in milliseconds since the epoch. 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public long getDataReductionLastUpdateTime() { 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeGetDataReductionLastUpdateTime(mNativeDataReductionProxySettings); 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Returns aggregate original and received content lengths. 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return The content lengths. 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public ContentLengths getContentLengths() { 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeGetContentLengths(mNativeDataReductionProxySettings); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Retrieves the history of daily totals of bytes that would have been 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * received if no data reducing mechanism had been applied. 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return The history of daily totals 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public long[] getOriginalNetworkStatsHistory() { 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeGetDailyOriginalContentLengths(mNativeDataReductionProxySettings); 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Retrieves the history of daily totals of bytes that were received after 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * applying a data reducing mechanism. 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return The history of daily totals 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public long[] getReceivedNetworkStatsHistory() { 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeGetDailyReceivedContentLengths(mNativeDataReductionProxySettings); 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * Determines if the data reduction proxy is currently unreachable. 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * @return true if the data reduction proxy is unreachable. 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public boolean isDataReductionProxyUnreachable() { 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return nativeIsDataReductionProxyUnreachable(mNativeDataReductionProxySettings); 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /** 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return The data reduction settings as a string percentage. 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public String getContentLengthPercentSavings() { 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContentLengths length = getContentLengths(); 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) double savings = 0; 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (length.getOriginal() > 0L && length.getOriginal() > length.getReceived()) { 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) savings = (length.getOriginal() - length.getReceived()) / (double) length.getOriginal(); 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NumberFormat percentageFormatter = NumberFormat.getPercentInstance(Locale.getDefault()); 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return percentageFormatter.format(savings); 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native long nativeInit(); 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native boolean nativeIsDataReductionProxyAllowed( 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native boolean nativeIsDataReductionProxyPromoAllowed( 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private native boolean nativeIsIncludedInAltFieldTrial( 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native String nativeGetDataReductionProxyOrigin( 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native boolean nativeIsDataReductionProxyEnabled( 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native boolean nativeIsDataReductionProxyManaged( 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native void nativeSetDataReductionProxyEnabled( 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid, boolean enabled); 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native long nativeGetDataReductionLastUpdateTime( 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native ContentLengths nativeGetContentLengths( 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native long[] nativeGetDailyOriginalContentLengths( 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private native long[] nativeGetDailyReceivedContentLengths( 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeDataReductionProxySettingsAndroid); 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private native boolean nativeIsDataReductionProxyUnreachable( 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch long nativeDataReductionProxySettingsAndroid); 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 189