398 Commits

Author SHA1 Message Date
Hans-Christoph Steiner
a45af269d6 convert default_repo.xml to more flexible format
This is a step towards supporting easy whitelabeling, using gradle flavors.
This allows the whitelabel version to set the default repos just by making
their own default_repos.xml in app/src/whitelabel/res/values.  That one
will then override the built-in F-Droid one.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
a2e44dcfb0 move CrashReportActivity into new .acra package
This isolates all the ACRA stuff in its own package.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
0a1cab0df8 custom ACRA sender to put stacktrace title in email Subject:
This should hopefully make it easier to sort through the emails.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
ba9f9af76f support TLS 1.2 on all repos
Update to the latest NetCipher, which now fully supports SNI, in order to
support TLS 1.2 on all supported platform levels.  Without this, a repo
that is TLS 1.2 only will be unusable on all but the most recent versions
of Android.

#431
2016-10-25 11:54:40 +03:30
Peter Serwylo
f61fa0c4f8 More robust fix for #763, specifying column names to copy explicitly.
This is far less brittle at runtime, but slightly more work at dev time.
The following things are undesirable but make it much easier to write:
 * Use of `CREATE_TABLE_APP.replaceFirst(...)` to create the temp tables.
 * Having to specify a list fo columns twice in `Schema` (`ALL_COLS` + `COLS`).

The `replaceFirst` means we don't need to maintain two separate create table
statements. It is a little messy because there is no compile time guarantee
that we are creating a valid SQL statement at the end, just our knowledge
that a create table statment tends to have the table name first and it
probably wont cause problems.

The `ALL_COLS` + `COLS` is required so that we don't have to type out a list
of fields when copying data in `TempAppProvider`. Otherwise, whenever a new
column is added, developers would need to know that it also needs to be added
to this third place. Currently it is in the `Schema` and the `CREATE_TABLE_*`
statements where one needs to add a new column. These are both intuitive and
hopefully easily discoverable. Having to add it to the `TempAppProvider` is
less intuitive and likely to result in bugs.
2016-10-25 11:54:40 +03:30
Peter Serwylo
4aad2f865d Fixed issue #763 by being more specific when creating temp table for update.
When performing the old style `CREATE TABLE ... AS SELECT ...` (CTAS) statement,
no indexes are added. In addition, rowid is not added. Even if manually
specifying an autoincrement column in the original schema, this autoincrement
column does not get recreated with the CTAS statement. So instead, this change
reuses the original `CREATE TABLE` statement which explicitly defines all of the
relevant columns. In addition, it explicitly adds an autoincrement integer primary
key. This has the same semantics as the existing implicit `rowid` column that
sqlite creates. From from https://sqlite.org/autoinc.html:

> In SQLite, a column with type INTEGER PRIMARY KEY is an alias for the ROWID
> (except in WITHOUT ROWID tables) which is always a 64-bit signed integer.

However, as it is explicit now, is copied when doing the
`INSERT INTO ... SELECT ...` statement to get data from the real table to the
temp table in preperation for updates (and back again after the update has
populated the temp table).

Note that this makes the `INSERT INTO ... SELECT ...` statements slightly more
brittle, because now we need the table definition used to create the temp table
(from `DBHelper.CREATE_APP_TABLE`) to have the same column order as those in the
real `fdroid_app` table. While this may sound like a silly comment to make, it
is important because database migrations can result in a database having the
correct set of columns, but in a different order to how they were specified
in the original create table statement.

If a database migration performs an `ALTER TABLE ... ADD COLUMN ...` the column
will be added at the end. If at the same time the `CREATE TABLE` is changed so
that the new column is specified as the second to last column in the list of
columns, then the `INSERT INTO ... SELECT ...` will not work as expected.
2016-10-25 11:54:40 +03:30
Peter Serwylo
4bb183aa61 Use database constant instead of hard coded string literal 2016-10-25 11:54:40 +03:30
uberspot
a183da42b6 Remove any whitespace from fingerprint EditText input so that copy pasting is easier for users. 2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
1e26e31309 privileged mode means auto-downloads are actually installs
When the Privileged Extension is working, then enabling the preference
"Automatically download updates" will actually install those updates in the
background.  So the preference should communicate that to the user. So now
it serves as a global "allow background updates"

#16
closes #106
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
4b922f38b9 don't show notification if the app name is unknown #720
This gets rid of the notifications that say "Tap to Install Unknown", and
instead just cancels the notification.  The downloaded APK will still be
cached, so when the user goes to click install or update again, it won't
need to download it again.

closes #758
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
5b46303961 handle install broadcasts after InstallManagerService was killed
If InstallManagerService was killed, it'll forget all of its state.  If it
is killed while an install process is running, and that install fails,
InstallManagerService will receive a broadcast about the error but then it
can't find anything about the app in question besides its download URL.
That is enough to control the notification, but not enough to get the name
of the app in question.  This is a workaround by showing the APK filename
when the app name cannot be found. Ideally, the packageName would somehow
magically be delivered to InstallManagerService in this case, but the
Installer stuff doesn't always have it to send.

With android-23, there is getActiveNotifications(), which we might be able
to use to stash the packageName and fetch it as needed.
2016-10-25 11:54:40 +03:30
Aditya Bharadwaj
9ca20395be Fix PMD issue. 2016-10-25 11:54:40 +03:30
Aditya Bharadwaj
1688adc0d4 Update naming convention as per review. Add antifeatures list length check to filter anti-feature apps. 2016-10-25 11:54:40 +03:30
Aditya Bharadwaj
7997e707d8 Fix checkstyle issue. 2016-10-25 11:54:40 +03:30
Aditya Bharadwaj
6e90be7b68 Add option to grey out apps requiring anti-features. 2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
8d8400449e get ACRA reports without crashing to debug #698
This should be reverted once #698 is fixed.  If execution has gotten this
far into InstallManagerService, there should always be App and Apk
instances.  That is enforced when Intents are received by this Service.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
1d5dcb76a2 remove confusing messages when Privileged Extension not installed
This was saying that the Privileged Extension is enabled but not properly
configured.  This is because the preference logic changed to default to on
unless the user explicitly disabled it.  So using the Privileged
Extension based on whether its installed and whether the user has disabled
it.

related to ea0700d406101b7ed6907b1dbd2918dbc214f435
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
9db47da42b check whether installed APKs exist and are readable before hashing
I guess APKs could disappear, or perhaps not be readable.

closes #699

Here's the stacktrace:

java.io.FileNotFoundException:
 /system/priv-app/ATT_Ready2Go/ATT_Ready2Go.apk: open failed: ENOENT (No such file or directory)
 at org.fdroid.fdroid.Utils.getBinaryHash(Utils.java:405)
 at org.fdroid.fdroid.data.InstalledAppProviderService.onHandleIntent(InstalledAppProviderService.java:164)
 at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:135)
 at android.os.HandlerThread.run(HandlerThread.java:61)
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
e65706971e use Privileged Extension by default when it is installed
This totally changed the logic of the "Use Privileged Extension" preference
making it based on whether the Privileged Extension is installed and usable
rather than storing the user's selection.  This code now only stores when
the user manually disables using the Privileged Extension even when it is
installed.

closes #729
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
9b07167430 only show "install Priv Ext" in Prefs when its supported
The root install method that is available via the "Expert" preferences does
not work on newer than android-19.  So when that's the case, this hides
that item from the preferences screen entirely.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
2158afcc9d fix bug in cache cleanup on 21+ introduced in cbd6da5
!379 was merged without the emulator tests passing.  This fixes that.
2016-10-25 11:54:40 +03:30
Peter Serwylo
c76c920397 Move code causing verify error into separate helper class
I'm not 100% sure on how the `@TargetApi` and `VerifyError` work
together. However it is something along the lines of:
 * Class loader needs `CleanCacheService`.
 * At this point, it loads the bytecode for that class and verifies
   that it all makes sense.
 * The bytecode within the method targeted at API 21 is not understood
   by earlier APIs, because the entire `Os` class was introduced in 21.
 * By putting it into a different class, that class is only loaded
   at runtime on devices with API of 21 or higher.

Previously, `@TargetApi` + the relevant guard condition to check
the build version at runtime suffices to prevent this. However it seems
that if the entire class does not even exist on earlier APIs, then it
is no longer good enough.
2016-10-25 11:54:40 +03:30
Peter Serwylo
c02cc41c2f Ensure that description is not null when parsing index.
At time of writing (and for some time before), fdroidserver has forced
a description of "No description available" for apps which don't have
descriptions at all:

 * https://gitlab.com/fdroid/fdroidserver/blob/0.6.0/fdroidserver/metadata.py#L876

However, if the description is not set for whatever reason, it should not
crash the client.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
fe35343a36 document processes in CleanCacheService
This breaks out each separate process into its own utility method, and adds
javadoc to describe them.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
3944747766 delete cached icons that have not been accessed in over a year
The icon files are downloaded for each version of the app.  Over time, old
versions will pile up.  This cleans out the ones that have not been used in
over a year.

On < android-21, this will delete icons that were downloaded over a year
ago even if they are still in use because it is only possible to check
mtime, not atime.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
d1eb5b5fb3 avoid deleting cached files while they are being used
If CleanCacheService runs while an APK is being installed, it should not
delete the APK that is in the process of being installed.  This does that
by only deleting those files if they are older than an hour. Same goes for
the index files.

#738
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
6046af5328 fix bug where files were never deleted from cache
It was passing the wrong time value in the recursion, which made for a
really old "olderThan" time.  This also then flipped the logic on the
next round through the recursion, causing files to be deleted even if
"Keep Cache Time" was set to "Forever".

closes #719
closes #736
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
aa39d7bc7f if the "Keep Cache Time" pref changes, reschedule CleanCacheService
Before, CleanCacheService was only scheduled at app start for once a day.
If the user selects a time less than a day, then CleanCacheService should
run more frequently.

closes #719
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
db6214dcc5 switch "Keep Cache Time" units to milliseconds
Both the Android task scheduler and the Java File operations want millis.
For "Forever", Long.MAX_VALUE is used.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
91b4072c1a move clearOldFiles() to CleanCacheService to be used on other files
Now that there is the ability to remove files based on last access time, it
makes sense to use this on all cached files, including icons, etc.
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
5911e34b43 use access time to remove old cache files >= android-21
In android-21, they exposed the formerly internal method for getting stat
structs of files.  From that, we can get the last access time, which is a
much better way to determine which files to delete rather than last
modified time.

closes #644
2016-10-25 11:54:40 +03:30
Hans-Christoph Steiner
fe7e299df9 Utils.getBinaryHash() should not catch exceptions
By catching the exception here and returning null, the problem is then
passed on further down the line where it is harder to debug.  The hash is
required wherever this method is called, so this should fail immediately.

#699
2016-10-25 11:52:49 +03:30
Hans-Christoph Steiner
d174ea8d3e standardize on lowercase SHA-256 hashes
fdroidserver produces lowercase hashes, so its easiest to just mimic
that.  This makes hash comparisons easy.
2016-10-25 11:52:49 +03:30
Hans-Christoph Steiner
bc19a72de5 standardize priv-app install name as FDroidPrivilegedExtension
This syncs up the name the root install method uses with what is used by
the ROM integration and update.zip.  It also uses the full name for
consistency, with non-alpha and spaces removed following priv-app naming
conventions.

https://gitlab.com/fdroid/privileged-extension/merge_requests/3
https://gitlab.com/fdroid/privileged-extension/merge_requests/5
2016-10-25 11:52:49 +03:30
Peter Serwylo
b50321515a Remove dead code
AS picked up that the statement is always false, so the body of the if is
never executed. This is indeed the case, because the constructor assigns
the object which is being checked for null.
2016-10-25 11:52:49 +03:30
Peter Serwylo
d60a7311a6 Close cursors which previously were left dangling. 2016-10-25 11:52:49 +03:30
Peter Serwylo
ee848e6c14 Clean up switch statements with only a single option. 2016-10-25 11:52:49 +03:30
Peter Serwylo
ffd04dd777 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-10-25 11:52:49 +03:30
Peter Serwylo
237be6752d 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-10-25 11:52:49 +03:30
Dominik Schürmann
edb11a6778 Tests for ApkVerifier 2016-10-25 11:52:49 +03:30
numb95
37124bce80 release 0.2 2016-10-25 10:37:55 +03:30
Amir Hossein Goodarzi (Numb)
61b96c9093 fix strings fa 2016-08-15 15:19:10 +04:30
Amir Hossein Goodarzi (Numb)
05be26d507 fix names and color 2016-08-10 18:31:48 +04:30
Peter Serwylo
203bcda695 Cleanup in response to CR comments 2016-08-04 21:35:46 +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.
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