Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49b58654 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

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

parents 3e29fb09 8eeac7d3
Loading
Loading
Loading
Loading
+19 −50
Original line number Diff line number Diff line
@@ -64,7 +64,6 @@ import android.telephony.SignalStrength;
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 @@ public class BatteryStatsImpl extends BatteryStats {
    // 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 class BatteryStatsImpl extends BatteryStats {
        }
        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))) {
           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 class BatteryStatsImpl extends BatteryStats {
        }
        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 @@ public class BatteryStatsImpl extends BatteryStats {
                    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;