From 16a36f212cd2feec12cdba15d450597653875cbe Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner
Date: Wed, 18 May 2016 14:15:07 +0200
Subject: [PATCH 1/8] fix download progress when installing apps via swap
fixes issue that came from all the #601 !278 changes
---
.../main/java/org/fdroid/fdroid/views/swap/SwapAppsView.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/app/src/main/java/org/fdroid/fdroid/views/swap/SwapAppsView.java b/app/src/main/java/org/fdroid/fdroid/views/swap/SwapAppsView.java
index bdb34a58a..e40d6c09f 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/swap/SwapAppsView.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/swap/SwapAppsView.java
@@ -245,6 +245,9 @@ public class SwapAppsView extends ListView implements
private final BroadcastReceiver downloadProgressReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
+ if (progressView.getVisibility() != View.VISIBLE) {
+ showProgress();
+ }
int read = intent.getIntExtra(Downloader.EXTRA_BYTES_READ, 0);
int total = intent.getIntExtra(Downloader.EXTRA_TOTAL_BYTES, 0);
if (total > 0) {
From 4224d6df81df75c3586b69cbe6281cd4be8933a6 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner
Date: Tue, 17 May 2016 13:49:18 +0200
Subject: [PATCH 2/8] only update static WiFi settings var from WifiInfoThread
Since Intents can come in any time, whether WifiInfoThread is running or
not, the global static vars for storing the WiFi settings info should only
be updated from the WifiInfoThread. Otherwise, the WiFi settings could be
nulled out between the time of the null guard and the execution in code
like this:
if (!TextUtils.isEmpty(FDroidApp.ipAddressString) && netmask != null) {
FDroidApp.subnetInfo = new SubnetUtils(FDroidApp.ipAddressString, netmask).getInfo();
fixes #589 https://gitlab.com/fdroid/fdroidclient/issues/589
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:304)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalArgumentException: Could not parse [null/24]
at org.apache.commons.net.util.SubnetUtils.calculate(SubnetUtils.java:275)
at org.apache.commons.net.util.SubnetUtils.(SubnetUtils.java:62)
at org.fdroid.fdroid.net.WifiStateChangeService$WaitForWifiAsyncTask.doInBackground(WifiStateChangeService.java:89)
at org.fdroid.fdroid.net.WifiStateChangeService$WaitForWifiAsyncTask.doInBackground(WifiStateChangeService.java:70)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
... 4 more
java.lang.IllegalArgumentException: Could not parse [null/24]
at org.apache.commons.net.util.SubnetUtils.calculate(SubnetUtils.java:275)
at org.apache.commons.net.util.SubnetUtils.(SubnetUtils.java:62)
at org.fdroid.fdroid.net.WifiStateChangeService$WaitForWifiAsyncTask.doInBackground(WifiStateChangeService.java:89)
at org.fdroid.fdroid.net.WifiStateChangeService$WaitForWifiAsyncTask.doInBackground(WifiStateChangeService.java:70)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
---
app/src/main/java/org/fdroid/fdroid/FDroidApp.java | 4 +++-
.../java/org/fdroid/fdroid/net/WifiStateChangeService.java | 2 +-
2 files changed, 4 insertions(+), 2 deletions(-)
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/net/WifiStateChangeService.java b/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java
index dda912c58..bd624427d 100644
--- a/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java
+++ b/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java
@@ -53,7 +53,6 @@ public class WifiStateChangeService extends IntentService {
protected void onHandleIntent(Intent intent) {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST);
Utils.debugLog(TAG, "WiFi change service started, clearing info about wifi state until we have figured it out again.");
- FDroidApp.initWifiSettings();
NetworkInfo ni = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
int wifiState = wifiManager.getWifiState();
@@ -79,6 +78,7 @@ public class WifiStateChangeService extends IntentService {
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST);
try {
+ FDroidApp.initWifiSettings();
Utils.debugLog(TAG, "Checking wifi state (in background thread).");
WifiInfo wifiInfo = null;
From 23ab7046bc8faa283d22f7cff750d0d2870e3a70 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner
Date: Tue, 17 May 2016 23:49:33 +0200
Subject: [PATCH 3/8] parse APK for info in local repos
This parses the APKs for swapping, looking for what kinds of native code it
includes. This is used in the compatibility check.
closes #30 https://gitlab.com/fdroid/fdroidclient/issues/30
---
.../main/java/org/fdroid/fdroid/data/App.java | 28 +++++++++++++++----
.../fdroid/localrepo/LocalRepoManager.java | 9 ++++++
2 files changed, 32 insertions(+), 5 deletions(-)
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..0dbe7af02 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 {
@@ -113,7 +117,8 @@ public class App extends ValueObject implements Comparable {
return name.compareToIgnoreCase(app.name);
}
- public App() { }
+ public App() {
+ }
public App(Cursor cursor) {
@@ -274,20 +279,33 @@ public class App extends ValueObject implements Comparable {
this.name = (String) appInfo.loadLabel(pm);
- final SanitizedFile apkFile = SanitizedFile.knownSanitized(appInfo.publicSourceDir);
final Apk apk = new Apk();
apk.versionName = packageInfo.versionName;
apk.versionCode = packageInfo.versionCode;
- apk.hashType = "sha256";
- apk.hash = Utils.getBinaryHash(apkFile, apk.hashType);
apk.added = this.added;
apk.minSdkVersion = Utils.getMinSdkVersion(context, packageName);
apk.maxSdkVersion = Utils.getMaxSdkVersion(context, packageName);
apk.packageName = this.packageName;
- apk.installedFile = apkFile;
apk.permissions = Utils.CommaSeparatedList.make(packageInfo.requestedPermissions);
apk.apkName = apk.packageName + "_" + apk.versionCode + ".apk";
+ final SanitizedFile apkFile = SanitizedFile.knownSanitized(appInfo.publicSourceDir);
+ apk.hashType = "sha256";
+ apk.hash = Utils.getBinaryHash(apkFile, apk.hashType);
+ apk.installedFile = apkFile;
+
+ JarFile jarFile = new JarFile(apkFile);
+ HashSet abis = new HashSet<>(3);
+ Pattern pattern = Pattern.compile("^lib/([a-z0-9-]+)/.*");
+ for (Enumeration jarEntries = jarFile.entries(); jarEntries.hasMoreElements();) {
+ JarEntry jarEntry = jarEntries.nextElement();
+ Matcher matcher = pattern.matcher(jarEntry.getName());
+ if (matcher.matches()) {
+ abis.add(matcher.group(1));
+ }
+ }
+ apk.nativecode = Utils.CommaSeparatedList.make(abis.toArray(new String[abis.size()]));
+
final FeatureInfo[] features = packageInfo.reqFeatures;
if (features != null && features.length > 0) {
final String[] featureNames = new String[features.length];
diff --git a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java
index faccfd992..c8d9920ec 100644
--- a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java
+++ b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java
@@ -456,6 +456,7 @@ public final class LocalRepoManager {
tag("added", app.installedApk.added);
tagFeatures(app);
tagPermissions(app);
+ tagNativecode(app);
serializer.endTag("", "package");
}
@@ -485,6 +486,14 @@ public final class LocalRepoManager {
serializer.endTag("", "features");
}
+ private void tagNativecode(App app) throws IOException {
+ if (app.installedApk.nativecode != null) {
+ serializer.startTag("", "nativecode");
+ serializer.text(Utils.CommaSeparatedList.str(app.installedApk.nativecode));
+ serializer.endTag("", "nativecode");
+ }
+ }
+
private void tagHash(App app) throws IOException {
serializer.startTag("", "hash");
serializer.attribute("", "type", app.installedApk.hashType);
From 897ed989b1def4fab75111f9ca3800bca0f416ac Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner
Date: Wed, 18 May 2016 17:34:50 +0200
Subject: [PATCH 4/8] fixes #633 update download progress regression
When reworking this in 7f10be18c6dd0b69e2fdbae98d09b197e60af443, I confused
the "Processing" with the "Downloading", probably because I thought those
steps were combined, but they are not. Also, I forgot that Downloader
instances do not broadcast status. So its just a matter of setting up the
right ProgressListeners.
https://gitlab.com/fdroid/fdroidclient/issues/633
---
.../java/org/fdroid/fdroid/RepoUpdater.java | 7 ++
.../java/org/fdroid/fdroid/UpdateService.java | 92 +++++++++----------
2 files changed, 52 insertions(+), 47 deletions(-)
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);
+ }
+ });
+ }
}
From 2038b7e1cbf0b2f46851e63eb3e9e13f7e248bb4 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner
Date: Wed, 18 May 2016 15:00:25 +0200
Subject: [PATCH 5/8] only generate basic swap index.jar if none exists
Let's keep the index.jar around as a cache of parsed information.
LocalRepoManager.getApps() was totally unused
---
.../fdroid/fdroid/localrepo/LocalRepoManager.java | 11 +++++++----
.../fdroid/views/swap/SwapWorkflowActivity.java | 15 ++++-----------
2 files changed, 11 insertions(+), 15 deletions(-)
diff --git a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java
index c8d9920ec..d5bcc0c08 100644
--- a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java
+++ b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java
@@ -237,6 +237,13 @@ public final class LocalRepoManager {
}
}
+ /**
+ * Get the {@code index.jar} file that represents the local swap repo.
+ */
+ public File getIndexJar() {
+ return xmlIndexJar;
+ }
+
public void deleteRepo() {
deleteContents(repoDir);
}
@@ -277,10 +284,6 @@ public final class LocalRepoManager {
apps.put(packageName, app);
}
- public List getApps() {
- return new ArrayList<>(apps.keySet());
- }
-
public void copyIconsToRepo() {
ApplicationInfo appInfo;
for (final App app : apps.values()) {
diff --git a/app/src/main/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java b/app/src/main/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java
index 6062d643e..d789ac7d0 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java
@@ -376,7 +376,10 @@ public class SwapWorkflowActivity extends AppCompatActivity {
getService().swapWith(null);
if (!getService().isEnabled()) {
- prepareInitialRepo();
+ if (!LocalRepoManager.get(this).getIndexJar().exists()) {
+ Utils.debugLog(TAG, "Preparing initial repo with only F-Droid, until we have allowed the user to configure their own repo.");
+ new PrepareInitialSwapRepo().execute();
+ }
}
inflateInnerView(R.layout.swap_blank);
@@ -452,16 +455,6 @@ public class SwapWorkflowActivity extends AppCompatActivity {
}
}
- private void prepareInitialRepo() {
- // TODO: Make it so that this and updateSwappableAppsTask (the _real_ swap repo task)
- // don't stomp on eachothers toes. The other one should wait for this to finish, or cancel
- // this, but this should never take precedence over the other.
- // TODO: Also don't allow this to run multiple times (e.g. if a user keeps navigating back
- // to the main screen.
- Utils.debugLog(TAG, "Preparing initial repo with only F-Droid, until we have allowed the user to configure their own repo.");
- new PrepareInitialSwapRepo().execute();
- }
-
/**
* Once the UpdateAsyncTask has finished preparing our repository index, we can
* show the next screen to the user. This will be one of two things:
From 507f17e19ee99812fe67cdf49c97a7c0617c3179 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner
Date: Tue, 17 May 2016 16:23:59 +0200
Subject: [PATCH 6/8] always set App.icon when instantiating from installed app
The App(Context context, PackageManager pm, String packageName) constructor
was not setting App.icon, which is required for lots of things. This makes
it always get set, since its just a standard file name, and it does not
have to even exist yet.
---
app/src/main/java/org/fdroid/fdroid/data/App.java | 5 +++++
.../java/org/fdroid/fdroid/localrepo/LocalRepoManager.java | 5 +----
2 files changed, 6 insertions(+), 4 deletions(-)
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 0dbe7af02..e53460ab3 100644
--- a/app/src/main/java/org/fdroid/fdroid/data/App.java
+++ b/app/src/main/java/org/fdroid/fdroid/data/App.java
@@ -112,6 +112,10 @@ public class App extends ValueObject implements Comparable {
public boolean uninstallable;
+ public static String getIconName(String packageName, int versionCode) {
+ return packageName + "_" + versionCode + ".png";
+ }
+
@Override
public int compareTo(App app) {
return name.compareToIgnoreCase(app.name);
@@ -278,6 +282,7 @@ public class App extends ValueObject implements Comparable {
+ ", last updated on " + this.lastUpdated + ")
";
this.name = (String) appInfo.loadLabel(pm);
+ this.icon = getIconName(packageName, packageInfo.versionCode);
final Apk apk = new Apk();
apk.versionName = packageInfo.versionName;
diff --git a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java
index d5bcc0c08..f45a92656 100644
--- a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java
+++ b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java
@@ -3,7 +3,6 @@ package org.fdroid.fdroid.localrepo;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
@@ -274,8 +273,6 @@ public final class LocalRepoManager {
if (!app.isValid()) {
return;
}
- PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_META_DATA);
- app.icon = getIconFile(packageName, packageInfo.versionCode).getName();
} catch (PackageManager.NameNotFoundException | CertificateEncodingException | IOException e) {
Log.e(TAG, "Error adding app to local repo", e);
return;
@@ -324,7 +321,7 @@ public final class LocalRepoManager {
}
private File getIconFile(String packageName, int versionCode) {
- return new File(iconsDir, packageName + "_" + versionCode + ".png");
+ return new File(iconsDir, App.getIconName(packageName, versionCode));
}
/**
From c862eb0bd3a0bead563f7a52b1a0ca61967f11d9 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner
Date: Wed, 18 May 2016 20:03:08 +0200
Subject: [PATCH 7/8] safely handle nulls that start InstallManagerService
For some odd reason, something is sending a URL to be downloaded that then
results in a null Apk instance. My first guess was because it was being
canceled, but the interrupted receiver is not even registered yet. My
second thought is that something is sending a download and cancel Intent at
the same time. In any case, its something to keep in mind when reworking
InstallManagerService once InstallerService comes along.
closes #660 https://gitlab.com/fdroid/fdroidclient/issues/660
---
.../fdroid/installer/InstallManagerService.java | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
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 4c65692e0..322f8ab0e 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
@@ -15,7 +15,7 @@ import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
-import android.util.Log;
+import android.widget.Toast;
import org.fdroid.fdroid.AppDetails;
import org.fdroid.fdroid.R;
@@ -135,12 +135,23 @@ public class InstallManagerService extends Service {
Utils.debugLog(TAG, "onStartCommand " + intent);
if (!ACTION_INSTALL.equals(intent.getAction())) {
- Log.i(TAG, "Ignoring " + intent + " as it is not an " + ACTION_INSTALL + " intent");
+ Utils.debugLog(TAG, "Ignoring " + intent + " as it is not an " + ACTION_INSTALL + " intent");
return START_NOT_STICKY;
}
String urlString = intent.getDataString();
+ if (TextUtils.isEmpty(urlString)) {
+ Utils.debugLog(TAG, "empty urlString, nothing to do");
+ return START_NOT_STICKY;
+ }
+
Apk apk = ACTIVE_APKS.get(urlString);
+ if (apk == null) {
+ Utils.debugLog(TAG, urlString + " is not in ACTIVE_APKS, why are we trying to download it?");
+ Toast.makeText(this, urlString + " failed with an imcomplete download request!",
+ Toast.LENGTH_LONG).show();
+ return START_NOT_STICKY;
+ }
Notification notification = createNotification(intent.getDataString(), apk).build();
notificationManager.notify(urlString.hashCode(), notification);
From 2c017e158d09e9ec633f3e8fc1fb85fd8caa3eb1 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner
Date: Thu, 19 May 2016 10:48:17 +0200
Subject: [PATCH 8/8] gitlab-ci: connected10 does not mark build as failed
The connected10 build is not yet stable, and it has odd crashes. So it
should not affect the overall success/fail marking. For example:
https://gitlab.com/eighthave/fdroidclient/builds/1430790
---
.gitlab-ci.yml | 1 +
1 file changed, 1 insertion(+)
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: