1042 Commits

Author SHA1 Message Date
Hans-Christoph Steiner
6c247e3201 Jackson gives us {"repo": {"mirrors": ["foo", "bar"] as ArrayList
I was optimistic and guessed it was a String[], since that's what is needed.

Found by @cde while working on #35
2017-07-07 18:06:49 +02:00
Hans-Christoph Steiner
2a7fe78483 split IndexV1Updater's repo saving into working code
RepoUpdater.prepareRepoDetailsForSaving() was broken here because the Repo
properties were being set before calling it, and then the Repo instance was
passed to it for comparison.  So the comparison was always saying the value
was unchanged.  In IndexV1Updater, the flow doesn't need those checks.

This also fixes the bug where added repos never had their name/description/
icon/etc show up in ManageRepos and RepoDetails.

@cde found this bug working on mirror support, thanks!

related to #35
closes #1016
2017-07-07 18:06:49 +02:00
Hans-Christoph Steiner
7dbf03c435 Apk.isMediaInstalled() needs to check using sanitized file names
The install process automatically sanitizes filenames to avoid exploits
that put attack code in the filename.  Media files are also installed using
this logic, so the installed check needs to use sanitized file names to be
accurate.
2017-07-07 17:09:14 +05:30
Hans-Christoph Steiner
c5a1b11315 allow spaces in file names
This will be more important as people work with media, since it is quite
common to use spaces in filenames generated by humans.  Media files will
not be built by fdroid, so most likely, they will have human-generated
names.
2017-07-07 12:10:52 +05:30
Hans-Christoph Steiner
06bcf75f9b put the faster check first in App.isInstalled()
A > is much faster than all the stuff that isMediaInstalled() has to do,
so put > first, so that if it is true, isMediaInstalled() is not executed.
2017-07-07 12:10:51 +05:30
Chirayu Desai
0d8b0c7fd4 Introduce FileInstaller, a way to handle media files from F-Droid
* This installer is invoked when for non-apk/media files, and
  copies them to an appropriate folder on the sdcard.
* We also introduce a FileInstallerActivity to ask for storage
  permissions at runtime, as needed by Android 6.0 and above,
  and handle the install/uninstall process.
* A toast is shown with the install path after installation.

TODO:
* Manage Installed Apps screen doesn't show media files.
2017-07-07 12:10:48 +05:30
Chirayu Desai
cbf3133e43 AppProvider: Use IS instead of = for suggestedApk calculation
* For non apk files, the signature column would be NULL always,
and in SQLite NULL = NULL is false, but NULL IS NULL is true.

See http://www.sqlite.org/lang_expr.html Operators
2017-07-07 11:41:02 +05:30
Hans-Christoph Steiner
8f680bc1aa Merge branch 'improve-updates-tab-stability' into 'master'
Refactor `AppListItemController` to improve updates tab stability

See merge request !549
2017-07-06 22:15:41 +00:00
Peter Serwylo
2fc8060a5d Check file size first before checking hash to save cycles. 2017-07-06 14:09:17 +10:00
Peter Serwylo
2a40e082e6 Don't try to notify the user for apks which are already installed.
If an app is downloaded into our cache, but an app with the same hash is
already installed, don't bother notifying people about it.

Extracted the logic for finding the path to an apk on disk (given a
PackageInfo object) to also be used by AppUpdateStatusSerice.

Change logging so that if we discard a downloaded file we Log.i instead
of Utils.debugLog. This is so that when debugging a release build we can
see what is happening, because this specific problem was easier to debug
with release builds (rather than setting up a custom fdroid repo).
2017-07-06 13:56:01 +10:00
Peter Serwylo
bf4b0d89a1 Ensure that the suggestedVersionCode is updated after [un]installing.
Previously, it was only done on repo update.

Now it is done whenever an app is installed or unisntalled. The query to
update the suggested version for each app is quite slow when run at the
end of a repo update. However in this change, we are limiting the query
to only update a single app, which means that performance should not be
a problem.
2017-07-06 09:22:23 +10:00
Peter Serwylo
677fd3a522 Use signature as well as version code in app details for suggested apk. 2017-07-06 09:22:23 +10:00
Peter Serwylo
41f85f3c9d Correctly check for 'suggestedApk' in app details.
Take into account the preferred/installed signature instead of just the
version code.
2017-07-06 09:22:23 +10:00
Peter Serwylo
caac895442 Add "preferredSigner" field to App.
At present, this is chosen from the first package in the index-v1
metadata.
2017-07-06 09:22:21 +10:00
Hans-Christoph Steiner
ba84bbb9ea reduce massive verbosity of org.fdroid.fdroid.data.AppProviderTest 2017-07-05 17:42:18 +02:00
Hans-Christoph Steiner
8ba7882a98 Merge branch 'issue-1054--index-v1-progress-via-broadcasts' into 'master'
Add progress reporting for index-v1 (using `LocalBroadcastManager`)

Closes #1054

See merge request !550
2017-07-05 15:41:33 +00:00
Hans-Christoph Steiner
b9277f52e7 Merge branch 'issue-938--feature-graphic-priority' into 'master'
Order apps in main screen by date, new, then presence of feature graphic

Closes #938

See merge request !555
2017-07-04 20:48:02 +00:00
Peter Serwylo
5b52835097 Order apps in main screen by date, new, then presence of feature graphic
This is a conservative fix. If we wanted to really highlight the
feature graphic functionality and reward upstream devs for keeping
metadata up to date, then we could also take apps which were recently
updated, and prioritise them over new apps if they have a feature
graphic.

Fixes #938.

Also fixed display of feature graphic in main screen by getting full
path to image, not the relative path (e.g. "en-US/featureGraphic.png").
2017-07-04 13:09:22 +10:00
Peter Serwylo
3d195c9dc0 Report progress correctly
Was previously sending an indeterminate progress event, when we actually knew
how long was remaining.
2017-07-03 15:41:08 +10:00
Peter Serwylo
b7a20bbf01 Remove one layer of indirection in LocalBraodcasts for updating repo.
This creates a hard dependence between `RepoUpdater` and
`UpdateService`. However this could be trivially extracted by moving the
helper methods from `UpdateService` to `RepoUpdater`, and making the
broadcasts more "repo updater" oriented. That would also require
changing the broadcasts which `UpdateService` listens for.
2017-07-03 15:41:05 +10:00
Peter Serwylo
df20d2df8d Add progress reporting for index-v1.
Reuses the "commiting" message to indicate how many apps have been
processed so far.

Refactors existing progress handling between `RepoUpdater` and
`UpdateService` to use `LocalBroadcastManager` in preference to
`ProgressListener`. Still needs to use `ProgressListener` to talk
between `RepoUpdater` and the `Downloader` +
`ProgressBufferedInputStream`.

The only change that is related to something more important than
notifications is the fact that now `IndexV1Updater` makes use of the
`indexUrl`. To do so, because it is final, the base class constructor
delegates to `getIndexUrl()` which is overriden by the v1 updater.
This is required because we want to differentiate between broadcasts
coming from different repo update processes.

Fixes #1054.
2017-07-03 09:31:48 +10:00
Peter Serwylo
b658c0b44e Don't show apps/categories after disabling repo.
This was setup to work correctly, but for two problems:

 * The `cursor.close()` in `CategoriesViewBinder` stops the cursor from
   being requeried when required.

 * The `AppProvider` was not notifying correctly after deleting apps
   belonging to a repo.

Fixes #1028.
2017-06-29 17:33:52 +10:00
Peter Serwylo
945c6f24e6 Formatting, comments, checkstyle.
Moved methods around so the class is more coherent when reading from top
to bottom.

Added some comments.

Formatted lines to be under 120 chars. No longer suppress line length checkstyle messages.
2017-06-29 11:33:42 +10:00
Peter Serwylo
427d7bcbfa Further refactor the AppListItemController for readability and predictability.
This breaks out subclasses for each specific type of app list item,
allowing for code reuse, but also letting the specific business logic
belonging to each different app list item to be separate.

This is particularly helpful in the following situation:

 * In the search results, it is great to be able to render "App
   downloaded, ready to install" in the same manner as the update tab.

 * In the installed app list, this is not desired. Indeed, the status
   text which should be shown should reference the currently installed
   version and whether the user has ignored any updates.

By separating the AppListItemController into subclasses, it reduced the
need to handle several different types of text view (e.g.
"installedStatus", "status", "ignoredStatus", "downloadReady"), and
replace them all with a "status" and "secondaryStatus" TextView. What is
displayed in status and secondaryStatus is up to the individual
subclasses of AppListItemController.
2017-06-29 11:14:57 +10:00
Peter Serwylo
ef230f749c Added "Successfully Installed" status text to updates tab.
Also:
 * Extracted common styles into `@Style/AppListItemStatusText`.
 * Fixed left margin on older devices (where `layout_marginStart` doesn't
   exist).
2017-06-28 17:29:54 +10:00
Peter Serwylo
d0cf621314 Refactor the AppListItemControler to be more predictable.
Previously, there were different pieces of business logic, invoked at
different times, which would touch subsets of the UI.

This change rips that out, and replaces it with a single place where the
UI is setup. This can always be called safely, and it will render the
correct data for the current state of the app (e.g. downloading, waiting
for install, etc).

The AppListItemState class is a dumb object which keeps track of what is
supposed to be displayed in the UI. The AppListItemController now
creates a different AppListItemState depending on what state the list
item is in. This AppListItemState is then used to bind the values of
each UI widget.

All of the binding code is now in the single `resetView()` method, but
all of the business logic for what the view should look like is
separated into different `getViewState*()` methods.

This separation should make it easier to make sense of the UI code, and
hopefully should be testable should somebody choose to write tests for
it in the future.
2017-06-28 17:08:16 +10:00
Hans-Christoph Steiner
61ab88f8ea Merge branch 'acra-fixes' into 'master'
ACRA fixes

Closes #1074

See merge request !544
2017-06-26 10:13:54 +00:00
Shanavas
1b75a4fd3a Add Malayalam (ml) to language list 2017-06-23 23:19:57 +00:00
Peter Serwylo
b1ac0ff351 Prevent crash on categories screen when rotating.
The docs say that initLoader tries to reuse existing cursors.
The error message was "IllegalStateException: attempt to re-open an
already-closed object: SQLiteQuery: ...".
2017-06-23 17:06:45 +10:00
Peter Serwylo
79ede18259 Fix crash due to unknown suggested version.
There may be a bigger problem around suggested versions being null at
all, but that is getting looked at in a different feature set (i.e.
multi signature support) and will come in time. This fixes the immediate
problem some people were having and sending crash reports for in 0.104.

STACK_TRACE=java.lang.NullPointerException: Attempt to read from field 'java.lang.String org.fdroid.fdroid.data.Apk.versionName' on a null object reference
	at org.fdroid.fdroid.views.AppDetailsRecyclerViewAdapter$HeaderViewHolder.bindModel(AppDetailsRecyclerViewAdapter.java:425)
	at org.fdroid.fdroid.views.AppDetailsRecyclerViewAdapter.onBindViewHolder(AppDetailsRecyclerViewAdapter.java:244)
	at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6310)
	at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6343)
	...

Introduced in 97fd3f0.
2017-06-23 16:14:09 +10:00
Hans-Christoph Steiner
41d7e830d3 Merge branch 'new-ui/uninstall-fixes' into 'master'
System app uninstall prevention, fixes crash.

See merge request !478
2017-06-22 12:21:42 +00:00
Chirayu Desai
7ac3ff293e Don't allow uninstalling system apps.
* F-Droid cannnot uninstall system apps, only their updates,
  but even with the privileged extension, that can get complicated.
* Let's just not allow uninstalling system apps, the phone's settings
  app can happily disable/re-enable system apps, and also uninstalls
  their updates on disabling.
2017-06-22 15:04:23 +05:30
Felix Ableitner
02fad57f0b Remove update time 2017-06-22 05:54:11 +00:00
Felix Ableitner
31473c4395 Fix formatting for "Updated x time ago" (fixes #1064) 2017-06-19 11:25:36 +09:00
Hans-Christoph Steiner
3d5d20e082 index-v1's suggestedVersionCode goes into client's upstreamVersionCode
closes #1052
refs #1063
2017-06-16 23:20:28 +02:00
Peter Serwylo
b28057a6ee Sort 'top x apps in category' in descending last updated order.
See #754. Doesn't fix it, because that requests the entire list to be
sorted, but this just sorts the category overview screen.
2017-06-16 11:53:03 +10:00
Peter Serwylo
963996b412 Use white or black text for category chip, depending on brighness of background 2017-06-16 11:01:37 +10:00
Hans-Christoph Steiner
53a17e6146 add failsafe pref to disable using new index
If the client fails due to some bug in handling index-v1.jar, then it will
be totally stuck, even if index.jar would have worked.  This creates a new,
temporary "expert" preference to force the client only use the old XML
index file.  Worst comes to worst, we can tell people to enable this to
upgrade.

Once everything proves stable, we can remove this.
2017-06-16 00:20:36 +02:00
Hans-Christoph Steiner
e40ce864ce Merge branch 'installer-fallback-N' into 'master'
PrivExt API >= 24 uninstall fixes.

See merge request !486
2017-06-15 18:05:42 +00:00
Chirayu Desai
c095a85c3d Installer: Fallback to DefaultInstaller on API >= 24 for uninstall,
... when PackageInstaller is the installer (privext).

* In the case where the Privileged Extension is installed,
  but the installation happens through DefaultInstaller still
  due to something like a permission mismatch,
  that is set as the installer package name.
* We cannot install packages installed by that via the system methods,
  so fallback to DefualtInstaller for uninstalling as well when the
  app is installed by PackageInstaller
2017-06-15 01:15:31 +05:30
Chirayu Desai
204ac3cca9 PackageManagerCompat: Handle exceptions better
* Don't catch all exceptions, only what we expect.
* Also re-format comments as javadoc
2017-06-14 17:45:12 +05:30
Peter Serwylo
0409a7dcd6 Use provider helper methods instead of manually invoking.
The fact that Cursors are used with the apk provider is more of an
implementation detail (to some extent). It is a crappy, leaky
implementation right now, but still an implementation detail.
2017-06-13 12:52:16 +10:00
Peter Serwylo
28b7d69e60 Don't show versions with a different sig if installed.
This should probably be done on the database level, if purely for the
fact that we have a good set of unit tests for that. However it is still
quite clean to do so here.
2017-06-13 12:52:16 +10:00
Peter Serwylo
189b2277ba Refactor ApkProvider.getApkFromAnyRepo to getSuggestedApk(Apk).
This is really the intention of the method, given it used to accept
a version code and a package name. Now it optionally accepts a sig
also. If present, it will restrict the query to apks with that sig.

Also added to the multi-sig tests to ensure this method takes it into
consideration.
2017-06-13 12:52:16 +10:00
Peter Serwylo
b092d52403 Find better way to detach DB which doesn't pollute test output 2017-06-13 12:49:35 +10:00
Peter Serwylo
655a30c309 Use integer instead of boolean.
There is some magic conversions going on so that booleans get
converted into integers, but they are only on Android. Under
robolectric, it throws a class cast exception instead.
2017-06-13 12:49:35 +10:00
Peter Serwylo
f7d9be9cd5 Remove System.out.print's. Replace with Logs where appropriate.
Some were removed and left removed if they were run during tests,
because the tests are supposed to be automated and the noise they added
would not have helped diagnose a failure.

Also removed the dead code around "uses-feature" which will never
get implemented, especially as it is in the XML index.
2017-06-13 12:49:15 +10:00
Peter Serwylo
de149cf589 Remove subselect and use better index.
The main problem is that we were using an index on fdroid_apk.vercode,
when it should have been using an index on fdroid_apk.appId. There are
thousands of apks which would match based on vercode, but only two or
three which match based on appId. This improves performance of the
calculate-suggested-vercode query from 25,000ms to 100ms.
2017-06-13 09:05:37 +10:00
Peter Serwylo
bb96cdeff9 Refactor join between installed apps and packages. 2017-06-13 09:05:37 +10:00
Peter Serwylo
b729f4dc84 Add slow query logging to updateSuggestedFrom* methods.
Produces the following output:

D  Explain:
D    SCAN TABLE fdroid_app
D    EXECUTE CORRELATED SCALAR SUBQUERY 0
D    SEARCH TABLE fdroid_apk USING INDEX apk_vercode
D    EXECUTE CORRELATED SCALAR SUBQUERY 1
D    SEARCH TABLE fdroid_app AS innerAppName USING INTEGER PRIMARY KEY (rowid=?)
D    EXECUTE CORRELATED SCALAR SUBQUERY 2
D    SEARCH TABLE fdroid_package AS pkg USING INTEGER PRIMARY KEY (rowid=?)
D    SEARCH TABLE fdroid_installedApp AS installed USING INDEX sqlite_autoindex_fdroid_installedApp_1 (appId=?)

There are two possibilities here, one is the number of correlated sub
queries (three seems a bit excessive). Alterantively, it could be the
fact that one of the inner queries is using a string index (appId=?)
instead of an integer primary key.
2017-06-13 09:05:31 +10:00