ronnie
2022-10-14 1504bb53e29d3d46222c0b3ea994fc494b48e153
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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;
    }
}