This adds requirements before an app is shown on the Latest tab. It must
have all of these:
* name
* summary
* description
* license
* What's New entry
* at least some text localized
And then it must have at least one of these:
* screenshots
* feature graphic
The problem here is that oftentimes, the index fetch will happen
automatically in the background while the user is in a different app. If
the fetch fails, the warning text changed here is displayed as a toast,
but without this change there's no way to tell that it's coming from
F-Droid.
* Rename ids to something meaningful
* Remove inner layouts from constraint layout
* Use same text and button styles
* Make sure the background image doesn't overlap with the text
This also needs to handle mirror lists with 1 element, since mirrors can
now be disabled. If the user disables all mirrors, then there will be only one URL in the
list of mirrors. Asking for a random mirror in that case should not return
null, but the one enabled mirror.
closes#1696
This spreads downloads across all available mirrors randomly. This could
definitely be improved, like choosing the fastest or nearest mirror, or
only .onion addresses on Tor. This will improve the current situation and
should reduce the load on f-droid.org a lot.
fdroidclient#1696
Remove unused code and simplify to only present args that are used. This is
remnants from:
fdroidclient#490
fdroidclient#606
fdroidclient!295
fdroidclient!242
Lots of people complain that the graphics aren't being downloaded. That's
because they never use F-Droid while on WiFi and the default prefs do not
allow downloading graphics while on Data. This sets the preference to
allow downloading graphics while on Data if only Data is enabled, and not
WiFi, when the user first starts F-Droid.
closes#1592
This makes it display nicely in RepoDetails, and is natural, since it is
the canonical URL. This also maintains the order as received from the
mirror entries in the index file.
The Read Timeout makes a SocketTimeoutException be thrown if the timeout
expires before data is available for reading from the connection's
returned InputStream. This should help the client switch to a new mirror
when the current mirror is too slow or overloaded.
This should make the timeout logic clearer, without changing the logic at
all. This does increase the timeouts, with the second pass using 1 minute
instead of 30 seconds, and the third pass using 10 minutes instead of 1
minute. Since this often or usually runs in the background, it should
allow some pretty long timeouts in the worst case.
Compression seems to just give stacktraces:
HttpDownloaderTest I URL: https://en.wikipedia.org/wiki/Index.html
TestRunner I failed: downloadUninterruptedTest(org.fdroid.fdroid.net.HttpDownloaderTest)
I ----- begin exception -----
I java.io.EOFException
I at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:206)
I at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:98)
I at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
I at libcore.net.http.HttpEngine.initContentStream(HttpEngine.java:541)
I at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:844)
I at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283)
I at libcore.net.http.HttpURLConnectionImpl.getHeaderField(HttpURLConnectionImpl.java:139)
I at libcore.net.http.HttpsURLConnectionImpl.getHeaderField(HttpsURLConnectionImpl.java:246)
I at org.fdroid.fdroid.net.HttpDownloader.download(HttpDownloader.java:111)
I at org.fdroid.fdroid.net.HttpDownloaderTest.downloadUninterruptedTest(HttpDownloaderTest.java:74)
I at java.lang.reflect.Method.invokeNative(Native Method)
I at java.lang.reflect.Method.invoke(Method.java:511)
I at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
I at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
I at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
I at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
I at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
I at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
I at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
I at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
I at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
I at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
I at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
I at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
I at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
I at org.junit.runners.Suite.runChild(Suite.java:128)
I at org.junit.runners.Suite.runChild(Suite.java:27)
I at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
I at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
I at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
I at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
I at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
I at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
I at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
I at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
I at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
I at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:384)
I at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661)
This is insurance to make sure that packageNames are not abused for
exploiting F-Droid. The database queries already use SQL Prepared
Statements, but who know what else might be exploitable.
fdroid/fdroidclient#1588
Keep PRNGFixes as it is since it is security sensitive, standardized
code from Google. While F-Droid never wants to do anything with
hardware IDs at all, this code uses the Build.SERIAL as a seed for the
random number generator, so it is safe privacy-wise.
The query was trying to figure out some thing about suggestedVercode
which shouldn't at all be necessary for setting the iconUrl.
The index already contains the icon pointing to the suggested version by
that repository, so we just take that regardless.
For many languages, there are unavoidable long words needed for the labels
on the button bar, for example, the standard word for Settings can be up to
15 characters long:
https://gitlab.com/fdroid/fdroidclient/issues/1569#note_126469088
The BottomBar was scaling the active one up, and sizing all the fields based
on that size. This removes that animation, and sets all tabs to always have
the same text size. That makes it possible to make the spacing tighter.
This also sets the text truncating mode to "middle" which sticks an elipsis
in the middle of the truncated word and shows the start and end.
closes#1569closes!756
This adds a new IntentService to pre-process Intents that request a
new repo is added. Right now, this only handles Intents that come
from the new storage scanners.
This also adds a new case to the AddRepo UI logic to cover when an
incoming Intent is for a mirror that is already included in an enabled
repo. In that case, the user is show the Repo Details screen for the
repo that includes that mirror. This is done is a hacky way right now
since the only path through is to click the button. So this clicks
the button in code.