1ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpackage com.android.hotspot2.osu;
2ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
3ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.net.wifi.ScanResult;
4ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.util.Log;
5ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
6ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.anqp.HSIconFileElement;
7ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.anqp.I18Name;
8ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.anqp.IconInfo;
9ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.anqp.OSUProvider;
10ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.Utils;
11ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
12ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.ArrayList;
13ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.Collections;
14ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.HashSet;
15ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.List;
16ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.Locale;
17ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.Set;
18ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
19ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpublic class OSUInfo {
20ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public static final String GenericLocale = "zxx";
21ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
22ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public enum IconStatus {
23ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        NotQueried,     //
24ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        InProgress,     // Query pending
25ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        NotAvailable,   // Deterministically unavailable
26ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        Available       // Icon data retrieved
27ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
28ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
29ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final long mBSSID;
30ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final long mHESSID;
31ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final int mAnqpDomID;
32ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final String mSSID;
33ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final String mAdvertisingSSID;
34ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final OSUProvider mOSUProvider;
35ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final int mOsuID;
36ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private long mOSUBssid;
37ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private IconStatus mIconStatus = IconStatus.NotQueried;
38ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private HSIconFileElement mIconFileElement;
39ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private IconInfo mIconInfo;
40ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
41ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public OSUInfo(ScanResult scanResult, String ssid, OSUProvider osuProvider, int osuID) {
42ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mOsuID = osuID;
43ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mBSSID = Utils.parseMac(scanResult.BSSID);
44ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mHESSID = scanResult.hessid;
45ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mAnqpDomID = scanResult.anqpDomainId;
46ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mAdvertisingSSID = scanResult.SSID;
47ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mSSID = ssid;
48ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mOSUProvider = osuProvider;
49ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
50ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
51ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public long getOSUBssid() {
52ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mOSUBssid;
53ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
54ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
55ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public void setOSUBssid(long OSUBssid) {
56ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mOSUBssid = OSUBssid;
57ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
58ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
59ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public long getHESSID() {
60ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mHESSID;
61ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
62ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
63ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public int getAnqpDomID() {
64ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mAnqpDomID;
65ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
66ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
67ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public String getAdvertisingSSID() {
68ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mAdvertisingSSID;
69ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
70ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
71ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public Set<Locale> getNameLocales() {
72ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        Set<Locale> locales = new HashSet<>(mOSUProvider.getNames().size());
73ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        for (I18Name name : mOSUProvider.getNames()) {
74ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            locales.add(name.getLocale());
75ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
76ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return locales;
77ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
78ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
79ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public Set<Locale> getServiceLocales() {
80ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        Set<Locale> locales = new HashSet<>(mOSUProvider.getServiceDescriptions().size());
81ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        for (I18Name name : mOSUProvider.getServiceDescriptions()) {
82ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            locales.add(name.getLocale());
83ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
84ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return locales;
85ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
86ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
87ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public Set<String> getIconLanguages() {
88ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        Set<String> locales = new HashSet<>(mOSUProvider.getIcons().size());
89ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        for (IconInfo iconInfo : mOSUProvider.getIcons()) {
90ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            locales.add(iconInfo.getLanguage());
91ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
92ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return locales;
93ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
94ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
95ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public String getName(Locale locale) {
96ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        List<ScoreEntry<String>> scoreList = new ArrayList<>();
97ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        for (I18Name name : mOSUProvider.getNames()) {
98ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            if (locale == null || name.getLocale().equals(locale)) {
99ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                return name.getText();
100ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            }
101ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            scoreList.add(new ScoreEntry<String>(name.getText(),
102ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                    languageScore(name.getLanguage(), locale)));
103ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
104ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        Collections.sort(scoreList);
105ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return scoreList.isEmpty() ? null : scoreList.iterator().next().getData();
106ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
107ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
108ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public String getServiceDescription(Locale locale) {
109ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        List<ScoreEntry<String>> scoreList = new ArrayList<>();
110ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        for (I18Name service : mOSUProvider.getServiceDescriptions()) {
111ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            if (locale == null || service.getLocale().equals(locale)) {
112ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                return service.getText();
113ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            }
114ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            scoreList.add(new ScoreEntry<>(service.getText(),
115ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                    languageScore(service.getLanguage(), locale)));
116ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
117ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        Collections.sort(scoreList);
118ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return scoreList.isEmpty() ? null : scoreList.iterator().next().getData();
119ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
120ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
121ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public int getOsuID() {
122ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mOsuID;
123ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
124ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
125ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public void setIconStatus(IconStatus iconStatus) {
126ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        synchronized (mOSUProvider) {
127ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            mIconStatus = iconStatus;
128ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
129ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
130ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
131ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public IconStatus getIconStatus() {
132ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        synchronized (mOSUProvider) {
133ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return mIconStatus;
134ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
135ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
136ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
137ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public HSIconFileElement getIconFileElement() {
138ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        synchronized (mOSUProvider) {
139ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return mIconFileElement;
140ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
141ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
142ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
143ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public IconInfo getIconInfo() {
144ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        synchronized (mOSUProvider) {
145ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return mIconInfo;
146ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
147ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
148ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
149ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public void setIconFileElement(HSIconFileElement iconFileElement, String fileName) {
150ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        synchronized (mOSUProvider) {
151ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            mIconFileElement = iconFileElement;
152ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            for (IconInfo iconInfo : mOSUProvider.getIcons()) {
153ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                if (iconInfo.getFileName().equals(fileName)) {
154ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                    mIconInfo = iconInfo;
155ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                    break;
156ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                }
157ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            }
158ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            mIconStatus = IconStatus.Available;
159ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
160ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
161ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
162ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private static class ScoreEntry<T> implements Comparable<ScoreEntry> {
163ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        private final T mData;
164ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        private final int mScore;
165ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
166ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        private ScoreEntry(T data, int score) {
167ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            mData = data;
168ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            mScore = score;
169ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
170ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
171ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        public T getData() {
172ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return mData;
173ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
174ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
175ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        @Override
176ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        public int compareTo(ScoreEntry other) {
177ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return Integer.compare(mScore, other.mScore);
178ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
179ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
180ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
181ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public List<IconInfo> getIconInfo(Locale locale, Set<String> types, int width, int height) {
182ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        if (mOSUProvider.getIcons().isEmpty()) {
183ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return null;
184ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
185ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        Log.d(OSUManager.TAG, "Matching icons against " + locale
186ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                + ", types " + types + ", " + width + "*" + height);
187ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
188ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        List<ScoreEntry<IconInfo>> matches = new ArrayList<>();
189ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        for (IconInfo iconInfo : mOSUProvider.getIcons()) {
190ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            Log.d(OSUManager.TAG, "Checking icon " + iconInfo.toString());
191ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            if (!types.contains(iconInfo.getIconType())) {
192ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                continue;
193ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            }
194ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
195ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            int score = languageScore(iconInfo.getLanguage(), locale);
196ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            int delta = iconInfo.getWidth() - width;
197ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            // Best size score is 1024 for a exact match, i.e. 2048 if both sides match
198ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            if (delta >= 0) {
199ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                score += (256 - delta) * 4;  // Prefer down-scaling
200ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            } else {
201ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                score += 256 + delta;    // Before up-scaling
202ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            }
203ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            delta = iconInfo.getHeight() - height;
204ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            if (delta >= 0) {
205ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                score += (256 - delta) * 4;
206ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            } else {
207ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                score += 256 + delta;
208ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            }
209ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            matches.add(new ScoreEntry<>(iconInfo, score));
210ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
211ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        if (matches.isEmpty()) {
212ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return Collections.emptyList();
213ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
214ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        Collections.sort(matches);
215ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        List<IconInfo> icons = new ArrayList<>(matches.size());
216ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        for (ScoreEntry<IconInfo> scoredIcon : matches) {
217ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            icons.add(scoredIcon.getData());
218ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
219ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return icons;
220ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
221ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
222ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private static int languageScore(String language, Locale locale) {
223ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        if (language.length() == 3 && language.equalsIgnoreCase(locale.getISO3Language()) ||
224ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                language.length() == 2 && language.equalsIgnoreCase(locale.getLanguage())) {
225ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return 4096;
226ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        } else if (language.equalsIgnoreCase(GenericLocale)) {
227ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return 3072;
228ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        } else if (language.equalsIgnoreCase("eng")) {
229ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return 2048;
230ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        } else {
231ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            return 1024;
232ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
233ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
234ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
235ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public long getBSSID() {
236ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mBSSID;
237ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
238ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
239ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public String getSSID() {
240ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mSSID;
241ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
242ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
243ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public OSUProvider getOSUProvider() {
244ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return mOSUProvider;
245ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
246ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
247ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    @Override
248ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public String toString() {
249ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return String.format("OSU Info '%s' %012x -> %s, icon %s",
250ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                mSSID, mBSSID, getServiceDescription(null), mIconStatus);
251ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
252ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist}
253