Fix bug in DownloadHandler

If an error occurred or the user cancelled the download, the message
(toast) would be redisplayed on every rotation from there on.

This change fixes the bug (by removing the reference to the download
thread when it's finished) and encapsulates all interaction with the
download thread in DownloadHandler.
This commit is contained in:
Henrik Tunedal 2011-03-29 02:01:19 +02:00
parent 1ae3e604bd
commit 9c3da557fa
2 changed files with 50 additions and 30 deletions

View File

@ -153,7 +153,6 @@ public class AppDetails extends ListActivity {
private String appid;
private PackageManager mPm;
private DB.Apk.CompatibilityChecker compatChecker;
private Downloader download;
private DownloadHandler downloadHandler;
private boolean stateRetained;
@ -210,7 +209,7 @@ public class AppDetails extends ListActivity {
reset();
viewResetRequired = false;
}
if (download != null && downloadHandler != null) {
if (downloadHandler != null) {
downloadHandler.startUpdates();
}
super.onResume();
@ -240,10 +239,9 @@ public class AppDetails extends ListActivity {
@Override
protected void onDestroy() {
if (download != null && !stateRetained) {
download.interrupt();
}
if (downloadHandler != null) {
if (!stateRetained)
downloadHandler.cancel();
downloadHandler.destroy();
}
super.onDestroy();
@ -253,12 +251,10 @@ public class AppDetails extends ListActivity {
// place of reset(), so it must initialize all fields normally set
// there.
private void copyState(AppDetails old) {
download = old.download;
if (download != null) {
downloadHandler = new DownloadHandler();
}
ApkListAdapter oldAdapter = (ApkListAdapter)old.getListAdapter();
setListAdapter(new ApkListAdapter(this, oldAdapter.getItems()));
if (old.downloadHandler != null)
downloadHandler = new DownloadHandler(old.downloadHandler);
app = old.app;
app_currentvercode = old.app_currentvercode;
mInstalledSignature = old.mInstalledSignature;
@ -447,9 +443,7 @@ public class AppDetails extends ListActivity {
alert.show();
return;
}
download = new Downloader(curapk);
downloadHandler = new DownloadHandler();
download.start();
downloadHandler = new DownloadHandler(curapk);
}
private void removeApk(String id) {
@ -470,7 +464,6 @@ public class AppDetails extends ListActivity {
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + file),
"application/vnd.android.package-archive");
startActivityForResult(intent, REQUEST_INSTALL);
}
@ -484,9 +477,7 @@ public class AppDetails extends ListActivity {
pd.setOnCancelListener(
new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
if (download != null) {
download.interrupt();
}
downloadHandler.cancel();
}
});
pd.setButton(getString(R.string.cancel),
@ -501,10 +492,22 @@ public class AppDetails extends ListActivity {
// Handler used to update the progress dialog while downloading.
private class DownloadHandler extends Handler {
private Downloader download;
private ProgressDialog pd;
boolean updating;
private boolean updating;
private String localFile;
public DownloadHandler() {
public DownloadHandler(DB.Apk apk) {
download = new Downloader(apk);
download.start();
startUpdates();
}
public DownloadHandler(DownloadHandler oldHandler) {
if (oldHandler != null) {
download = oldHandler.download;
localFile = oldHandler.localFile;
}
startUpdates();
}
@ -532,7 +535,7 @@ public class AppDetails extends ListActivity {
break;
case DONE:
if (pd != null) pd.dismiss();
installApk(download.localFile());
installApk(localFile = download.localFile());
finished = true;
break;
case CANCELLED:
@ -557,6 +560,26 @@ public class AppDetails extends ListActivity {
removeMessages(0);
}
public void cancel() {
if (download != null) download.interrupt();
}
public void cleanUp() {
if (localFile == null) {
Log.w("FDroid", "No APK to clean up!");
return;
}
// If we're not meant to be caching, delete the apk file we just
// installed (or maybe the user cancelled the install - doesn't
// matter) from the SD card...
if (!pref_cacheDownloaded) {
File file = new File(localFile);
Log.d("FDroid", "Cleaning up: " + file);
file.delete();
localFile = null;
}
}
public void destroy() {
// The dialog can't be dismissed when it's not displayed,
// so do it when the activity is being destroyed.
@ -572,10 +595,12 @@ public class AppDetails extends ListActivity {
// Repeatedly run updateProgress() until it's finished.
@Override
public void handleMessage(Message msg) {
if (download == null) return;
boolean finished = updateProgress();
if (!finished) {
if (finished)
download = null;
else
sendMessageDelayed(obtainMessage(), 50);
}
}
}
@ -584,14 +609,9 @@ public class AppDetails extends ListActivity {
Intent data) {
switch(requestCode) {
case REQUEST_INSTALL:
// If we're not meant to be caching, delete the apk file we just
// installed (or maybe the user cancelled the install - doesn't
// matter) from the SD card...
if (!pref_cacheDownloaded && download != null) {
File file = new File(download.localFile());
Log.d("FDroid", "Cleaning up: " + file);
file.delete();
download = null;
if (downloadHandler != null) {
downloadHandler.cleanUp();
downloadHandler = null;
}
viewResetRequired = true;
break;

View File

@ -193,7 +193,7 @@ public class Downloader extends Thread {
+ Log.getStackTraceString(e));
synchronized (this) {
error = Error.UNKNOWN;
errorMessage = e.getMessage();
errorMessage = e.toString();
status = Status.ERROR;
}
// Get rid of any partial download...