19791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff/*
29791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * Copyright (C) 2010 The Android Open Source Project
39791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff *
49791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License");
59791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * you may not use this file except in compliance with the License.
69791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * You may obtain a copy of the License at
79791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff *
89791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff *      http://www.apache.org/licenses/LICENSE-2.0
99791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff *
109791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * Unless required by applicable law or agreed to in writing, software
119791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS,
129791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * See the License for the specific language governing permissions and
149791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * limitations under the License.
159791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff */
169791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
179791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffpackage com.android.phone;
189791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
199791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport com.android.phone.R;
209791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
219791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.content.BroadcastReceiver;
229791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.content.Context;
239791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.content.Intent;
249791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.content.IntentFilter;
259791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.os.Bundle;
269791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.preference.Preference;
279791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.preference.PreferenceActivity;
289791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.preference.PreferenceScreen;
299791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.net.Uri;
309791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.net.ThrottleManager;
319791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport android.util.Log;
329791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
339791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport java.util.Calendar;
349791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport java.util.GregorianCalendar;
359791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffimport java.text.DateFormat;
369791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
379791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff/**
389791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff * Listener for broadcasts from ThrottleManager
399791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff */
409791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriffpublic class DataUsageListener {
419791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
429791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private ThrottleManager mThrottleManager;
439791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private Preference mCurrentUsagePref = null;
449791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private Preference mTimeFramePref = null;
459791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private Preference mThrottleRatePref = null;
469791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private Preference mSummaryPref = null;
47658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    private PreferenceScreen mPrefScreen = null;
48658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    private boolean mSummaryPrefEnabled = false;
499791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
509791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private final Context mContext;
519791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private IntentFilter mFilter;
529791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private BroadcastReceiver mReceiver;
539791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
54658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    private int mPolicyThrottleValue;  //in kbps
55658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    private long mPolicyThreshold;
56658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    private int mCurrentThrottleRate;
579791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private long mDataUsed;
589791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private Calendar mStart;
599791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private Calendar mEnd;
609791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
61658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    public DataUsageListener(Context context, Preference summary, PreferenceScreen prefScreen) {
629791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mContext = context;
639791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mSummaryPref = summary;
64658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        mPrefScreen = prefScreen;
65658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        mSummaryPrefEnabled = true;
669791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        initialize();
679791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    }
689791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
699791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    public DataUsageListener(Context context, Preference currentUsage,
709791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            Preference timeFrame, Preference throttleRate) {
719791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mContext = context;
729791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mCurrentUsagePref = currentUsage;
739791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mTimeFramePref = timeFrame;
749791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mThrottleRatePref = throttleRate;
759791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        initialize();
769791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    }
779791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
789791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private void initialize() {
799791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
809791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mThrottleManager = (ThrottleManager) mContext.getSystemService(Context.THROTTLE_SERVICE);
819791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
829791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mStart = GregorianCalendar.getInstance();
839791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mEnd = GregorianCalendar.getInstance();
849791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
859791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mFilter = new IntentFilter();
869791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mFilter.addAction(ThrottleManager.THROTTLE_POLL_ACTION);
879791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mFilter.addAction(ThrottleManager.THROTTLE_ACTION);
88658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        mFilter.addAction(ThrottleManager.POLICY_CHANGED_ACTION);
899791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
909791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mReceiver = new BroadcastReceiver() {
919791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            @Override
929791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            public void onReceive(Context context, Intent intent) {
939791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                String action = intent.getAction();
949791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                if (ThrottleManager.THROTTLE_POLL_ACTION.equals(action)) {
959791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                    updateUsageStats(intent.getLongExtra(ThrottleManager.EXTRA_CYCLE_READ, 0),
969791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                        intent.getLongExtra(ThrottleManager.EXTRA_CYCLE_WRITE, 0),
979791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                        intent.getLongExtra(ThrottleManager.EXTRA_CYCLE_START, 0),
989791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                        intent.getLongExtra(ThrottleManager.EXTRA_CYCLE_END, 0));
99658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                } else if (ThrottleManager.POLICY_CHANGED_ACTION.equals(action)) {
100658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                    updatePolicy();
1019791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                } else if (ThrottleManager.THROTTLE_ACTION.equals(action)) {
1029791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                    updateThrottleRate(intent.getIntExtra(ThrottleManager.EXTRA_THROTTLE_LEVEL, -1));
1039791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                }
1049791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            }
1059791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        };
1069791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    }
1079791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
1089791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    void resume() {
1099791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mContext.registerReceiver(mReceiver, mFilter);
110658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        updatePolicy();
1119791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    }
1129791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
1139791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    void pause() {
1149791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mContext.unregisterReceiver(mReceiver);
1159791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    }
1169791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
117658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    private void updatePolicy() {
11854e69839e6e468238f849fa7d2d3d3ada9c6f7f2Irfan Sheriff        /* Fetch values for default interface */
11954e69839e6e468238f849fa7d2d3d3ada9c6f7f2Irfan Sheriff        mPolicyThrottleValue = mThrottleManager.getCliffLevel(null, 1);
12054e69839e6e468238f849fa7d2d3d3ada9c6f7f2Irfan Sheriff        mPolicyThreshold = mThrottleManager.getCliffThreshold(null, 1);
121658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff
122658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        if (mSummaryPref != null) { /* Settings preference */
123658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            /**
124658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff             * Remove data usage preference in settings
125658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff             * if policy change disables throttling
126658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff             */
127658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            if (mPolicyThreshold == 0) {
128658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                if (mSummaryPrefEnabled) {
129658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                    mPrefScreen.removePreference(mSummaryPref);
130658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                    mSummaryPrefEnabled = false;
131658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                }
132658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            } else {
133658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                if (!mSummaryPrefEnabled) {
134658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                    mSummaryPrefEnabled = true;
135658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                    mPrefScreen.addPreference(mSummaryPref);
136658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                }
137658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            }
138658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        }
139658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        updateUI();
140658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    }
141658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff
142658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    private void updateThrottleRate(int throttleRate) {
143658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        mCurrentThrottleRate = throttleRate;
144658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        updateUI();
145658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    }
146658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff
1479791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private void updateUsageStats(long readByteCount, long writeByteCount,
1489791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            long startTime, long endTime) {
1499791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mDataUsed = readByteCount + writeByteCount;
1509791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mStart.setTimeInMillis(startTime);
1519791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        mEnd.setTimeInMillis(endTime);
152658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        updateUI();
1539791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    }
1549791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
155658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff    private void updateUI() {
156658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        if (mPolicyThreshold == 0)
157658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            return;
158658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        int dataUsedPercent = (int) ((mDataUsed * 100) / mPolicyThreshold);
1599791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
1609791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        long cycleTime = mEnd.getTimeInMillis() - mStart.getTimeInMillis();
1619791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        long currentTime = GregorianCalendar.getInstance().getTimeInMillis()
1629791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                            - mStart.getTimeInMillis();
1639791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
1649791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        int cycleThroughPercent = (cycleTime == 0) ? 0 : (int) ((currentTime * 100) / cycleTime);
1659791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
1669791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        Calendar cal = Calendar.getInstance();
1679791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        cal.setTimeInMillis(cycleTime - currentTime);
1689791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        int daysLeft = cal.get(Calendar.DAY_OF_YEAR);
16924760921fea7605d8703aca9ce1d46b980a4bbf5Irfan Sheriff        //cal.get() returns 365 for less than a day
17024760921fea7605d8703aca9ce1d46b980a4bbf5Irfan Sheriff        if (daysLeft >= 365) daysLeft = 0;
1719791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
1729791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        if (mCurrentUsagePref != null) {
173658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            /* Update the UI based on whether we are in a throttled state */
174658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            if (mCurrentThrottleRate > 0) {
175658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                mCurrentUsagePref.setSummary(mContext.getString(
176658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                        R.string.throttle_data_rate_reduced_subtext,
177658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                        toReadable(mPolicyThreshold),
178658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                        mCurrentThrottleRate));
179658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            } else {
180658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                mCurrentUsagePref.setSummary(mContext.getString(
181658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                        R.string.throttle_data_usage_subtext,
182658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                        toReadable(mDataUsed), dataUsedPercent, toReadable(mPolicyThreshold)));
183658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            }
1849791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        }
1859791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        if (mTimeFramePref != null) {
1869791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            mTimeFramePref.setSummary(mContext.getString(R.string.throttle_time_frame_subtext,
1879791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                        cycleThroughPercent, daysLeft,
1889791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff                        DateFormat.getDateInstance(DateFormat.SHORT).format(mEnd.getTime())));
1899791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        }
1909791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        if (mThrottleRatePref != null) {
1919791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            mThrottleRatePref.setSummary(mContext.getString(R.string.throttle_rate_subtext,
192658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                    mPolicyThrottleValue));
1939791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        }
194658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff        if (mSummaryPref != null && mSummaryPrefEnabled) {
195658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff
196658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            /* Update the UI based on whether we are in a throttled state */
197658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            if (mCurrentThrottleRate > 0) {
198658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                mSummaryPref.setSummary(mContext.getString(
199658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                        R.string.throttle_data_rate_reduced_subtext,
200658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                        toReadable(mPolicyThreshold),
201658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                        mCurrentThrottleRate));
202658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            } else {
203658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                mSummaryPref.setSummary(mContext.getString(R.string.throttle_status_subtext,
204658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                            toReadable(mDataUsed),
205658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                            dataUsedPercent,
206658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                            toReadable(mPolicyThreshold),
207658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                            daysLeft,
208658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff                            DateFormat.getDateInstance(DateFormat.SHORT).format(mEnd.getTime())));
209658defd21ed7007bd1cd87b097fcd5106ebb10d2Irfan Sheriff            }
2109791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        }
2119791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    }
2129791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
2139791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    private String toReadable (long data) {
2149791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        long KB = 1024;
2159791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        long MB = 1024 * KB;
2169791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        long GB = 1024 * MB;
2179791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        long TB = 1024 * GB;
2189791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        String ret;
2199791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff
2209791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        if (data < KB) {
2219791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            ret = data + " bytes";
2229791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        } else if (data < MB) {
2239791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            ret = (data / KB) + " KB";
2249791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        } else if (data < GB) {
2259791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            ret = (data / MB) + " MB";
2269791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        } else if (data < TB) {
2279791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            ret = (data / GB) + " GB";
2289791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        } else {
2299791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff            ret = (data / TB) + " TB";
2309791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        }
2319791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff        return ret;
2329791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff    }
2339791da9bac09f6b79909a59e4a7bc5eeffca8a5aIrfan Sheriff}
234