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

Commit 10c45b69 authored by Nick Pelly's avatar Nick Pelly Committed by Android (Google) Code Review
Browse files

Merge "Include WIFI scan's in Battery Stats."

parents 2414c8b3 6ccaa540
Loading
Loading
Loading
Loading
+19 −19
Original line number Diff line number Diff line
@@ -71,9 +71,9 @@ public abstract class BatteryStats implements Parcelable {
    public static final int FULL_WIFI_LOCK = 5;
    
    /**
     * A constant indicating a scan wifi lock timer
     * A constant indicating a wifi scan
     */
    public static final int SCAN_WIFI_LOCK = 6;
    public static final int WIFI_SCAN = 6;

     /**
      * A constant indicating a wifi multicast timer
@@ -136,7 +136,7 @@ public abstract class BatteryStats implements Parcelable {
    private static final String BATTERY_DATA = "bt";
    private static final String BATTERY_DISCHARGE_DATA = "dc";
    private static final String BATTERY_LEVEL_DATA = "lv";
    private static final String WIFI_LOCK_DATA = "wfl";
    private static final String WIFI_DATA = "wfl";
    private static final String MISC_DATA = "m";
    private static final String SCREEN_BRIGHTNESS_DATA = "br";
    private static final String SIGNAL_STRENGTH_TIME_DATA = "sgt";
@@ -260,8 +260,8 @@ public abstract class BatteryStats implements Parcelable {
        public abstract void noteWifiStoppedLocked();
        public abstract void noteFullWifiLockAcquiredLocked();
        public abstract void noteFullWifiLockReleasedLocked();
        public abstract void noteScanWifiLockAcquiredLocked();
        public abstract void noteScanWifiLockReleasedLocked();
        public abstract void noteWifiScanStartedLocked();
        public abstract void noteWifiScanStoppedLocked();
        public abstract void noteWifiMulticastEnabledLocked();
        public abstract void noteWifiMulticastDisabledLocked();
        public abstract void noteAudioTurnedOnLocked();
@@ -270,7 +270,7 @@ public abstract class BatteryStats implements Parcelable {
        public abstract void noteVideoTurnedOffLocked();
        public abstract long getWifiRunningTime(long batteryRealtime, int which);
        public abstract long getFullWifiLockTime(long batteryRealtime, int which);
        public abstract long getScanWifiLockTime(long batteryRealtime, int which);
        public abstract long getWifiScanTime(long batteryRealtime, int which);
        public abstract long getWifiMulticastTime(long batteryRealtime,
                                                  int which);
        public abstract long getAudioTurnedOnTime(long batteryRealtime, int which);
@@ -453,7 +453,7 @@ public abstract class BatteryStats implements Parcelable {
        public static final int STATE_PHONE_SCANNING_FLAG = 1<<27;
        public static final int STATE_WIFI_RUNNING_FLAG = 1<<26;
        public static final int STATE_WIFI_FULL_LOCK_FLAG = 1<<25;
        public static final int STATE_WIFI_SCAN_LOCK_FLAG = 1<<24;
        public static final int STATE_WIFI_SCAN_FLAG = 1<<24;
        public static final int STATE_WIFI_MULTICAST_ON_FLAG = 1<<23;
        // These are on the lower bits used for the command; if they change
        // we need to write another int of data.
@@ -859,7 +859,7 @@ public abstract class BatteryStats implements Parcelable {
        new BitDescription(HistoryItem.STATE_WIFI_ON_FLAG, "wifi"),
        new BitDescription(HistoryItem.STATE_WIFI_RUNNING_FLAG, "wifi_running"),
        new BitDescription(HistoryItem.STATE_WIFI_FULL_LOCK_FLAG, "wifi_full_lock"),
        new BitDescription(HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG, "wifi_scan_lock"),
        new BitDescription(HistoryItem.STATE_WIFI_SCAN_FLAG, "wifi_scan"),
        new BitDescription(HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG, "wifi_multicast"),
        new BitDescription(HistoryItem.STATE_BLUETOOTH_ON_FLAG, "bluetooth"),
        new BitDescription(HistoryItem.STATE_AUDIO_ON_FLAG, "audio"),
@@ -1326,15 +1326,15 @@ public abstract class BatteryStats implements Parcelable {
            long rx = u.getTcpBytesReceived(which);
            long tx = u.getTcpBytesSent(which);
            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
            long wifiScanTime = u.getWifiScanTime(batteryRealtime, which);
            long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which);
            
            if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx);
            
            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
            if (fullWifiLockOnTime != 0 || wifiScanTime != 0
                    || uidWifiRunningTime != 0) {
                dumpLine(pw, uid, category, WIFI_LOCK_DATA, 
                        fullWifiLockOnTime, scanWifiLockOnTime, uidWifiRunningTime);
                dumpLine(pw, uid, category, WIFI_DATA,
                        fullWifiLockOnTime, wifiScanTime, uidWifiRunningTime);
            }

            if (u.hasUserActivity()) {
@@ -1692,7 +1692,7 @@ public abstract class BatteryStats implements Parcelable {
            long tcpReceived = u.getTcpBytesReceived(which);
            long tcpSent = u.getTcpBytesSent(which);
            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
            long wifiScanTime = u.getWifiScanTime(batteryRealtime, which);
            long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which);
            
            if (tcpReceived != 0 || tcpSent != 0) {
@@ -1723,7 +1723,7 @@ public abstract class BatteryStats implements Parcelable {
                }
            }
            
            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
            if (fullWifiLockOnTime != 0 || wifiScanTime != 0
                    || uidWifiRunningTime != 0) {
                sb.setLength(0);
                sb.append(prefix); sb.append("    Wifi Running: ");
@@ -1734,9 +1734,9 @@ public abstract class BatteryStats implements Parcelable {
                        formatTimeMs(sb, fullWifiLockOnTime / 1000);
                        sb.append("("); sb.append(formatRatioLocked(fullWifiLockOnTime,
                                whichBatteryRealtime)); sb.append(")\n");
                sb.append(prefix); sb.append("    Scan Wifi Lock: "); 
                        formatTimeMs(sb, scanWifiLockOnTime / 1000);
                        sb.append("("); sb.append(formatRatioLocked(scanWifiLockOnTime, 
                sb.append(prefix); sb.append("    Wifi Scan: ");
                        formatTimeMs(sb, wifiScanTime / 1000);
                        sb.append("("); sb.append(formatRatioLocked(wifiScanTime,
                                whichBatteryRealtime)); sb.append(")");
                pw.println(sb.toString());
            }
+4 −4
Original line number Diff line number Diff line
@@ -58,14 +58,14 @@ interface IBatteryStats {
    void noteBluetoothOff();
    void noteFullWifiLockAcquired(int uid);
    void noteFullWifiLockReleased(int uid);
    void noteScanWifiLockAcquired(int uid);
    void noteScanWifiLockReleased(int uid);
    void noteWifiScanStarted(int uid);
    void noteWifiScanStopped(int uid);
    void noteWifiMulticastEnabled(int uid);
    void noteWifiMulticastDisabled(int uid);
    void noteFullWifiLockAcquiredFromSource(in WorkSource ws);
    void noteFullWifiLockReleasedFromSource(in WorkSource ws);
    void noteScanWifiLockAcquiredFromSource(in WorkSource ws);
    void noteScanWifiLockReleasedFromSource(in WorkSource ws);
    void noteWifiScanStartedFromSource(in WorkSource ws);
    void noteWifiScanStoppedFromSource(in WorkSource ws);
    void noteWifiMulticastEnabledFromSource(in WorkSource ws);
    void noteWifiMulticastDisabledFromSource(in WorkSource ws);
    void noteNetworkInterfaceType(String iface, int type);
+52 −52
Original line number Diff line number Diff line
@@ -159,8 +159,8 @@ public final class BatteryStatsImpl extends BatteryStats {
            = new SparseArray<ArrayList<StopwatchTimer>>();
    final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>();
    final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>();
    final ArrayList<StopwatchTimer> mScanWifiLockTimers = new ArrayList<StopwatchTimer>();
    final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>();
    final ArrayList<StopwatchTimer> mWifiScanTimers = new ArrayList<StopwatchTimer>();

    // Last partial timers we use for distributing CPU usage.
    final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>();
@@ -2174,28 +2174,28 @@ public final class BatteryStatsImpl extends BatteryStats {
        getUidStatsLocked(uid).noteFullWifiLockReleasedLocked();
    }

    int mWifiScanLockNesting = 0;
    int mWifiScanNesting = 0;

    public void noteScanWifiLockAcquiredLocked(int uid) {
        if (mWifiScanLockNesting == 0) {
            mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: "
    public void noteWifiScanStartedLocked(int uid) {
        if (mWifiScanNesting == 0) {
            mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_FLAG;
            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan started for: "
                    + Integer.toHexString(mHistoryCur.states));
            addHistoryRecordLocked(SystemClock.elapsedRealtime());
        }
        mWifiScanLockNesting++;
        getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked();
        mWifiScanNesting++;
        getUidStatsLocked(uid).noteWifiScanStartedLocked();
    }

    public void noteScanWifiLockReleasedLocked(int uid) {
        mWifiScanLockNesting--;
        if (mWifiScanLockNesting == 0) {
            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: "
    public void noteWifiScanStoppedLocked(int uid) {
        mWifiScanNesting--;
        if (mWifiScanNesting == 0) {
            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_FLAG;
            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan stopped for: "
                    + Integer.toHexString(mHistoryCur.states));
            addHistoryRecordLocked(SystemClock.elapsedRealtime());
        }
        getUidStatsLocked(uid).noteScanWifiLockReleasedLocked();
        getUidStatsLocked(uid).noteWifiScanStoppedLocked();
    }

    int mWifiMulticastNesting = 0;
@@ -2236,17 +2236,17 @@ public final class BatteryStatsImpl extends BatteryStats {
        }
    }

    public void noteScanWifiLockAcquiredFromSourceLocked(WorkSource ws) {
    public void noteWifiScanStartedFromSourceLocked(WorkSource ws) {
        int N = ws.size();
        for (int i=0; i<N; i++) {
            noteScanWifiLockAcquiredLocked(ws.get(i));
            noteWifiScanStartedLocked(ws.get(i));
        }
    }

    public void noteScanWifiLockReleasedFromSourceLocked(WorkSource ws) {
    public void noteWifiScanStoppedFromSourceLocked(WorkSource ws) {
        int N = ws.size();
        for (int i=0; i<N; i++) {
            noteScanWifiLockReleasedLocked(ws.get(i));
            noteWifiScanStoppedLocked(ws.get(i));
        }
    }

@@ -2360,8 +2360,8 @@ public final class BatteryStatsImpl extends BatteryStats {
        boolean mFullWifiLockOut;
        StopwatchTimer mFullWifiLockTimer;

        boolean mScanWifiLockOut;
        StopwatchTimer mScanWifiLockTimer;
        boolean mWifiScanStarted;
        StopwatchTimer mWifiScanTimer;

        boolean mWifiMulticastEnabled;
        StopwatchTimer mWifiMulticastTimer;
@@ -2405,8 +2405,8 @@ public final class BatteryStatsImpl extends BatteryStats {
                    mWifiRunningTimers, mUnpluggables);
            mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
                    mFullWifiLockTimers, mUnpluggables);
            mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
                    mScanWifiLockTimers, mUnpluggables);
            mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
                    mWifiScanTimers, mUnpluggables);
            mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
                    mWifiMulticastTimers, mUnpluggables);
            mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
@@ -2518,22 +2518,22 @@ public final class BatteryStatsImpl extends BatteryStats {
        }

        @Override
        public void noteScanWifiLockAcquiredLocked() {
            if (!mScanWifiLockOut) {
                mScanWifiLockOut = true;
                if (mScanWifiLockTimer == null) {
                    mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
                            mScanWifiLockTimers, mUnpluggables);
        public void noteWifiScanStartedLocked() {
            if (!mWifiScanStarted) {
                mWifiScanStarted = true;
                if (mWifiScanTimer == null) {
                    mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
                            mWifiScanTimers, mUnpluggables);
                }
                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
                mWifiScanTimer.startRunningLocked(BatteryStatsImpl.this);
            }
        }

        @Override
        public void noteScanWifiLockReleasedLocked() {
            if (mScanWifiLockOut) {
                mScanWifiLockOut = false;
                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
        public void noteWifiScanStoppedLocked() {
            if (mWifiScanStarted) {
                mWifiScanStarted = false;
                mWifiScanTimer.stopRunningLocked(BatteryStatsImpl.this);
            }
        }

@@ -2614,11 +2614,11 @@ public final class BatteryStatsImpl extends BatteryStats {
        }

        @Override
        public long getScanWifiLockTime(long batteryRealtime, int which) {
            if (mScanWifiLockTimer == null) {
        public long getWifiScanTime(long batteryRealtime, int which) {
            if (mWifiScanTimer == null) {
                return 0;
            }
            return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
            return mWifiScanTimer.getTotalTimeLocked(batteryRealtime, which);
        }

        @Override
@@ -2698,9 +2698,9 @@ public final class BatteryStatsImpl extends BatteryStats {
                active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false);
                active |= mFullWifiLockOut;
            }
            if (mScanWifiLockTimer != null) {
                active |= !mScanWifiLockTimer.reset(BatteryStatsImpl.this, false);
                active |= mScanWifiLockOut;
            if (mWifiScanTimer != null) {
                active |= !mWifiScanTimer.reset(BatteryStatsImpl.this, false);
                active |= mWifiScanStarted;
            }
            if (mWifiMulticastTimer != null) {
                active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false);
@@ -2791,8 +2791,8 @@ public final class BatteryStatsImpl extends BatteryStats {
                if (mFullWifiLockTimer != null) {
                    mFullWifiLockTimer.detach();
                }
                if (mScanWifiLockTimer != null) {
                    mScanWifiLockTimer.detach();
                if (mWifiScanTimer != null) {
                    mWifiScanTimer.detach();
                }
                if (mWifiMulticastTimer != null) {
                    mWifiMulticastTimer.detach();
@@ -2860,9 +2860,9 @@ public final class BatteryStatsImpl extends BatteryStats {
            } else {
                out.writeInt(0);
            }
            if (mScanWifiLockTimer != null) {
            if (mWifiScanTimer != null) {
                out.writeInt(1);
                mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
                mWifiScanTimer.writeToParcel(out, batteryRealtime);
            } else {
                out.writeInt(0);
            }
@@ -2954,12 +2954,12 @@ public final class BatteryStatsImpl extends BatteryStats {
            } else {
                mFullWifiLockTimer = null;
            }
            mScanWifiLockOut = false;
            mWifiScanStarted = false;
            if (in.readInt() != 0) {
                mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
                        mScanWifiLockTimers, mUnpluggables, in);
                mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
                        mWifiScanTimers, mUnpluggables, in);
            } else {
                mScanWifiLockTimer = null;
                mWifiScanTimer = null;
            }
            mWifiMulticastEnabled = false;
            if (in.readInt() != 0) {
@@ -5118,9 +5118,9 @@ public final class BatteryStatsImpl extends BatteryStats {
            if (in.readInt() != 0) {
                u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
            }
            u.mScanWifiLockOut = false;
            u.mWifiScanStarted = false;
            if (in.readInt() != 0) {
                u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
                u.mWifiScanTimer.readSummaryFromParcelLocked(in);
            }
            u.mWifiMulticastEnabled = false;
            if (in.readInt() != 0) {
@@ -5310,9 +5310,9 @@ public final class BatteryStatsImpl extends BatteryStats {
            } else {
                out.writeInt(0);
            }
            if (u.mScanWifiLockTimer != null) {
            if (u.mWifiScanTimer != null) {
                out.writeInt(1);
                u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
                u.mWifiScanTimer.writeSummaryFromParcelLocked(out, NOWREAL);
            } else {
                out.writeInt(0);
            }
@@ -5537,7 +5537,7 @@ public final class BatteryStatsImpl extends BatteryStats {
        mWindowTimers.clear();
        mWifiRunningTimers.clear();
        mFullWifiLockTimers.clear();
        mScanWifiLockTimers.clear();
        mWifiScanTimers.clear();
        mWifiMulticastTimers.clear();

        sNumSpeedSteps = in.readInt();
+47 −6
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ import android.os.SystemProperties;
import android.os.WorkSource;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;

import java.util.ArrayList;
@@ -161,6 +162,10 @@ public class WifiService extends IWifiManager.Stub {
    /* Tracks whether wifi is enabled from WifiStateMachine's perspective */
    private boolean mWifiEnabled;

    /* The work source (UID) that triggered the current WIFI scan, synchronized
     * on this */
    private WorkSource mScanWorkSource;

    private boolean mIsReceiverRegistered = false;


@@ -413,6 +418,7 @@ public class WifiService extends IWifiManager.Stub {
                            }
                        } else if (intent.getAction().equals(
                                WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
                            noteScanEnd();
                            checkAndSetNotification();
                        }
                    }
@@ -430,6 +436,44 @@ public class WifiService extends IWifiManager.Stub {
        mNotificationEnabledSettingObserver.register();
    }

    /** Tell battery stats about a new WIFI scan */
    private void noteScanStart() {
        WorkSource scanWorkSource = null;
        synchronized (WifiService.this) {
            if (mScanWorkSource != null) {
                // Scan already in progress, don't add this one to battery stats
                return;
            }
            scanWorkSource = new WorkSource(Binder.getCallingUid());
            mScanWorkSource = scanWorkSource;
        }

        long id = Binder.clearCallingIdentity();
        try {
            mBatteryStats.noteWifiScanStartedFromSource(scanWorkSource);
        } catch (RemoteException e) {
            Log.w(TAG, e);
        } finally {
            Binder.restoreCallingIdentity(id);
        }
    }

    /** Tell battery stats that the current WIFI scan has completed */
    private void noteScanEnd() {
        WorkSource scanWorkSource = null;
        synchronized (WifiService.this) {
            scanWorkSource = mScanWorkSource;
            mScanWorkSource = null;
        }
        if (scanWorkSource != null) {
            try {
                mBatteryStats.noteWifiScanStoppedFromSource(scanWorkSource);
            } catch (RemoteException e) {
                Log.w(TAG, e);
            }
        }
    }

    /**
     * Check if Wi-Fi needs to be enabled and start
     * if needed
@@ -551,6 +595,7 @@ public class WifiService extends IWifiManager.Stub {
            mScanCount.put(uid, ++count);
        }
        mWifiStateMachine.startScan(forceActive);
        noteScanStart();
    }

    private void enforceAccessPermission() {
@@ -1333,10 +1378,8 @@ public class WifiService extends IWifiManager.Stub {
        switch(wifiLock.mMode) {
            case WifiManager.WIFI_MODE_FULL:
            case WifiManager.WIFI_MODE_FULL_HIGH_PERF:
                mBatteryStats.noteFullWifiLockAcquiredFromSource(wifiLock.mWorkSource);
                break;
            case WifiManager.WIFI_MODE_SCAN_ONLY:
                mBatteryStats.noteScanWifiLockAcquiredFromSource(wifiLock.mWorkSource);
                mBatteryStats.noteFullWifiLockAcquiredFromSource(wifiLock.mWorkSource);
                break;
        }
    }
@@ -1345,10 +1388,8 @@ public class WifiService extends IWifiManager.Stub {
        switch(wifiLock.mMode) {
            case WifiManager.WIFI_MODE_FULL:
            case WifiManager.WIFI_MODE_FULL_HIGH_PERF:
                mBatteryStats.noteFullWifiLockReleasedFromSource(wifiLock.mWorkSource);
                break;
            case WifiManager.WIFI_MODE_SCAN_ONLY:
                mBatteryStats.noteScanWifiLockReleasedFromSource(wifiLock.mWorkSource);
                mBatteryStats.noteFullWifiLockReleasedFromSource(wifiLock.mWorkSource);
                break;
        }
    }
+10 −10
Original line number Diff line number Diff line
@@ -347,17 +347,17 @@ public final class BatteryStatsService extends IBatteryStats.Stub {
        }
    }

    public void noteScanWifiLockAcquired(int uid) {
    public void noteWifiScanStarted(int uid) {
        enforceCallingPermission();
        synchronized (mStats) {
            mStats.noteScanWifiLockAcquiredLocked(uid);
            mStats.noteWifiScanStartedLocked(uid);
        }
    }

    public void noteScanWifiLockReleased(int uid) {
    public void noteWifiScanStopped(int uid) {
        enforceCallingPermission();
        synchronized (mStats) {
            mStats.noteScanWifiLockReleasedLocked(uid);
            mStats.noteWifiScanStoppedLocked(uid);
        }
    }

@@ -389,17 +389,17 @@ public final class BatteryStatsService extends IBatteryStats.Stub {
        }
    }

    public void noteScanWifiLockAcquiredFromSource(WorkSource ws) {
    public void noteWifiScanStartedFromSource(WorkSource ws) {
        enforceCallingPermission();
        synchronized (mStats) {
            mStats.noteScanWifiLockAcquiredFromSourceLocked(ws);
            mStats.noteWifiScanStartedFromSourceLocked(ws);
        }
    }

    public void noteScanWifiLockReleasedFromSource(WorkSource ws) {
    public void noteWifiScanStoppedFromSource(WorkSource ws) {
        enforceCallingPermission();
        synchronized (mStats) {
            mStats.noteScanWifiLockReleasedFromSourceLocked(ws);
            mStats.noteWifiScanStoppedFromSourceLocked(ws);
        }
    }