Don't show progress in AppDetails when using a cached download.

The ApkDownloader now returns true or false depending on whether it
is using a cached version on disk, or hitting the network.
I was also a little more defensive about checking for if downloadHandler
is null before deciding to show a progress dialog.
This commit is contained in:
Peter Serwylo 2014-05-22 21:43:00 +09:30
parent 2f7d6f6452
commit 009c8a6be5
2 changed files with 39 additions and 23 deletions

View File

@ -425,7 +425,6 @@ public class AppDetails extends ListActivity implements ProgressListener {
@Override
protected void onResume() {
Log.d(TAG, "onresume");
super.onResume();
// register observer to know when install status changes
@ -1021,8 +1020,9 @@ public class AppDetails extends ListActivity implements ProgressListener {
private void startDownload(Apk apk, String repoAddress) {
downloadHandler = new ApkDownloader(apk, repoAddress, Utils.getApkCacheDir(getBaseContext()));
downloadHandler.setProgressListener(this);
downloadHandler.download();
updateProgressDialog();
if (downloadHandler.download()) {
updateProgressDialog();
}
}
private void installApk(File file, String packageName) {
setProgressBarIndeterminateVisibility(true);
@ -1052,10 +1052,6 @@ public class AppDetails extends ListActivity implements ProgressListener {
@Override
public void run() {
if (operation == Installer.InstallerCallback.OPERATION_INSTALL) {
if (downloadHandler != null) {
downloadHandler = null;
}
PackageManagerCompat.setInstaller(mPm, app.id);
}
@ -1121,8 +1117,13 @@ public class AppDetails extends ListActivity implements ProgressListener {
pd.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
downloadHandler.cancel();
downloadHandler = null;
Log.d(TAG, "User clicked 'cancel' on download, attempting to interrupt download thread.");
if (downloadHandler != null) {
downloadHandler.cancel();
downloadHandler = null;
} else {
Log.e(TAG, "Tried to cancel, but the downloadHandler doesn't exist.");
}
progressDialog = null;
Toast.makeText(AppDetails.this, getString(R.string.download_cancelled), Toast.LENGTH_LONG).show();
}
@ -1148,21 +1149,28 @@ public class AppDetails extends ListActivity implements ProgressListener {
* {@link org.fdroid.fdroid.ProgressListener.Event}.
*/
private void updateProgressDialog() {
updateProgressDialog(downloadHandler.getProgress(), downloadHandler.getTotalSize());
if (downloadHandler != null) {
updateProgressDialog(downloadHandler.getProgress(), downloadHandler.getTotalSize());
}
}
private void updateProgressDialog(int progress, int total) {
ProgressDialog pd = getProgressDialog(downloadHandler.getRemoteAddress());
if (total > 0) {
pd.setIndeterminate(false);
pd.setProgress(progress);
pd.setMax(total);
} else {
pd.setIndeterminate(true);
pd.setProgress(progress);
pd.setMax(0);
if (downloadHandler != null) {
ProgressDialog pd = getProgressDialog(downloadHandler.getRemoteAddress());
if (total > 0) {
pd.setIndeterminate(false);
pd.setProgress(progress);
pd.setMax(total);
} else {
pd.setIndeterminate(true);
pd.setProgress(progress);
pd.setMax(0);
}
if (!pd.isShowing()) {
Log.d(TAG, "Showing progress dialog for download.");
pd.show();
}
}
pd.show();
}
@Override
@ -1200,7 +1208,7 @@ public class AppDetails extends ListActivity implements ProgressListener {
switch (requestCode) {
case REQUEST_ENABLE_BLUETOOTH:
fdroidApp.sendViaBluetooth(this, resultCode, app.id);
break;
break;
}
}
}

View File

@ -131,12 +131,17 @@ public class ApkDownloader implements AsyncDownloadWrapper.Listener {
}
}
public void download() {
/**
* If the download successfully spins up a new thread to start downloading, then we return
* true, otherwise false. This is useful, e.g. when we use a cached version, and so don't
* want to bother with progress dialogs et al.
*/
public boolean download() {
// Can we use the cached version?
if (verifyOrDeleteCachedVersion()) {
sendMessage(EVENT_APK_DOWNLOAD_COMPLETE);
return;
return false;
}
String remoteAddress = getRemoteAddress();
@ -147,12 +152,15 @@ public class ApkDownloader implements AsyncDownloadWrapper.Listener {
Downloader downloader = new HttpDownloader(remoteAddress, localFile);
dlWrapper = new AsyncDownloadWrapper(downloader, this);
dlWrapper.download();
return true;
} catch (MalformedURLException e) {
onErrorDownloading(e.getLocalizedMessage());
} catch (IOException e) {
onErrorDownloading(e.getLocalizedMessage());
}
return false;
}
private void sendMessage(String type) {