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.
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.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 @@
 
         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 @@
         }
 
         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 @@
         // 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 @@
             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() {