Commit 112117a1 by olly Committed by Oliver Woodman

Reorder DownloadManager methods

Put methods into a more sensible order (the same order as
in the switch statement, which is a more natural order with
e.g. initialize coming first and release coming last).

PiperOrigin-RevId: 242891742
parent 9779d71a
...@@ -573,6 +573,52 @@ public final class DownloadManager { ...@@ -573,6 +573,52 @@ public final class DownloadManager {
return true; return true;
} }
private void initializeInternal(int notMetRequirements) {
this.notMetRequirements = notMetRequirements;
ArrayList<Download> loadedStates = new ArrayList<>();
try (DownloadCursor cursor =
downloadIndex.getDownloads(
STATE_QUEUED, STATE_STOPPED, STATE_DOWNLOADING, STATE_REMOVING, STATE_RESTARTING)) {
while (cursor.moveToNext()) {
loadedStates.add(cursor.getDownload());
}
logd("Download states are loaded.");
} catch (Throwable e) {
Log.e(TAG, "Download state loading failed.", e);
loadedStates.clear();
}
for (Download download : loadedStates) {
addDownloadForState(download);
}
logd("Downloads are created.");
mainHandler.obtainMessage(MSG_INITIALIZED, loadedStates).sendToTarget();
for (int i = 0; i < downloadInternals.size(); i++) {
downloadInternals.get(i).start();
}
}
private void setDownloadsStartedInternal(boolean downloadsStarted) {
if (this.downloadsStarted == downloadsStarted) {
return;
}
this.downloadsStarted = downloadsStarted;
for (int i = 0; i < downloadInternals.size(); i++) {
downloadInternals.get(i).updateStopState();
}
}
private void setNotMetRequirementsInternal(
@Requirements.RequirementFlags int notMetRequirements) {
if (this.notMetRequirements == notMetRequirements) {
return;
}
this.notMetRequirements = notMetRequirements;
logdFlags("Not met requirements are changed", notMetRequirements);
for (int i = 0; i < downloadInternals.size(); i++) {
downloadInternals.get(i).updateStopState();
}
}
private void setManualStopReasonInternal(@Nullable String id, int manualStopReason) { private void setManualStopReasonInternal(@Nullable String id, int manualStopReason) {
if (id != null) { if (id != null) {
DownloadInternal downloadInternal = getDownload(id); DownloadInternal downloadInternal = getDownload(id);
...@@ -630,6 +676,37 @@ public final class DownloadManager { ...@@ -630,6 +676,37 @@ public final class DownloadManager {
} }
} }
private void onDownloadThreadStoppedInternal(DownloadThread downloadThread) {
DownloadInternal downloadInternal = downloadThread.downloadInternal;
logd("Download is stopped", downloadInternal);
activeDownloads.remove(downloadInternal);
boolean tryToStartDownloads = false;
if (!downloadThread.isRemoveThread) {
// If maxSimultaneousDownloads was hit, there might be a download waiting for a slot.
tryToStartDownloads = simultaneousDownloads == maxSimultaneousDownloads;
simultaneousDownloads--;
}
downloadInternal.onDownloadThreadStopped(downloadThread.isCanceled, downloadThread.finalError);
if (tryToStartDownloads) {
for (int i = 0;
simultaneousDownloads < maxSimultaneousDownloads && i < downloadInternals.size();
i++) {
downloadInternals.get(i).start();
}
}
}
private void releaseInternal() {
for (DownloadInternal downloadInternal : activeDownloads.keySet()) {
stopDownloadThread(downloadInternal);
}
internalThread.quit();
synchronized (releaseLock) {
released = true;
releaseLock.notifyAll();
}
}
private void onDownloadChangedInternal(DownloadInternal downloadInternal, Download download) { private void onDownloadChangedInternal(DownloadInternal downloadInternal, Download download) {
logd("Download state is changed", downloadInternal); logd("Download state is changed", downloadInternal);
try { try {
...@@ -654,26 +731,35 @@ public final class DownloadManager { ...@@ -654,26 +731,35 @@ public final class DownloadManager {
mainHandler.obtainMessage(MSG_DOWNLOAD_REMOVED, download).sendToTarget(); mainHandler.obtainMessage(MSG_DOWNLOAD_REMOVED, download).sendToTarget();
} }
private void setDownloadsStartedInternal(boolean downloadsStarted) { @StartThreadResults
if (this.downloadsStarted == downloadsStarted) { private int startDownloadThread(DownloadInternal downloadInternal) {
return; if (activeDownloads.containsKey(downloadInternal)) {
if (stopDownloadThread(downloadInternal)) {
return START_THREAD_WAIT_DOWNLOAD_CANCELLATION;
} }
this.downloadsStarted = downloadsStarted; return START_THREAD_WAIT_REMOVAL_TO_FINISH;
for (int i = 0; i < downloadInternals.size(); i++) {
downloadInternals.get(i).updateStopState();
} }
if (!downloadInternal.isInRemoveState()) {
if (simultaneousDownloads == maxSimultaneousDownloads) {
return START_THREAD_TOO_MANY_DOWNLOADS;
} }
simultaneousDownloads++;
private void setNotMetRequirementsInternal(
@Requirements.RequirementFlags int notMetRequirements) {
if (this.notMetRequirements == notMetRequirements) {
return;
} }
this.notMetRequirements = notMetRequirements; DownloadThread downloadThread = new DownloadThread(downloadInternal);
logdFlags("Not met requirements are changed", notMetRequirements); activeDownloads.put(downloadInternal, downloadThread);
for (int i = 0; i < downloadInternals.size(); i++) { downloadInternal.setCounters(downloadThread.downloader.getCounters());
downloadInternals.get(i).updateStopState(); logd("Download is started", downloadInternal);
return START_THREAD_SUCCEEDED;
}
private boolean stopDownloadThread(DownloadInternal downloadInternal) {
DownloadThread downloadThread = activeDownloads.get(downloadInternal);
if (downloadThread != null && !downloadThread.isRemoveThread) {
downloadThread.cancel();
logd("Download is cancelled", downloadInternal);
return true;
} }
return false;
} }
@Nullable @Nullable
...@@ -696,30 +782,6 @@ public final class DownloadManager { ...@@ -696,30 +782,6 @@ public final class DownloadManager {
return null; return null;
} }
private void initializeInternal(int notMetRequirements) {
this.notMetRequirements = notMetRequirements;
ArrayList<Download> loadedStates = new ArrayList<>();
try (DownloadCursor cursor =
downloadIndex.getDownloads(
STATE_QUEUED, STATE_STOPPED, STATE_DOWNLOADING, STATE_REMOVING, STATE_RESTARTING)) {
while (cursor.moveToNext()) {
loadedStates.add(cursor.getDownload());
}
logd("Download states are loaded.");
} catch (Throwable e) {
Log.e(TAG, "Download state loading failed.", e);
loadedStates.clear();
}
for (Download download : loadedStates) {
addDownloadForState(download);
}
logd("Downloads are created.");
mainHandler.obtainMessage(MSG_INITIALIZED, loadedStates).sendToTarget();
for (int i = 0; i < downloadInternals.size(); i++) {
downloadInternals.get(i).start();
}
}
private void addDownloadForState(Download download) { private void addDownloadForState(Download download) {
DownloadInternal downloadInternal = new DownloadInternal(this, download); DownloadInternal downloadInternal = new DownloadInternal(this, download);
downloadInternals.add(downloadInternal); downloadInternals.add(downloadInternal);
...@@ -749,68 +811,6 @@ public final class DownloadManager { ...@@ -749,68 +811,6 @@ public final class DownloadManager {
} }
} }
@StartThreadResults
private int startDownloadThread(DownloadInternal downloadInternal) {
if (activeDownloads.containsKey(downloadInternal)) {
if (stopDownloadThread(downloadInternal)) {
return START_THREAD_WAIT_DOWNLOAD_CANCELLATION;
}
return START_THREAD_WAIT_REMOVAL_TO_FINISH;
}
if (!downloadInternal.isInRemoveState()) {
if (simultaneousDownloads == maxSimultaneousDownloads) {
return START_THREAD_TOO_MANY_DOWNLOADS;
}
simultaneousDownloads++;
}
DownloadThread downloadThread = new DownloadThread(downloadInternal);
activeDownloads.put(downloadInternal, downloadThread);
downloadInternal.setCounters(downloadThread.downloader.getCounters());
logd("Download is started", downloadInternal);
return START_THREAD_SUCCEEDED;
}
private boolean stopDownloadThread(DownloadInternal downloadInternal) {
DownloadThread downloadThread = activeDownloads.get(downloadInternal);
if (downloadThread != null && !downloadThread.isRemoveThread) {
downloadThread.cancel();
logd("Download is cancelled", downloadInternal);
return true;
}
return false;
}
private void releaseInternal() {
for (DownloadInternal downloadInternal : activeDownloads.keySet()) {
stopDownloadThread(downloadInternal);
}
internalThread.quit();
synchronized (releaseLock) {
released = true;
releaseLock.notifyAll();
}
}
private void onDownloadThreadStoppedInternal(DownloadThread downloadThread) {
DownloadInternal downloadInternal = downloadThread.downloadInternal;
logd("Download is stopped", downloadInternal);
activeDownloads.remove(downloadInternal);
boolean tryToStartDownloads = false;
if (!downloadThread.isRemoveThread) {
// If maxSimultaneousDownloads was hit, there might be a download waiting for a slot.
tryToStartDownloads = simultaneousDownloads == maxSimultaneousDownloads;
simultaneousDownloads--;
}
downloadInternal.onDownloadThreadStopped(downloadThread.isCanceled, downloadThread.finalError);
if (tryToStartDownloads) {
for (int i = 0;
simultaneousDownloads < maxSimultaneousDownloads && i < downloadInternals.size();
i++) {
downloadInternals.get(i).start();
}
}
}
private static final class DownloadInternal { private static final class DownloadInternal {
private final DownloadManager downloadManager; private final DownloadManager downloadManager;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment