Revert "Use ArraySet for the list of observer WeakReference."

This reverts commit 3488f1afcbc1f640ffcbce6cb8ef0232df54f9c7.

Reason for revert: The change to ArraySet increase system_server startup time by 20ms as reported in b/111658334. It is because add() operation into ArraySet takes much longer than ArrayList. 

Change-Id: I1523332a8c9fc74cfef29b119a3c4c54d55596ec
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index e12b913..6c8be14 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -64,7 +64,6 @@
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.ArrayMap;
-import android.util.ArraySet;
 import android.util.IntArray;
 import android.util.KeyValueListParser;
 import android.util.Log;
@@ -1063,34 +1062,7 @@
 
     // methods are protected not private to be VisibleForTesting
     public static class TimeBase {
-        private static class ObsWeakReference extends WeakReference<TimeBaseObs> {
-            public ObsWeakReference(TimeBaseObs referent) {
-                super(referent);
-            }
-
-            @Override
-            public boolean equals(Object obj) {
-                if (this == obj) {
-                    return true;
-                }
-                if (!(obj instanceof ObsWeakReference)) {
-                    return false;
-                }
-                return this.get() == ((ObsWeakReference)obj).get();
-            }
-
-            @Override
-            public int hashCode() {
-                TimeBaseObs obs = get();
-                if (obs != null) {
-                    return obs.hashCode();
-                } else {
-                    return 0;
-                }
-            }
-        }
-
-        protected final ArraySet<ObsWeakReference> mObservers = new ArraySet<>();
+        protected final ArrayList<WeakReference<TimeBaseObs>> mObservers = new ArrayList<>();
 
         protected long mUptime;
         protected long mRealtime;
@@ -1134,17 +1106,24 @@
         }
 
         public void add(TimeBaseObs observer) {
-            mObservers.add(new ObsWeakReference(observer));
+            mObservers.add(new WeakReference<TimeBaseObs>(observer));
         }
 
         public void remove(TimeBaseObs observer) {
-            if (!mObservers.remove(new ObsWeakReference(observer))) {
-                Slog.wtf(TAG, "Removed unknown observer: " + observer);
-            }
+           if (!mObservers.removeIf(ref -> ref.get() == observer)) {
+             Slog.wtf(TAG, "Removed unknown observer: " + observer);
+           }
         }
 
         public boolean hasObserver(TimeBaseObs observer) {
-            return mObservers.contains(new ObsWeakReference(observer));
+            Iterator<WeakReference<TimeBaseObs>> i = mObservers.iterator();
+            while (i.hasNext()) {
+                TimeBaseObs obs = i.next().get();
+                if (obs == observer) {
+                    return true;
+                }
+            }
+            return false;
         }
 
         public void init(long uptime, long realtime) {
@@ -1226,8 +1205,6 @@
         }
 
         public boolean setRunning(boolean running, long uptime, long realtime) {
-            int total = mObservers.size();
-            int removed = 0;
             if (mRunning != running) {
                 mRunning = running;
                 if (running) {
@@ -1235,34 +1212,26 @@
                     mRealtimeStart = realtime;
                     long batteryUptime = mUnpluggedUptime = getUptime(uptime);
                     long batteryRealtime = mUnpluggedRealtime = getRealtime(realtime);
-                    for(int i = mObservers.size() - 1; i >= 0; i--) {
-                        final TimeBaseObs obs = mObservers.valueAt(i).get();
+                    for (WeakReference<TimeBaseObs> ref : mObservers) {
+                        TimeBaseObs obs = ref.get();
                         if (obs != null) {
                             obs.onTimeStarted(realtime, batteryUptime, batteryRealtime);
-                        } else {
-                            mObservers.removeAt(i);
-                            removed++;
                         }
                     }
                 } else {
                     mPastUptime += uptime - mUptimeStart;
                     mPastRealtime += realtime - mRealtimeStart;
+
                     long batteryUptime = getUptime(uptime);
                     long batteryRealtime = getRealtime(realtime);
-                    for(int i = mObservers.size() - 1; i >= 0; i--) {
-                        final TimeBaseObs obs = mObservers.valueAt(i).get();
+                    for (WeakReference<TimeBaseObs> ref : mObservers) {
+                        TimeBaseObs obs = ref.get();
                         if (obs != null) {
                             obs.onTimeStopped(realtime, batteryUptime, batteryRealtime);
-                        } else {
-                            mObservers.removeAt(i);
-                            removed++;
                         }
                     }
                 }
-                if (DEBUG && removed != 0) {
-                    Slog.d(TAG,
-                            "TimeBase observer removed:" + removed + " from total:" + total);
-                }
+                mObservers.removeIf(ref -> ref.get() == null);
                 return true;
             }
             return false;