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

Commit 1a8fece4 authored by Quang Luong's avatar Quang Luong
Browse files

Added AccessPoint cache integration for Passpoint networks

This is needed since WifiSettings does not update an AP from
WifiTracker if the AP key matches, resulting in WifiSettings
having a stale AP reference if the AP is not cached on the
WifiTracker side.

Tracking bug for adding robolectric tests: b/122849296

Bug: 118705403
Test: manual, build and check if verbose scan list updates
Change-Id: I5ffcb186047fb38df53a8c5b877d6e4f432f1417
parent 919d4646
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -632,7 +632,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
    public static String getKey(OsuProvider provider) {
        return new StringBuilder()
                .append(KEY_PREFIX_OSU)
                .append(provider.getOsuSsid())
                .append(provider.getFriendlyName())
                .append(',')
                .append(provider.getServerUri()).toString();
    }
+31 −19
Original line number Diff line number Diff line
@@ -616,8 +616,8 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
                        }
                    }

                    AccessPoint accessPoint = new AccessPoint(mContext, config);
                    accessPoint.setScanResults(scanResults);
                    AccessPoint accessPoint =
                            getCachedOrCreatePasspoint(scanResults, cachedAccessPoints, config);
                    accessPoint.update(connectionConfig, mLastInfo, mLastNetworkInfo);
                    accessPoints.add(accessPoint);
                }
@@ -689,15 +689,24 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
    AccessPoint getCachedOrCreate(
            List<ScanResult> scanResults,
            List<AccessPoint> cache) {
        final int N = cache.size();
        for (int i = 0; i < N; i++) {
            if (cache.get(i).getKey().equals(AccessPoint.getKey(scanResults.get(0)))) {
                AccessPoint ret = cache.remove(i);
                ret.setScanResults(scanResults);
                return ret;
        AccessPoint accessPoint = getCachedByKey(cache, AccessPoint.getKey(scanResults.get(0)));
        if (accessPoint == null) {
            accessPoint = new AccessPoint(mContext, scanResults);
        } else {
            accessPoint.setScanResults(scanResults);
        }
        return accessPoint;
    }

    private AccessPoint getCachedOrCreatePasspoint(
            List<ScanResult> scanResults,
            List<AccessPoint> cache,
            WifiConfiguration config) {
        AccessPoint accessPoint = getCachedByKey(cache, AccessPoint.getKey(config));
        if (accessPoint == null) {
            accessPoint = new AccessPoint(mContext, config);
        }
        final AccessPoint accessPoint = new AccessPoint(mContext, scanResults);
        accessPoint.setScanResults(scanResults);
        return accessPoint;
    }

@@ -705,21 +714,24 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
            List<ScanResult> scanResults,
            List<AccessPoint> cache,
            OsuProvider provider) {
        AccessPoint matchedAccessPoint = null;
        AccessPoint accessPoint = getCachedByKey(cache, AccessPoint.getKey(provider));
        if (accessPoint == null) {
            accessPoint = new AccessPoint(mContext, provider);
        }
        accessPoint.setScanResults(scanResults);
        return accessPoint;
    }

    private AccessPoint getCachedByKey(List<AccessPoint> cache, String key) {
        ListIterator<AccessPoint> lit = cache.listIterator();
        while (lit.hasNext()) {
            AccessPoint currentAccessPoint = lit.next();
            if (currentAccessPoint.getKey().equals(AccessPoint.getKey(provider))) {
            if (currentAccessPoint.getKey().equals(key)) {
                lit.remove();
                matchedAccessPoint = currentAccessPoint;
                break;
                return currentAccessPoint;
            }
        }
        if (matchedAccessPoint == null) {
            matchedAccessPoint = new AccessPoint(mContext, provider);
        }
        matchedAccessPoint.setScanResults(scanResults);
        return matchedAccessPoint;
        return null;
    }

    private void updateNetworkInfo(NetworkInfo networkInfo) {