Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05d0673b authored by Robert Greenwalt's avatar Robert Greenwalt
Browse files

Misc fixes for throttling.

Cleanup of duplicate code
Caching Ntp data so we don't hit the network as often
Clearing out of MRU data when we switch to a new sim
Sending notification after we reset byte counts

bug:2605277
bug:2605272
bug:2597530
bug:2576057
Change-Id: I3df526bae6374f6ae56fed67b0defad2b4fabefd
parent 7171ea81
Loading
Loading
Loading
Loading
+47 −40
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -79,8 +78,6 @@ public class ThrottleService extends IThrottleManager.Stub {
    private static final int TESTING_RESET_PERIOD_SEC = 60 * 10;
    private static final long TESTING_THRESHOLD = 1 * 1024 * 1024;

    private static final int PERIOD_COUNT = 6;

    private int mPolicyPollPeriodSec;
    private long mPolicyThreshold;
    private int mPolicyThrottleValue;
@@ -106,7 +103,6 @@ public class ThrottleService extends IThrottleManager.Stub {
    private String mIface;

    private static final int NOTIFICATION_WARNING   = 2;
    private static final int NOTIFICATION_ALL       = 0xFFFFFFFF;

    private Notification mThrottlingNotification;
    private boolean mWarningNotificationSent = false;
@@ -177,32 +173,31 @@ public class ThrottleService extends IThrottleManager.Stub {
                "ThrottleService");
    }

    private long ntpToWallTime(long ntpTime) {
        long bestNow = getBestTime();
        long localNow = System.currentTimeMillis();
        return localNow + (ntpTime - bestNow);
    }

    // TODO - fetch for the iface
    // return time in the local, system wall time, correcting for the use of ntp

    public synchronized long getResetTime(String iface) {
        enforceAccessPermission();
        long resetTime = 0;
        if (mRecorder != null) {
            long bestEnd = mRecorder.getPeriodEnd();
            long bestNow = getBestTime();
            long localNow = System.currentTimeMillis();

            resetTime = localNow + (bestEnd - bestNow);
            resetTime = ntpToWallTime(mRecorder.getPeriodEnd());
        }
        return resetTime;
    }

    // TODO - fetch for the iface
    // return time in the loca, system wall tiem, correcting for the use of ntp
    // return time in the local, system wall time, correcting for the use of ntp
    public synchronized long getPeriodStartTime(String iface) {
        enforceAccessPermission();
        long startTime = 0;
        if (mRecorder != null) {
            long bestStart = mRecorder.getPeriodStart();
            long bestNow = getBestTime();
            long localNow = System.currentTimeMillis();

            startTime = localNow + (bestStart - bestNow);
            startTime = ntpToWallTime(mRecorder.getPeriodStart());
        }
        return startTime;
    }
@@ -440,8 +435,8 @@ public class ThrottleService extends IThrottleManager.Stub {
            Intent broadcast = new Intent(ThrottleManager.THROTTLE_POLL_ACTION);
            broadcast.putExtra(ThrottleManager.EXTRA_CYCLE_READ, periodRx);
            broadcast.putExtra(ThrottleManager.EXTRA_CYCLE_WRITE, periodTx);
            broadcast.putExtra(ThrottleManager.EXTRA_CYCLE_START, ThrottleService.this.getPeriodStartTime(mIface));
            broadcast.putExtra(ThrottleManager.EXTRA_CYCLE_END, ThrottleService.this.getResetTime(mIface));
            broadcast.putExtra(ThrottleManager.EXTRA_CYCLE_START, getPeriodStartTime(mIface));
            broadcast.putExtra(ThrottleManager.EXTRA_CYCLE_END, getResetTime(mIface));
            mContext.sendStickyBroadcast(broadcast);

            mAlarmManager.cancel(mPendingPollIntent);
@@ -625,6 +620,7 @@ public class ThrottleService extends IThrottleManager.Stub {

                if (mRecorder.setNextPeriod(start, end)) {
                    clearThrottleAndNotification();
                    onPollAlarm();
                }

                mAlarmManager.cancel(mPendingResetIntent);
@@ -642,31 +638,40 @@ public class ThrottleService extends IThrottleManager.Stub {
    private void checkForAuthoritativeTime() {
        if (mNtpActive || (mNtpServer == null)) return;

        SntpClient client = new SntpClient();
        if (client.requestTime(mNtpServer, 10000)) {
            mNtpActive = true;
            if (DBG) Slog.d(TAG, "found Authoritative time - reseting alarm");
            mHandler.obtainMessage(EVENT_RESET_ALARM).sendToTarget();
        }
        // will try to get the ntp time and switch to it if found.
        // will also cache the time so we don't fetch it repeatedly.
        getBestTime();
    }

    private static final int MAX_NTP_CACHE_AGE = 30 * 1000;
    private static final int MAX_NTP_FETCH_WAIT = 10 * 1000;
    private long cachedNtp;
    private long cachedNtpTimestamp;

    private long getBestTime() {
        if (mNtpServer != null) {
            if (mNtpActive) {
                long ntpAge = SystemClock.elapsedRealtime() - cachedNtpTimestamp;
                if (ntpAge < MAX_NTP_CACHE_AGE) {
                    return cachedNtp + ntpAge;
                }
            }
            SntpClient client = new SntpClient();

        long time;
        if ((mNtpServer != null) && client.requestTime(mNtpServer, 10000)) {
            time = client.getNtpTime() ;
            if (client.requestTime(mNtpServer, MAX_NTP_FETCH_WAIT)) {
                cachedNtp = client.getNtpTime();
                cachedNtpTimestamp = SystemClock.elapsedRealtime();
                if (!mNtpActive) {
                    mNtpActive = true;
                    if (DBG) Slog.d(TAG, "found Authoritative time - reseting alarm");
                    mHandler.obtainMessage(EVENT_RESET_ALARM).sendToTarget();
                }
            if (DBG) Slog.d(TAG, "using Authoritative time: " + time);
        } else {
            time = System.currentTimeMillis();
                if (DBG) Slog.d(TAG, "using Authoritative time: " + cachedNtp);
                return cachedNtp;
            }
        }
        long time = System.currentTimeMillis();
        if (DBG) Slog.d(TAG, "using User time: " + time);
        mNtpActive = false;
        }
        return time;
    }

@@ -705,7 +710,6 @@ public class ThrottleService extends IThrottleManager.Stub {
                mPeriodStart = Calendar.getInstance();
                mPeriodEnd = Calendar.getInstance();

                zeroData(0);
                retrieve();
            }
        }
@@ -915,6 +919,9 @@ public class ThrottleService extends IThrottleManager.Stub {
        }

        private void retrieve() {
            // clean out any old data first.  If we fail to read we don't want old stuff
            zeroData(0);

            File f = getDataFile();
            byte[] buffer;
            FileInputStream s = null;
@@ -952,7 +959,7 @@ public class ThrottleService extends IThrottleManager.Stub {

                mPeriodCount = Integer.parseInt(parsed[parsedUsed++]);
                if (parsed.length != 5 + (2 * mPeriodCount)) {
                    Slog.e(TAG, "reading data file with bad length ("+parsed.length+" != "+(4 + (2*mPeriodCount))+") - ignoring");
                    Slog.e(TAG, "reading data file with bad length ("+parsed.length+" != "+(5 + (2*mPeriodCount))+") - ignoring");
                    return;
                }