diff --git a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapAppsView.java b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapAppsView.java index 839cf8c5b..7ad2f38eb 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapAppsView.java +++ b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapAppsView.java @@ -314,7 +314,7 @@ public class SwapAppsView extends ListView implements } if (apk != null) { - String urlString = apk.getUrl(); + String urlString = apk.getCanonicalUrl(); // TODO unregister receivers? or will they just die with this instance IntentFilter downloadFilter = DownloaderService.getIntentFilter(urlString); diff --git a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java index e3b1cb276..a8a426db9 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java +++ b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java @@ -836,7 +836,7 @@ public class SwapWorkflowActivity extends AppCompatActivity { } public void install(@NonNull final App app, @NonNull final Apk apk) { - Uri downloadUri = Uri.parse(apk.getUrl()); + Uri downloadUri = Uri.parse(apk.getCanonicalUrl()); localBroadcastManager.registerReceiver(installReceiver, Installer.getInstallIntentFilter(downloadUri)); InstallManagerService.queue(this, app, apk); diff --git a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java index 020a817dd..14c7bda14 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java +++ b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java @@ -133,7 +133,7 @@ public final class AppUpdateStatusManager { * @see org.fdroid.fdroid.installer.InstallManagerService */ public String getUniqueKey() { - return apk.getUrl(); + return apk.getCanonicalUrl(); } /** @@ -321,7 +321,7 @@ public final class AppUpdateStatusManager { ContentResolver resolver = context.getContentResolver(); App app = AppProvider.Helper.findSpecificApp(resolver, apk.packageName, apk.repoId); AppUpdateStatus ret = new AppUpdateStatus(app, apk, status, intent); - appMapping.put(apk.getUrl(), ret); + appMapping.put(apk.getCanonicalUrl(), ret); return ret; } } @@ -347,7 +347,7 @@ public final class AppUpdateStatusManager { } synchronized (appMapping) { - AppUpdateStatus entry = appMapping.get(apk.getUrl()); + AppUpdateStatus entry = appMapping.get(apk.getCanonicalUrl()); if (entry != null) { updateApkInternal(entry, status, pendingIntent); } else { @@ -435,7 +435,7 @@ public final class AppUpdateStatusManager { public void setApkError(Apk apk, String errorText) { synchronized (appMapping) { - AppUpdateStatus entry = appMapping.get(apk.getUrl()); + AppUpdateStatus entry = appMapping.get(apk.getCanonicalUrl()); if (entry == null) { entry = createAppEntry(apk, Status.InstallError, null); } diff --git a/app/src/main/java/org/fdroid/fdroid/data/Apk.java b/app/src/main/java/org/fdroid/fdroid/data/Apk.java index 0cdae110c..b70506203 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Apk.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Apk.java @@ -263,8 +263,17 @@ public class Apk extends ValueObject implements Comparable, Parcelable { } } + /** + * Get the URL that points to the canonical download source for this + * package. This is also used as the unique ID for tracking downloading, + * progress, and notifications throughout the whole install process. It + * is guaranteed to uniquely represent this file since it points to a file + * on the file system of the canonical webserver. + * + * @see org.fdroid.fdroid.installer.InstallManagerService + */ @JsonIgnore // prevent tests from failing due to nulls in checkRepoAddress() - public String getUrl() { + public String getCanonicalUrl() { checkRepoAddress(); return repoAddress + "/" + apkName.replace(" ", "%20"); } @@ -527,7 +536,7 @@ public class Apk extends ValueObject implements Comparable, Parcelable { public File getMediaInstallPath(Context context) { File path = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS); // Default for all other non-apk/media files - String fileExtension = MimeTypeMap.getFileExtensionFromUrl(this.getUrl()); + String fileExtension = MimeTypeMap.getFileExtensionFromUrl(this.getCanonicalUrl()); if (TextUtils.isEmpty(fileExtension)) return path; MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String[] mimeType = mimeTypeMap.getMimeTypeFromExtension(fileExtension).split("/"); 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 3ba2a632a..74cd5eda0 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -209,7 +209,7 @@ public class InstallManagerService extends Service { getObb(urlString, apk.getMainObbUrl(), apk.getMainObbFile(), apk.obbMainFileSha256); getObb(urlString, apk.getPatchObbUrl(), apk.getPatchObbFile(), apk.obbPatchFileSha256); - File apkFilePath = ApkCache.getApkDownloadPath(this, apk.getUrl()); + File apkFilePath = ApkCache.getApkDownloadPath(this, apk.getCanonicalUrl()); long apkFileSize = apkFilePath.length(); if (!apkFilePath.exists() || apkFileSize < apk.size) { Utils.debugLog(TAG, "download " + urlString + " " + apkFilePath); @@ -464,7 +464,7 @@ public class InstallManagerService extends Service { * @param context this app's {@link Context} */ public static void queue(Context context, App app, @NonNull Apk apk) { - String urlString = apk.getUrl(); + String urlString = apk.getCanonicalUrl(); AppUpdateStatusManager.getInstance(context).addApk(apk, AppUpdateStatusManager.Status.PendingInstall, null); putPendingInstall(context, urlString, apk.packageName); Utils.debugLog(TAG, "queue " + app.packageName + " " + apk.versionCode + " from " + urlString); 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 9427c5f45..520311045 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 @@ -483,9 +483,9 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder { } if (currentStatus != null && currentStatus.status == AppUpdateStatusManager.Status.ReadyToInstall) { - String urlString = currentStatus.apk.getUrl(); + String urlString = currentStatus.apk.getCanonicalUrl(); File apkFilePath = ApkCache.getApkDownloadPath(activity, urlString); - Utils.debugLog(TAG, "skip download, we have already downloaded " + currentStatus.apk.getUrl() + + Utils.debugLog(TAG, "skip download, we have already downloaded " + currentStatus.apk.getCanonicalUrl() + " to " + apkFilePath); final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(activity); diff --git a/app/src/main/java/org/fdroid/fdroid/views/updates/items/KnownVulnAppListItemController.java b/app/src/main/java/org/fdroid/fdroid/views/updates/items/KnownVulnAppListItemController.java index 6d3631940..a4d89fa7f 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/updates/items/KnownVulnAppListItemController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/updates/items/KnownVulnAppListItemController.java @@ -73,7 +73,7 @@ public class KnownVulnAppListItemController extends AppListItemController { Apk suggestedApk = ApkProvider.Helper.findSuggestedApk(activity, app); if (shouldUpgradeInsteadOfUninstall(app, suggestedApk)) { LocalBroadcastManager manager = LocalBroadcastManager.getInstance(activity); - Uri uri = Uri.parse(suggestedApk.getUrl()); + Uri uri = Uri.parse(suggestedApk.getCanonicalUrl()); manager.registerReceiver(installReceiver, Installer.getInstallIntentFilter(uri)); InstallManagerService.queue(activity, app, suggestedApk); } else {