| package com.android.server.location; |
| |
| import android.content.ContentResolver; |
| import android.content.Context; |
| import android.database.ContentObserver; |
| import android.os.Handler; |
| import android.os.Looper; |
| import android.os.UserHandle; |
| import android.provider.Settings; |
| import android.util.Log; |
| |
| import com.android.internal.annotations.VisibleForTesting; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * Detects blacklist change and updates the blacklist. |
| */ |
| class GnssSatelliteBlacklistHelper { |
| |
| private static final String TAG = "GnssBlacklistHelper"; |
| private static final String BLACKLIST_DELIMITER = ","; |
| |
| private final Context mContext; |
| private final GnssSatelliteBlacklistCallback mCallback; |
| |
| interface GnssSatelliteBlacklistCallback { |
| void onUpdateSatelliteBlacklist(int[] constellations, int[] svids); |
| } |
| |
| GnssSatelliteBlacklistHelper(Context context, Looper looper, |
| GnssSatelliteBlacklistCallback callback) { |
| mContext = context; |
| mCallback = callback; |
| ContentObserver contentObserver = new ContentObserver(new Handler(looper)) { |
| @Override |
| public void onChange(boolean selfChange) { |
| updateSatelliteBlacklist(); |
| } |
| }; |
| mContext.getContentResolver().registerContentObserver( |
| Settings.Global.getUriFor( |
| Settings.Global.GNSS_SATELLITE_BLACKLIST), |
| true, |
| contentObserver, UserHandle.USER_ALL); |
| } |
| |
| void updateSatelliteBlacklist() { |
| ContentResolver resolver = mContext.getContentResolver(); |
| String blacklist = Settings.Global.getString( |
| resolver, |
| Settings.Global.GNSS_SATELLITE_BLACKLIST); |
| if (blacklist == null) { |
| blacklist = ""; |
| } |
| Log.i(TAG, String.format("Update GNSS satellite blacklist: %s", blacklist)); |
| |
| List<Integer> blacklistValues; |
| try { |
| blacklistValues = parseSatelliteBlacklist(blacklist); |
| } catch (NumberFormatException e) { |
| Log.e(TAG, "Exception thrown when parsing blacklist string.", e); |
| return; |
| } |
| |
| if (blacklistValues.size() % 2 != 0) { |
| Log.e(TAG, "blacklist string has odd number of values." |
| + "Aborting updateSatelliteBlacklist"); |
| return; |
| } |
| |
| int length = blacklistValues.size() / 2; |
| int[] constellations = new int[length]; |
| int[] svids = new int[length]; |
| for (int i = 0; i < length; i++) { |
| constellations[i] = blacklistValues.get(i * 2); |
| svids[i] = blacklistValues.get(i * 2 + 1); |
| } |
| mCallback.onUpdateSatelliteBlacklist(constellations, svids); |
| } |
| |
| @VisibleForTesting |
| static List<Integer> parseSatelliteBlacklist(String blacklist) throws NumberFormatException { |
| String[] strings = blacklist.split(BLACKLIST_DELIMITER); |
| List<Integer> parsed = new ArrayList<>(strings.length); |
| for (String string : strings) { |
| string = string.trim(); |
| if (!"".equals(string)) { |
| int value = Integer.parseInt(string); |
| if (value < 0) { |
| throw new NumberFormatException("Negative value is invalid."); |
| } |
| parsed.add(value); |
| } |
| } |
| return parsed; |
| } |
| } |