From 1c50e2891054b629e2af6b2d0b1fc89e0b1cf18b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 20 Jul 2018 22:57:27 +0200 Subject: [PATCH] use new PendingInstall mechanism to control AppDetails buttons This should hopefully give more reliable display/hiding of the buttons. refs #1357 --- .../java/org/fdroid/fdroid/AppDetails2.java | 31 +++++-------------- .../installer/InstallManagerService.java | 13 ++++++++ .../views/AppDetailsRecyclerViewAdapter.java | 19 ++++++------ .../fdroid/views/AppDetailsAdapterTest.java | 9 ------ 4 files changed, 29 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java index 27be23c69..328854bf4 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java @@ -373,6 +373,12 @@ public class AppDetails2 extends AppCompatActivity } } + @Override + public void installApk() { + Apk apkToInstall = ApkProvider.Helper.findSuggestedApk(this, app); + installApk(apkToInstall); + } + // Install the version of this app denoted by 'app.curApk'. @Override public void installApk(final Apk apk) { @@ -426,12 +432,6 @@ public class AppDetails2 extends AppCompatActivity } private void initiateInstall(Apk apk) { - if (isAppDownloading()) { - Log.i(TAG, "Ignoring request to install " + apk.packageName + " version " + apk.versionName - + ", as we are already downloading (either that or a different version)."); - return; - } - Installer installer = InstallerFactory.create(this, apk); Intent intent = installer.getPermissionScreen(); if (intent != null) { @@ -705,11 +705,6 @@ public class AppDetails2 extends AppCompatActivity }); } - @Override - public boolean isAppDownloading() { - return currentStatus != null && currentStatus.status == AppUpdateStatusManager.Status.Downloading; - } - @Override public void enableAndroidBeam() { NfcHelper.setAndroidBeam(this, app.packageName); @@ -734,7 +729,7 @@ public class AppDetails2 extends AppCompatActivity @Override public void installCancel() { - if (isAppDownloading()) { + if (currentStatus != null) { InstallManagerService.cancel(this, currentStatus.getUniqueKey()); } } @@ -750,18 +745,6 @@ public class AppDetails2 extends AppCompatActivity } } - @Override - public void installApk() { - Apk apkToInstall = ApkProvider.Helper.findSuggestedApk(this, app); - installApk(apkToInstall); - } - - @Override - public void upgradeApk() { - Apk apkToInstall = ApkProvider.Helper.findSuggestedApk(this, app); - installApk(apkToInstall); - } - /** * Uninstall the app from the current screen. Since there are many ways * to uninstall an app, including from Google Play, {@code adb uninstall}, diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java index baf0ad2e3..50d63e3e4 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -489,12 +489,25 @@ public class InstallManagerService extends Service { return pendingInstalls.contains(urlString); } + /** + * Look up by {@code packageName} whether it is a Pending Install. + * + * @see #isPendingInstall(String) + */ + public static boolean isPendingInstall(Context context, String packageName) { + if (pendingInstalls == null) { + pendingInstalls = getPendingInstalls(context); + } + return pendingInstalls.getAll().values().contains(packageName); + } + /** * Mark a given APK as in the process of being installed, with * the {@code urlString} of the download used as the unique ID, * and the file hash used to verify that things are the same. * * @see #isPendingInstall(String) + * @see #isPendingInstall(Context, String) */ public static void putPendingInstall(Context context, String urlString, String packageName) { if (pendingInstalls == null) { diff --git a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java index 12fe62909..150aabbc5 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java @@ -43,6 +43,7 @@ import org.fdroid.fdroid.data.ApkProvider; import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.data.RepoProvider; +import org.fdroid.fdroid.installer.InstallManagerService; import org.fdroid.fdroid.privileged.views.AppDiff; import org.fdroid.fdroid.privileged.views.AppSecurityPermissions; import org.fdroid.fdroid.views.main.MainActivity; @@ -57,8 +58,6 @@ public class AppDetailsRecyclerViewAdapter public interface AppDetailsRecyclerViewAdapterCallbacks { - boolean isAppDownloading(); - void enableAndroidBeam(); void disableAndroidBeam(); @@ -69,8 +68,6 @@ public class AppDetailsRecyclerViewAdapter void installApk(Apk apk); - void upgradeApk(); - void uninstallApk(); void installCancel(); @@ -490,9 +487,11 @@ public class AppDetailsRecyclerViewAdapter buttonSecondaryView.setOnClickListener(onUnInstallClickListener); buttonPrimaryView.setText(R.string.menu_install); buttonPrimaryView.setVisibility(versions.size() > 0 ? View.VISIBLE : View.GONE); - if (callbacks.isAppDownloading()) { + if (InstallManagerService.isPendingInstall(context, app.packageName)) { buttonPrimaryView.setText(R.string.downloading); buttonPrimaryView.setEnabled(false); + buttonLayout.setVisibility(View.GONE); + progressLayout.setVisibility(View.VISIBLE); } else if (!app.isInstalled(context) && suggestedApk != null) { // Check count > 0 due to incompatible apps resulting in an empty list. callbacks.disableAndroidBeam(); @@ -500,6 +499,8 @@ public class AppDetailsRecyclerViewAdapter buttonPrimaryView.setText(R.string.menu_install); buttonPrimaryView.setOnClickListener(onInstallClickListener); buttonPrimaryView.setEnabled(true); + buttonLayout.setVisibility(View.VISIBLE); + progressLayout.setVisibility(View.GONE); } else if (app.isInstalled(context)) { callbacks.enableAndroidBeam(); if (app.canAndWantToUpdate(context) && suggestedApk != null) { @@ -514,10 +515,8 @@ public class AppDetailsRecyclerViewAdapter } } buttonPrimaryView.setEnabled(true); - } - if (callbacks.isAppDownloading()) { - buttonLayout.setVisibility(View.GONE); - progressLayout.setVisibility(View.VISIBLE); + buttonLayout.setVisibility(View.VISIBLE); + progressLayout.setVisibility(View.GONE); } else { buttonLayout.setVisibility(View.VISIBLE); progressLayout.setVisibility(View.GONE); @@ -1103,7 +1102,7 @@ public class AppDetailsRecyclerViewAdapter private final View.OnClickListener onUpgradeClickListener = new View.OnClickListener() { @Override public void onClick(View v) { - callbacks.upgradeApk(); + callbacks.installApk(); } }; diff --git a/app/src/test/java/org/fdroid/fdroid/views/AppDetailsAdapterTest.java b/app/src/test/java/org/fdroid/fdroid/views/AppDetailsAdapterTest.java index 8a904f4e4..1a829fddf 100644 --- a/app/src/test/java/org/fdroid/fdroid/views/AppDetailsAdapterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/views/AppDetailsAdapterTest.java @@ -101,10 +101,6 @@ public class AppDetailsAdapterTest extends FDroidProviderTest { } private final AppDetailsRecyclerViewAdapter.AppDetailsRecyclerViewAdapterCallbacks dummyCallbacks = new AppDetailsRecyclerViewAdapter.AppDetailsRecyclerViewAdapterCallbacks() { // NOCHECKSTYLE LineLength - @Override - public boolean isAppDownloading() { - return false; - } @Override public void enableAndroidBeam() { @@ -131,11 +127,6 @@ public class AppDetailsAdapterTest extends FDroidProviderTest { } - @Override - public void upgradeApk() { - - } - @Override public void uninstallApk() {