diff options
author | Robert Greenwalt <robdroid@android.com> | 2010-04-15 17:45:26 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-04-15 17:45:26 -0700 |
commit | 9e17d7408b48a2f658387a1354756b5c2ed815dd (patch) | |
tree | a8eb7981dfadac7f310d4ab15b3b9b839a5d789c /services | |
parent | 699399775f609c02cd4f29b33b6fde451959fa65 (diff) | |
parent | 32ebaf57d8646542b80e848441830a5ef834aed3 (diff) | |
download | frameworks_base-9e17d7408b48a2f658387a1354756b5c2ed815dd.zip frameworks_base-9e17d7408b48a2f658387a1354756b5c2ed815dd.tar.gz frameworks_base-9e17d7408b48a2f658387a1354756b5c2ed815dd.tar.bz2 |
am 32ebaf57: am e80c6f49: Merge "Add multi-sim support to ThrottleService." into froyo
Merge commit '32ebaf57d8646542b80e848441830a5ef834aed3' into kraken
* commit '32ebaf57d8646542b80e848441830a5ef834aed3':
Add multi-sim support to ThrottleService.
Diffstat (limited to 'services')
-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() { |