Enforce all the SliceBackgroundWorkers being singletons at syntax level

- Create workers via reflection in SliceBackgroundWorker
- Store the workers in a static container and release then at shutdown()

Fixes: 118228009
Test: robolectric
Change-Id: I564277d3a12b2d7d3b50cef091bdfedb3397c145
This commit is contained in:
Jason Chiu
2018-10-29 17:58:55 +08:00
committed by Fan Zhang
parent 7ebb059ea5
commit a68f81540e
6 changed files with 124 additions and 90 deletions

View File

@@ -52,7 +52,6 @@ import com.android.settings.wifi.calling.WifiCallingSliceHelper;
import com.android.settingslib.SliceBroadcastRelay;
import com.android.settingslib.utils.ThreadUtils;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -134,8 +133,7 @@ public class SettingsSliceProvider extends SliceProvider {
final Set<Uri> mRegisteredUris = new ArraySet<>();
final Map<Uri, SliceBackgroundWorker> mWorkerMap = new ArrayMap<>();
final Set<SliceBackgroundWorker> mLiveWorkers = new ArraySet<>();
final Map<Uri, SliceBackgroundWorker> mPinnedWorkers = new ArrayMap<>();
public SettingsSliceProvider() {
super(READ_SEARCH_INDEXABLES);
@@ -365,45 +363,37 @@ public class SettingsSliceProvider extends SliceProvider {
}
private void startBackgroundWorker(CustomSliceable sliceable) {
final SliceBackgroundWorker worker = sliceable.getBackgroundWorker();
if (worker == null) {
final Class workerClass = sliceable.getBackgroundWorkerClass();
if (workerClass == null) {
return;
}
final Uri uri = sliceable.getUri();
if (mWorkerMap.containsKey(uri)) {
if (mPinnedWorkers.containsKey(uri)) {
return;
}
Log.d(TAG, "Starting background worker for: " + uri);
mWorkerMap.put(uri, worker);
if (!mLiveWorkers.contains(worker)) {
mLiveWorkers.add(worker);
}
final SliceBackgroundWorker worker = SliceBackgroundWorker.getInstance(
getContext(), sliceable);
mPinnedWorkers.put(uri, worker);
worker.onSlicePinned();
}
private void stopBackgroundWorker(Uri uri) {
final SliceBackgroundWorker worker = mWorkerMap.get(uri);
final SliceBackgroundWorker worker = mPinnedWorkers.get(uri);
if (worker != null) {
Log.d(TAG, "Stopping background worker for: " + uri);
worker.onSliceUnpinned();
mWorkerMap.remove(uri);
mPinnedWorkers.remove(uri);
}
}
@Override
public void shutdown() {
for (SliceBackgroundWorker worker : mLiveWorkers) {
ThreadUtils.postOnMainThread(() -> {
try {
worker.close();
} catch (IOException e) {
Log.w(TAG, "Exception when shutting down worker", e);
}
});
}
mLiveWorkers.clear();
ThreadUtils.postOnMainThread(() -> {
SliceBackgroundWorker.shutdown();
});
}
private List<Uri> buildUrisFromKeys(List<String> keys, String authority) {
@@ -532,4 +522,4 @@ public class SettingsSliceProvider extends SliceProvider {
}
return new String[0];
}
}
}