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