Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions app/src/main/java/eu/faircode/netguard/ActivitySettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -715,8 +715,7 @@ else if ("loglevel".equals(name))
ServiceSinkhole.reload("changed " + name, this, false);

else if ("domain_based_blocked".equals(name)) {
TrackerList ts = TrackerList.getInstance(this);
ts.loadTrackers(this);
TrackerList.reloadTrackerData(this);
}

}
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java
Original file line number Diff line number Diff line change
Expand Up @@ -1799,6 +1799,9 @@ public static void prepareHostsBlocked(Context c) {
}

lock.writeLock().unlock();

// Reload TrackerList to ensure it stays in sync with updated hosts
TrackerList.reloadTrackerData(c);
}

private void prepareUidIPFilters(String dname) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,15 @@ public class TrackerList {
private static final String TAG = TrackerList.class.getSimpleName();
private static final List<String> ignoreDomains = Collections.singletonList("cloudfront.net, fastly.net");
private static final Map<String, Tracker> hostnameToTracker = new ConcurrentHashMap<>();
public static Set<String> trackingIps = new HashSet<>();
public static Set<String> trackingIps = ConcurrentHashMap.newKeySet();
public static String TRACKER_HOSTLIST = "TRACKER_HOSTLIST";
private static final Tracker hostlistTracker = new Tracker(TRACKER_HOSTLIST, UNCATEGORISED);
private static TrackerList instance;
private static boolean domainBasedBlocking;
private final DatabaseHelper databaseHelper;

// Lock for synchronizing tracker data reload operations
private static final Object reloadLock = new Object();

// Performance: Cache tracker counts to avoid full DB scans on every refresh
private Pair<Pair<Map<Integer, Integer>, Integer>, Pair<Map<Integer, Integer>, Integer>> cachedTrackerCounts;
Expand Down Expand Up @@ -130,6 +133,30 @@ public static Tracker findTracker(@NonNull String hostname) {
return t;
}

/**
* Reload tracker data by clearing all existing data and reloading from assets.
* This should be called when the hosts blocklist is updated to ensure TrackerList
* stays in sync with the updated hosts.
*
* @param c Context
*/
public static void reloadTrackerData(Context c) {
Log.i(TAG, "Reloading tracker data");

// Synchronize the entire reload operation to prevent race conditions
synchronized (reloadLock) {
// Clear existing data (both are thread-safe collections)
hostnameToTracker.clear();
trackingIps.clear();

// Ensure instance exists and reload trackers from assets
TrackerList trackerList = getInstance(c);
trackerList.loadTrackers(c);
// Invalidate cached tracker counts since tracker data has changed
trackerList.invalidateTrackerCountCache();
}
}

/**
* Load tracker domain database
*
Expand Down