From a1edfdfc8d4c33e4e9d0dce966e903ceee9eef4b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 16 Jul 2018 17:39:32 +0200 Subject: [PATCH] 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);