928 Commits

Author SHA1 Message Date
Peter Serwylo
634fe1084a Move category helper functions to CategoryProvider
Don't change anything yet, just move them.
2016-11-10 08:09:49 +11:00
Peter Serwylo
a7a7f77b42 Refactored categories field from column in metadata table to join table.
When updating existing apps or inserting new apps, instead of splatting
a comma separated list into a single sqlite3 column, we now put it into
several rows in the `CatJoinTable`. This is done after deleting existing
categories, to make sure that if the app has been removed from a category,
then this is reflected during the update.
2016-11-10 08:09:49 +11:00
Peter Serwylo
b2d5bcc94a When querying based on category, use join table. 2016-11-10 08:09:49 +11:00
Peter Serwylo
3e3fdd5c07 Added category to keyword search. 2016-11-10 08:09:49 +11:00
Peter Serwylo
8757acca1a Added category provider.
Not used by anything yet.
2016-11-10 08:09:49 +11:00
Peter Serwylo
99f7cab62e Added "category" table and "category to app metadata" join table.
Nothing uses these added tables yet.
2016-11-10 08:09:49 +11:00
Peter Serwylo
bb7cfc14cc Comments for the Schema.PackageTable. 2016-11-10 08:09:49 +11:00
Peter Serwylo
19ca68cb30 Removed unused category view in app details.
It was hidden some time ago, and nobody seems to miss it.
Also, we will be redoing this view soon anyway. In the meantime,
this category stuff is changing and this view should be removed.
2016-11-10 08:09:49 +11:00
Daniel Martí
6f0b33a092 Bump to 0.102-alpha2 2016-11-02 21:19:34 +00:00
F-Droid Translatebot
eae81b51ee Pull translation updates from Weblate
Translators:

Andy               Finnish
Buru Gher          Bulgarian
Matej Kolarević    Croatian
Sérgio Marques     Portuguese (Portugal)
Tobias Bannert     German
Verdulo            Esperanto
2016-11-02 21:19:18 +00:00
Daniel Martí
04c7176a2a Bump checkstyle to 7.2 2016-10-31 14:19:30 +00:00
Daniel Martí
28853fb2ec Bump ACRA to 4.9.1
Changes: https://github.com/ACRA/acra/wiki/ChangeLog#acra-491-12-oct-2016
2016-10-31 14:07:41 +00:00
Hans-Christoph Steiner
8c68849e82 Merge branch 'clear-up-reset-transient' into 'master'
Be a little more concise about when we need to run migration for v64.

Before it is not apparant that the migration introduced for v64 is associated with that particular version. This is because the guard condition used to bail out from the upgrade is more closely related to a previous migration.

This is due to a flaw with the desigh of `resetTransient()`, whereby it always resets the database to the schema _of the current F-Droid version being run_, not of the tables as they stood at the time of the particular migration being introduced.

This clarifies the guard condition for v64 by allowing it to query whether the schema has been created fresh or not during this particular invocation of `onUpgrade()`

**Note:** this is less to do with the v64 migration, but rather I came across the exact same issue while working on category table related changes. At that point I realised I made a slight mistake with the `resetTransient()` method.

**Also:** I'm happy to entertain other designs if anybody is that interested. One other approach is to change the guard condition to:

```
if (version >= 64 || fieldExists(db, ApkTable.NAME, "...")) {
  ... add field ....
}
```

However that suffers a little bit when the migration is a little more complex and checking if a field exists may not be enough.

See merge request !408
2016-10-25 14:07:22 +00:00
Daniel Martí
3af5416f09 Bump to new CI image, bump buildTools to 25 2016-10-23 17:09:17 +01:00
F-Droid Translatebot
40665e335a Pull translation updates from Weblate
Translators:

Allan Nordhøy     Norwegian Bokmål
Enol P            Asturian
Ivan Krušlin      Croatian
Raphaël Barman    French
riotism           Chinese (Hong Kong)
2016-10-23 16:30:07 +01:00
Peter Serwylo
d65e72638b Reimplement columnExists using PRAGMA table_info.
For some reason, the existing approach of "select * and then see if the
column of interest is in the results set" didn't work as expected under
tests. Perhaps SQLite is caching the list of columns for the purpose of
`select *` even after running an `alter table add column` query?

Either way, I couldn't figure out why it wasn't working as expected.
This left us with two options:

 * Try to `select columnToCheck` and see if it throws an exception
 * Query columns using `PRAGMA table_info.

The exception thrown when a column doesn't exist is not specific enough
for our code to check that this is the exact exception that occured. It
is not possible to say: `try { ... } catch (SQLiteColumnNotFound e) { ...}`
unfotunately. Also, there is a cost associated with unwinding the stack
to process an exception, which means exceptions probably shouldn't be
used in unexceptional circumstances such as this.

This change instead uses `PRAGMA table_info(tableOfInterest)` and then
iterates over the cursor looking for the relevant column. Even if the
performance is worse than the stack unwinding of an exception, it is
more concise and less hacky.
2016-10-19 06:44:08 +11:00
Peter Serwylo
63a609fbab Moved methods away from top of DBHelper class.
The fact there are arbitrary migrations at the top of the file (between
`onCreate()` and `onUpdate()` makes it harder to scan this file.

This changeset moves these methods verbatim, without changing any of
the method bodies or signatures.
2016-10-18 18:00:36 +11:00
Peter Serwylo
a317877120 Be a little more concise about what to do when running migration for v64.
Before it is not apparant that the migration introduced for v64 is
associated with that particular version. This is because the guard
condition used to bail out from the upgrade is more closely related
to a previous migration.

This is due to a flaw with the desigh of `resetTransient()`, whereby
it always resets the database to the schema _of the current F-Droid
version being run_, not of the tables as they stood at the time of
the particular migration being introduced.

This clarifies the guard condition for v64 by instead explicitly asking
if the columns of interest exist yet in this particular invocation of
`onUpgrade()`.
2016-10-18 18:00:30 +11:00
Peter Serwylo
2b2958f89c Added explicit test for null permissions.
This wouldn'tve actually found the problem in the previous commit,
due to the null happening before checking permissions while logging perms.
However, still seems like a nice test to have so that the method itself
handles nulls correctly.
2016-10-16 20:52:42 +11:00
Peter Serwylo
b72cdff522 Guard against null, and improve logging in ApkVerifier. 2016-10-16 20:28:19 +11:00
Daniel Martí
ad2059574e Merge branch 'category-tests' into 'master'
Improved category tests

In preparation for implementing the [new category UI](https://gitlab.com/fdroid/fdroidclient/uploads/01d865e65604c41b0a472f0d39e7f1a7/Categories.png) I will be refactoring the database so that categories get their own table. In preparation for that, this MR improves the categories tests so that they also test the ability to query apps based on their categories.

See merge request !406
2016-10-13 17:58:59 +00:00
Peter Serwylo
c771e9a394 Added test for querying apps based on category
The previous category tests only checked that certain categories
would indeed find their way into the database if certain app metadata
is saved. It didn't check the other direction, using these categories
in queries.
2016-10-13 08:52:17 +11:00
Peter Serwylo
8e2e14d703 Migrating category tests to their own class in preperation for giving them their own DB table 2016-10-13 08:41:51 +11:00
Peter Serwylo
0e70495046 Guard against getRunningAppProcesses() returning null 2016-10-13 06:42:49 +11:00
Peter Serwylo
e2e1d3111c Extract code to check for ACRA process into method
Makes it easier to document the code and simplifies FDroidApp#onCreate().
2016-10-13 06:20:06 +11:00
F-Droid Translatebot
2428a89288 Pull translation updates from Weblate
Translators:

Alessandro “Acn0w” Cecchin    Italian
ezjerry liao                  Traditional Chinese
zmni                          Indonesian
2016-10-12 13:20:52 +01:00
Hans-Christoph Steiner
6f0c9ff88a support extended 'uses-permissions' tags in APKs
<uses-permissions/> tags can have min and max SDK to take effect.  This is
not supported currently, and it necessary especially with the privileged
installer so it can properly represent the permissions that an APK is
requesting.

For example:
<uses-permission
  android:name="android.permission.MANAGE_ACCOUNTS"
  android:maxSdkVersion="22" />
<uses-permission-sdk-23
  android:name="android.permission.CAMERA" />
<uses-permission-sdk-23
  android:name="android.permission.CALL_PHONE"
  android:maxSdkVersion="23" />
2016-10-11 08:44:51 +02:00
Hans-Christoph Steiner
2350b4e694 move shareable test classes into new separate section: testShared
This allows some of the mock classes to be shared across Robolectric and
emulator tests.
2016-10-11 08:44:51 +02:00
Hans-Christoph Steiner
d7022dd498 rename Apk.permissions to requestedPermissions like PackageInfo
android.content.pm.PackageInfo is the Android class for representing data
about an APK/package.  Since Apk.permission is the same thing, we should
use the same name.
2016-10-11 08:44:51 +02:00
Hans-Christoph Steiner
a5a90954bc fix lint UnsafeProtectedBroadcastReceiver
Android won't protect us from other apps sending other Intents to these
receivers, so at least check that the action string matches what its
looking for.  This is based on a lint recommendation.
2016-10-10 20:15:47 +02:00
Hans-Christoph Steiner
e2256d3d8c fix "Repeated word "en" in message: possible typo" 2016-10-10 20:15:47 +02:00
Hans-Christoph Steiner
a16589eab0 bump to errors: AppCompatMethod, NestedScrolling, StringFormatCount
These are things that we definitely want to be checking, and making them
lint errors rather than warnings means the CI build will fail.
2016-10-10 19:57:56 +02:00
Hans-Christoph Steiner
c71590c6fa fix lint StringFormatCount
app/src/main/res/values-nb/strings.xml:344:
  Conflicting number of arguments here
2016-10-10 19:57:56 +02:00
Hans-Christoph Steiner
15181d47f5 use apply() with all SharedPreferences
if the code does not check the result of commit() it should use apply()
since that runs in the background.
2016-10-10 19:57:55 +02:00
Peter Serwylo
72a88583d6 Only drop fdroid_installedApp if it exists 2016-10-11 00:15:38 +11:00
Peter Serwylo
0d4d160407 Fix migration for DB version 50.
The migration resulted in a query being run which was broken. The query
was broken because it was dynamically generated by Java code. This Java
code resulted in a valid migration when until very recently when the
query was refactored to deal with a new DB structure. Now the query is
no longer suitable to be run against a DB_VERSION 49 database.

To resolve this, the migration now hard codes the query to a string
which is executable when the DB_VERSION is 49.
2016-10-11 00:15:35 +11:00
Peter Serwylo
050d9974b7 Added a test which runs all DB migrations since DB version 42.
It was a little arbitrary to choose this date. However it was when the database
looked quite close to what it looks like now and it is from well over two years
ago. Going into the future, this test may as well always start out at 42 forever
more to ensure that database migrations from that point continue to work for
all future database migrations.
2016-10-10 23:42:05 +11:00
Daniel Martí
663d981c7a Bump to 0.102-alpha1 2016-10-06 22:37:09 +01:00
Hans-Christoph Steiner
4b2aec6d08 fix crash loop when upgrading from v0.101
For upgrades from DB version earlier than 63, the whole table is recreated
by resetTransient() in migrateToPackageTable() so the upgrade method for
the OBB tables only needs to run when the database is at exactly version 63

This was mistakenly added to cd9582c9902dd4ac9218acfd69872f3eebcd3d93 when
it was rebased on !375.
2016-10-06 23:22:56 +02:00
Hans-Christoph Steiner
65c4087b05 improved Apk.toString() for easier debugging 2016-10-06 21:06:54 +02:00
Hans-Christoph Steiner
470145e611 remove unused ContentValuesCursor class
This was replaced entirely by making Apk implement Parcelable
2016-10-06 21:06:54 +02:00
Hans-Christoph Steiner
e1a6c931c6 make sure uninstall process has an Apk instance
If a user clicks install, then uninstall on AppDetails, then there was not
yet a chance to refresh the App instance, and therefore app.installedApk
will still be null.  This is really just a workaround for now, because
AppDetails needs a full refactoring.
2016-10-06 21:06:54 +02:00
Hans-Christoph Steiner
b8162a1a91 InstallManagerService.cancel() to handle all cancellation
Now that there are also OBB downloads, there needs to be a central cancel
method provided by InstallManagerService.
2016-10-06 21:06:54 +02:00
Hans-Christoph Steiner
8affa08d11 auto-download and -install any associated OBB files
This implements the APK Extension Files spec for finding, downloading, and
installing OBB files that are extension packs for APKs.

This needs WRITE_EXTERNAL_STORAGE since "installing" OBB files is just
copying them to a specific path on the external storage.

https://developer.android.com/google/play/expansion-files.html
2016-10-06 19:12:01 +02:00
Hans-Christoph Steiner
4c4aef5314 refactor into reusable static method for checking file hashes
This takes the APK file hash checker and turns it into a generic static
utility method for checking that a given file matches a given hash.  This
will be needed as F-Droid handles other file types, like OBB and media.
2016-10-06 18:00:25 +02:00
Hans-Christoph Steiner
a5e6dad9bf allow apps to request OBB download URLs from F-Droid
By sending an Intent to F-Droid, it will reply with the full download URL
to the OBB file, if one exists for the currently installed version of the
requesting app.
2016-10-06 18:00:25 +02:00
Hans-Christoph Steiner
bbac03b4d1 use ApkTable column names when parsing XML
This makes it easier to track the relationship between the index XML and
the database tables where that data is ultimately stored and used. There
are a few mismatches between the XML tag and database column names, so
those are just marked with a comment.

This makes it much easier to find all the spots in the code that need
changing when adding new columns/data to the APK table, like the OBB stuff.
In Android Studio, just Ctrl-Click on any table constant definition, and
then it lists all the places its used.  Any new data will need to be added
in all of those locations.
2016-10-06 18:00:25 +02:00
Hans-Christoph Steiner
cd9582c990 support "APK Extension" files aka .obb for large apps and games
OBB files are used in apps that need more than 100 megs to work well.  This
is apps like MAPS.ME or games that put map info, media, etc. into the OBB
file.  Also, OBB files provide a mechanism to deliver large data blobs that
do not need to be part of the APK.  For example, a game's assets do not
need to change often, so they can be shipped as an OBB, then APK updates do
not need to include all those assets for each update.

https://developer.android.com/google/play/expansion-files.html
2016-10-06 18:00:25 +02:00
Peter Serwylo
e0a1d2384d Appease checkstyle + pmd 2016-10-06 03:03:02 +11:00
Peter Serwylo
d062af0975 Clarify that sometimes we don't know which repos apk we are asking for.
Many times in the past, we would ask for an apk based on its package name
and its version code. However multiple repositories provide apks with the
same package name and version code, and such queries would (seemingly)
nondeterministically choose one of these matching apks. This clarifies the
wording in the code around when we explicitly ask for a given apk, and
when we kind of guess which one we want.

Most the time we have an `App` handy, which has a specific repo associated
with it. This allows us to be more specific about requesting `Apk`s.

The times we are kind of guessing is when we rely on the "suggested version
code" of an apk by clicking the misc "Install" or "Upgrade" button in
app details. In the future, we'll need to clear this up so that a more
specific apk is chosen when touching these buttons.
2016-10-06 03:03:02 +11:00