497 Commits

Author SHA1 Message Date
Peter Serwylo
d3f9cfbdfa Remove need for temorary b-tree for order by in most cases by introducing two indexes.
The fact that sqlite chose to do a "FULL TABLE SCAN" right off the bat when showing a list
of apps results in it having to do extra work at the end of the query to sort. If the scan
can be utilise an index, then the sorting is already done and a b-tree need not be constructed.
Thus, this introduces indexes for both the `name` column (used to sort most lists of apps)
and the `added` column (used to figure out the `Whats New` apps).
2016-07-18 22:20:36 +10:00
Peter Serwylo
ec36f2a1cd Remove some unused methods from providers. 2016-07-18 22:20:36 +10:00
Peter Serwylo
6e3b1fde86 Implement getLong for ContentValuesCursor.
This is required because SQLite "rowids" are 64 bit integers:

> all rows within SQLite tables have a 64-bit signed integer
> key that uniquely identifies the row within its table."

https://sqlite.org/lang_createtable.html#rowid
2016-07-18 22:19:26 +10:00
Peter Serwylo
2733081b3a Change join from app to apk table to auto increment integers rather than Android package name strings.
This is important for the ability to refactor the database for better performance in the future.

See #511 for details.

For those interested in the details, here is a query plan of selecting the "All" category of apps before
this commit:

 * `SCAN TABLE fdroid_app USING INDEX app_id`
 * `SEARCH TABLE fdroid_apk USING INDEX apk_id (id=?)`
 * `SEARCH TABLE fdroid_repo USING INTEGER PRIMARY KEY (rowid=?)`
 * `SEARCH TABLE fdroid_installedApp AS installed USING INDEX sqlite_autoindex_fdroid_installedApp_1 (appId=?)`
 * `SEARCH TABLE fdroid_apk AS suggestedApk USING INDEX sqlite_autoindex_fdroid_apk_1 (id=? AND vercode=?)`
 * `USE TEMP B-TREE FOR ORDER BY`

And here is a query plan of afterwards:

 * `SCAN TABLE fdroid_app`
 * `SEARCH TABLE fdroid_apk USING INDEX apk_appId (appId=?)`
 * `SEARCH TABLE fdroid_repo USING INTEGER PRIMARY KEY (rowid=?)`
 * `SEARCH TABLE fdroid_installedApp AS installed USING INDEX sqlite_autoindex_fdroid_installedApp_1 (appId=?)`
 * `SEARCH TABLE fdroid_apk AS suggestedApk USING INDEX apk_appId (appId=?)`
 * `USE TEMP B-TREE FOR ORDER BY`

The things of note are:
 * `SCAN TABLE` doesn't use an index, which means that it is really using the rowid index. Shouldn't behave much differently.
 * The second item now uses an integer primary key index rather than a package name index. Should increase search speed marginally which was the goal of this commit. As more apks exist, the speed improvement will also increase.
2016-07-18 22:19:24 +10:00
Peter Serwylo
cd4700aeed Removed TargetApi annotation from class, push to methods and API problems.
This class is used by `AppDetails` without an API verison check around its access.
Thus, we call methods on this that are unsupported when on gingerbread.

By removing `TargetApi` from the class, it unearthed a couple of locations
where methods were being invoked without first guarding against the build version
correctly. These two locations have been fixed and a `TargetApi` attached to the
more narrowly defined method which requires it.
2016-07-18 07:34:54 +10:00
Daniel Martí
f17482f1eb Bump compile/target sdk versions to 24 2016-07-13 16:08:55 +01:00
Daniel Martí
a4458b7cdf Add new language to the list: Croatian 2016-07-13 14:47:30 +01:00
F-Droid Translatebot
19d3d8a1fc Pull translation updates from Weblate
Translators:

ikmaak           Dutch
John Doe         Turkish
Kristjan Räts    Estonian
Lyrical Tumor    Croatian
2016-07-13 14:44:02 +01:00
Daniel Martí
cc7bf78ed1 studio: take Collections.addAll() suggestion 2016-07-07 16:55:52 +01:00
Daniel Martí
2dd053f76b studio: apply a bunch of weaker access suggestions 2016-07-07 16:55:52 +01:00
Daniel Martí
49e0561356 Drop unnecessary elses after returns 2016-07-07 10:11:31 +01:00
Peter Serwylo
48ac66b315 Added LoggingQuery for diagnostics during debug mode.
SQLite has a very nice "EXPLAIN QUERY PLAN" command (https://sqlite.org/eqp.html).
It is not really meant to be used in production code, as per the docs, but it is
super helpful at diagnosing missing indexes or other performance problems with
databases. I find it much better than, for example, the MySQL alternative.

This commit routes queries from the `ApkProvider` and `AppProvider` through a
`LoggingQuery` which (in debug builds) times queries, and if they take longer
than a certain threshold, outputs them to logcat. In addition, it will then
ask sqlite to explain its query plan for that same query, and output that to
logcat too.
2016-07-07 17:13:53 +10:00
Peter Serwylo
88107cf94e Ensure constants always used for fields in remaining places. 2016-07-04 22:34:09 +10:00
Peter Serwylo
9135026362 Ensure constants always used for fields in InstalledAppProvider. 2016-07-04 22:34:09 +10:00
Peter Serwylo
c55a53ec69 Ensure constants always used for fields in DBHelper. 2016-07-04 22:34:09 +10:00
Peter Serwylo
131978ad02 Refactored create table statements to use constants from schema. 2016-07-04 22:34:09 +10:00
Peter Serwylo
2ffd4ae428 Ensure constants always used for fields in RepoProvider. 2016-07-04 22:34:09 +10:00
Peter Serwylo
a8d2b2aff3 Ensure constants always used for fields in AppProvider. 2016-07-04 22:34:09 +10:00
Peter Serwylo
47fa5a94b3 Ensure constants always used for fields in ApkProvider. 2016-07-04 22:34:09 +10:00
Daniel Martí
3fae57c360 Merge branch 'fix-511--database-constants' into 'master'
Refactor database schema constants

**Note:** When this is merged I'll rebase !347 and remove its WIP.

## Summary

In order to do the database changes required for #511, I've found that it is difficult due to my inclination to switch between referring to database columns by either a Java constant such as `AppProvider.DataColumns.NAME` and string literals such as `"name"`. All string literals should be migrated to constants, and that will happen in my next MR. In order to prepare for this, I've gathered together the constants into one common place: `org.fdroid.fdroid.data.Schema`. This is going to be the authoritative place for the schema to be stored going forward, and will help when reasoning about the database structure. 

Although it seems large, this change is a fairly straightforward find/replace job. It also passes all tests for which there is good test coverage in the content providers.

## Changes

Create `Schema` interface to make it simpler to replace string literals with constants.

Right now, table names are in `DBHelper.TABLE_*` constants, and each tables fields are
in `*Provider.DataColumns.*` constants. This brings them all into a predictable location.
In addition, it makes it easier to statically import `Schema` so that instead of, e.g.,

* `AppProvider.DataColumns.PACKAGE_NAME`

We can choose one of the following, based on our current context:

* `Schema.AppTable.Cols.PACKAGE_NAME`
* `AppTable.Cols.PACKAGE_NAME`
* `Cols.PACKAGE_NAME`

In the worst case, it isa couple of chars shorter than now. In the best case, if we are
writing a class that primarily deals with Apps (e.g. App.java or AppProvider.java) then
we get a big win with just `Cols.PACKAGE_NAME`.

Having these things slightly shorter may seem like it is pointless, but the length of
each constant probably contributed to my lack of willingness to use constants instead
of string literals when constructing queries.

In the future, this should be moved towards something more akin to:

> http://openhms.sourceforge.net/sqlbuilder/

and I hope that extracting all the schema stuff into one interface may help that.


See merge request !346
2016-07-03 22:47:16 +00:00
F-Droid Translatebot
b6b039aa49 Pull translation updates from Weblate
Translators:

ageru                  French
ezjerry liao           Traditional Chinese
Kristjan Räts          Estonian
Nutchanon Wetchasit    Thai
Osoitz                 Basque
2016-07-03 19:24:15 +01:00
Peter Serwylo
668cc27d29 Replaced DBHelper.TABLE_INSTALLED_APP with Schema.InstalledAppTable.NAME 2016-06-30 17:09:01 +10:00
Peter Serwylo
6fb23d2efa Extracted InstalledAppProvider.DataColumns to Schema.InstalledAppTable.Cols 2016-06-30 17:06:40 +10:00
Peter Serwylo
d1ceb84af4 Replaced DBHelper.TABLE_APP with Schema.AppTable.NAME 2016-06-30 14:14:18 +10:00
Peter Serwylo
14958d48e3 Replaced DBHelper.TABLE_APK with Schema.ApkTable.NAME 2016-06-30 14:14:18 +10:00
Peter Serwylo
d1c04de71a Replaced DBHelper.TABLE_REPO with Schema.RepoTable.NAME 2016-06-30 14:14:18 +10:00
Peter Serwylo
8a155aef89 Extracted RepoProvider.DataColumns to Schema.RepoTable.Cols 2016-06-30 14:14:15 +10:00
Peter Serwylo
0ea5325b81 Extracted ApkProvider.DataColumns to Schema.ApkTable.Cols 2016-06-30 14:11:35 +10:00
Peter Serwylo
315f20df0c Extracted AppProvider.DataColumns to Schema.AppTable.Cols 2016-06-30 13:36:27 +10:00
Peter Serwylo
7c13cc26fc Create Schema interface to make it simpler to replace string literals with constants.
Right now, table names are in `DBHelper.TABLE_*` constants, and each tables fields are
in `*Provider.DataColumns.*` constants. This brings them all into a predictable location.
In addition, it makes it easier to statically import `Schema` so that instead of, e.g.,

 * `AppProvider.DataColumns.PACKAGE_NAME`

We can choose one of the following, based on our current context:

 * `Schema.AppTable.Cols.PACKAGE_NAME`
 * `AppTable.Cols.PACKAGE_NAME`
 * `Cols.PACKAGE_NAME`

In the worst case, it isa couple of chars shorter than now. In the best case, if we are
writing a class that primarily deals with Apps (e.g. App.java or AppProvider.java) then
we get a big win with just `Cols.PACKAGE_NAME`.

Having these things slightly shorter may seem like it is pointless, but the length of
each constant probably contributed to my lack of willingness to use constants instead
of string literals when constructing queries.

In the future, this should be moved towards something more akin to:

> http://openhms.sourceforge.net/sqlbuilder/

and I hope that extracting all the schema stuff into one interface may help that.
2016-06-30 13:36:23 +10:00
Dominik Schürmann
3162e93b35 Check that permissions are a subset of listed ones
* uses containsAll() instead of equals()

Fixes #703
2016-06-26 17:48:19 +02:00
F-Droid Translatebot
5dd95754cd Pull translation updates from Weblate
Translators:

Allan Nordhøy               Norwegian Bokmål
Allan Nordhøy               Swedish
ezjerry liao                Traditional Chinese
halcyonest                  Korean
Kristjan Räts               Estonian
Mikkel Kirkgaard Nielsen    Danish
riotism                     Chinese (Hong Kong)
Thomas Craig                Simplified Chinese
xinxinxinxinxin             French
YFdyh000                    Simplified Chinese
2016-06-25 20:51:06 +01:00
Peter Serwylo
64bc13de8a Use symlink instead of hardlink, which was accidentally used on API < 19.
At the same time, also changed visibility of methods to package local
to remove need for test class.
2016-06-23 11:14:43 +10:00
Daniel Martí
95d8537187 Merge branch 'gradle-changes' into 'master'
Lint updates, update ACRA

This might fix #677, although hard to tell since I cannot reproduce the issue.

See merge request !343
2016-06-22 10:30:51 +00:00
Hans-Christoph Steiner
65cbc9dc10 do not crash if there are no cache files to delete
java.lang.NullPointerException
at org.fdroid.fdroid.Utils.clearOldFiles(Utils.java:347)
at org.fdroid.fdroid.CleanCacheService.onHandleIntent(CleanCacheService.java:51)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at android.os.HandlerThread.run(HandlerThread.java:60)
2016-06-21 14:37:01 +02:00
Daniel Martí
cd1f59fb29 Bump ACRA to 4.9.0
Also change the overrides from onCreate to init as suggested in the
changelog:

https://github.com/ACRA/acra/wiki/ChangeLog#acra-490-rc-1-2-may-2016

The behaviour should be very similar, although overriding the wrong
method (which we were doing) could cause all sorts of weird issues.
2016-06-21 13:35:29 +01:00
Hans-Christoph Steiner
09eea0d40b ignore "java.lang.IllegalArgumentException: Could not parse [null/24]"
This is currently baffling me as to how it can happen.  This isn't a pretty
fix but it is better that letting F-Droid crash.  db9bdc31 was supposed to
make it so that only one thread at a time ever updated the static vars on
FDroidApp.

closes #690
2016-06-21 13:03:37 +02:00
Hans-Christoph Steiner
ba88bd7060 only show update notification if updates are going to happen
UpdateService.onHandleIntent() starts with a time check for whether an
update is actually scheduled.  Before, UpdateService put up a notification
when it started.  This changes it so that the notification is put up after
the check, so it should only show the notification if UpdateService is
actually going to run, and no longer when it is just waking up to check the
time.

!307 #662
2016-06-21 12:52:05 +02:00
F-Droid Translatebot
d718528466 Pull translation updates from Weblate
Translators:

Danial Behzadi     Persian
ezjerry liao       Traditional Chinese
Marian Hanzel      Slovak
xinxinxinxinxin    French
2016-06-20 21:51:32 +01:00
Daniel Martí
34aa8ab062 Merge branch 'apkfileprovider' into 'master'
Provide content Uris to downloaded apks via FileProvider

* moves apk verification back inside the Installer class
* uses support libs FileProvider for content Uris
* move apk file caching and storage methods into ApkFileProvider class

Some of the ugly version checks for Android N can be removed after Android N has been released. Unfortunately Google decided to keep SDK version at 23 for Android N dev preview and only change the CODENAME, thus ``Build.VERSION.SDK_INT <= Build.VERSION_CODES.M`` returns true on Android N preview :/ , see https://commonsware.com/blog/2016/03/17/backwards-compatibility-n-developer-preview.html

Tested on Android N dev preview 3 emulator, Android 6 stock and Android 5.1 rooted with priv extension.

See merge request !331
2016-06-20 15:44:26 +00:00
Peter Serwylo
243bb1948f Added tests for two helper methods for comma separated string parsing. 2016-06-21 00:21:19 +10:00
Peter Serwylo
a192389318 Completely removed CommaSeparatedList class, replaced with two helper methods in Utils.
The two helper methods alleviate the need for copious null checks. They also provide
consistent behaviour when there are zero elements (i.e. they return null, rather than
an empty string or empty array, as was the case before).
2016-06-21 00:21:19 +10:00
Peter Serwylo
d99b357a1f Replace CommaSeparatedList with String[].
This is a combination of:
 * `String[].split(",")` and
 * `TextUtils.join(",", values)`

It seems a bit wastefull to have our own implementation of these two things
which lightly wrap this code, and produce a datastructure which is non standard
and foreign to Java developers.
2016-06-21 00:21:19 +10:00
Peter Serwylo
57c63a8e2a Test coverage of anti feature parsing in RepoUpdater. 2016-06-21 00:21:19 +10:00
Dominik Schürmann
5facd1b9a1 Proper SDK 24 version check
* not targetting SDK 24 due to
  https://gitlab.com/fdroid/fdroidserver/issues/185
2016-06-20 14:53:43 +02:00
Dominik Schürmann
16f97125d7 Provide content Uris via FileProvider
* moves apk verification back inside the Installer class
* uses support libs FileProvider for content Uris
* move apk file caching and storage methods into
ApkCache class
2016-06-20 11:07:06 +02:00
Daniel Martí
783d6d1ba6 Remove now unused ic_stat_notify
The code that used it got removed for good in f6cc716f.
2016-06-17 15:29:38 +01:00
F-Droid Translatebot
5dd1cd6ee6 Pull translation updates from Weblate
Translators:

Francesco Giordano    Italian
Jaroslav Lichtblau    Czech
Mutante Citta         Italian
2016-06-16 20:59:55 +01:00
Daniel Martí
95b7201868 Merge branch 'fix-582--lint-errors' into 'master'
Extracted new API styles dependent on API 16 and 17 into values-17.

This involved the typical Android design pattern of a "Base" style in
`values/styles.xml`, then the an empty normal style which uses that Base style
as a `parent` also in `values/styles.xml`, and finally any API specific
styles in another version of the normal style in a `values/styles-v17` folder.

Same was done for android:actionBarStyle moving it into into values-v11.
This time, didn't worry about the base style, because there was not much to be
gained. by doing so.

Fixes #582.

See merge request !335
2016-06-16 19:44:08 +00:00
Hans-Christoph Steiner
89e2c9948a fix off-by-one error in update check for db-version/56
We missed an off-by-one in my previous DB change:
90467bf8bf2f8e4a46cb1db563154df4035bf746

This causes the installed app parsing to happen on each start when on any
build that is on db-version/56.  Its not a big deal since the broken code
was not shipped at all, even in an alpha.
2016-06-16 16:50:29 +02:00