diff options
author | Robert Greenwalt <robdroid@android.com> | 2010-04-15 08:27:14 -0700 |
---|---|---|
committer | Robert Greenwalt <robdroid@android.com> | 2010-04-15 17:23:59 -0700 |
commit | e6e98823412275d869ec15d71fd11bba98417c45 (patch) | |
tree | 1ff7789c04abc74bf7fd4c41feb9de484bb6e259 | |
parent | fa22de7993f94d338330a888bdc2aeaaf857c719 (diff) | |
download | frameworks_base-e6e98823412275d869ec15d71fd11bba98417c45.zip frameworks_base-e6e98823412275d869ec15d71fd11bba98417c45.tar.gz frameworks_base-e6e98823412275d869ec15d71fd11bba98417c45.tar.bz2 |
Add multi-sim support to ThrottleService.
Uses the last used data until the SIM is available (if ever). Supports data from
several SIMs for all the world travelers out there.
bug: 2576057
Change-Id: I70e34a51f1c2ccda41a480652b0233b68ff3f538
-rw-r--r-- | services/java/com/android/server/ThrottleService.java | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/services/java/com/android/server/ThrottleService.java b/services/java/com/android/server/ThrottleService.java index 6ba96ae..dcc053d 100644 --- a/services/java/com/android/server/ThrottleService.java +++ b/services/java/com/android/server/ThrottleService.java @@ -44,6 +44,7 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; import android.provider.Settings; +import android.telephony.TelephonyManager; import android.util.Slog; import com.android.internal.telephony.TelephonyProperties; @@ -607,11 +608,17 @@ public class ThrottleService extends IThrottleManager.Stub { ThrottleService mParent; Context mContext; + String mImsi = null; + + TelephonyManager mTelephonyManager; DataRecorder(Context context, ThrottleService parent) { mContext = context; mParent = parent; + mTelephonyManager = (TelephonyManager)mContext.getSystemService( + Context.TELEPHONY_SERVICE); + synchronized (mParent) { mPeriodCount = 6; mPeriodRxData = new long[mPeriodCount]; @@ -626,6 +633,8 @@ public class ThrottleService extends IThrottleManager.Stub { } void setNextPeriod(Calendar start, Calendar end) { + // TODO - how would we deal with a dual-IMSI device? + checkForSubscriberId(); if (DBG) { Slog.d(TAG, "setting next period to " + start.getTimeInMillis() + " --until-- " + end.getTimeInMillis()); @@ -703,6 +712,7 @@ public class ThrottleService extends IThrottleManager.Stub { // if time moves backward accumulate all read/write that's lost into the now // otherwise time moved forward. void addData(long bytesRead, long bytesWritten) { + checkForSubscriberId(); synchronized (mParent) { mPeriodRxData[mCurrentPeriod] += bytesRead; mPeriodTxData[mCurrentPeriod] += bytesWritten; @@ -714,10 +724,69 @@ public class ThrottleService extends IThrottleManager.Stub { File dataDir = Environment.getDataDirectory(); File throttleDir = new File(dataDir, "system/throttle"); throttleDir.mkdirs(); - File dataFile = new File(throttleDir, "data"); + String mImsi = mTelephonyManager.getSubscriberId(); + File dataFile; + if (mImsi == null) { + dataFile = useMRUFile(throttleDir); + Slog.d(TAG, "imsi not available yet, using " + dataFile); + } else { + String imsiHash = Integer.toString(mImsi.hashCode()); + dataFile = new File(throttleDir, imsiHash); + } + // touch the file so it's not LRU + dataFile.setLastModified(System.currentTimeMillis()); + checkAndDeleteLRUDataFile(throttleDir); return dataFile; } + // TODO - get broadcast (TelephonyIntents.ACTION_SIM_STATE_CHANGED) instead of polling + private void checkForSubscriberId() { + if (mImsi != null) return; + + mImsi = mTelephonyManager.getSubscriberId(); + if (mImsi == null) return; + + Slog.d(TAG, "finally have imsi - retreiving data"); + retrieve(); + } + + private final static int MAX_SIMS_SUPPORTED = 3; + + private void checkAndDeleteLRUDataFile(File dir) { + File[] files = dir.listFiles(); + + if (files.length <= MAX_SIMS_SUPPORTED) return; + Slog.d(TAG, "Too many data files"); + do { + File oldest = null; + for (File f : files) { + if ((oldest == null) || (oldest.lastModified() > f.lastModified())) { + oldest = f; + } + } + if (oldest == null) return; + Slog.d(TAG, " deleting " + oldest); + oldest.delete(); + files = dir.listFiles(); + } while (files.length > MAX_SIMS_SUPPORTED); + } + + private File useMRUFile(File dir) { + File newest = null; + File[] files = dir.listFiles(); + + for (File f : files) { + if ((newest == null) || (newest.lastModified() < f.lastModified())) { + newest = f; + } + } + if (newest == null) { + newest = new File(dir, "temp"); + } + return newest; + } + + private static final int DATA_FILE_VERSION = 1; private void record() { |