Home | History | Annotate | Download | only in hotspot2
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.server.wifi.hotspot2;
     18 
     19 import com.android.internal.annotations.VisibleForTesting;
     20 import com.android.server.wifi.Clock;
     21 import com.android.server.wifi.hotspot2.anqp.ANQPElement;
     22 import com.android.server.wifi.hotspot2.anqp.Constants;
     23 
     24 import java.io.PrintWriter;
     25 import java.util.ArrayList;
     26 import java.util.HashMap;
     27 import java.util.List;
     28 import java.util.Map;
     29 
     30 /**
     31  * Cache for storing ANQP data.  This is simply a data cache, all the logic related to
     32  * ANQP data query will be handled elsewhere (e.g. the consumer of the cache).
     33  */
     34 public class AnqpCache {
     35     @VisibleForTesting
     36     public static final long CACHE_SWEEP_INTERVAL_MILLISECONDS = 60000L;
     37 
     38     private long mLastSweep;
     39     private Clock mClock;
     40 
     41     private final Map<ANQPNetworkKey, ANQPData> mANQPCache;
     42 
     43     public AnqpCache(Clock clock) {
     44         mClock = clock;
     45         mANQPCache = new HashMap<>();
     46         mLastSweep = mClock.getElapsedSinceBootMillis();
     47     }
     48 
     49     /**
     50      * Add an ANQP entry associated with the given key.
     51      *
     52      * @param key The key that's associated with the entry
     53      * @param anqpElements The ANQP elements from the AP
     54      */
     55     public void addEntry(ANQPNetworkKey key,
     56             Map<Constants.ANQPElementType, ANQPElement> anqpElements) {
     57         ANQPData data = new ANQPData(mClock, anqpElements);
     58         mANQPCache.put(key, data);
     59     }
     60 
     61     /**
     62      * Get the ANQP data associated with the given AP.
     63      *
     64      * @param key The key that's associated with the entry
     65      * @return {@link ANQPData}
     66      */
     67     public ANQPData getEntry(ANQPNetworkKey key) {
     68         return mANQPCache.get(key);
     69     }
     70 
     71     /**
     72      * Go through the cache to remove any expired entries.
     73      */
     74     public void sweep() {
     75         long now = mClock.getElapsedSinceBootMillis();
     76         // Check if it is time to perform the sweep.
     77         if (now < mLastSweep + CACHE_SWEEP_INTERVAL_MILLISECONDS) {
     78             return;
     79         }
     80 
     81         // Get all expired keys.
     82         List<ANQPNetworkKey> expiredKeys = new ArrayList<>();
     83         for (Map.Entry<ANQPNetworkKey, ANQPData> entry : mANQPCache.entrySet()) {
     84             if (entry.getValue().expired(now)) {
     85                 expiredKeys.add(entry.getKey());
     86             }
     87         }
     88 
     89         // Remove all expired entries.
     90         for (ANQPNetworkKey key : expiredKeys) {
     91             mANQPCache.remove(key);
     92         }
     93         mLastSweep = now;
     94     }
     95 
     96     public void dump(PrintWriter out) {
     97         out.println("Last sweep " + Utils.toHMS(mClock.getElapsedSinceBootMillis() - mLastSweep)
     98                 + " ago.");
     99         for (Map.Entry<ANQPNetworkKey, ANQPData> entry : mANQPCache.entrySet()) {
    100             out.println(entry.getKey() + ": " + entry.getValue());
    101         }
    102     }
    103 }
    104