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 b801a8f55..c6dd31608 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -20,12 +20,12 @@ import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.Apk; import org.fdroid.fdroid.data.App; -import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.net.Downloader; import org.fdroid.fdroid.net.DownloaderService; import java.io.File; import java.util.HashMap; +import java.util.Set; /** * Manages the whole process when a background update triggers an install or the user @@ -59,10 +59,19 @@ public class InstallManagerService extends Service { private static final int NOTIFY_DOWNLOADING = 0x2344; /** - * The collection of APKs that are actively going through this whole process. + * The collection of {@link Apk}s that are actively going through this whole process, + * matching the {@link App}s in {@code ACTIVE_APPS}. The key is the download URL, as + * in {@link Apk#getUrl()} or {@code urlString}. */ private static final HashMap<String, Apk> ACTIVE_APKS = new HashMap<String, Apk>(3); + /** + * The collection of {@link App}s that are actively going through this whole process, + * matching the {@link Apk}s in {@code ACTIVE_APKS}. The key is the + * {@code packageName} of the app. + */ + private static final HashMap<String, App> ACTIVE_APPS = new HashMap<String, App>(3); + /** * The array of active {@link BroadcastReceiver}s for each active APK. The key is the * download URL, as in {@link Apk#getUrl()} or {@code urlString}. @@ -152,6 +161,7 @@ public class InstallManagerService extends Service { public void onReceive(Context context, Intent intent) { String urlString = intent.getDataString(); Apk apk = ACTIVE_APKS.remove(urlString); + ACTIVE_APPS.remove(apk.packageName); notifyDownloadComplete(apk, urlString); unregisterDownloaderReceivers(urlString); } @@ -160,7 +170,8 @@ public class InstallManagerService extends Service { @Override public void onReceive(Context context, Intent intent) { String urlString = intent.getDataString(); - ACTIVE_APKS.remove(urlString); + Apk apk = ACTIVE_APKS.remove(urlString); + ACTIVE_APPS.remove(apk.packageName); unregisterDownloaderReceivers(urlString); } }; @@ -182,7 +193,7 @@ public class InstallManagerService extends Service { return new NotificationCompat.Builder(this) .setAutoCancel(true) .setContentIntent(getAppDetailsIntent(downloadUrlId, apk)) - .setContentTitle(getNotificationTitle(urlString, apk)) + .setContentTitle(getString(R.string.downloading_apk, getAppName(urlString, apk))) .addAction(R.drawable.ic_cancel_black_24dp, getString(R.string.cancel), DownloaderService.getCancelPendingIntent(this, urlString)) .setSmallIcon(android.R.drawable.stat_sys_download) @@ -190,23 +201,13 @@ public class InstallManagerService extends Service { .setProgress(100, 0, true); } - private String getAppName(Apk apk) { - App app = AppProvider.Helper.findByPackageName( - getContentResolver(), apk.packageName, new String[]{AppProvider.DataColumns.NAME}); - if (app != null && !TextUtils.isEmpty(app.name)) { - return app.name; - } else { - return null; - } - } - - private String getNotificationTitle(String urlString, Apk apk) { - String name = getAppName(apk); - if (TextUtils.isEmpty(name)) { + private String getAppName(String urlString, Apk apk) { + App app = ACTIVE_APPS.get(apk.packageName); + if (TextUtils.isEmpty(app.name)) { // this is ugly, but its better than nothing as a failsafe return getString(R.string.downloading_apk, urlString); } else { - return getString(R.string.downloading_apk, name); + return getString(R.string.downloading_apk, app.name); } } @@ -236,7 +237,7 @@ public class InstallManagerService extends Service { title = String.format(getString(R.string.tap_to_update_format), pm.getApplicationLabel(pm.getApplicationInfo(apk.packageName, 0))); } catch (PackageManager.NameNotFoundException e) { - title = String.format(getString(R.string.tap_to_install_format), getAppName(apk)); + title = String.format(getString(R.string.tap_to_install_format), getAppName(urlString, apk)); } int downloadUrlId = urlString.hashCode(); @@ -261,9 +262,29 @@ public class InstallManagerService extends Service { String urlString = apk.getUrl(); Utils.debugLog(TAG, "queue " + app.packageName + " " + apk.versionCode + " from " + urlString); ACTIVE_APKS.put(urlString, apk); + ACTIVE_APPS.put(app.packageName, app); Intent intent = new Intent(context, InstallManagerService.class); intent.setAction(ACTION_INSTALL); intent.setData(Uri.parse(urlString)); context.startService(intent); } + + /** + * Returns a {@link Set} of the {@code urlString}s that are currently active. + * {@code urlString}s are used as unique IDs throughout the + * {@code InstallManagerService} process, either as a {@code String} or as an + * {@code int} from {@link String#hashCode()}. + */ + public static Set<String> getActiveDownloadUrls() { + return ACTIVE_APKS.keySet(); + } + + /** + * Returns a {@link Set} of the {@code packageName}s that are currently active. + * {@code packageName}s are used as unique IDs for apps throughout all of + * Android, F-Droid, and other apps stores. + */ + public static Set<String> getActivePackageNames() { + return ACTIVE_APPS.keySet(); + } }