98 Commits

Author SHA1 Message Date
Peter Serwylo
e56d604d6f Only cleanup receivers, don't reset the UI when in onDestroy().
When an Activity is destroyed, the next time it is created should
reinitialize all of the UI stuff again. Thus, there is no point to
clearing up the UI state before leaving. More importantly, this was
causing a problem when navigating back and forth through activities
via the downloader service notifications:

```
E  java.lang.RuntimeException: Unable to destroy activity {org.fdroid.fdroid/org.fdroid.fdroid.AppDetails}: java.lang.IllegalStateException: activity is already destroyed
...
E  Caused by: java.lang.IllegalStateException: activity is already destroyed
E      at android.nfc.NfcActivityManager$NfcActivityState.<init>(NfcActivityManager.java:126)
E      at android.nfc.NfcActivityManager.getActivityState(NfcActivityManager.java:176)
E      at android.nfc.NfcActivityManager.setNdefPushContentUri(NfcActivityManager.java:252)
E      at android.nfc.NfcAdapter.setBeamPushUris(NfcAdapter.java:830)
E      at org.fdroid.fdroid.NfcHelper.disableAndroidBeam(NfcHelper.java:68)
E      at org.fdroid.fdroid.AppDetails$AppDetailsHeaderFragment.updateViews(AppDetails.java:1507)
E      at org.fdroid.fdroid.AppDetails$AppDetailsHeaderFragment.updateViews(AppDetails.java:1490)
E      at org.fdroid.fdroid.AppDetails$AppDetailsHeaderFragment.removeProgress(AppDetails.java:1473)
E      at org.fdroid.fdroid.AppDetails.cleanUpFinishedDownload(AppDetails.java:442)
E      at org.fdroid.fdroid.AppDetails.onDestroy(AppDetails.java:567)
E      at android.app.Activity.performDestroy(Activity.java:6169)
E      at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1141)
E      at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3726)
E      ... 10 more
```

This is related to `onDestroy` calling a method which ends up calling
UI related stuff that assumes the `Activity` is around to interact with.
2016-04-23 00:02:15 +10:00
Peter Serwylo
8794611b26 DownloadCompleteService uses same notification code as DownloadService.
Both classes required the same type of notification intent to be
created, so they now both use the same static function to create
the relevant intent.
2016-04-23 00:02:14 +10:00
Peter Serwylo
0163d6efa6 Add PendingIntent for notification in DownloaderService.
Fixes #625, as devices pre 4.0 require such `PendingIntent`s to
be passed to the notificaitons `setContentIntent` method. As the
`DownloaderService` handles both apks and repo updates, the pending
intent will either point to the relevant `AppDetails` screen for
an apk download - or the main F-Droid activity if it is any other
sort of download (i.e. a repo update download).
2016-04-23 00:02:11 +10:00
Peter Serwylo
3f9881a6f5 Fix if condition which was always true.
I suspect this is the expected behaviour, seeing as this service
handles downloads for both Apks and repo indices.
2016-04-21 13:26:03 +10:00
Peter Serwylo
8ce4cad7ef Merge branch 'dup-strings' into 'master'
Removed duplicate string resource for string ("Swap apps")

Removed duplicate string resource for string ("Swap apps")

See merge request !264
2016-04-20 22:58:35 +00:00
Paresh Chouhan
45313c6234 Removed duplicate string resource for string ("Swap apps") 2016-04-21 00:55:23 +05:30
Daniel Martí
b7a5c6d201 Get rid of the last java vercode name
Last of its series. Closes #37.
2016-04-19 22:44:22 +01:00
Daniel Martí
865d537745 Rename Repo's pubkey to signingCertificate
Updates #37.
2016-04-19 22:44:22 +01:00
Daniel Martí
0ec9689a6c Rename App's suggestedVersion to suggestedVersionName 2016-04-19 22:44:22 +01:00
Daniel Martí
550f04cc8b Rename App's upstream vars to VersionCode/Name
Updates #37.
2016-04-19 22:44:22 +01:00
Daniel Martí
cde57efb98 Rename App.suggestedVercode to App.suggestedVersionCode
Updates #37.
2016-04-19 22:44:22 +01:00
Daniel Martí
4d8e410176 Rename Apk.version to Apk.versionName
Updates #37.
2016-04-19 22:44:22 +01:00
Daniel Martí
1abbedc4ab Rename Apk.vercode to Apk.versionCode
Updates #37.
2016-04-19 22:44:22 +01:00
Daniel Martí
ac22cc5266 Bump to 0.100-alpha4 2016-04-17 11:02:40 +01:00
F-Droid Translatebot
ca3e13ebf6 Pull translation updates from Weblate
Translators:

Adrià García-Alzórriz    Catalan
ageru                    French
Alberto Moshpirit        Spanish
Allan Nordhøy            Norwegian Bokmål
Enol P                   Asturian
ezjerry liao             Traditional Chinese
Green Lunar              Hebrew
Kristoffer Grundström    Swedish
Ldm Public               French
Marcelo Santana          Portuguese (Brazil)
Mladen Pejaković         Serbian
naofum                   Japanese
Pander                   Dutch
Sérgio Marques           Portuguese (Portugal)
Tobias Bannert           German
Verdulo                  Esperanto
Verdulo                  Polish
Yaron Shahrabani         Hebrew
YFdyh000                 Simplified Chinese
2016-04-17 11:00:38 +01:00
Peter Serwylo
6d603ada0d Show progress bar in download notification.
By providing the same notification id, the existing one is updated.
2016-04-17 09:10:22 +10:00
Daniel Martí
132519590f Bump accesspoint library to 0.2.0
This release allows for Android 6+ support, but we'll need to ask for
permissions at runtime too. This commit simply does one half of the work
needed to support Android 6 with all things wi-fi.

See the issue and example app commit for reference:

https://github.com/mvdan/accesspoint/issues/6
6284f0376b
2016-04-14 15:31:47 +01:00
Daniel Martí
27c9a21764 Gradle: Bump android plugin to 2.0.0
Also add useProgard true, since minifyEnabled now refers to the new
experimental code shrinker.

I'm not removing proguard yet as we depend on it for the samsung
workaround. I also do not know how to port the rest of the config
options to the new shrinker.
2016-04-14 15:31:47 +01:00
Daniel Martí
127c65b78d Bump support libs to 23.3.0
Also bump the CI image to include the updated support lib maven repo.
2016-04-14 15:31:47 +01:00
Daniel Martí
db798afb67 PMD: Do all java files like checkstyle
Not just the org.fdroid.* classes. No changes needed.
2016-04-14 15:31:47 +01:00
Daniel Martí
158668f378 Merge branch 'new-downloader-service' into 'master'
New DownloaderService

This merge request is too big, but I have all this work complete, so I'm submitting it now for review.  If there are bigger issues with parts, I can rebase it down to the uncontroversial bits to get things merged.

This replaces `ApkDownloader`, `AsyncDownload`, and `AsyncDownloadWrapper`, and puts the whole APK download procedure into a custom `Service` that is based on the source code for `IntentService`.  It can't be a subclass of `IntentService` because it needs to be cancelable.  This does not yet add back a notification for the downloading, e.g. #592.  That was handled before by the Android DownloadManager stuff, and was not replaced since that was disabled.

My current implementation does not filter out duplicate requests like discussed in #601.  While its possible to do, I think it'll complicate the code a lot, and I really think that should be handled elsewhere.  The UI should prevent the possibility of the user being able to submit duplicate install requests.  If not, even if `DownloaderService` filtered them out, it would still be a buggy UX since the user would be clicking install again or something like that even though the install was in progress.

This also moves the APK verification logic to the `Installer` side.  The downloading side can check the file size to see if the whole thing is downloaded.  And to be extra safe, it should not be possible to submit an APK for installation without it going through the verification procedure.  So the only method for installing APKs, `Installer.install()`, is where the verification now happens.   Also, the installer now always copies the APK to be installed into the safe location RE: the Cure53 audit issue.  This way, the APK download and cache dirs can be merged into one, making resumable downloads and cache management easy.

ping @mvdan @pserwylo @dschuermann 
more comments in the commit messages

See merge request !248
2016-04-14 14:00:06 +00:00
Daniel Martí
44f39793be Merge branch 'issue-490' into 'master'
Fix Cursor initialization deprecation

Closes Issue #490, Avoids usage of `deprecated` constructors and suppresses deprecation warnings.

See merge request !242
2016-04-14 13:58:10 +00:00
Hans-Christoph Steiner
74d1c9521d put up a notification for each completed download
This makes background installs and updates a lot easier
2016-04-13 11:08:54 -04:00
Hans-Christoph Steiner
d114f428e7 add "Auto Download" pref to enable auto-downloading of updates
Now that we have a nice background service, let's put it to work!  This
makes update APKs be automatically downloaded after the index is updated.
Then when the user goes to install the updates, they will not have to wait
for the download part.

#601 https://gitlab.com/fdroid/fdroidclient/issues/601
2016-04-13 11:07:17 -04:00
Hans-Christoph Steiner
adcdc417ab add basic in progress Notification to DownloaderService
This is super basic, really just a placeholder to have something there. It
should be replaced with something much better as part of the UX overhaul.

#601 https://gitlab.com/fdroid/fdroidclient/issues/601
2016-04-13 11:07:17 -04:00
Hans-Christoph Steiner
77e041d640 put stray preference handling into Preferences
This moves a few stray preference handling instances into Preferences, and
move the non-preference "lastUpdateCheck" state to local only to
UpdateService.  This will still work with existing installs since the
String constant value is the same.
2016-04-13 11:07:17 -04:00
Hans-Christoph Steiner
721d4a300a add method to check if a URL is being handled by DownloaderService
This also saves the activeDownloadUrlString per packageName. Both are
necessary so that AppDetails can accurately display the current state
of a background download. Saving this per-packageName allows there to
be multiple active downloads in the background, then when people move
around AppDetails, it'll restore the progress meter and button state
when coming back to the app that they clicked install on.

By definition, there is just one DownloaderService enforced by
Android with a single active Downloader instance enforced by the
DownloaderService.  That means using a static variable maps directly
to those conditions and provides a really simple, implementation,
especially compared to what would have to happen to do it via messages
from the thread and any Activities.  If this ends up blocking testing
or something, it can always be changed when someone implements those
tests.
2016-04-13 11:07:17 -04:00
Hans-Christoph Steiner
49635c224d show download errors in a Toast
There are many possible cryptic errors that can cause downloads to fail. So
just show the localized message from the Exception in an extended Toast.
These might not show up until AppDetails works better with the lifecycle of
downloads, but they are being sent :)

closes #496 https://gitlab.com/fdroid/fdroidclient/issues/496
closes #594 https://gitlab.com/fdroid/fdroidclient/issues/594
closes #599 https://gitlab.com/fdroid/fdroidclient/issues/599
2016-04-13 11:07:17 -04:00
Hans-Christoph Steiner
3265c8634c implement resumable APK downloads for HttpDownloader
Moving towards having the Downloader always download directly into the
cache means its really easy to support resuming downloads.

This should also work for updates and icons, since it fetches the
Content Length via HTTP first.  The icon and update downloading code
needs to be adjusted to support that. For APKs, it probably makes
sense to include the file size from the index db to save the query
over the net.  That would be probably more helpful on Bluetooth.
2016-04-13 11:07:17 -04:00
Hans-Christoph Steiner
fa766180bf download APKs into dir named after repo's hostname
This is to prevent conflicts if two repos have APKs with the same names,
but are not the same app/version.
2016-04-13 11:07:17 -04:00
Hans-Christoph Steiner
ee37f26c4d verify APKs on install, and purge ApkDownloader
This moves the last piece of code to the DownloaderService model. Moving
the APK prep and verification to Installer.installPackage() makes it hard
to mess up and make bugs like installing from the External Storage issue
found by the Cure53 audit.
2016-04-13 11:07:17 -04:00
Hans-Christoph Steiner
d07c8b5d74 convert Installer's Exception into generic InstallFailedException
AndroidNotCompatibleException is not used for anything specific right now,
and in the process of adding verification to the start of the install
process, there will be other kinds of failures. So convert that Exception
into a general usage InstallFailedException.
2016-04-13 10:40:01 -04:00
Hans-Christoph Steiner
0b8796e56f add AndroidManifest parser for reading directly from APKs
This will make our algorithm choices a lot more flexible both in terms of
the Installer process and the swap repo process.
2016-04-13 10:40:01 -04:00
Hans-Christoph Steiner
fc9459d6c5 send Downloader progress on a 100 ms timer
No need to flood receivers with progress events since they are basically
always going to the UI, and the UI will only refresh every so often.  If
the refresh rate is 50Hz, then that's every 20ms.  100ms seems to make a
smooth enough progress bar, and saves some CPU time.  This becomes more
important if there are multiple downloads happening in the background, like
if we make DownloaderService support parallel downloads from different repos
2016-04-13 10:40:01 -04:00
Hans-Christoph Steiner
5e59f812ce port everything over to new Downloader.ACTION_PROGRESS
This replaces all of the previous progress events and listeners.
2016-04-13 10:40:01 -04:00
Hans-Christoph Steiner
2e3d2c84ae eliminate Interfaces used only internal to AppDetails class
When dealing with complex lifecycles like Fragments, it is important
to expose the reliance of the Fragment on the Activity, since they
have different lifecycles.

Just cast to AppDetails instead of adding complexity with unneeded
Interfaces.  The actual instance and class will be the same with or
without the Interfaces, so it does not help with lifecycle issues.
The methods that implement the interfaces only hide the fact that they
rely on an active instance of AppDetails, which can lead to
lifecycle-related crashes.

This is a step along the way to streamlining AppDetails Activity so that it
only uses Fragments when they are beneficial.
2016-04-13 10:40:01 -04:00
Hans-Christoph Steiner
20c66a825d use IntentService style to download all APKs via a queue
DownloaderService is based on IntentService to provide queued requests that
run in a background thread via the Handler and the HandlerThread.  It began
as the IntentService code, but it could not be a subclass because the
downloading needs to be cancelable.  IntentServices cannot be canceled and
they provide no visibility into their queue.

DownloaderService then announces relevant events via LocalBroadcastManager
and Intents with custom "action" Strings.

https://gitlab.com/fdroid/fdroidclient/issues/601 #601
2016-04-13 10:40:01 -04:00
Daniel Martí
d98d59a8d3 Merge branch 'check-privileged-certificate' into 'master'
Verify apk signature of privileged extension before installation

This implements a check that the signature of the extension apk is the same as the signature of F-Droid before installing the extension apk. Related issue: https://gitlab.com/fdroid/fdroidclient/issues/437

See merge request !256
2016-04-13 11:50:54 +00:00
Dominik Schürmann
15ec420db4 Check apk signature of privileged extension against F-Droid signature before installation 2016-04-13 13:35:48 +02:00
F-Droid Translatebot
f8ef7cda39 Pull translation updates from Weblate
Translators:

ezjerry liao    Traditional Chinese
Lev Lamberov    Russian
2016-04-13 09:54:01 +01:00
Hans-Christoph Steiner
ed09b1af2d run UpdateService at lowest priority possible
Currently, UpdateService is running at default priority, which is the same
as the UI tasks, since it is a regular IntentService.  That means it would
put a noticable load on the device when running, especially on older
devices.  This should help with that.

#563 https://gitlab.com/fdroid/fdroidclient/issues/563
2016-04-11 11:26:21 -04:00
Hans-Christoph Steiner
22e40bfee1 port all but Provider tests to JUnit4 semantics
Android recently switched from JUnit 3 to 4 for its base testing classes.
It doesn't seem to support the old JUnit3 methods with gradle and AS. So
all the tests need to be ported to JUnit4 to work again.

#607 https://gitlab.com/fdroid/fdroidclient/issues/607
2016-04-11 11:26:21 -04:00
Hans-Christoph Steiner
6b3004160f HttpDownloaderTest: delete test files only if test succeeds
This helps with debugging. And since these tests run on the JVM,
deleteOnExit() actually works.
2016-04-11 11:26:21 -04:00
Hans-Christoph Steiner
eb93a38cf5 HttpDownloader: handle SSL errors like any other download error
Since SSLHandshakeException is a subclass of IOException, and all that is
happening is rethrowing an Exception, instead pass this one through so it
will be handled by the central Downloader error handling.  That's currently
just a Toast, but it can easily be expanded in the future.
2016-04-11 11:26:21 -04:00
Hans-Christoph Steiner
b86a30d40f fix expert mode version display when maxSdkVersion is MAX_VALUE
closes #616 https://gitlab.com/fdroid/fdroidclient/issues/616
2016-04-11 11:26:21 -04:00
Hans-Christoph Steiner
c4a1295095 move Theme handling to Preferences class
This is one of the last instances of direct SharedPreferences manipulation
in the code.  Moving it to Preferences like the rest.
2016-04-11 10:38:59 -04:00
Daniel Martí
230c06d536 Bump to 0.100-alpha3 2016-04-08 10:27:58 +01:00
Hans-Christoph Steiner
907507d27d Merge branch 'transition-v21' into 'master'
Shared element transition for app list item v21 and above

Shared element transitions for API level v21 and above  
![JJhZVJh](/uploads/05ff326b69176e2e793cd17dca63637f/JJhZVJh.gif)

See merge request !251
2016-04-06 09:00:54 +00:00
Paresh Chouhan
cdd0848927 Shared element transition for app list item v21 and above 2016-04-05 22:45:51 +05:30
Hans-Christoph Steiner
35c2ef8c1c re-add SNI support to guardianproject.info repo
Apparently, it uses SNI, but does not always fail without SNI support.
2016-04-05 13:06:25 +02:00