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

Commit 6942a120 authored by David Christie's avatar David Christie
Browse files

Add WorkSource capability to WifiManager for starting a scan.

Change-Id: I011bf3b91fbddaba7ab0128bb03d27d90b8a886f
parent 9deaa286
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -303,10 +303,15 @@ public final class WifiService extends IWifiManager.Stub {

    /**
     * see {@link android.net.wifi.WifiManager#startScan()}
     *
     * <p>If workSource is null, all blame is given to the calling uid.
     */
    public void startScan() {
    public void startScan(WorkSource workSource) {
        enforceChangePermission();
        mWifiStateMachine.startScan(Binder.getCallingUid());
        if (workSource != null) {
            enforceWorkSourcePermission();
        }
        mWifiStateMachine.startScan(Binder.getCallingUid(), workSource);
    }

    private void enforceAccessPermission() {
@@ -320,6 +325,12 @@ public final class WifiService extends IWifiManager.Stub {

    }

    private void enforceWorkSourcePermission() {
        mContext.enforceCallingPermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
                                                "WifiService");

    }

    private void enforceMulticastChangePermission() {
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.CHANGE_WIFI_MULTICAST_STATE,
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ interface IWifiManager

    boolean pingSupplicant();

    void startScan();
    void startScan(in WorkSource ws);

    List<ScanResult> getScanResults(String callingPackage);

+12 −1
Original line number Diff line number Diff line
@@ -759,7 +759,18 @@ public class WifiManager {
     */
    public boolean startScan() {
        try {
            mService.startScan();
            final WorkSource workSource = null;
            mService.startScan(workSource);
            return true;
        } catch (RemoteException e) {
            return false;
        }
    }

    /** @hide */
    public boolean startScan(WorkSource workSource) {
        try {
            mService.startScan(workSource);
            return true;
        } catch (RemoteException e) {
            return false;
+18 −11
Original line number Diff line number Diff line
@@ -607,7 +607,8 @@ public class WifiStateMachine extends StateMachine {
                new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        startScan(UNKNOWN_SCAN_SOURCE);
                        final WorkSource workSource = null;
                        startScan(UNKNOWN_SCAN_SOURCE, workSource);
                    }
                },
                new IntentFilter(ACTION_START_SCAN));
@@ -725,15 +726,21 @@ public class WifiStateMachine extends StateMachine {
    }

    /**
     * TODO: doc
     * Initiate a wifi scan.  If workSource is not null, blame is given to it,
     * otherwise blame is given to callingUid.
     *
     * @param callingUid The uid initiating the wifi scan.  Blame will be given
     *                   here unless workSource is specified.
     * @param workSource If not null, blame is given to workSource.
     */
    public void startScan(int callingUid) {
        sendMessage(CMD_START_SCAN, callingUid);
    public void startScan(int callingUid, WorkSource workSource) {
        sendMessage(CMD_START_SCAN, callingUid, 0, workSource);
    }

    private void noteScanStart(int callingUid) {
        if (mScanWorkSource == null && callingUid != UNKNOWN_SCAN_SOURCE) {
            mScanWorkSource = new WorkSource(callingUid);
    // If workSource is not null, blame is given to it, otherwise blame is given to callingUid.
    private void noteScanStart(int callingUid, WorkSource workSource) {
        if (mScanWorkSource == null && (callingUid != UNKNOWN_SCAN_SOURCE || workSource != null)) {
            mScanWorkSource = workSource != null ? workSource : new WorkSource(callingUid);
            try {
                mBatteryStats.noteWifiScanStartedFromSource(mScanWorkSource);
            } catch (RemoteException e) {
@@ -2502,7 +2509,7 @@ public class WifiStateMachine extends StateMachine {
        public boolean processMessage(Message message) {
            switch(message.what) {
                case CMD_START_SCAN:
                    noteScanStart(message.arg1);
                    noteScanStart(message.arg1, (WorkSource) message.obj);
                    startScanNative(WifiNative.SCAN_WITH_CONNECTION_SETUP);
                    break;
                case CMD_SET_COUNTRY_CODE:
@@ -2788,7 +2795,7 @@ public class WifiStateMachine extends StateMachine {
                // Handle scan. All the connection related commands are
                // handled only in ConnectModeState
                case CMD_START_SCAN:
                    noteScanStart(message.arg1);
                    noteScanStart(message.arg1, (WorkSource) message.obj);
                    startScanNative(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP);
                    break;
                default:
@@ -3054,7 +3061,7 @@ public class WifiStateMachine extends StateMachine {
                    break;
                case CMD_START_SCAN:
                    /* Do not attempt to connect when we are already connected */
                    noteScanStart(message.arg1);
                    noteScanStart(message.arg1, (WorkSource) message.obj);
                    startScanNative(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP);
                    break;
                    /* Ignore connection to same network */
@@ -3372,7 +3379,7 @@ public class WifiStateMachine extends StateMachine {
                    if (mP2pConnected.get()) break;
                    if (message.arg1 == mPeriodicScanToken &&
                            mWifiConfigStore.getConfiguredNetworks().size() == 0) {
                        sendMessage(CMD_START_SCAN, UNKNOWN_SCAN_SOURCE);
                        sendMessage(CMD_START_SCAN, UNKNOWN_SCAN_SOURCE, 0, (WorkSource) null);
                        sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN,
                                    ++mPeriodicScanToken, 0), mSupplicantScanIntervalMs);
                    }