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);