diff --git a/res/values/strings.xml b/res/values/strings.xml index ac9310003..36e4720d0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -107,6 +107,7 @@ Not installed (%d available) Installed Downloaded file is corrupt + Download cancelled diff --git a/src/org/fdroid/fdroid/AppDetails.java b/src/org/fdroid/fdroid/AppDetails.java index ecb6b6dee..5e8e1e19c 100644 --- a/src/org/fdroid/fdroid/AppDetails.java +++ b/src/org/fdroid/fdroid/AppDetails.java @@ -159,6 +159,7 @@ public class AppDetails extends ListActivity { private PackageManager mPm; private ProgressDialog pd; private DB.Apk.CompatibilityChecker compatChecker; + private volatile boolean cancelDownload; private Context mctx = this; @@ -482,9 +483,24 @@ public class AppDetails extends ListActivity { return; } + cancelDownload = false; + pd = new ProgressDialog(this); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage(getString(R.string.download_server)); + pd.setCancelable(true); + pd.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + cancelDownload = true; + } + }); + pd.setButton(getString(R.string.cancel), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); pd.show(); new Thread() { @@ -552,6 +568,10 @@ public class AppDetails extends ListActivity { int totalRead = 0; int bytesRead = getit.read(data, 0, 1024); while (bytesRead != -1) { + if (cancelDownload) { + Log.d("FDroid", "Download cancelled!"); + break; + } bout.write(data, 0, bytesRead); totalRead += bytesRead; msg = new Message(); @@ -563,6 +583,12 @@ public class AppDetails extends ListActivity { getit.close(); saveit.close(); f = new File(localfile); + if (cancelDownload) { + f.delete(); + msg = download_cancelled_handler.obtainMessage(); + msg.sendToTarget(); + return; + } Md5Handler hash = new Md5Handler(); String calcedhash = hash.md5Calc(f); if (curapk.hash.equalsIgnoreCase(calcedhash)) { @@ -636,6 +662,14 @@ public class AppDetails extends ListActivity { } }; + private Handler download_cancelled_handler = new Handler() { + @Override + public void handleMessage(Message msg) { + Toast.makeText(mctx, getString(R.string.download_cancelled), + Toast.LENGTH_SHORT).show(); + } + }; + private void removeApk(String id) { PackageInfo pkginfo; try {