From a1edfdfc8d4c33e4e9d0dce966e903ceee9eef4b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 16 Jul 2018 17:39:32 +0200 Subject: [PATCH 1/8] PendingInstall event for announcing start of process This adds a new PendingInstall event which broadcasts that an install process has started, but the state of it is not yet known, like whether it needs to be downloaded still, or is ready to install. It marks the very first step of the whole InstallManagerService process. Installer events should only be directly related to the install process as managed by the Installer set of classes. The newer AppStatusUpdate stuff now tracks the whole lifecycle of the process. This mostly reverts f0d6acd974548e24662a64271ae57922f74c3225 since there is now the overarching concept of "Pending Install" to mark packages that are somewhere in the whole process. refs #828 refs #1357 --- .../main/java/org/fdroid/fdroid/AppDetails2.java | 1 + .../org/fdroid/fdroid/AppUpdateStatusManager.java | 3 ++- .../org/fdroid/fdroid/NotificationHelper.java | 4 ++++ .../fdroid/installer/FileInstallerActivity.java | 1 - .../fdroid/installer/InstallManagerService.java | 15 +++++++++------ .../fdroid/fdroid/installer/InstallerService.java | 2 ++ .../fdroid/views/apps/AppListItemController.java | 1 + 7 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java index 3019ace1e..2912f2bd4 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java @@ -485,6 +485,7 @@ public class AppDetails2 extends AppCompatActivity } switch (newStatus.status) { + case PendingInstall: case Downloading: if (newStatus.progressMax == 0) { // The first progress notification we get telling us our status is "Downloading" diff --git a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java index 939a47a39..3ba0e8510 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java +++ b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java @@ -91,13 +91,14 @@ public final class AppUpdateStatusManager { private static final String LOGTAG = "AppUpdateStatusManager"; public enum Status { + PendingInstall, DownloadInterrupted, UpdateAvailable, Downloading, ReadyToInstall, Installing, Installed, - InstallError + InstallError, } public static AppUpdateStatusManager getInstance(Context context) { diff --git a/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java b/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java index aab59045a..b3b6c47f0 100644 --- a/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java @@ -230,6 +230,7 @@ class NotificationHelper { case UpdateAvailable: return new NotificationCompat.Action(R.drawable.ic_file_download, context.getString(R.string.notification_action_update), entry.intent); + case PendingInstall: case Downloading: case Installing: return new NotificationCompat.Action(R.drawable.ic_cancel, context.getString(R.string.notification_action_cancel), entry.intent); @@ -245,6 +246,7 @@ class NotificationHelper { switch (status) { case UpdateAvailable: return context.getString(R.string.notification_title_single_update_available); + case PendingInstall: case Downloading: return app.name; case ReadyToInstall: @@ -263,6 +265,7 @@ class NotificationHelper { switch (status) { case UpdateAvailable: return app.name; + case PendingInstall: case Downloading: return context.getString(app.isInstalled(context) ? R.string.notification_content_single_downloading_update : R.string.notification_content_single_downloading, app.name); case ReadyToInstall: @@ -281,6 +284,7 @@ class NotificationHelper { switch (status) { case UpdateAvailable: return context.getString(R.string.notification_title_summary_update_available); + case PendingInstall: case Downloading: return context.getString(app.isInstalled(context) ? R.string.notification_title_summary_downloading_update : R.string.notification_title_summary_downloading); case ReadyToInstall: diff --git a/app/src/main/java/org/fdroid/fdroid/installer/FileInstallerActivity.java b/app/src/main/java/org/fdroid/fdroid/installer/FileInstallerActivity.java index 2e51f267f..d610c4371 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/FileInstallerActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/FileInstallerActivity.java @@ -145,7 +145,6 @@ public class FileInstallerActivity extends FragmentActivity { private void installPackage(Uri localApkUri, Uri downloadUri, Apk apk) { Utils.debugLog(TAG, "Installing: " + localApkUri.getPath()); - installer.sendBroadcastInstall(downloadUri, Installer.ACTION_INSTALL_STARTED); File path = apk.getMediaInstallPath(activity.getApplicationContext()); path.mkdirs(); try { 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 2c5440dee..12140cf9e 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -34,7 +34,13 @@ import java.io.IOException; /** * Manages the whole process when a background update triggers an install or the user * requests an APK to be installed. It handles checking whether the APK is cached, - * downloading it, putting up and maintaining a {@link Notification}, and more. + * downloading it, putting up and maintaining a {@link Notification}, and more. This + * {@code Service} tracks packages that are in the process as "Pending Installs". + * Then {@link DownloaderService} and {@link InstallerService} individually track + * packages for those phases of the whole install process. Each of those + * {@code Services} have their own related events. For tracking status during the + * whole process, {@link AppUpdateStatusManager} tracks the status as represented by + * {@link AppUpdateStatusManager.AppUpdateStatus}. *

* The {@link App} and {@link Apk} instances are sent via * {@link Intent#putExtra(String, android.os.Bundle)} @@ -103,7 +109,6 @@ public class InstallManagerService extends Service { @Override public void onCreate() { super.onCreate(); - Utils.debugLog(TAG, "creating Service"); localBroadcastManager = LocalBroadcastManager.getInstance(this); appUpdateStatusManager = AppUpdateStatusManager.getInstance(this); @@ -455,14 +460,12 @@ public class InstallManagerService extends Service { */ public static void queue(Context context, App app, @NonNull Apk apk) { String urlString = apk.getUrl(); + AppUpdateStatusManager.getInstance(context).addApk(apk, AppUpdateStatusManager.Status.PendingInstall, null); putPendingInstall(context, urlString, apk.packageName); - Uri downloadUri = Uri.parse(urlString); - Installer.sendBroadcastInstall(context, downloadUri, Installer.ACTION_INSTALL_STARTED, apk, - null, null); Utils.debugLog(TAG, "queue " + app.packageName + " " + apk.versionCode + " from " + urlString); Intent intent = new Intent(context, InstallManagerService.class); intent.setAction(ACTION_INSTALL); - intent.setData(downloadUri); + intent.setData(Uri.parse(urlString)); intent.putExtra(EXTRA_APP, app); intent.putExtra(EXTRA_APK, apk); context.startService(intent); diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallerService.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallerService.java index ee47f5050..7002e435f 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallerService.java @@ -115,6 +115,8 @@ public class InstallerService extends JobIntentService { * @see #uninstall(Context, Apk) */ public static void install(Context context, Uri localApkUri, Uri downloadUri, Apk apk) { + Installer.sendBroadcastInstall(context, downloadUri, Installer.ACTION_INSTALL_STARTED, apk, + null, null); Intent intent = new Intent(context, InstallerService.class); intent.setAction(ACTION_INSTALL); intent.setData(localApkUri); diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java index 1e110ffd3..218c4a04f 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java @@ -332,6 +332,7 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder { case ReadyToInstall: return getViewStateReadyToInstall(app); + case PendingInstall: case Downloading: return getViewStateDownloading(app, appStatus); From 4bf1a4fa2b01b0d6ec5df730c3b9ef45178a66a2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 20 Jul 2018 20:57:03 +0200 Subject: [PATCH 2/8] App Details: do not show cancel X on installing/uninstalling It is not possible to cancel these, so do not show the X button. This is a hacky way to do it, but I couldn't see another way. --- .../fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 84bdbf378..12fe62909 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java @@ -378,11 +378,17 @@ public class AppDetailsRecyclerViewAdapter progressLabel.setText(resIdString); progressLabel.setContentDescription(context.getString(R.string.downloading)); progressPercent.setText(""); + if (resIdString == R.string.installing || resIdString == R.string.uninstalling) { + progressCancel.setVisibility(View.GONE); + } else { + progressCancel.setVisibility(View.VISIBLE); + } } public void setProgress(long bytesDownloaded, long totalBytes) { progressLayout.setVisibility(View.VISIBLE); buttonLayout.setVisibility(View.GONE); + progressCancel.setVisibility(View.VISIBLE); progressBar.setMax(Utils.bytesToKb(totalBytes)); progressBar.setProgress(Utils.bytesToKb(bytesDownloaded)); From 2ff47ed5c394c2dbb678936d870bb0de2a2167ba Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 20 Jul 2018 21:36:40 +0200 Subject: [PATCH 3/8] remove unneeded startInstall() method to make tracing easier Now tracing where .queue() is used is more direct. --- app/src/main/java/org/fdroid/fdroid/AppDetails2.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java index 2912f2bd4..27be23c69 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java @@ -362,7 +362,7 @@ public class AppDetails2 extends AppCompatActivity if (resultCode == Activity.RESULT_OK) { Uri uri = data.getData(); Apk apk = ApkProvider.Helper.findByUri(this, uri, Schema.ApkTable.Cols.ALL); - startInstall(apk); + InstallManagerService.queue(this, app, apk); } break; case REQUEST_UNINSTALL_DIALOG: @@ -441,10 +441,6 @@ public class AppDetails2 extends AppCompatActivity return; } - startInstall(apk); - } - - private void startInstall(Apk apk) { InstallManagerService.queue(this, app, apk); } From d1cbbe72d748cada7773bf2618ad57342fee7853 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 20 Jul 2018 22:26:46 +0200 Subject: [PATCH 4/8] when canceling download, delay removeApk() until its no longer needed This was deleting the Apk from appMapping too fast, so the later status updates couldn't be sent. --- app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java | 1 + .../java/org/fdroid/fdroid/installer/InstallManagerService.java | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java index 3ba0e8510..c7ebc23da 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java +++ b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java @@ -427,6 +427,7 @@ public final class AppUpdateStatusManager { entry.errorText = errorText; entry.intent = null; notifyChange(entry, true); + removeApk(url); } } } 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 12140cf9e..baf0ad2e3 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -176,7 +176,6 @@ public class InstallManagerService extends Service { DownloaderService.cancel(this, apk.getPatchObbUrl()); DownloaderService.cancel(this, apk.getMainObbUrl()); } - appUpdateStatusManager.removeApk(urlString); return START_NOT_STICKY; } else if (ACTION_INSTALL.equals(action)) { if (!isPendingInstall(urlString)) { From 1c50e2891054b629e2af6b2d0b1fc89e0b1cf18b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 20 Jul 2018 22:57:27 +0200 Subject: [PATCH 5/8] 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() { From 8feb735140cd85b6e85fe33cca999ead40e9e670 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 20 Jul 2018 23:23:15 +0200 Subject: [PATCH 6/8] disable inline install/progress button when active refs #1357 --- .../org/fdroid/fdroid/views/apps/AppListItemController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java index 218c4a04f..d2a8d902a 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java @@ -289,12 +289,14 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder { if (viewState.shouldShowActionButton()) { installButton.setVisibility(View.GONE); } else if (viewState.showProgress()) { + installButton.setEnabled(false); installButton.setVisibility(View.VISIBLE); installButton.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_download_progress)); int progressAsDegrees = viewState.getProgressMax() <= 0 ? 0 : (int) (((float) viewState.getProgressCurrent() / viewState.getProgressMax()) * 360); installButton.setImageLevel(progressAsDegrees); } else if (viewState.shouldShowInstall()) { + installButton.setEnabled(true); installButton.setVisibility(View.VISIBLE); installButton.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_download)); } else { From 5e75bc060cb423863b871eca668f0e1aa20c88bf Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 20 Jul 2018 23:24:23 +0200 Subject: [PATCH 7/8] remove unneeded method, it is only called once by the method above --- .../views/apps/AppListItemController.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java index d2a8d902a..dfb27800f 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java @@ -56,7 +56,7 @@ import java.util.Iterator; * *

* The state of the UI is defined in a dumb {@link AppListItemState} class, then applied to the UI - * in the {@link #refreshView(App, AppUpdateStatus)} method. + * in the {@link #updateAppStatus(App, AppUpdateStatus)} method. */ public abstract class AppListItemController extends RecyclerView.ViewHolder { @@ -220,15 +220,10 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder { } /** - * Updates both the progress bar and the circular install button (which shows progress around the outside of - * the circle). Also updates the app label to indicate that the app is being downloaded. - */ - private void updateAppStatus(@NonNull App app, @Nullable AppUpdateStatus status) { - currentStatus = status; - refreshView(app, status); - } - - /** + * Updates both the progress bar and the circular install button (which + * shows progress around the outside of the circle). Also updates the app + * label to indicate that the app is being downloaded. + *

* Queries the current state via {@link #getCurrentViewState(App, AppUpdateStatus)} * and then updates the relevant widgets depending on that state. *

@@ -238,7 +233,8 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder { * @see AppListItemState * @see #getCurrentViewState(App, AppUpdateStatus) */ - private void refreshView(@NonNull App app, @Nullable AppUpdateStatus appStatus) { + private void updateAppStatus(@NonNull App app, @Nullable AppUpdateStatus appStatus) { + currentStatus = appStatus; AppListItemState viewState = getCurrentViewState(app, appStatus); From 01280d65a561ac538d4efc627fdc563e75a87090 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 21 Jul 2018 00:11:31 +0200 Subject: [PATCH 8/8] show different inline button when installing app This could definitely use a better design treatment, but at least it is better than showing the "click to install" button again during the install process. closes #1357 --- .../fdroid/views/apps/AppListItemController.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java index dfb27800f..eaa78f14e 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java @@ -334,6 +334,9 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder { case Downloading: return getViewStateDownloading(app, appStatus); + case Installing: + return getViewStateInstalling(app); + case Installed: return getViewStateInstalled(app); @@ -343,6 +346,16 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder { } } + protected AppListItemState getViewStateInstalling(@NonNull App app) { + CharSequence mainText = activity.getString( + R.string.app_list__name__downloading_in_progress, app.name); + + return new AppListItemState(app) + .setMainText(mainText) + .showActionButton(null) + .setStatusText(activity.getString(R.string.notification_content_single_installing, app.name)); + } + protected AppListItemState getViewStateInstalled(@NonNull App app) { CharSequence mainText = activity.getString( R.string.app_list__name__successfully_installed, app.name);