958 Commits

Author SHA1 Message Date
Peter Serwylo
e965e97623 Force each stacked notification to have a different requestCode.
This ensures that the `PendingIntent.FLAG_UPDATE_CURRENT` doesn't
continually override earlier intents with the last app to be notified.
This could probably equally be done by leaving the request code as 0 and
removing the FLAG_UPDATE_CURRENT out, however it seems much more
semantic to have a separate request code for each different pending
intent.

Fixes #1021.
2017-05-16 07:58:38 +10:00
Stephen Michel
1f3271d72d remove refresh action from repo management screen 2017-05-15 11:52:28 -04:00
Hans-Christoph Steiner
b848766436 remove translation auto-detect hack, it is too hacky
The hack that goes through and checks whether a language is present in
the APK seems to cause random strings to switch to English when the
app is running.  So this removes that hack, and instead switches the
Languages menu to a hard-coded list.  Languages that are not present
or close to complete were removed from the old list.

closes #943
closes #1010
2017-05-12 23:33:10 +02:00
Hans-Christoph Steiner
2d9e1ecd4f remove unused arguments to Languages.setLanguage() 2017-05-12 23:33:10 +02:00
Peter Serwylo
0df1f765e9 Don't die when failing to bluetooth apk. 2017-05-12 09:23:01 +10:00
Peter Serwylo
09ad7fe3d0 Use FileProvider when bluetoothing apks on API >= 24.
Reuses the code that the installer uses, when it broadcasts to
the relevant installer that an Apk is available for install.

This used to do the following:
 * Copy file to a private directory
 * Make the file world readable (so that PM can access it)
 * Send a file:// URI to the installer

The file:// URI is no longer supported for reasons explained in
the support lib FileProvider class. Now a content:// URI is required,
and that must explicitly grant permission to certain packages.

The existing code here used to grant permission to
org.fdroid.fdroid.privileged, and this code now also grants it to
com.android.bluetooth. I see no security threat with exposing these
files to both applications, because the .apk files only ever:
 * Were downloaded from the public internet into a (potentially public)
   cache dir.
 * Were sourced from an `ApplicationInfo#publicSourceDir, in which
   case any app can access that anyway.

Fises #837.
2017-05-12 09:22:57 +10:00
Peter Serwylo
2f4b00dc75 Formatting 2017-05-12 09:16:58 +10:00
Hans-Christoph Steiner
1b390cceca clear language setting if it matches the system-wide setting
If the user can set the language using the Setting app, then there is
not reason to use the Languages hack.  This then clears the preference
if it matches the language of the system-wide locale.  This also
removes the current system-wide language from the Languages menu.

closes #943
2017-05-11 09:39:00 +02:00
Hans-Christoph Steiner
d1014f7b1f fix "Number formatting does not take into account locale settings."
lint says "Consider using String.format instead."
2017-05-11 09:38:59 +02:00
Hans-Christoph Steiner
186d1dbabb fix SetTextI18n lint warnings and set as error 2017-05-11 09:38:59 +02:00
Hans-Christoph Steiner
151c83218c do not crash if there are no cached APKs
closes #1012
2017-05-11 09:38:59 +02:00
Peter Serwylo
67a29bae8f Include an images full URL in the cache path.
All feature graphics are called `featureGraphic.png`, and so our cache
was presuming all feature graphics were the same image. By including
the full path from the server in the cached name, we don't overwrite
images any more.
2017-05-09 16:03:27 +10:00
Peter Serwylo
bd5503b4cd Rename method as icons are no longer the only thing stored here. 2017-05-09 16:02:08 +10:00
Hans-Christoph Steiner
4e375ca7f8 prevent crash if installing app without icon (closes #1006)
Right now, org.fdroid.fdroid.privileged.ota and FFupdater do not
provide any icons and it seems that that triggers this crash:

ACRA caught a NullPointerException for org.fdroid.fdroid
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.lastIndexOf(int)' on a null object reference
    at org.fdroid.fdroid.FDroidApp$5.generate(FDroidApp.java:282)
    at com.nostra13.universalimageloader.cache.disc.impl.BaseDiskCache.getFile(BaseDiskCache.java:167)
    at com.nostra13.universalimageloader.cache.disc.impl.BaseDiskCache.get(BaseDiskCache.java:98)
    at com.nostra13.universalimageloader.cache.disc.impl.LimitedAgeDiskCache.get(LimitedAgeDiskCache.java:74)
    at com.nostra13.universalimageloader.utils.DiskCacheUtils.findInCache(DiskCacheUtils.java:36)
    at org.fdroid.fdroid.NotificationHelper.getLargeIconForEntry(NotificationHelper.java:506)
    at org.fdroid.fdroid.NotificationHelper.createUpdateNotification(NotificationHelper.java:300)
    at org.fdroid.fdroid.NotificationHelper.createNotification(NotificationHelper.java:191)
    at org.fdroid.fdroid.NotificationHelper.access$400(NotificationHelper.java:37)
    at org.fdroid.fdroid.NotificationHelper$1.onReceive(NotificationHelper.java:106)
    at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
    at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
    at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
2017-05-08 20:16:39 +02:00
Hans-Christoph Steiner
2e2a6bd419 show Toast when file type cannot be installed
This is just a placeholder until we implement proper "installing" for
non-APK files.

!504
#982
2017-05-02 22:00:48 +02:00
Hans-Christoph Steiner
676b2b9093 correct SPDX links when the License: tag contains a +
The "+" is syntax on top of the license name:
https://spdx.org/spdx-specification-21-web-version#h.jxpfx0ykyb60
2017-05-02 21:53:11 +02:00
Chirayu Desai
bbd77c5b79 Add a DummyInstaller to handle non apk files
* Avoids crashes when trying to treat non apk files, such as
  privileged extension ota update.zip as apks
* Doesn't do anything at all for now.

One issue with this is the app is always in the not installed state,
so what would be appropriate here would be to change the text of the
install button to download, and update that accrodingly.
However that is outside of the scope of this change.

TODO:
Add toast indicating the user that they need to install
manually, in case of OTA update.zip
2017-05-03 00:29:03 +05:30
Hans-Christoph Steiner
66612e906c Merge branch 'fix-986--too-many-change-notifications' into 'master'
Bunch together notifications to prevent flickering in UI.

Closes #986

See merge request !502
2017-05-02 14:29:20 +00:00
Hans-Christoph Steiner
16ddcbd5d8 Merge branch 'wipe-etag-on-language-change' into 'master'
Force repo update after changing language.

See merge request !503
2017-05-02 11:18:11 +00:00
Peter Serwylo
18f8817388 Force repo update after changing language.
This zeros out the etag in the fdroid_repo table and then asks
the update service to perform an update.

The end result is that changing the language will result in the metadata
being shown in that language.

Note: This doesn't immediately work due to pending changes around
Locale.setDefault() and the change in case from Summary to summary in
the server metadata.
2017-05-02 16:24:04 +10:00
Peter Serwylo
a9d817441f Bunch together notifications to prevent flickering in UI.
This reverts to the previous behaviour before 8faf151.
Then, the InstalledAppProviderService would queue up a series of
changes, and only notify after 1 second of nothing being added to
the queue. This was good because CursorAdapters and LoaderManagers
would not continually requery the database several times a second (only
once at the end), but it meant there was a lag in the AppDetails screen
getting updated after installing/upgrading/deleting packages.

This restores that behaviour where general events (e.g. "some misc apps
in the database were changed") are "debounced" for 1 second. However it
also emits a more specific "package org.blah.com was changed" instantly.

In the long term, it would be good to remove any dependency on
ContentObservers and `notifyChange()` altogether, in preference of
either LocalBroadcastManager or RxJava. However this will depend on how
we go about changing the database layer in the future. The fact we now
depend on ContentProviders means that it would be a big change to move
away from LoaderManager + notifyChange().

Fixes #986.
2017-05-02 11:09:00 +10:00
Hans-Christoph Steiner
653f577bf9 re-add Sardinian to the Language menu list
closes #991
2017-05-01 23:31:14 +02:00
Hans-Christoph Steiner
2eaf00f9f1 include magic method for setting local via Languages menu
I have found no explanation of what should work and why, but language
choosers seem to always include this line.  This also seems to fix the
bug:

closes #943
2017-05-01 23:31:14 +02:00
Hans-Christoph Steiner
de1cc566a1 show license in the links section
This makes the license a link to the spdx.org page for the app's
license.  I think this is an improvement over the way the license was
displayed before 0.103 since it provides a direct link to the actual
text of the license.

The license icon is a modified version of the public domain icon:
https://commons.wikimedia.org/wiki/File:Cc-sa_white.svg

closes #960
2017-05-01 23:31:14 +02:00
Chirayu Desai
ef6c03c45d AppDetails2: bring back getInstalledApk() from AppDetails
* Addition: Try to get apk details via InstalledAppProvider too.
 * In certain cases, such as the "UnifiedNlp (no GAPPS)" app on a device
   with actualy GAPPS / GMS installed, apk can be null which leads
   to a crash
 * Ask InstalledAppProvider for the app's details too, like it
   was done in the old UX AppDetails.
 * Also seen when uninstalling app with a signing key different,
   fixes #985
2017-05-02 00:47:08 +05:30
Hans-Christoph Steiner
0a59c5c6e5 fully write up locale choosing for the 'localized' block
This is how locales are handled when parsing the index from the server.
2017-04-28 10:41:30 +02:00
Hans-Christoph Steiner
4d785bd6bd use better variable name for the set of available locales 2017-04-28 10:41:30 +02:00
Hans-Christoph Steiner
03168ff99e separate index locale preference handling on >= android-24
In android-24 and newer, the user can specify multiple languages in a
priority list. Therefore, the locale chooser logic here does not need
to work so hard to find a language match.  For example, if the user
wanted to see country-specific variants, they would add them to the
preference list.

With older versions of Android, the pref is only a single locale. So
chances are that someone who specified de_AT would rather see de or
de_DE than en_US.  Same goes for es_AR, ar_EG, etc.  This could annoy
Chinese speakers, since someone who sets zh_TW could potentially see
zh_CN, which are written pretty differently.
2017-04-28 10:41:30 +02:00
Hans-Christoph Steiner
dc57fd712b rename index-v1 'localized' key names to match fdroidserver
This makes the key names standardized across fdroidclient,
fdroidserver, and index-v1.json.

fdroidserver!261
2017-04-28 10:41:30 +02:00
Hans-Christoph Steiner
bdc9a14c2a use android-24+ LocaleList when choosing localized index data
When choosing localized data from the index, this includes the new
LocaleList feature that represents the user's preferred locale ranking

https://developer.android.com/reference/android/os/LocaleList.html
2017-04-28 10:41:30 +02:00
Hans-Christoph Steiner
add570ab4b hide Languages pref on >= android-24
Android 24 and later provides tons of languages, and a way to rank
multiple languages instead of choosing one.  The Languages pref is a
big hack and can be problematic, so its better to disable it when its
not needed.  This will make it so it is no longer possible to set
F-Droid to a language that the system does not support.

#943
2017-04-28 10:41:30 +02:00
Hans-Christoph Steiner
50982060ac support index locales that do not include country (e.g. 'en') 2017-04-28 10:41:30 +02:00
Hans-Christoph Steiner
2586e87524 clear Languages pref when using System Default
Keeps things clean if System Default clears out the pref entirely.
2017-04-28 10:41:30 +02:00
Hans-Christoph Steiner
5febedebd6 fix mispelled Languages.getLanguages() 2017-04-28 10:41:30 +02:00
Hans-Christoph Steiner
561a18ad2b Merge branch 'fix-962--notify-of-downloaded' into 'master'
Show downloaded + not installed apps in "Updates"

Closes #962

See merge request !488
2017-04-28 08:38:12 +00:00
Peter Serwylo
6c08e054f5 Calc suggested versioncode properly, regardless of repo priorities.
There was a bug where the repo with the highest priority would be
responsible for specifying the suggested version code. When doing so, it
would only select from the list of apks available in that repo. This
improves the calculation so that when any given repos app gets a
suggested version code assigned, it selects from _all_ available apks,
not just those from the repository in question.

Fixes #974.
2017-04-28 11:50:08 +10:00
Peter Serwylo
69816b5b82 Only and if there are any there. 2017-04-28 09:12:53 +10:00
Peter Serwylo
25edfffcbe Remove version check, allow version downgrades to appear in Updates tab correctly.
The version check guarded against downgrades, and would not notify the
user if it found a downgrade in the apk cache. However this was from
before we could ask `AppUpdateStatusManager#isPendingInstall(hash)`. Now
we don't need to care whether it is an upgrade or a downgrade, because
there is a more authoritative source as to whether this apk is
interesting to us or not.
2017-04-28 09:12:33 +10:00
Peter Serwylo
0d1e00b6cf Don't accidentally return Apk instances from the wrong repo
There may be multiple apk files with the same hash. Although it is not a
security issue to install one or the other (they are exactly the same
binary), they may have different metadata to display in the client.
Thus, it may result in weirdness if one has a different
name/description/summary etc).

This change takes each of the matching Apk objects from the database,
then asks them where they expect to be downloaded. It matches this
against the File that we are looking at and only returns if they match.
2017-04-28 08:34:00 +10:00
Hans-Christoph Steiner
f8c9d7ec8e Merge branch '0.103-alpha3--ui-fixes' into 'master'
0.103-alpha3  UI fixes

Closes #981, #967, and #965

See merge request !490
2017-04-26 10:34:02 +00:00
Peter Serwylo
06088e2b35 Send acra report about crash we are getting, but don't crash F-Droid 2017-04-26 19:39:26 +10:00
Peter Serwylo
7375e09d19 Fail softly, notifying user of failure rather than crashing, 2017-04-26 08:38:41 +10:00
Peter Serwylo
e6c6c28f5f Formatting + PMD fix in response to CR
PMD does not like manually throwing NPEs, even if they have more verbose
information than the default NPE. As such, use an
`IllegalArgumentException` instead.
2017-04-26 08:38:03 +10:00
Peter Serwylo
2a6dcb63bb Check for null in App#iconUrl.
Although I'm unsure of exactly why this is `null`, it seems sensible
that there is a possibility of null icons (e.g. for .zip files or other
media). As such, this just adds a guard condition to ensure that the
`iconUrl` is not null.

Fixes #981.
2017-04-26 08:28:25 +10:00
Peter Serwylo
6a0b16fc7d Increase verbosity around crash site for better ACRA reports.
Received the following crash report, where the user said it crashed
while trying to install the priviledged extension:

```
java.lang.NullPointerException: Attempt to read from field 'android.content.pm.Signature[] android.content.pm.PackageInfo.signatures' on a null object reference
at org.fdroid.fdroid.installer.ApkSignatureVerifier.getApkSignature(ApkSignatureVerifier.java:70)
at org.fdroid.fdroid.installer.ApkSignatureVerifier.hasFDroidSignature(ApkSignatureVerifier.java:54)
at org.fdroid.fdroid.installer.ExtensionInstaller.installPackageInternal(ExtensionInstaller.java:53)
at org.fdroid.fdroid.installer.Installer.installPackage(Installer.java:265)
at org.fdroid.fdroid.installer.InstallerService.onHandleIntent(InstallerService.java:77)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.os.HandlerThread.run(HandlerThread.java:61)
```

Not sure how to address it yet, so adding more specific excetpion for
if it happens in the future.
2017-04-26 08:28:24 +10:00
Peter Serwylo
1eb224fc5e Don't show run button for apps which cannot be launched.
The feedback from ACRA was:

> tried to run an app that doesn't have a launcher (termux api)
2017-04-26 08:28:24 +10:00
Peter Serwylo
4cc6e5bc89 Sort categories alphabetically by name.
This pulls all the categories out of the database at once for sorting,
rather than sorting in SQLite. This is to prevent having to store the
localized category names in the database (and hence having to update
them when the locale is changed).

Fixes #967.
2017-04-26 08:28:24 +10:00
Peter Serwylo
e2c82d2943 Accessibility tweaks in app details.
* Correctly read out "Cancel download"
 * Allow users to hear download progress correctly.
2017-04-26 08:28:24 +10:00
Peter Serwylo
bae5bdb1f4 Force apps in "Installed" list to sort by name.
Previously they were left to be sorted however SQLite parsed the query.
This turned out to result in them beign sorted by repos first, then
names. For example, all of the GP apps would be at the bottom of the
list.

Fixes #965.
2017-04-26 08:28:24 +10:00
Chirayu Desai
86ba3bb6c6 Set app theme for Privileged Extension's Install Confirm Activity
* This applies the dark theme correctly.
2017-04-25 19:05:43 +05:30