3846 Commits

Author SHA1 Message Date
Peter Serwylo
fd50a2c730 Remove unused code.
The code only existed so that it could be used in a test. Subsequently,
a further test was written to test this code (used by the first test).
Since none of the code is actually used in the app, it has been removed.
2016-08-11 23:02:59 +10:00
Daniel Martí
3f352ae83f Merge branch 'fix-511--rename-app-table' into 'master'
Renamed AppTable to AppMetadataTable

See #511 for details. This is in prep ration for having an even more normalized `fdroid_package` table. That table will be the authoritative reference of what "packages" are known about in the client. The "app" table (now "metadata") will be specific to each repository which provides different metadata about that app.

This is a fairly straightforward "Rename Interface" refactoring from Android Studio" and is done so as to minimize the diff in a forthcoming MR.

See merge request !373
2016-08-11 11:28:06 +00:00
Peter Serwylo
626f55b43b Renamed AppTable to AppMetadataTable
See #511 for details. This is in prepration for having an even more normalized
`fdroid_package` table. That table will be the authoritative reference of what
"packages" are known about in the client. The "app" table (now thought of as "app metadata") will
be specific to each repository which provides different metadata about that app.
2016-08-11 16:34:26 +10:00
Dominik Schürmann
9235462e34 Tests for ApkVerifier 2016-08-09 22:26:39 +02:00
Hans-Christoph Steiner
2837a235b4 Merge branch 'fix-511--move-user-specified-data-to-separate-table' into 'master'
Move user specified data to separate table

Right now, the "Ignore update for version X" and "Ignore all updates for this app" are stored in `fdroid_app`. This means that if a repo is disabled then re-enabled, these preferences are lost. This MR separates out the user specified metadata from the metadata provided by the repository, such that one can change without affecting the other.

For convenience sake, this drops the `fdroid_app` and `fdroid_apk` tables rather than migrating them, and then sets a flag in preferences that forces F-Droid to do an index update when started. This is done _after_ migrating already existing user preferences out of `fdroid_app` and into `fdroid_appPrefs`.

See merge request !372
2016-08-08 08:59:40 +00:00
Peter Serwylo
203bcda695 Cleanup in response to CR comments 2016-08-04 21:35:46 +10:00
Peter Serwylo
bb88be9403 Further tests for AppPrefs.equals() which is used by AppDetails. 2016-08-04 11:15:42 +10:00
Peter Serwylo
9637de5e4c Make ignored app tests actually test code in use.
The test was using a `findIgnored` method in `AppProvider`, which only
existed for the purpose of testing. The test has been changed to instead
check for apps which would end up in the "can update" list (which is really
where the "ignored" apps are useful).
2016-08-04 09:53:25 +10:00
Peter Serwylo
125acd6276 Migrate app preferences to different table.
In the process, realised that using appId as a foreign key is worse than
packageName, because appId can get removed and added again, but it will
be different when the same app is inserted a second time. In order to
maintain the association of which apps have preferences stored against
them, they need to be stored against something with a bit more semantic
meaning. Thus, join onto package name instead.
db-version/60
2016-08-04 09:53:25 +10:00
Peter Serwylo
4b5481b8f2 Appese checkstyle + pmd 2016-08-04 09:53:25 +10:00
Peter Serwylo
5e263c0e0f Use "COALESCE(x, 0)" instead of "x = 0 OR x IS NULL"
This is a more concise syntax to say the same thing, and avoids an
OR clause in the where - which is often the cause of slowness in
many queries. Not sure if it was problematic in these cases, however
this COALESCE syntax is still more consise.
2016-08-04 09:53:25 +10:00
Peter Serwylo
004c86bc42 Notify content observers correctly 2016-08-04 09:53:25 +10:00
Peter Serwylo
903048ffe4 Add covering indexes for main queries.
With no indexes at all, a join between X and Y tables would require a full
table scan of Y for each row in X. With an index on the relevant field in
Y, it would require an index lookup on the join field in Y for each row in
X, which contains a pointer to the row of interest in Y. This row is then
looked up and the relevant value extracted. By using a covering index (one
which includes all fields required to satisfy the query, with the first field
being the one which is looked up in the join), then once the index has been
searched, there is no need to then go to table Y because all the relevant
data is already in the index.

This offers a marginal performance improvement.
2016-08-04 09:53:25 +10:00
Peter Serwylo
3e3af3bbf3 Completely removed preferences from app table. 2016-08-04 09:53:25 +10:00
Peter Serwylo
d47967e03d Added new table to store user preferences.
Haven't yet migrated data from the old location in the app table yet.
2016-08-04 09:53:25 +10:00
Daniel Martí
3c5f8756f4 Bump to 0.101-alpha4 v0.101-alpha4 2016-08-02 11:25:30 +02:00
Daniel Martí
ba51536b88 Merge branch 'move-priv-extension' into 'master'
Move Privileged Extension to separate repo

Removes all files of the Privileged Extension app except the aidl files.

See merge request !371
2016-08-02 09:24:31 +00:00
Dominik Schürmann
0fd1d5ae4c Move Privileged Extension to separate repo 2016-08-01 23:02:57 +02:00
Daniel Martí
d24f1034f4 Merge branch 'bumps' into 'master'
Various minor version bumps



See merge request !370
2016-08-01 06:07:38 +00:00
Daniel Martí
3726b2b7fa gradle: bump support libs to 24.1.1
Minor bugfix release.

Also bump the CI image with the new stuff.
2016-08-01 00:59:24 +02:00
Daniel Martí
c61a055ea8 Merge branch 'install-receiver' into 'master'
Merge download broadcast receivers

Previously, for all 4 states broadcast receivers were registered separately. These have now been merged into one receiver. IMHO this makes the code more readable and structured.

See merge request !368
2016-07-31 17:08:56 +00:00
Daniel Martí
d41cfe85d6 gradle: bump buildToolsVersion to 24.0.1 2016-07-31 18:40:06 +02:00
Daniel Martí
217bde1290 gradle: bump checkstyle, robolectric and PMD versions
All minor bugfix releases.
2016-07-31 16:41:25 +02:00
Daniel Martí
59c25dd998 Merge branch 'fallback-install' into 'master'
Use AOSP Installer if permission check fails

If the old repo index is used and the permission check fails in ApkVerifier, this allows a fallback to the AOSP DefaultInstaller to show all permissions.
This has been discussed in https://gitlab.com/fdroid/fdroidclient/issues/704

Unfortunately, this shows our permission screen before download and then afterwards when the ``ApkVerifier`` fails the permission screen of the AOSP DefaultInstaller, i.e., the user sees two permission screen which she needs to acknowledge. This should only happen if an old repo format is used, thus I think this is okay. I don't know of any other solution to this problem.

See merge request !369
2016-07-31 14:20:00 +00:00
Dominik Schürmann
bfcc706167 Use AOSP Installer if permission check fails
If the old repo index is used and the
permission check fails in ApkVerifier
fallback to the AOSP DefaultInstaller
to show all permissions.
2016-07-29 18:16:00 +02:00
Dominik Schürmann
a442d539e4 Merge download broadcast receivers
Previously, for all 4 states broadcast receivers were registered
separately. These have now been merged into one receiver.
2016-07-29 01:56:49 +02:00
Dominik Schürmann
19a033db32 Use integers for SDK checks
More consistent with other checks as
introduced in e021eb5c
2016-07-29 01:30:52 +02:00
Peter Serwylo
a31fb068ae Merge remote-tracking branch 'dschuermann/fix-2.3-install' 2016-07-28 11:58:19 +10:00
Dominik Schürmann
318f95b51e Fix install on Android 2.3
Cause: setType clears previously setUri.

Fixes #718
2016-07-27 16:23:26 +02:00
Peter Serwylo
f4de353900 Merge branch 'fix-installer-NPE' into 'master'
Make App and Apk parcelable and fix related installer NPEs

Installations fails currently due to
```
  885                    ACRA  E  Caused by: java.lang.NullPointerException
  885                    ACRA  E  at org.fdroid.fdroid.installer.InstallManagerService.getAppName(InstallManagerService.java:327)
  885                    ACRA  E  at org.fdroid.fdroid.installer.InstallManagerService.createNotificationBuilder(InstallManagerService.java:318)
  885                    ACRA  E  at org.fdroid.fdroid.installer.InstallManagerService.onStartCommand(InstallManagerService.java:158)
  885                    ACRA  E  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2039)
  885                    ACRA  E  ... 10 more
```

This bug has been introduced in https://gitlab.com/fdroid/fdroidclient/merge_requests/359 where the packageName has been removed from the toContentValues() method.

The usage of ContentValues to send App/Apk objects to services was an hack in my opinion.
Thus, this PRs introduces proper parceling of App and Apk classes.

@pserwylo @eighthave @mvdan 

See merge request !362
2016-07-26 21:27:53 +00:00
Dominik Schürmann
2e92dc941b Use App/Apk parceling instead of ContentVals
The usage of ContentValues to send App/Apk objects
to services was an hack in my opinion.
This hack broke in https://gitlab.com/fdroid/fdroidclient/merge_requests/359
where the packageName has been removed from the
toContentValues() method, which leads to NPEs in
the services.
2016-07-25 17:50:28 +02:00
Dominik Schürmann
321842836c Make App and Apk classes really Parcelable 2016-07-25 17:50:28 +02:00
Dominik
b58138d4a2 Merge branch 'fix-provider-test' into 'master'
Fix RepoProviderTest

Somehow RepoProviderTest was not targetting SDK 23

See merge request !363
2016-07-25 15:44:47 +00:00
Dominik Schürmann
ed76576a5c Fix RepoProviderTest
Somehow RepoProviderTest was not targetting SDK 23
2016-07-25 17:31:27 +02:00
Daniel Martí
7287acd822 Merge branch 'utils-7.0' into 'master'
Add 7.0 (24) to the versions list



See merge request !361
2016-07-25 13:17:10 +00:00
Daniel Martí
f9bfe2a877 Merge branch 'api-24' into 'master'
Api 24

Based on https://gitlab.com/fdroid/fdroidclient/merge_requests/352 with fixes for robolectric

See merge request !360
2016-07-25 12:58:46 +00:00
Daniel Martí
5f3448394c Add 7.0 (24) to the versions list 2016-07-25 14:55:56 +02:00
Dominik Schürmann
b37d07a829 Use Build.VERSION_CODES.N in installer classes 2016-07-25 14:45:34 +02:00
Dominik Schürmann
cbbc3ab60d Use sdk=23 for robolectric
* SDK 24 is currently not supported
2016-07-25 14:45:30 +02:00
Daniel Martí
53e812e198 Bump to 0.101-alpha3 v0.101-alpha3 2016-07-25 13:19:16 +02:00
F-Droid Translatebot
6a8729e607 Pull translation updates from Weblate
Translators:

Anders Jonsson    Swedish
Diadlo            Russian
2016-07-25 13:13:38 +02:00
Daniel Martí
dd9b1fc613 Merge branch 'fix-721--qrcode-generation' into 'master'
Don't upper case QR code that has a URL.

See comment in #721 or this commit for explanation.

Fixes #721.

See merge request !358
2016-07-25 11:11:05 +00:00
Daniel Martí
7e451c87c7 Merge branch 'fix-511--remove-packageName-from-apk' into 'master'
Remove now unused package name from apk table

The package name is only stored in the `fdroid_app` table now, so we need to remove it form the `fdroid_apk` table. Under normal circumstances, I'd normally just leave unused fields in the DDL (the SQL which defines the tables) and never use it from within the Java code. However in this case, the package name formed part of the primary key of this table. Seeing as we are not inserting into that column any more, it isn't okay to leave it there but instead it must be removed so that we can put a more appropriate primary key on the table. In this case, the new primary key is `appId` + `vercode` + `repoId`.

I think this is the final merge request before I submit a MR with repo priorities.

See merge request !359
2016-07-25 09:53:42 +00:00
Peter Serwylo
2804b56d13 Ensure appropriate indexes on the apk table 2016-07-24 19:48:59 +10:00
Peter Serwylo
485d5e82ed Remove Schema.ApkTable.Cols.PACKAGE_NAME completely.
Wherever the "package name" of an apk is required, it can be requested by
asking for `Schema.ApkTable.Cols.App.PACKAGE_NAME`. Note the `App` which
indicates that it is in fact pulling this data from the `fdroid_app` table rather
than the `fdroid_apk` table.
db-version/59
2016-07-24 19:48:56 +10:00
Daniel Martí
eb14d157db Merge branch 'fix-711--auth-basic' into 'master'
Correctly identify the repo for a given URL to fix HTTP Auth.

**NOTE: Based on !355 (If that one gets merged first, I can rebase this, or else we can merge this one for both commits)**

When downloading arbitrary URLs using F-Droid (e.g. icons, .apk files, indexes) then it may be the case that the repo requires authentication. As such, we try to infer the repository based purely on the URL.

The old code took the basename of the URL, which means remove the last fragment (e.g. "index.jar") and use the remaining portion of the URL to lookup the repo.
This is broken for many reasons, partly because of the presence of a query string, partly because there are other things which are not just in the root directory of the repo (e.g. "/icons/*.png").

This new method iteratively peels off the right most segment of the URLs path, then looks to see if a repo exists at that address.

Note that this breaks down if you have nested repositories on a server, where one of the repositories is nested inside a directory that F-Droid knows about, such as "icons". In such a case, the following repositories:

 * https://f-droid.org/repo (requires auth)
 * https://f-droid.org/repo/icons (doesn't require auth)

will break down. If requesting something from the repo requiring auth:

 * https://f-droid.org/repo/icons/org.fdroid.fdroid.png

Then it will lookup the database and find the repo which lives in "/icons" and doesn't require auth (or requires a different auth username/password). Not sure there is a lot that can be done about this without major refactoring. Such refactoring would require making sure a `Repo` is always given to a downloader for any HTTP request, and is probably a bit out of scope of this bug.

Also added tests for this behaviour.

Fixes #711.

See merge request !357
2016-07-23 12:09:35 +00:00
Peter Serwylo
10144f72c9 Don't upper case QR code that has a URL.
Firstly, this causes #721, possibly due to a bug in "Barcode
Scanner" whereby it seems to ignore the scheme when in caps,
assuming it is "http".

The relevant RFC is:

> RFC3986 (Uniform Resource Identifier (URI): Generic Syntax

In section 3.1, it describes the scheme:

> Although schemes are case-insensitive, the canonical form is
> lowercase and documents that specify schemes must do so with
> lowercase letters.  An implementation should accept uppercase
> letters as equivalent to lowercase in scheme names (e.g., allow
> "HTTP" as well as "http") for the sake of robustness but should
> only produce lowercase scheme names for consistency.

Secondly, it is not valid to uppercase URLs at will. Although it
seems that there is some sort of more-compact-QR-generating-logic
that doesn't justify this. Funnily enough, I can't find anything
in RFC3986 about the case-insensitivity of URI paths. However
consider the following:

 * https://i.imgur.com/fn33EcW.jpg

That is a valid path to an image. If we upper case it:

 * HTTPS://I.IMGUR.COM/FN33ECW.JPG

or lower case it:

 * https://i.imgur.com/fn33ecw.jpg

Then the server is entitled to treat it differently and indeed
it does. Both the upper case and lower case are no both 404's.
2016-07-22 07:48:26 +10:00
Peter Serwylo
9fbcc255ab More robust method to find repository from URLs
When downloading arbitrary URLs using F-Droid (e.g. icons, .apk files, indexes)
then it may be the case that the repo requires authentication. As such, we try
to infer the repository based purely on the URL.

The old code took the basename of the URL, which means remove the last fragment
(e.g. "index.jar") and use the remaining portion of the URL to lookup the repo.
This is broken for many reasons, partly because of the presence of a query string,
partly because there are other things which are not just in the root directory
of the repo (e.g. "/icons/*.png").

This new method iteratively peels off the right most segment of the URLs path,
then looks to see if a repo exists at that address.

Note that this breaks down if you have nested repositories on a server, where
one of the repositories is nested inside a directory that F-Droid knows about,
such as "icons". In such a case, the following repositories:

 * https://f-droid.org/repo (requires auth)
 * https://f-droid.org/repo/icons (doesn't require auth)

will break down. If requesting something from the repo requiring auth:

 * https://f-droid.org/repo/icons/org.fdroid.fdroid.png

Then it will lookup the database and find the repo which lives in "/icons"
and doesn't require auth (or requires a different auth username/password).
Not sure there is a lot that can be done about this without major refactoring.
Such refactoring would require making sure a `Repo` is always given to a downloader
for any HTTP request, and is probably a bit out of scope of this bug.

Also added tests for this behaviour.

Fixes #711.
2016-07-21 15:37:17 +10:00
Peter Serwylo
a686529ba5 Added tests for repo provider.
These tests would've prevented the problem in #717, by ensuring
that only a single repo is deleted at a time.
2016-07-21 15:36:12 +10:00
Daniel Martí
b3d88aa333 Merge branch 'always-keep-timestamp' into 'master'
Prevent crash for servers that don't send etags with repo indexes

While working on #711, I noticed this bug using my [Mock HTTP Auth server](https://f-droid.org/wiki/page/PHP_Mock_Repository).

This fix always captures timestamps during repo updates, even if it is the same as last time. This is because we are dependent on it later on in the repo update process. Specifically, when updating from a HTTP server that doesn't send out etags with its responses, it will trigger a full blown repo update every time, even if all the values in the index are the same (name, description, etc). This is as distinct from better behaving servers that send etags, in which case we will only do a partial update (i.e. persist the "last updated time"). In such a case, the remainder of the update process will proceed, and ask for this timestamp.

See merge request !356
2016-07-21 03:26:29 +00:00