Skip to content

Commit

Permalink
DownloadService: No-op cleanup
Browse files Browse the repository at this point in the history
Issue: #6798
PiperOrigin-RevId: 289424582
  • Loading branch information
ojw28 committed Jan 17, 2020
1 parent 61130a5 commit 4e4a415
Showing 1 changed file with 21 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
import com.google.android.exoplayer2.util.Util;
import java.util.HashMap;
import java.util.List;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.RequiresNonNull;

/** A {@link Service} for downloading media. */
public abstract class DownloadService extends Service {
Expand Down Expand Up @@ -166,17 +168,18 @@ public abstract class DownloadService extends Service {

private static final String TAG = "DownloadService";

// Keep DownloadManagerListeners for each DownloadService as long as there are downloads (and the
// process is running). This allows DownloadService to restart when there's no scheduler.
// Keep a DownloadManagerHelper for each DownloadService as long as the process is running. The
// helper is needed to restart the DownloadService when there's no scheduler. Even when there is a
// scheduler, the DownloadManagerHelper is typically able to restart the DownloadService faster.
private static final HashMap<Class<? extends DownloadService>, DownloadManagerHelper>
downloadManagerListeners = new HashMap<>();
downloadManagerHelpers = new HashMap<>();

@Nullable private final ForegroundNotificationUpdater foregroundNotificationUpdater;
@Nullable private final String channelId;
@StringRes private final int channelNameResourceId;
@StringRes private final int channelDescriptionResourceId;

@Nullable private DownloadManager downloadManager;
@MonotonicNonNull private DownloadManager downloadManager;
private int lastStartId;
private boolean startedInForeground;
private boolean taskRemoved;
Expand Down Expand Up @@ -575,16 +578,17 @@ public void onCreate() {
NotificationUtil.IMPORTANCE_LOW);
}
Class<? extends DownloadService> clazz = getClass();
DownloadManagerHelper downloadManagerHelper = downloadManagerListeners.get(clazz);
DownloadManagerHelper downloadManagerHelper = downloadManagerHelpers.get(clazz);
if (downloadManagerHelper == null) {
DownloadManager downloadManager = getDownloadManager();
downloadManager = getDownloadManager();
downloadManager.resumeDownloads();
downloadManagerHelper =
new DownloadManagerHelper(
getApplicationContext(), downloadManager, getScheduler(), clazz);
downloadManagerListeners.put(clazz, downloadManagerHelper);
downloadManagerHelpers.put(clazz, downloadManagerHelper);
} else {
downloadManager = downloadManagerHelper.downloadManager;
}
downloadManager = downloadManagerHelper.downloadManager;
downloadManagerHelper.attachService(this);
}

Expand Down Expand Up @@ -671,9 +675,8 @@ public void onTaskRemoved(Intent rootIntent) {
public void onDestroy() {
isDestroyed = true;
DownloadManagerHelper downloadManagerHelper =
Assertions.checkNotNull(downloadManagerListeners.get(getClass()));
boolean unschedule = !downloadManagerHelper.downloadManager.isWaitingForRequirements();
downloadManagerHelper.detachService(this, unschedule);
Assertions.checkNotNull(downloadManagerHelpers.get(getClass()));
downloadManagerHelper.detachService(this);
if (foregroundNotificationUpdater != null) {
foregroundNotificationUpdater.stopPeriodicUpdates();
}
Expand Down Expand Up @@ -872,10 +875,9 @@ private DownloadManagerHelper(
this.scheduler = scheduler;
this.serviceClass = serviceClass;
downloadManager.addListener(this);
if (scheduler != null) {
if (this.scheduler != null) {
Requirements requirements = downloadManager.getRequirements();
setSchedulerEnabled(
scheduler, /* enabled= */ !requirements.checkRequirements(context), requirements);
setSchedulerEnabled(/* enabled= */ !requirements.checkRequirements(context), requirements);
}
}

Expand All @@ -884,10 +886,10 @@ public void attachService(DownloadService downloadService) {
this.downloadService = downloadService;
}

public void detachService(DownloadService downloadService, boolean unschedule) {
public void detachService(DownloadService downloadService) {
Assertions.checkState(this.downloadService == downloadService);
this.downloadService = null;
if (scheduler != null && unschedule) {
if (scheduler != null && !downloadManager.isWaitingForRequirements()) {
scheduler.cancel();
}
}
Expand Down Expand Up @@ -929,12 +931,12 @@ public void onRequirementsStateChanged(
}
}
if (scheduler != null) {
setSchedulerEnabled(scheduler, /* enabled= */ !requirementsMet, requirements);
setSchedulerEnabled(/* enabled= */ !requirementsMet, requirements);
}
}

private void setSchedulerEnabled(
Scheduler scheduler, boolean enabled, Requirements requirements) {
@RequiresNonNull("scheduler")
private void setSchedulerEnabled(boolean enabled, Requirements requirements) {
if (!enabled) {
scheduler.cancel();
} else {
Expand Down

0 comments on commit 4e4a415

Please sign in to comment.