From 89f5127f6d30e9fc171bc0de1642162ab4fd7222 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Wed, 15 May 2019 23:04:39 +0200
Subject: [PATCH] turn inline Install button into Cancel button during download

---
 .../fdroid/views/swap/SwapSuccessView.java    | 45 +++++++++++++------
 .../full/res/layout/swap_app_list_item.xml    |  6 +--
 2 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapSuccessView.java b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapSuccessView.java
index 5fd5ac97d..141d9f395 100644
--- a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapSuccessView.java
+++ b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapSuccessView.java
@@ -41,6 +41,7 @@ import org.fdroid.fdroid.data.App;
 import org.fdroid.fdroid.data.AppProvider;
 import org.fdroid.fdroid.data.Repo;
 import org.fdroid.fdroid.data.Schema.AppMetadataTable;
+import org.fdroid.fdroid.installer.InstallManagerService;
 import org.fdroid.fdroid.localrepo.SwapView;
 import org.fdroid.fdroid.net.Downloader;
 import org.fdroid.fdroid.net.DownloaderService;
@@ -210,7 +211,6 @@ public class SwapSuccessView extends SwapView implements LoaderManager.LoaderCal
                         default:
                             throw new RuntimeException("intent action not handled!");
                     }
-
                 }
             };
 
@@ -261,6 +261,25 @@ public class SwapSuccessView extends SwapView implements LoaderManager.LoaderCal
                 resetView();
             }
 
+            private final OnClickListener cancelListener = new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (apk != null) {
+                        InstallManagerService.cancel(getContext(), apk.getCanonicalUrl());
+                    }
+                }
+            };
+
+            private final OnClickListener installListener = new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (apk != null && (app.hasUpdates() || app.compatible)) {
+                        getActivity().install(app, apk);
+                        showProgress();
+                    }
+                }
+            };
+
             private void resetView() {
 
                 if (app == null) {
@@ -279,6 +298,7 @@ public class SwapSuccessView extends SwapView implements LoaderManager.LoaderCal
                 if (app.hasUpdates()) {
                     btnInstall.setText(R.string.menu_upgrade);
                     btnInstall.setVisibility(View.VISIBLE);
+                    btnInstall.setOnClickListener(installListener);
                     statusIncompatible.setVisibility(View.GONE);
                     statusInstalled.setVisibility(View.GONE);
                 } else if (app.isInstalled(getContext())) {
@@ -289,29 +309,26 @@ public class SwapSuccessView extends SwapView implements LoaderManager.LoaderCal
                     btnInstall.setVisibility(View.GONE);
                     statusIncompatible.setVisibility(View.VISIBLE);
                     statusInstalled.setVisibility(View.GONE);
+                } else if (progressView.getVisibility() == View.VISIBLE) {
+                    btnInstall.setText(R.string.cancel);
+                    btnInstall.setVisibility(View.VISIBLE);
+                    btnInstall.setOnClickListener(cancelListener);
+                    statusIncompatible.setVisibility(View.GONE);
+                    statusInstalled.setVisibility(View.GONE);
                 } else {
                     btnInstall.setText(R.string.menu_install);
                     btnInstall.setVisibility(View.VISIBLE);
+                    btnInstall.setOnClickListener(installListener);
                     statusIncompatible.setVisibility(View.GONE);
                     statusInstalled.setVisibility(View.GONE);
                 }
-
-                OnClickListener installListener = new OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        if (apk != null && (app.hasUpdates() || app.compatible)) {
-                            getActivity().install(app, apk);
-                            showProgress();
-                        }
-                    }
-                };
-
-                btnInstall.setOnClickListener(installListener);
             }
 
             private void showProgress() {
+                btnInstall.setText(R.string.cancel);
+                btnInstall.setVisibility(View.VISIBLE);
+                btnInstall.setOnClickListener(cancelListener);
                 progressView.setVisibility(View.VISIBLE);
-                btnInstall.setVisibility(View.GONE);
                 statusInstalled.setVisibility(View.GONE);
                 statusIncompatible.setVisibility(View.GONE);
             }
diff --git a/app/src/full/res/layout/swap_app_list_item.xml b/app/src/full/res/layout/swap_app_list_item.xml
index cbe716ff7..0a8261475 100644
--- a/app/src/full/res/layout/swap_app_list_item.xml
+++ b/app/src/full/res/layout/swap_app_list_item.xml
@@ -82,14 +82,14 @@
             android:layout_height="wrap_content"
             android:indeterminate="true"
             style="?android:attr/progressBarStyleHorizontal"
-            android:layout_toEndOf="@android:id/icon"
             android:paddingStart="5dp"
             android:paddingLeft="5dp"
             android:paddingEnd="5dp"
             android:paddingRight="5dp"
+            android:layout_toEndOf="@android:id/icon"
             android:layout_toRightOf="@android:id/icon"
-            android:layout_alignParentRight="true"
-            android:layout_alignParentEnd="true"
+            android:layout_toStartOf="@+id/button_or_text"
+            android:layout_toLeftOf="@+id/button_or_text"
             android:layout_below="@+id/name"
     />