diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8838315b1..4aabb1e92 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -47,6 +47,7 @@ connected10:
# this file changes every time but should not be cached
- rm -f $GRADLE_USER_HOME/caches/modules-2/modules-2.lock
- exit $EXITVALUE
+ allow_failure: true # remove once install segfaults are gone
connected17:
variables:
diff --git a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java
index 882654abd..9d9c19eed 100644
--- a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java
+++ b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java
@@ -139,7 +139,9 @@ public class FDroidApp extends Application {
}
/**
- * Initialize the settings needed to run a local swap repo.
+ * Initialize the settings needed to run a local swap repo. This should
+ * only ever be called in {@link org.fdroid.fdroid.net.WifiStateChangeService.WifiInfoThread},
+ * after the single init call in {@link FDroidApp#onCreate()}.
*/
public static void initWifiSettings() {
port = 8888;
diff --git a/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java b/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java
index e720a6031..d626e2983 100644
--- a/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java
+++ b/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java
@@ -57,7 +57,9 @@ public class RepoUpdater {
@NonNull
private final Repo repo;
private boolean hasChanged;
+
@Nullable
+ private ProgressListener downloadProgressListener;
private ProgressListener committingProgressListener;
private ProgressListener processXmlProgressListener;
private String cacheTag;
@@ -83,6 +85,10 @@ public class RepoUpdater {
this.indexUrl = url;
}
+ public void setDownloadProgressListener(ProgressListener progressListener) {
+ this.downloadProgressListener = progressListener;
+ }
+
public void setProcessXmlProgressListener(ProgressListener progressListener) {
this.processXmlProgressListener = progressListener;
}
@@ -100,6 +106,7 @@ public class RepoUpdater {
try {
downloader = DownloaderFactory.create(context, indexUrl);
downloader.setCacheTag(repo.lastetag);
+ downloader.setListener(downloadProgressListener);
downloader.download();
if (downloader.isCached()) {
diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
index 8dc291305..3f163f438 100644
--- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java
+++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
@@ -49,8 +49,6 @@ import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.installer.InstallManagerService;
-import org.fdroid.fdroid.net.Downloader;
-import org.fdroid.fdroid.net.DownloaderService;
import java.net.URL;
import java.util.ArrayList;
@@ -166,7 +164,6 @@ public class UpdateService extends IntentService {
public void onDestroy() {
super.onDestroy();
notificationManager.cancel(NOTIFY_ID_UPDATING);
- localBroadcastManager.unregisterReceiver(downloadProgressReceiver);
localBroadcastManager.unregisterReceiver(updateStatusReceiver);
}
@@ -195,26 +192,6 @@ public class UpdateService extends IntentService {
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
- private final BroadcastReceiver downloadProgressReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String repoAddress = intent.getDataString();
- int downloadedSize = intent.getIntExtra(Downloader.EXTRA_BYTES_READ, -1);
- String downloadedSizeFriendly = Utils.getFriendlySize(downloadedSize);
- int totalSize = intent.getIntExtra(Downloader.EXTRA_TOTAL_BYTES, -1);
- int percent = (int) ((double) downloadedSize / totalSize * 100);
- String message;
- if (totalSize == -1) {
- message = getString(R.string.status_download_unknown_size, repoAddress, downloadedSizeFriendly);
- percent = -1;
- } else {
- String totalSizeFriendly = Utils.getFriendlySize(totalSize);
- message = getString(R.string.status_download, repoAddress, downloadedSizeFriendly, totalSizeFriendly, percent);
- }
- sendStatus(context, STATUS_INFO, message, percent);
- }
- };
-
// For receiving results from the UpdateService when we've told it to
// update in response to a user request.
private final BroadcastReceiver updateStatusReceiver = new BroadcastReceiver() {
@@ -375,10 +352,7 @@ public class UpdateService extends IntentService {
sendStatus(this, STATUS_INFO, getString(R.string.status_connecting_to_repo, repo.address));
RepoUpdater updater = new RepoUpdater(getBaseContext(), repo);
- localBroadcastManager.registerReceiver(downloadProgressReceiver,
- DownloaderService.getIntentFilter(updater.indexUrl, Downloader.ACTION_PROGRESS));
- updater.setProcessXmlProgressListener(processXmlProgressListener);
- updater.setCommittingProgressListener(committingProgressListener);
+ setProgressListeners(updater);
try {
updater.update();
if (updater.hasChanged()) {
@@ -392,7 +366,6 @@ public class UpdateService extends IntentService {
repoErrors.add(e.getMessage());
Log.e(TAG, "Error updating repository " + repo.address, e);
}
- localBroadcastManager.unregisterReceiver(downloadProgressReceiver);
// now that downloading the index is done, start downloading updates
if (changes && fdroidPrefs.isAutoDownloadEnabled()) {
@@ -528,25 +501,50 @@ public class UpdateService extends IntentService {
notificationManager.notify(NOTIFY_ID_UPDATES_AVAILABLE, builder.build());
}
- private final ProgressListener processXmlProgressListener = new ProgressListener() {
- @Override
- public void onProgress(URL sourceUrl, int bytesRead, int totalBytes) {
- String downloadedSize = Utils.getFriendlySize(bytesRead);
- String totalSize = Utils.getFriendlySize(totalBytes);
- int percent = -1;
- if (totalBytes > 0) {
- percent = (int) ((double) bytesRead / totalBytes * 100);
+ /**
+ * Set up the various {@link ProgressListener}s needed to get feedback to the UI.
+ * Note: {@code ProgressListener}s do not need to be unregistered, they can just
+ * be set again for each download.
+ */
+ private void setProgressListeners(RepoUpdater updater) {
+ updater.setDownloadProgressListener(new ProgressListener() {
+ @Override
+ public void onProgress(URL sourceUrl, int bytesRead, int totalBytes) {
+ Log.i(TAG, "downloadProgressReceiver " + sourceUrl);
+ String downloadedSizeFriendly = Utils.getFriendlySize(bytesRead);
+ int percent = (int) ((double) bytesRead / totalBytes * 100);
+ String message;
+ if (totalBytes == -1) {
+ message = getString(R.string.status_download_unknown_size, sourceUrl, downloadedSizeFriendly);
+ percent = -1;
+ } else {
+ String totalSizeFriendly = Utils.getFriendlySize(totalBytes);
+ message = getString(R.string.status_download, sourceUrl, downloadedSizeFriendly, totalSizeFriendly, percent);
+ }
+ sendStatus(getApplicationContext(), STATUS_INFO, message, percent);
}
- String message = getString(R.string.status_processing_xml_percent, sourceUrl, downloadedSize, totalSize, percent);
- sendStatus(getApplicationContext(), STATUS_INFO, message, percent);
- }
- };
+ });
- private final ProgressListener committingProgressListener = new ProgressListener() {
- @Override
- public void onProgress(URL sourceUrl, int bytesRead, int totalBytes) {
- String message = getString(R.string.status_inserting_apps);
- sendStatus(getApplicationContext(), STATUS_INFO, message);
- }
- };
+ updater.setProcessXmlProgressListener(new ProgressListener() {
+ @Override
+ public void onProgress(URL sourceUrl, int bytesRead, int totalBytes) {
+ String downloadedSize = Utils.getFriendlySize(bytesRead);
+ String totalSize = Utils.getFriendlySize(totalBytes);
+ int percent = -1;
+ if (totalBytes > 0) {
+ percent = (int) ((double) bytesRead / totalBytes * 100);
+ }
+ String message = getString(R.string.status_processing_xml_percent, sourceUrl, downloadedSize, totalSize, percent);
+ sendStatus(getApplicationContext(), STATUS_INFO, message, percent);
+ }
+ });
+
+ updater.setCommittingProgressListener(new ProgressListener() {
+ @Override
+ public void onProgress(URL sourceUrl, int bytesRead, int totalBytes) {
+ String message = getString(R.string.status_inserting_apps);
+ sendStatus(getApplicationContext(), STATUS_INFO, message);
+ }
+ });
+ }
}
diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java
index dda0ae0ba..e53460ab3 100644
--- a/app/src/main/java/org/fdroid/fdroid/data/App.java
+++ b/app/src/main/java/org/fdroid/fdroid/data/App.java
@@ -21,8 +21,12 @@ import java.io.InputStream;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashSet;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public class App extends ValueObject implements Comparable