summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Greenwalt <robdroid@android.com>2010-04-15 08:27:14 -0700
committerRobert Greenwalt <robdroid@android.com>2010-04-15 17:23:59 -0700
commite6e98823412275d869ec15d71fd11bba98417c45 (patch)
tree1ff7789c04abc74bf7fd4c41feb9de484bb6e259
parentfa22de7993f94d338330a888bdc2aeaaf857c719 (diff)
downloadframeworks_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.java71
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() {