ANQPData.java revision a1edc185d46d85e04930a5e12b465de9fea64afe
1package com.android.server.wifi.hotspot2;
2
3import com.android.server.wifi.anqp.ANQPElement;
4import com.android.server.wifi.anqp.Constants;
5
6import java.util.Collections;
7import java.util.List;
8import java.util.Map;
9
10public class ANQPData {
11    private static final long ANQP_QUALIFIED_CACHE_TIMEOUT = 3600000L;
12    private static final long ANQP_UNQUALIFIED_CACHE_TIMEOUT = 60000L;
13    private static final long ANQP_HOLDOFF_TIME =              60000L;
14    private static final long ANQP_RECACHE_TIME =             300000L;
15
16    private final NetworkDetail mNetwork;
17    private final Map<Constants.ANQPElementType, ANQPElement> mANQPElements;
18    private final long mCtime;
19    private final long mExpiry;
20    private volatile long mAtime;
21    private int mRetry;
22
23    public ANQPData(NetworkDetail network,
24                    Map<Constants.ANQPElementType, ANQPElement> anqpElements) {
25
26        mNetwork = network;
27        mANQPElements = anqpElements != null ? Collections.unmodifiableMap(anqpElements) : null;
28        mCtime = System.currentTimeMillis();
29        mExpiry = mCtime +
30                ( network.getAnqpDomainID() == 0 ?
31                ANQP_UNQUALIFIED_CACHE_TIMEOUT :
32                ANQP_QUALIFIED_CACHE_TIMEOUT );
33        mAtime = mCtime;
34    }
35
36    public Map<Constants.ANQPElementType, ANQPElement> getANQPElements() {
37        mAtime = System.currentTimeMillis();
38        return mANQPElements;
39    }
40
41    public NetworkDetail getNetwork() {
42        return mNetwork;
43    }
44
45    public int getDomainID() {
46        return mNetwork.getAnqpDomainID();
47    }
48
49    public long getCtime() {
50        return mCtime;
51    }
52
53    public long getAtime() {
54        return mAtime;
55    }
56
57    public boolean expired(long at) {
58        return mExpiry < at;
59    }
60
61    public boolean recacheable(long at) {
62        return mNetwork.getAnqpDomainID() == 0 || mCtime + ANQP_RECACHE_TIME < at;
63    }
64
65    public boolean isResolved() {
66        return mANQPElements != null;
67    }
68
69    public boolean expendable(long at) {
70        return mANQPElements == null && mCtime + ANQP_HOLDOFF_TIME < at;
71    }
72
73    public int incrementAndGetRetry() {
74        if (mANQPElements != null) {
75            return -1;
76        }
77        return ++mRetry;
78    }
79
80    @Override
81    public String toString() {
82        StringBuilder sb = new StringBuilder();
83        sb.append(mNetwork.toKeyString()).append(", domid ").append(mNetwork.getAnqpDomainID());
84        if (mANQPElements == null) {
85            sb.append(", unresolved, ");
86        }
87        else {
88            sb.append(", ").append(mANQPElements.size()).append(" elements, ");
89        }
90        long now = System.currentTimeMillis();
91        sb.append(Utils.toHMS(now-mCtime)).append(" old, expires in ").
92                append(Utils.toHMS(mExpiry-now)).append(' ');
93        sb.append(expired(now) ? 'x' : '-');
94        sb.append(recacheable(now) ? 'c' : '-');
95        sb.append(isResolved() ? '-' : 'u');
96        return sb.toString();
97    }
98}
99