Compare commits

..

1328 Commits

Author SHA1 Message Date
karl.hudgell
c5fa250331 new icons and settings. 2021-06-23 09:09:07 +01:00
karl.hudgell
a51588ddd2 get working for bobStore 2021-06-22 19:33:08 +01:00
Hans-Christoph Steiner
b066c40176 Merge branch 'immersive-status-bar' into 'master'
Use transparent status bar color

Closes #2203

See merge request fdroid/fdroidclient!1029
2021-06-17 06:38:02 +00:00
proletarius101
bbc2c6b35a Use transparent status bar color 2021-06-17 06:37:31 +00:00
Hans-Christoph Steiner
42b0b576d1
Merge 'Use_ActivityCompat_recreate' into 'master'
* Use_ActivityCompat_recreate:
  resync gradle verification metadata
  Use ActivityCompat.recreate().

fdroid/fdroidclient!1028
2021-06-16 14:37:07 +02:00
Hans-Christoph Steiner
39f680bb24
resync gradle verification metadata 2021-06-16 14:35:10 +02:00
Isira Seneviratne
19ffd2b491 Use ActivityCompat.recreate(). 2021-06-16 12:29:32 +00:00
Hans-Christoph Steiner
a8efa1ac07 Merge branch 'mainline' into 'master'
Read additional_repos.xml from /product as well

See merge request fdroid/fdroidclient!1026
2021-06-16 12:26:29 +00:00
Chirayu Desai
240b7af585 Read additional_repos.xml from /product as well
Change-Id: Id4a99204e4be467f4e3b1d6684eeb86a19a614f2
2021-06-16 11:55:29 +00:00
Hans-Christoph Steiner
345915cdf4 Merge branch '2126-scroll-search' into 'master'
Scroll to first item when search term changes

Closes #2126

See merge request fdroid/fdroidclient!1027
2021-06-16 09:32:49 +00:00
mueller-ma
d7fb1e0044 Scroll to first item when search term changes
Fixes #2126
2021-06-16 09:32:07 +00:00
Hans-Christoph Steiner
0d8018b10e Merge branch 'Replace_AsyncTask_with_RxJava_3' into 'master'
Replace AsyncTask implementations with RxJava 3.

See merge request fdroid/fdroidclient!947
2021-06-15 09:36:55 +00:00
Hans-Christoph Steiner
d9b443429d bump to latest io.reactivex.rxjava3:rxjava 2021-06-15 11:04:22 +02:00
Hans-Christoph Steiner
e698f4f8a3
revert unneeded/unrelated changes 2021-06-15 10:55:22 +02:00
Hans-Christoph Steiner
c27e1a697e
format imports using default Android Studio 4.1.2 settings 2021-06-15 10:55:20 +02:00
Isira Seneviratne
d549fb905d
fix checkstyle LineLength 2021-06-15 10:55:17 +02:00
Isira Seneviratne
c758cb60d9 Fix checkstyle issues. 2021-06-15 08:51:16 +00:00
Isira Seneviratne
eab5ef59b9 Use RxJava instead of AsyncTask to handle updates. 2021-06-15 08:51:16 +00:00
Isira Seneviratne
c0a699e21e Handle server swapping using RxJava instead of AsyncTask. 2021-06-15 08:51:16 +00:00
Isira Seneviratne
242662d02a Create new repos using RxJava instead of AsyncTask. 2021-06-15 08:51:16 +00:00
Isira Seneviratne
e1ca1552f7 Generate a QR bitmap using RxJava instead of AsyncTask. 2021-06-15 08:51:16 +00:00
Isira Seneviratne
93a160b40d Use RxJava 3 types in InstalledAppProviderService. 2021-06-15 08:51:16 +00:00
Isira Seneviratne
5fad229dbe Update RxJava to version 3. 2021-06-15 08:51:16 +00:00
Hans-Christoph Steiner
43a809490c use synchronized for methods that override synchronized methods 2021-06-14 16:36:42 +02:00
Hans-Christoph Steiner
a02ba42cf9
version code 1013001 2021-06-02 22:55:24 +02:00
Hans-Christoph Steiner
3ca9d47aae
update CHANGELOG 2021-06-02 22:55:22 +02:00
Hans-Christoph Steiner
c3e81e0f45
document constant that is used externally
refs #2147
2021-06-02 22:55:20 +02:00
Hans-Christoph Steiner
c7fd1f186b
Android Studio Ctrl-Alt-L code formatting 2021-06-02 22:55:18 +02:00
Hans-Christoph Steiner
ed2b119f33
update PGP key for new expiration date
closes admin#220
closes fdroidclient#2093
2021-06-02 22:55:14 +02:00
Hans-Christoph Steiner
465e92f8bc Merge branch 'TLSv1.2-min' into 'master'
bump netcipher to 2.2.0-alpha to get TorServices and TLSv1.2 min

See merge request fdroid/fdroidclient!1023
2021-06-02 20:33:33 +00:00
Hans-Christoph Steiner
09c7b21fd8
bump netcipher to 2.2.0-alpha to get TorServices and TLSv1.2 min
NetCipher provides the interface for starting Tor on demand.  It also
provides the mechanism to upgrade the TLS settings to the best possible,
based on what each device is capable of.
2021-06-02 22:02:29 +02:00
Hans-Christoph Steiner
6671683d08
fix format strings 2021-06-02 22:02:27 +02:00
Hans-Christoph Steiner
9e6d931e3b
fix lint Typo: "internett" is usually capitalized as "Internett"
sed -i 's,internett,Internett,g' app/src/main/res/values-nb/strings.xml
2021-06-02 22:02:20 +02:00
Kristoffer Grundström
64c349e39a Translated using Weblate: Swedish (sv) by Kristoffer Grundström <swedishsailfishosuser@tutanota.com>
Currently translated at 99.7% (467 of 468 strings)

Co-authored-by: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Klemen Skerbiš
bea8b77538 Translated using Weblate: Slovenian (sl) by Klemen Skerbiš <klemen.skerbis1@gmail.com>
Currently translated at 96.7% (453 of 468 strings)

Co-authored-by: Klemen Skerbiš <klemen.skerbis1@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sl/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Слободан Симић(Slobodan Simić)
480e98144d Translated using Weblate: Serbian (sr) by Слободан Симић(Slobodan Simić) <slsimic@gmail.com>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Serbian (sr) by Слободан Симић(Slobodan Simić) <slsimic@gmail.com>

Currently translated at 13.8% (5 of 36 strings)

Translated using Weblate: Serbian (sr) by Слободан Симић(Slobodan Simić) <slsimic@gmail.com>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Слободан Симић(Slobodan Simić) <slsimic@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sr/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Roman Leo
7037bc3e9c Translated using Weblate: German (de) by Roman Leo <roman.leo@gmx.de>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Roman Leo <roman.leo@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Software In Interlingua
4e241f9b1b Added translation using Weblate: Interlingua (ia) by Software In Interlingua <softinterlingua@gmail.com>
Co-authored-by: Software In Interlingua <softinterlingua@gmail.com>
2021-06-02 20:05:42 +02:00
GnuPGを使うべきだ
79ea0a08c3 Translated using Weblate: Japanese (ja) by GnuPGを使うべきだ <dieeeazpnnqbpddh@cock.email>
Currently translated at 97.0% (454 of 468 strings)

Co-authored-by: GnuPGを使うべきだ <dieeeazpnnqbpddh@cock.email>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
vancha
e02b8cd80e Translated using Weblate: Frisian (fy) by vancha <tjipke@tutanota.com>
Currently translated at 21.5% (101 of 468 strings)

Added translation using Weblate: Frisian (fy) by vancha <tjipke@tutanota.com>

Co-authored-by: vancha <tjipke@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fy/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Translator
ba56933e87 Translated using Weblate: Hindi (hi) by Translator <pahatih716@to200.com>
Currently translated at 99.3% (465 of 468 strings)

Co-authored-by: Translator <pahatih716@to200.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hi/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Myeongjin Lee
45ad90bfbc Translated using Weblate: Korean (ko) by Myeongjin Lee <aranet100@gmail.com>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Korean (ko) by Myeongjin Lee <aranet100@gmail.com>

Currently translated at 97.6% (457 of 468 strings)

Co-authored-by: Myeongjin Lee <aranet100@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ko/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
random r
35f6e25d18 Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: random r <epsilin@yopmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Besnik Bleta
b031cf3d07 Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
moar pics
3821b9e6d6 Translated using Weblate: Albanian (sq) by moar pics <m0arpicsss@gmail.com>
Currently translated at 99.5% (466 of 468 strings)

Co-authored-by: moar pics <m0arpicsss@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Jonas Matisen
21354b76ff Translated using Weblate: Norwegian Bokmål (nb) by Jonas Matisen <hdsumo@protonmail.ch>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Jonas Matisen <hdsumo@protonmail.ch>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
nautilusx
602c203495 Translated using Weblate: German (de) by nautilusx <translate@disroot.org>
Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: German (de) by nautilusx <translate@disroot.org>

Currently translated at 100.0% (36 of 36 strings)

Co-authored-by: nautilusx <translate@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Watson15683
0ead57926c Translated using Weblate: German (de) by Watson15683 <peter.parker2@tutanota.com>
Currently translated at 100.0% (36 of 36 strings)

Co-authored-by: Watson15683 <peter.parker2@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Keunes
002b01823e Translated using Weblate: Dutch (nl) by Keunes <koen.glotzbach@gmail.com>
Currently translated at 99.7% (467 of 468 strings)

Co-authored-by: Keunes <koen.glotzbach@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Karl Ove Hufthammer
45ed83501e Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>
Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Karl Ove Hufthammer <karl@huftis.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nn/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nn/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
WaldiS
2c69c5ccf3 Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: WaldiS <sto@tutanota.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Manuela Silva
e52b8a27d6 Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Manuela Silva <mmsrs@sky.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Manuela Silva <mmsrs@sky.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Nicolas Mariniello
2dc8deca59 Translated using Weblate: Italian (it) by Nicolas Mariniello <seldon1000@tutanota.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Nicolas Mariniello <seldon1000@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
J. Lavoie
25392dd8bd Translated using Weblate: English (United Kingdom) (en-rGB) by J. Lavoie <j.lavoie@net-c.ca>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Italian (it) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 99.7% (467 of 468 strings)

Translated using Weblate: French (fr) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/en_GB/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Oymate
60a8eccb5f Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 94.2% (441 of 468 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 87.6% (410 of 468 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 82.9% (388 of 468 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 76.9% (360 of 468 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 64.3% (301 of 468 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 57.4% (269 of 468 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 51.7% (242 of 468 strings)

Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 29.4% (138 of 468 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 48.0% (225 of 468 strings)

Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 29.0% (136 of 468 strings)

Co-authored-by: Oymate <dhruboadittya96@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn_BD/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Priit Jõerüüt
6cf9e9d105 Translated using Weblate: Estonian (et) by Priit Jõerüüt <hwlate@joeruut.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Priit Jõerüüt <hwlate@joeruut.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/et/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Francesc Sanjuán farré
5489f0a089 Translated using Weblate: Catalan (ca) by Francesc Sanjuán farré <fran@franer.systems>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Francesc Sanjuán farré <fran@franer.systems>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Rafael Ruiz
cc12359ba6 Translated using Weblate: Catalan (ca) by Rafael Ruiz <rafael.ruiz@upc.edu>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Catalan (ca) by Rafael Ruiz <rafael.ruiz@upc.edu>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Rafael Ruiz <rafael.ruiz@upc.edu>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Milo Ivir
173aa6792a Translated using Weblate: Croatian (hr) by Milo Ivir <mail@milotype.de>
Currently translated at 92.7% (434 of 468 strings)

Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hr/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Ranjith Kumar
72c0c6f4a6 Translated using Weblate: Tamil (ta) by Ranjith Kumar <sranjith096@gmail.com>
Currently translated at 36.1% (169 of 468 strings)

Co-authored-by: Ranjith Kumar <sranjith096@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ta/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
whenwesober
5e8948b534 Translated using Weblate: Indonesian (id) by whenwesober <naomi16i_1298q@cikuh.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: whenwesober <naomi16i_1298q@cikuh.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/id/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
ssantos
19b7b57b43 Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Andrey
ae37d587d4 Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Licaon Kter
0f635d6e80 Translated using Weblate: Romanian (ro) by Licaon Kter <licaon.kter@protonmail.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Licaon Kter <licaon.kter@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ro/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Wellington Terumi Uemura
eeb5f5f2ec Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
alefvanoon
4342d87b37 Translated using Weblate: Persian (fa) by alefvanoon <alefvanoon@tuta.io>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: alefvanoon <alefvanoon@tuta.io>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Sina Carnelious
27ddf42897 Translated using Weblate: Persian (fa) by Sina Carnelious <sinacarnelious@protonmail.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Sina Carnelious <sinacarnelious@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
C. Rüdinger
b642b14d5a Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: C. Rüdinger <Mail-an-CR@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
zeritti
b2a9854e1a Translated using Weblate: Czech (cs) by zeritti <woodenmo@posteo.de>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: zeritti <woodenmo@posteo.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/cs/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Rex_sa
9d738f0d9d Translated using Weblate: Arabic (ar) by Rex_sa <rex.sa@pm.me>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Arabic (ar) by Rex_sa <rex.sa@pm.me>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Rex_sa <rex.sa@pm.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
André Marcelo Alvarenga
d32d866393 Translated using Weblate: Portuguese (Brazil) (pt-rBR) by André Marcelo Alvarenga <andrealvarenga@gmx.net>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: André Marcelo Alvarenga <andrealvarenga@gmx.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Athanasios Plastiras
f09434869e Translated using Weblate: Greek (el) by Athanasios Plastiras <admin@plastiras.org>
Currently translated at 99.7% (467 of 468 strings)

Co-authored-by: Athanasios Plastiras <admin@plastiras.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Jeff Huang
f12f6694c4 Translated using Weblate: Chinese (Traditional) (zh-rTW) by Jeff Huang <s8321414@gmail.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Jeff Huang <s8321414@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hant/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Eric
6a3d989778 Translated using Weblate: Chinese (Simplified) (zh-CN) by Eric <spice2wolf@gmail.com>
Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Chinese (Simplified) (zh-rCN) by Eric <spice2wolf@gmail.com>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Eric <spice2wolf@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
bruh
de1b05d307 Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>

Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: bruh <quangtrung02hn16@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/vi/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Ihor Hordiichuk
16ab3672cd Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Oğuz Ersen
108b9e4bf4 Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Ajeje Brazorf
82d1fe8815 Translated using Weblate: Sardinian (sc) by Ajeje Brazorf <lmelonimamo@yahoo.it>
Currently translated at 5.5% (2 of 36 strings)

Translated using Weblate: Sardinian (sc) by Ajeje Brazorf <lmelonimamo@yahoo.it>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sc/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sc/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
S3aBreeze
ecc017845d Translated using Weblate: Russian (ru) by S3aBreeze <paperwork@evilcorp.ltd>
Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Russian (ru) by S3aBreeze <paperwork@evilcorp.ltd>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: S3aBreeze <paperwork@evilcorp.ltd>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Wellington Terumi Uemura
6b2157fc1c Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Yaron Shahrabani
b8b4da7ac9 Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/he/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Deleted User
0b3edc812c Translated using Weblate: French (fr) by Deleted User <noreply+26956@weblate.org>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Deleted User <noreply+26956@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Ldm Public
30521f00cd Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Ldm Public <ldmpub@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Kkai
4eea2cb4e1 Translated using Weblate: Spanish (es) by Kkai <kaieltroll@gmail.com>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Kkai <kaieltroll@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
☆Verdulo
aa2537eb6d Translated using Weblate: Esperanto (eo) by ☆Verdulo <tomek@disroot.org>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: Esperanto (eo) by ☆Verdulo <tomek@disroot.org>

Currently translated at 100.0% (36 of 36 strings)

Translated using Weblate: Esperanto (eo) by ☆Verdulo <tomek@disroot.org>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: ☆Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-06-02 20:05:42 +02:00
Hans-Christoph Steiner
1747a0a737 Translated using Weblate: German (de) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: Hans-Christoph Steiner <hans@guardianproject.info>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
VfBFan
60c41783cc Translated using Weblate: German (de) by VfBFan <drop0815@posteo.de>
Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: German (de) by VfBFan <drop0815@posteo.de>

Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: German (de) by VfBFan <drop0815@posteo.de>

Currently translated at 100.0% (468 of 468 strings)

Translated using Weblate: German (de) by VfBFan <drop0815@posteo.de>

Currently translated at 100.0% (468 of 468 strings)

Co-authored-by: VfBFan <drop0815@posteo.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-06-02 20:05:42 +02:00
Chirayu Desai
3d53b22e37 Merge branch 'master' into 'master'
Fix Trichrome Library installation status mismatch

Closes #2184

See merge request fdroid/fdroidclient!1002
2021-06-02 18:05:23 +00:00
Hans-Christoph Steiner
719a599c41 Merge branch 'theme_screenshot_placeholder' into 'master'
theme the screenshot placeholder

Closes #2127

See merge request fdroid/fdroidclient!1007
2021-06-02 16:32:52 +00:00
Conny Duck
10111b2beb theme the screenshot placeholder 2021-06-02 16:32:51 +00:00
Hans-Christoph Steiner
1fd3b308e9 Merge branch 'remove_mainactivity_saved_state' into 'master'
remove unneeded saved state handling in MainActivity

See merge request fdroid/fdroidclient!1017
2021-06-02 12:33:01 +00:00
Konrad Pozniak
ee5c2b6632 remove unneeded saved state handling in MainActivity 2021-06-02 10:24:26 +00:00
Hans-Christoph Steiner
6155bdbe20 Merge branch 'crane-shape-theming' into 'master'
Consistent round shape theming by parameters from Crane

See merge request fdroid/fdroidclient!1013
2021-06-02 10:21:14 +00:00
proletarius101
8ffbd0b44d Consistent round shape theming by parameters from Crane 2021-06-02 10:21:14 +00:00
Hans-Christoph Steiner
a5d678b72e Merge branch 'fix-bottom-navigation-bar-dark-theme-color' into 'master'
Change the bottom navigation bar to the material component one

See merge request fdroid/fdroidclient!1008
2021-05-18 12:39:58 +00:00
proletarius101
e48c49ce0c Change the bottom navigation bar to the material component one 2021-05-18 12:39:58 +00:00
Hans-Christoph Steiner
7993b04cf4 Merge branch 'mdc-text-fields' into 'master'
Migrate to MDC text fields

See merge request fdroid/fdroidclient!1012
2021-05-18 12:01:16 +00:00
proletarius101
ca54511cf6 Migrate to MDC text fields 2021-05-18 12:01:15 +00:00
Hans-Christoph Steiner
fc463810f6 Merge branch 'mdc-switches' into 'master'
Migrate to MDC switches

See merge request fdroid/fdroidclient!1014
2021-05-18 11:37:53 +00:00
proletarius101
a1369cdd67 Migrate to MDC switches 2021-05-18 11:35:52 +00:00
Hans-Christoph Steiner
3178624b4b Merge branch 'mdc-cards' into 'master'
Migrate CardView to MaterialCardView

See merge request fdroid/fdroidclient!1011
2021-05-18 10:53:43 +00:00
proletarius101
2530487483 Migrate CardView to MaterialCardView 2021-05-18 10:53:17 +00:00
Hans-Christoph Steiner
03c16e3f1b Merge branch 'fix-sort-botton-tint' into 'master'
Fix sort button tint

See merge request fdroid/fdroidclient!1010
2021-05-18 10:48:20 +00:00
proletarius101
fee35fe285 Fix sort button tint 2021-05-17 17:34:24 +00:00
Hans-Christoph Steiner
b310032cf5 Merge branch 'fix-pipeline-badge' into 'master'
Fix pipeline badge in README

See merge request fdroid/fdroidclient!1009
2021-05-17 16:55:55 +00:00
Benedikt Brückmann
07aae0674f Fix pipeline badge in README
relates to fdroid/fdroidclient#2173
2021-05-17 11:05:34 +02:00
Hans-Christoph Steiner
cbea1539f8 Merge branch 'fix_opencollective_badge' into 'master'
improve opencollective badge

See merge request fdroid/fdroidclient!1006
2021-05-13 22:02:32 +00:00
Konrad Pozniak
90d514ac6a improve opencollective badge 2021-05-13 21:32:21 +00:00
Hans-Christoph Steiner
97bc77b03a Merge branch 'fix_opencollective_link_not_shown' into 'master'
fix opencollective badge not shown when it is the only donation option

See merge request fdroid/fdroidclient!1005
2021-05-13 21:30:54 +00:00
Konrad Pozniak
02ee182508 fix opencollective badge not shown when it is the only donation option 2021-05-12 20:40:35 +02:00
Hans-Christoph Steiner
6e2b258eee Merge branch 'change-link-icon' into 'master'
Use the Material Design link icon (chain) for links

See merge request fdroid/fdroidclient!1004
2021-05-06 13:11:53 +00:00
proletarius101
5a183d27d1 Use the Material Design link icon for links 2021-05-05 22:21:03 +08:00
Oliver Scott
b52c7ca39a Remove duplicate entries from installed packages list 2021-04-30 13:27:19 +00:00
Oliver Scott
e677d815d4 Sync installed app database with package manager on PACKAGE_CHANGED for shared libraries 2021-04-30 13:27:19 +00:00
Hans-Christoph Steiner
471d2b86c7 Merge branch 'update-material-componnets-library' into 'master'
Update material components library to 1.3.0

See merge request fdroid/fdroidclient!1003
2021-04-28 16:34:47 +00:00
proletarius101
aaf08fea0c Update material components library to 1.3.0 2021-04-28 19:17:05 +08:00
Hans-Christoph Steiner
37275e2c7c
version code 1013000 2021-04-22 11:59:10 +02:00
Hans-Christoph Steiner
723a4996fb
update CHANGELOG 2021-04-22 11:59:06 +02:00
Hans-Christoph Steiner
cb53c8bbd6 Merge 'fix-icon' into master
* origin/fix-icon:
  use Android Studio default Ctrl-Alt-L to format all AndroidManifest.xml
  fully separate "Last Updated" icon from "Versions"
  purge unused AboutActivity

fdroid/fdroidclient!1001
2021-04-22 11:58:18 +02:00
Hans-Christoph Steiner
cc37dab980 Merge branch 'weblate' into 'master'
weblate

See merge request fdroid/fdroidclient!1000
2021-04-22 09:53:24 +00:00
Hans-Christoph Steiner
24ed554b1d use Android Studio default Ctrl-Alt-L to format all AndroidManifest.xml 2021-04-22 11:24:38 +02:00
Hans-Christoph Steiner
deea4bd696 fully separate "Last Updated" icon from "Versions"
These two are the same shape, but different sizes, and this is an easy way
to manage the sizes.

closes #2148
2021-04-22 11:24:38 +02:00
Hans-Christoph Steiner
7db4456aae purge unused AboutActivity
!963 made it an AlertDialog
2021-04-22 11:24:38 +02:00
Hans-Christoph Steiner
98c204e74e rename: update_notification_title --> banner_updating_repositories
sed -i 's,update_notification_title,banner_updating_repositories,g' app/src/main/res/values*/strings.xml
2021-04-22 11:00:53 +02:00
Sérgio Morais
028d5f5a4f Translated using Weblate: Portuguese (pt) by Sérgio Morais <lalocas@protonmail.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Sérgio Morais <lalocas@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
j.kemu
4716e77e6d Translated using Weblate: Burmese (my) by j.kemu <zartlike@mailinator.com>
Currently translated at 51.2% (239 of 466 strings)

Co-authored-by: j.kemu <zartlike@mailinator.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/my/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Aryan L
c1f8862128 Translated using Weblate: Hindi (hi) by Aryan L <aryan.landge@icloud.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Aryan L <aryan.landge@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hi/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Aputsiaĸ Niels Janussen
05564afdec Translated using Weblate: Danish (da) by Aputsiaĸ Niels Janussen <aj@isit.gl>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Aputsiaĸ Niels Janussen <aj@isit.gl>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/da/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
whenwesober
b1856022c6 Translated using Weblate: Indonesian (id) by whenwesober <naomi16i_1298q@cikuh.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: whenwesober <naomi16i_1298q@cikuh.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/id/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Jonatan Nyberg
b201a4ed0c Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>

Currently translated at 99.3% (463 of 466 strings)

Co-authored-by: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
mondstern
a34c6e316b Translated using Weblate: Italian (it) by mondstern <mondstern@snopyta.org>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: mondstern <mondstern@snopyta.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
J. Lavoie
f6a630c5c9 Translated using Weblate: English (United Kingdom) (en-rGB) by J. Lavoie <j.lavoie@net-c.ca>
Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: German (de) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: German (de) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/en_GB/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Christian Eichert
6bc82c3cff Translated using Weblate: German (de) by Christian Eichert <c@zp1.net>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Christian Eichert <c@zp1.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Wellington Terumi Uemura
a0e33276b6 Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
سهیل خانعلی‌پور
42754339db Translated using Weblate: Persian (fa) by سهیل خانعلی‌پور <soheil@disroot.org>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: سهیل خانعلی‌پور <soheil@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
FintasticMan
a8a6dfc802 Translated using Weblate: Dutch (nl) by FintasticMan <finlay.davidson@coderclass.nl>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: FintasticMan <finlay.davidson@coderclass.nl>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Line
29c608b176 Translated using Weblate: Latvian (lv) by Line <LineAirline@protonmail.com>
Currently translated at 86.9% (405 of 466 strings)

Co-authored-by: Line <LineAirline@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lv/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
janne ojanperä
2be3c0509b Translated using Weblate: Finnish (fi) by janne ojanperä <janne.ojanpera@iki.fi>
Currently translated at 97.8% (456 of 466 strings)

Co-authored-by: janne ojanperä <janne.ojanpera@iki.fi>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
peylight
86f0891321 Translated using Weblate: Persian (fa) by peylight <peylight@riseup.net>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: peylight <peylight@riseup.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Besnik Bleta
72757fd653 Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Baptiste H
a534f37efb Translated using Weblate: French (fr) by Baptiste H <baptiste.huchon@bechamail.fr>
Currently translated at 94.4% (34 of 36 strings)

Co-authored-by: Baptiste H <baptiste.huchon@bechamail.fr>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/
Translation: F-Droid/F-Droid metadata
2021-04-22 10:44:23 +02:00
Shashank Pujari
246936ede7 Translated using Weblate: Kannada (kn) by Shashank Pujari <shashankppujari@gmail.com>
Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: Hindi (hi) by Shashank Pujari <shashankppujari@gmail.com>

Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Shashank Pujari <shashankppujari@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hi/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/kn/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Michał
dd69feac52 Translated using Weblate: Polish (pl) by Michał <matmatyk@protonmail.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Michał <matmatyk@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Jeff Huang
36fc7a4eed Translated using Weblate: Chinese (Traditional) (zh-rTW) by Jeff Huang <s8321414@gmail.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Jeff Huang <s8321414@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hant/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Priit Jõerüüt
fb5c273c8e Translated using Weblate: Estonian (et) by Priit Jõerüüt <hwlate@joeruut.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Priit Jõerüüt <hwlate@joeruut.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/et/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Ihor Hordiichuk
d8f9aa7bd7 Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Ajeje Brazorf
5b2af1b0c8 Translated using Weblate: Sardinian (sc) by Ajeje Brazorf <lmelonimamo@yahoo.it>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sc/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
rhyte
97ee9bf5fe Translated using Weblate: Romanian (ro) by rhyte <vmhl.ph@gmail.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: rhyte <vmhl.ph@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ro/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Yaron Shahrabani
4f789c560d Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/he/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Ldm Public
aca7faa3fa Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>
Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Ldm Public <ldmpub@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Verdulo
422bba662f Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (466 of 466 strings)

Co-authored-by: Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
Malte Jürgens
b2687ca1d6 Translated using Weblate: German (de) by Malte Jürgens <maltejur@web.de>
Currently translated at 99.5% (464 of 466 strings)

Co-authored-by: Malte Jürgens <maltejur@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
random r
edff08c3c2 Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>
Currently translated at 100.0% (36 of 36 strings)

Co-authored-by: random r <epsilin@yopmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/
Translation: F-Droid/F-Droid metadata
2021-04-22 10:44:23 +02:00
Oymate
e7014bf7ac Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>
Currently translated at 46.3% (216 of 466 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 46.7% (217 of 464 strings)

Co-authored-by: Oymate <dhruboadittya96@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn/
Translation: F-Droid/F-Droid
2021-04-22 10:44:23 +02:00
bruh
5c8c46f3ad Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>
Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>

Currently translated at 8.3% (3 of 36 strings)

Co-authored-by: bruh <quangtrung02hn16@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/vi/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/vi/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-04-22 10:44:23 +02:00
Allan Nordhøy
6b73ed74ed Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
Translation: F-Droid/F-Droid
2021-04-22 10:43:32 +02:00
Eric
7912f12cf5 Translated using Weblate: Chinese (Simplified) (zh-rCN) by Eric <spice2wolf@gmail.com>
Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: Chinese (Simplified) (zh-CN) by Eric <spice2wolf@gmail.com>

Currently translated at 100.0% (36 of 36 strings)

Co-authored-by: Eric <spice2wolf@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-04-22 10:43:32 +02:00
Oğuz Ersen
001a337994 Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (36 of 36 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-04-22 10:43:32 +02:00
Andrey
f7895cea87 Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (466 of 466 strings)

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (36 of 36 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-04-22 10:43:32 +02:00
Nikolai Ommundsen
f91728b081 Translated using Weblate: Norwegian Bokmål (nb) by Nikolai Ommundsen <post@niikoo.net>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Nikolai Ommundsen <post@niikoo.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
Translation: F-Droid/F-Droid
2021-04-22 10:43:32 +02:00
Chirayu Desai
c9fbb97018 Merge branch 'only-update-local-repos-without-internet' into 'master'
when no internet and local repos, only update local repos

Closes #2146

See merge request fdroid/fdroidclient!997
2021-04-21 20:32:08 +00:00
Hans-Christoph Steiner
18a43ac471 ignore system partition repos when checking for local repos
The system partition repos like shipped with CalyxOS are not really visible
to the user, they are built-in.  So they should not prevent the warning
banner showing when the user has switched Over Data and Over WiFi to never.
2021-04-13 22:46:11 +02:00
Hans-Christoph Steiner
908921e978 show banner when Over Data/WiFi Settings disable updating from internet 2021-04-13 16:26:23 +02:00
Hans-Christoph Steiner
8773d6205c rename BannerUpdatingRepos --> StatusBanner 2021-04-13 16:26:23 +02:00
Hans-Christoph Steiner
a505850110 "No internet" banner on main, categories, and updates screen
An alternate implementation of @pserwylo's fdroidclient!724

closes #884
2021-04-13 16:26:08 +02:00
Hans-Christoph Steiner
d9a86d4c16 rename: update_notification_title --> banner_updating_repositories 2021-04-13 13:59:08 +02:00
Hans-Christoph Steiner
5acc87c405 LocalHTTPDManagerTest is flaky, use 10 minute timeout 2021-04-13 13:17:56 +02:00
Hans-Christoph Steiner
f39fc1386a synchronized getNewMirrorOnError() for safe writing of numTries
`volatile` allows for safe multi-threaded reading, `synchronized` allows
for safe multi-threaded writing.
2021-04-13 13:17:56 +02:00
Hans-Christoph Steiner
1758c2c9f1 when no internet and local repos, only update local repos
closes #2146
2021-04-13 13:17:56 +02:00
Hans-Christoph Steiner
35cc9bce42
reformat all layout/ui XML with Android Studio Ctrl-Alt-L 2021-04-13 10:32:25 +02:00
Hans-Christoph Steiner
cf94cfb543
run Android Studio's Ctrl-Alt-O Organize Imports on all .java files 2021-04-13 10:23:59 +02:00
Hans-Christoph Steiner
9d5af90c61 Merge branch 'material-components' into 'master'
feat: rebase app themes to material themes

Closes #2145

See merge request fdroid/fdroidclient!963
2021-04-12 16:36:18 +00:00
proletarius101
755588202f feat: rebase app themes to material themes 2021-04-12 16:36:17 +00:00
Hans-Christoph Steiner
5af693265f Merge branch 'master' into 'master'
fix trove4j verification error

See merge request fdroid/fdroidclient!998
2021-04-12 15:42:22 +00:00
Hans-Christoph Steiner
1cd02f02e0
fix trove4j verification error
trove4j-20160824.pom uploaded to mavenCentral has more info in it, so a
different sha256.
2021-04-12 15:57:40 +02:00
Hans-Christoph Steiner
4bf168eedd
Merge branch 'migrate-to-appcompat'
* deleteme:
  update gradle verification metadata
  Replace deprecated methods introduced
  Remove duplicated xml properties
  Fix missing text messages in preference_seekbar
  fix: linting
  Extensively use appcompat

fdroid/fdroidclient!975
2021-04-07 22:02:11 +02:00
Hans-Christoph Steiner
04ab3aefa4
update gradle verification metadata
./gradlew --write-verification-metadata pgp,sha256 assemble
./gradlew --write-verification-metadata sha256 assemble
2021-04-07 22:00:20 +02:00
proletarius101
f8f48e1be4 Replace deprecated methods introduced 2021-04-07 14:02:48 +00:00
proletarius101
b5ab4eb978 Remove duplicated xml properties 2021-04-07 14:02:48 +00:00
proletarius101
1a1a06b499 Fix missing text messages in preference_seekbar 2021-04-07 14:02:48 +00:00
proletarius101
96cf03b277 fix: linting 2021-04-07 14:02:48 +00:00
proletarius101
528eecb63c Extensively use appcompat 2021-04-07 14:02:48 +00:00
Hans-Christoph Steiner
6f91a60cb2 ./tools/remove-unused-and-blank-translations.py 2021-04-06 22:59:35 +02:00
Hans-Christoph Steiner
98b3b74610
version code 1012050 2021-04-06 22:54:13 +02:00
Hans-Christoph Steiner
4817ec1411 update changelogs 2021-04-06 22:53:37 +02:00
Hans-Christoph Steiner
6443b9fecf Merge branch 'weblate' into 'master'
weblate

See merge request fdroid/fdroidclient!996
2021-04-06 20:53:01 +00:00
Hans-Christoph Steiner
9419f9d943 fix format strings 2021-04-06 21:15:36 +02:00
melusine
4bdc45b105
Translated using Weblate: German (de) by melusine <melusine@mailbox.org>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: melusine <melusine@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
Translation: F-Droid/F-Droid metadata
2021-04-06 13:27:04 +02:00
Timur Seber
54712a10b4
Added translation using Weblate: Tatar (tt) by Timur Seber <seber.tatsoft@gmail.com>
Co-authored-by: Timur Seber <seber.tatsoft@gmail.com>
2021-04-06 13:27:03 +02:00
Germe the fur star
46da689cda
Translated using Weblate: Spanish (Argentina) (es_AR) by Germe the fur star <FOSSgerme.deb@tuta.io>
Currently translated at 8.5% (3 of 35 strings)

Translated using Weblate: Spanish (Argentina) (es-rAR) by Germe the fur star <FOSSgerme.deb@tuta.io>

Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Germe the fur star <FOSSgerme.deb@tuta.io>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/es_AR/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_AR/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-04-06 13:27:03 +02:00
Liu Tao
b5fc3e07e0
Translated using Weblate: Chinese (Simplified) (zh-rCN) by Liu Tao <lyuutau@outlook.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Liu Tao <lyuutau@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
2021-04-06 13:27:03 +02:00
MovingEarth
477024c79e
Translated using Weblate: Dutch (nl) by MovingEarth <moving.earth@gorgoz.org>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: MovingEarth <moving.earth@gorgoz.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translation: F-Droid/F-Droid
2021-04-06 13:27:02 +02:00
Hierax Swiftwing
8fd6d0a4fb
Translated using Weblate: Serbian (sr) by Hierax Swiftwing <hierax.oligopsony@slmail.me>
Currently translated at 98.2% (456 of 464 strings)

Co-authored-by: Hierax Swiftwing <hierax.oligopsony@slmail.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sr/
Translation: F-Droid/F-Droid
2021-04-06 13:27:02 +02:00
Jeff
ababe82a37
Translated using Weblate: Luxembourgish (lb) by Jeff <jeff.croise@gmail.com>
Currently translated at 13.1% (61 of 464 strings)

Added translation using Weblate: Luxembourgish (lb) by Jeff <jeff.croise@gmail.com>

Co-authored-by: Jeff <jeff.croise@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lb/
Translation: F-Droid/F-Droid
2021-04-06 13:27:02 +02:00
HelaBasa
548fe432a7
Translated using Weblate: Sinhala (si) by HelaBasa <R45XvezA@protonmail.ch>
Currently translated at 5.7% (2 of 35 strings)

Translated using Weblate: Sinhala (si) by HelaBasa <R45XvezA@protonmail.ch>

Currently translated at 3.4% (16 of 464 strings)

Co-authored-by: HelaBasa <R45XvezA@protonmail.ch>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/si/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/si/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-04-06 13:27:02 +02:00
Nine Lima
3e372bc9f9
Translated using Weblate: Afrikaans (af) by Nine Lima <ninelima@yahoo.com>
Currently translated at 99.7% (463 of 464 strings)

Co-authored-by: Nine Lima <ninelima@yahoo.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/af/
Translation: F-Droid/F-Droid
2021-04-06 13:27:01 +02:00
Najm Us Saqib
21303adb27
Translated using Weblate: Urdu (ur) by Najm Us Saqib <funkywriters@gmail.com>
Currently translated at 17.4% (81 of 464 strings)

Co-authored-by: Najm Us Saqib <funkywriters@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ur/
Translation: F-Droid/F-Droid
2021-04-06 13:27:01 +02:00
hayalci hayalci
e7eba5f332
Translated using Weblate: Turkish (tr) by hayalci hayalci <gokdenizk@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: hayalci hayalci <gokdenizk@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
2021-04-06 13:27:01 +02:00
mahmut özcan
0f91aff535
Translated using Weblate: Turkish (tr) by mahmut özcan <mahmutozcan65@yahoo.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: mahmut özcan <mahmutozcan65@yahoo.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
2021-04-06 13:27:00 +02:00
Orhan
f850c9b73d
Translated using Weblate: Turkish (tr) by Orhan <orya@pm.me>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Turkish (tr) by Orhan <orya@pm.me>

Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Orhan <orya@pm.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
2021-04-06 13:27:00 +02:00
J. Lavoie
8666eabde8
Translated using Weblate: Italian (it) by J. Lavoie <j.lavoie@net-c.ca>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: French (fr) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: German (de) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: French (fr) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: French (fr) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 99.7% (463 of 464 strings)

Translated using Weblate: French (fr) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 99.5% (462 of 464 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2021-04-06 13:27:00 +02:00
Allan Nordhøy
f051b710df
Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 99.7% (463 of 464 strings)

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
Translation: F-Droid/F-Droid
2021-04-06 13:26:59 +02:00
Michalis
dc39730c0b
Translated using Weblate: Greek (el) by Michalis <michalisntovas@yahoo.gr>
Currently translated at 40.0% (14 of 35 strings)

Co-authored-by: Michalis <michalisntovas@yahoo.gr>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/el/
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:59 +02:00
Веско
6ecf410f6f
Translated using Weblate: Bulgarian (bg) by Веско <v.jeliazkov@jeliazkov.net>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Веско <v.jeliazkov@jeliazkov.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bg/
Translation: F-Droid/F-Droid
2021-04-06 13:26:59 +02:00
Besnik Bleta
3555f18de1
Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>
Currently translated at 100.0% (35 of 35 strings)

Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>

Currently translated at 94.2% (33 of 35 strings)

Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>

Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sq/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:59 +02:00
Pharadai
149ae6aa95
Translated using Weblate: Thai (th) by Pharadai <film041127@gmail.com>
Currently translated at 37.0% (172 of 464 strings)

Translated using Weblate: Thai (th) by Pharadai <film041127@gmail.com>

Currently translated at 36.4% (169 of 464 strings)

Co-authored-by: Pharadai <film041127@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/th/
Translation: F-Droid/F-Droid
2021-04-06 13:26:58 +02:00
Andrey
f423a04f08
Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2021-04-06 13:26:58 +02:00
Rex_sa
86613d08d5
Translated using Weblate: Arabic (ar) by Rex_sa <rex.sa@pm.me>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Rex_sa <rex.sa@pm.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/
Translation: F-Droid/F-Droid
2021-04-06 13:26:58 +02:00
Luka Povroznik
afb6928bb1
Translated using Weblate: Italian (it) by Luka Povroznik <povroznik.luka@gmail.com>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Luka Povroznik <povroznik.luka@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:57 +02:00
Ajeje Brazorf
826852b729
Translated using Weblate: Sardinian (sc) by Ajeje Brazorf <lmelonimamo@yahoo.it>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sc/
Translation: F-Droid/F-Droid
2021-04-06 13:26:57 +02:00
lilim
e7f4e8b8d3
Translated using Weblate: French (fr) by lilim <lionel@les-miquelots.net>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: French (fr) by lilim <lionel@les-miquelots.net>

Currently translated at 99.7% (463 of 464 strings)

Translated using Weblate: French (fr) by lilim <lionel@les-miquelots.net>

Currently translated at 99.5% (462 of 464 strings)

Translated using Weblate: French (fr) by lilim <lionel@les-miquelots.net>

Currently translated at 99.1% (460 of 464 strings)

Translated using Weblate: French (fr) by lilim <lionel@les-miquelots.net>

Currently translated at 98.9% (459 of 464 strings)

Co-authored-by: lilim <lionel@les-miquelots.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2021-04-06 13:26:57 +02:00
Translator
d6e4645d08
Translated using Weblate: Finnish (fi) by Translator <romepoksi@gmail.com>
Currently translated at 98.0% (455 of 464 strings)

Co-authored-by: Translator <romepoksi@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/
Translation: F-Droid/F-Droid
2021-04-06 13:26:56 +02:00
Danial Behzadi
28a88172f3
Translated using Weblate: Persian (fa) by Danial Behzadi <dani.behzi@ubuntu.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2021-04-06 13:26:56 +02:00
David Leal
b3dcaf2721
Translated using Weblate: Spanish (es) by David Leal <halfpacho@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: David Leal <halfpacho@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translation: F-Droid/F-Droid
2021-04-06 13:26:56 +02:00
Oymate
98442b6938
Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>
Currently translated at 41.3% (192 of 464 strings)

Co-authored-by: Oymate <dhruboadittya96@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn/
Translation: F-Droid/F-Droid
2021-04-06 13:26:55 +02:00
امير محمد العمري
3ee4823354
Translated using Weblate: Afrikaans (af) by امير محمد العمري <amyr82669@gmail.com>
Currently translated at 98.2% (456 of 464 strings)

Co-authored-by: امير محمد العمري <amyr82669@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/af/
Translation: F-Droid/F-Droid
2021-04-06 13:26:55 +02:00
ฮาซิม หะยีแวฮามะ
a4027e0f73
Translated using Weblate: Thai (th) by ฮาซิม หะยีแวฮามะ <hayiwaehasim@gmail.com>
Currently translated at 31.2% (145 of 464 strings)

Co-authored-by: ฮาซิม หะยีแวฮามะ <hayiwaehasim@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/th/
Translation: F-Droid/F-Droid
2021-04-06 13:26:55 +02:00
Jaime Marquínez Ferrándiz
437db5fab3
Translated using Weblate: Spanish (es) by Jaime Marquínez Ferrándiz <weblate@jregistros.fastmail.net>
Currently translated at 98.2% (456 of 464 strings)

Co-authored-by: Jaime Marquínez Ferrándiz <weblate@jregistros.fastmail.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translation: F-Droid/F-Droid
2021-04-06 13:26:54 +02:00
Christian Eichert
dbdc8e38d5
Translated using Weblate: Romanian (ro) by Christian Eichert <c@zp1.net>
Currently translated at 40.0% (14 of 35 strings)

Translated using Weblate: Romanian (ro) by Christian Eichert <c@zp1.net>

Currently translated at 31.4% (11 of 35 strings)

Translated using Weblate: Romanian (ro) by Christian Eichert <c@zp1.net>

Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: German (de) by Christian Eichert <c@zp1.net>

Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Christian Eichert <c@zp1.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ro/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ro/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:54 +02:00
ssantos
6ab33ce442
Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (35 of 35 strings)

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:53 +02:00
Aung Myint Myat Oo
06620d6c52
Translated using Weblate: Burmese (my) by Aung Myint Myat Oo <solidifyarmor@gmail.com>
Currently translated at 45.2% (210 of 464 strings)

Co-authored-by: Aung Myint Myat Oo <solidifyarmor@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/my/
Translation: F-Droid/F-Droid
2021-04-06 13:26:53 +02:00
WaldiS
dfa6edf9ed
Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: WaldiS <sto@tutanota.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/
Translation: F-Droid/F-Droid
2021-04-06 13:26:52 +02:00
nautilusx
9f54ff09f8
Translated using Weblate: German (de) by nautilusx <translate@disroot.org>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: nautilusx <translate@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-04-06 13:26:52 +02:00
Aryan L
c843950e5f
Translated using Weblate: Hindi (hi) by Aryan L <aryan.landge@icloud.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Aryan L <aryan.landge@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hi/
Translation: F-Droid/F-Droid
2021-04-06 13:26:52 +02:00
bruh
6fa6e5710b
Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>

Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>

Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: bruh <quangtrung02hn16@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/vi/
Translation: F-Droid/F-Droid
2021-04-06 13:26:52 +02:00
Verdulo
58130712e6
Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (35 of 35 strings)

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:51 +02:00
Karl Ove Hufthammer
3d84a1f488
Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Karl Ove Hufthammer <karl@huftis.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nn/
Translation: F-Droid/F-Droid
2021-04-06 13:26:51 +02:00
Yaron Shahrabani
1d0e533643
Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:51 +02:00
Eric
1b218c8515
Translated using Weblate: Chinese (Simplified) (zh-CN) by Eric <spice2wolf@gmail.com>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Eric <spice2wolf@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:50 +02:00
Ihor Hordiichuk
7391dbbf64
Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:50 +02:00
Oğuz Ersen
17d9aeabeb
Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translation: F-Droid/F-Droid metadata
2021-04-06 13:26:50 +02:00
Jonatan Nyberg
aca17d551c
Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2021-04-06 13:26:49 +02:00
Hans-Christoph Steiner
e69a7f7556 version code 1012003 2021-03-10 23:08:17 +01:00
Hans-Christoph Steiner
d49653cb33 update CHANGELOG 2021-03-10 23:08:17 +01:00
Hans-Christoph Steiner
5aafe23c7a Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!994
2021-03-10 22:07:48 +00:00
ssantos
5b14043201
Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (35 of 35 strings)

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:18 +01:00
Jeff Huang
9c0141345f
Translated using Weblate: Chinese (Traditional) (zh-rTW) by Jeff Huang <s8321414@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Jeff Huang <s8321414@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hant/
Translation: F-Droid/F-Droid
2021-03-10 22:32:18 +01:00
whenwesober
ba794c1116
Translated using Weblate: Indonesian (id) by whenwesober <naomi16i_1298q@cikuh.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: whenwesober <naomi16i_1298q@cikuh.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/id/
Translation: F-Droid/F-Droid
2021-03-10 22:32:17 +01:00
Golubev Alexander
904a7ef3ac
Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Golubev Alexander <fatzer2@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2021-03-10 22:32:17 +01:00
Andrey
909cedba75
Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2021-03-10 22:32:17 +01:00
Licaon Kter
70c7d6dace
Translated using Weblate: Romanian (ro) by Licaon Kter <licaon.kter@protonmail.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Licaon Kter <licaon.kter@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ro/
Translation: F-Droid/F-Droid
2021-03-10 22:32:16 +01:00
Eduardo
2fa0ac280c
Translated using Weblate: Portuguese (Brazil) (pt-BR) by Eduardo <edu.rodrigues2580@gmail.com>
Currently translated at 100.0% (35 of 35 strings)

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Eduardo <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Eduardo <edu.rodrigues2580@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:16 +01:00
Alessandro Mandelli
7c3cf560bc
Translated using Weblate: Italian (it) by Alessandro Mandelli <mandelli.alessandro@ngi.it>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Alessandro Mandelli <mandelli.alessandro@ngi.it>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2021-03-10 22:32:16 +01:00
Balázs Meskó
4bd129f1d3
Translated using Weblate: Hungarian (hu) by Balázs Meskó <meskobalazs@mailbox.org>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Balázs Meskó <meskobalazs@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hu/
Translation: F-Droid/F-Droid
2021-03-10 22:32:15 +01:00
Verdulo
6a8a9fd323
Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
Translation: F-Droid/F-Droid
2021-03-10 22:32:14 +01:00
Strubbl
d2728ea23e
Translated using Weblate: German (de) by Strubbl <github@linux4tw.de>
Currently translated at 99.5% (462 of 464 strings)

Co-authored-by: Strubbl <github@linux4tw.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-03-10 22:32:14 +01:00
Priit Jõerüüt
e256cf9892
Translated using Weblate: Estonian (et) by Priit Jõerüüt <hwlate@joeruut.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Priit Jõerüüt <hwlate@joeruut.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/et/
Translation: F-Droid/F-Droid
2021-03-10 22:32:13 +01:00
Kristjan Räts
70ca7b184e
Translated using Weblate: Estonian (et) by Kristjan Räts <kristjanrats@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: Kristjan Räts <kristjanrats@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/et/
Translation: F-Droid/F-Droid
2021-03-10 22:32:13 +01:00
Artem
29f5d0c8b3
Translated using Weblate: Russian (ru) by Artem <KovalevArtem.ru@gmail.com>
Currently translated at 98.4% (457 of 464 strings)

Co-authored-by: Artem <KovalevArtem.ru@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2021-03-10 22:32:12 +01:00
Agnes de Lion
96637c71e6
Translated using Weblate: French (fr) by Agnes de Lion <belocurry@pm.me>
Currently translated at 98.7% (458 of 464 strings)

Co-authored-by: Agnes de Lion <belocurry@pm.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2021-03-10 22:32:12 +01:00
Ldm Public
1f570e38d9
Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>
Currently translated at 98.7% (458 of 464 strings)

Co-authored-by: Ldm Public <ldmpub@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2021-03-10 22:32:12 +01:00
phlostically
49e69c9ec1
Translated using Weblate: Esperanto (eo) by phlostically <phlostically@mailinator.com>
Currently translated at 100.0% (464 of 464 strings)

Co-authored-by: phlostically <phlostically@mailinator.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
Translation: F-Droid/F-Droid
2021-03-10 22:32:11 +01:00
Karl Ove Hufthammer
d7ace10735
Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Karl Ove Hufthammer <karl@huftis.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nn/
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:11 +01:00
Michalis
41094bdaf3
Translated using Weblate: Greek (el) by Michalis <michalisntovas@yahoo.gr>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Greek (el) by Michalis <michalisntovas@yahoo.gr>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Michalis <michalisntovas@yahoo.gr>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/
Translation: F-Droid/F-Droid
2021-03-10 22:32:10 +01:00
Verdulo
bcbc1940bf
Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:10 +01:00
bruh
17cceab5a1
Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>
Currently translated at 98.2% (456 of 464 strings)

Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: bruh <quangtrung02hn16@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/vi/
Translation: F-Droid/F-Droid
2021-03-10 22:32:09 +01:00
Tun Naung Win
51eaaf6c94
Translated using Weblate: Burmese (my) by Tun Naung Win <hellisenough@gmail.com>
Currently translated at 5.7% (2 of 35 strings)

Co-authored-by: Tun Naung Win <hellisenough@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/my/
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:09 +01:00
Yaron Shahrabani
82b9f21fc0
Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/he/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:09 +01:00
Eric
191b3e5eab
Translated using Weblate: Chinese (Simplified) (zh-rCN) by Eric <spice2wolf@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Chinese (Simplified) (zh-CN) by Eric <spice2wolf@gmail.com>

Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Eric <spice2wolf@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:08 +01:00
Ihor Hordiichuk
a7a6679573
Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:08 +01:00
Oğuz Ersen
09614a75ea
Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:07 +01:00
Golubev Alexander
9c2d061283
Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Golubev Alexander <fatzer2@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translation: F-Droid/F-Droid metadata
2021-03-10 22:32:07 +01:00
109247019824
b97f1f7955
Translated using Weblate: Bulgarian (bg) by 109247019824 <stoyan@gmx.com>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Bulgarian (bg) by 109247019824 <stoyan@gmx.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: 109247019824 <stoyan@gmx.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bg/
Translation: F-Droid/F-Droid
2021-03-10 22:32:07 +01:00
Sérgio Marques
6d14eb4562
Translated using Weblate: Portuguese (pt) by Sérgio Marques <smarquespt@gmail.com>
Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Sérgio Marques <smarquespt@gmail.com>

Currently translated at 100.0% (464 of 464 strings)

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Sérgio Marques <smarquespt@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Portuguese (pt) by Sérgio Marques <smarquespt@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Sérgio Marques <smarquespt@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
Translation: F-Droid/F-Droid
2021-03-10 22:32:06 +01:00
Hans-Christoph Steiner
ce4375f7c7 Merge branch 'fix-gradle-properties-no-effect' into 'master'
Fix: the local gradle properties not take effect

See merge request fdroid/fdroidclient!992
2021-03-10 14:32:29 +00:00
proletarius101
1e090e2440
Fix: the local gradle properties not take effect 2021-03-10 19:35:08 +08:00
Hans-Christoph Steiner
c1d8b944b3 Merge branch 'add-test-fdroid-metrics' into 'master'
Add test fdroid metrics aka "popularity contest"

Closes #396

See merge request fdroid/fdroidclient!985
2021-03-08 16:03:49 +00:00
Hans-Christoph Steiner
f0ddc16aea upcase name for ArrayList constant 2021-03-08 15:30:30 +00:00
Hans-Christoph Steiner
8e8a7c0b74 strip down firstInstall and lastUpdateTime events to simple counts 2021-03-08 15:30:30 +00:00
Hans-Christoph Steiner
d558d396ed show report when the user enables the Send to F-Droid Metrics pref 2021-03-08 15:30:30 +00:00
Hans-Christoph Steiner
a207798f5c add expert preference to enable Popularity Contest
closes #396
2021-03-08 15:30:30 +00:00
Hans-Christoph Steiner
d1e80bb067 add FDroidMetricsWorker to gather data into JSON reports 2021-03-08 15:30:30 +00:00
Hans-Christoph Steiner
1b594fa830 reign in proguard on androidTest 2021-03-08 15:30:30 +00:00
Hans-Christoph Steiner
b5d59349f3
versionCode 1012002 2021-03-03 23:01:07 +01:00
Hans-Christoph Steiner
e9bdbb2662
update CHANGELOG 2021-03-03 23:01:04 +01:00
Hans-Christoph Steiner
363f5baf39 Merge branch 'weblate' into 'master'
weblate

See merge request fdroid/fdroidclient!987
2021-03-03 21:47:35 +00:00
Hans-Christoph Steiner
ee606b84a5 remove blank translation 2021-03-03 22:09:43 +01:00
Hans-Christoph Steiner
7318d500ba
Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 27.9% (127 of 455 strings)

Translated using Weblate: Tibetan (bo) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 69.2% (315 of 455 strings)

Translated using Weblate: Armenian (hy) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 50.5% (230 of 455 strings)

Translated using Weblate: Burmese (my) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 45.9% (209 of 455 strings)

Translated using Weblate: Arabic (ar) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 100.0% (455 of 455 strings)

Deleted translation using Weblate: English (United States) (en_US@rude) (b+en+US@rude)

Co-authored-by: Hans-Christoph Steiner <hans@guardianproject.info>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn_BD/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bo/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hy/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/my/
Translation: F-Droid/F-Droid
2021-03-03 22:07:32 +01:00
Nokib Sarkar
e010f2324c
Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Nokib Sarkar <nokibsarkar@gmail.com>
Currently translated at 27.6% (126 of 455 strings)

Co-authored-by: Nokib Sarkar <nokibsarkar@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn_BD/
Translation: F-Droid/F-Droid
2021-03-03 22:07:31 +01:00
Uri Martínez
5af3f54272
Translated using Weblate: Spanish (Mexico) (es-rMX) by Uri Martínez <elgudi10@gmail.com>
Currently translated at 44.1% (201 of 455 strings)

Co-authored-by: Uri Martínez <elgudi10@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/
Translation: F-Droid/F-Droid
2021-03-03 22:07:31 +01:00
bruh
03eef2d0c0
Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>

Currently translated at 5.7% (2 of 35 strings)

Translated using Weblate: Vietnamese (vi) by bruh <quangtrung02hn16@gmail.com>

Currently translated at 95.6% (435 of 455 strings)

Co-authored-by: bruh <quangtrung02hn16@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/vi/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/vi/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-03-03 22:07:30 +01:00
HelaBasa
bdd84a74f1
Translated using Weblate: Sinhala (si) by HelaBasa <R45XvezA@protonmail.ch>
Currently translated at 2.6% (12 of 455 strings)

Added translation using Weblate: Sinhala (si) by HelaBasa <R45XvezA@protonmail.ch>

Co-authored-by: HelaBasa <R45XvezA@protonmail.ch>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/si/
Translation: F-Droid/F-Droid
2021-03-03 22:07:30 +01:00
Bart
857540cf8b
Translated using Weblate: Dutch (Belgium) (nl-rBE) by Bart <bart@mogwai.be>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Bart <bart@mogwai.be>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl_BE/
Translation: F-Droid/F-Droid
2021-03-03 22:07:29 +01:00
Brandan
ea15f8ef97
Translated using Weblate: Galician (gl) by Brandan <brandanpl@outlook.com>
Currently translated at 11.4% (4 of 35 strings)

Translated using Weblate: Galician (gl) by Brandan <brandanpl@outlook.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Brandan <brandanpl@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/gl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/gl/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-03-03 22:07:29 +01:00
Kintu
2685c3de52
Translated using Weblate: Catalan (ca) by Kintu <kintukp@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Kintu <kintukp@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/
Translation: F-Droid/F-Droid
2021-03-03 22:07:29 +01:00
Hans-Christoph Steiner
12ebb865fc Merge branch 'CleanCacheWorker-bug-fixes' into 'master'
CleanCacheWorker bug fixes

See merge request fdroid/fdroidclient!986
2021-03-03 21:07:16 +00:00
Hans-Christoph Steiner
d3be7d692d add CleanCacheWorker Robolectric tests 2021-03-03 18:49:47 +01:00
Hans-Christoph Steiner
ce7d241196 CleanCacheWorker: delete all package files, not just *.apk
The installer can copy OTA .zip, *.obf, etc. there too.

refs #1869
2021-03-03 18:49:47 +01:00
Hans-Christoph Steiner
eb6ab1ec0a when storage is low, immediately trigger CleanCacheWorker run
refs #1869

Script to test this in an emulator with `adb root` in `adb shell`:
```bash
cd /data/data/org.fdroid.fdroid.debug/files
rm -f fake.apk; touch fake.apk;  chown u0_a159.u0_a159 fake.apk ; dd if=/dev/zero of=fake.apk bs=1M count=635; touch -d 2020-02-02 fake.apk ; df -h; ls -lh
```

      <
2021-03-03 18:49:47 +01:00
Hans-Christoph Steiner
fc8321de17 javadoc for cache cleanup operations 2021-03-03 18:49:47 +01:00
Hans-Christoph Steiner
2a31b0dc61 remove some easy to fix @SuppressWarnings("LineLength") 2021-03-03 18:49:47 +01:00
Hans-Christoph Steiner
5fe5754a2d remove pointless null guards
The cast to AppCompatActivity would throw an exception if it failed.
2021-03-03 18:49:47 +01:00
Hans-Christoph Steiner
2d9d0c30b1
Merge 'master' into master
* privService-getInstalledPackages:
  fail fast if privService.getInstalledPackages() isn't working
  code formatting using Android Studio 4.1.2 defaults w/ 118 line length
  Guard new privileged extension package manager query with API check
  Add shared library packages to app cache database using F-DroidPrivilegedExtension query

fdroid/fdroidclient!967
2021-03-03 18:45:10 +01:00
Hans-Christoph Steiner
bde60282f1 fail fast if privService.getInstalledPackages() isn't working
If `privService.getInstalledPackages()` throws something other than a
`RemoteException`, this should fail as fast as possible.  Crashing will give
users a prompt to send the crash report.  using `finally` will just cause
weirdness since it might try to execute `compareToPackageManager()` even
when it is in the process of crashing.
2021-03-03 18:44:43 +01:00
Hans-Christoph Steiner
6710b74477 code formatting using Android Studio 4.1.2 defaults w/ 118 line length 2021-03-03 18:39:10 +01:00
Oliver Scott
bb8fce0272 Guard new privileged extension package manager query with API check 2021-03-03 10:31:37 -05:00
Oliver Scott
08b45d3518 Add shared library packages to app cache database using F-DroidPrivilegedExtension query
https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java;l=4725?q=filterSharedLibPackageLPr&sq=
PackageManager filters some packages from getInstalledPackages if the calling uid is not root, shell or system or does not have install permissions granted. Additionally, the hidden MATCH_STATIC_SHARED_LIBRARIES flag must be set.
https://review.calyxos.org/c/CalyxOS/platform_packages_apps_F-DroidPrivilegedExtension/+/2305
We added an API call in F-DroidPrivilegedExtension given it has the necessary requirements to get the unfiltered results from getInstalledPackages. This allows shared library packages to be added to the app cache database which will allow F-Droid to update them
2021-03-03 10:31:04 -05:00
Hans-Christoph Steiner
1d99cc0f7e
version code 1012001 2021-02-25 21:53:06 +01:00
Hans-Christoph Steiner
8b21c7c1fe ./tools/remove-unused-and-blank-translations.py 2021-02-25 21:52:16 +01:00
Hans-Christoph Steiner
fa827e4edb code formatting 2021-02-25 21:52:13 +01:00
Hans-Christoph Steiner
a34216e39f Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!981
2021-02-23 21:32:45 +00:00
Zmicer Turok
3c3a9c92d4 Translated using Weblate: Belarusian (be) by Zmicer Turok <nashtlumach@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Zmicer Turok <nashtlumach@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/be/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Andrey
1a787fe502 Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Kornelijus Tvarijanavičius
509f975fcb Translated using Weblate: Lithuanian (lt) by Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>
Currently translated at 75.3% (343 of 455 strings)

Co-authored-by: Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lt/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Besnik Bleta
9e222c77e0 Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>
Currently translated at 99.5% (453 of 455 strings)

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Ashutosh Gangwar
06863bd8f0 Translated using Weblate: Albanian (sq) by Ashutosh Gangwar <ashutoshgngwr@gmail.com>
Currently translated at 99.5% (453 of 455 strings)

Co-authored-by: Ashutosh Gangwar <ashutoshgngwr@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Reiner Herrmann
4d19ac29da Translated using Weblate: German (de) by Reiner Herrmann <reiner@reiner-h.de>
Currently translated at 91.4% (32 of 35 strings)

Co-authored-by: Reiner Herrmann <reiner@reiner-h.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Yaron Shahrabani
2bf5f6830f Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Liu Tao
b8d39c9a50 Translated using Weblate: Chinese (Simplified) (zh-CN) by Liu Tao <lyuutau@outlook.com>
Currently translated at 100.0% (35 of 35 strings)

Translated using Weblate: Chinese (Simplified) (zh-rCN) by Liu Tao <lyuutau@outlook.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Liu Tao <lyuutau@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Matej Kolarević
0bc06daa5d Translated using Weblate: Croatian (hr) by Matej Kolarević <tildica@protonmail.com>
Currently translated at 95.6% (435 of 455 strings)

Co-authored-by: Matej Kolarević <tildica@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hr/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Eric
d0f64fd44d Translated using Weblate: Chinese (Simplified) (zh-CN) by Eric <spice2wolf@gmail.com>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Eric <spice2wolf@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Ihor Hordiichuk
59c4422ba3 Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Golubev Alexander
4eaf98c3f0 Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>

Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Golubev Alexander <fatzer2@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Verdulo
7cb7b93ccc Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (35 of 35 strings)

Co-authored-by: Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Karl Ove Hufthammer
72a972aa25 Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>
Currently translated at 100.0% (35 of 35 strings)

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 97.1% (34 of 35 strings)

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 88.2% (30 of 34 strings)

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Karl Ove Hufthammer <karl@huftis.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nn/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nn/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
hayalci hayalci
161f4248c8 Translated using Weblate: Turkish (tr) by hayalci hayalci <gokdenizk@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Turkish (tr) by hayalci hayalci <gokdenizk@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: hayalci hayalci <gokdenizk@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
fossdd
7ca8939889 Translated using Weblate: German (de) by fossdd <fossdd@tutanota.com>
Currently translated at 93.9% (31 of 33 strings)

Co-authored-by: fossdd <fossdd@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Michalis
ef4d1c616f Translated using Weblate: Greek (el) by Michalis <michalisntovas@yahoo.gr>
Currently translated at 17.1% (6 of 35 strings)

Translated using Weblate: Greek (el) by Michalis <michalisntovas@yahoo.gr>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Greek (el) by Michalis <michalisntovas@yahoo.gr>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Greek (el) by Michalis <michalisntovas@yahoo.gr>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Greek (el) by Michalis <michalisntovas@yahoo.gr>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Greek (el) by Michalis <michalisntovas@yahoo.gr>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Michalis <michalisntovas@yahoo.gr>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/el/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Nekromanser
ac35df82ca Translated using Weblate: Finnish (fi) by Nekromanser <ari.taitto@protonmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Nekromanser <ari.taitto@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Mustafa Wahhudi
e4326c12b4 Translated using Weblate: Arabic (ar) by Mustafa Wahhudi <mustafawahhudi@gmail.com>
Currently translated at 18.1% (6 of 33 strings)

Co-authored-by: Mustafa Wahhudi <mustafawahhudi@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ar/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Virun Taechamahaphun
e5205358b4 Translated using Weblate: Thai (th) by Virun Taechamahaphun <ball_temp@hotmail.com>
Currently translated at 31.6% (144 of 455 strings)

Co-authored-by: Virun Taechamahaphun <ball_temp@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/th/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Hierax Swiftwing
0bcb7e6bca Translated using Weblate: Serbian (sr) by Hierax Swiftwing <hierax.oligopsony@slmail.me>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Hierax Swiftwing <hierax.oligopsony@slmail.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sr/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Jo
cd76e5816b Translated using Weblate: Spanish (es) by Jo <joaquinfc@protonmail.com>
Currently translated at 54.5% (18 of 33 strings)

Translated using Weblate: Spanish (es) by Jo <joaquinfc@protonmail.com>

Currently translated at 54.5% (18 of 33 strings)

Co-authored-by: Jo <joaquinfc@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/es/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
zmni
679b0f05a7 Translated using Weblate: Indonesian (id) by zmni <zmni@outlook.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: zmni <zmni@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/id/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
M S
64470b3991 Translated using Weblate: Finnish (fi) by M S <mitja.sorsa@luukku.com>
Currently translated at 9.0% (3 of 33 strings)

Translated using Weblate: Finnish (fi) by M S <mitja.sorsa@luukku.com>

Currently translated at 80.0% (364 of 455 strings)

Co-authored-by: M S <mitja.sorsa@luukku.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fi/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Satnam S Virdi
d85a26c89e Translated using Weblate: Punjabi (pa) by Satnam S Virdi <pika10singh@gmail.com>
Currently translated at 20.6% (94 of 455 strings)

Co-authored-by: Satnam S Virdi <pika10singh@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pa/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Angel Romero
825f5f09b5 Translated using Weblate: Spanish (Mexico) (es-rMX) by Angel Romero <iangelromero@pm.me>
Currently translated at 44.1% (201 of 455 strings)

Co-authored-by: Angel Romero <iangelromero@pm.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Aled Powell
4a6db7c6b0 Translated using Weblate: Welsh (cy) by Aled Powell <aled@aledpowell.cymru>
Currently translated at 12.1% (4 of 33 strings)

Co-authored-by: Aled Powell <aled@aledpowell.cymru>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/cy/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Ole Carlsen
0435f6b89c Translated using Weblate: Danish (da) by Ole Carlsen <ole@carlsen-web.dk>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Ole Carlsen <ole@carlsen-web.dk>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/da/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Oğuz Ersen
06b3de011e Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (35 of 35 strings)

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Mantas Kriaučiūnas
e20f11d528 Translated using Weblate: Lithuanian (lt) by Mantas Kriaučiūnas <baltix@gmail.com>
Currently translated at 73.6% (335 of 455 strings)

Co-authored-by: Mantas Kriaučiūnas <baltix@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lt/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
33ea00507b Translated using Weblate: Turkish (tr) by ‪ <hgebel@yandex.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Turkish (tr) by ‪ <hgebel@yandex.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: ‪ <hgebel@yandex.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Kristjan Räts
295fe1793f Translated using Weblate: Estonian (et) by Kristjan Räts <kristjanrats@gmail.com>
Currently translated at 27.2% (9 of 33 strings)

Co-authored-by: Kristjan Räts <kristjanrats@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/et/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Selyan Sliman Amiri
f8fbc37083 Translated using Weblate: Kabyle (kab) by Selyan Sliman Amiri <selyan.kab@gmail.com>
Currently translated at 78.9% (359 of 455 strings)

Co-authored-by: Selyan Sliman Amiri <selyan.kab@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/kab/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Imre Kristoffer Eilertsen
a700b09e53 Translated using Weblate: Norwegian Bokmål (nb) by Imre Kristoffer Eilertsen <imreeil42@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Imre Kristoffer Eilertsen <imreeil42@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Quentin PAGÈS
9b9ead6301 Translated using Weblate: Occitan (oc) by Quentin PAGÈS <quentinantonin@free.fr>
Currently translated at 1.5% (7 of 455 strings)

Added translation using Weblate: Occitan (oc) by Quentin PAGÈS <quentinantonin@free.fr>

Co-authored-by: Quentin PAGÈS <quentinantonin@free.fr>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/oc/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
Éfrit
3b6255d8a4 Translated using Weblate: French (fr) by Éfrit <efrit@posteo.net>
Currently translated at 100.0% (33 of 33 strings)

Co-authored-by: Éfrit <efrit@posteo.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:22 +01:00
Jonatan Nyberg
75d43f13b8 Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2021-02-23 21:54:22 +01:00
random r
51bad7d319 Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>
Currently translated at 100.0% (33 of 33 strings)

Co-authored-by: random r <epsilin@yopmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:21 +01:00
Oğuz Ersen
71c7ba4b80 Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Oymate
e3c22ca370 Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>
Currently translated at 38.6% (176 of 455 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 34.9% (159 of 455 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 10.5% (48 of 455 strings)

Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 26.8% (122 of 455 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 7.0% (32 of 455 strings)

Translated using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>

Currently translated at 2.1% (10 of 455 strings)

Co-authored-by: Oymate <dhruboadittya96@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn_BD/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Andrey
6ea5204a22 Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Crisalis
63ecaf5e04 Translated using Weblate: Spanish (es) by Crisalis <tegaminorune@disroot.org>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Crisalis <tegaminorune@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Andrey F
b80efee952 Translated using Weblate: Russian (ru) by Andrey F. <firsan777@mail.ru>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Andrey F <firsan777@mail.ru>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Turtuvshin Byambaa
0eea69d785 Translated using Weblate: Mongolian (mn) by Turtuvshin Byambaa <toroo.byamba@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Turtuvshin Byambaa <toroo.byamba@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/mn/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Marwan
a33c6eeb2d Translated using Weblate: Arabic (ar) by Marwan <almagrhi@pm.me>
Currently translated at 18.1% (6 of 33 strings)

Co-authored-by: Marwan <almagrhi@pm.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ar/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:21 +01:00
Naveen Niraula
0b5883bacb Translated using Weblate: Nepali (ne) by Naveen Niraula <subtlenv@gmail.com>
Currently translated at 10.5% (48 of 455 strings)

Added translation using Weblate: Nepali (ne) by Naveen Niraula <subtlenv@gmail.com>

Co-authored-by: Naveen Niraula <subtlenv@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ne/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
ssantos
24570a5538 Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>
Currently translated at 100.0% (33 of 33 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:21 +01:00
J. Lavoie
7965f95940 Translated using Weblate: French (fr) by J. Lavoie <j.lavoie@net-c.ca>
Currently translated at 96.9% (32 of 33 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/
Translation: F-Droid/F-Droid metadata
2021-02-23 21:54:21 +01:00
Nadir Nour
438aea3400 Translated using Weblate: Somali (so) by Nadir Nour <dudethatwascool2@gmail.com>
Currently translated at 14.7% (67 of 455 strings)

Translated using Weblate: Somali (so) by Nadir Nour <dudethatwascool2@gmail.com>

Currently translated at 8.5% (39 of 455 strings)

Added translation using Weblate: Somali (so) by Nadir Nour <dudethatwascool2@gmail.com>

Co-authored-by: Nadir Nour <dudethatwascool2@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/so/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Abdelhak YAHIAOUI
57e4dc8757 Translated using Weblate: Kabyle (kab) by Abdelhak YAHIAOUI <abdelyah@gmail.com>
Currently translated at 62.8% (286 of 455 strings)

Co-authored-by: Abdelhak YAHIAOUI <abdelyah@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/kab/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
ikmaak
9c92916b2b Translated using Weblate: Dutch (nl) by ikmaak <info@ikmaak.nl>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: ikmaak <info@ikmaak.nl>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Reg3xp
089abd8d6d Translated using Weblate: Persian (fa) by Reg3xp <reg3xp@protonmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Reg3xp <reg3xp@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
ورکنومی
8cb1522033 Translated using Weblate: Pashto (ps) by ورکنومی <wraknumay@pm.me>
Currently translated at 13.4% (61 of 455 strings)

Translated using Weblate: Pashto (ps) by ورکنومی <wraknumay@pm.me>

Currently translated at 8.5% (39 of 455 strings)

Added translation using Weblate: Pashto (ps) by ورکنومی <wraknumay@pm.me>

Co-authored-by: ورکنومی <wraknumay@pm.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ps/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Davit Mayilyan
4cf206e7e9 Translated using Weblate: Armenian (hy) by Davit Mayilyan <davit.mayilyan@protonmail.ch>
Currently translated at 50.5% (230 of 455 strings)

Co-authored-by: Davit Mayilyan <davit.mayilyan@protonmail.ch>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hy/
Translation: F-Droid/F-Droid
2021-02-23 21:54:21 +01:00
Hakim Oubouali
d1a2873f3d Translated using Weblate: Central Atlas Tamazight (tzm) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>
Currently translated at 29.8% (136 of 455 strings)

Co-authored-by: Hakim Oubouali <hakim.oubouali.skr@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tzm/
Translation: F-Droid/F-Droid
2021-02-23 21:32:28 +01:00
Ashraf Isl
3adf7ab0fb Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Ashraf Isl <rediancool@gmail.com>
Currently translated at 18.6% (85 of 455 strings)

Co-authored-by: Ashraf Isl <rediancool@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn_BD/
Translation: F-Droid/F-Droid
2021-02-23 21:32:28 +01:00
Hans-Christoph Steiner
a6a5e3cc9b Merge branch 'fix-swap-navigation-button' into 'master'
Fix swap workflow's back button

See merge request fdroid/fdroidclient!979
2021-02-23 20:32:24 +00:00
proletarius101
6e95bbe380 Fix swap workflow's back button 2021-02-23 19:55:48 +00:00
Hans-Christoph Steiner
b21dbb8646 Merge branch 'java8' into 'master'
update to Java8 and compileSdkVersion 29

See merge request fdroid/fdroidclient!974
2021-02-23 19:32:36 +00:00
Hans-Christoph Steiner
b6c439e0f9 enable Java 8 2021-02-23 17:58:56 +01:00
Hans-Christoph Steiner
19349ea032 compileSdkVersion 29 2021-02-23 17:53:33 +01:00
Hans-Christoph Steiner
8c2fa955ce gitlab-ci: switch to x86 -no-accel emulator support
Now that is finally works to some degree at least.
fdroid/ci-images-client@6e7b829346
2021-02-23 17:53:33 +01:00
Hans-Christoph Steiner
6fa5ff6608 fix lint Error: Must use app:tint instead of android:tint [UseAppTint] 2021-02-23 17:53:33 +01:00
Hans-Christoph Steiner
292d3219d6 do not crash unregistering bluetooth receiver on devices w/o Bluetooth
This is probably mostly only emulators
2021-02-23 17:53:33 +01:00
Hans-Christoph Steiner
3c22024d94 remove pedandic checkstyle error 2021-02-23 17:53:33 +01:00
Hans-Christoph Steiner
3afd269a9c enable all Espresso tests when run from Android Studio
This should not make them run in the .gitlab-ci.yml setup, since that is
set to ignore @LargeTest
2021-02-23 17:53:33 +01:00
Hans-Christoph Steiner
4662c0bdaa set up WorkManager on demand to avoid slowing down starts
This also provides a convenient place to configure the debug logging.
2021-02-23 13:28:32 +01:00
Hans-Christoph Steiner
2975d4c09f always use fingerprint hashes in lowercase
* Utils.getBinaryHash() converts it to lowercase()
* Utils.getPackageSig() outputs lowercase
* fdroidserver outputs lowercase for all hash entries
2021-02-23 13:28:32 +01:00
Hans-Christoph Steiner
018e3221a7 prevent search terms triggering SQL injection vulns 2021-02-23 13:28:32 +01:00
Hans-Christoph Steiner
38e4b05e56 gitlab-ci: only run flaky KVM jobs if env var is set in GitLab 2021-02-23 13:28:32 +01:00
Hans-Christoph Steiner
a1827f6266
Merge branch 'support-platform-signature' into 'master'
* tag 'mergeeme':
  remove unused import
  Fixed bug package signature info not included
  Changed to static property
  Fixed "apply suggestion" error
  Replaced `equalsIgnoreCase()` with `equals()`
  Apply 1 suggestion(s) to 1 file(s)
  Added check platform signature available

fdroid/fdroidclient!943
2021-02-23 13:10:52 +01:00
Hans-Christoph Steiner
725c82c1b0 Merge branch 'add-base-ci-job' into 'master'
Add base ci job

See merge request fdroid/fdroidclient!977
2021-02-23 12:07:18 +00:00
Hans-Christoph Steiner
30b6c28a52 remove unused import 2021-02-23 13:02:33 +01:00
proletarius101
ed86a2fb4f
Add base ci job 2021-02-23 15:51:12 +08:00
Glenn Carremans
ee1a794680
Fixed bug package signature info not included 2021-02-19 16:36:23 +01:00
Glenn Carremans
dc314963f9
Changed to static property 2021-02-19 16:36:23 +01:00
Glenn C
47e8e43318
Fixed "apply suggestion" error 2021-02-19 16:36:23 +01:00
Glenn C
efe757be07
Replaced equalsIgnoreCase() with equals() 2021-02-19 16:36:23 +01:00
Glenn C
69fc823beb
Apply 1 suggestion(s) to 1 file(s) 2021-02-19 16:36:23 +01:00
Glenn Carremans
3a36bb5c2e
Added check platform signature available 2021-02-19 16:36:22 +01:00
Hans-Christoph Steiner
64e99cf90f fork after every Robolectric test to try to avoid crashes 2021-02-19 09:27:16 +01:00
Hans-Christoph Steiner
611974ecbf @Ignore test that covers when 1000 apps are installed on the device 2021-02-19 09:27:16 +01:00
Hans-Christoph Steiner
36cb4e8a4c gitlab-ci: limit RAM usage on all gradle runs 2021-02-19 09:27:16 +01:00
Hans-Christoph Steiner
a6a4147005 workaround tests crashing by forking after every 100 tests 2021-02-18 22:16:38 +01:00
Hans-Christoph Steiner
8c8c79d68a gitlab-ci: limit RAM usage to available memory, some runners have 3G 2021-02-18 22:16:38 +01:00
Hans-Christoph Steiner
857bc5c29e tests: run shutdown() on tested ContentProviders to reduce memory usage
Hopefully?
2021-02-18 22:16:38 +01:00
Hans-Christoph Steiner
a4e66540c2 Revert "purging all "@rude" translations", let Weblate do it
This reverts commit 8ddc28524f1dec52e7498345fa6aa8ecea873887.

[skip ci]
2021-02-09 22:13:07 +01:00
Hans-Christoph Steiner
801682500a
version code 1012000 2021-02-09 22:04:27 +01:00
Hans-Christoph Steiner
5d24061cfd update CHANGELOG 2021-02-09 22:04:04 +01:00
Hans-Christoph Steiner
8ddc28524f purging all "@rude" translations 2021-02-09 22:04:04 +01:00
Eric
7743588f35 Translated using Weblate: Chinese (Simplified) (zh-CN) by Eric <spice2wolf@gmail.com>
Currently translated at 100.0% (34 of 34 strings)

Co-authored-by: Eric <spice2wolf@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translation: F-Droid/F-Droid metadata
2021-02-09 22:04:04 +01:00
kak mi
e526f67228 Translated using Weblate: Chinese (Simplified) (zh-rCN) by kak mi <wavelake@outlook.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: kak mi <wavelake@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
2021-02-09 22:04:04 +01:00
Hans-Christoph Steiner
6f81c482c6 Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!973
2021-02-09 20:50:40 +00:00
Ihor Hordiichuk
7f9f1d771b Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>
Currently translated at 100.0% (34 of 34 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (33 of 33 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (33 of 33 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-09 21:17:22 +01:00
webweblate
e4f44025f1 Translated using Weblate: Ukrainian (uk) by webweblate <webweblate@riseup.net>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: webweblate <webweblate@riseup.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
2021-02-09 21:17:22 +01:00
WaldiS
20cccf4832 Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>
Currently translated at 100.0% (34 of 34 strings)

Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>

Currently translated at 100.0% (33 of 33 strings)

Co-authored-by: WaldiS <sto@tutanota.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
Translation: F-Droid/F-Droid metadata
2021-02-09 21:17:22 +01:00
Hans-Christoph Steiner
91909a887c Translated using Weblate: Chinese (Traditional) (zh-TW) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 27.2% (9 of 33 strings)

Translated using Weblate: Polish (pl) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 96.9% (32 of 33 strings)

Translated using Weblate: Czech (cs) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 12.1% (4 of 33 strings)

Translated using Weblate: French (fr) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 96.9% (32 of 33 strings)

Translated using Weblate: Spanish (Mexico) (es-rMX) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 43.9% (200 of 455 strings)

Co-authored-by: Hans-Christoph Steiner <hans@guardianproject.info>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/cs/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-09 21:17:22 +01:00
Yaron Shahrabani
04b69a9e2b Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (34 of 34 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
Translation: F-Droid/F-Droid metadata
2021-02-09 21:17:22 +01:00
Verdulo
3d4055d1e8 Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (34 of 34 strings)

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-02-09 21:17:22 +01:00
Hans-Christoph Steiner
0e38288705 Merge branch 'search-overhaul' into 'master'
overhaul the search based on two recent merge requests

See merge request fdroid/fdroidclient!972
2021-02-09 17:54:10 +00:00
Hans-Christoph Steiner
22cffbb0d8 prefer complete, localized apps in the category overview cards
To further the goal of providing a fully localized experience based on the
user's Language Settings, this applies similar logic as the Latest Tab to
the apps that are featured for each category.
2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
a0c809f0ad onCreateLoader() is @NonNull, throw useful error instead 2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
be9b6515cd wipe "known categories" cache when database transients are reset
closes #1626
closes #1632
2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
2a4c9f0fcb sort "new" app entries based on lastUpdate time of Repo
https://gitlab.com/fdroid/fdroidclient/-/issues/939#note_504169741
2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
e9b03e5a2a properly pad and scale the search sort button 2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
f38450fc19 save search state between uses and restarts 2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
1c8a56e314 if search are letters with a "." in the middle, enable packageName
This makes it easy to search by Application ID aka Package Name without
affecting searches that definitely cannot be a Package Name.
2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
c3c31ed033 convert alpha sort into "sort by search terms", keep "last updated"
refs #1600
closes #1522
closes #1185
2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
646f2c8e9f overhaul search to include summary, better searching, and localized sort
include @gcbrown76's `getSortOrder()` from !889 as getLastUpdatedSortOrder
2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
9c3176852e more descriptive variable name 2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
8856f19277 move Latest Tab sort closer to where it is actually used 2021-02-09 17:57:40 +01:00
Hans-Christoph Steiner
d96dda0519
Merge 'bugfix/repo_url_querystring' into 'master'
* commit 'a81140be4749189861b2961f84e2704eb5bb467b':
  run Android Studio default code formatter with Ctrl-Alt-L
  Add Repo.getFileUrl() method to get file URL in a standard way
  RepoUrlsTest: Add new tests for correct repo URL formatting

fdroid/fdroidclient!935
2021-02-09 17:52:54 +01:00
Hans-Christoph Steiner
a81140be47 run Android Studio default code formatter with Ctrl-Alt-L 2021-02-09 17:51:19 +01:00
Angus Gratton
3cb6cc747b Add Repo.getFileUrl() method to get file URL in a standard way 2021-02-09 09:01:12 +11:00
Angus Gratton
5187b88a08 RepoUrlsTest: Add new tests for correct repo URL formatting 2021-02-09 08:03:55 +11:00
Hans-Christoph Steiner
8cd82e0287 update CHANGELOG 2021-02-08 14:03:15 +01:00
Hans-Christoph Steiner
4caab6a135
rename WhatsNew* to Latest* to match source string name 2021-02-08 13:16:04 +01:00
Hans-Christoph Steiner
b9efb143be Merge branch 'latest-tab-localized-overhaul' into 'master'
convert the Latest Tab SELECT logic to ORDER BY, with accurate IS_LOCALIZED

Closes #939, #2024, #1186, and #987

See merge request fdroid/fdroidclient!971
2021-02-08 11:02:17 +00:00
Hans-Christoph Steiner
c927f37013 remove outdated stuff from CONTRIBUTING.md 2021-02-08 10:40:18 +01:00
Hans-Christoph Steiner
bdbb95110b normalize whitespace in AppProvider using Android Studio Ctrl-Alt-L 2021-02-08 09:51:37 +01:00
Hans-Christoph Steiner
5c7be1e852 move all App.setLocalized() tests into LocaleSelectionTest class 2021-02-08 09:51:04 +01:00
Hans-Christoph Steiner
a11d214039 workaround Locale.toLanguageTag() requiring android-21 2021-02-08 09:51:04 +01:00
Hans-Christoph Steiner
cb1b4330ef App: rename "locales" to "supportedLocales" for clarity 2021-02-08 09:51:04 +01:00
Hans-Christoph Steiner
57cee93647 trim leading/trailing whitespace from name/summary/video
This should make for predictable layouts, since fastlane entries are likely
to have a tailing newline, but entries in the metadata YAML will not.
2021-02-08 09:51:04 +01:00
Hans-Christoph Steiner
19215db243 convert Latest Tab's selection into a sort
This removes the convoluted logic of both a selection and a sort, and just
does all the ordering in the sort.

closes #939
closes #2024
2021-02-08 09:50:07 +01:00
Hans-Christoph Steiner
3d9a68c1e3 rename AppProvider "Recently Updated" to "Latest Tab"
This is only used for the Latest Tab, so it should be named accordingly.
2021-02-08 09:36:46 +01:00
Hans-Christoph Steiner
e35335d59c totally overhaul choosing locales from app metadata based on LocaleList
This makes the selection logic heed the list of preferred locales from the
user Settings.

closes #987
closes #1186
refs #1440 #1882 #1730
!886
2021-02-08 09:36:46 +01:00
proletarius101
fbbf78dcf8
fix: crashing in the search activity 2021-02-07 20:01:18 +01:00
Hans-Christoph Steiner
e757c14148 Merge branch 'auto-color-vector-assets' into 'master'
fix icon and text tinting and replace some pixel maps with vector graphs

See merge request fdroid/fdroidclient!968
2021-02-04 21:44:00 +00:00
proletarius101
4737b32a60 fix icon and text tinting and replace some pixel maps with vector graphs
added vector graphs are the rounded variant
2021-02-04 21:43:59 +00:00
Hans-Christoph Steiner
2086f50d05 Merge branch 'AppCompatActivity' into 'master'
Change Activity to AppCompatActivity

See merge request fdroid/fdroidclient!969
2021-01-28 16:52:58 +00:00
proletarius101
e2979f632d Change Activity to AppCompatActivity 2021-01-28 16:52:58 +00:00
Hans-Christoph Steiner
34b24a5b60 Merge branch 'feature/always_include_repo_name' into 'master'
Always include repo name in exception toasts

See merge request fdroid/fdroidclient!966
2021-01-27 15:55:40 +00:00
Sylvia van Os
e95e99018a Always include repo name in exception toasts 2021-01-27 15:32:14 +00:00
Hans-Christoph Steiner
e6819e7f12 Merge 'Use_WorkManager' into 'master'
* origin/master:
  gitlab-ci: fix excluding @LargeTest from emulator jobs
  use TAG to identify CleanCacheWorker to WorkManager
  add WorkManagerTestRule to CleanCacheWorkerTest
  move static helper method into its class: CleanCacheWorker
  fdroidclient does not use variables for gradle dependencies
  Add WorkManagerTestRule.
  Use WorkManager to clean the cache.
  Add AndroidX WorkManager.

fdroid/fdroidclient!959
2021-01-27 16:27:40 +01:00
Hans-Christoph Steiner
8f64b45e79 gitlab-ci: fix excluding @LargeTest from emulator jobs
fixup for !899
2021-01-27 15:38:43 +01:00
Hans-Christoph Steiner
9eba243092 use TAG to identify CleanCacheWorker to WorkManager
TAG is already there, and it is meant to identify this class, and be
unique.
2021-01-27 15:38:43 +01:00
Hans-Christoph Steiner
06dbd048af add WorkManagerTestRule to CleanCacheWorkerTest 2021-01-27 15:38:42 +01:00
Hans-Christoph Steiner
2e10c7ba03 move static helper method into its class: CleanCacheWorker 2021-01-25 15:29:09 +01:00
Hans-Christoph Steiner
fa7e7fccdc fdroidclient does not use variables for gradle dependencies
Using variables makes the lint stuff not work so well.
2021-01-25 15:25:59 +01:00
Isira Seneviratne
ab8e7935b0 Add WorkManagerTestRule. 2021-01-21 06:18:23 +05:30
Isira Seneviratne
7c81b1ad15 Use WorkManager to clean the cache. 2021-01-21 06:17:28 +05:30
Isira Seneviratne
df66d127c2 Add AndroidX WorkManager. 2021-01-21 06:17:28 +05:30
Hans-Christoph Steiner
c72a315872 Merge branch 'gitlab-ci-stability' into 'master'
Gitlab ci stability

See merge request fdroid/fdroidclient!964
2021-01-19 09:09:17 +00:00
Hans-Christoph Steiner
83b7d7ff67 bump all test dependencies
Hopefully this will give some stability in the Robolectric tests.
2021-01-19 09:06:05 +01:00
Hans-Christoph Steiner
c5056a8167 gitlab-ci: run errorprone with Java11 2021-01-18 19:26:14 +01:00
Hans-Christoph Steiner
c697501f8f gitlab-ci: run all test_lint_pmd_checkstyle parts, even after failures 2021-01-18 19:26:13 +01:00
Hans-Christoph Steiner
06b6f8794f gitlab-ci: retry flaky testFullDebugUnitTest 2021-01-18 19:23:47 +01:00
Hans-Christoph Steiner
474bbdfdbd
LocalHTTPDManagerTest: extend timeout to 60 seconds
If the job is successful, it should finish without coming closes to
the timeout.  Extending the timeout will make it take longer to fail,
but since the job is flaky, and the related code is rarely touched, it
seems worth it.
2021-01-18 11:07:31 +01:00
Hans-Christoph Steiner
69b845c34f
gitlab-ci: disable ignored emulator runs that always fail 2021-01-12 20:05:54 +01:00
Hans-Christoph Steiner
99a5262730 make robolectric fetch dependencies via HTTPS
https://robolectric.org/configuring/#system-properties

https://gitlab.com/fdroid/fdroidclient/-/merge_requests/963#note_483716081
2021-01-12 18:02:03 +01:00
Hans-Christoph Steiner
97aaf5a067
gitlab-ci: include Java crash dump logs in artifacts
https://gitlab.com/fdroid/ci-images-client/-/jobs/957371759

```
A fatal error has been detected by the Java Runtime Environment:

 SIGSEGV (0xb) at pc=0x00007f6775b513c0, pid=1923, tid=0x00007f675eef6700

JRE version: OpenJDK Runtime Environment (8.0_275-b01) (build 1.8.0_275-8u275-b01-1~deb9u1-b01)
Java VM: OpenJDK 64-Bit Server VM (25.275-b01 mixed mode linux-amd64 compressed oops)
Problematic frame:
V  [libjvm.so+0x92d3c0]

Core dump written. Default location: /builds/test/fdroidclient/app/core or core.1923

An error report file with more information is saved as:
/builds/test/fdroidclient/app/hs_err_pid1923.log

Compiler replay data is saved as:
/builds/test/fdroidclient/app/replay_pid1923.log

If you would like to submit a bug report, please visit:
  http://bugreport.java.com/bugreport/crash.jsp
```
2021-01-12 11:50:53 +01:00
Hans-Christoph Steiner
94dbaab83d
version code 1011050 2021-01-04 20:33:34 +01:00
Hans-Christoph Steiner
ec9ce60813 Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!961
2021-01-04 19:31:02 +00:00
Hans-Christoph Steiner
95a2803185 remove unneeded Android strings.xml quoting 2021-01-04 18:26:47 +01:00
Hans-Christoph Steiner
42cdeddd01 ./tools/remove-unused-and-blank-translations.py 2021-01-04 18:26:23 +01:00
Hans-Christoph Steiner
dc8e662b7b Translated using Weblate: Afrikaans (af) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/af/
2021-01-04 18:25:26 +01:00
Hans-Christoph Steiner
4ed6afb532 Translated using Weblate: Kannada (kn) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/kn/
2021-01-04 18:23:45 +01:00
Besnik Bleta
e24fd389c2 Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>
Currently translated at 99.1% (451 of 455 strings)

Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>

Currently translated at 99.7% (454 of 455 strings)

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2021-01-04 18:23:45 +01:00
Eduardo Rodrigues
f188e0df71 Translated using Weblate: Bengali (bn) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>
Currently translated at 0.2% (1 of 455 strings)

Translated using Weblate: English (United States) (en_US@rude) (b+en+US@rude) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 67.6% (308 of 455 strings)

Translated using Weblate: English (United Kingdom) (en-rGB) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Spanish (Mexico) (es-rMX) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 43.9% (200 of 455 strings)

Translated using Weblate: Mongolian (mn) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Welsh (cy) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Kannada (kn) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Afrikaans (af) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Hindi (hi) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Slovenian (sl) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Korean (ko) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Galician (gl) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Bulgarian (bg) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Albanian (sq) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Eduardo Rodrigues <edu.rodrigues2580@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/af/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bg/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/cy/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/en_GB/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/en_US@rude/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/gl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hi/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/kn/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ko/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/mn/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2021-01-04 18:23:45 +01:00
Oymate
d4f9e91938 Added translation using Weblate: Bengali (bn) by Oymate <dhruboadittya96@gmail.com>
Co-authored-by: Oymate <dhruboadittya96@gmail.com>
2021-01-04 18:23:45 +01:00
Jennifer Kitts
95e1cd4a89 Translated using Weblate: English (United States) (b+en+US@rude) by Jennifer Kitts <kittsjennifer44@gmail.com>
Currently translated at 0.0% (0 of 455 strings)

Co-authored-by: Jennifer Kitts <kittsjennifer44@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/en_US@rude/
Translation: F-Droid/F-Droid
2021-01-04 18:23:45 +01:00
Hans-Christoph Steiner
e6529d9ff1 Deleted translation using Weblate: English (United States) (en-rUS)
Co-authored-by: Hans-Christoph Steiner <hans@guardianproject.info>
2021-01-04 18:23:45 +01:00
Chris Jr Williams
58379f68cf Added translation using Weblate: English (United States) (en-rUS) by Chris Jr Williams <chrisjr4eva1987@gmail.com>
Added translation using Weblate: English (United Kingdom) (en-rGB) by Chris Jr Williams <chrisjr4eva1987@gmail.com>

Co-authored-by: Chris Jr Williams <chrisjr4eva1987@gmail.com>
2021-01-04 18:16:47 +01:00
JoC
658ce1cfdd Translated using Weblate: Spanish (Argentina) (es-rAR) by JoC <jo_91_lp@hotmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: JoC <jo_91_lp@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_AR/
Translation: F-Droid/F-Droid
2021-01-04 18:12:48 +01:00
Yogesh
9f443e8562 Translated using Weblate: Kannada (kn) by Yogesh <yogesh@karnatakaeducation.org.in>
Currently translated at 68.1% (310 of 455 strings)

Co-authored-by: Yogesh <yogesh@karnatakaeducation.org.in>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/kn/
Translation: F-Droid/F-Droid
2021-01-04 18:12:42 +01:00
Besnik Bleta
0cc38b3d0a Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>
Currently translated at 99.1% (451 of 455 strings)

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2021-01-04 18:11:18 +01:00
Eduardo Rodrigues
29c8ed09a0 Translated using Weblate: Albanian (sq) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Eduardo Rodrigues <edu.rodrigues2580@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2021-01-04 18:11:16 +01:00
Hans-Christoph Steiner
ef22161f91 Translated using Weblate: Marathi (mr) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 73.1% (333 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/mr/
2021-01-04 18:10:30 +01:00
Mahem Jadhav
164adf3cf3 Translated using Weblate: Marathi (mr) by Mahem Jadhav <mahem4ever@gmail.com>
Currently translated at 72.7% (331 of 455 strings)

Translated using Weblate: Marathi (mr) by Mahem Jadhav <mahem4ever@gmail.com>

Currently translated at 54.5% (248 of 455 strings)

Translated using Weblate: Marathi (mr) by Mahem Jadhav <mahem4ever@gmail.com>

Currently translated at 37.1% (169 of 455 strings)

Translated using Weblate: Marathi (mr) by Mahem Jadhav <mahem4ever@gmail.com>

Currently translated at 37.8% (172 of 455 strings)

Added translation using Weblate: Marathi (mr) by Mahem Jadhav <mahem4ever@gmail.com>

Co-authored-by: Mahem Jadhav <mahem4ever@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/mr/
Translation: F-Droid/F-Droid
2021-01-04 18:10:26 +01:00
Bruno Rocha
25a61583ac Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Bruno Rocha <brunorocha@outlook.com>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
2021-01-04 18:09:54 +01:00
Miguel
4fc0a3d313 Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Miguel <miguelcristovao99@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Miguel <miguelcristovao99@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
Translation: F-Droid/F-Droid
2021-01-04 18:09:52 +01:00
mrkazoodle
626d924e03 Translated using Weblate: Dutch (Belgium) (nl-rBE) by mrkazoodle <philip_hoflack@hotmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Dutch (nl) by mrkazoodle <philip_hoflack@hotmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: mrkazoodle <philip_hoflack@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl_BE/
Translation: F-Droid/F-Droid
2021-01-04 18:09:40 +01:00
Oukiki Saleh
069dc9de15 Translated using Weblate: Arabic (ar) by Oukiki Saleh <salehoukiki@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Oukiki Saleh <salehoukiki@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/
Translation: F-Droid/F-Droid
2021-01-04 18:09:05 +01:00
Balázs Meskó
9e6900452b Translated using Weblate: Hungarian (hu) by Balázs Meskó <meskobalazs@mailbox.org>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Balázs Meskó <meskobalazs@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hu/
Translation: F-Droid/F-Droid
2021-01-04 18:08:50 +01:00
Allan Nordhøy
9be0dc3414 Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 99.7% (454 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
2021-01-04 18:08:40 +01:00
Allan Nordhøy
4eb5146f17 Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 99.5% (453 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
2021-01-04 18:08:38 +01:00
mondstern
3147fd9646 Translated using Weblate: Norwegian Bokmål (nb) by mondstern <mondstern@snopyta.org>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
2021-01-04 18:08:35 +01:00
Allan Nordhøy
344e5923af Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 62.5% (20 of 32 strings)

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 99.5% (453 of 455 strings)

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-01-04 18:08:32 +01:00
Danial Behzadi
1df2613b7c Translated using Weblate: Persian (fa) by Danial Behzadi <dani.behzi@ubuntu.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2021-01-04 18:08:10 +01:00
Gerrits
0738c4dfee Translated using Weblate: Dutch (nl) by Gerrits <rf.gerrits@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Gerrits <rf.gerrits@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translation: F-Droid/F-Droid
2021-01-04 18:08:01 +01:00
jimman2003
6134a2ee0a Translated using Weblate: Greek (el) by jimman2003 <jim41825@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: jimman2003 <jim41825@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/
Translation: F-Droid/F-Droid
2021-01-04 18:07:50 +01:00
BennyBeat
11b375531a Translated using Weblate: Catalan (ca) by BennyBeat <bennybeat@gmail.com>
Currently translated at 99.7% (454 of 455 strings)

Co-authored-by: BennyBeat <bennybeat@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/
Translation: F-Droid/F-Droid
2021-01-04 18:07:29 +01:00
Fernando Verdugo
292ac90e8e Translated using Weblate: Catalan (ca) by Fernando Verdugo <fv3rdugo@gmail.com>
Currently translated at 99.7% (454 of 455 strings)

Co-authored-by: Fernando Verdugo <fv3rdugo@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/
Translation: F-Droid/F-Droid
2021-01-04 18:07:26 +01:00
Alvaro
151446adff Translated using Weblate: Spanish (es) by Alvaro <alvaro@null.net>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Alvaro <alvaro@null.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translation: F-Droid/F-Droid
2021-01-04 18:07:14 +01:00
Crisalis
bd219210c0 Translated using Weblate: Spanish (es) by Crisalis <tegaminorune@disroot.org>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Crisalis <tegaminorune@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translation: F-Droid/F-Droid
2021-01-04 18:07:09 +01:00
Bjorn Roesbeke
1ac266ac1e Translated using Weblate: Dutch (Belgium) (nl-rBE) by Bjorn Roesbeke <inbox@bjornroesbeke.be>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Bjorn Roesbeke <inbox@bjornroesbeke.be>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl_BE/
Translation: F-Droid/F-Droid
2021-01-04 18:07:00 +01:00
Jonatan Nyberg
ac7b4dcbc9 Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2021-01-04 18:06:53 +01:00
Gontzal Manuel Pujana Onaindia
ce7c14e4a2 Translated using Weblate: Basque (eu) by Gontzal Manuel Pujana Onaindia <thadahdenyse@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Gontzal Manuel Pujana Onaindia <thadahdenyse@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eu/
Translation: F-Droid/F-Droid
2021-01-04 18:06:37 +01:00
C. Rüdinger
9c7648a03d Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: C. Rüdinger <Mail-an-CR@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-01-04 18:04:56 +01:00
Fynn Godau
faa27d181e Translated using Weblate: German (de) by Fynn Godau <fynngodau@mailbox.org>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Fynn Godau <fynngodau@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2021-01-04 18:04:56 +01:00
J. Lavoie
7d9c12ecf9 Translated using Weblate: Spanish (Argentina) (es-rAR) by J. Lavoie <j.lavoie@net-c.ca>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: German (de) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_AR/
Translation: F-Droid/F-Droid
2021-01-04 18:04:56 +01:00
Eduardo Rodrigues
90bd663ad9 Translated using Weblate: Portuguese (Brazil) (pt-BR) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>
Currently translated at 100.0% (33 of 33 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/
2021-01-04 18:04:39 +01:00
Eric
a77feac6f0 Translated using Weblate: Chinese (Simplified) (zh-CN) by Eric <spice2wolf@gmail.com>
Currently translated at 100.0% (33 of 33 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
2021-01-04 18:04:15 +01:00
Moo
3d39d1ee4a Translated using Weblate: Lithuanian (lt) by Moo <hazap@hotmail.com>
Currently translated at 72.3% (329 of 455 strings)

Translated using Weblate: Lithuanian (lt) by Moo <hazap@hotmail.com>

Currently translated at 71.8% (327 of 455 strings)

Translated using Weblate: Lithuanian (lt) by Moo <hazap@hotmail.com>

Currently translated at 6.2% (2 of 32 strings)

Translated using Weblate: Lithuanian (lt) by Moo <hazap@hotmail.com>

Currently translated at 72.0% (328 of 455 strings)

Co-authored-by: Moo <hazap@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/lt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lt/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2021-01-04 18:03:18 +01:00
aqwer-T
99b14f5a54 Translated using Weblate: Lithuanian (lt) by aqwer-T <aleksas.muliuolis18@gmail.com>
Currently translated at 72.9% (332 of 455 strings)

Co-authored-by: aqwer-T <aleksas.muliuolis18@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lt/
Translation: F-Droid/F-Droid
2021-01-04 18:02:59 +01:00
HardLight
73e189613d Translated using Weblate: Lithuanian (lt) by HardLight <hardlightxda@gmail.com>
Currently translated at 72.3% (329 of 455 strings)

Co-authored-by: HardLight <hardlightxda@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lt/
Translation: F-Droid/F-Droid
2021-01-04 18:02:48 +01:00
Ihor Hordiichuk
e36e1b0aee Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>
Currently translated at 100.0% (33 of 33 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
2021-01-04 18:00:22 +01:00
Oğuz Ersen
42dbdef5f1 Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (33 of 33 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
2021-01-04 18:00:22 +01:00
Andrey
67bf515a17 Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (33 of 33 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
2021-01-04 18:00:22 +01:00
Andrey
aa453227af Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
2021-01-04 18:00:22 +01:00
Eduardo Rodrigues
810445c298 Translated using Weblate: Portuguese (pt) by Eduardo Rodrigues <edu.rodrigues2580@gmail.com>
Currently translated at 100.0% (33 of 33 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
2021-01-04 18:00:22 +01:00
Yaron Shahrabani
fc88599132 Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (33 of 33 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
2021-01-04 18:00:22 +01:00
Verdulo
64fb1f17a3 Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (33 of 33 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
2021-01-04 18:00:22 +01:00
Hans-Christoph Steiner
3a15230eba pick-complete-translations.py: print out rationale 2020-12-30 12:56:02 +01:00
Hans-Christoph Steiner
13614a916b
fix checks in weblate
https://hosted.weblate.org/checks/?project=f-droid&component=f-droid
2020-12-29 22:38:22 +01:00
Hans-Christoph Steiner
6b50a963b8 update CHANGELOG 2020-12-29 22:18:56 +01:00
Hans-Christoph Steiner
797a006b02 IntentFilters for longer URLs to support GitCDN/RawGit/etc mirrors
https://guardianproject.info/2020/12/07/distribution-in-depth-mirrors-as-a-source-of-resiliency/

These mirrors do not have archives in general.
2020-12-29 22:18:56 +01:00
Hans-Christoph Steiner
1d10bf16d2 Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!960
2020-12-29 21:18:18 +00:00
Hans-Christoph Steiner
054d6318e9 Translated using Weblate: Belarusian (be) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/be/
2020-12-29 18:00:11 +01:00
Hans-Christoph Steiner
560b178c09 Translated using Weblate: Afrikaans (af) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/af/
2020-12-29 18:00:11 +01:00
Hans-Christoph Steiner
bdbf48185d Translated using Weblate: Uyghur (ug) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 49.2% (224 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ug/
2020-12-29 18:00:11 +01:00
Hans-Christoph Steiner
5581a84788 Translated using Weblate: Latvian (lv) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 45.2% (206 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lv/
2020-12-29 18:00:11 +01:00
Hans-Christoph Steiner
fc97db723a Translated using Weblate: Galician (gl) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/gl/
2020-12-29 18:00:11 +01:00
Hans-Christoph Steiner
d4134ab03f Translated using Weblate: Asturian (ast) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 90.7% (413 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ast/
2020-12-29 18:00:11 +01:00
Hans-Christoph Steiner
9d57cd2076 Translated using Weblate: Arabic (ar) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/
2020-12-29 18:00:11 +01:00
Nine Lima
ee22e1710b Translated using Weblate: Afrikaans (af) by Nine Lima <ninelima@yahoo.com>
Currently translated at 12.5% (4 of 32 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/af/
2020-12-29 18:00:11 +01:00
Ldm Public
d59bfd5af4 Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
2020-12-29 18:00:11 +01:00
Sergiu
c986a70a08 Translated using Weblate: Romanian (ro) by Sergiu <adinfinitvm@wail.ch>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ro/
2020-12-29 18:00:11 +01:00
Nine Lima
fb442d82db Translated using Weblate: Afrikaans (af) by Nine Lima <ninelima@yahoo.com>
Currently translated at 72.9% (332 of 455 strings)

Co-authored-by: Nine Lima <ninelima@yahoo.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/af/
Translation: F-Droid/F-Droid
2020-12-29 18:00:11 +01:00
Besnik Bleta
865f4a7c1f Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>
Currently translated at 96.8% (31 of 32 strings)

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sq/
Translation: F-Droid/F-Droid metadata
2020-12-29 18:00:11 +01:00
WaldiS
5a0cfb93ba Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>
Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: WaldiS <sto@tutanota.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
Translation: F-Droid/F-Droid metadata
2020-12-29 18:00:11 +01:00
The Cats
b2b7a27377 Translated using Weblate: Portuguese (Brazil) (pt-BR) by The Cats <philosoph@snopyta.org>
Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: The Cats <philosoph@snopyta.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/
Translation: F-Droid/F-Droid metadata
2020-12-29 18:00:11 +01:00
askar882
0225805e88 Translated using Weblate: Chinese (Simplified) (zh-rCN) by askar882 <askar882@qq.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: askar882 <askar882@qq.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
2020-12-29 18:00:11 +01:00
NightFeather
3218a5e0ae Translated using Weblate: Chinese (Traditional) (zh-TW) by NightFeather <ss900328@gmail.com>
Currently translated at 21.8% (7 of 32 strings)

Co-authored-by: NightFeather <ss900328@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hant/
Translation: F-Droid/F-Droid metadata
2020-12-29 18:00:11 +01:00
Étienne Deparis
6497d8f8ba Translated using Weblate: French (fr) by Étienne Deparis <etienne@depar.is>
Currently translated at 100.0% (32 of 32 strings)

Translated using Weblate: French (fr) by Étienne Deparis <etienne@depar.is>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Étienne Deparis <etienne@depar.is>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-12-29 18:00:11 +01:00
Michal L
62aea8a02a Translated using Weblate: Polish (pl) by Michal L <michalrmsmi@wp.pl>
Currently translated at 96.8% (31 of 32 strings)

Translated using Weblate: Polish (pl) by Michal L <michalrmsmi@wp.pl>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Michal L <michalrmsmi@wp.pl>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-12-29 18:00:11 +01:00
Eric
12568dfd31 Translated using Weblate: Chinese (Simplified) (zh-CN) by Eric <spice2wolf@gmail.com>
Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: Eric <spice2wolf@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translation: F-Droid/F-Droid metadata
2020-12-29 18:00:11 +01:00
Tymofij Lytvynenko
182200659d Translated using Weblate: Ukrainian (uk) by Tymofij Lytvynenko <till.svit@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Tymofij Lytvynenko <till.svit@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
2020-12-29 17:41:29 +01:00
Ihor Hordiichuk
5acde313b6 Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk <igor_ck@outlook.com>

Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-12-29 17:41:29 +01:00
Ali Demirtas
2bc0a847ed Translated using Weblate: Turkish (tr) by Ali Demirtas <alidemirtas94@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Ali Demirtas <alidemirtas94@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
2020-12-29 17:41:29 +01:00
Oğuz Ersen
d35d44f4bf Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translation: F-Droid/F-Droid metadata
2020-12-29 17:41:29 +01:00
Golubev Alexander
56039cbdbb Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
2020-12-29 17:41:29 +01:00
Artem
6e9385b190 Translated using Weblate: Russian (ru) by Artem <KovalevArtem.ru@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
2020-12-29 17:41:29 +01:00
Golubev Alexander
cf4429e341 Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>
Currently translated at 100.0% (32 of 32 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
2020-12-29 17:41:29 +01:00
Golubev Alexander
9ac9eca6ce Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
2020-12-29 17:41:29 +01:00
Golubev Alexander
bfa281e9ac Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>
Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: Golubev Alexander <fatzer2@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translation: F-Droid/F-Droid metadata
2020-12-29 17:41:28 +01:00
Ertu Official
6ef94ef9cd Translated using Weblate: Russian (ru) by Ertu Official <er2off@outlook.com>
Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: Ertu Official <er2off@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translation: F-Droid/F-Droid metadata
2020-12-29 17:41:28 +01:00
Igor Benek-Lins
e7ae54590e Translated using Weblate: Portuguese (pt) by Igor Benek-Lins <beneklins@protonmail.ch>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Igor Benek-Lins <beneklins@protonmail.ch>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
Translation: F-Droid/F-Droid
2020-12-29 17:41:28 +01:00
ssantos
342c5b3fa6 Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (32 of 32 strings)

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
Translation: F-Droid/F-Droid metadata
2020-12-29 17:41:28 +01:00
x
55547291c7 Translated using Weblate: Italian (it) by x <hardwired1.0@protonmail.com>
Currently translated at 100.0% (32 of 32 strings)

Translated using Weblate: Italian (it) by x <hardwired1.0@protonmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: x <hardwired1.0@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-12-29 17:41:28 +01:00
random r
58429b81f7 Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: random r <epsilin@yopmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2020-12-29 17:41:28 +01:00
x
e33751ef3b Translated using Weblate: Italian (it) by x <hardwired1.0@protonmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Italian (it) by x <hardwired1.0@protonmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: x <hardwired1.0@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2020-12-29 17:41:28 +01:00
Massimiliano Caniparoli
34abd85289 Translated using Weblate: Italian (it) by Massimiliano Caniparoli <massic80@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Italian (it) by Massimiliano Caniparoli <massic80@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Massimiliano Caniparoli <massic80@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2020-12-29 17:41:28 +01:00
Yaron Shahrabani
9c4c4e9883 Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (32 of 32 strings)

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
Translation: F-Droid/F-Droid metadata
2020-12-29 17:41:28 +01:00
Verdulo
897f4b0f8f Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (32 of 32 strings)

Co-authored-by: Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-12-29 17:41:28 +01:00
Hans-Christoph Steiner
d14a5200f1 Merge branch 'Use_ViewCompat_requireViewById' into 'master'
Use ViewCompat.requireViewById().

See merge request fdroid/fdroidclient!958
2020-12-29 15:52:11 +00:00
Hans-Christoph Steiner
81ba7148d3 Merge branch 'Use_ServiceCompat_stopForeground' into 'master'
Use ServiceCompat.stopForeground().

See merge request fdroid/fdroidclient!956
2020-12-29 15:48:51 +00:00
Isira Seneviratne
0835b777a9 Use ViewCompat.requireViewById(). 2020-12-20 05:26:25 +05:30
Isira Seneviratne
1b428087cf Use ServiceCompat.stopForeground(). 2020-12-20 04:58:10 +05:30
Hans-Christoph Steiner
be3ac52000 rename PackageProvider to PackageIdProvider 2020-11-19 14:02:12 +01:00
Hans-Christoph Steiner
413e2672c6 Merge branch 'linkify-web-urls' into 'master'
Linkify web urls

See merge request fdroid/fdroidclient!952
2020-11-18 23:55:20 +00:00
Hans-Christoph Steiner
331d4a174d
fix checkstyle EmptyStatement 2020-11-18 23:30:35 +01:00
Hans-Christoph Steiner
7248375a3a
linkify web URLs in description in App Details
fdroid-website#510
fdroid-website#167
fdroidserver#845
fdroiddata@d6c5315a
jekyll-fdroid!60
2020-11-18 23:20:37 +01:00
Hans-Christoph Steiner
f4ae1aacc7 Merge branch 'usb-otg-nearby-repos' into 'master'
fix repo handling on SDCard/USB-OTG

See merge request fdroid/fdroidclient!950
2020-11-18 21:57:39 +00:00
Hans-Christoph Steiner
8f4263097c Merge branch 'Use_HtmlCompat' into 'master'
Use HtmlCompat.fromHtml().

See merge request fdroid/fdroidclient!917
2020-11-18 21:55:32 +00:00
Isira Seneviratne
ae4b6a8b7c Use HtmlCompat.fromHtml(). 2020-11-12 06:45:25 +05:30
Hans-Christoph Steiner
d00108ba68 support opening USB-OTG on android-29+
Here's another gem: they added this nice new API in android-24 and told
everyone this was THE WAY. Then they made it a no-op in android-29
https://developer.android.com/reference/android/os/storage/StorageVolume#createAccessIntent(java.lang.String)
2020-11-11 18:26:22 +01:00
Hans-Christoph Steiner
6887e09d88 properly track ContentObservers so they can be unregistered 2020-11-11 18:25:30 +01:00
Hans-Christoph Steiner
8209bf9a0b allow SDCard/TreeUri scans to be manually triggered by user button press
Before, the preference blocked all scans.  That lead to confusing UX
since the "Try it" and USB-OTG buttons would do nothing.
2020-11-11 18:25:30 +01:00
Hans-Christoph Steiner
6af66abf54 use MEDIA_* events to update USB-OTG detection
This means that sometimes the NearbyView is updated from a
BroadcastReceiver's Context, which is not an Activity.  So this has to
try a little harder to fetch the Activity instance needed for the
prompt to request permissions to a folder on the USB.  This adds a
failsafe to fallback to the file:/// scanning in SDCardScannerService.
2020-11-11 18:25:30 +01:00
Hans-Christoph Steiner
6fd7970ca5 update USB-OTG status every time the user switches to Nearby
The USB-OTG device can be plugged and unplugged anytime, so the Nearby view
should be updated each time the user switches to this screen.  Registered
callbacks should handle updating the USB-OTG status while the Nearby view
is active.
2020-11-11 18:25:30 +01:00
Hans-Christoph Steiner
bd45f0fdc5 Merge branch 'Remove_MenuItemCompat' into 'master'
Remove MenuItemCompat usages.

See merge request fdroid/fdroidclient!948
2020-11-11 17:00:19 +00:00
Hans-Christoph Steiner
043ed328d2 Merge branch 'Use_ContextCompat_methods' into 'master'
Use ContextCompat methods.

See merge request fdroid/fdroidclient!914
2020-11-11 16:57:39 +00:00
Isira Seneviratne
fcd3fadc9e Remove MenuItemCompat usages. 2020-11-06 16:36:59 +05:30
Isira Seneviratne
fb8922b252 Use ContextCompat.getSystemService(). 2020-11-06 16:27:11 +05:30
Isira Seneviratne
8b9c624d75 Use ContextCompat.startForegroundService(). 2020-11-06 16:26:37 +05:30
Isira Seneviratne
5254a6f1aa Use ContextCompat.getColor(). 2020-11-06 16:26:34 +05:30
Isira Seneviratne
6a0cd0a14a Use ContextCompat.getDrawable(). 2020-11-06 16:25:23 +05:30
Isira Seneviratne
07f3e778d3 Use ContextCompat.startActivity(). 2020-11-06 16:23:25 +05:30
Hans-Christoph Steiner
2f0994d16f Merge branch 'master' into 'master'
ApplicationID / PackageName is defined as case-sensitive

See merge request fdroid/fdroidclient!944
2020-11-06 10:12:41 +00:00
Hans-Christoph Steiner
038eeadca6 Merge branch 'disable-metadata-verification' into 'master'
gradle dependency verification is too buggy with .pom metadata

See merge request fdroid/fdroidclient!945
2020-11-06 10:11:59 +00:00
Hans-Christoph Steiner
5ffb6636a3 Merge branch 'Use_vector_drawables' into 'master'
Use vector drawables.

See merge request fdroid/fdroidclient!946
2020-11-06 09:45:37 +00:00
Isira Seneviratne
9a0ae69bbd Set tint for license, translation and video drawables to match the new ones. 2020-10-24 08:54:01 +05:30
Isira Seneviratne
554eb27a81 Replace website PNGs with a vector drawable. 2020-10-24 08:04:53 +05:30
Isira Seneviratne
7777272313 Replace donate PNGs with a vector drawable. 2020-10-24 06:02:27 +05:30
Isira Seneviratne
0ebb0b1b40 Replace changelog PNGs with a vector drawable. 2020-10-24 05:54:53 +05:30
Isira Seneviratne
aefaf38cee Replace do not disturb PNGs with a vector drawable. 2020-10-23 17:31:46 +05:30
Isira Seneviratne
a2858b7e8b Replace code PNGs with a vector drawable. 2020-10-23 17:31:45 +05:30
Isira Seneviratne
3b318e4b6f Replace share PNGs with a vector drawable. 2020-10-23 17:31:45 +05:30
Isira Seneviratne
a92eb3c899 Replace search PNGs with a vector drawable. 2020-10-23 17:31:44 +05:30
Isira Seneviratne
1924f38bc6 Replace refresh PNGs with a vector drawable. 2020-10-23 17:31:44 +05:30
Isira Seneviratne
c438611030 Replace NFC PNGs with a vector drawable. 2020-10-23 17:31:43 +05:30
Isira Seneviratne
dd5153e445 Replace error PNGs with a vector drawable. 2020-10-23 17:31:43 +05:30
Isira Seneviratne
b6f8f8d6b7 Replace lock PNGs with a vector drawable. 2020-10-23 17:31:42 +05:30
Isira Seneviratne
6c241c8e4a Replace alphabetical order PNGs with a vector drawable. 2020-10-23 17:31:41 +05:30
Isira Seneviratne
d5d9aa897c Replace expand PNGs with vector drawables. 2020-10-23 17:31:40 +05:30
Isira Seneviratne
89d6c475f7 Replace email PNGs with a vector drawable. 2020-10-23 17:31:35 +05:30
Isira Seneviratne
de5b35e776 Replace delete PNGs with a vector drawable. 2020-10-23 16:10:11 +05:30
Isira Seneviratne
2fa3ff166b Replace access time and last updated PNGs with a vector drawable. 2020-10-23 16:10:05 +05:30
Isira Seneviratne
4b28ca9591 Replace add PNGs with a vector drawable. 2020-10-23 16:09:02 +05:30
Isira Seneviratne
7b0e2b3ec9 Replace forward arrow PNGs with a vector drawable. 2020-10-23 16:09:01 +05:30
Isira Seneviratne
607d27a139 Replace Bluetooth PNGs with a vector drawable. 2020-10-23 16:09:01 +05:30
Isira Seneviratne
5bf7a33903 Replace check circle PNGs with a vector drawable. 2020-10-23 16:09:01 +05:30
Isira Seneviratne
0b25365330 Replace add circle outline PNGs with a vector drawable. 2020-10-23 16:09:00 +05:30
Isira Seneviratne
a9b37a533e Replace WiFi and hotspot PNGs with vector drawables. 2020-10-23 16:09:00 +05:30
Hans-Christoph Steiner
16095c8bfd remove unused imports 2020-10-22 11:52:06 +02:00
Hans-Christoph Steiner
4640146842 gradle dependency verification is too buggy with .pom metadata
This disables the verification of .pom files.  .pom files can add
dependencies, so it would be good to have them verified.  But since this
current setup requires all JAR to be verified, any new dependencies would
fail anyway:
https://docs.gradle.org/current/userguide/dependency_verification.html#sec:disabling-metadata-verification

In some cases everything works fine, like on gitlab-ci, and in other places
it always gives errors like this:

```
A problem occurred configuring root project 'client'.
> Dependency verification failed for configuration ':classpath'
  4 artifacts failed verification:
    - all-1.2.0.pom (com.sun.activation:all:1.2.0) from repository MavenRepo
    - jvnet-parent-1.pom (net.java:jvnet-parent:1) from repository MavenRepo
    - oss-parent-7.pom (org.sonatype.oss:oss-parent:7) from repository MavenRepo
    - oss-parent-9.pom (org.sonatype.oss:oss-parent:9) from repository MavenRepo
  This can indicate that a dependency has been compromised. Please carefully verify the checksums.

  Open this report for more details: file:///home/hans/code/fdroid/client/build/reports/dependency-verification/at-1603359642220/dependency-verification-report.html
```

@glennmen and @eighthave both are getting that error.
2020-10-22 11:49:17 +02:00
Hans-Christoph Steiner
f51527befa
ApplicationID / PackageName is defined as case-sensitive
* fdroidserver uses case-sensitive naming since it is based on GNU/Linux
  filesystems, which are case-sensitive by default.

* "the application ID looks like a traditional Java package name, the naming
   rules for the application ID are a bit more restrictive"
   https://developer.android.com/studio/build/application-id

* Java is a case-sensitive language for all names used in .java files:
  "In the Java programming universe, case-sensitive String keys are ubiquitous"
  "Java package names... are case-sensitive"
  https://docs.oracle.com/javase/8/docs/technotes/guides/preferences/designfaq.html
2020-10-22 10:59:44 +02:00
Hans-Christoph Steiner
2b57f49734
version code 1010050 2020-10-22 10:59:42 +02:00
Hans-Christoph Steiner
a9ac8ba6ce ./tools/remove-unused-and-blank-translations.py 2020-10-22 10:59:31 +02:00
Hans-Christoph Steiner
fd954168ce
update changelogs 2020-10-22 10:57:13 +02:00
Hans-Christoph Steiner
9ea4024082 Merge branch 'install-obf-file' into 'master'
install OsmAnd OBF files

See merge request fdroid/fdroidclient!941
2020-10-22 08:00:32 +00:00
Hans-Christoph Steiner
3ab5b5f670 Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!942
2020-10-22 07:52:25 +00:00
Sazid Kabir
8951996831 Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Sazid Kabir <szd.mohd@gmail.com>
Currently translated at 18.4% (84 of 455 strings)

Co-authored-by: Sazid Kabir <szd.mohd@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn_BD/
Translation: F-Droid/F-Droid
2020-10-21 17:48:42 +02:00
Jo
3a67065878 Translated using Weblate: Spanish (es) by Jo <joaquinfc@protonmail.com>
Currently translated at 38.7% (12 of 31 strings)

Co-authored-by: Jo <joaquinfc@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/es/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:42 +02:00
Edoardo Regni
4cb57eda8f Translated using Weblate: Dutch (Belgium) (nl-rBE) by Edoardo Regni <eregni@pm.me>
Currently translated at 98.6% (449 of 455 strings)

Co-authored-by: Edoardo Regni <eregni@pm.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl_BE/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
random r
b310c9267f Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: random r <epsilin@yopmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Oskari Lavinto
ecd4face33 Translated using Weblate: Finnish (fi) by Oskari Lavinto <oskari.lavinto@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Oskari Lavinto <oskari.lavinto@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Max
ba65044889 Translated using Weblate: Bulgarian (bg) by Max <no_greediness@yahoo.com>
Currently translated at 98.6% (449 of 455 strings)

Co-authored-by: Max <no_greediness@yahoo.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bg/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
tamer dab
c2796d95ac Translated using Weblate: Arabic (ar) by tamer dab <dabsantamer@yahoo.com>
Currently translated at 99.7% (454 of 455 strings)

Co-authored-by: tamer dab <dabsantamer@yahoo.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Kristjan Räts
f1f8d1b741 Translated using Weblate: Estonian (et) by Kristjan Räts <kristjanrats@gmail.com>
Currently translated at 25.8% (8 of 31 strings)

Co-authored-by: Kristjan Räts <kristjanrats@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/et/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Aled Powell
83e64f0c61 Translated using Weblate: Welsh (cy) by Aled Powell <aled@aledpowell.cymru>
Currently translated at 99.7% (454 of 455 strings)

Co-authored-by: Aled Powell <aled@aledpowell.cymru>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/cy/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Andres
1f7ee0ba9b Translated using Weblate: Estonian (et) by Andres <andres_ott@hotmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Andres <andres_ott@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/et/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
naofum
e1e086f8b7 Translated using Weblate: Japanese (ja) by naofum <naofum@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: naofum <naofum@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
abidin toumi
d84ffac02d Translated using Weblate: Arabic (ar) by abidin toumi <abidin24@disroot.org>
Currently translated at 99.5% (453 of 455 strings)

Co-authored-by: abidin toumi <abidin24@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Hakim Oubouali
1001fca4f2 Translated using Weblate: Central Atlas Tamazight (tzm) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>
Currently translated at 3.2% (1 of 31 strings)

Translated using Weblate: Central Atlas Tamazight (tzm) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>

Currently translated at 29.6% (135 of 455 strings)

Translated using Weblate: Central Atlas Tamazight (tzm) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>

Currently translated at 28.1% (128 of 455 strings)

Translated using Weblate: Central Atlas Tamazight (tzm) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>

Currently translated at 6.5% (30 of 455 strings)

Co-authored-by: Hakim Oubouali <hakim.oubouali.skr@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tzm/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tzm/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Satjawat Paanakaan
a69aa26e9c Translated using Weblate: Thai (th) by Satjawat Paanakaan <peanutbutteer@gmail.com>
Currently translated at 35.1% (160 of 455 strings)

Co-authored-by: Satjawat Paanakaan <peanutbutteer@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/th/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Ldm Public
cdc7b41fb5 Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Ldm Public <ldmpub@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Ortinomax
f81e7cdca5 Translated using Weblate: French (fr) by Ortinomax <commerce@blaise-moreau.fr>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Ortinomax <commerce@blaise-moreau.fr>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
WaldiS
ea3b84b6e3 Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>
Currently translated at 100.0% (31 of 31 strings)

Co-authored-by: WaldiS <sto@tutanota.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
rooban23
686494fc3a Translated using Weblate: Malayalam (ml) by rooban23 <TP045411@mail.apu.edu.my>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: rooban23 <TP045411@mail.apu.edu.my>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ml/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Besnik Bleta
551a869c7e Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>
Currently translated at 99.1% (451 of 455 strings)

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Mattias Axell
9f37e03e91 Translated using Weblate: Swedish (sv) by Mattias Axell <mattias@libertador.es>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Mattias Axell <mattias@libertador.es>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Maja Košir Habjan
3bfe3cd440 Translated using Weblate: Slovenian (sl) by Maja Košir Habjan <majakh@protonmail.com>
Currently translated at 6.4% (2 of 31 strings)

Translated using Weblate: Slovenian (sl) by Maja Košir Habjan <majakh@protonmail.com>

Currently translated at 99.7% (454 of 455 strings)

Co-authored-by: Maja Košir Habjan <majakh@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sl/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
San Kang
f2f75f8129 Translated using Weblate: Korean (ko) by San Kang <devrivmt@gmail.com>
Currently translated at 99.7% (454 of 455 strings)

Co-authored-by: San Kang <devrivmt@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ko/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Massimiliano Caniparoli
a4ed1ab5ee Translated using Weblate: Italian (it) by Massimiliano Caniparoli <massic80@gmail.com>
Currently translated at 99.5% (453 of 455 strings)

Co-authored-by: Massimiliano Caniparoli <massic80@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Óscar Beiro - TICgal
1b0525b0bd Translated using Weblate: Galician (gl) by Óscar Beiro - TICgal <oscar@ticgal.com>
Currently translated at 99.3% (452 of 455 strings)

Co-authored-by: Óscar Beiro - TICgal <oscar@ticgal.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/gl/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Danial Behzadi
e89df0b6dc Translated using Weblate: Persian (fa) by Danial Behzadi <dani.behzi@ubuntu.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Crisalis
c88d696d64 Translated using Weblate: Spanish (es) by Crisalis <tegaminorune@disroot.org>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Crisalis <tegaminorune@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
nautilusx
c305ffbbe1 Translated using Weblate: German (de) by nautilusx <mail.ka@mailbox.org>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: nautilusx <mail.ka@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
kak mi
3ab35a8e92 Translated using Weblate: Chinese (Simplified) (zh-CN) by kak mi <wavelake@outlook.com>
Currently translated at 100.0% (31 of 31 strings)

Co-authored-by: kak mi <wavelake@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Mostafa Ahangarha
af3577afc9 Translated using Weblate: Persian (fa) by Mostafa Ahangarha <ahangarha@gmail.com>
Currently translated at 99.5% (453 of 455 strings)

Co-authored-by: Mostafa Ahangarha <ahangarha@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
ssantos
829372a18b Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (31 of 31 strings)

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (31 of 31 strings)

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 96.7% (30 of 31 strings)

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
ihor_ck
58e83039ac Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>
Currently translated at 100.0% (31 of 31 strings)

Co-authored-by: ihor_ck <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Dmitry Mikhirev
d7b0356e69 Translated using Weblate: Russian (ru) by Dmitry Mikhirev <mikhirev@gmail.com>
Currently translated at 93.5% (29 of 31 strings)

Co-authored-by: Dmitry Mikhirev <mikhirev@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Verdulo
ccbc6c9e8c Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (31 of 31 strings)

Co-authored-by: Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Hans-Christoph Steiner
9830c2685f Translated using Weblate: Malayalam (ml) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 98.6% (449 of 455 strings)

Co-authored-by: Hans-Christoph Steiner <hans@guardianproject.info>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ml/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Eric
154d40fd16 Translated using Weblate: Chinese (Simplified) (zh-rCN) by Eric <spice2wolf@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Eric <spice2wolf@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
zmni
aecc0ed234 Translated using Weblate: Indonesian (id) by zmni <zmni@outlook.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: zmni <zmni@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/id/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Emanuel Palm
7096460141 Translated using Weblate: Swedish (sv) by Emanuel Palm <ep__palm@hotmail.com>
Currently translated at 98.9% (450 of 455 strings)

Co-authored-by: Emanuel Palm <ep__palm@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Wellington Terumi Uemura
10f64237af Translated using Weblate: Portuguese (Brazil) (pt-BR) by Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Currently translated at 100.0% (31 of 31 strings)

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Wellington Terumi Uemura <wellingtonuemura@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Bart
9219d20a82 Translated using Weblate: Dutch (nl) by Bart <bart@mogwai.be>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Bart <bart@mogwai.be>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Arttu Ylhävuori
cb1041ddf1 Translated using Weblate: Finnish (fi) by Arttu Ylhävuori <arjymoi@hotmail.com>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Arttu Ylhävuori <arjymoi@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/
Translation: F-Droid/F-Droid
2020-10-21 17:48:41 +02:00
Yaron Shahrabani
26850ba40e Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (31 of 31 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Oğuz Ersen
10d848768b Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (31 of 31 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Andrey
b240f9575d Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (31 of 31 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translation: F-Droid/F-Droid metadata
2020-10-21 17:48:41 +02:00
Hans-Christoph Steiner
c157c3f047
fix Espresso test broken by androidx id change
fdroid/fdroidclient!899
2020-10-21 11:52:26 +02:00
Hans-Christoph Steiner
3b2b9ae1df
fix ApkVerifierTest when running on android-29+
fdroid/fdroidclient!856
2020-10-21 11:52:24 +02:00
Hans-Christoph Steiner
15a024b06e
update javadocs 2020-10-21 11:52:22 +02:00
Hans-Christoph Steiner
c0344c1eed
handle .obf.zip by unzipping the map file then installing it 2020-10-21 11:52:21 +02:00
Hans-Christoph Steiner
021d5cc1ff
EXTRA_CANONICAL_URL instance must always be a String 2020-10-21 11:52:19 +02:00
Hans-Christoph Steiner
b316eab85d
post-install Intent to tell OsmAnd to import "installed" OBF
OsmAnd will import map files from a file:// URL pointing to an OBF file,
but this currently only works for file:// and not the proper content://.
This uses a hack to disable the warning about file:// URIs but only for the
final stage of installing the .obf file.

Hopefully in the future, this can be changed to use a proper content:// URL
as I suggested to them in this merge request:
https://github.com/osmandapp/OsmAnd/pull/10043
2020-10-21 11:52:18 +02:00
Hans-Christoph Steiner
8cf267ea6c
code formatting 2020-10-21 11:52:15 +02:00
Hans-Christoph Steiner
4bb158ef77
handle installing OTA files separately from generic .zip files
It is valid to include .zip files in a repo, but only OTA ZIP files
should be installed into the OTA dir.
2020-10-21 11:52:13 +02:00
Hans-Christoph Steiner
5a0092d42e
use shared method for getting full installed path for media files 2020-10-21 11:52:08 +02:00
Hans-Christoph Steiner
fe45b33851
use case-insensitive file extension comparison for Apk.isApk()
foo.APK is valid and installable, though not recommended.  Without this,
foo.APK would be copied to /sdcard/Downloads, which seems wrong
2020-10-21 11:30:51 +02:00
Hans-Christoph Steiner
0797d82d67
fix emulator test breakage from !873
Use Mockito to mock LocaleList rather than changing App.java.  The only
reliably working emulator tests on gitlab-ci are emulator-22. The change to
App.java in 3406edefcd1807cc9352589ac86dbb725c3165b0 broke there:

E/ACRA    ( 2231): Caused by: java.lang.NoClassDefFoundError: android.os.LocaleList
E/ACRA    ( 2231): 	at libcore.reflect.InternalNames.getClass(InternalNames.java:55)
E/ACRA    ( 2231): 	at java.lang.Class.getDexCacheType(Class.java:479)
E/ACRA    ( 2231): 	at java.lang.reflect.ArtMethod.getDexCacheType(ArtMethod.java:191)
E/ACRA    ( 2231): 	at java.lang.reflect.ArtMethod.getReturnType(ArtMethod.java:145)
E/ACRA    ( 2231): 	at java.lang.reflect.Method.getReturnType(Method.java:184)
E/ACRA    ( 2231): 	at java.lang.Class.getDeclaredMethods(Class.java:771)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.util.ClassUtil.getClassMethods(ClassUtil.java:1172)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector._addMemberMethods(AnnotatedMethodCollector.java:117)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector.collect(AnnotatedMethodCollector.java:49)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector.collectMethods(AnnotatedMethodCollector.java:40)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedClass._methods(AnnotatedClass.java:382)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedClass.memberMethods(AnnotatedClass.java:322)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addMethods(POJOPropertiesCollector.java:555)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:323)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getPropertyMap(POJOPropertiesCollector.java:287)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getProperties(POJOPropertiesCollector.java:186)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.BasicBeanDescription._properties(BasicBeanDescription.java:164)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findProperties(BasicBeanDescription.java:239)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCreatorsFromProperties(BasicDeserializerFactory.java:292)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:276)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:224)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:220)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:143)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:414)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:458)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.createContextual(ObjectArrayDeserializer.java:128)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.DeserializationContext.handleSecondaryContextualization(DeserializationContext.java:696)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:496)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.Objec
2020-10-21 11:30:48 +02:00
Hans-Christoph Steiner
adc62211aa
Merge branch 'mixed-translations' into 'master'
Fixed translations preferring secondary locale over primary

See merge request fdroid/fdroidclient!873
2020-10-20 23:18:10 +02:00
Hans-Christoph Steiner
33fb22eae1
LocaleSelectionTest: include test for TW/HK issue
closes #2087
2020-10-20 23:17:30 +02:00
Hans-Christoph Steiner
138b78572c
LocaleSelectionTest: reuse variables to make test cases clear 2020-10-20 23:17:28 +02:00
Marcus Hoffmann
3406edefcd
tests for locale selection 2020-10-20 23:17:25 +02:00
Jonas Kalderstam
87d4779c2d Fixed translations preferring secondary locale over english
In the case where a non-standard region has been set for the primary
system language, the secondary locale will be used for localized
strings when available instead of the expected primary language.

For example, set system locales to [en-SE, ja-JP], that is English
with region Sweden, and Japanese with region Japan, most apps will
display English descriptions but those which have a Japanese
translation will display that instead.

This commit adds a fallback case for when the primary locale has not
matched any translations, but it's language part does.
2020-10-20 17:40:56 +00:00
Hans-Christoph Steiner
c8dcb6260c
add Central Atlas Tamazight (tzm) translation
[skip ci]
2020-10-07 09:22:16 +02:00
Hans-Christoph Steiner
6730d6097e
version code 1010001 2020-09-30 20:57:04 +02:00
Hans-Christoph Steiner
d0b8da7322 Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!937
2020-09-30 13:42:06 +00:00
Eric
1b300e1273
Translated using Weblate: Chinese (Simplified) (zh-rCN) by Eric <spice2wolf@gmail.com>
Currently translated at 99.7% (454 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
2020-09-30 13:49:20 +02:00
ssantos
d33a1851a3
Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (30 of 30 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
2020-09-30 13:45:47 +02:00
ssantos
62ab323fff
Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
2020-09-30 13:45:45 +02:00
ssantos
fa6fc5ef5c
Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>
Currently translated at 100.0% (30 of 30 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
2020-09-30 13:45:43 +02:00
Ole Carlsen
52796f786e
Translated using Weblate: Danish (da) by Ole Carlsen <ole@carlsen-web.dk>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/da/
2020-09-30 13:45:10 +02:00
ssantos
998c56e721
Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
2020-09-30 13:45:09 +02:00
Andrey
f7f15df0a9
Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (455 of 455 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
2020-09-30 13:45:06 +02:00
Hans-Christoph Steiner
d3b041cb86 Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!936
2020-09-30 10:47:57 +00:00
Hans-Christoph Steiner
ba8c150a72
update changelogs 2020-09-29 21:39:03 +02:00
Hans-Christoph Steiner
9bc61e07c8
fix formats and blank strings 2020-09-29 21:39:00 +02:00
Zmicer Turok
f996061712
Translated using Weblate: Belarusian (be) by Zmicer Turok <nashtlumach@gmail.com>
Currently translated at 6.6% (2 of 30 strings)

Translated using Weblate: Belarusian (be) by Zmicer Turok <nashtlumach@gmail.com>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Belarusian (be) by Zmicer Turok <nashtlumach@gmail.com>

Currently translated at 98.4% (448 of 455 strings)

Co-authored-by: Zmicer Turok <nashtlumach@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/be/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/be/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:53 +02:00
Sylphystia
b92bf6700c
Translated using Weblate: Italian (it) by Sylphystia <yuidirnt@gmail.com>
Currently translated at 99.3% (452 of 455 strings)

Co-authored-by: Sylphystia <yuidirnt@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2020-09-29 16:51:53 +02:00
Laura Arjona Reina
a1bc1c1613
Translated using Weblate: Spanish (es) by Laura Arjona Reina <larjona@larjona.net>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Laura Arjona Reina <larjona@larjona.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translation: F-Droid/F-Droid
2020-09-29 16:51:53 +02:00
THANOS SIOURDAKIS
80a5b4066b
Translated using Weblate: Greek (el) by THANOS SIOURDAKIS <siourdakisthanos@gmail.com>
Currently translated at 99.5% (453 of 455 strings)

Co-authored-by: THANOS SIOURDAKIS <siourdakisthanos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/
Translation: F-Droid/F-Droid
2020-09-29 16:51:52 +02:00
RachelB
0c8bdf9cc8
Translated using Weblate: Galician (gl) by RachelB <maresdelno@gmail.com>
Currently translated at 98.2% (447 of 455 strings)

Translated using Weblate: Spanish (es) by RachelB <maresdelno@gmail.com>

Currently translated at 98.4% (448 of 455 strings)

Co-authored-by: RachelB <maresdelno@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/gl/
Translation: F-Droid/F-Droid
2020-09-29 16:51:52 +02:00
Eric
16d0fc9a4c
Translated using Weblate: Chinese (Simplified) (zh-rCN) by Eric <spice2wolf@gmail.com>
Currently translated at 99.5% (453 of 455 strings)

Co-authored-by: Eric <spice2wolf@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
2020-09-29 16:51:51 +02:00
Ajeje Brazorf
11709ca2b3
Translated using Weblate: Sardinian (sc) by Ajeje Brazorf <lmelonimamo@yahoo.it>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sc/
Translation: F-Droid/F-Droid
2020-09-29 16:51:51 +02:00
Andrey
759d324985
Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2020-09-29 16:51:50 +02:00
WaldiS
48f1d50917
Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: WaldiS <sto@tutanota.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/
Translation: F-Droid/F-Droid
2020-09-29 16:51:50 +02:00
Localisation Lab
3f8bcc38f2
Translated using Weblate: French (fr) by Localisation Lab <ao@localizationlab.org>
Currently translated at 100.0% (455 of 455 strings)

Co-authored-by: Localisation Lab <ao@localizationlab.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2020-09-29 16:51:50 +02:00
zeritti
cf3822012f
Translated using Weblate: Czech (cs) by zeritti <woodenmo@posteo.de>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Czech (cs) by zeritti <woodenmo@posteo.de>

Currently translated at 99.5% (453 of 455 strings)

Co-authored-by: zeritti <woodenmo@posteo.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/cs/
Translation: F-Droid/F-Droid
2020-09-29 16:51:49 +02:00
Ldm Public
3a3011a5e0
Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 99.1% (451 of 455 strings)

Co-authored-by: Ldm Public <ldmpub@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translation: F-Droid/F-Droid
2020-09-29 16:51:49 +02:00
Kornelijus Tvarijanavičius
61b0d3f875
Translated using Weblate: Lithuanian (lt) by Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>
Currently translated at 3.3% (1 of 30 strings)

Translated using Weblate: Lithuanian (lt) by Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>

Currently translated at 73.7% (331 of 449 strings)

Co-authored-by: Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/lt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lt/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:48 +02:00
rooban23
1e7596ecb6
Translated using Weblate: Tamil (ta) by rooban23 <TP045411@mail.apu.edu.my>
Currently translated at 37.8% (170 of 449 strings)

Co-authored-by: rooban23 <TP045411@mail.apu.edu.my>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ta/
Translation: F-Droid/F-Droid
2020-09-29 16:51:48 +02:00
Adiitya Andre
0e8656cd70
Translated using Weblate: Indonesian (id) by Adiitya Andre <adiiit.and@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Indonesian (id) by Adiitya Andre <adiiit.and@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Adiitya Andre <adiiit.and@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/id/
Translation: F-Droid/F-Droid
2020-09-29 16:51:48 +02:00
Oğuz Ersen
f6e57ea946
Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (30 of 30 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:47 +02:00
Wellington Terumi Uemura
bd1da011dc
Translated using Weblate: Portuguese (Brazil) (pt-BR) by Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Currently translated at 100.0% (30 of 30 strings)

Co-authored-by: Wellington Terumi Uemura <wellingtonuemura@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:47 +02:00
Milo Ivir
a0e64f1085
Translated using Weblate: Croatian (hr) by Milo Ivir <mail@milotype.de>
Currently translated at 87.0% (391 of 449 strings)

Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hr/
Translation: F-Droid/F-Droid
2020-09-29 16:51:47 +02:00
Kentaro Shirakata
d362cb33c8
Translated using Weblate: Japanese (ja) by Kentaro Shirakata <argrath@ub32.org>
Currently translated at 10.0% (3 of 30 strings)

Co-authored-by: Kentaro Shirakata <argrath@ub32.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ja/
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:46 +02:00
ihor_ck
a374b114e6
Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>

Currently translated at 100.0% (30 of 30 strings)

Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: ihor_ck <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:46 +02:00
Maksym
18c82fcb2a
Translated using Weblate: Ukrainian (uk) by Maksym <dpadar@protonmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Maksym <dpadar@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
2020-09-29 16:51:45 +02:00
Igor Polyakov
2f5276c4c7
Translated using Weblate: Russian (ru) by Igor Polyakov <igorpolyakov@protonmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Igor Polyakov <igorpolyakov@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2020-09-29 16:51:45 +02:00
Yaron Shahrabani
02749f36ff
Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/he/
Translation: F-Droid/F-Droid
2020-09-29 16:51:45 +02:00
Hinaloe
3a005cbf52
Translated using Weblate: Japanese (ja) by Hinaloe <hina@hinaloe.net>
Currently translated at 6.6% (2 of 30 strings)

Co-authored-by: Hinaloe <hina@hinaloe.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ja/
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:44 +02:00
Crisalis
b34d736592
Translated using Weblate: Spanish (es) by Crisalis <tegaminorune@disroot.org>
Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Spanish (es) by Crisalis <tegaminorune@disroot.org>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Crisalis <tegaminorune@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
Translation: F-Droid/F-Droid
2020-09-29 16:51:44 +02:00
naveenkumar palaniswamy
dce093cf8b
Translated using Weblate: Tamil (ta) by naveenkumar palaniswamy <naveenmtp@gmail.com>
Currently translated at 32.7% (147 of 449 strings)

Co-authored-by: naveenkumar palaniswamy <naveenmtp@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ta/
Translation: F-Droid/F-Droid
2020-09-29 16:51:43 +02:00
Kahina Messaoudi
4710ce460e
Translated using Weblate: Kabyle (kab) by Kahina Messaoudi <messaoudikahina02@gmail.com>
Currently translated at 61.9% (282 of 455 strings)

Translated using Weblate: Kabyle (kab) by Kahina Messaoudi <messaoudikahina02@gmail.com>

Currently translated at 6.6% (2 of 30 strings)

Co-authored-by: Kahina Messaoudi <messaoudikahina02@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/kab/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/kab/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:43 +02:00
HKalbasi
25333469ff
Translated using Weblate: Persian (fa) by HKalbasi <hamid.6.11.79@gmail.com>
Currently translated at 99.7% (448 of 449 strings)

Co-authored-by: HKalbasi <hamid.6.11.79@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/
Translation: F-Droid/F-Droid
2020-09-29 16:51:43 +02:00
Sveinn í Felli
ed491ed609
Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/is/
Translation: F-Droid/F-Droid
2020-09-29 16:51:42 +02:00
ーーー
aeedf5f396
Translated using Weblate: Japanese (ja) by ーーー <nnn1590@nnn1590.org>
Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Japanese (ja) by ーーー <nnn1590@nnn1590.org>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: ーーー <nnn1590@nnn1590.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/
Translation: F-Droid/F-Droid
2020-09-29 16:51:42 +02:00
HARADA Hiroyuki
61ff42d74e
Translated using Weblate: Japanese (ja) by HARADA Hiroyuki <haradah98@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: HARADA Hiroyuki <haradah98@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/
Translation: F-Droid/F-Droid
2020-09-29 16:51:42 +02:00
Selyan Sliman Amiri
b5c62dbc79
Translated using Weblate: Kabyle (kab) by Selyan Sliman Amiri <selyan.kab@gmail.com>
Currently translated at 62.5% (281 of 449 strings)

Translated using Weblate: Kabyle (kab) by Selyan Sliman Amiri <selyan.kab@gmail.com>

Currently translated at 61.9% (278 of 449 strings)

Co-authored-by: Selyan Sliman Amiri <selyan.kab@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/kab/
Translation: F-Droid/F-Droid
2020-09-29 16:51:41 +02:00
mahmut özcan
4ba21b82d3
Translated using Weblate: Turkish (tr) by mahmut özcan <mahmutozcan65@yahoo.com>
Currently translated at 96.6% (29 of 30 strings)

Co-authored-by: mahmut özcan <mahmutozcan65@yahoo.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:41 +02:00
ssantos
35403599e4
Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (30 of 30 strings)

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (30 of 30 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:40 +02:00
sivemortenfan
1a61016851
Translated using Weblate: Malayalam (ml) by sivemortenfan <anuay@tutanota.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: sivemortenfan <anuay@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ml/
Translation: F-Droid/F-Droid
2020-09-29 16:51:40 +02:00
Juraj Liso
9a38fac9ed
Translated using Weblate: Slovak (sk) by Juraj Liso <lisojuraj@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Juraj Liso <lisojuraj@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sk/
Translation: F-Droid/F-Droid
2020-09-29 16:51:40 +02:00
Dominik Martinicky
f739b82735
Translated using Weblate: Slovak (sk) by Dominik Martinicky <apocrypth@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Dominik Martinicky <apocrypth@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sk/
Translation: F-Droid/F-Droid
2020-09-29 16:51:39 +02:00
Edoardo Regni
04a1f48144
Translated using Weblate: Dutch (nl) by Edoardo Regni <eregni@pm.me>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Edoardo Regni <eregni@pm.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translation: F-Droid/F-Droid
2020-09-29 16:51:39 +02:00
take100yen
c7944d1274
Translated using Weblate: Japanese (ja) by take100yen <take100yen@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: take100yen <take100yen@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/
Translation: F-Droid/F-Droid
2020-09-29 16:51:38 +02:00
pjammo
27d17207e0
Translated using Weblate: Italian (it) by pjammo <adrianoghr@hotmail.it>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: pjammo <adrianoghr@hotmail.it>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
Translation: F-Droid/F-Droid
2020-09-29 16:51:38 +02:00
Rafael Fontenelle
0e2505b3a9
Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Rafael Fontenelle <rafaelff@gnome.org>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Rafael Fontenelle <rafaelff@gnome.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translation: F-Droid/F-Droid
2020-09-29 16:51:37 +02:00
aevw
11fdbb0a8e
Translated using Weblate: Portuguese (Brazil) (pt-rBR) by aevw <arcanevw@tuta.io>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: aevw <arcanevw@tuta.io>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translation: F-Droid/F-Droid
2020-09-29 16:51:37 +02:00
primarto24c8a9c6889c407b
fdfb4b8140
Translated using Weblate: Macedonian (mk) by primarto24c8a9c6889c407b <prodavac3@protonmail.com>
Currently translated at 43.6% (196 of 449 strings)

Translated using Weblate: Macedonian (mk) by primarto24c8a9c6889c407b <prodavac3@protonmail.com>

Currently translated at 40.5% (182 of 449 strings)

Co-authored-by: primarto24c8a9c6889c407b <prodavac3@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/mk/
Translation: F-Droid/F-Droid
2020-09-29 16:51:37 +02:00
Allan Nordhøy
6665459ae9
Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 99.5% (453 of 455 strings)

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Swedish (sv) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2020-09-29 16:51:36 +02:00
Hakim Oubouali
43879ea35e
Translated using Weblate: Berber (ber) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>
Currently translated at 20.7% (93 of 449 strings)

Translated using Weblate: Berber (ber) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>

Currently translated at 17.5% (79 of 449 strings)

Translated using Weblate: Berber (ber) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>

Currently translated at 7.3% (33 of 449 strings)

Translated using Weblate: Berber (ber) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>

Currently translated at 6.6% (30 of 449 strings)

Added translation using Weblate: Berber (ber) by Hakim Oubouali <hakim.oubouali.skr@gmail.com>

Co-authored-by: Hakim Oubouali <hakim.oubouali.skr@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ber/
Translation: F-Droid/F-Droid
2020-09-29 16:51:36 +02:00
tamer dab
351460d0af
Translated using Weblate: Arabic (ar) by tamer dab <dabsantamer@yahoo.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: tamer dab <dabsantamer@yahoo.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/
Translation: F-Droid/F-Droid
2020-09-29 16:51:35 +02:00
Jonatan Nyberg
9740a2a014
Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2020-09-29 16:51:35 +02:00
yyyyyyyan
95a2f6c969
Translated using Weblate: Portuguese (Brazil) (pt-rBR) by yyyyyyyan <contact@yyyyyyyan.tech>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: yyyyyyyan <contact@yyyyyyyan.tech>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
Translation: F-Droid/F-Droid
2020-09-29 16:51:35 +02:00
ーーー
824cd13c99
Translated using Weblate: Japanese (ja) by ーーー <nnn1590@nnn1590.org>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: ーーー <nnn1590@nnn1590.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/
Translation: F-Droid/F-Droid
2020-09-29 16:51:34 +02:00
Osoitz
157a963b22
Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Osoitz <oelkoro@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eu/
Translation: F-Droid/F-Droid
2020-09-29 16:51:34 +02:00
Priit Jõerüüt
7de0e12142
Translated using Weblate: Estonian (et) by Priit Jõerüüt <hwlate@joeruut.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Estonian (et) by Priit Jõerüüt <hwlate@joeruut.com>

Currently translated at 23.3% (7 of 30 strings)

Translated using Weblate: Estonian (et) by Priit Jõerüüt <hwlate@joeruut.com>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Priit Jõerüüt <hwlate@joeruut.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/et/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/et/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:33 +02:00
sudoLife
88cb6f7fc9
Translated using Weblate: Russian (ru) by sudoLife <mt.ovinov@gmail.com>
Currently translated at 100.0% (30 of 30 strings)

Co-authored-by: sudoLife <mt.ovinov@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:33 +02:00
zmni
77a42538ac
Translated using Weblate: Indonesian (id) by zmni <zmni@outlook.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: zmni <zmni@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/id/
Translation: F-Droid/F-Droid
2020-09-29 16:51:33 +02:00
ihor_ck
e436485cf8
Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: ihor_ck <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
Translation: F-Droid/F-Droid
2020-09-29 16:51:32 +02:00
Tautvydas Zukauskas
54b591b7e9
Translated using Weblate: Lithuanian (lt) by Tautvydas Zukauskas <tautzuk@tutanota.com>
Currently translated at 73.0% (328 of 449 strings)

Co-authored-by: Tautvydas Zukauskas <tautzuk@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/lt/
Translation: F-Droid/F-Droid
2020-09-29 16:51:32 +02:00
Jeff Huang
d2a5e0e987
Translated using Weblate: Chinese (Traditional) (zh-rTW) by Jeff Huang <s8321414@gmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Chinese (Traditional) (zh-rTW) by Jeff Huang <s8321414@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Jeff Huang <s8321414@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hant/
Translation: F-Droid/F-Droid
2020-09-29 16:51:31 +02:00
Licaon Kter
35aac2727a
Translated using Weblate: Romanian (ro) by Licaon Kter <licaon.kter@protonmail.com>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Romanian (ro) by Licaon Kter <licaon.kter@protonmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Romanian (ro) by Licaon Kter <licaon.kter@protonmail.com>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Licaon Kter <licaon.kter@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ro/
Translation: F-Droid/F-Droid
2020-09-29 16:51:31 +02:00
Verdulo
7246e71679
Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (455 of 455 strings)

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Verdulo <tomek@disroot.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
Translation: F-Droid/F-Droid
2020-09-29 16:51:30 +02:00
primarto
c70b4b5ac7
Translated using Weblate: Macedonian (mk) by primarto <prodavac5@protonmail.com>
Currently translated at 18.0% (81 of 449 strings)

Co-authored-by: primarto <prodavac5@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/mk/
Translation: F-Droid/F-Droid
2020-09-29 16:51:30 +02:00
Oğuz Ersen
c9e76a9641
Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>
Currently translated at 96.6% (29 of 30 strings)

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-09-29 16:51:30 +02:00
Oymate
c623a08727
Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Oymate <dhruboadittya96@gmail.com>
Currently translated at 18.2% (82 of 449 strings)

Co-authored-by: Oymate <dhruboadittya96@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn_BD/
Translation: F-Droid/F-Droid
2020-09-29 16:51:27 +02:00
Hans-Christoph Steiner
10a586100e Merge branch 'kunpw-master-patch-10611' into 'master'
Measure http download progress by size of complete file in resumed downloads

See merge request fdroid/fdroidclient!923
2020-09-29 14:51:19 +00:00
Hans-Christoph Steiner
2396a32bb4 Merge branch 'Use_notification_channels' into 'master'
Create and use notification channels on Android Oreo and higher.

See merge request fdroid/fdroidclient!930
2020-09-23 12:03:10 +00:00
Isira Seneviratne
dbbedc7ab1 Create and use notification channels on Android Oreo and higher. 2020-09-22 06:41:41 +05:30
Marcus
17ce6110c2 Merge branch 'Add_Android_11' into 'master'
Add Android 11 to ANDROID_VERSION_NAMES.

See merge request fdroid/fdroidclient!926
2020-08-26 09:58:10 +00:00
Isira Seneviratne
f4409bad02 Add Android 11 to ANDROID_VERSION_NAMES. 2020-08-26 14:52:46 +05:30
kunpw
1c6ab58a30 Measure http download progress by size of complete file in resumed downloads 2020-08-25 15:12:56 +00:00
Hans-Christoph Steiner
a8f1a58f2d Merge branch 'Use_ConnectivityManagerCompat' into 'master'
Use ConnectivityManagerCompat.isActiveNetworkMetered().

See merge request fdroid/fdroidclient!915
2020-08-25 11:35:30 +00:00
Hans-Christoph Steiner
48c520e343 Merge branch 'Use_ConfigurationCompat' into 'master'
Use ConfigurationCompat.getLocales().

See merge request fdroid/fdroidclient!916
2020-08-25 11:29:28 +00:00
Hans-Christoph Steiner
9fd0a433e4 Merge branch 'support-offline-components' into 'master'
allow differing sha256 values in Google Maven vs Android Offline

See merge request fdroid/fdroidclient!918
2020-08-04 09:35:33 +00:00
Hans-Christoph Steiner
708a6d8dbd
allow differing sha256 values in Google Maven vs Android Offline
It turns out that some of the dependencies in the Google Offline Components
downloadable maven repository have difference to the ones Google publishes
to maven.google.com.  WTF.  In any case, the new Gradle Dependency
Verification feature handles this gracefully.  I manually verified the
diffs between the two using diffoscope.  One just differed by timestamps in
the ZIP header, and the other just differed by linefeeds at the end of the
file.  Then I generated this metadata update using:

`./gradlew --write-verification-metadata pgp,sha256`

* https://developer.android.com/studio#offline
2020-08-04 09:46:43 +02:00
Hans-Christoph Steiner
e0cb3f8afc
App.isLocalized() marks whether relevant translations are available
!886
2020-07-22 19:46:54 +02:00
Glenn Carremans
2021f43761
Changed isLocalized logic
`isLocalized` will be true when App will contain 1 or more valid locales for this device
2020-07-22 19:43:03 +02:00
Isira Seneviratne
a44829d33f Use ConfigurationCompat.getLocales(). 2020-07-22 11:10:32 +05:30
Isira Seneviratne
7b8c12bc78 Use ConnectivityManagerCompat.isActiveNetworkMetered(). 2020-07-22 08:48:12 +05:30
Hans-Christoph Steiner
33683cf870 Merge branch 'gradle-dependency-verification' into 'master'
Gradle dependency verification

See merge request fdroid/fdroidclient!913
2020-07-21 10:02:00 +00:00
Hans-Christoph Steiner
be5bdf3219
enable built-in gradle dependency verification
This fully replaces gradle-witness and goes far beyond what it offered. As
far as I can tell, this actually will verify every single artifact that
gradle downloads and uses.

This was generated in two passes to get both the PGP and the SHA256 info:

```
./gradlew --write-verification-metadata pgp,sha256 build connectedFullDebugAndroidTest --export-keys
./gradlew --write-verification-metadata sha256 build connectedFullDebugAndroidTest
```

Thanks to  @vlsi who made me aware of this, and helped make it possible.
closes !837
2020-07-21 10:33:44 +02:00
Hans-Christoph Steiner
dc93686926
update CHANGELOG 2020-07-20 17:48:58 +02:00
Hans-Christoph Steiner
d02ea22572
bump gradle plugin to latest bugfix version 2020-07-20 17:48:55 +02:00
Hans-Christoph Steiner
0c43c66b12 Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!912
2020-07-20 14:22:16 +00:00
Hans-Christoph Steiner
dfec1f305b
fix format strings 2020-07-20 13:50:38 +02:00
Hans-Christoph Steiner
91e04bd9e8
Translated using Weblate: Portuguese (pt) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Afrikaans (af) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 71.0% (319 of 449 strings)

Translated using Weblate: Burmese (my) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 46.7% (210 of 449 strings)

Translated using Weblate: Catalan (ca) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 99.7% (448 of 449 strings)

Translated using Weblate: Flemish (nl-rBE) by Hans-Christoph Steiner <hans@guardianproject.info>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Hans-Christoph Steiner <hans@guardianproject.info>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/af/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/my/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl_BE/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
Translation: F-Droid/F-Droid
2020-07-20 13:50:24 +02:00
Jonatan Nyberg
8e95dcb63c
Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
Translation: F-Droid/F-Droid
2020-07-20 13:50:23 +02:00
kak mi
1614ad7c31
Translated using Weblate: Chinese (Simplified) (zh-rCN) by kak mi <wavelake@outlook.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: kak mi <wavelake@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
Translation: F-Droid/F-Droid
2020-07-20 13:50:23 +02:00
naofum
fa50b8f1a1
Translated using Weblate: Japanese (ja) by naofum <naofum@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: naofum <naofum@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/
Translation: F-Droid/F-Droid
2020-07-20 13:50:23 +02:00
Jesper Hertel
9ec5dbcf82
Translated using Weblate: Danish (da) by Jesper Hertel <jesper.hertel@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Jesper Hertel <jesper.hertel@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/da/
Translation: F-Droid/F-Droid
2020-07-20 13:50:23 +02:00
Andrey
13208de90a
Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: Andrey <andrey@mailbox.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/
Translation: F-Droid/F-Droid
2020-07-20 13:50:22 +02:00
40e3004b-a296-47bd-a073-3dd8af36f77f
1607df0d8c
Translated using Weblate: Flemish (nl-rBE) by 40e3004b-a296-47bd-a073-3dd8af36f77f <40e3004b-a296-47bd-a073-3dd8af36f77f@anonaddy.me>
Currently translated at 99.7% (448 of 449 strings)

Translated using Weblate: Dutch (nl) by 40e3004b-a296-47bd-a073-3dd8af36f77f <40e3004b-a296-47bd-a073-3dd8af36f77f@anonaddy.me>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Flemish (nl-rBE) by 40e3004b-a296-47bd-a073-3dd8af36f77f <40e3004b-a296-47bd-a073-3dd8af36f77f@anonaddy.me>

Currently translated at 99.7% (448 of 449 strings)

Translated using Weblate: Dutch (nl) by 40e3004b-a296-47bd-a073-3dd8af36f77f <40e3004b-a296-47bd-a073-3dd8af36f77f@anonaddy.me>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: French (fr) by 40e3004b-a296-47bd-a073-3dd8af36f77f <40e3004b-a296-47bd-a073-3dd8af36f77f@anonaddy.me>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: 40e3004b-a296-47bd-a073-3dd8af36f77f <40e3004b-a296-47bd-a073-3dd8af36f77f@anonaddy.me>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl_BE/
Translation: F-Droid/F-Droid
2020-07-20 13:50:22 +02:00
zeritti
fbb609824c
Translated using Weblate: Czech (cs) by zeritti <woodenmo@posteo.de>
Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: zeritti <woodenmo@posteo.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/cs/
Translation: F-Droid/F-Droid
2020-07-20 13:50:22 +02:00
nopogo4376
1b31ffa093
Translated using Weblate: Russian (ru) by nopogo4376 <nopogo4376@mailsecv.com>
Currently translated at 100.0% (30 of 30 strings)

Co-authored-by: nopogo4376 <nopogo4376@mailsecv.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
Translation: F-Droid/F-Droid metadata
2020-07-20 13:50:22 +02:00
J. Lavoie
f58bf3eb50
Translated using Weblate: Spanish (Mexico) (es-rMX) by J. Lavoie <j.lavoie@net-c.ca>
Currently translated at 38.3% (172 of 449 strings)

Translated using Weblate: Spanish (Argentina) (es-rAR) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Portuguese (pt) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Estonian (et) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 99.7% (448 of 449 strings)

Translated using Weblate: Danish (da) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 99.7% (448 of 449 strings)

Translated using Weblate: Dutch (nl) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: French (fr) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Finnish (fi) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Greek (el) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 99.7% (448 of 449 strings)

Translated using Weblate: Czech (cs) by J. Lavoie <j.lavoie@net-c.ca>

Currently translated at 99.7% (448 of 449 strings)

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/cs/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/da/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_AR/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/et/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
Translation: F-Droid/F-Droid
2020-07-20 13:50:21 +02:00
bas w
7ba4e02754
Translated using Weblate: Dutch (nl) by bas w <myth.usa538@gmail.com>
Currently translated at 99.7% (448 of 449 strings)

Co-authored-by: bas w <myth.usa538@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nl/
Translation: F-Droid/F-Droid
2020-07-20 13:50:21 +02:00
Éfrit
7e77a65a24
Translated using Weblate: French (fr) by Éfrit <efrit@posteo.net>
Currently translated at 96.6% (29 of 30 strings)

Co-authored-by: Éfrit <efrit@posteo.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/
Translation: F-Droid/F-Droid metadata
2020-07-20 13:50:21 +02:00
ssantos
5320dbbddc
Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (30 of 30 strings)

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (30 of 30 strings)

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (30 of 30 strings)

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (30 of 30 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-07-20 13:50:21 +02:00
grrgui
cb44a26d77
Translated using Weblate: French (fr) by grrgui <baz.14@zaclys.net>
Currently translated at 93.3% (28 of 30 strings)

Co-authored-by: grrgui <baz.14@zaclys.net>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/
Translation: F-Droid/F-Droid metadata
2020-07-20 13:50:20 +02:00
Aman ALam
f86869487f
Translated using Weblate: Punjabi (pa) by Aman ALam <alam.yellow@gmail.com>
Currently translated at 20.7% (93 of 449 strings)

Co-authored-by: Aman ALam <alam.yellow@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pa/
Translation: F-Droid/F-Droid
2020-07-20 13:50:20 +02:00
Strubbl
b67e146b44
Translated using Weblate: German (de) by Strubbl <github@linux4tw.de>
Currently translated at 100.0% (30 of 30 strings)

Co-authored-by: Strubbl <github@linux4tw.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
Translation: F-Droid/F-Droid metadata
2020-07-20 13:50:20 +02:00
keerthana
fc571f14bd
Translated using Weblate: Tamil (ta) by keerthana <keerthanaravichandran96@gmail.com>
Currently translated at 31.1% (140 of 449 strings)

Co-authored-by: keerthana <keerthanaravichandran96@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ta/
Translation: F-Droid/F-Droid
2020-07-20 13:50:20 +02:00
WaldiS
215dd00550
Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>
Currently translated at 100.0% (30 of 30 strings)

Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>

Currently translated at 100.0% (30 of 30 strings)

Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>

Currently translated at 96.6% (29 of 30 strings)

Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>

Currently translated at 100.0% (449 of 449 strings)

Co-authored-by: WaldiS <sto@tutanota.de>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/
Translation: F-Droid/F-Droid
Translation: F-Droid/F-Droid metadata
2020-07-20 13:50:19 +02:00
Hosted Weblate
d5b08cb8c4
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>

Currently translated at 100.0% (30 of 30 strings)

Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>

Currently translated at 83.3% (25 of 30 strings)

Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>

Currently translated at 80.0% (24 of 30 strings)

Translated using Weblate: Chinese (Simplified) (zh-CN) by kak mi <wavelake@outlook.com>

Currently translated at 100.0% (30 of 30 strings)

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (30 of 30 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
Translation: F-Droid/F-Droid metadata
2020-07-20 13:50:19 +02:00
Hans-Christoph Steiner
1be81fc813 Merge branch 'jackson-update' into 'master'
update to latest Jackson JSON, 2.8 is no longer maintained

See merge request fdroid/fdroidclient!909
2020-07-15 16:58:12 +00:00
Hans-Christoph Steiner
857a7f7567
update to latest Jackson JSON, 2.8 is no longer maintained 2020-07-15 15:18:06 +02:00
Hans-Christoph Steiner
850b1cf414
fix checkstyle after androidx update !899 2020-07-15 15:02:34 +02:00
Hans-Christoph Steiner
fcc1656595
remove unused imports to placate checkstyle 2020-07-15 15:02:27 +02:00
Hans-Christoph Steiner
1ee0d7568b Merge branch 'bottom-nav-colors' into 'master'
make bottom nav color configurable

See merge request fdroid/fdroidclient!906
2020-07-15 08:17:16 +00:00
Hans-Christoph Steiner
5ba756ba5b Merge branch 'androidx' into 'master'
AndroidX Migration

See merge request fdroid/fdroidclient!899
2020-07-15 08:05:32 +00:00
Dominik Schürmann
fa209c457f Use Android Gradle Plugin 3.6.0 2020-07-14 21:34:39 +02:00
Dominik Schürmann
44c284d723 Use Gradle 6.4.1 2020-07-14 21:27:50 +02:00
Dominik Schürmann
2701961175 Fix LocalizationTest by recognizing ds format 2020-07-14 17:57:07 +02:00
Dominik Schürmann
319b615da0 Remove unused imports, fix line lengths 2020-07-14 14:10:22 +02:00
Dominik Schürmann
8a0b7eca12 Re-add missing hamcrest dependency 2020-07-14 14:10:22 +02:00
Dominik Schürmann
64e1ec12b9 Remove old support lib proguard rules
AndroidX ships proguard rules that are automatically used
2020-07-14 14:10:22 +02:00
Dominik Schürmann
22c98036c1 build.gradle: use == instead of equals 2020-07-14 14:10:22 +02:00
Dominik Schürmann
f6b3c4bbe2 Migrate AntiFeaturesListingView to AndroidX 2020-07-14 14:10:22 +02:00
Dominik Schürmann
f089b9df08 Use correct uses-library tag in androidTest 2020-07-14 14:10:22 +02:00
Dominik Schürmann
14996c1eca Fix errors reported by lint 2020-07-14 14:10:22 +02:00
Dominik Schürmann
0034e1faff Replace old InstrumentationRegistry.getTargetContext()
with ApplicationProvider.getApplicationContext()
2020-07-14 14:10:22 +02:00
Dominik Schürmann
0ed4fb8e60 Update bouncycastle to 1.65 2020-07-14 14:10:22 +02:00
Dominik Schürmann
06b839d14f Fix test and androidTest dependencies 2020-07-14 14:10:21 +02:00
Dominik Schürmann
1fde5bd355 Remove androidx.legacy dependency 2020-07-14 14:10:21 +02:00
Dominik Schürmann
930f7e2c13 Remove obsolete useProguard flag 2020-07-14 14:10:21 +02:00
Dominik Schürmann
78e81fb781 Use androidx.preference artifact
- use PreferenceFragmentCompat
- this requires androidx Fragments
- explicit declaration of androidx widgets in preferences.xml
  no longer required
2020-07-14 14:10:21 +02:00
Dominik Schürmann
8f81bf0cb9 Use androidx.test artifacts for tests not just androidTests
- this allows replacing deprecated RuntimeEnvironment.application
2020-07-14 14:10:21 +02:00
Dominik Schürmann
360e61118d Fix AppDetailsAdapterTest
by creating a context where styles are available
2020-07-14 14:10:21 +02:00
Dominik Schürmann
d67db78997 Fix AndroidManifest for androidTest 2020-07-14 14:10:21 +02:00
Dominik Schürmann
cefd706aeb Use robolectric:4.3
- remove constants annotation
- Most @Implementation methods in shadow classes are now protected instead of public.
  Tests should always prefer to call SDK methods directly on Android classes rather
  than on their shadows
2020-07-14 14:10:21 +02:00
Dominik Schürmann
c784274b98 Automated Robolectric migration as in http://robolectric.org/automated-migration/ 2020-07-14 14:10:21 +02:00
Marcus Hoffmann
f9663a5ac6 add gradle.properties file to git
This tells gradle that we are an androidX project now.
2020-07-14 14:10:21 +02:00
Marcus Hoffmann
352b6fc7c1 add NonNull annotations to override method 2020-07-14 14:10:21 +02:00
Marcus Hoffmann
59ad42a73b add magic prefrence xml to cancel preferences page offset
Taken from here:
https://stackoverflow.com/a/53969021
2020-07-14 14:10:21 +02:00
Marcus Hoffmann
38374e1d32 update androidX libraries to latest versions
This needs another AGP and gradle update as
com.google.android.material:material:1.1.0 created compile errors
otherwise.
2020-07-14 14:10:21 +02:00
Marcus Hoffmann
18592150c1 perform androidX migration through android studio
Project compiles and works fine after this.
2020-07-14 14:10:21 +02:00
Marcus Hoffmann
e2a75f69ee androidX migrations preparations
We need compileSdk 28 and the required AGP and gradle versions, as well
as updating to compatible support library revisions.

minSdk and targetSdk needs to move to build.gradle from manifest.
buildToolsVersion isn't used anymore.
2020-07-14 14:10:21 +02:00
Dominik Schürmann
f9e4506f2d make bottom nav color configurable 2020-07-13 13:36:50 +02:00
Marcus
d0604cb886 Merge branch 'changelog_1.9' into 'master'
even more 1.9 changelog [ci skip]

See merge request fdroid/fdroidclient!905
2020-07-09 11:44:26 +00:00
Marcus Hoffmann
600842c5ff even more 1.9 changelog [ci skip] 2020-07-09 13:43:51 +02:00
Marcus
986c9d0689 Merge branch 'changelog_1.9' into 'master'
add more tings to 1.9 changelog [ci skip]

See merge request fdroid/fdroidclient!904
2020-07-09 11:36:39 +00:00
Marcus Hoffmann
eddc99879b add more tings to 1.9 changelog [ci skip] 2020-07-09 13:35:40 +02:00
Hans-Christoph Steiner
c226523ecc Merge branch 'acra-email' into 'master'
Make acra report email configurable via gradle

See merge request fdroid/fdroidclient!900
2020-07-02 09:29:38 +00:00
Dominik Schürmann
78a69e7703 Make acra report email configurable via gradle 2020-07-02 09:47:58 +02:00
Hans-Christoph Steiner
0a9e58cb2a
version code to 1010000
[skip ci]
2020-06-25 22:49:00 +02:00
Hans-Christoph Steiner
69ced9d114 Merge branch 'antifeature-icons' into 'master'
Anti-Feature icons

Closes #2014

See merge request fdroid/fdroidclient!834
2020-06-25 20:39:00 +00:00
Michael Pöhn
a4c3df6c24 Anti-Feature icons 2020-06-25 20:39:00 +00:00
Hans-Christoph Steiner
2f6dfa02d0
include FUNDING.yml directly, fdroid update reads it
Also, it is the number two hit when searching for "FUNDING.yml":
https://duckduckgo.com/html/?q=funding.yml

This was copied from https://github.com/f-droid/.github.git
2020-06-25 22:21:01 +02:00
Hosted Weblate
e66fdeb8ef
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-06-25 17:15:25 +02:00
Hosted Weblate
d62eba1a00
Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>
Currently translated at 100.0% (30 of 30 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/

Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
2020-06-25 17:15:25 +02:00
Hans-Christoph Steiner
73f1725da9 Merge branch 'autoVerify-false' into 'master'
set App Link Auto Verify to false

See merge request fdroid/fdroidclient!896
2020-06-25 15:15:16 +00:00
Hans-Christoph Steiner
aea5452904 Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!895
2020-06-25 12:43:38 +00:00
Hans-Christoph Steiner
864453bb5d
autoVerify="false" on all IntentFilters for HTTP/HTTPS #2004
The autoVerify function seems to require that the app only declare domain
names in the IntentFilters that are set up with the "site association"
files.  For F-Droid to support the verified app link, it would have to stop
matching play.google.com, amazon.com, etc.  This autoVerify function also
triggers DNS lookups at the system level, which might not be forwarded over
Tor, in certain scenarios.  So this just disables the whole feature.

https://developer.android.com/training/app-links/verify-site-associations
2020-06-25 13:31:22 +02:00
Hans-Christoph Steiner
757476dc9b
use canonical download URL: https://f-droid.org/F-Droid.apk
fdroid-website@6be403585352126b04e5c72623ef5852cceb2502
fdroid-website!536
2020-06-25 13:31:20 +02:00
Hans-Christoph Steiner
dfca502ac4
use https://f-droid.org/packages/ instead of https://f-droid.org/app
This avoids a redirect.  Both are supported in the IntentFilters.
2020-06-25 13:31:17 +02:00
Hans-Christoph Steiner
adf62a5b1f
fix format strings 2020-06-25 13:11:37 +02:00
Hans-Christoph Steiner
993611e90f
remove Android string quoting 2020-06-25 13:05:32 +02:00
Hans-Christoph Steiner
3b14604589
Merge remote-tracking branch 'weblate/master' into weblate
* weblate/master:
  Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
  Update translation files
  Update translation files
  Update translation files
  Update translation files
  Update translation files
  Update translation files
  Update translation files
  Translated using Weblate: Portuguese (Portugal) (pt-PT) by Manuela Silva <mmsrs@sky.com>
  Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>
  Update translation files
  Update translation files
  Translated using Weblate: Marathi (mr) by Prachi Joshi <josprachi@yahoo.com>
  Translated using Weblate: Romanian (ro) by Licaon Kter <licaon.kter@protonmail.com>
  Translated using Weblate: Serbian (sr) by Саша Петровић <salepetronije@gmail.com>
  Update translation files
  Update translation files
  Update translation files
  Update translation files

 Conflicts:
	app/src/main/res/values-fa/strings.xml
	app/src/main/res/values-hr/strings.xml
	app/src/main/res/values-ta/strings.xml
	app/src/main/res/values-uk/strings.xml
2020-06-25 13:03:53 +02:00
Yaron Shahrabani
73ffd6453b
Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (30 of 30 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
2020-06-25 12:19:12 +02:00
Hans-Christoph Steiner
a6d1e18ee9 Merge branch 'free-donation-options' into 'master'
Free donation options

See merge request fdroid/fdroidclient!891
2020-06-25 10:19:08 +00:00
Hans-Christoph Steiner
5c0ffea1ef fix checkstyle from !817 !818 2020-06-25 10:31:46 +02:00
Hans-Christoph Steiner
770d80340b run Ctrl-Alt-L code formatter on DBHelper 2020-06-25 10:31:46 +02:00
Hans-Christoph Steiner
c9178d1a08 switch donate layout grid from 3 to 2 columns to handle longer URLs 2020-06-25 10:31:46 +02:00
Hans-Christoph Steiner
23bd3b81dd support new Liberapay: field, with migration support for LiberapayID:
Liberapay was originally included using a numeric ID, since they had not yet
finalized the public URLs.  Now it is a username.  So this logic prefers
the username in Liberapay: field, and uses the old LiberapayID: as a
fallback.  LiberapayID: will not override Liberapay: if it is already set.
This reuses the old database key since it is stored and processed as a
String anyway.
2020-06-25 10:31:46 +02:00
Hans-Christoph Steiner
1061929fb4 support OpenCollective as a donation option 2020-06-25 10:31:46 +02:00
Hans-Christoph Steiner
35d2047536 only show donate icons for free software, otherwise show plain URLs
fdroidserver!754
fdroid-website !557
2020-06-25 10:31:44 +02:00
Hosted Weblate
82e07f59d9
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-06-25 08:54:04 +02:00
Hosted Weblate
fbf964f1a3
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
2020-06-25 08:54:04 +02:00
Hosted Weblate
a28c62e77e
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Hungarian (hu) by Balázs Meskó <meskobalazs@mailbox.org>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/hu/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Hungarian (hu) by Balázs Meskó <meskobalazs@mailbox.org>

Currently translated at 55.1% (16 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/hu/

Translated using Weblate: Hungarian (hu) by Balázs Meskó <meskobalazs@mailbox.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hu/
2020-06-25 08:54:03 +02:00
Hosted Weblate
36dbdfb8c0
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/is/
2020-06-25 08:54:03 +02:00
Hosted Weblate
a7c7f83d18
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Italian (it) by FrancescoSoave <fs@francescosoave.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-06-25 08:54:03 +02:00
Hosted Weblate
0270cdbccd
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <sto@tutanota.de>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
2020-06-25 08:54:03 +02:00
Hosted Weblate
b3220091e4
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 96.5% (28 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Brazil) (pt-BR) by Wellington Terumi Uemura <wellingtonuemura@gmail.com>

Currently translated at 96.5% (28 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Wellington Terumi Uemura <wellingtonuemura@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/
2020-06-25 08:54:03 +02:00
Hosted Weblate
78dbde3870
Translated using Weblate: Portuguese (Portugal) (pt-PT) by Manuela Silva <mmsrs@sky.com>
Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by Manuela Silva <mmsrs@sky.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
2020-06-25 08:54:03 +02:00
Hosted Weblate
33949c2ee5
Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>
Currently translated at 65.5% (19 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/

Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Ukrainian (uk) by Tymofij Lytvynenko <till.svit@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>

Currently translated at 58.6% (17 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/

Translated using Weblate: Ukrainian (uk) by ihor_ck <igor_ck@outlook.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-06-25 08:54:03 +02:00
Hosted Weblate
2eb652c23a
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Chinese (Simplified) (zh-CN) by Trey Yang <stevsfy@gmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/

Translated using Weblate: Chinese (Simplified) (zh-rCN) by Trey Yang <stevsfy@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/

Translated using Weblate: Chinese (Simplified) (zh-CN) by Sak94664 <hdudhhhdh@gmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/

Translated using Weblate: Chinese (Simplified) (zh-CN) by Trey Yang <stevsfy@gmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/

Translated using Weblate: Chinese (Simplified) (zh-CN) by Lesya Novaselskaya <mesnevi@airpost.net>

Currently translated at 37.9% (11 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/

Translated using Weblate: Chinese (Simplified) (zh-CN) by kak mi <wavelake@outlook.com>

Currently translated at 37.9% (11 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
2020-06-25 08:54:03 +02:00
Hosted Weblate
e71f139be5
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Croatian (hr) by Milo Ivir <mail@milotype.de>

Currently translated at 6.8% (2 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/hr/

Translated using Weblate: Croatian (hr) by Milo Ivir <mail@milotype.de>

Currently translated at 87.3% (392 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-06-25 08:54:03 +02:00
Hosted Weblate
a071b756a4
Translated using Weblate: Marathi (mr) by Prachi Joshi <josprachi@yahoo.com>
Currently translated at 6.8% (2 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/mr/

Translated using Weblate: Marathi (mr) by Anonymous <noreply@weblate.org>

Currently translated at 6.8% (2 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/mr/
2020-06-25 08:54:03 +02:00
Hosted Weblate
49942cf2fb
Translated using Weblate: Romanian (ro) by Licaon Kter <licaon.kter@protonmail.com>
Currently translated at 6.8% (2 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ro/
2020-06-25 08:54:02 +02:00
Hosted Weblate
9673ac3102
Translated using Weblate: Serbian (sr) by Саша Петровић <salepetronije@gmail.com>
Currently translated at 10.3% (3 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sr/
2020-06-25 08:54:02 +02:00
Hosted Weblate
977a923573
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-06-25 08:54:02 +02:00
Hosted Weblate
23cd5a0b3b
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Slovak (sk) by Juraj Liso <lisojuraj@gmail.com>

Currently translated at 6.8% (2 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sk/

Translated using Weblate: Slovak (sk) by Juraj Liso <lisojuraj@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sk/
2020-06-25 08:54:02 +02:00
Hosted Weblate
ebdad96b0e
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Julien BRONDINO <dev@brondino.fr>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Lesya Novaselskaya <mesnevi@airpost.net>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Ortinomax <commerce@blaise-moreau.fr>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Nathan <bonnemainsnathan@gmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Anonymous <noreply@weblate.org>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Translated using Weblate: French (fr) by Nathan <bonnemainsnathan@gmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/
2020-06-25 08:54:02 +02:00
Hosted Weblate
35fa77cfe7
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Spanish (Mexico) (es-rMX) by Anonymous <noreply@weblate.org>

Currently translated at 38.3% (172 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/

Translated using Weblate: Spanish (Mexico) (es-rMX) by Leviatansan21 <jorgeivanponcehernandez@yahoo.co.jp>

Currently translated at 38.3% (172 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/

Translated using Weblate: Spanish (Mexico) (es-rMX) by Anonymous <noreply@weblate.org>

Currently translated at 22.0% (99 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/

Translated using Weblate: Spanish (Mexico) (es-rMX) by Leviatansan21 <jorgeivanponcehernandez@yahoo.co.jp>

Currently translated at 22.0% (99 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/

Translated using Weblate: Spanish (Mexico) (es-rMX) by Anonymous <noreply@weblate.org>

Currently translated at 21.3% (96 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/

Translated using Weblate: Spanish (Mexico) (es-rMX) by Leviatansan21 <jorgeivanponcehernandez@yahoo.co.jp>

Currently translated at 21.3% (96 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Spanish (Mexico) (es_MX) by Leviatansan21 <jorgeivanponcehernandez@yahoo.co.jp>

Currently translated at 31.0% (9 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/es_MX/

Translated using Weblate: Spanish (Mexico) (es-rMX) by Leviatansan21 <jorgeivanponcehernandez@yahoo.co.jp>

Currently translated at 17.5% (79 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es_MX/

Added translation using Weblate: Spanish (Mexico) (es-rMX) by Leviatansan21 <jorgeivanponcehernandez@yahoo.co.jp>
2020-06-25 08:54:02 +02:00
Hans-Christoph Steiner
2498c127b4
add changelog for upcoming v1.9 release 2020-06-25 08:53:18 +02:00
Marcus
3ddbd00976 Merge branch 'fix_1460' into 'master'
Icon fixes

Closes #1686, #1772, #1771, and #1460

See merge request fdroid/fdroidclient!817
2020-06-24 15:20:05 +00:00
Marcus Hoffmann
4a5bee3e84 use icon from pm, when there's none from the metadata
This was already done for list views because of the panic uninstall list
but we can easily apply the same logic to the tile view and app detail
view as well.
2020-06-24 16:57:28 +02:00
Marcus Hoffmann
56c05933a2 ignore xml icons
They will never work, they should not be set by fdroidserver but we can
be defensive about not returning them to any views here.
2020-06-24 16:57:28 +02:00
Marcus Hoffmann
bc6e5e8433 add test for localized icon 2020-06-24 16:57:28 +02:00
Marcus Hoffmann
7b5d7f8fed fix tests after icon changes 2020-06-24 16:57:28 +02:00
Marcus Hoffmann
941d8a0b8b rename app.icon to app.iconFromApk
This makes it clearer what this is actually referring to.
2020-06-24 16:57:28 +02:00
Marcus Hoffmann
a500660a41 allow displaying localized icons
Move the logic of calculating the correct iconUrl from sql to java.

Fixes #1460.
2020-06-24 16:57:28 +02:00
Hans-Christoph Steiner
a1701ca8c0 Merge branch 'repo_archive_switch' into 'master'
Repo archive switch

Closes #1686, #1772, and #1771

See merge request fdroid/fdroidclient!818
2020-06-24 14:56:23 +00:00
Marcus Hoffmann
4ac2f93238 put archive repo before main
Otherwise when both are enabled the metadata from the archive gets
priority over repo which is not really what we want.
It also breaks a lot of icons, featuregraphics and screenshots.

Fixes fdroid/fdroidclient#1771
Fixes fdroid/fdroidclient#1772
Fixes fdroid/fdroidclient#1686

We also update the default repo priorities for existing installs if we
find the default repos in the original order.

The query is pretty annoying to write in java, here is the raw sql form.

UPDATE fdroid_repo
SET priority = ( SELECT SUM(priority)
            FROM fdroid_repo
            WHERE address IN ('https://f-droid.org/repo', 'https://f-droid.org/archive')
          ) - priority
WHERE address IN ('https://f-droid.org/repo', 'https://f-droid.org/archive') AND
'TRUE' IN (
    SELECT
    CASE
        WHEN a.priority = b.priority-1 THEN 'TRUE'
        ELSE 'FALSE'
    END
    FROM fdroid_repo as a
    INNER JOIN fdroid_repo as b ON
    a.address = "https://f-droid.org/repo" and b.address = "https://f-droid.org/archive"
)
2020-06-24 16:34:43 +02:00
Hans-Christoph Steiner
87d2db3a80 Merge branch 'update_scheduling_fix' into 'master'
UpdateService: fix update scheduling condition

See merge request fdroid/fdroidclient!893
2020-06-15 19:03:57 +00:00
Marcus Hoffmann
82bca90009 UpdateService: fix update scheduling condition
This was blocking updates being scheduled when either data or wifi
updates were disabled. We only want to completely disable the update
service when both are disbaled though.

Ref: #1623
2020-06-15 20:39:56 +02:00
Hans-Christoph Steiner
4031df22f4 Merge branch 'fix_uninstall_crash' into 'master'
fixes a crash that can be triggered when uninstalling with privext

See merge request fdroid/fdroidclient!888
2020-06-10 20:59:16 +00:00
Hans-Christoph Steiner
a0b9150bb3 Merge branch 'cleanup_repo_delete' into 'master'
clean up db when deleting a repository

Closes Bubu/fdroidclassic#29

See merge request fdroid/fdroidclient!887
2020-06-10 20:53:43 +00:00
Marcus Hoffmann
3a2ab0baa6 fixes a crash that can be triggered when uninstalling with privext
Fixes the following crash:

05-19 22:39:55.535  1037 24513 W WindowManager: Attempted to add application window with unknown token Token{2f841 null}.  Aborting.
05-19 22:39:55.536 10844 10844 D AndroidRuntime: Shutting down VM
05-19 22:39:55.540 10844 10844 E AndroidRuntime: FATAL EXCEPTION: main
05-19 22:39:55.540 10844 10844 E AndroidRuntime: Process: org.fdroid.fdroid.debug, PID: 10844
05-19 22:39:55.540 10844 10844 E AndroidRuntime: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@d8ae31 is not valid; is your activity running?
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.view.ViewRootImpl.setView(ViewRootImpl.java:891)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:372)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:128)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.app.Dialog.show(Dialog.java:454)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at org.fdroid.fdroid.views.AppDetailsActivity$7.onReceive(AppDetailsActivity.java:607)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:311)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:47)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:120)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:108)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:166)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7529)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
05-19 22:39:55.540 10844 10844 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

The !isFinishing check was already in the installReceiver part, but
somehow missing in uninstallReceiver. There's also a reference to this
here: http://blackriver.to/2012/08/android-annoying-exception-unable-to-add-window-is-your-activity-running/

I don't understand this crash, especially as the dialouge still gets
shown after adding this check (possibly the parent activity is finishing
and then immediately restarting?). But this sems to realibly fix it.

This was happening when I installed an app, used a new settings entry to
unregister privext as a device owner (by calling it via binder/aidl) and
then trying to uninstall the app I just installed again, whithout
closing f-droid inbetween.
2020-05-19 23:43:25 +02:00
Marcus Hoffmann
a965deb51e clean up db when deleting a repository
Previously everything from a repo staying inside the db when removing it
without disabling it first, the problem manifests when the repo is
readded later (or a mirror), as it would get a new id but all apk
entries still point to the original repoid.

So we now first disable a repo (which just calls
RepoProvider.Helper.purgeApps) before deleting it from the db.

closes Bubu/fdroidclassic#29
2020-05-18 23:36:54 +02:00
Marcus
527917393e Merge branch 'do-not-crop-featureimage' into 'master'
Do not crop feature image

Closes #1798

See merge request fdroid/fdroidclient!874
2020-05-18 18:28:34 +00:00
Marcus
80693c48ff Merge branch 'fix_1845' into 'master'
do not disable update button because of antifeatures

Closes #1845

See merge request fdroid/fdroidclient!872
2020-05-18 18:00:40 +00:00
Hans-Christoph Steiner
f2a625aa75 Merge branch 'patch-1' into 'master'
Make soft navigation bar dark

See merge request fdroid/fdroidclient!878
2020-05-11 08:22:58 +00:00
Hans-Christoph Steiner
3f0361ce79 Merge branch 'Remove_unused_API_level_checks' into 'master'
Remove unused API level checks.

See merge request fdroid/fdroidclient!882
2020-05-11 08:20:20 +00:00
Isira Seneviratne
983593688c Remove unused API level checks. 2020-05-11 08:20:20 +00:00
Hans-Christoph Steiner
32be04285b
version code 1009000 2020-04-22 15:01:37 +02:00
Hans-Christoph Steiner
80408b95d7
./tools/remove-unused-and-blank-translations.py 2020-04-22 14:54:03 +02:00
Hans-Christoph Steiner
fa2cb96577
fix format strings 2020-04-22 14:44:04 +02:00
Hosted Weblate
e1070c0755
Translated using Weblate: Arabic (ar) by Rex_sa <asd1234567890m@gmail.com>
Currently translated at 17.2% (5 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ar/
2020-04-22 14:43:34 +02:00
Hosted Weblate
4eb86f3e5a
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by Oliver <websites@posteo.de>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
2020-04-22 14:43:34 +02:00
Hosted Weblate
d312b80916
Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
2020-04-22 14:43:34 +02:00
Hosted Weblate
f4812c5a1a
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eu/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eu/

Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eu/
2020-04-22 14:43:34 +02:00
Hosted Weblate
7e33726a74
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:34 +02:00
Hosted Weblate
41edad08d4
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Localisation Lab <ao@localizationlab.org>

Currently translated at 41.3% (12 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Translated using Weblate: French (fr) by Localisation Lab <ao@localizationlab.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Julien Gontier <emeuraudeman@protonmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Localisation Lab <ao@localizationlab.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Localisation Lab <ao@localizationlab.org>

Currently translated at 41.3% (12 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Translated using Weblate: French (fr) by Localisation Lab <ao@localizationlab.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
2020-04-22 14:43:34 +02:00
Hosted Weblate
6a06e9ea7c
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:34 +02:00
Hosted Weblate
b963130a30
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/he/

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
2020-04-22 14:43:34 +02:00
Hosted Weblate
335d7f3faa
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:34 +02:00
Hosted Weblate
cbc7c841ff
Translated using Weblate: Korean (ko) by Myeongjin Lee <aranet100@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ko/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:34 +02:00
Hosted Weblate
444f593ce6
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:34 +02:00
Hosted Weblate
0533bb8588
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:33 +02:00
Hosted Weblate
17ee32e0b6
Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>
Currently translated at 96.5% (28 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
2020-04-22 14:43:33 +02:00
Hosted Weblate
cd84aa846c
Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>
Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/

Translated using Weblate: Russian (ru) by Golubev Alexander <fatzer2@gmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
2020-04-22 14:43:33 +02:00
Hosted Weblate
9fb7685fe3
Translated using Weblate: Slovak (sk) by Attila Farkas <farkasattila@ymail.com>
Currently translated at 3.4% (1 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sk/
2020-04-22 14:43:33 +02:00
Hosted Weblate
ab13ba34dc
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:33 +02:00
Hosted Weblate
1304a6603d
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
2020-04-22 14:43:33 +02:00
Hosted Weblate
204b136fa3
Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>
Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
2020-04-22 14:43:33 +02:00
Hosted Weblate
d028baff66
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:33 +02:00
Hosted Weblate
3960a1e6c5
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sq/

Translated using Weblate: Albanian (sq) by Besnik Bleta <besnik@programeshqip.org>

Currently translated at 99.7% (448 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sq/
2020-04-22 14:43:33 +02:00
Hosted Weblate
5d49a8a325
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:33 +02:00
Hosted Weblate
65526288a2
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:33 +02:00
Hosted Weblate
65ca378f74
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:32 +02:00
Hosted Weblate
063787ee6e
Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>
Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/
2020-04-22 14:43:32 +02:00
Hosted Weblate
056b47934d
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:32 +02:00
Hosted Weblate
4b83d4ee8a
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:32 +02:00
Hosted Weblate
e3b1d937b3
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:32 +02:00
Hosted Weblate
41e613ba1b
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:32 +02:00
Hosted Weblate
0f9e015f72
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:32 +02:00
Hosted Weblate
3cd77a50ff
Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 96.5% (28 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
2020-04-22 14:43:32 +02:00
Hosted Weblate
075d4ee9e5
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:32 +02:00
Hosted Weblate
2a28ede418
Translated using Weblate: Bengali (Bangladesh) (bn-rBD) by Oymate <dhruboadittya96@gmail.com>
Currently translated at 3.5% (16 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/bn_BD/
2020-04-22 14:43:32 +02:00
Hosted Weblate
83a65b7f95
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:32 +02:00
Hosted Weblate
3a0cce4185
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:31 +02:00
Hosted Weblate
29d920cb72
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 100.0% (29 of 29 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nn/

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nn/
2020-04-22 14:43:31 +02:00
Hosted Weblate
cafbf4783c
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:31 +02:00
Hosted Weblate
f9835f295a
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-04-22 14:43:31 +02:00
Matthieu
d58052d325 Make soft navigation bar dark 2020-03-22 22:29:37 +00:00
Hans-Christoph Steiner
f4b52b2753 Merge branch 'funding' into 'master'
Funding

Closes #1845

See merge request fdroid/fdroidclient!877
2020-03-20 16:36:34 +00:00
Marcus Hoffmann
10af09a911 don't override org wide FUNDING.yml 2020-03-20 14:10:03 +01:00
ByteHamster
b3f24ba34d Do not crop feature image 2020-03-03 21:48:56 +01:00
Marcus Hoffmann
03600c347c do not disable update button because of antifeatures
This testing at the wrong point, namely in the app details where you are
already looking at the antifeatures which might be present.
In the list view there's an additional direct check with
isDisabledByAntiFeatures() anyway.

Fix fdroid/fdroidclient#1845
2020-02-25 15:47:33 +01:00
Hans-Christoph Steiner
bc36e92731 Merge branch 'fix_inactive_action_buttons' into 'master'
Fix inactive action buttons

Closes #1938

See merge request fdroid/fdroidclient!871
2020-02-14 13:51:39 +00:00
Dmitriy Bogdanov
b64b938f78
Fix inactive action buttons 2020-02-13 17:12:34 +04:00
Hans-Christoph Steiner
d1d71e4900
update changelogs 2020-02-04 17:15:07 +01:00
Hans-Christoph Steiner
03189986d5
version code 1008002
[skip ci]
2020-02-04 17:08:12 +01:00
Hans-Christoph Steiner
da8d02afcc Merge branch 'usb-r' into 'master'
Handle USB-OTG support differently

See merge request fdroid/fdroidclient!870
2020-02-04 15:58:39 +00:00
Hans-Christoph Steiner
7cd42ce499 Merge branch 'api29-3' into 'master'
Handle API 29 split-permissions v3

See merge request fdroid/fdroidclient!869
2020-02-04 15:57:19 +00:00
Chirayu Desai
6c4315f9a1 Handle USB-OTG support differently
* Use separate receivers instead of one combined activity
  to avoid showing the "Use F-Droid to handle Mass Storage"
  prompt every time a drive is plugged in.
2020-02-03 02:36:17 +05:30
Chirayu Desai
02b613a08e Handle API 29 split-permissions v3
* Re-do the logic completely, and make it much more clearer.
* Also, Read external storage implies access media location
  *ONLY* on apps not targetting API 29 or above, i.e <= 28
2020-02-02 20:15:18 +05:30
Hans-Christoph Steiner
881a7e59c6 Merge branch 'fix_null_icons_in_list' into 'master'
Fix displaying default icon for apps without icons

See merge request fdroid/fdroidclient!868
2020-01-23 22:53:09 +00:00
Dmitriy Bogdanov
827e2b2e04
Fix displaying default icon for apps without icons 2020-01-23 13:49:48 +04:00
Hans-Christoph Steiner
5de957de0d Merge branch 'links-ripple' into 'master'
add ripple effect to links on app details activity

See merge request fdroid/fdroidclient!864
2020-01-13 10:38:09 +00:00
Michael Pöhn
b0b3657269 add ripple effect to links on app details activity 2020-01-12 01:17:06 +01:00
Michael Pöhn
3312a1d44b Merge branch 'android10' into 'master'
include android 10 in versions display

See merge request fdroid/fdroidclient!863
2020-01-11 22:34:20 +00:00
Marcus Hoffmann
90d803dc7b include android 10 in versions display 2020-01-11 00:44:47 +01:00
Hans-Christoph Steiner
2cd2f82394
version code 1008001
[skip ci]
2020-01-10 20:34:33 +01:00
Hans-Christoph Steiner
9fca42e252 Merge branch 'suggestedVersionName-sync-up' into 'master'
suggestedVersionName sync up

Closes #1063

See merge request fdroid/fdroidclient!862
2020-01-10 19:22:30 +00:00
Hans-Christoph Steiner
3f64fd4930
init suggestedVersionCode to Integer.MIN_VALUE
Java inits ints to 0.  Since it is valid to have a negative Version Code,
versionCodes are inited to Integer.MIN_VALUE;

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

closes #1063
2020-01-10 18:15:42 +01:00
Hans-Christoph Steiner
765f6b840f
rename App.upstreamVersionCode to suggestedVersionCode #1063 2020-01-10 18:15:40 +01:00
Hans-Christoph Steiner
10808e2fea
rename App.upstreamVersionName to suggestedVersionName #1063 2020-01-10 18:15:39 +01:00
Hans-Christoph Steiner
531494e571
rename App.suggestedVersionName to autoInstallVersionName #1063
# Conflicts:
#	app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java
2020-01-10 18:15:37 +01:00
Hans-Christoph Steiner
cd635459ad
rename Cols.SuggestedApk to AutoInstallApk #1063 2020-01-10 18:15:36 +01:00
Hans-Christoph Steiner
cc3d874dc4
rename App.suggestedVersionCode to autoInstallVersionCode #1063 2020-01-10 18:15:34 +01:00
Hosted Weblate
0d84836153
Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>
Currently translated at 100.0% (28 of 28 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/
2020-01-10 18:10:53 +01:00
Hosted Weblate
a8b75e8243
Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>
Currently translated at 96.4% (27 of 28 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
2020-01-10 18:10:53 +01:00
Hans-Christoph Steiner
92327cbc99 Merge branch 'modernize-pmd-and-randoms' into 'master'
modernize PMD and random fixes

See merge request fdroid/fdroidclient!861
2020-01-10 16:40:22 +00:00
Hans-Christoph Steiner
1c0957ce77
disable annoying or erronous PMD errors 2020-01-10 16:28:03 +01:00
Hans-Christoph Steiner
c987e6ad4c
use Collections' isEmpty() to test for emptiness
This should make the code intent clearer and more standard Java.
2020-01-10 16:28:01 +01:00
Hans-Christoph Steiner
c7f3910472
fix PMD "Field has the same name as a method" 2020-01-10 16:28:00 +01:00
Hans-Christoph Steiner
3b67aa1a60
modernize PMD setup 2020-01-10 16:27:58 +01:00
Hans-Christoph Steiner
cd23d5cd85
bump to latest bugfix version of gradle android plugin 2020-01-10 16:27:57 +01:00
Hans-Christoph Steiner
1cfae44aec
only download from jCenter as a last resort
"Artifact integrity verification aside, not only should jcenter() always be
last, but you need to put mavenCentral() before them. JCenter and Bintray
keep proving they're not a trustworthy artifact host. Ideally you fetch
nothing from them."
https://twitter.com/JakeWharton/status/1073102730443526144

https://blog.autsoft.hu/a-confusing-dependency/
2020-01-10 16:27:55 +01:00
Hans-Christoph Steiner
e0fd1ec771
gitlab-ci: echo when test/pmd/lint/etc fails 2020-01-10 16:27:52 +01:00
Chirayu Desai
2ac9100eea Merge branch 'network-security-config-force-https' into 'master'
set up whitelist of repo domains to force HTTPS

See merge request fdroid/fdroidclient!835
2020-01-10 15:26:08 +00:00
Hans-Christoph Steiner
3ff70a8b6a Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!860
2020-01-10 15:23:30 +00:00
Hans-Christoph Steiner
e6d99a6887
update changelogs
[skip ci]
2020-01-10 15:46:05 +01:00
Hosted Weblate
a2848520fa
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-01-10 15:40:24 +01:00
Hosted Weblate
14c4cdafc9
Translated using Weblate: Catalan (ca) by Kintu <kintukp@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Catalan (ca) by BennyBeat <bennybeat@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Catalan (ca) by BennyBeat <bennybeat@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/

Translated using Weblate: Catalan (ca) by BennyBeat <bennybeat@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Catalan (ca) by BennyBeat <bennybeat@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/

Translated using Weblate: Catalan (ca) by BennyBeat <bennybeat@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Catalan (ca) by Kintu <kintukp@gmail.com>

Currently translated at 14.8% (4 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ca/

Translated using Weblate: Catalan (ca) by Kintu <kintukp@gmail.com>

Currently translated at 98.0% (440 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/
2020-01-10 15:40:22 +01:00
Hosted Weblate
1048e44996
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (27 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 96.3% (26 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/
2020-01-10 15:40:21 +01:00
Hosted Weblate
03576a656c
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 100.0% (27 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 96.3% (26 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/is/
2020-01-10 15:40:19 +01:00
Hosted Weblate
1e5994d74b
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Italian (it) by Michael Moroni <michaelmoroni@disroot.org>

Currently translated at 55.6% (15 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/
2020-01-10 15:40:17 +01:00
Hosted Weblate
a2b6a30e11
Translated using Weblate: Turkish (tr) by Ali Demirtas <alidemirtas94@gmail.com>
Currently translated at 81.5% (22 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

Translated using Weblate: Turkish (tr) by Ali Demirtas <alidemirtas94@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2020-01-10 15:40:15 +01:00
Hosted Weblate
74a5a5a400
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Spanish (es) by J <joaquinfc@protonmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Spanish (es) by J <joaquinfc@protonmail.com>

Currently translated at 44.4% (12 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/es/

Translated using Weblate: Spanish (es) by J <joaquinfc@protonmail.com>

Currently translated at 99.6% (447 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/es/
2020-01-10 15:40:14 +01:00
Hosted Weblate
42409f7c71
Translated using Weblate: Hungarian (hu) by Balázs Meskó <meskobalazs@gmail.com>
Currently translated at 59.3% (16 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/hu/
2020-01-10 15:40:12 +01:00
Hosted Weblate
6d5d6b5ef8
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (27 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
2020-01-10 15:40:11 +01:00
Hosted Weblate
0ad00f9576
Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rafael Fontenelle <rafaelff@gnome.org>
Currently translated at 100.0% (27 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/
2020-01-10 15:40:09 +01:00
Hosted Weblate
2e275db9b2
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (27 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/
2020-01-10 15:40:07 +01:00
Hosted Weblate
6fff5599de
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (27 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/
2020-01-10 15:40:06 +01:00
Hosted Weblate
3a3c2583ff
Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>
Currently translated at 100.0% (27 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/

Translated using Weblate: German (de) by nautilusx <mail.ka@mailbox.org>

Currently translated at 100.0% (27 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
2020-01-10 15:40:03 +01:00
Hans-Christoph Steiner
30d16a8862
ManageRepos: force to HTTPS when required by Network Security Config
Since GitLab, GitHub, and Amazon S3 allow some HTTP access while always
providing HTTPS, those should always use HTTPS.  This prevents
2020-01-10 15:28:13 +01:00
Hans-Christoph Steiner
5b8d85a4da
set up whitelist of repo domains to force HTTPS
This uses the new Network Security Config feature:
https://developer.android.com/training/articles/security-config
2020-01-10 15:25:38 +01:00
Hans-Christoph Steiner
05347d5cbc Merge branch 'api29-2' into 'master'
Handle API 29 split-permissions v2

See merge request fdroid/fdroidclient!856
2020-01-10 14:19:32 +00:00
Chirayu Desai
fae735c468 Handle API 29 split-permissions v2
* This new permission comes courtesy of the Q December update.
* Read external storage implies access media location

References:
* ac7b10c135%5E%21/#F1
2020-01-10 19:27:53 +05:30
Hans-Christoph Steiner
ee1f4d3dc4 Merge branch 'tests-support-variable-nr-of-default-repos' into 'master'
Make tests support a variable number of default repos.

See merge request fdroid/fdroidclient!857
2020-01-10 13:25:38 +00:00
Hans-Christoph Steiner
cc9796127d
run new zopflipng compression settings from !844 2020-01-02 22:38:54 +01:00
Hans-Christoph Steiner
e2d7199f3f
png-pre-compress: use best of singleCrunch or zopflipng 2020-01-02 22:06:19 +01:00
Hans-Christoph Steiner
ab81295639 Merge branch 'OptimizePNG' into 'master'
Compress PNG images losslessly with zopflipng

See merge request fdroid/fdroidclient!844
2020-01-02 20:19:35 +00:00
Peter Dave Hello
a7fa47e3e9 Compress PNG images losslessly with zopflipng 2020-01-02 20:19:35 +00:00
Social Justice Wizard
390f0a8d96 Make tests support a variable number of default repos. 2020-01-02 19:34:36 +01:00
Hans-Christoph Steiner
25262e4463 Merge branch 'close-search-keyboard' into 'master'
activity list: open keyboard when clearing search term

Closes #1915

See merge request fdroid/fdroidclient!858
2020-01-02 13:59:51 +00:00
Michael Pöhn
f7c757bf33 app list: open keyboard when X-ing search query 2019-12-29 21:46:29 +01:00
Michael Pöhn
432a7882fd Merge branch 'summary-design' into 'master'
display summary text on app details activity

Closes #1820

See merge request fdroid/fdroidclient!855
2019-12-25 22:59:34 +00:00
Hans-Christoph Steiner
1379d1e365
./tools/remove-unused-and-blank-translations.py 2019-12-11 11:31:32 +01:00
Michael Pöhn
e42718b11f display summary text on app details activity 2019-12-08 03:37:13 +01:00
Hans-Christoph Steiner
dca8023d7d
ignore flaky swap webserver tests by default 2019-11-30 22:00:53 +01:00
Hans-Christoph Steiner
6375dccb06
gitlab-ci: only run Espresso tests if KVM is available
The emulators without KVM are just too slow to reliably run the Espresso
tests, at least with the timeouts that are set by default.
2019-11-30 22:00:40 +01:00
Hans-Christoph Steiner
4d28b52419
gitlab-ci: use new image that handles the emulator setup 2019-11-30 13:38:05 +01:00
Hosted Weblate
053ffab395
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-21 21:44:52 +01:00
Hosted Weblate
975013700a
Translated using Weblate: English (United States) (en-US) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 92.6% (25 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/en_US/

Translated using Weblate: English (United States) (en-US) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 88.0% (22 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/en_US/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: English (United States) (en-rUS) by sam <swafa4@gmail.com>

Currently translated at 0.5% (2 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/en_US/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: English (United States) (en-US) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/en_US/
2019-11-21 21:40:37 +01:00
Hosted Weblate
eabb1ba950
Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 63.0% (17 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nb_NO/
2019-11-21 21:40:34 +01:00
Hosted Weblate
b143a76466
Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/he/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (27 of 27 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/he/
2019-11-21 21:40:32 +01:00
Hans-Christoph Steiner
6b7d82dba7
add translations from Android when they are missing from a locale 2019-11-21 18:07:23 +01:00
Hans-Christoph Steiner
103098d31c
map more Android string keys to F-Droid string keys
These strings are part of the install/uninstall UI which is originally
sourced from Android itself.  So the translations should stay in sync with
Android's.
2019-11-21 17:22:19 +01:00
Hans-Christoph Steiner
aecf4fdc17
sync common works to the Android v9.0.0r50 sources 2019-11-21 16:06:34 +01:00
Hans-Christoph Steiner
984fe6ad2b
tools/check-string-maxlength.py: include limits from Android sources 2019-11-21 16:06:32 +01:00
Hans-Christoph Steiner
69e85ed202
update embedded GPG signing key so that it is no longer expired
This is the same exact key, just the signed metadata is updated so that it
includes the new expiration date.  This is the same as just updating this
key from the keyservers.
2019-11-21 10:14:21 +01:00
Hans-Christoph Steiner
bfd6959c34
Revert "Language: Data is "kept", not "not lost"."
This reverts commit 346db627ba3dee71bea8ef49184dc7ef60c7286b.

These strings come from Android:
https://gitlab.com/fdroid/fdroidclient/merge_requests/853#note_248378487
2019-11-21 10:14:18 +01:00
Hans-Christoph Steiner
ae06166d18
version code 1008000 2019-11-20 23:11:35 +01:00
Hans-Christoph Steiner
666d8cc7d7
update changelogs 2019-11-20 23:11:33 +01:00
Hans-Christoph Steiner
38e6103c0f
fix broken format strings 2019-11-20 23:11:27 +01:00
Hans-Christoph Steiner
947945dc92
tools/check-format-strings.py: remove blank translations 2019-11-20 22:35:44 +01:00
Hans-Christoph Steiner
c829d232a3 remove unneeded Android string quoting 2019-11-20 22:33:19 +01:00
Hosted Weblate
573c9a3d0a Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Persian (fa) by Mostafa Ahangarha <ahangarha@gmail.com>

Currently translated at 12.0% (3 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fa/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Persian (fa) by Danial Behzadi <dani.behzi@ubuntu.com>

Currently translated at 12.0% (3 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fa/

Translated using Weblate: Persian (fa) by Danial Behzadi <dani.behzi@ubuntu.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Persian (fa) by Mostafa Ahangarha <ahangarha@gmail.com>

Currently translated at 99.8% (448 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/

Translated using Weblate: Persian (fa) by hpn33 <hamed.hpn332@gmail.com>

Currently translated at 8.0% (2 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fa/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Persian (fa) by Mehrad Mahmoudian <m.mahmoudian@gmail.com>

Currently translated at 99.5% (429 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fa/

Translated using Weblate: Persian (fa) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 9.5% (2 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fa/
2019-11-20 22:18:52 +01:00
Hosted Weblate
745839e9ed Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Spanish (es) by Fioddor Superconcentrado <fioddor@gmail.com>

Currently translated at 40.0% (10 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/es/
2019-11-20 22:18:52 +01:00
Hosted Weblate
bf75b6bbcb Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 96.0% (24 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/
2019-11-20 22:18:52 +01:00
Hosted Weblate
047988895c Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Serbian (sr) by Саша Петровић <salepetronije@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sr/

Translated using Weblate: Serbian (sr) by Саша Петровић <salepetronije@gmail.com>

Currently translated at 99.8% (448 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sr/
2019-11-20 22:18:52 +01:00
Hosted Weblate
47974be2a1 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
0204ce5106 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 48.0% (12 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nn/

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nn/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 0.0% (0 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nn/

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nn/

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 1.2% (5 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nn/

Translated using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>

Currently translated at 0.5% (2 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nn/

Added translation using Weblate: Norwegian Nynorsk (nn) by Karl Ove Hufthammer <karl@huftis.org>
2019-11-20 22:18:52 +01:00
Hosted Weblate
8941188d3c Translated using Weblate: Chinese (Traditional) (zh-TW) by Hsiu-Ming Chang <cges30901@gmail.com>
Currently translated at 20.0% (5 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hant/
2019-11-20 22:18:52 +01:00
Hosted Weblate
1b7b368e98 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
7badadcdae Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Turkish (tr) by Oğuz Ersen <oguzersen@protonmail.com>

Currently translated at 80.0% (20 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Turkish (tr) by Oguz Ersen <oguzersen@protonmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/

Translated using Weblate: Turkish (tr) by Kemal Oktay Aktoğan <oktay454@disroot.org>

Currently translated at 72.0% (18 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

Translated using Weblate: Turkish (tr) by mahmut özcan <mahmutozcan65@yahoo.com>

Currently translated at 68.0% (17 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
2019-11-20 22:18:52 +01:00
Hosted Weblate
d926014538 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Telugu (te) by leela <53352@protonmail.com>

Currently translated at 82.0% (368 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/te/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Telugu (te) by Vinay Kumar <mulamatamvinay@gmail.com>

Currently translated at 92.0% (23 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/te/
2019-11-20 22:18:52 +01:00
Hosted Weblate
76eb99d03a Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Belarusian (be) by Zmicer Turok <nashtlumach@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/be/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Belarusian (be) by Zmicer Turok <nashtlumach@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/be/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Belarusian (be) by Zmicer Turok <nashtlumach@gmail.com>

Currently translated at 8.0% (2 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/be/

Translated using Weblate: Belarusian (be) by Zmicer Turok <nashtlumach@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/be/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Belarusian (be) by Viktar Vauchkevich <victorenator@gmail.com>

Currently translated at 8.0% (2 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/be/
2019-11-20 22:18:52 +01:00
Hosted Weblate
f93768b94f Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
eab406ee1f Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
f605b76d3d Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
f6ea6f3763 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (26 of 26 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
2019-11-20 22:18:52 +01:00
Hosted Weblate
00c437f6a7 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (26 of 26 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
2019-11-20 22:18:52 +01:00
Hosted Weblate
0188758d9f Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 72.0% (18 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nb_NO/

Translated using Weblate: Norwegian Bokmål (nb) by Thomas johansen <lavahd@protonmail.ch>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/

Translated using Weblate: Norwegian Bokmål (nb) by Thomas johansen <lavahd@protonmail.ch>

Currently translated at 72.0% (18 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nb_NO/
2019-11-20 22:18:52 +01:00
Hosted Weblate
fddc369c6c Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
dca5c73ffd Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Swedish (sv) by Mattias Münster <mattiasmun@gmail.com>

Currently translated at 30.8% (8 of 26 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/sv/
2019-11-20 22:18:52 +01:00
Hosted Weblate
2bf36381e5 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
a37808a9d7 Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (26 of 26 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
2019-11-20 22:18:52 +01:00
Hosted Weblate
3796f19cd0 Translated using Weblate: Danish (da) by Jesper Hertel <jesper.hertel@gmail.com>
Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/da/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
d9ba782d97 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Welsh (cy) by Aled Powell <aled@aledpowell.cymru>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/cy/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Welsh (cy) by Aled Powell <aled@aledpowell.cymru>

Currently translated at 82.2% (369 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/cy/
2019-11-20 22:18:52 +01:00
Hosted Weblate
dcdfb863d2 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eu/

Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eu/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eu/

Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eu/

Translated using Weblate: Basque (eu) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 95.2% (20 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eu/
2019-11-20 22:18:52 +01:00
Hosted Weblate
9eb863e3da Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
e33eb7cc83 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:18:52 +01:00
Hosted Weblate
a57a01687f
Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>
Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (26 of 26 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by ssantos <ssantos@web.de>

Currently translated at 100.0% (26 of 26 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
2019-11-20 22:17:44 +01:00
Hosted Weblate
b17c4b473f
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Arabic (ar) by Omar Aglan <omar.aglan91@yahoo.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Arabic (ar) by ButterflyOfFire <ButterflyOfFire@protonmail.com>

Currently translated at 99.6% (447 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/

Translated using Weblate: Arabic (ar) by ButterflyOfFire <ButterflyOfFire@protonmail.com>

Currently translated at 16.0% (4 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ar/
2019-11-20 22:17:44 +01:00
Hosted Weblate
d0b868025e
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Hungarian (hu) by Balázs Meskó <meskobalazs@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/hu/

Translated using Weblate: Hungarian (hu) by Doma Gergő <domag02@gmail.com>

Currently translated at 10.0% (2 of 20 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/hu/
2019-11-20 22:17:44 +01:00
Hosted Weblate
13b7ae99fb
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:17:43 +01:00
Hosted Weblate
03e56ab389
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Czech (cs) by zeritti <woodenmo@posteo.de>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/cs/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Czech (cs) by zeritti <woodenmo@posteo.de>

Currently translated at 16.0% (4 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/cs/
2019-11-20 22:17:43 +01:00
Hosted Weblate
2536af8cad
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:17:43 +01:00
Hosted Weblate
0e32304952
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:17:43 +01:00
Hosted Weblate
ad37ca43c4
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Julien Lepiller <roptat@lepiller.eu>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Translated using Weblate: French (fr) by davidthehackerman <davidpeterrodrigues@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Nathan <bonnemainsnathan@gmail.com>

Currently translated at 48.0% (12 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Julien Lepiller <roptat@lepiller.eu>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Arnaud Jacquemin <arnaud.jacquemin+weblate@free.fr>

Currently translated at 48.0% (12 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 99.1% (444 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Translated using Weblate: French (fr) by xin <xin@riseup.net>

Currently translated at 99.1% (444 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Translated using Weblate: French (fr) by André MIRAS <andre.miras@gmail.com>

Currently translated at 32.0% (8 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 99.1% (444 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 98.9% (443 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Translated using Weblate: French (fr) by Florian <floflr@zaclys.net>

Currently translated at 98.4% (441 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 98.0% (439 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Translated using Weblate: French (fr) by Arnaud Jacquemin <arnaud.jacquemin+weblate@free.fr>

Currently translated at 13.6% (3 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: French (fr) by Ldm Public <ldmpub@gmail.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/

Translated using Weblate: French (fr) by xin <xin@riseup.net>

Currently translated at 19.0% (4 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fr/
2019-11-20 22:17:43 +01:00
Hosted Weblate
9abe99d2b9
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:17:43 +01:00
Hosted Weblate
b074934e3e
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:17:43 +01:00
Hosted Weblate
d21c43e97d
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:17:43 +01:00
Hosted Weblate
cbe264ec2f
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Wilker Santana da Silva <wilker@tutamail.com>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/
2019-11-20 22:17:43 +01:00
Hosted Weblate
b3c11263ae
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Estonian (et) by Kristjan Räts <kristjanrats@gmail.com>

Currently translated at 28.0% (7 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/et/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Estonian (et) by Kristjan Räts <kristjanrats@gmail.com>

Currently translated at 8.0% (2 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/et/

Translated using Weblate: Estonian (et) by Kristjan Räts <kristjanrats@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/et/

Translated using Weblate: Estonian (et) by Janar Leas <janar.leas@gmail.com>

Currently translated at 4.5% (1 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/et/
2019-11-20 22:17:43 +01:00
Hosted Weblate
7abf7b92b0
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:17:43 +01:00
Hosted Weblate
6957488974
Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>
Currently translated at 56.0% (14 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/
2019-11-20 22:17:43 +01:00
Hosted Weblate
a1c08a2453
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Finnish (fi) by Ammuu5 <ammuu5@tutanota.com>

Currently translated at 8.0% (2 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fi/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Finnish (fi) by Tuomas Hietala <tuomas.hietala@iki.fi>

Currently translated at 99.3% (446 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/

Translated using Weblate: Finnish (fi) by Tuomas Hietala <tuomas.hietala@iki.fi>

Currently translated at 99.8% (448 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/

Translated using Weblate: Finnish (fi) by Developer From Jokela Offical Channel <developerfromjokela@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Finnish (fi) by Nikolay Korotkiy <sikmir@gmail.com>

Currently translated at 4.0% (1 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/fi/
2019-11-20 22:17:42 +01:00
Hosted Weblate
159c0023e7
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
2019-11-20 22:17:42 +01:00
Hosted Weblate
ea10fe3549
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (26 of 26 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
2019-11-20 22:17:42 +01:00
Hosted Weblate
117113e266
Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-11-20 22:17:42 +01:00
Hosted Weblate
fb757a2c01
Translated using Weblate: Chinese (Simplified) (zh-CN) by RainSlide <RainSlide@outlook.com>
Currently translated at 32.0% (8 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/

Translated using Weblate: Chinese (Simplified) (zh-CN) by Dingzhong Chen <wsxy162@gmail.com>

Currently translated at 32.0% (8 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
2019-11-20 22:17:42 +01:00
Hans-Christoph Steiner
4f368db1db Merge branch 'nononegations' into 'master'
Language: Data is "kept", not "not lost".

See merge request fdroid/fdroidclient!853
2019-11-20 20:30:31 +00:00
Florian Sesser
346db627ba Language: Data is "kept", not "not lost". 2019-11-20 19:14:51 +01:00
Hans-Christoph Steiner
bc78eba6ba Merge branch 'api29' into 'master'
Handle API 29 split-permissions

See merge request fdroid/fdroidclient!852
2019-11-14 20:04:36 +00:00
Chirayu Desai
09835721f2 Handle API 29 split-permissions
* For apps targetting 28 or lower,
  fine/coarse location now implies background location.
* Fine location now implies coarse location.

References:
* https://developer.android.com/about/versions/10/privacy/changes#access_granted_automatically_when_targeting_android_9_or_lower
* https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-10.0.0_r1/data/etc/platform.xml#186
2019-11-14 20:35:50 +05:30
Hans-Christoph Steiner
7c0cb2064e Merge branch 'left-padding' into 'master'
Add left padding on first screenshot to match header

See merge request fdroid/fdroidclient!851
2019-10-30 11:29:07 +00:00
Hans-Christoph Steiner
4312deb4c8 Merge branch 'padding' into 'master'
Fix extra large padding after every five items on main page

See merge request fdroid/fdroidclient!850
2019-10-29 17:27:23 +00:00
Hans-Christoph Steiner
9994728c37 Merge branch 'fix-blur' into 'master'
Fix blur on seekbar drawable

See merge request fdroid/fdroidclient!848
2019-10-29 10:09:28 +00:00
dkanada
c9040e2cf4 add left padding on first screenshot to match header 2019-10-29 04:35:25 +09:00
dkanada
d538760ad1 fix extra large padding after every five items on main page 2019-10-29 04:02:37 +09:00
dkanada
4253f49e79 fix blur on seekbar drawable 2019-10-29 03:41:09 +09:00
Hans-Christoph Steiner
a2583f0255 Merge branch 'hide-seekbar-value' into 'master'
Hide the seekbar value on all devices

See merge request fdroid/fdroidclient!849
2019-10-28 17:17:16 +00:00
dkanada
6393923274 hide the seekbar value on all devices 2019-10-29 01:51:54 +09:00
Hans-Christoph Steiner
96229f01e8 Merge branch 'spelling_fix' into 'master'
PrivilegedInstaller: fix a grammar mistake in error message

See merge request fdroid/fdroidclient!846
2019-10-15 11:43:08 +00:00
Marcus
65463781d0 PrivilegedInstaller: fix a grammar mistake in error message 2019-10-15 11:43:08 +00:00
Hans-Christoph Steiner
8ee5fa75e4 Merge branch 'fix-acra-crashes' into 'master'
Fix ACRA crashes

See merge request fdroid/fdroidclient!845
2019-10-14 14:46:42 +00:00
Hans-Christoph Steiner
36961c2139
update CHANGELOG 2019-10-14 15:19:16 +02:00
Hans-Christoph Steiner
887f53cf95
stop crash in TreeUriScannerIntentService.onActivityResult()
This might happen if the user denies storage permission.

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=16613, result=0, data=null} to activity {org.fdroid.fdroid/org.fdroid.fdroid.views.main.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference
	at android.app.ActivityThread.deliverResults(ActivityThread.java:4612)
	at android.app.ActivityThread.handleSendResult(ActivityThread.java:4654)
	at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loop(Looper.java:214)
	at android.app.ActivityThread.main(ActivityThread.java:7073)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference
	at org.fdroid.fdroid.nearby.TreeUriScannerIntentService.onActivityResult(TreeUriScannerIntentService.java:99)
	at org.fdroid.fdroid.views.main.MainActivity.onActivityResult(MainActivity.java:270)
	at android.app.Activity.dispatchActivityResult(Activity.java:7759)
	at android.app.ActivityThread.deliverResults(ActivityThread.java:4605)
	... 11 more
java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference
	at org.fdroid.fdroid.nearby.TreeUriScannerIntentService.onActivityResult(TreeUriScannerIntentService.java:99)
	at org.fdroid.fdroid.views.main.MainActivity.onActivityResult(MainActivity.java:270)
	at android.app.Activity.dispatchActivityResult(Activity.java:7759)
	at android.app.ActivityThread.deliverResults(ActivityThread.java:4605)
	at android.app.ActivityThread.handleSendResult(ActivityThread.java:4654)
	at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loop(Looper.java:214)
	at android.app.ActivityThread.main(ActivityThread.java:7073)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
2019-10-14 15:19:15 +02:00
Hans-Christoph Steiner
df818b0aed
fix crash in SwapView on android < 21
In order to support Android < 21, this calls `super` rather than `this`.
RelativeLayout}'s methods just use a 0 for the fourth argument, just like
this used to.
2019-10-14 15:19:13 +02:00
Hans-Christoph Steiner
f5a5805610
stop crash if hotspot returns null WifiConfiguration
java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.net.wifi.WifiConfiguration.SSID' on a null object reference
	at org.fdroid.fdroid.nearby.StartSwapView.uiUpdateWifiNetwork(StartSwapView.java:226)
	at org.fdroid.fdroid.nearby.StartSwapView.uiInitWifi(StartSwapView.java:211)
	at org.fdroid.fdroid.nearby.StartSwapView.onFinishInflate(StartSwapView.java:111)
	at android.view.LayoutInflater.rInflate(LayoutInflater.java:876)
	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
	at org.fdroid.fdroid.nearby.SwapWorkflowActivity.inflateSwapView(SwapWorkflowActivity.java:488)
	at org.fdroid.fdroid.nearby.SwapWorkflowActivity.showIntro(SwapWorkflowActivity.java:541)
	at org.fdroid.fdroid.nearby.SwapWorkflowActivity.showRelevantView(SwapWorkflowActivity.java:468)
	at org.fdroid.fdroid.nearby.SwapWorkflowActivity.access$100(SwapWorkflowActivity.java:86)
	at org.fdroid.fdroid.nearby.SwapWorkflowActivity$1.onServiceConnected(SwapWorkflowActivity.java:135)
	at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1652)
	at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1681)
	at android.os.Handler.handleCallback(Handler.java:790)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:164)
	at android.app.ActivityThread.main(ActivityThread.java:6494)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
2019-10-14 15:19:11 +02:00
Hans-Christoph Steiner
d233b03029
WifiStateChangeService: handle BSSID when WifiConfiguration is null
fixes:

java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.net.wifi.WifiConfiguration.BSSID' on a null object reference
 at org.fdroid.fdroid.nearby.WifiStateChangeService.setSsid(WifiStateChangeService.java:265)
 at org.fdroid.fdroid.nearby.WifiStateChangeService.access$100(WifiStateChangeService.java:59)
 at org.fdroid.fdroid.nearby.WifiStateChangeService$WifiInfoThread.run(WifiStateChangeService.java:174)
2019-10-14 15:19:09 +02:00
Hans-Christoph Steiner
915aeb6c54 Merge branch 'backup' into 'master'
Explicitly define backup rules

Closes #1700

See merge request fdroid/fdroidclient!843
2019-10-14 13:05:27 +00:00
Chirayu Desai
e9c26d0e60 Explicitly define backup rules
* So that we don't go over the backup limit (25MB) by including
  APKs and the local swap repo in the backup
2019-09-03 01:12:03 +05:30
Hans-Christoph Steiner
ce37822bb7
add donation links to GitHub FUNDING.yml
https://github.blog/2019-05-23-announcing-github-sponsors-a-new-way-to-contribute-to-open-source/

fdroiddata!5041
fdroidserver!668
2019-08-29 09:31:29 +02:00
Hans-Christoph Steiner
9fe882294d
version code 1007050 2019-07-06 00:12:33 +02:00
Hans-Christoph Steiner
e7b8eee0b6
update CHANGELOG 2019-07-06 00:12:31 +02:00
Hans-Christoph Steiner
1e29c281c6
catch random NullPointerExceptions related to WifiApControl
java.lang.NullPointerException: Attempt to read from field 'boolean android.net.wifi.WifiConfiguration.hiddenSSID' on a null object reference
at org.fdroid.fdroid.nearby.WifiStateChangeService.setSsid(WifiStateChangeService.java:252)
at org.fdroid.fdroid.nearby.WifiStateChangeService.access$100(WifiStateChangeService.java:59)
at org.fdroid.fdroid.nearby.WifiStateChangeService$WifiInfoThread.run(WifiStateChangeService.java:174)


java.lang.NullPointerException: null receiver
	at java.lang.reflect.Method.invoke(Native Method)
	at cc.mvdan.accesspoint.WifiApControl.invokeQuietly(WifiApControl.java:178)
	at cc.mvdan.accesspoint.WifiApControl.isWifiApEnabled(WifiApControl.java:189)
	at cc.mvdan.accesspoint.WifiApControl.isEnabled(WifiApControl.java:198)
	at org.fdroid.fdroid.nearby.WifiStateChangeService.setSsid(WifiStateChangeService.java:249)
	at org.fdroid.fdroid.nearby.WifiStateChangeService.access$100(WifiStateChangeService.java:59)
	at org.fdroid.fdroid.nearby.WifiStateChangeService$WifiInfoThread.run(WifiStateChangeService.java:133)

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.app.AppOpsManager.checkOpNoThrow(int, int, java.lang.String)' on a null object reference
 at android.provider.Settings.isCallingPackageAllowedToPerformAppOpsProtectedOperation(Settings.java:13730)
 at android.provider.Settings.isCallingPackageAllowedToWriteSettings(Settings.java:13634)
 at android.provider.Settings$System.canWrite(Settings.java:4793)
 at cc.mvdan.accesspoint.WifiApControl.getInstance(WifiApControl.java:122)
 at org.fdroid.fdroid.nearby.WifiStateChangeService.setSsid(WifiStateChangeService.java:240)
 at org.fdroid.fdroid.nearby.WifiStateChangeService.access$100(WifiStateChangeService.java:59)
 at org.fdroid.fdroid.nearby.WifiStateChangeService$WifiInfoThread.run(WifiStateChangeService.java:133)
2019-07-06 00:12:30 +02:00
Hans-Christoph Steiner
bfcc5c974e
fix crash in Panic Settings
This got missed in ef90fd2dfdb0b07aca21f4be34e2c418f092bf06
fdroid/fdroidclient!829

for f in `find app/src/ -type f -name \*.xml|xargs grep --no-filename -F '<org.fdroid.fdroid' | awk '{ print $1}' |sort -u`; do test -e app/src/*/java/`echo $f | sed -e 's,<,,' -e 's,\.,/,g'`.java || echo FAIL $f; done
2019-07-06 00:12:28 +02:00
Hans-Christoph Steiner
18d6110a31 Merge branch 'weblate' into 'master'
Weblate

See merge request fdroid/fdroidclient!833
2019-07-05 22:11:59 +00:00
Hans-Christoph Steiner
ebd63bad5e
./tools/remove-unused-and-blank-translations.py 2019-07-05 23:14:31 +02:00
Hans-Christoph Steiner
40f157a817 remove unneeded Android XML string quoting 2019-07-05 23:12:13 +02:00
Hosted Weblate
3848ec28c1 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (24 of 24 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/
2019-07-05 23:10:49 +02:00
Hosted Weblate
aed8748600 Translated using Weblate: Tibetan (bo) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 4.8% (1 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/bo/
2019-07-05 23:10:43 +02:00
Hosted Weblate
89c2409841 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Romanian (ro) by Licaon Kter <licaon.kter@protonmail.com>

Currently translated at 4.0% (1 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ro/
2019-07-05 23:10:28 +02:00
Hosted Weblate
2e45e7326b Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 92.0% (23 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
2019-07-05 23:10:18 +02:00
Hosted Weblate
7ca55dd04d Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Arabic (ar) by Omar Aglan <omar.aglan91@yahoo.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/

Translated using Weblate: Arabic (ar) by Omar Aglan <omar.aglan91@yahoo.com>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/

Translated using Weblate: Arabic (ar) by ButterflyOfFire <ButterflyOfFire@protonmail.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Arabic (ar) by ButterflyOfFire <ButterflyOfFire@protonmail.com>

Currently translated at 18.2% (4 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ar/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Arabic (ar) by Omar Aglan <omar.aglan91@yahoo.com>

Currently translated at 99.8% (428 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ar/

Translated using Weblate: Arabic (ar) by Rex_sa <asd1234567890m@gmail.com>

Currently translated at 19.0% (4 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ar/
2019-07-05 23:09:33 +02:00
Hosted Weblate
cee8711797 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Russian (ru) by Denis <alladinnn7@gmail.com>

Currently translated at 92.0% (23 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/

Translated using Weblate: Russian (ru) by Denis <alladinnn7@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 87.5% (21 of 24 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/

Translated using Weblate: Russian (ru) by Andrey <andrey@mailbox.org>

Currently translated at 96.2% (431 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/

Translated using Weblate: Russian (ru) by Anton Bershanskiy <anton.bersh@yandex.ua>

Currently translated at 95.5% (21 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/

Translated using Weblate: Russian (ru) by Anton Bershanskiy <anton.bersh@yandex.ua>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ru/

Translated using Weblate: Russian (ru) by tolstoevsky <tolstoevsky@riseup.net>

Currently translated at 95.2% (20 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/

Translated using Weblate: Russian (ru) by Luba <gapalm@yandex.ru>

Currently translated at 85.7% (18 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/

Translated using Weblate: Russian (ru) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 81.0% (17 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ru/
2019-07-05 23:09:14 +02:00
Hosted Weblate
b0212d3182 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (24 of 24 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
2019-07-05 23:09:05 +02:00
Hosted Weblate
9e500ef30b Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Ukrainian (uk) by AB <ao7nro+6ltrjuwxelfo4@sharklasers.com>

Currently translated at 77.3% (17 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/uk/
2019-07-05 23:09:00 +02:00
Hosted Weblate
2072cebfca Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>
Currently translated at 95.8% (23 of 24 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/
2019-07-05 23:08:55 +02:00
Hosted Weblate
636b0886d8 Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rafael Fontenelle <rafaelff@gnome.org>
Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 100.0% (24 of 24 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Lunovox Heavenfinder <lunovox@disroot.org>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Jackson S de Jesus <jackson@bsd.com.br>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Lunovox Heavenfinder <lunovox@disroot.org>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 95.5% (21 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/
2019-07-05 23:08:45 +02:00
Hosted Weblate
5566f4d8fa Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 68.0% (17 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nb_NO/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 68.0% (17 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nb_NO/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 99.3% (446 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 99.8% (447 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/

Translated using Weblate: Norwegian Bokmål (nb) by Syver Stensholt <sssandum@gmail.com>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/

Translated using Weblate: Norwegian Bokmål (nb) by Syver Stensholt <sssandum@gmail.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 98.8% (426 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 81.8% (18 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nb_NO/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 98.8% (424 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/nb_NO/

Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 81.0% (17 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nb_NO/
2019-07-05 23:08:42 +02:00
Hosted Weblate
8822962f85 Translated using Weblate: Japanese (ja) by naofum <naofum@gmail.com>
Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Japanese (ja) by naofum <naofum@gmail.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/

Translated using Weblate: Japanese (ja) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 4.8% (1 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ja/
2019-07-05 23:08:21 +02:00
Hosted Weblate
4e2a22247a Translated using Weblate: Chinese (Traditional) (zh-rTW) by Jeff Huang <s8321414@gmail.com>
Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hant/

Translated using Weblate: Chinese (Traditional) (zh-rTW) by Jeff Huang <s8321414@gmail.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hant/

Translated using Weblate: Chinese (Traditional) (zh-TW) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 9.5% (2 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hant/
2019-07-05 23:08:17 +02:00
Hosted Weblate
084e41c60f Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Chinese (Simplified) (zh-rCN) by HagbGreen(郭俊余) <hagb_green@qq.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Chinese (Simplified) (zh-rCN) by kak mi <wavelake@outlook.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/

Translated using Weblate: Chinese (Simplified) (zh-rCN) by kak mi <wavelake@outlook.com>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Chinese (Simplified) (zh-CN) by gledos <cngledos@gmail.com>

Currently translated at 22.7% (5 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Chinese (Simplified) (zh-rCN) by kak mi <wavelake@outlook.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Chinese (Simplified) (zh-CN) by Noke <lei@seenke.com>

Currently translated at 19.0% (4 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/

Translated using Weblate: Chinese (Simplified) (zh-rCN) by kak mi <wavelake@outlook.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/

Translated using Weblate: Chinese (Simplified) (zh-CN) by Allan Nordhøy <epost@anotheragency.no>

Currently translated at 4.8% (1 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/zh_Hans/
2019-07-05 23:07:46 +02:00
Hosted Weblate
e913fc2bd1 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
2019-07-05 23:07:24 +02:00
Hosted Weblate
d8be3ab597 Translated using Weblate: Turkish (tr) by Haydar ŞAHİN <haydarsahin34@gmail.com>
Currently translated at 68.0% (17 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

Translated using Weblate: Turkish (tr) by Haydar ŞAHİN <haydarsahin34@gmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Turkish (tr) by mahmut özcan <mahmutozcan65@yahoo.com>

Currently translated at 60.0% (15 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Turkish (tr) by Cenk YILDIZLI <cenk.yildizli@hacettepe.edu.tr>

Currently translated at 56.0% (14 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

Translated using Weblate: Turkish (tr) by Cenk YILDIZLI <cenk.yildizli@hacettepe.edu.tr>

Currently translated at 99.6% (447 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/

Translated using Weblate: Turkish (tr) by mahmut özcan <mahmutozcan65@yahoo.com>

Currently translated at 99.6% (447 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Turkish (tr) by Ali Demirtas <alidemirtas94@gmail.com>

Currently translated at 54.5% (12 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/
2019-07-05 23:06:58 +02:00
Hosted Weblate
d3b216e036 Translated using Weblate: Catalan (ca) by Agusti Grau <agusti@lacalafa.cat>
Currently translated at 13.6% (3 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/ca/
2019-07-05 23:06:49 +02:00
Hosted Weblate
c4afbdb563 Translated using Weblate: Bengali (bn) by Dark Horse <darkhorse19972@gmail.com>
Currently translated at 9.1% (2 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/bn/
2019-07-05 23:06:40 +02:00
Hosted Weblate
fe3cc58da9 Translated using Weblate: Greek (el) by THANOS SIOURDAKIS <siourdakisthanos@gmail.com>
Currently translated at 97.3% (437 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Greek (el) by THANOS SIOURDAKIS <siourdakisthanos@gmail.com>

Currently translated at 97.1% (436 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/

Translated using Weblate: Greek (el) by THANOS SIOURDAKIS <siourdakisthanos@gmail.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/

Translated using Weblate: Greek (el) by THANOS SIOURDAKIS <siourdakisthanos@gmail.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/el/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Greek (el) by THANOS SIOURDAKIS <siourdakisthanos@gmail.com>

Currently translated at 9.1% (2 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/el/
2019-07-05 23:06:35 +02:00
Hosted Weblate
01061e0dc1 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Italian (it) by aleb2000 <aleb2000@hotmail.com>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Italian (it) by Full Name <uselessmail2@tutanota.com>

Currently translated at 98.7% (443 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/

Translated using Weblate: Italian (it) by aleb2000 <aleb2000@hotmail.com>

Currently translated at 54.5% (12 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/

Translated using Weblate: Italian (it) by aleb2000 <aleb2000@hotmail.com>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>

Currently translated at 28.6% (6 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/

Translated using Weblate: Italian (it) by Marco Ieni <marcoieni94@gmail.com>

Currently translated at 9.5% (2 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/it/

Translated using Weblate: Italian (it) by random r <epsilin@yopmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/it/
2019-07-05 23:06:13 +02:00
Hosted Weblate
752dce0938 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (449 of 449 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/
2019-07-05 23:03:41 +02:00
Hosted Weblate
5d078d0fb6 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-07-05 23:03:41 +02:00
Hosted Weblate
380b366d33 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (25 of 25 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
2019-07-05 23:03:41 +02:00
Hans-Christoph Steiner
d45d187628 Merge branch 'patch-1' into 'master'
Remove Unused Import

See merge request fdroid/fdroidclient!831
2019-07-05 20:31:12 +00:00
PatOnTheBack
fe92b4afc6 Remove Unused Import 2019-07-05 20:31:12 +00:00
Hans-Christoph Steiner
ad9074232d Merge branch 'patch-2' into 'master'
Remove Unused `import re`

See merge request fdroid/fdroidclient!832
2019-07-05 20:30:46 +00:00
PatOnTheBack
2c882741e7 Remove Unused import re 2019-07-05 20:30:46 +00:00
Hans-Christoph Steiner
ec35f0c998
fix lint: "internett" is usually capitalized as "Internett" [Typos] 2019-06-18 23:39:44 +02:00
Hans-Christoph Steiner
47f8e0bc89
version code 1007002 2019-06-18 23:29:09 +02:00
Hans-Christoph Steiner
63a67698ac update CHANGELOG 2019-06-18 23:29:06 +02:00
Hans-Christoph Steiner
44ae615b29
remove unneeded Android string quoting 2019-06-18 23:28:57 +02:00
Hosted Weblate
14739c301f Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>
Currently translated at 100.0% (24 of 24 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (448 of 448 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 86.4% (19 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 77.3% (17 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 50.0% (11 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/

Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>

Currently translated at 42.9% (9 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pl/
2019-06-18 23:17:59 +02:00
Hosted Weblate
2e5beb2f96 Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-06-18 23:17:59 +02:00
Hosted Weblate
05a225b432 Translated using Weblate: German (de) by ssantos <ssantos@web.de>
Currently translated at 100.0% (24 of 24 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
2019-06-18 23:17:59 +02:00
Hans-Christoph Steiner
4260539374 Merge branch 'usb-otg-support' into 'master'
USB OTG support

See merge request fdroid/fdroidclient!830
2019-06-18 20:42:12 +00:00
Hans-Christoph Steiner
6c9afd823e speed up repo searchs by using "depth last"
Recursively search for index-v1.jar starting from the given directory,
looking at files first before recursing into directories.  This is
"depth last" since the index file is much more likely to be shallow
than deep, and there can be a lot of files to search through starting
at 4 or more levels deep, like the fdroid icons dirs and the per-app
"external storage" dirs.
2019-06-18 15:55:19 +02:00
Hans-Christoph Steiner
ca5996c5b3 detect when USB OTG device is plugged in and show Nearby tab 2019-06-17 18:37:26 +02:00
Hans-Christoph Steiner
23b296a012 add Intent Extra to force Nearby tab to show, like the other tabs have 2019-06-17 18:37:00 +02:00
Hans-Christoph Steiner
525f99b056 implement mirror/repos on USB OTG via Storage Access Framework
* https://developer.android.com/training/articles/scoped-directory-access

One potential future direction, if this proves too limiting:
https://github.com/magnusja/libaums
2019-06-17 18:36:58 +02:00
Hans-Christoph Steiner
1ce70d3703 remove mistaken Service entry from full AndroidManifest.xml
LocalHTTPDManager is not a Service subclass.

79e7e78e7f69fc7dbe47684ee102c930e2c3a13f
2019-06-17 16:59:42 +02:00
Hans-Christoph Steiner
474073b48c Merge branch 'great-package-reorg' into 'master'
move classes into packages for "nearby" and "panic"

See merge request fdroid/fdroidclient!829
2019-06-17 11:59:22 +00:00
Hans-Christoph Steiner
02669ea31f move WifiStateChangeReceiver into ".nearby" package 2019-06-17 11:28:52 +02:00
Hans-Christoph Steiner
842db03d8a fold ".views.hiding" into ".panic", it is only use there 2019-06-17 11:28:52 +02:00
Hans-Christoph Steiner
ef90fd2dfd move ".views.panic" to ".panic", it has more than just Views 2019-06-17 11:28:52 +02:00
Hans-Christoph Steiner
69642d88f7 add placeholder SwapWorkflowActivity for basic flavor 2019-06-17 11:28:52 +02:00
Hans-Christoph Steiner
32aad6b562 move ".net.bluetooth" into ".nearby" package 2019-06-17 11:18:07 +02:00
Hans-Christoph Steiner
15d349f863 move LocalHTTPD and WifiStateChangeService into ".nearby" package 2019-06-17 11:18:07 +02:00
Hans-Christoph Steiner
43c7574228 fold ".views.swap" package into ".nearby" class 2019-06-17 10:50:56 +02:00
Hans-Christoph Steiner
790b5ab27d rename 'localrepo' package to 'nearby' to cover the whole thing 2019-06-17 10:50:56 +02:00
Hans-Christoph Steiner
1e00910a42
remove bizarre mistaken app name 2019-06-17 09:09:56 +02:00
Hans-Christoph Steiner
dc80851536
fix broken string format in translation 2019-06-14 22:27:21 +02:00
Hans-Christoph Steiner
ac286dac56
remove unneeded android string quoting 2019-06-14 22:13:19 +02:00
Hosted Weblate
165457d27e Update translation files
Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/
2019-06-14 22:11:19 +02:00
Hans-Christoph Steiner
14033a7975 version code 1007001 2019-06-14 22:07:50 +02:00
Hans-Christoph Steiner
45eab6598e
add ChangeLog entries 2019-06-14 22:00:11 +02:00
Hans-Christoph Steiner
9bc78ed297 Merge branch 'nearby-swap-with-hotspot' into 'master'
nearby swap with hotspot

See merge request fdroid/fdroidclient!828
2019-06-14 19:54:36 +00:00
Hans-Christoph Steiner
df3a09dd2b ensure SwapService is running first, after Location perm prompt 2019-06-14 11:25:41 +02:00
Hans-Christoph Steiner
ec6f9cef2b allow SwapService to start SwapWorkflowActivity on Android < 7.0
https://stackoverflow.com/a/50833599
2019-06-13 21:17:31 +02:00
Hans-Christoph Steiner
254bd6a4db allow hotspots to work for swapping, even if they don't have internet
It is possible to enable the Hotspot AP on a device, and disable mobile
data.  This setup will work fine for swapping, but the detection logic for
whether there is metered internet was blocking it.  So this adds a new
state to represent and handle this condition.
2019-06-13 21:17:31 +02:00
Hans-Christoph Steiner
679820c0b2 get the SSID info when hotspot is active 2019-06-13 21:17:31 +02:00
Hans-Christoph Steiner
9db9f32bf1 show hotspot-specific status messages when hotspot is active 2019-06-13 21:17:31 +02:00
Hans-Christoph Steiner
b11ac7a64a set min width of Wi-Fi SSID field to keep it easily clickable 2019-06-13 21:17:31 +02:00
Hans-Christoph Steiner
abd61208d4 remember Hotspot state when using swap, restore on return 2019-06-13 21:17:31 +02:00
Hans-Christoph Steiner
ca81518f74 Merge branch 'panic-app-wipe' into 'master'
panic app and repo wipe

See merge request fdroid/fdroidclient!827
2019-06-13 10:37:37 +00:00
Hans-Christoph Steiner
d406a5d66c code formatting to please checkstyle 2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
bac0ae8f25 show all installed apps as possibilities for panic uninstall
F-Droid should be able to uninstall any app, in theory, not just the apps
that are listed in the index.

This lays some groundwork for moving swap's SelectAppsView to the standard
AppList elements used everywhere else.  It also does a little bit towards
getting rid of InstalledApp in favor of just reusing App.
2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
89140d5334 InstalledAppProvider: use Android sematics for query methods
Throughout Android, a null projection means return the full record.  This
is well documented.

Also, null sortOrder means use default sort order.
2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
4c352aeadc color destructive panic prefs with red background 2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
3b53af0657 panic: add destructive option to reset repos to defaults 2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
72f5398b79 panic: uninstall apps based destructive panic trigger
This will uninstall the list of apps that the user has setup in the Panic
Settings if Privileged Extension is installed.  This also requires that the
user set up a trusted connection between a panic trigger app (e.g. Ripple)
and F-Droid.
2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
d762e187dc update to PanicKit v1.0 2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
515b5b08f0 set up Panic preference to choose apps to uninstall on trigger 2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
3812331166 stop crashing if the suggested version ends up being bogus
It is possible for repo operators to specify a bad CurrentVersionCode for
an app that is also in another repo, and cause confusion in the suggested
version calculation.  Or if one repo's index is very out of date.  This
adds a fallback for these cases, so at least it'll stop the crash and
attempt the user's requested install.
2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
b400df3ac3 remove unused 'projection' argument from ApkProvider.findApkFromAnyRepo()
One small victory in the ever lasting battle against creeping complexity!
2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
301c2fff2d remove redundant preference constants 2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
7ca4ee6539 rename InstalledAppProvider method after what it returns: last update 2019-06-12 14:48:50 +02:00
Hans-Christoph Steiner
736341b34e Merge branch 'proxy-on-app-start' into 'master'
Proxy on app start

See merge request fdroid/fdroidclient!815
2019-06-12 12:47:03 +00:00
Hans-Christoph Steiner
fd625ca8d4
gitlab-ci: android-Q is now officially android-29 2019-06-12 14:24:26 +02:00
Michael Pöhn
5dd866d39e fix checkstyle 2019-06-12 12:04:15 +02:00
Michael Pöhn
067d39f72d preferences fragment: setup use tor preferences changed only once 2019-06-11 16:23:22 +02:00
Michael Pöhn
88f3a68f83 deduplicate error prone proxy settings code 2019-06-11 16:23:22 +02:00
Michael Pöhn
292950898e replace prone useTor preference mirror value from FDroidApp with direct preference calls 2019-06-11 16:23:22 +02:00
Hans-Christoph Steiner
1f565d7638 Merge branch 'typo-fixes' into 'master'
Fix Typos

See merge request fdroid/fdroidclient!826
2019-06-11 12:11:03 +00:00
Yoginth
0851fea8eb
Fix Typos 2019-06-05 03:52:40 +00:00
Hans-Christoph Steiner
3ea365a1f5 update changelog 2019-05-24 15:47:48 +02:00
Hans-Christoph Steiner
6d3a7d4537 move all QR Code related classes to .qr package 2019-05-24 15:47:48 +02:00
Hans-Christoph Steiner
23fc17ba5f purge confusing, unused duplicate string/icon assignment in bottom nav
fdroid/fdroidclient#1785
2019-05-24 15:47:48 +02:00
Hans-Christoph Steiner
c652718a4a fix lint: Repeated word "do" in message: possible typo [Typos] 2019-05-24 15:47:48 +02:00
Hans-Christoph Steiner
1b670df1fd
./tools/remove-unused-and-blank-translations.py 2019-05-24 15:38:36 +02:00
Hosted Weblate
36f29bc6a8 Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>
Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: Portuguese (pt) by ssantos <ssantos@web.de>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/

Translated using Weblate: Portuguese (pt) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/

Translated using Weblate: Portuguese (pt) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/

Translated using Weblate: Portuguese (pt) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt/

Translated using Weblate: Portuguese (pt) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt/

Added translation using Weblate: Portuguese (pt) by Rui Mendes <xz9@protonmail.com>
2019-05-24 15:36:13 +02:00
Hosted Weblate
2289a07483 Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>
Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/is/

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/
2019-05-24 15:36:13 +02:00
Hosted Weblate
4258315286 Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 100.0% (431 of 431 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/he/

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/
2019-05-24 15:36:13 +02:00
Hosted Weblate
c2070fb76f Translated using Weblate: German (de) by Hans-Christoph Steiner <hans@guardianproject.info>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by ssantos <ssantos@web.de>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/

Translated using Weblate: German (de) by ssantos <ssantos@web.de>

Currently translated at 100.0% (22 of 22 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/

Translated using Weblate: German (de) by CurlingTongs <o11577482@nwytg.net>

Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by Sören Strecke <soeren.strecke@live.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by ssantos <ssantos@web.de>

Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/
2019-05-24 15:36:13 +02:00
Hans-Christoph Steiner
f69b38aad5 Merge branch 'major-swap-overhaul' into 'master'
major swap overhaul

See merge request fdroid/fdroidclient!825
2019-05-24 13:34:51 +00:00
Hans-Christoph Steiner
14e006b924 mark two flaky swap test classes to omit them from gitlab-ci runs
They work fine on my machine, but fail often/always on gitlab-ci
2019-05-24 15:01:33 +02:00
Hans-Christoph Steiner
7acc0cd4c3 make LocalHTTPDTest resilient to LocalHTTPDManagerTest's detritus
LocalHTTPDManagerTest seems to leave port 8888 running sometimes, causing
all of LocalHTTPDTest tests to fail.
2019-05-24 13:36:47 +02:00
Hans-Christoph Steiner
051d58acaf start LocalRepoService once SelectApps is shown to speed up connecting 2019-05-24 13:36:47 +02:00
Hans-Christoph Steiner
6e8c4eb1bf store the current Bluetooth name and restore it when swap is done
fdroid/fdroidclient#1669
2019-05-24 13:36:47 +02:00
Hans-Christoph Steiner
7f35420e37 purge last RxAndroid code, replace with good ol' Intents
Rx needs to be used as the basis of the whole system, it doesn't make sense
to just have one small part handled by Rx.

RxJava is still used in InstallAppProviderService, so that would have to be
tackled separately.
2019-05-24 13:36:47 +02:00
Hans-Christoph Steiner
18a7690758 track all successful peers, and remove all unsuccessful peers
Since it is possible to connect to a peer via NFC, "Swap back", QR Code,
etc. once a peer is successfully used, it can show up in the StartSwapView
list of peers.
2019-05-24 13:35:56 +02:00
Hans-Christoph Steiner
0727787713 make BonjourPeer and WifiPeer equals if they point to the same device 2019-05-24 13:35:56 +02:00
Hans-Christoph Steiner
74c3c24f0a reset idle timer each time a new swap screen is loaded
This means that as long as the user is using swap, it'll stay running.
2019-05-24 13:35:56 +02:00
Hans-Christoph Steiner
e02bc4134a fix display of swap cancel button and installing progress
closes #1612
2019-05-24 13:35:56 +02:00
Hans-Christoph Steiner
fea778793c replace BluetoothSwap with BluetoothManager, using HandlerThread
This is the last of the SwapType stuff!

fdroid/fdroidclient#1723
fdroid/fdroidclient#1669
2019-05-24 13:35:56 +02:00
Hans-Christoph Steiner
ddbe93aeb4 SwapWorkflowActivity: save BluetoothAdapter instance for reuse 2019-05-24 13:35:56 +02:00
Hans-Christoph Steiner
da66949b9e turn LocalRepoService Intents into status Intents like other Services 2019-05-24 13:35:56 +02:00
Hans-Christoph Steiner
effcf4bfa9 purge WifiSwap class in favor of Intents and Services 2019-05-24 13:35:56 +02:00
Hans-Christoph Steiner
46472ba7a4 create BonjourManager to manage jmdns in HandlerThread, with tests 2019-05-24 13:35:55 +02:00
Hans-Christoph Steiner
79e7e78e7f create testable LocalHTTPDManager for controlling the webserver
The RxJava tricks were a nightmare...
2019-05-24 10:02:22 +02:00
Hans-Christoph Steiner
5b610798c2 more reliably set WiFi SSID in nearby/swap interfaces
Often times, the WiFi is properly setup, the IP address is showing, but the
SSID is showing as "No network yet".
2019-05-24 10:02:22 +02:00
Hans-Christoph Steiner
11e0c1926c move swap repo polling to SwapService
SwapService is the long lived background service, and it was already doing
the core work anyway.
2019-05-24 10:02:22 +02:00
Hans-Christoph Steiner
6c1375bf3a quick hack to show "Installing..." when swap install process runs 2019-05-24 10:02:22 +02:00
Hans-Christoph Steiner
e7979fca48 name all SwapService getters properly: getSwapService()
This also switches to always using getActivity().getSwapService() to make
it easily traceable where that is happening.  It shouldn't be happening in
SwapViews...
2019-05-24 10:02:22 +02:00
Hans-Christoph Steiner
e98393f092 use launchMode="singleTask", there can be only one SwapWorkflowActivity!
* https://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent)
* https://developer.android.com/guide/topics/manifest/activity-element#lmode
* https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en
2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
289976667d fix NullPointerException in BonjourPeer and BluetoothPeer
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6128)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
    at org.fdroid.fdroid.localrepo.peers.BonjourPeer.equals(BonjourPeer.java:34)
    at java.util.HashMap.put(HashMap.java:427)
    at java.util.HashSet.add(HashSet.java:217)
    at rx.internal.operators.OperatorDistinct$1.onNext(OperatorDistinct.java:62)
    at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:202)
    at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:162)
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
779a0122fd fix ConcurrentModificationException crash in LocalRepoService
https://stackoverflow.com/a/602660

java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:851)
    at java.util.HashMap$ValueIterator.next(HashMap.java:879)
    at org.fdroid.fdroid.localrepo.LocalRepoManager.copyIconsToRepo(LocalRepoManager.java:296)
    at org.fdroid.fdroid.localrepo.LocalRepoService$1.run(LocalRepoService.java:131)
2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
910f5da81a create download and install receivers per-app, not globally
Each individual app needs its own receivers for these things, just like in
AppListActivity and InstallManagerService.
2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
d91fbe7b0e rework swap startup putting SwapService first
SwapService is the thing that needs to be always running, and the last
thing killed.  So it should start first, and stop last.  So now, the user
clicking the button starts SwapService, which starts SwapWorkflowActivity.
This also eliminatings the "Loading" screen in favor of just showing the
StartSwapView with various inline progress indicators.
2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
035a89e5f6 move all current View tracking to SwapWorkflowActivity
This information is only ever used in SwapWorkflowActivity and nowhere else
so if it needs to be stored, it could be stored via saveInstanceState().
2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
39f23f6876 add required length limits to swap strings for the translators 2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
9dc9a23a41 fix all RtL lint errors in swap layouts 2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
89f5127f6d turn inline Install button into Cancel button during download 2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
bc14e62e46 receive Downloader error messages in swap 2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
f0158063fb show full error messages from UpdateService
The "cause" is the Exception that was caught and embedded into the
UpdateException, so it has more info on what happened.
2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
ad3fd26756 immediately regenerate swap repo when user changes app selections
Instead of waiting for the user to make all the app selections, then click
next, this constantly regenerates the swap repo on each click of the app
list.  This means that the swap repo is more likely to be immediately ready
when the user clicks next.
2019-05-24 10:00:08 +02:00
Hans-Christoph Steiner
b5d94b7476 convert swap error "back" button to "Try again"
The Android back button provides a working back function, and the Swap
"close" button on the upper left already provides a reset function. So this
turns the "back" button to be a "try again" button which re-runs the
connection process.
2019-05-24 10:00:07 +02:00
Hans-Christoph Steiner
5851ea73e0 move ConnectingView to pure XML view, and remove Receiver superclass
The Receiver superclass is not reusing difficult code, but it is hiding the
simple list of UI configuration that it does.

This also eliminates the "error" TextView and just reuses the existing
TextView for error messages.
2019-05-24 10:00:07 +02:00
Hans-Christoph Steiner
5ddc287ab3 move NfcView to pure XML view 2019-05-24 10:00:07 +02:00
Hans-Christoph Steiner
a9aafa080d move JoinWifiView to pure XML view 2019-05-24 10:00:07 +02:00
Hans-Christoph Steiner
1e1ea03bc3 move ConfirmReceiveView to pure XML SwapView with logic in Presenter 2019-05-24 10:00:07 +02:00
Hans-Christoph Steiner
d5f2e26ea7 use one method everywhere for the "swap back" requests 2019-05-24 10:00:07 +02:00
Hans-Christoph Steiner
014fb0b99d move WifiQrView and SendFDroidView to pure XML views
This puts the logic in the "Presenter": SwapWorkflowActivity
2019-05-24 10:00:07 +02:00
Hans-Christoph Steiner
69ce8dbe8c move all WiFi/QR logic to Presenter (SwapWorkflowActivity) 2019-05-24 10:00:07 +02:00
Hans-Christoph Steiner
ea3b47f705 purge CacheSwapAppsService in favor of InstalledAppProvider
The most expensive part of this whole process is calculating the hash of the
whole APK.  InstalledAppProvider already caches that, and the rest is OK to
query.  If any particular part of the query is expensive, it could also be
moved to InstalledAppProviderService.
2019-05-24 10:00:07 +02:00
Hans-Christoph Steiner
85410504da LocalRepoService for setting up the local swap repo
This moves all logic for setting up the local fdroid repo to its own
IntentService.  That makes it much easier to interact with since things can
just use the static helper method to request it to update, and it'll do the
right thing.
2019-05-24 10:00:01 +02:00
Hans-Christoph Steiner
9fc1ecd5a4
doh! only change translations in Weblate, or suffer merge conflicts! 2019-05-21 14:50:47 +02:00
Hans-Christoph Steiner
866a7276a4 Merge branch 'bugfixes' into 'master'
a few bug fixes

Closes #1737, #1782, and #1769

See merge request fdroid/fdroidclient!824
2019-05-20 13:38:28 +00:00
Hans-Christoph Steiner
c5a6445239 fix bottom bar loading the wrong "Updates" string
closes #1785
2019-05-20 14:14:29 +02:00
Hans-Christoph Steiner
1cc14b3499 show progress spinner on Updates Tab if index is being updated
The "Congrats, your apps are up to date" message isn't quite right in this
context.

closes #1769
2019-05-20 14:14:29 +02:00
Hans-Christoph Steiner
dffc8e5925 make sure ImageLoader is inited before trying to use it
closes #1782
2019-05-20 14:14:29 +02:00
Hans-Christoph Steiner
86908ceeaa the calculated ETag should be compared to the stored ETag
Thanks to @amiraliakbari for tracking this down!

closes fdroid/fdroidclient#1737
2019-05-20 14:14:29 +02:00
Hans-Christoph Steiner
8d60f40e98 Merge branch 'snackbars' into 'master'
Show snackbars with undo buttons. Fix #1756.

Closes #1756

See merge request fdroid/fdroidclient!823
2019-05-20 12:09:30 +00:00
Hans-Christoph Steiner
200548d6ba Merge branch 'move-swap-views-towards-mvc' into 'master'
Move swap views towards MVC

See merge request fdroid/fdroidclient!822
2019-05-14 11:56:01 +00:00
Hocuri
dbfe267540
Show snackbars with undo buttons. 2019-05-13 17:55:09 +02:00
Hans-Christoph Steiner
291e4c4c3c change 'fragment' name to avoid confusion, Swap doesn't use Fragments 2019-05-13 15:01:37 +02:00
Hans-Christoph Steiner
9d6c95d51d move menu handling to SwapView and SwapWorkflowActivity
The menus originate in the Activity, so avoid pushing it to the Views.
2019-05-13 15:01:37 +02:00
Hans-Christoph Steiner
fe59522666 SwapView base class so all swap views can just be XML
Almost all of the nearby/swap view classes could be condensed into a single
base class that is instantiated in the view XML.  This is the first step
towards making that happen.

It also lays the groundwork where "steps" are all SwapViews.  The
original concept of "steps" put all steps together, whether
F-Droid could control them or not.  For example, the Views were
mixed with the system Bluetooth prompts.  This is the first step
towards converting the steps to always be SwapViews, which are
always under control of this app.

When coming back to a SwapView/step, it does not seem feasible to handle
automatically restarting things like permissions and Bluetooth prompts. If
there is a way, it should be possible to first load the proper SwapView
instance, then trigger the system prompt.  The makes the SwapView a pure
View, without any Controller in it.
2019-05-13 15:01:32 +02:00
Hans-Christoph Steiner
6a8f5fb4a7 rename SwapAppsView things to "Swap Success" 2019-05-13 14:55:13 +02:00
Hans-Christoph Steiner
568abe9f3b rename swap_blank to swap_start_swap to match View name 2019-05-13 14:55:13 +02:00
Hans-Christoph Steiner
68cc241bc0 rename ConfirmReceive to ConfirmReceiveView to match standard 2019-05-13 14:55:13 +02:00
Hans-Christoph Steiner
9aa73b95e4 rename SwapConnecting to ConnectingView to match standard 2019-05-13 14:55:13 +02:00
Hans-Christoph Steiner
40c52821fa standardized code format for all swap layout XML 2019-05-13 14:55:13 +02:00
Hans-Christoph Steiner
a8fc3d2b2c gitlab-ci: output versions for base 'tools' and 'emulator' packages 2019-05-13 14:13:27 +02:00
Hans-Christoph Steiner
fac36457ea Merge branch 'bug-fixes-1.7' into 'master'
Bug fixes 1.7

Closes #1678 and #1757

See merge request fdroid/fdroidclient!820
2019-05-10 18:56:47 +00:00
Hans-Christoph Steiner
826d70f2c9 script to automatically cherry-pick complete translations from Weblate
This creates a branch 'merge_weblate' and cherry picks commits from Weblate
that contain 100% complete translations.
2019-05-10 16:30:26 +02:00
Hans-Christoph Steiner
1d359f82ce actually use index added/lastUpdated dates in UTC
The date/time written to index.xml and index-v1.json should always be in
UTC format.  These formats are often in the form of just a date, e.g.
2019-04-28.  Those are then converted to UNIX seconds, which includes the
time.  In the date only case, the time is assumed to be 00:00, which will
be different per time zone.

index-v1.json is better since it mostly uses Java-style UNIX time in millis
but the dates/times are parsed then stored in the local database in the old
format yyyy-MM-dd_HH:mm:ss which will result in different UNIX times when
the device is in different time zones.

fdroid/fdroidclient#1757
2019-05-10 16:30:23 +02:00
Hans-Christoph Steiner
c0c5721f6a Normalize Repo.lastUpdated values to contain the date and time
This also converts old Repo.lastUpdated values rather than just failing.
index.xml handling used to store the Repo "Last Updated" date used to store
the value as just an ISO date (2019-04-29), then the time was added.  So if
date/time parsing fails, this falls back to trying to parse just the date.
null is returned when parsing fails, and the Latest Tab shows nothing if
the Last Updated is null.

Some related tests were also tweaked.

Hopefully:
closes fdroid/fdroidclient#1757
2019-05-10 14:13:23 +02:00
Hans-Christoph Steiner
d62c0cf723 AppDetails: use inline OnClickListeners in Android style
no need to declare variables that are used in one place.  Also, reordered
related lines a bit for clarity.
2019-05-10 14:13:23 +02:00
Hans-Christoph Steiner
a71489a102 set max width on places where the translations get too long
closes #1678
2019-05-10 14:13:23 +02:00
ioTY
67af661640 Check whether fdroidPrivileged enabled 2019-05-10 14:13:23 +02:00
Hans-Christoph Steiner
af1040443e ignore Errors and Exceptions in background services
Throwable includes Errors and Exceptions.  Fixes stacktraces like these:

java.lang.RuntimeException: An error occurred while executing doInBackground()
	at android.os.AsyncTask$3.done(AsyncTask.java:325)
	at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
	at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
	at java.util.concurrent.FutureTask.run(FutureTask.java:242)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
	at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.NoSuchMethodError: No virtual method toPath()Ljava/nio/file/Path; in class Ljava/io/File; or its super classes (declaration of 'java.io.File' appears in /system/framework/core-oj.jar)
	at org.apache.commons.io.FileUtils.isSymlink(FileUtils.java:3107)
	at org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.java:1616)
	at org.fdroid.fdroid.DeleteCacheService.onHandleWork(DeleteCacheService.java:32)
	at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:391)
	at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:382)
	at android.os.AsyncTask$2.call(AsyncTask.java:305)
	at java.util.concurrent.FutureTask.run(FutureTask.java:237)
	... 3 more
java.lang.NoSuchMethodError: No virtual method toPath()Ljava/nio/file/Path; in class Ljava/io/File; or its super classes (declaration of 'java.io.File' appears in /system/framework/core-oj.jar)
	at org.apache.commons.io.FileUtils.isSymlink(FileUtils.java:3107)
	at org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.java:1616)
	at org.fdroid.fdroid.DeleteCacheService.onHandleWork(DeleteCacheService.java:32)
	at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:391)
	at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:382)
	at android.os.AsyncTask$2.call(AsyncTask.java:305)
	at java.util.concurrent.FutureTask.run(FutureTask.java:237)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
	at java.lang.Thread.run(Thread.java:761)
2019-05-10 14:13:23 +02:00
Hans-Christoph Steiner
5cce64e153
version code 1007000 2019-05-10 14:13:15 +02:00
Hans-Christoph Steiner
738a4be9fd
update ChangeLog 2019-05-10 14:13:07 +02:00
Hans-Christoph Steiner
5a3e9f2f58 Merge branch 'master' into 'master'
IndexV1Updater: Closing JarFile on end of use. Closes issue #1382.

Closes #1382

See merge request fdroid/fdroidclient!819
2019-05-10 10:34:16 +00:00
AmirAli Akbari
f76f9357d7 IndexV1Updater: Closing JarFile on end of use. Closes issue #1382. 2019-05-10 10:34:16 +00:00
Hans-Christoph Steiner
0d9a203447
Revert "gitlab-ci: job must be called 'pages' to deploy to GitLab Pages"
This reverts commit c5daf1981a7f00de16e19120ac42575c0e4bc424.

Turns I was confused here.  Yes, the job has to be called "pages" if the
job is deploying to GitLab Pages.  But in the case of `fdroid nightly`, the
thing that is deploying to GitLab Pages is the .gitlab-ci.yml that is in
the *-nightly repo, which is auto-generated by `fdroid nightly`.

fdroid/fdroidserver#649
2019-04-26 10:46:39 +02:00
Hans-Christoph Steiner
080f93eb9c Merge branch 'fix-emulator-tests' into 'master'
Fix emulator tests

See merge request fdroid/fdroidclient!816
2019-04-25 22:57:08 +00:00
Hans-Christoph Steiner
306786c9e5 gitlab-ci: run tests three times before marking whole job as failed
There are soo many of these:

org.fdroid.fdroid.net.HttpDownloaderTest > downloadThenCancel[avd27(AVD) - 8.1.0] FAILED
Test failed to run to completion. Reason: 'Instrumentation run failed due to 'Process crashed.''. Check device logcat for details
2019-04-26 00:00:47 +02:00
Hans-Christoph Steiner
ad093d49e6 add weblate config file for wlc CLI tool 2019-04-25 21:19:09 +02:00
Hans-Christoph Steiner
b1fd5395b6 gitlab-ci: download proven emulator version
based on https://aur.archlinux.org/android-emulator.git
2019-04-25 21:19:09 +02:00
Hans-Christoph Steiner
951375f526 gitlab-ci: ensure standard RAM sizes if it needs to be downscaled
gitlab.com says they always use 4GB instances now anyways.
2019-04-23 17:57:23 +02:00
Hans-Christoph Steiner
b8dba454e3 gitlab-ci: only run Espresso tests on emulators newer than 25 2019-04-23 16:34:57 +02:00
Hans-Christoph Steiner
854941363d Merge branch 'test-nightly-fix' into 'master'
fix nightly

See merge request fdroid/fdroidclient!814
2019-04-18 16:54:04 +00:00
Hans-Christoph Steiner
003c448bba gitlab-ci: only set ramsize if host has <4GB RAM 2019-04-17 19:40:31 +02:00
Hans-Christoph Steiner
dbe65f0365 gitlab-ci: fix emulator install for android-Q 2019-04-17 19:28:31 +02:00
Hans-Christoph Steiner
c5daf1981a gitlab-ci: job must be called 'pages' to deploy to GitLab Pages
https://docs.gitlab.com/ee/user/project/pages/getting_started_part_four.html#job

fdroid/fdroidserver#649
2019-04-17 15:51:21 +02:00
Hans-Christoph Steiner
d7453d878d fix lint: Repeated word "do" in message: possible typo 2019-04-17 15:51:21 +02:00
Hans-Christoph Steiner
3915abccc0 version code 1006050 2019-04-10 00:59:51 +02:00
Hans-Christoph Steiner
8be69b7fc4 update changelogs 2019-04-10 00:59:12 +02:00
Rafael Fontenelle
28b5744fe9 Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rafael Fontenelle <rafaelff@gnome.org>
Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (20 of 20 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (428 of 428 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (428 of 428 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-rBR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 100.0% (428 of 428 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_BR/

Translated using Weblate: Portuguese (Brazil) (pt-BR) by Rafael Fontenelle <rafaelff@gnome.org>

Currently translated at 100.0% (20 of 20 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_BR/
2019-04-10 00:58:54 +02:00
Hosted Weblate
4073c26132 Translated using Weblate: Norwegian Bokmål (nb) by Allan Nordhøy <epost@anotheragency.no>
Currently translated at 66.7% (14 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/nb_NO/
2019-04-10 00:57:49 +02:00
Hosted Weblate
95787b637e Translated using Weblate: Chinese (Traditional) (zh-rTW) by Jeff Huang <s8321414@gmail.com>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hant/
2019-04-10 00:41:42 +02:00
Hosted Weblate
fe7d836f28 Translated using Weblate: French (fr) by Arnaud Jacquemin <arnaud.jacquemin+weblate@free.fr>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fr/
2019-04-10 00:40:54 +02:00
Hosted Weblate
5c64e722b8 Translated using Weblate: Galician (gl) by Iván Seoane <ivanrsm1997@gmail.com>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/gl/

Translated using Weblate: Galician (gl) by Iván Seoane <ivanrsm1997@gmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/gl/

Translated using Weblate: Galician (gl) by Iván Seoane <ivanrsm1997@gmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/gl/
2019-04-10 00:40:54 +02:00
Hosted Weblate
aa1ea98244 Translated using Weblate: Sardinian (sc) by Ajeje Brazorf <lmelonimamo@yahoo.it>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sc/
2019-04-10 00:40:54 +02:00
Hosted Weblate
2147f952cd Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>
Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eu/

Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eu/

Update translation files:  ()

Updated by "Squash Git commits" hook in Weblate.

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/
2019-04-10 00:40:54 +02:00
Hosted Weblate
a4c19b3dc8 Translated using Weblate: Catalan (ca) by Adrià García-Alzórriz <adria@fsfe.org>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ca/
2019-04-10 00:40:54 +02:00
Hosted Weblate
2903a0f059 Translated using Weblate: Turkish (tr) by Kemal Oktay Aktoğan <oktay454@disroot.org>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/tr/
2019-04-10 00:40:54 +02:00
Hosted Weblate
bf4ead6470 Translated using Weblate: German (de) by ssantos <ssantos@web.de>
Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/de/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by CurlingTongs <o11577482@nwytg.net>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by CurlingTongs <o11577482@nwytg.net>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by ssantos <ssantos@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/

Translated using Weblate: German (de) by C. Rüdinger <Mail-an-CR@web.de>

Currently translated at 100.0% (428 of 428 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/de/
2019-04-10 00:40:54 +02:00
Hosted Weblate
0f2fbc9ed1 Translated using Weblate: Japanese (ja) by naofum <naofum@gmail.com>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ja/
2019-04-10 00:40:54 +02:00
___
a1e1417e42 Translated using Weblate: Ukrainian (uk) by ___ <o.kravtsov@ukr.net>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/uk/
2019-04-10 00:40:54 +02:00
Hosted Weblate
f9998e15ea Translated using Weblate: Polish (pl) by WaldiS <admin@sto.ugu.pl>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pl/
2019-04-10 00:40:54 +02:00
Hosted Weblate
b89967d566 Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>
Currently translated at 76.2% (16 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/he/

Translated using Weblate: Hebrew (he) by Yaron Shahrabani <sh.yaron@gmail.com>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/he/
2019-04-10 00:40:54 +02:00
Hosted Weblate
bc50ffa2cc Translated using Weblate: Belarusian (be) by Zmicer Turok <zmicerturok@gmail.com>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/be/
2019-04-10 00:40:54 +02:00
Hosted Weblate
dac403731c Translated using Weblate: Chinese (Simplified) (zh-rCN) by kak mi <wavelake@outlook.com>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/zh_Hans/
2019-04-10 00:40:54 +02:00
Hosted Weblate
d2c5dc76de Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>
Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/is/

Translated using Weblate: Icelandic (is) by Sveinn í Felli <sv1@fellsnet.is>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/is/
2019-04-10 00:40:54 +02:00
Hosted Weblate
52a1719fa9 Translated using Weblate: Portuguese (Portugal) (pt-PT) by Rui Mendes <xz9@protonmail.com>
Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by ssantos <ssantos@web.de>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (20 of 20 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Sérgio Marques <smarquespt@gmail.com>

Currently translated at 100.0% (428 of 428 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Sérgio Marques <smarquespt@gmail.com>

Currently translated at 100.0% (428 of 428 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (428 of 428 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-rPT) by Rui Mendes <xz9@protonmail.com>

Currently translated at 100.0% (428 of 428 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/pt_PT/

Translated using Weblate: Portuguese (Portugal) (pt-PT) by Rui Mendes <xz9@protonmail.com>

Currently translated at 10.0% (2 of 20 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/pt_PT/
2019-04-10 00:40:54 +02:00
Hosted Weblate
04335a9c20 Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>
Currently translated at 100.0% (21 of 21 strings)

Translation: F-Droid/F-Droid metadata
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/eo/

Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/eo/
2019-04-10 00:40:54 +02:00
Hosted Weblate
5a41ca85d9 Translated using Weblate: Finnish (fi) by Arttu Ylhävuori <arjymoi@hotmail.com>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/fi/
2019-04-10 00:40:54 +02:00
Hosted Weblate
cb1627d666 Translated using Weblate: Swedish (sv) by Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/sv/
2019-04-10 00:35:49 +02:00
Hosted Weblate
c4906e0002 Translated using Weblate: Romanian (ro) by Licaon Kter <licaon.kter@protonmail.com>
Currently translated at 100.0% (429 of 429 strings)

Translation: F-Droid/F-Droid
Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid/ro/
2019-04-10 00:35:29 +02:00
Hans-Christoph Steiner
307abc5706 Merge branch 'finalize-1.6' into 'master'
Finalize 1.6

Closes #1556

See merge request fdroid/fdroidclient!813
2019-04-09 22:16:00 +00:00
Hans-Christoph Steiner
623e27931a Merge branch 'swipe-refresh' into 'master'
Color swipe to refresh indicator

See merge request fdroid/fdroidclient!804
2019-04-09 21:26:32 +00:00
mueller-ma
1c881baa9c Color swipe to refresh indicator 2019-04-09 21:26:32 +00:00
Hans-Christoph Steiner
4f771c4add gitlab-ci: update emulator in Q job to version that works with Q 2019-04-09 23:17:21 +02:00
Hans-Christoph Steiner
d2fea72ed9 always update itself last
When auto-updates are enabled, the app should update itself last, to ensure
that all of the other apps are completely updated before this app is killed
as part of the update process.

closes #1556
2019-04-09 23:17:21 +02:00
Hans-Christoph Steiner
272a0e3f27 fix crash when there is no cache when DeleteCacheService runs
java.lang.NoSuchMethodError: No virtual method toPath()Ljava/nio/file/Path; in class Ljava/io/File; or its super classes (declaration of 'java.io.File' appears in /system/framework/core-oj.jar)
at org.apache.commons.io.FileUtils.isSymlink(FileUtils.java:3107)
at org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.java:1616)
at org.fdroid.fdroid.DeleteCacheService.onHandleWork(DeleteCacheService.java:30)
at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:391)
at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:382)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
2019-04-09 14:39:45 +02:00
Hans-Christoph Steiner
593ce5284c fix insane NPE
java.lang.NullPointerException: println needs a message
 at android.util.Log.println_native(Native Method)
 at android.util.Log.e(Log.java:232)
 at org.fdroid.fdroid.net.DownloaderService.handleIntent(DownloaderService.java:232)
 at org.fdroid.fdroid.net.DownloaderService.access$000(DownloaderService.java:88)
 at org.fdroid.fdroid.net.DownloaderService$ServiceHandler.handleMessage(DownloaderService.java:108)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:148)
 at android.os.HandlerThread.run(HandlerThread.java:61)
2019-04-09 14:39:45 +02:00
Hans-Christoph Steiner
66e909d606 standardize all Downloaders on 8k block sizes
This is needed since this affects the onProgress broadcasts, and sending
too many can peg the device's CPU.  1k was just too small.  ANd 8k works
fine for Bluetooth.

fdroid/fdroidclient#1590
2019-04-09 14:39:45 +02:00
Hans-Christoph Steiner
06b9abcee3 gitlab-ci: stick with built-in emulator on ARM
The newest emulator releases always segfault when booting the trusty ARM
android-22 image.
2019-04-09 14:39:45 +02:00
Hans-Christoph Steiner
9a8eb5d495 Merge branch 'improve-add-repo-from-clipboard' into 'master'
Improve adding repos from the clipboard

See merge request fdroid/fdroidclient!811
2019-03-29 09:14:44 +00:00
Jonas L
94e441cc9c Improve adding repos from the clipboard
In some cases (e.g. when using Firefox Klar) and copying the URL
(of a link), then only the uri is set and not the text. This
prevented (before this commit) the autofill of the
add package source dialog in such cases.
2019-03-29 09:14:43 +00:00
Hans-Christoph Steiner
ada263feca
gitlab-ci: allow all emulator jobs to fail, they are too flaky 2019-03-29 10:10:25 +01:00
Hans-Christoph Steiner
9ed4fe8c64 Merge branch 'suite-of-crash-fixes' into 'master'
Suite of crash fixes

See merge request fdroid/fdroidclient!810
2019-03-29 06:08:50 +00:00
Hans-Christoph Steiner
934eb06ff1 SwapAppsView: don't crash on update if app is null
java.lang.NullPointerException: Attempt to read from field 'java.lang.String org.fdroid.fdroid.data.App.packageName' on a null object reference
at org.fdroid.fdroid.views.swap.SwapAppsView$AppListAdapter$ViewHolder$2.onChange(SwapAppsView.java:294)
at android.database.ContentObserver.onChange(ContentObserver.java:130)
at android.database.ContentObserver.onChange(ContentObserver.java:145)
at android.database.ContentObserver$NotificationRunnable.run(ContentObserver.java:216)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5497)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
2019-03-29 00:11:16 +01:00
Hans-Christoph Steiner
81139c40fa trigger WifiStateChangeService after user accepts location perms
Normally, WifiStateChangeService finds the SSID when F-Droid starts. But if
the user hasn't granted location permissions yet, then WifiStateChangeService
won't have been able to read the SSID yet.
2019-03-29 00:11:16 +01:00
Hans-Christoph Steiner
43d3653753 create utility method for sending Toasts from Services 2019-03-29 00:11:16 +01:00
Hans-Christoph Steiner
0322e87d18 purge debug message that causes NullPointerException
java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File java.io.File.getCanonicalFile()' on a null object reference
at android.os.storage.StorageManager.getStorageVolume(StorageManager.java:844)
at android.os.storage.StorageManager.getStorageVolume(StorageManager.java:838)
at android.os.Environment.isExternalStorageRemovable(Environment.java:725)
at org.fdroid.fdroid.views.main.NearbyViewBinder.<init>(NearbyViewBinder.java:85)
at org.fdroid.fdroid.views.main.MainViewController.bindSwapView(MainViewController.java:64)
at org.fdroid.fdroid.views.main.MainViewAdapter.onCreateViewHolder(MainViewAdapter.java:94)
at org.fdroid.fdroid.views.main.MainViewAdapter.onCreateViewHolder(MainViewAdapter.java:47)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6685)
2019-03-29 00:11:16 +01:00
Hans-Christoph Steiner
d201851784 fix crash when ExternalStorage fails to find something
java.lang.IllegalArgumentException: Failed to find storage device at null
at android.os.Environment.isExternalStorageRemovable(Environment.java:859)
at org.fdroid.fdroid.views.main.NearbyViewBinder.<init>(NearbyViewBinder.java:85)
at org.fdroid.fdroid.views.main.MainViewController.bindSwapView(MainViewController.java:64)
at org.fdroid.fdroid.views.main.MainViewAdapter.onCreateViewHolder(MainViewAdapter.java:94)
at org.fdroid.fdroid.views.main.MainViewAdapter.onCreateViewHolder(MainViewAdapter.java:47)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6685)
2019-03-29 00:11:16 +01:00
Hans-Christoph Steiner
f21e4b5931 fix crashes when parsing bad dates
java.lang.ArrayIndexOutOfBoundsException: length=13; index=42
at sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate(BaseCalendar.java:454)
at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2340)
at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2740)
at java.util.Calendar.updateTime(Calendar.java:2589)
at java.util.Calendar.getTimeInMillis(Calendar.java:1101)
at java.util.Calendar.getTime(Calendar.java:1074)
at java.text.SimpleDateFormat.parseInternal(SimpleDateFormat.java:1518)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1413)
at java.text.DateFormat.parse(DateFormat.java:356)
at org.fdroid.fdroid.Utils.parseDateFormat(Utils.java:577)
at org.fdroid.fdroid.Utils.parseDate(Utils.java:592)
at org.fdroid.fdroid.data.Apk.<init>(Apk.java:178)


java.lang.NumberFormatException: Not a number:
at android.icu.math.BigDecimal.bad(BigDecimal.java:3349)
at android.icu.math.BigDecimal.<init>(BigDecimal.java:526)
at android.icu.math.BigDecimal.<init>(BigDecimal.java:910)
at android.icu.text.DigitList.getBigDecimalICU(DigitList.java:278)
at android.icu.text.DecimalFormat.parse(DecimalFormat.java:2058)
at android.icu.text.DecimalFormat.parse(DecimalFormat.java:1931)
at java.text.DecimalFormat.parse(DecimalFormat.java:804)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2353)
at java.text.SimpleDateFormat.parseInternal(SimpleDateFormat.java:1615)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1528)
at java.text.DateFormat.parse(DateFormat.java:360)
at org.fdroid.fdroid.Utils.parseDateFormat(Utils.java:577)
at org.fdroid.fdroid.Utils.parseDate(Utils.java:592)
at org.fdroid.fdroid.data.App.<init>(App.java:311)
at org.fdroid.fdroid.views.whatsnew.WhatsNewAdapter.onBindViewHolder(WhatsNewAdapter.java:95)
at org.fdroid.fdroid.views.whatsnew.WhatsNewAdapter.onBindViewHolder(WhatsNewAdapter.java:19)

java.lang.ArrayIndexOutOfBoundsException: length=13; index=36
at sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate(BaseCalendar.java:454)
at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2411)
at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2813)
at java.util.Calendar.updateTime(Calendar.java:3397)
at java.util.Calendar.getTimeInMillis(Calendar.java:1761)
at java.util.Calendar.getTime(Calendar.java:1734)
at java.text.SimpleDateFormat.parseInternal(SimpleDateFormat.java:1633)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1528)
at java.text.DateFormat.parse(DateFormat.java:360)
at org.fdroid.fdroid.Utils.parseDateFormat(Utils.java:577)
at org.fdroid.fdroid.Utils.parseDate(Utils.java:592)
at org.fdroid.fdroid.data.App.<init>(App.java:314)
at org.fdroid.fdroid.views.updates.UpdatesAdapter.onCanUpdateLoadFinished(UpdatesAdapter.java:241)
at org.fdroid.fdroid.views.updates.UpdatesAdapter.onLoadFinished(UpdatesAdapter.java:224)
at org.fdroid.fdroid.views.updates.UpdatesAdapter.onLoadFinished(UpdatesAdapter.java:67)
2019-03-29 00:11:16 +01:00
Hans-Christoph Steiner
56ddbf2056 fix crash on bad values in minSdkVersion
java.lang.NumberFormatException: For input string: "@2131034146"
at java.lang.Integer.parseInt(Integer.java:615)
at java.lang.Integer.parseInt(Integer.java:650)
at org.fdroid.fdroid.data.App.getMinTargetMaxSdkVersions(App.java:1092)
at org.fdroid.fdroid.data.App.initInstalledApk(App.java:769)
at org.fdroid.fdroid.data.App.getInstance(App.java:395)
at
org.fdroid.fdroid.localrepo.CacheSwapAppsService.onHandleIntent(CacheSwapAppsService.java:77)
at
android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:76)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:65)
2019-03-29 00:11:16 +01:00
Hans-Christoph Steiner
275a674d26 version code 1006002 2019-03-28 13:30:30 +01:00
Hans-Christoph Steiner
64ff1c472e
update CHANGELOG
[skip ci]
2019-03-28 12:36:29 +01:00
Hans-Christoph Steiner
727e9ed5dd Merge branch 'canonical-url-overhaul' into 'master'
Canonical URL overhaul

Closes #1742, #1736, and #1727

See merge request fdroid/fdroidclient!809
2019-03-28 11:32:46 +00:00
Hans-Christoph Steiner
c7c16131e9 fix OBB support for repositories
The repoId was hard-coded to 0.

fdroid/fdroidclient#1403
2019-03-28 11:41:10 +01:00
Hans-Christoph Steiner
5f14628524 DownloaderService: improve debug logs for Canonical vs Download URLs 2019-03-28 11:41:10 +01:00
Hans-Christoph Steiner
edb2b838eb DownloaderService: track active using the canonical URL
This was using the actual download URL, which might change, depending on
whether a mirror was used.

closes #1727
2019-03-28 11:41:10 +01:00
Hans-Christoph Steiner
0aab6bc422 standardize on EXTRA_CANONICAL_URL throughout the code base
There were a few different constants used, this unifies them all into one,
so that it is easy to track where it is used, and what it means.
2019-03-28 11:41:10 +01:00
Hans-Christoph Steiner
3378c0a333 rename Canonical vs. Download URL in InstallManagerService process
AppUpdateStatusManager and InstallManagerService should be using only the
Canonical URL of the package since that is the global unique ID.  The actual
URL used to download it needs to be isolated in DownloaderService, which can
entirely manage the mirror selection process.  This is just a bunch of
renaming to make this all clearer.
2019-03-28 11:41:10 +01:00
Hans-Christoph Steiner
3a5f96e0b3 DownloaderService: use canonical URL to fix progress updates
The download URL is not the unique ID, the canonical URL is.

closes #1736
2019-03-28 11:41:10 +01:00
Hans-Christoph Steiner
7f22c3c221 DownloaderService: convert String to Uri to avoid repeated parsing
This parses the String into a Uri once per Intent, rather than once per
broadcast.  The Uri instance is also nicer to work with, since it is the
native URL format for Intents.

It should make the progress updates a bit more efficient also.
fdroid/fdroidclient#1742
2019-03-28 11:41:10 +01:00
Hans-Christoph Steiner
288577407d move towards only using canonical URLs in InstallManagerService
Only DownloaderService really needs to know about the mirror tricks, the
rest of the process should only ever use the canonical URL to keep things
simple.
2019-03-28 11:41:10 +01:00
Hans-Christoph Steiner
04298f8886 DownloaderService: only broadcast progress when it actually changes
On a slow download, this could send like 100+ updates even though no more
data had been received.

closes #1742
2019-03-28 11:41:10 +01:00
Hans-Christoph Steiner
d794c5a77c purge urlString from ProgressListener, it is unused and confusing 2019-03-28 11:41:03 +01:00
Hans-Christoph Steiner
6b0a784a26 normalize canonical URL variable names 2019-03-26 21:46:38 +01:00
Hans-Christoph Steiner
e346d2351b rename AppUpdateStatus.getUniqueKey to getCanonicalUrl
This highlights the relationship between the various things that are using
the canonical URL as the unique ID.
2019-03-26 21:46:38 +01:00
Hans-Christoph Steiner
4ea775be00 remove wrong "ERROR" description from Downloader Intend Extras
Looks like a copy-paste bug in a160476a14c40412728f4974f53d1a18f7064346
2019-03-26 21:46:38 +01:00
Hans-Christoph Steiner
a0b318c383 rename Apk.getUrl() to getCanonicalUrl() to highlight it is also an ID
This method returns the URL that points to the canonical download
source for this package.  This is also used as the unique ID for
tracking downloading, progress, and notifications throughout the
whole install process.  It is guaranteed to uniquely represent
this file since it points to a file on the file system of the
canonical webserver.
2019-03-26 21:46:38 +01:00
Hans-Christoph Steiner
19a0428944 Merge branch 'download-updates-by-default' into 'master'
Download updates by default

See merge request fdroid/fdroidclient!806
2019-03-26 20:41:25 +00:00
Hans-Christoph Steiner
80bab5611b Merge branch 'no-featured-app' into 'master'
* no-featured-app:
  cleanup imports
  fix padding of top item in Latest Tab
  Remove feature graphic of first app from "Latest" view

See merge request fdroid/fdroidclient!807
2019-03-26 21:29:33 +01:00
Hans-Christoph Steiner
51431d59ee cleanup imports 2019-03-26 21:29:13 +01:00
Hans-Christoph Steiner
496a3a2938 fix padding of top item in Latest Tab 2019-03-26 21:28:20 +01:00
mueller-ma
59fe365ed6 Remove feature graphic of first app from "Latest" view
Closes #1748
2019-03-26 18:08:38 +01:00
Hans-Christoph Steiner
e3cfe3690d set "Automatically download updates" to default true
But keep "Automatically install updates" default false for devices with
Privileged Extension.
2019-03-26 16:19:07 +01:00
Hans-Christoph Steiner
99591c050c Merge branch 'latest-apps-criteria' into 'master'
Latest apps criteria

See merge request fdroid/fdroidclient!805
2019-03-26 15:17:09 +00:00
Hans-Christoph Steiner
90d4821e99 fix checkstyle LineLength 2019-03-22 22:16:08 +01:00
Hans-Christoph Steiner
4f1855c8a1 App Details: show the app's Translation links
fdroid/fdroidserver!450

icon is:
https://material.io/tools/icons/?search=trans&icon=translate&style=baseline
2019-03-22 22:16:08 +01:00
Hans-Christoph Steiner
3862f941e6 add new criteria for apps shown in Latest tab
This adds requirements before an app is shown on the Latest tab.  It must
have all of these:

* name
* summary
* description
* license
* What's New entry
* at least some text localized

And then it must have at least one of these:

* screenshots
* feature graphic
2019-03-22 22:16:08 +01:00
1627 changed files with 40206 additions and 17902 deletions

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
*.gpg binary

1
.gitignore vendored
View File

@ -16,7 +16,6 @@ build.xml
# Gradle files # Gradle files
.gradle/ .gradle/
build/ build/
gradle.properties
# Local configuration file (sdk path, etc) # Local configuration file (sdk path, etc)
local.properties local.properties

View File

@ -1,26 +1,36 @@
image: registry.gitlab.com/fdroid/ci-images-client:latest
cache:
paths:
- .gradle/wrapper
- .gradle/caches
stages: stages:
- test - test
- deploy - deploy
before_script: .base:
- export GRADLE_USER_HOME=$PWD/.gradle image: registry.gitlab.com/fdroid/ci-images-client:latest
- export ANDROID_COMPILE_SDK=`sed -n 's,.*compileSdkVersion\s*\([0-9][0-9]*\).*,\1,p' app/build.gradle` before_script:
- alias sdkmanager="sdkmanager --no_https" - export GRADLE_USER_HOME=$PWD/.gradle
- echo y | sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" > /dev/null - export ANDROID_COMPILE_SDK=`sed -n 's,.*compileSdkVersion\s*\([0-9][0-9]*\).*,\1,p' app/build.gradle`
- alias sdkmanager="sdkmanager --no_https"
- echo y | sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" > /dev/null
# limit RAM usage for all gradle runs
- export maxmem=$(expr $(sed -n 's,^MemAvailable:[^0-9]*\([0-9][0-9]*\)[^0-9]*$,\1,p' /proc/meminfo) / 1024 / 2 / 1024 \* 1024)
- printf "\norg.gradle.jvmargs=-Xmx${maxmem}m -XX:MaxPermSize=${maxmem}m\norg.gradle.daemon=false\norg.gradle.parallel=false\n" >> gradle.properties
after_script:
# this file changes every time but should not be cached
- rm -f $GRADLE_USER_HOME/caches/modules-2/modules-2.lock
- rm -fr $GRADLE_USER_HOME/caches/*/plugin-resolution/
cache:
paths:
- .gradle/wrapper
- .gradle/caches
.test-template: &test-template .test-template: &test-template
extends: .base
stage: test stage: test
artifacts: artifacts:
name: "${CI_PROJECT_PATH}_${CI_JOB_STAGE}_${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHA}" name: "${CI_PROJECT_PATH}_${CI_JOB_STAGE}_${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHA}"
paths: paths:
- kernel.log
- logcat.txt - logcat.txt
- app/core*
- app/*.log
- app/build/reports - app/build/reports
- app/build/outputs/*ml - app/build/outputs/*ml
- app/build/outputs/apk - app/build/outputs/apk
@ -35,29 +45,40 @@ test_lint_pmd_checkstyle:
<<: *test-template <<: *test-template
script: script:
- export EXITVALUE=0 - export EXITVALUE=0
- function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; }
- ./gradlew assemble - ./gradlew assemble
# always report on lint errors to the build log # always report on lint errors to the build log
- sed -i -e 's,textReport .*,textReport true,' app/build.gradle - sed -i -e 's,textReport .*,textReport true,' app/build.gradle
- ./gradlew testFullDebugUnitTest - ./gradlew testFullDebugUnitTest || set_error
- ./gradlew lint - ./gradlew lint || set_error
- ./gradlew pmd || export EXITVALUE=1 - ./gradlew pmd || set_error
- ./gradlew checkstyle || export EXITVALUE=1 - ./gradlew checkstyle || set_error
- ./tools/check-format-strings.py || export EXITVALUE=1 - ./tools/check-format-strings.py || set_error
- ./tools/check-fastlane-whitespace.py || export EXITVALUE=1 - ./tools/check-fastlane-whitespace.py || set_error
- ./tools/remove-unused-and-blank-translations.py || export EXITVALUE=1 - ./tools/remove-unused-and-blank-translations.py || set_error
- echo "These are unused or blank translations that should be removed:" - echo "These are unused or blank translations that should be removed:"
- git --no-pager diff --ignore-all-space --name-only --exit-code app/src/*/res/values*/strings.xml || export EXITVALUE=1 - git --no-pager diff --ignore-all-space --name-only --exit-code app/src/*/res/values*/strings.xml || set_error
- exit $EXITVALUE - exit $EXITVALUE
errorprone: errorprone:
extends: .base
stage: test stage: test
script: script:
- apt-get update
- apt-get install -t stretch-backports openjdk-11-jdk-headless
- update-java-alternatives --set java-1.11.0-openjdk-amd64
- export JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
- cat config/errorprone.gradle >> app/build.gradle - cat config/errorprone.gradle >> app/build.gradle
- ./gradlew assembleDebug - ./gradlew -Dorg.gradle.dependency.verification=lenient assembleDebug
# Run the tests in the emulator. Each step is broken out to run on
# its own since the CI runner can have limited RAM, and the emulator
# can take a while to start.
#
# once these prove stable, the task should be switched to # once these prove stable, the task should be switched to
# connectedCheck to test all the build flavors # connectedCheck to test all the build flavors
.connected-template: &connected-template .connected-template: &connected-template
extends: .base
script: script:
- ./gradlew assembleFullDebug - ./gradlew assembleFullDebug
- export AVD_SDK=`echo $CI_JOB_NAME | awk '{print $2}'` - export AVD_SDK=`echo $CI_JOB_NAME | awk '{print $2}'`
@ -65,39 +86,23 @@ errorprone:
- export AVD_ARCH=`echo $CI_JOB_NAME | awk '{print $4}'` - export AVD_ARCH=`echo $CI_JOB_NAME | awk '{print $4}'`
- export AVD_PACKAGE="system-images;android-${AVD_SDK};${AVD_TAG};${AVD_ARCH}" - export AVD_PACKAGE="system-images;android-${AVD_SDK};${AVD_TAG};${AVD_ARCH}"
- echo $AVD_PACKAGE - echo $AVD_PACKAGE
- emulator -accel-check || true
- alias sdkmanager - alias sdkmanager
- echo y | sdkmanager "emulator" "platforms;android-$AVD_SDK" > /dev/null
- if ! avdmanager list avd | grep "Name. avd$AVD_SDK$"; then
set -x;
rm -rf ~/.android/avd $ANDROID_HOME/system-images;
echo y | sdkmanager "$AVD_PACKAGE" > /dev/null;
echo no | avdmanager create avd --name avd$AVD_SDK --tag "$AVD_TAG" --package "$AVD_PACKAGE" --sdcard 64M --device "Nexus 5";
export RAMSIZE="$((`sed -n 's,^MemAvailable:[^0-9]*\([0-9][0-9]*\)[^0-9]*$,\1,p' /proc/meminfo` * 3 / 4 / 1024))";
sed -i '/^hw\.ramSize\s*=.*/d' ~/.android/avd/*.avd/config.ini;
echo "hw.ramSize=$RAMSIZE" >> ~/.android/avd/*.avd/config.ini;
avdmanager list avd;
set +x;
fi
- adb start-server
- ls -l ~/.android - ls -l ~/.android
- emulator -avd avd$AVD_SDK
-no-audio - adb start-server
-no-jni - start-emulator
-no-snapstorage
-no-window
-skip-adb-auth
-verbose
-wipe-data
&
- wait-for-emulator - wait-for-emulator
- adb devices - adb devices
- adb shell input keyevent 82 & - adb shell input keyevent 82 &
- test $AVD_SDK -ge 25 || export FLAG=-Pandroid.testInstrumentationRunnerArguments.notAnnotation=android.test.suitebuilder.annotation.LargeTest - ./gradlew installFullDebug
- ./gradlew connectedFullDebugAndroidTest $FLAG || (adb -e logcat -d > logcat.txt; exit 1) - adb shell am start -n org.fdroid.fdroid.debug/org.fdroid.fdroid.views.main.MainActivity
- if [ $AVD_SDK -lt 25 ] || ! emulator -accel-check; then
export FLAG=-Pandroid.testInstrumentationRunnerArguments.notAnnotation=androidx.test.filters.LargeTest;
fi
- ./gradlew connectedFullDebugAndroidTest $FLAG
connected 22 default armeabi-v7a: no-accel 22 default x86:
retry: 1
<<: *test-template <<: *test-template
<<: *connected-template <<: *connected-template
@ -105,35 +110,17 @@ connected 22 default armeabi-v7a:
tags: tags:
- fdroid - fdroid
- kvm - kvm
allow_failure: true
only: only:
- branches@eighthave/fdroidclient variables:
- $RUN_KVM_JOBS
<<: *test-template <<: *test-template
<<: *connected-template <<: *connected-template
connected 17 default x86: kvm 29 microg x86_64:
<<: *kvm-template <<: *kvm-template
connected 18 default x86:
<<: *kvm-template
connected 23 default x86:
<<: *kvm-template
connected 25 default x86:
<<: *kvm-template
connected 26 google_apis x86:
<<: *kvm-template
connected 27 google_apis_playstore x86:
<<: *kvm-template
connected 28 default x86_64:
<<: *kvm-template
deploy_nightly: deploy_nightly:
extends: .base
stage: deploy stage: deploy
only: only:
- master - master
@ -153,8 +140,3 @@ deploy_nightly:
# build the APKs! # build the APKs!
- ./gradlew assembleDebug - ./gradlew assembleDebug
- fdroid nightly -v - fdroid nightly -v
after_script:
# this file changes every time but should not be cached
- rm -f $GRADLE_USER_HOME/caches/modules-2/modules-2.lock
- rm -fr $GRADLE_USER_HOME/caches/*/plugin-resolution/

3
.weblate Normal file
View File

@ -0,0 +1,3 @@
[weblate]
url = https://hosted.weblate.org/api/
translation = f-droid/f-droid

View File

@ -1,3 +1,229 @@
### 1.13-alpha1 (2021-06-02)
* Stop repeated updates of Trichrome Library
* More changes to follow Material Design (@proletarius101)
* Improve OpenCollective badge (@ConnyDuck)
### 1.13-alpha0 (2021-04-22)
* Theme support tied to built-in Android themes (@proletarius101)
* New top banner notifications: "No Internet" and "No Data or WiFi enabled"
* Improved handling of USB-OTG and SD Card repos and mirrors
### 1.12.1 (2021-04-12)
* Fix trove4j verification error
### 1.12 (2021-04-06)
* Sync translations
### 1.12-alpha3 (2021-03-10)
* Opt-in F-Droid Metrics
### 1.12-alpha2 (2021-03-03)
* Overhaul clean up of cached files
* Support updating "shared library packages" like Trichrome (@uldiniad)
### 1.12-alpha1 (2021-02-25)
* Add extra sanitation to search terms to prevent vulnerabilities.
* Fix Nearby Swap's close button (@proletarius101)
* Bump to compileSdkVersion 29 to support Java8
* Set up WorkManager on demand to avoid slowing down starts
* Prefer system keys when APKs are signed by them (@glennmen)
### 1.12-alpha0 (2021-02-08)
* App description localization now fully respects lists of languages in Android
Language Settings
* Latest Tab lists results based on the Language Settings
* Latest Tab now shows results ordered newest first (@TheLastProject @IzzySoft)
* Theme support modernized and tied to the built-in Android themes (@proletarius101)
* Search results greatly improved (@Tvax @gcbrown76)
* Let Android efficiently schedule background cache cleanup operations (@Isira-Seneviratne)
* Overhaul repo URL parsing for reliable repo adding (@projectgus)
### 1.11 (2020-12-29)
* Improved linkifying of URLs in app descriptions
* Improved handling of SDCards and USG-OTG in Nearby
* Modernized code and switched PNGs to vectors (thanks @isira-seneviratne!)
* Recognize longer repo URLs to support GitCDN/RawGit/etc mirrors
### 1.10 (2020-10-20)
* Improved language selection with multiple locales
(thanks @spacecowboy and @bubu!)
### 1.10-alpha1 (2020-09-29)
* use notification channels for fine-grained control (@Isira-Seneviratne)
### 1.10-alpha0 (2020-07-20)
* Latest Tab will show better results on non-English devices
* updates to core libraries (Jackson, androidx, gradle, etc)
* use Gradle's new dependency verification
* polish whitelabeling support
### 1.9 (2020-06-25)
* Removed "Android App Link" support since it cannot work with
F-Droid, and it was triggering DNS leaks.
* Archive Repos are now lower priority than the Repo (higher on the
Manage Repos screen), fixing issues where it looked for icons,
screenshots and other information in the Archive rather than the
Repo itself.
* Fixed hopefully all occurrences where F-Droid client couldn't show an icon.
The remaining cases of missing icons are now caused either by
icons not included in upstream repo or by temporary network failures.
(After updating this requires one additional repo update to take effect.)
* Fixed a problem where repository updates would never trigger
when either "Over Data" or "Over Wifi" were disabled.
* Support OpenCollective donation option and highlight
free software donation platforms
* Fix for when the app update button wasn't showing up or working
in some cases (thanks @di72nn)
* Stop cropping feature header image (thanks @ByteHamster!)
* Make navigation bar match dark mode (thanks @MatthieuB!)
* Cleaned out obsolete code (thanks @Isira-Seneviratne!)
### 1.8-alpha2 (2020-02-04)
* stop showing Unknown Sources with Privileged Extension on Android 10 #1833
* add standard ripple effect to links on app details activity
* fix displaying default icon for apps without icons
### 1.8-alpha1 (2020-01-10)
* handle Android 10 permission config to stop Unknown Sources prompts
* keyboard opens when search is cleared
* translation sync with Android strings
* force common repo domains to HTTPS (GitLab, GitHub, Amazon)
### 1.8-alpha0 (2019-11-20)
* fix seekbar preference on recent Android versions (thanks @dkanada)
* handle API 29 split-permissions: fine location now implies coarse location
* define backup rules to avoid saving the swap repo
### 1.7.1 (2019-07-31)
* fix crashes from ACRA report emails
### 1.7 (2019-07-06)
* fix crash in Panic Settings
* catch random crashes related to WifiApControl
### 1.7-alpha2 (2019-06-18)
* USB OTG flash drives can be used as nearby repos and mirrors
### 1.7-alpha1 (2019-06-14)
* overhauled nearby swap using the device's hotspot AP
* add new panic responses: app uninstalls and reset repos to default
* fix proxy support on first start
### 1.7-alpha0 (2019-05-20)
* major refactor of "Nearby" UI code, to prepare for rewriting guts
* show "undo" after swiping away items from the Updates tab (thanks @Hocuri!)
* fix ETag handling when connecting to nginx mirrors #1737
* fix issues with "Latest" display caused by mishandling time zones #1757
* ignore all unimportant crashes in background services
* do not use Privileged Extension if it was disabled in Settings
### 1.6.2 (2019-05-20)
* fixed issue where cached indexes were wrongly redownloaded (#1737),
thanks to @amiraliakbari for tracking it down!
* fixed wrong string for the translated title of the Updates Tab (#1785)
* fixed crashes on very low memory when starting
### 1.6.1 (2019-05-10)
* Updated translations
* fixed button size issues #1678
* stopped random background crashes
### 1.6 (2019-04-10)
* update F-Droid after all other updates (#1556)
* Improve adding repos from the clipboard (e.g. Firefox Klar)
* swap usability improvements
* many crash fixes in swap and background services
### 1.6-alpha2 (2019-03-28)
* Latest Tab now highlights apps that provide descriptions,
translations, screenshots
* Auto-download from mirrors, to speed up downloads and reduce load on
f-droid.org
* More efficient download caching (per-repo; across different
webservers #1708)
* Fix problems canceling downloads (#1727, #1736, #1742)
* Fix downloading OBB files from repos (#1403)
### 1.6-alpha1 (2019-02-20) ### 1.6-alpha1 (2019-02-20)
* add switches in RepoDetails to disable any or all mirrors (#1696) * add switches in RepoDetails to disable any or all mirrors (#1696)

View File

@ -26,14 +26,16 @@ track of modifications and fuzzy translations. Applying translations manually
skips all of the fixes and checks, and overrides the fuzzy state of strings. skips all of the fixes and checks, and overrides the fuzzy state of strings.
Note that you cannot change the English strings on Weblate. If you have any Note that you cannot change the English strings on Weblate. If you have any
suggestions on how to improve them, open a merge request like you would if you suggestions on how to improve them, open an issue or merge request like you
were making code changes. This way the changes can be reviewed before the would if you were making code changes. This way the changes can be reviewed
source strings on Weblate are changed. before the source strings on Weblate are changed.
## Code Style ## Code Style
We follow the [Android Java style](https://source.android.com/source/code-style.html). We follow the default Android Studio code formatter (e.g. `Ctrl-Alt-L`). This
Some key points: should be more or less the same as [Android Java
style](https://source.android.com/source/code-style.html). Some key points:
* Four space indentation * Four space indentation
* UTF-8 source files * UTF-8 source files
@ -45,76 +47,35 @@ Some key points:
* Braces are always used after if, for and while * Braces are always used after if, for and while
The current code base doesn't follow it entirely, but new code should follow The current code base doesn't follow it entirely, but new code should follow
it. We enforce some of these, but not all, via checkstyle. it. We enforce some of these, but not all, via `./gradlew checkstyle`.
## Debugging
To get all the logcat messages by F-Droid, you can run:
adb logcat | grep `adb shell ps | grep org.fdroid.fdroid | cut -c10-15`
## Building tips
* Use gradle with `--daemon` if you are going to build F-Droid multiple times.
* If you get a message like `Could not find com.android.support:support-...`,
make sure that you have the latest Android support maven repository.
* When building as part of AOSP with `Android.mk`, make sure you have a
recent version of Gradle installed as `gradlew` will not be used.
## Running the test suite ## Running the test suite
Before pushing commits to a merge request, make sure this passes:
./gradlew checkstyle pmd lint
In order to run the F-Droid test suite, you will need to have either a real device In order to run the F-Droid test suite, you will need to have either a real device
connected via `adb`, or an emulator running. Then, execute the following from the connected via `adb`, or an emulator running. Then, execute the following from the
command line: command line:
./gradlew check ./gradlew check
Note that the CI already runs the tests on an emulator, so you don't Many important tests require a device or emulator, but do not work in GitLab CI.
necessarily have to do this yourself if you open a merge request as the tests That mean they need to be run locally, and that is usually easiest in Android
will get run. Studio rather than the command line.
### Running tests in Android Studio For a quick way to run a specific JUnit/Robolectric test:
Later versions of Android Studio require tests to be run with a "Working directory" ./gradlew testFullDebugUnitTest --tests *LocaleSelectionTest*
of `$MODULE_DIR$`.
[To make this the default behaviour](https://code.google.com/p/android/issues/detail?id=158015#c11),
close any projects to get the Welcome dialog. Then choose _Configure > Project Defaults >
Run Configurations > Defaults > Android JUnit_, and change "Working directory"
to `$MODULE_DIR$`. If you already have a project setup in Android Studio, you
may also need to change the default in _Run > Edit Configurations... > Defaults >
Android JUnit_.
## Versioning For a quick way to run a specific emulator test:
Each stable version follows the `X.Y` pattern. Hotfix releases - i.e. when a ./gradlew connectedFullDebugAndroidTest \
stable has an important bug that needs immediate fixing - will follow the -Pandroid.testInstrumentationRunnerArguments.class=org.fdroid.fdroid.MainActivityExpressoTest
`X.Y.Z` pattern.
Before each stable release, a number of alpha releases will be released. They
will follow the pattern `X.Y-alphaN`, where `N` is the current alpha number.
These will usually include changes and new features that have not been tested
enough for a stable release, so use at your own risk. Testers and reporters
are very welcome.
The version codes use a number of digits per each of these keys: `XXXYYYZNN`. ## Making releases
So for example, 1.3.1 would be `1003150` and 0.95-alpha13 would be `95013`
(leading zeros are omitted).
Note that we use a trailing `50` for actual stable releases, so alphas are See https://gitlab.com/fdroid/wiki/-/wikis/Internal/Release-Process#fdroidclient
limited to `-alpha49`.
This is an example of a release process for **0.95**:
* We are currently at stable **0.94**
* **0.95-alpha1** is released
* **0.95-alpha2** is released
* **0.95-alpha3** is released
* `stable-v0.95` is branched and frozen
* **0.95** is released
* A bug is reported on the stable release and fixed
* **0.95.1** is released with only that fix
As soon as a stable is tagged, master will move on to `-alpha0` on the next
version. This is a temporary measure - until `-alpha1` is released - so that
moving from stable to master doesn't require a downgrade. `-alpha0` versions
will not be tagged nor released.

11
FUNDING.yml Normal file
View File

@ -0,0 +1,11 @@
---
liberapay: F-Droid-Data
open_collective: F-Droid
github:
- f-droid
- eighthave
custom:
- https://f-droid.org/donate/
- https://www.hellotux.com/f-droid
- https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=E2FCXCT6837GL
- https://blockchain.info/address/15u8aAPK4jJ5N8wpWJ5gutAyyeHtKX5i18

View File

@ -1,6 +1,6 @@
# F-Droid Client # F-Droid Client
[![build status](https://gitlab.com/fdroid/fdroidclient/badges/master/build.svg)](https://gitlab.com/fdroid/fdroidclient/builds) [![build status](https://gitlab.com/fdroid/fdroidclient/badges/master/pipeline.svg)](https://gitlab.com/fdroid/fdroidclient/-/jobs)
[![Translation status](https://hosted.weblate.org/widgets/f-droid/-/svg-badge.svg)](https://hosted.weblate.org/engage/f-droid/) [![Translation status](https://hosted.weblate.org/widgets/f-droid/-/svg-badge.svg)](https://hosted.weblate.org/engage/f-droid/)
Client for [F-Droid](https://f-droid.org), the Free Software repository system Client for [F-Droid](https://f-droid.org), the Free Software repository system

View File

@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
apply plugin: 'checkstyle' apply plugin: 'checkstyle'
apply plugin: 'pmd' apply plugin: 'pmd'
/* gets the version name from the latest Git tag, stripping the leading v off */ /* gets the version name from the latest Git tag */
def getVersionName = { -> def getVersionName = { ->
def stdout = new ByteArrayOutputStream() def stdout = new ByteArrayOutputStream()
exec { exec {
@ -12,8 +12,8 @@ def getVersionName = { ->
return stdout.toString().trim() return stdout.toString().trim()
} }
def isCi = "true".equals(System.getenv("CI")) def isCi = "true" == System.getenv("CI")
def preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) def preDexEnabled = "true" == System.getProperty("pre-dex", "true")
def fullApplicationId = "org.fdroid.fdroid" def fullApplicationId = "org.fdroid.fdroid"
def basicApplicationId = "org.fdroid.basic" def basicApplicationId = "org.fdroid.basic"
@ -21,14 +21,16 @@ def basicApplicationId = "org.fdroid.basic"
def privilegedExtensionApplicationId = '"org.fdroid.fdroid.privileged"' def privilegedExtensionApplicationId = '"org.fdroid.fdroid.privileged"'
android { android {
compileSdkVersion 27 compileSdkVersion 30
buildToolsVersion '27.0.3'
defaultConfig { defaultConfig {
versionCode 1006001 versionCode 1013001
versionName getVersionName() versionName getVersionName()
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
minSdkVersion 24
//noinspection ExpiredTargetSdkVersion
targetSdkVersion 28
/* /*
The Android Testing Support Library collects analytics to continuously improve the testing The Android Testing Support Library collects analytics to continuously improve the testing
experience. More specifically, it uploads a hash of the package name of the application experience. More specifically, it uploads a hash of the package name of the application
@ -36,6 +38,7 @@ android {
passing the following argument to the test runner: disableAnalytics "true". passing the following argument to the test runner: disableAnalytics "true".
*/ */
testInstrumentationRunnerArguments disableAnalytics: 'true' testInstrumentationRunnerArguments disableAnalytics: 'true'
vectorDrawables.useSupportLibrary = true
} }
buildTypes { buildTypes {
@ -43,9 +46,9 @@ android {
// release builds before. // release builds before.
all { all {
minifyEnabled true minifyEnabled true
useProguard true
shrinkResources true shrinkResources true
buildConfigField "String", "PRIVILEGED_EXTENSION_PACKAGE_NAME", privilegedExtensionApplicationId buildConfigField "String", "PRIVILEGED_EXTENSION_PACKAGE_NAME", privilegedExtensionApplicationId
buildConfigField "String", "ACRA_REPORT_EMAIL", '"reports@f-droid.org"' // String needs both quotes
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'src/androidTest/proguard-rules.pro' testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'src/androidTest/proguard-rules.pro'
} }
@ -73,6 +76,8 @@ android {
compileOptions { compileOptions {
compileOptions.encoding = "UTF-8" compileOptions.encoding = "UTF-8"
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
} }
aaptOptions { aaptOptions {
@ -97,6 +102,10 @@ android {
events "skipped", "failed", "standardOut", "standardError" events "skipped", "failed", "standardOut", "standardError"
showStandardStreams = true showStandardStreams = true
} }
systemProperty 'robolectric.dependency.repo.url', 'https://repo1.maven.org/maven2'
// hack to avoid memory leak crashes
forkEvery = 1
} }
} }
} }
@ -133,51 +142,56 @@ android {
} }
dependencies { dependencies {
implementation 'com.android.support:support-v4:27.1.1' implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'androidx.preference:preference:1.1.1'
implementation 'com.android.support:gridlayout-v7:27.1.1' implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'com.android.support:support-annotations:27.1.1' implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.android.support:recyclerview-v7:27.1.1' implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.android.support:cardview-v7:27.1.1' implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'com.android.support:design:27.1.1' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.android.support:support-vector-drawable:27.1.1' implementation 'androidx.palette:palette:1.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'androidx.work:work-runtime:2.4.0'
implementation 'com.android.support:palette-v7:27.1.1'
implementation 'com.android.support:preference-v14:27.1.1' implementation 'com.google.android.material:material:1.3.0'
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
implementation 'com.google.zxing:core:3.3.3' implementation 'com.google.zxing:core:3.3.3'
implementation 'info.guardianproject.netcipher:netcipher:2.0.0-beta1' implementation 'info.guardianproject.netcipher:netcipher:2.2.0-alpha'
implementation 'info.guardianproject.panic:panic:0.5' implementation 'info.guardianproject.panic:panic:1.0'
implementation 'commons-io:commons-io:2.6' implementation 'commons-io:commons-io:2.6'
implementation 'commons-net:commons-net:3.6' implementation 'commons-net:commons-net:3.6'
implementation 'ch.acra:acra:4.9.1' implementation 'ch.acra:acra:4.9.1'
implementation 'io.reactivex:rxjava:1.1.0'
implementation 'io.reactivex:rxandroid:0.23.0'
implementation 'com.hannesdorfmann:adapterdelegates3:3.0.1' implementation 'com.hannesdorfmann:adapterdelegates3:3.0.1'
implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.5'
implementation 'com.fasterxml.jackson.core:jackson-core:2.8.11' implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.8.11' implementation 'io.reactivex.rxjava3:rxjava:3.0.9'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.11'
implementation 'org.bouncycastle:bcprov-jdk15on:1.60' implementation 'com.fasterxml.jackson.core:jackson-core:2.11.1'
fullImplementation 'org.bouncycastle:bcpkix-jdk15on:1.60' implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.1'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1'
implementation 'org.bouncycastle:bcprov-jdk15on:1.65'
fullImplementation 'org.bouncycastle:bcpkix-jdk15on:1.65'
fullImplementation 'cc.mvdan.accesspoint:library:0.2.0' fullImplementation 'cc.mvdan.accesspoint:library:0.2.0'
fullImplementation 'org.jmdns:jmdns:3.5.5' fullImplementation 'org.jmdns:jmdns:3.5.5'
fullImplementation 'org.nanohttpd:nanohttpd:2.3.1' fullImplementation 'org.nanohttpd:nanohttpd:2.3.1'
testImplementation 'org.robolectric:robolectric:3.8' testImplementation 'androidx.test:core:1.3.0'
testImplementation "com.android.support.test:monitor:1.0.2" testImplementation 'junit:junit:4.13.1'
testImplementation 'org.bouncycastle:bcprov-jdk15on:1.60' testImplementation 'org.robolectric:robolectric:4.3'
testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:3.3.3'
testImplementation 'org.mockito:mockito-core:2.7.22' testImplementation 'org.hamcrest:hamcrest:2.2'
testImplementation 'org.bouncycastle:bcprov-jdk15on:1.65'
androidTestImplementation 'com.android.support:support-annotations:27.1.1' androidTestImplementation 'androidx.arch.core:core-testing:2.1.0'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'androidx.test:core:1.3.0'
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'com.android.support.test:rules:1.0.2' androidTestImplementation 'androidx.test:rules:1.3.0'
androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3' androidTestImplementation 'androidx.test:monitor:1.3.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
androidTestImplementation 'androidx.work:work-testing:2.4.0'
} }
checkstyle { checkstyle {
@ -193,7 +207,7 @@ task checkstyle(type: Checkstyle) {
} }
pmd { pmd {
toolVersion = '5.5.1' toolVersion = '6.20.0'
consoleOutput = true consoleOutput = true
} }
@ -203,7 +217,6 @@ task pmdMain(type: Pmd) {
ruleSets = [] // otherwise defaults clash with the list in rules.xml ruleSets = [] // otherwise defaults clash with the list in rules.xml
source 'src/main/java' source 'src/main/java'
include '**/*.java' include '**/*.java'
exclude '**/kellinwood/**/*.java'
} }
task pmdTest(type: Pmd) { task pmdTest(type: Pmd) {

View File

@ -40,6 +40,8 @@
<issue id="PluralsCandidate" severity="error"/> <issue id="PluralsCandidate" severity="error"/>
<issue id="HardcodedText" severity="error"/> <issue id="HardcodedText" severity="error"/>
<issue id="RtlCompat" severity="error"/>
<issue id="RtlEnabled" severity="error"/>
<!-- both the correct and deprecated locales need to be present for <!-- both the correct and deprecated locales need to be present for
them to be recognized on all devices --> them to be recognized on all devices -->

View File

@ -4,13 +4,11 @@
-keep class org.fdroid.fdroid.** {*;} -keep class org.fdroid.fdroid.** {*;}
-dontskipnonpubliclibraryclassmembers -dontskipnonpubliclibraryclassmembers
-dontwarn android.test.** -dontwarn android.test.**
-dontwarn com.android.support.test.**
-dontwarn javax.naming.** -dontwarn javax.naming.**
-dontwarn org.slf4j.** -dontwarn org.slf4j.**
-dontnote org.apache.http.** -dontnote org.apache.http.**
-dontnote android.net.http.** -dontnote android.net.http.**
-dontnote android.support.**
-dontnote **ILicensingService -dontnote **ILicensingService
# Needed for espresso https://stackoverflow.com/a/21706087 # Needed for espresso https://stackoverflow.com/a/21706087
@ -33,24 +31,6 @@
public *; public *;
} }
# Samsung Android 4.2 bug
# https://code.google.com/p/android/issues/detail?id=78377
-keepnames class !android.support.v7.internal.view.menu.**, ** {*;}
-keep public class android.support.v7.widget.** {*;}
-keep public class android.support.v7.internal.widget.** {*;}
-keep public class * extends android.support.v4.view.ActionProvider {
public <init>(android.content.Context);
}
# The rxjava library depends on sun.misc.Unsafe, which is unavailable on Android
# The rxjava team is aware of this, and mention in the docs that they only use
# the unsafe functionality if the platform supports it.
# - https://github.com/ReactiveX/RxJava/issues/1415#issuecomment-48390883
# - https://github.com/ReactiveX/RxJava/blob/1.x/src/main/java/rx/internal/util/unsafe/UnsafeAccess.java#L23
-dontwarn rx.internal.util.**
-keepattributes *Annotation*,EnclosingMethod,Signature -keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** { *; } -keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.ext.** -dontwarn com.fasterxml.jackson.databind.ext.**
@ -60,3 +40,8 @@ public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; }
-keep public class your.class.** { -keep public class your.class.** {
*; *;
} }
# This is necessary so that RemoteWorkManager can be initialized (also marked with @Keep)
-keep class androidx.work.multiprocess.RemoteWorkManagerClient {
public <init>(...);
}

View File

@ -1,17 +1,24 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us --> <!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="org.fdroid.fdroid.tests" package="org.fdroid.fdroid.tests"
android:versionCode="1" android:versionCode="1"
android:versionName="1.0"> android:versionName="1.0">
<uses-sdk tools:overrideLibrary="android.support.test.uiautomator.v18"/>
<uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator" />
<!-- We add an application tag here just so that we can indicate that <!-- We add an application tag here just so that we can indicate that
this package needs to link against the android.test library, this package needs to link against the android.test library,
which is needed when building test cases. --> which is needed when building test cases. -->
<application> <application>
<uses-library android:name="android.test.runner"/> <uses-library
android:name="android.test.runner"
android:required="false" />
</application> </application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest> </manifest>

View File

@ -1,8 +1,8 @@
package org.fdroid.fdroid; package org.fdroid.fdroid;
import android.content.Context; import android.content.Context;
import android.support.annotation.Nullable;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -16,6 +16,9 @@ public class AssetUtils {
private static final String TAG = "Utils"; private static final String TAG = "Utils";
/**
* This requires {@link Context} from {@link android.app.Instrumentation#getContext()}
*/
@Nullable @Nullable
public static File copyAssetToDir(Context context, String assetName, File directory) { public static File copyAssetToDir(Context context, String assetName, File directory) {
File tempFile = null; File tempFile = null;
@ -28,6 +31,7 @@ public class AssetUtils {
output = new FileOutputStream(tempFile); output = new FileOutputStream(tempFile);
Utils.copy(input, output); Utils.copy(input, output);
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, "Check the context is from Instrumentation.getContext()");
fail(e.getMessage()); fail(e.getMessage());
} finally { } finally {
Utils.closeQuietly(output); Utils.closeQuietly(output);

View File

@ -1,65 +0,0 @@
package org.fdroid.fdroid;
import android.app.Instrumentation;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.apache.commons.io.FileUtils;
import org.fdroid.fdroid.compat.FileCompatTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.File;
import java.io.IOException;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
public class CleanCacheServiceTest {
public static final String TAG = "CleanCacheServiceTest";
@Test
public void testClearOldFiles() throws IOException, InterruptedException {
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
File tempDir = FileCompatTest.getWriteableDir(instrumentation);
assertTrue(tempDir.isDirectory());
assertTrue(tempDir.canWrite());
File dir = new File(tempDir, "F-Droid-test.clearOldFiles");
FileUtils.deleteQuietly(dir);
assertTrue(dir.mkdirs());
assertTrue(dir.isDirectory());
File first = new File(dir, "first");
first.deleteOnExit();
File second = new File(dir, "second");
second.deleteOnExit();
assertFalse(first.exists());
assertFalse(second.exists());
assertTrue(first.createNewFile());
assertTrue(first.exists());
Thread.sleep(7000);
assertTrue(second.createNewFile());
assertTrue(second.exists());
CleanCacheService.clearOldFiles(dir, 3000); // check all in dir
assertFalse(first.exists());
assertTrue(second.exists());
Thread.sleep(7000);
CleanCacheService.clearOldFiles(second, 3000); // check just second file
assertFalse(first.exists());
assertFalse(second.exists());
// make sure it doesn't freak out on a non-existant file
File nonexistant = new File(tempDir, "nonexistant");
CleanCacheService.clearOldFiles(nonexistant, 1);
CleanCacheService.clearOldFiles(null, 1);
}
}

View File

@ -5,8 +5,8 @@ import android.content.Context;
import android.content.res.AssetManager; import android.content.res.AssetManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.support.test.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
@ -179,6 +179,9 @@ public class LocalizationTest {
case "dd": case "dd":
resources.getString(resId, 1, 2); resources.getString(resId, 1, 2);
break; break;
case "ds":
resources.getString(resId, 1, "TWO");
break;
case "dds": case "dds":
resources.getString(resId, 1, 2, "THREE"); resources.getString(resId, 1, 2, "THREE");
break; break;

View File

@ -5,20 +5,23 @@ import android.app.ActivityManager;
import android.app.Instrumentation; import android.app.Instrumentation;
import android.content.Context; import android.content.Context;
import android.os.Build; import android.os.Build;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.IdlingPolicies; import androidx.core.content.ContextCompat;
import android.support.test.espresso.ViewInteraction; import androidx.test.core.app.ApplicationProvider;
import android.support.test.filters.LargeTest; import androidx.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule; import androidx.test.platform.app.InstrumentationRegistry;
import android.support.test.rule.GrantPermissionRule; import androidx.test.espresso.IdlingPolicies;
import android.support.test.runner.AndroidJUnit4; import androidx.test.espresso.ViewInteraction;
import android.support.test.uiautomator.UiDevice; import androidx.test.rule.ActivityTestRule;
import android.support.test.uiautomator.UiObject; import androidx.test.rule.GrantPermissionRule;
import android.support.test.uiautomator.UiObjectNotFoundException; import androidx.test.ext.junit.runners.AndroidJUnit4;
import android.support.test.uiautomator.UiSelector; import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.UiObject;
import androidx.test.uiautomator.UiObjectNotFoundException;
import androidx.test.uiautomator.UiSelector;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import org.fdroid.fdroid.views.BannerUpdatingRepos; import org.fdroid.fdroid.views.StatusBanner;
import org.fdroid.fdroid.views.main.MainActivity; import org.fdroid.fdroid.views.main.MainActivity;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.After; import org.junit.After;
@ -32,23 +35,25 @@ import org.junit.runner.RunWith;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static android.support.test.espresso.Espresso.onView; import static androidx.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.swipeDown; import static androidx.test.espresso.action.ViewActions.swipeDown;
import static android.support.test.espresso.action.ViewActions.swipeLeft; import static androidx.test.espresso.action.ViewActions.swipeLeft;
import static android.support.test.espresso.action.ViewActions.swipeRight; import static androidx.test.espresso.action.ViewActions.swipeRight;
import static android.support.test.espresso.action.ViewActions.swipeUp; import static androidx.test.espresso.action.ViewActions.swipeUp;
import static android.support.test.espresso.action.ViewActions.typeText; import static androidx.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
import static android.support.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static android.support.test.espresso.matcher.ViewMatchers.withText; import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
@LargeTest
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class MainActivityEspressoTest { public class MainActivityEspressoTest {
public static final String TAG = "MainActivityEspressoTest"; public static final String TAG = "MainActivityEspressoTest";
@ -86,7 +91,7 @@ public class MainActivityEspressoTest {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
SystemAnimations.disableAll(InstrumentationRegistry.getTargetContext()); SystemAnimations.disableAll(ApplicationProvider.getApplicationContext());
// dismiss the ANR or any other system dialogs that might be there // dismiss the ANR or any other system dialogs that might be there
UiObject button = new UiObject(new UiSelector().text("Wait").enabled(true)); UiObject button = new UiObject(new UiSelector().text("Wait").enabled(true));
@ -99,7 +104,7 @@ public class MainActivityEspressoTest {
Context context = instrumentation.getTargetContext(); Context context = instrumentation.getTargetContext();
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager activityManager = ContextCompat.getSystemService(context, ActivityManager.class);
activityManager.getMemoryInfo(mi); activityManager.getMemoryInfo(mi);
long percentAvail = mi.availMem / mi.totalMem; long percentAvail = mi.availMem / mi.totalMem;
Log.i(TAG, "RAM: " + mi.availMem + " / " + mi.totalMem + " = " + percentAvail); Log.i(TAG, "RAM: " + mi.availMem + " / " + mi.totalMem + " = " + percentAvail);
@ -107,7 +112,7 @@ public class MainActivityEspressoTest {
@AfterClass @AfterClass
public static void classTearDown() { public static void classTearDown() {
SystemAnimations.enableAll(InstrumentationRegistry.getTargetContext()); SystemAnimations.enableAll(ApplicationProvider.getApplicationContext());
} }
public static boolean isEmulator() { public static boolean isEmulator() {
@ -172,6 +177,7 @@ public class MainActivityEspressoTest {
} }
@LargeTest @LargeTest
@Test
public void showSettings() { public void showSettings() {
ViewInteraction settingsBottonNavButton = onView( ViewInteraction settingsBottonNavButton = onView(
allOf(withText(R.string.menu_settings), isDisplayed())); allOf(withText(R.string.menu_settings), isDisplayed()));
@ -186,9 +192,27 @@ public class MainActivityEspressoTest {
allOf(withText(R.string.preference_manage_installed_apps), isDisplayed())); allOf(withText(R.string.preference_manage_installed_apps), isDisplayed()));
manageInstalledAppsButton.perform(click()); manageInstalledAppsButton.perform(click());
onView(withText(R.string.installed_apps__activity_title)).check(matches(isDisplayed())); onView(withText(R.string.installed_apps__activity_title)).check(matches(isDisplayed()));
onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());
onView(withText(R.string.menu_manage)).perform(click());
onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());
manageInstalledAppsButton.perform(click());
onView(withText(R.string.installed_apps__activity_title)).check(matches(isDisplayed()));
onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());
onView(withText(R.string.menu_manage)).perform(click());
onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());
onView(withText(R.string.about_title)).perform(click());
onView(withId(R.id.version)).check(matches(isDisplayed()));
onView(withId(R.id.ok_button)).perform(click());
onView(withId(android.R.id.list_container)).perform(swipeUp()).perform(swipeUp()).perform(swipeUp());
} }
@LargeTest @LargeTest
@Test
public void showUpdates() { public void showUpdates() {
ViewInteraction updatesBottonNavButton = onView(allOf(withText(R.string.main_menu__updates), isDisplayed())); ViewInteraction updatesBottonNavButton = onView(allOf(withText(R.string.main_menu__updates), isDisplayed()));
updatesBottonNavButton.perform(click()); updatesBottonNavButton.perform(click());
@ -196,6 +220,7 @@ public class MainActivityEspressoTest {
} }
@LargeTest @LargeTest
@Test
public void startSwap() { public void startSwap() {
if (!BuildConfig.FLAVOR.startsWith("full")) { if (!BuildConfig.FLAVOR.startsWith("full")) {
return; return;
@ -204,12 +229,14 @@ public class MainActivityEspressoTest {
allOf(withText(R.string.main_menu__swap_nearby), isDisplayed())); allOf(withText(R.string.main_menu__swap_nearby), isDisplayed()));
nearbyBottonNavButton.perform(click()); nearbyBottonNavButton.perform(click());
ViewInteraction findPeopleButton = onView( ViewInteraction findPeopleButton = onView(
allOf(withId(R.id.find_people_button), withText(R.string.nearby_splash__find_people_button), isDisplayed())); allOf(withId(R.id.find_people_button), withText(R.string.nearby_splash__find_people_button),
isDisplayed()));
findPeopleButton.perform(click()); findPeopleButton.perform(click());
onView(withText(R.string.swap_send_fdroid)).check(matches(isDisplayed())); onView(withText(R.string.swap_send_fdroid)).check(matches(isDisplayed()));
} }
@LargeTest @LargeTest
@Test
public void showCategories() { public void showCategories() {
if (!BuildConfig.FLAVOR.startsWith("full")) { if (!BuildConfig.FLAVOR.startsWith("full")) {
return; return;
@ -235,11 +262,12 @@ public class MainActivityEspressoTest {
} }
@LargeTest @LargeTest
@Test
public void showLatest() { public void showLatest() {
if (!BuildConfig.FLAVOR.startsWith("full")) { if (!BuildConfig.FLAVOR.startsWith("full")) {
return; return;
} }
onView(Matchers.<View>instanceOf(BannerUpdatingRepos.class)).check(matches(not(isDisplayed()))); onView(Matchers.<View>instanceOf(StatusBanner.class)).check(matches(not(isDisplayed())));
onView(allOf(withText(R.string.menu_settings), isDisplayed())).perform(click()); onView(allOf(withText(R.string.menu_settings), isDisplayed())).perform(click());
onView(allOf(withText(R.string.main_menu__latest_apps), isDisplayed())).perform(click()); onView(allOf(withText(R.string.main_menu__latest_apps), isDisplayed())).perform(click());
onView(allOf(withId(R.id.swipe_to_refresh), isDisplayed())) onView(allOf(withId(R.id.swipe_to_refresh), isDisplayed()))
@ -257,6 +285,7 @@ public class MainActivityEspressoTest {
} }
@LargeTest @LargeTest
@Test
public void showSearch() { public void showSearch() {
onView(allOf(withText(R.string.menu_settings), isDisplayed())).perform(click()); onView(allOf(withText(R.string.menu_settings), isDisplayed())).perform(click());
onView(withId(R.id.fab_search)).check(doesNotExist()); onView(withId(R.id.fab_search)).check(doesNotExist());

View File

@ -0,0 +1,372 @@
package org.fdroid.fdroid;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Replacer for the netstat utility, by reading the /proc filesystem it can find out the
* open connections of the system
* From http://www.ussg.iu.edu/hypermail/linux/kernel/0409.1/2166.html :
* It will first list all listening TCP sockets, and next list all established
* TCP connections. A typical entry of /proc/net/tcp would look like this (split
* up into 3 parts because of the length of the line):
* <p>
* 46: 010310AC:9C4C 030310AC:1770 01
* | | | | | |--> connection state
* | | | | |------> remote TCP port number
* | | | |-------------> remote IPv4 address
* | | |--------------------> local TCP port number
* | |---------------------------> local IPv4 address
* |----------------------------------> number of entry
* <p>
* 00000150:00000000 01:00000019 00000000
* | | | | |--> number of unrecovered RTO timeouts
* | | | |----------> number of jiffies until timer expires
* | | |----------------> timer_active (see below)
* | |----------------------> receive-queue
* |-------------------------------> transmit-queue
* <p>
* 1000 0 54165785 4 cd1e6040 25 4 27 3 -1
* | | | | | | | | | |--> slow start size threshold,
* | | | | | | | | | or -1 if the treshold
* | | | | | | | | | is >= 0xFFFF
* | | | | | | | | |----> sending congestion window
* | | | | | | | |-------> (ack.quick<<1)|ack.pingpong
* | | | | | | |---------> Predicted tick of soft clock
* | | | | | | (delayed ACK control data)
* | | | | | |------------> retransmit timeout
* | | | | |------------------> location of socket in memory
* | | | |-----------------------> socket reference count
* | | |-----------------------------> inode
* | |----------------------------------> unanswered 0-window probes
* |---------------------------------------------> uid
*
* @author Ciprian Dobre
*/
public class Netstat {
/**
* Possible values for states in /proc/net/tcp
*/
private static final String[] STATES = {
"ESTBLSH", "SYNSENT", "SYNRECV", "FWAIT1", "FWAIT2", "TMEWAIT",
"CLOSED", "CLSWAIT", "LASTACK", "LISTEN", "CLOSING", "UNKNOWN",
};
/**
* Pattern used when parsing through /proc/net/tcp
*/
private static final Pattern NET_PATTERN = Pattern.compile(
"\\d+:\\s+([\\dA-F]+):([\\dA-F]+)\\s+([\\dA-F]+):([\\dA-F]+)\\s+([\\dA-F]+)\\s+" +
"[\\dA-F]+:[\\dA-F]+\\s+[\\dA-F]+:[\\dA-F]+\\s+[\\dA-F]+\\s+([\\d]+)\\s+[\\d]+\\s+([\\d]+)");
/**
* Utility method that converts an address from a hex representation as founded in /proc to String representation
*/
private static String getAddress(final String hexa) {
try {
// first let's convert the address to Integer
final long v = Long.parseLong(hexa, 16);
// in /proc the order is little endian and java uses big endian order we also need to invert the order
final long adr = (v >>> 24) | (v << 24) |
((v << 8) & 0x00FF0000) | ((v >> 8) & 0x0000FF00);
// and now it's time to output the result
return ((adr >> 24) & 0xff) + "." + ((adr >> 16) & 0xff) + "." + ((adr >> 8) & 0xff) + "." + (adr & 0xff);
} catch (Exception ex) {
ex.printStackTrace();
return "0.0.0.0"; // NOPMD
}
}
private static int getInt16(final String hexa) {
try {
return Integer.parseInt(hexa, 16);
} catch (Exception ex) {
ex.printStackTrace();
return -1;
}
}
/*
private static String getPName(final int pid) {
final Pattern pattern = Pattern.compile("Name:\\s*(\\S+)");
try {
BufferedReader in = new BufferedReader(new FileReader("/proc/" + pid + "/status"));
String line;
while ((line = in.readLine()) != null) {
final Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
return matcher.group(1);
}
}
in.close();
} catch (Throwable t) {
// ignored
}
return "UNKNOWN";
}
*/
/**
* Method used to question for the connections currently openned
*
* @return The list of connections (as Connection objects)
*/
public static List<Connection> getConnections() {
final ArrayList<Connection> net = new ArrayList<>();
// read from /proc/net/tcp the list of currently openned socket connections
try {
BufferedReader in = new BufferedReader(new FileReader("/proc/net/tcp"));
String line;
while ((line = in.readLine()) != null) { // NOPMD
Matcher matcher = NET_PATTERN.matcher(line);
if (matcher.find()) {
final Connection c = new Connection();
c.setProtocol(Connection.TCP_CONNECTION);
net.add(c);
final String localPortHexa = matcher.group(2);
final String remoteAddressHexa = matcher.group(3);
final String remotePortHexa = matcher.group(4);
final String statusHexa = matcher.group(5);
//final String uid = matcher.group(6);
//final String inode = matcher.group(7);
c.setLocalPort(getInt16(localPortHexa));
c.setRemoteAddress(getAddress(remoteAddressHexa));
c.setRemotePort(getInt16(remotePortHexa));
try {
c.setStatus(STATES[Integer.parseInt(statusHexa, 16) - 1]);
} catch (Exception ex) {
c.setStatus(STATES[11]); // unknown
}
c.setPID(-1); // unknown
c.setPName("UNKNOWN");
}
}
in.close();
} catch (Throwable t) { // NOPMD
// ignored
}
// read from /proc/net/udp the list of currently openned socket connections
try {
BufferedReader in = new BufferedReader(new FileReader("/proc/net/udp"));
String line;
while ((line = in.readLine()) != null) { // NOPMD
Matcher matcher = NET_PATTERN.matcher(line);
if (matcher.find()) {
final Connection c = new Connection();
c.setProtocol(Connection.UDP_CONNECTION);
net.add(c);
final String localPortHexa = matcher.group(2);
final String remoteAddressHexa = matcher.group(3);
final String remotePortHexa = matcher.group(4);
final String statusHexa = matcher.group(5);
//final String uid = matcher.group(6);
//final String inode = matcher.group(7);
c.setLocalPort(getInt16(localPortHexa));
c.setRemoteAddress(getAddress(remoteAddressHexa));
c.setRemotePort(getInt16(remotePortHexa));
try {
c.setStatus(STATES[Integer.parseInt(statusHexa, 16) - 1]);
} catch (Exception ex) {
c.setStatus(STATES[11]); // unknown
}
c.setPID(-1); // unknown
c.setPName("UNKNOWN");
}
}
in.close();
} catch (Throwable t) { // NOPMD
// ignored
}
// read from /proc/net/raw the list of currently openned socket connections
try {
BufferedReader in = new BufferedReader(new FileReader("/proc/net/raw"));
String line;
while ((line = in.readLine()) != null) { // NOPMD
Matcher matcher = NET_PATTERN.matcher(line);
if (matcher.find()) {
final Connection c = new Connection();
c.setProtocol(Connection.RAW_CONNECTION);
net.add(c);
//final String localAddressHexa = matcher.group(1);
final String localPortHexa = matcher.group(2);
final String remoteAddressHexa = matcher.group(3);
final String remotePortHexa = matcher.group(4);
final String statusHexa = matcher.group(5);
//final String uid = matcher.group(6);
//final String inode = matcher.group(7);
c.setLocalPort(getInt16(localPortHexa));
c.setRemoteAddress(getAddress(remoteAddressHexa));
c.setRemotePort(getInt16(remotePortHexa));
try {
c.setStatus(STATES[Integer.parseInt(statusHexa, 16) - 1]);
} catch (Exception ex) {
c.setStatus(STATES[11]); // unknown
}
c.setPID(-1); // unknown
c.setPName("UNKNOWN");
}
}
in.close();
} catch (Throwable t) { // NOPMD
// ignored
}
return net;
}
/**
* Informations about a given connection
*
* @author Ciprian Dobre
*/
public static class Connection {
/**
* Types of connection protocol
***/
public static final byte TCP_CONNECTION = 0;
public static final byte UDP_CONNECTION = 1;
public static final byte RAW_CONNECTION = 2;
/**
* <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 1988671591829311032L;
/**
* The protocol of the connection (can be tcp, udp or raw)
*/
protected byte protocol;
/**
* The owner of the connection (username)
*/
protected String powner;
/**
* The pid of the owner process
*/
protected int pid;
/**
* The name of the program owning the connection
*/
protected String pname;
/**
* Local port
*/
protected int localPort;
/**
* Remote address of the connection
*/
protected String remoteAddress;
/**
* Remote port
*/
protected int remotePort;
/**
* Status of the connection
*/
protected String status;
public final byte getProtocol() {
return protocol;
}
public final void setProtocol(final byte protocol) {
this.protocol = protocol;
}
public final String getProtocolAsString() {
switch (protocol) {
case TCP_CONNECTION:
return "TCP";
case UDP_CONNECTION:
return "UDP";
case RAW_CONNECTION:
return "RAW";
}
return "UNKNOWN";
}
public final String getPOwner() {
return powner;
}
public final void setPOwner(final String owner) {
this.powner = owner;
}
public final int getPID() {
return pid;
}
public final void setPID(final int pid) {
this.pid = pid;
}
public final String getPName() {
return pname;
}
public final void setPName(final String pname) {
this.pname = pname;
}
public final int getLocalPort() {
return localPort;
}
public final void setLocalPort(final int localPort) {
this.localPort = localPort;
}
public final String getRemoteAddress() {
return remoteAddress;
}
public final void setRemoteAddress(final String remoteAddress) {
this.remoteAddress = remoteAddress;
}
public final int getRemotePort() {
return remotePort;
}
public final void setRemotePort(final int remotePort) {
this.remotePort = remotePort;
}
public final String getStatus() {
return status;
}
public final void setStatus(final String status) {
this.status = status;
}
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("[Prot=").append(getProtocolAsString());
buf.append(",POwner=").append(powner);
buf.append(",PID=").append(pid);
buf.append(",PName=").append(pname);
buf.append(",LPort=").append(localPort);
buf.append(",RAddress=").append(remoteAddress);
buf.append(",RPort=").append(remotePort);
buf.append(",Status=").append(status);
buf.append("]");
return buf.toString();
}
}
}

View File

@ -16,11 +16,11 @@
package org.fdroid.fdroid; package org.fdroid.fdroid;
import android.support.test.uiautomator.UiDevice; import androidx.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject; import androidx.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiObjectNotFoundException; import androidx.test.uiautomator.UiObjectNotFoundException;
import android.support.test.uiautomator.UiSelector; import androidx.test.uiautomator.UiSelector;
import android.support.test.uiautomator.UiWatcher; import androidx.test.uiautomator.UiWatcher;
import android.util.Log; import android.util.Log;
import java.util.ArrayList; import java.util.ArrayList;
@ -117,7 +117,7 @@ public class UiWatchers {
return false; // no trigger return false; // no trigger
} }
}); });
Log.i(LOG_TAG, "Registed GUI Exception watchers"); Log.i(LOG_TAG, "Registered GUI Exception watchers");
} }
public void onAnrDetected(String errorText) { public void onAnrDetected(String errorText) {

View File

@ -4,8 +4,8 @@ import android.app.Instrumentation;
import android.content.Context; import android.content.Context;
import android.os.Build; import android.os.Build;
import android.os.Environment; import android.os.Environment;
import android.support.test.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import android.util.Log; import android.util.Log;
import org.fdroid.fdroid.AssetUtils; import org.fdroid.fdroid.AssetUtils;

View File

@ -22,10 +22,10 @@ package org.fdroid.fdroid.installer;
import android.app.Instrumentation; import android.app.Instrumentation;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.support.annotation.NonNull;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import org.fdroid.fdroid.AssetUtils; import org.fdroid.fdroid.AssetUtils;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.compat.FileCompatTest; import org.fdroid.fdroid.compat.FileCompatTest;
@ -113,7 +113,7 @@ public class ApkVerifierTest {
Apk apk = new Apk(); Apk apk = new Apk();
apk.packageName = "org.fdroid.permissions.sdk14"; apk.packageName = "org.fdroid.permissions.sdk14";
apk.targetSdkVersion = 14; apk.targetSdkVersion = 14;
String[] noPrefixPermissions = new String[]{ ArrayList<String> noPrefixPermissionsList = new ArrayList<>(Arrays.asList(
"AUTHENTICATE_ACCOUNTS", "AUTHENTICATE_ACCOUNTS",
"MANAGE_ACCOUNTS", "MANAGE_ACCOUNTS",
"READ_PROFILE", "READ_PROFILE",
@ -129,8 +129,13 @@ public class ApkVerifierTest {
"READ_SYNC_SETTINGS", "READ_SYNC_SETTINGS",
"WRITE_SYNC_SETTINGS", "WRITE_SYNC_SETTINGS",
"WRITE_CALL_LOG", // implied-permission! "WRITE_CALL_LOG", // implied-permission!
"READ_CALL_LOG", // implied-permission! "READ_CALL_LOG" // implied-permission!
}; ));
if (Build.VERSION.SDK_INT >= 29) {
noPrefixPermissionsList.add("android.permission.ACCESS_MEDIA_LOCATION");
}
String[] noPrefixPermissions = noPrefixPermissionsList.toArray(new String[0]);
for (int i = 0; i < noPrefixPermissions.length; i++) { for (int i = 0; i < noPrefixPermissions.length; i++) {
noPrefixPermissions[i] = RepoXMLHandler.fdroidToAndroidPermission(noPrefixPermissions[i]); noPrefixPermissions[i] = RepoXMLHandler.fdroidToAndroidPermission(noPrefixPermissions[i]);
} }
@ -177,7 +182,7 @@ public class ApkVerifierTest {
Apk apk = new Apk(); Apk apk = new Apk();
apk.packageName = "org.fdroid.permissions.sdk14"; apk.packageName = "org.fdroid.permissions.sdk14";
apk.targetSdkVersion = 14; apk.targetSdkVersion = 14;
apk.requestedPermissions = new String[]{ TreeSet<String> expectedSet = new TreeSet<>(Arrays.asList(
"android.permission.AUTHENTICATE_ACCOUNTS", "android.permission.AUTHENTICATE_ACCOUNTS",
"android.permission.MANAGE_ACCOUNTS", "android.permission.MANAGE_ACCOUNTS",
"android.permission.READ_PROFILE", "android.permission.READ_PROFILE",
@ -193,8 +198,12 @@ public class ApkVerifierTest {
"android.permission.READ_SYNC_SETTINGS", "android.permission.READ_SYNC_SETTINGS",
"android.permission.WRITE_SYNC_SETTINGS", "android.permission.WRITE_SYNC_SETTINGS",
"android.permission.WRITE_CALL_LOG", // implied-permission! "android.permission.WRITE_CALL_LOG", // implied-permission!
"android.permission.READ_CALL_LOG", // implied-permission! "android.permission.READ_CALL_LOG"// implied-permission!
}; ));
if (Build.VERSION.SDK_INT >= 29) {
expectedSet.add("android.permission.ACCESS_MEDIA_LOCATION");
}
apk.requestedPermissions = expectedSet.toArray(new String[0]);
Uri uri = Uri.fromFile(sdk14Apk); Uri uri = Uri.fromFile(sdk14Apk);
@ -371,6 +380,9 @@ public class ApkVerifierTest {
"android.permission.MANAGE_ACCOUNTS" "android.permission.MANAGE_ACCOUNTS"
)); ));
} }
if (Build.VERSION.SDK_INT >= 29) {
expectedSet.add("android.permission.ACCESS_MEDIA_LOCATION");
}
Apk apk = actualDetails.apks.get(1); Apk apk = actualDetails.apks.get(1);
Log.i(TAG, "APK: " + apk.apkName); Log.i(TAG, "APK: " + apk.apkName);
HashSet<String> actualSet = new HashSet<>(Arrays.asList(apk.requestedPermissions)); HashSet<String> actualSet = new HashSet<>(Arrays.asList(apk.requestedPermissions));
@ -407,6 +419,9 @@ public class ApkVerifierTest {
"org.dmfs.permission.READ_TASKS", "org.dmfs.permission.READ_TASKS",
"org.dmfs.permission.WRITE_TASKS" "org.dmfs.permission.WRITE_TASKS"
)); ));
if (Build.VERSION.SDK_INT >= 29) {
expectedSet.add("android.permission.ACCESS_MEDIA_LOCATION");
}
expectedPermissions = expectedSet.toArray(new String[expectedSet.size()]); expectedPermissions = expectedSet.toArray(new String[expectedSet.size()]);
apk = actualDetails.apks.get(2); apk = actualDetails.apks.get(2);
Log.i(TAG, "APK: " + apk.apkName); Log.i(TAG, "APK: " + apk.apkName);

View File

@ -0,0 +1,128 @@
package org.fdroid.fdroid.nearby;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.fdroid.fdroid.FDroidApp;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceListener;
import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
public class BonjourManagerTest {
private static final String NAME = "Robolectric-test";
private static final String LOCALHOST = "localhost";
private static final int PORT = 8888;
@Test
public void testStartStop() throws InterruptedException {
Context context = ApplicationProvider.getApplicationContext();
FDroidApp.ipAddressString = LOCALHOST;
FDroidApp.port = PORT;
final CountDownLatch addedLatch = new CountDownLatch(1);
final CountDownLatch resolvedLatch = new CountDownLatch(1);
final CountDownLatch removedLatch = new CountDownLatch(1);
BonjourManager.start(context, NAME, false,
new ServiceListener() {
@Override
public void serviceAdded(ServiceEvent serviceEvent) {
System.out.println("Service added: " + serviceEvent.getInfo());
if (NAME.equals(serviceEvent.getName())) {
addedLatch.countDown();
}
}
@Override
public void serviceRemoved(ServiceEvent serviceEvent) {
System.out.println("Service removed: " + serviceEvent.getInfo());
removedLatch.countDown();
}
@Override
public void serviceResolved(ServiceEvent serviceEvent) {
System.out.println("Service resolved: " + serviceEvent.getInfo());
if (NAME.equals(serviceEvent.getName())) {
resolvedLatch.countDown();
}
}
}, getBlankServiceListener());
BonjourManager.setVisible(context, true);
assertTrue(addedLatch.await(30, TimeUnit.SECONDS));
assertTrue(resolvedLatch.await(30, TimeUnit.SECONDS));
BonjourManager.setVisible(context, false);
assertTrue(removedLatch.await(30, TimeUnit.SECONDS));
BonjourManager.stop(context);
}
@Test
public void testRestart() throws InterruptedException {
Context context = ApplicationProvider.getApplicationContext();
FDroidApp.ipAddressString = LOCALHOST;
FDroidApp.port = PORT;
BonjourManager.start(context, NAME, false, getBlankServiceListener(), getBlankServiceListener());
final CountDownLatch addedLatch = new CountDownLatch(1);
final CountDownLatch resolvedLatch = new CountDownLatch(1);
final CountDownLatch removedLatch = new CountDownLatch(1);
BonjourManager.restart(context, NAME, false,
new ServiceListener() {
@Override
public void serviceAdded(ServiceEvent serviceEvent) {
System.out.println("Service added: " + serviceEvent.getInfo());
if (NAME.equals(serviceEvent.getName())) {
addedLatch.countDown();
}
}
@Override
public void serviceRemoved(ServiceEvent serviceEvent) {
System.out.println("Service removed: " + serviceEvent.getInfo());
removedLatch.countDown();
}
@Override
public void serviceResolved(ServiceEvent serviceEvent) {
System.out.println("Service resolved: " + serviceEvent.getInfo());
if (NAME.equals(serviceEvent.getName())) {
resolvedLatch.countDown();
}
}
}, getBlankServiceListener());
BonjourManager.setVisible(context, true);
assertTrue(addedLatch.await(30, TimeUnit.SECONDS));
assertTrue(resolvedLatch.await(30, TimeUnit.SECONDS));
BonjourManager.setVisible(context, false);
assertTrue(removedLatch.await(30, TimeUnit.SECONDS));
BonjourManager.stop(context);
}
private ServiceListener getBlankServiceListener() {
return new ServiceListener() {
@Override
public void serviceAdded(ServiceEvent serviceEvent) {
}
@Override
public void serviceRemoved(ServiceEvent serviceEvent) {
}
@Override
public void serviceResolved(ServiceEvent serviceEvent) {
}
};
}
}

View File

@ -0,0 +1,192 @@
package org.fdroid.fdroid.nearby;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.filters.LargeTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.util.Log;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Netstat;
import org.fdroid.fdroid.Utils;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class LocalHTTPDManagerTest {
private static final String TAG = "LocalHTTPDManagerTest";
private Context context;
private LocalBroadcastManager lbm;
private static final String LOCALHOST = "localhost";
private static final int PORT = 8888;
@Before
public void setUp() {
context = ApplicationProvider.getApplicationContext();
lbm = LocalBroadcastManager.getInstance(context);
FDroidApp.ipAddressString = LOCALHOST;
FDroidApp.port = PORT;
for (Netstat.Connection connection : Netstat.getConnections()) { // NOPMD
Log.i("LocalHTTPDManagerTest", "connection: " + connection.toString());
}
assertFalse(Utils.isServerSocketInUse(PORT));
LocalHTTPDManager.stop(context);
for (Netstat.Connection connection : Netstat.getConnections()) { // NOPMD
Log.i("LocalHTTPDManagerTest", "connection: " + connection.toString());
}
}
@After
public void tearDown() {
lbm.unregisterReceiver(startedReceiver);
lbm.unregisterReceiver(stoppedReceiver);
lbm.unregisterReceiver(errorReceiver);
}
@Ignore
@Test
public void testStartStop() throws InterruptedException {
Log.i(TAG, "testStartStop");
final CountDownLatch startLatch = new CountDownLatch(1);
BroadcastReceiver latchReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
startLatch.countDown();
}
};
lbm.registerReceiver(latchReceiver, new IntentFilter(LocalHTTPDManager.ACTION_STARTED));
lbm.registerReceiver(stoppedReceiver, new IntentFilter(LocalHTTPDManager.ACTION_STOPPED));
lbm.registerReceiver(errorReceiver, new IntentFilter(LocalHTTPDManager.ACTION_ERROR));
LocalHTTPDManager.start(context, false);
assertTrue(startLatch.await(30, TimeUnit.SECONDS));
assertTrue(Utils.isServerSocketInUse(PORT));
assertTrue(Utils.canConnectToSocket(LOCALHOST, PORT));
lbm.unregisterReceiver(latchReceiver);
lbm.unregisterReceiver(stoppedReceiver);
lbm.unregisterReceiver(errorReceiver);
final CountDownLatch stopLatch = new CountDownLatch(1);
latchReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
stopLatch.countDown();
}
};
lbm.registerReceiver(startedReceiver, new IntentFilter(LocalHTTPDManager.ACTION_STARTED));
lbm.registerReceiver(latchReceiver, new IntentFilter(LocalHTTPDManager.ACTION_STOPPED));
lbm.registerReceiver(errorReceiver, new IntentFilter(LocalHTTPDManager.ACTION_ERROR));
LocalHTTPDManager.stop(context);
assertTrue(stopLatch.await(30, TimeUnit.SECONDS));
assertFalse(Utils.isServerSocketInUse(PORT));
assertFalse(Utils.canConnectToSocket(LOCALHOST, PORT)); // if this is flaky, just remove it
lbm.unregisterReceiver(latchReceiver);
}
@Test
public void testError() throws InterruptedException, IOException {
Log.i("LocalHTTPDManagerTest", "testError");
ServerSocket blockerSocket = new ServerSocket(PORT);
final CountDownLatch latch = new CountDownLatch(1);
BroadcastReceiver latchReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
latch.countDown();
}
};
lbm.registerReceiver(startedReceiver, new IntentFilter(LocalHTTPDManager.ACTION_STARTED));
lbm.registerReceiver(stoppedReceiver, new IntentFilter(LocalHTTPDManager.ACTION_STOPPED));
lbm.registerReceiver(latchReceiver, new IntentFilter(LocalHTTPDManager.ACTION_ERROR));
LocalHTTPDManager.start(context, false);
assertTrue(latch.await(30, TimeUnit.SECONDS));
assertTrue(Utils.isServerSocketInUse(PORT));
assertNotEquals(PORT, FDroidApp.port);
assertFalse(Utils.isServerSocketInUse(FDroidApp.port));
lbm.unregisterReceiver(latchReceiver);
blockerSocket.close();
}
@Test
public void testRestart() throws InterruptedException, IOException {
Log.i("LocalHTTPDManagerTest", "testRestart");
assertFalse(Utils.isServerSocketInUse(PORT));
final CountDownLatch startLatch = new CountDownLatch(1);
BroadcastReceiver latchReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
startLatch.countDown();
}
};
lbm.registerReceiver(latchReceiver, new IntentFilter(LocalHTTPDManager.ACTION_STARTED));
lbm.registerReceiver(stoppedReceiver, new IntentFilter(LocalHTTPDManager.ACTION_STOPPED));
lbm.registerReceiver(errorReceiver, new IntentFilter(LocalHTTPDManager.ACTION_ERROR));
LocalHTTPDManager.start(context, false);
assertTrue(startLatch.await(30, TimeUnit.SECONDS));
assertTrue(Utils.isServerSocketInUse(PORT));
lbm.unregisterReceiver(latchReceiver);
lbm.unregisterReceiver(stoppedReceiver);
final CountDownLatch restartLatch = new CountDownLatch(1);
latchReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
restartLatch.countDown();
}
};
lbm.registerReceiver(latchReceiver, new IntentFilter(LocalHTTPDManager.ACTION_STARTED));
LocalHTTPDManager.restart(context, false);
assertTrue(restartLatch.await(30, TimeUnit.SECONDS));
lbm.unregisterReceiver(latchReceiver);
}
private final BroadcastReceiver startedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra(Intent.EXTRA_TEXT);
Log.i(TAG, "startedReceiver: " + message);
fail();
}
};
private final BroadcastReceiver stoppedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra(Intent.EXTRA_TEXT);
Log.i(TAG, "stoppedReceiver: " + message);
fail();
}
};
private final BroadcastReceiver errorReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra(Intent.EXTRA_TEXT);
Log.i(TAG, "errorReceiver: " + message);
fail();
}
};
}

View File

@ -70,7 +70,7 @@ public class HttpDownloaderTest {
final HttpDownloader httpDownloader = new HttpDownloader(uri, destFile); final HttpDownloader httpDownloader = new HttpDownloader(uri, destFile);
httpDownloader.setListener(new ProgressListener() { httpDownloader.setListener(new ProgressListener() {
@Override @Override
public void onProgress(String urlString, long bytesRead, long totalBytes) { public void onProgress(long bytesRead, long totalBytes) {
receivedProgress = true; receivedProgress = true;
} }
}); });
@ -132,7 +132,7 @@ public class HttpDownloaderTest {
final HttpDownloader httpDownloader = new HttpDownloader(uri, destFile); final HttpDownloader httpDownloader = new HttpDownloader(uri, destFile);
httpDownloader.setListener(new ProgressListener() { httpDownloader.setListener(new ProgressListener() {
@Override @Override
public void onProgress(String urlString, long bytesRead, long totalBytes) { public void onProgress(long bytesRead, long totalBytes) {
receivedProgress = true; receivedProgress = true;
latch.countDown(); latch.countDown();
} }

View File

@ -0,0 +1,203 @@
package org.fdroid.fdroid.updater;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.os.Looper;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import android.text.TextUtils;
import android.util.Log;
import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Hasher;
import org.fdroid.fdroid.IndexUpdater;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Apk;
import org.fdroid.fdroid.data.ApkProvider;
import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.nearby.LocalHTTPD;
import org.fdroid.fdroid.nearby.LocalRepoKeyStore;
import org.fdroid.fdroid.nearby.LocalRepoManager;
import org.fdroid.fdroid.nearby.LocalRepoService;
import org.junit.Ignore;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.net.Socket;
import java.security.cert.Certificate;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@LargeTest
public class SwapRepoEmulatorTest {
public static final String TAG = "SwapRepoEmulatorTest";
/**
* @see org.fdroid.fdroid.nearby.WifiStateChangeService.WifiInfoThread#run()
*/
@Ignore
@Test
public void testSwap()
throws IOException, LocalRepoKeyStore.InitException, IndexUpdater.UpdateException, InterruptedException {
Looper.prepare();
LocalHTTPD localHttpd = null;
try {
Log.i(TAG, "REPO: " + FDroidApp.repo);
final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
Preferences.setupForTests(context);
FDroidApp.initWifiSettings();
assertNull(FDroidApp.repo.address);
final CountDownLatch latch = new CountDownLatch(1);
new Thread() {
@Override
public void run() {
while (FDroidApp.repo.address == null) {
try {
Log.i(TAG, "Waiting for IP address... " + FDroidApp.repo.address);
Thread.sleep(1000);
} catch (InterruptedException e) {
// ignored
}
}
latch.countDown();
}
}.start();
latch.await(10, TimeUnit.MINUTES);
assertNotNull(FDroidApp.repo.address);
LocalRepoService.runProcess(context, new String[]{context.getPackageName()});
Log.i(TAG, "REPO: " + FDroidApp.repo);
File indexJarFile = LocalRepoManager.get(context).getIndexJar();
assertTrue(indexJarFile.isFile());
localHttpd = new LocalHTTPD(
context,
null,
FDroidApp.port,
LocalRepoManager.get(context).getWebRoot(),
false);
localHttpd.start();
Thread.sleep(100); // give the server some tine to start.
assertTrue(localHttpd.isAlive());
LocalRepoKeyStore localRepoKeyStore = LocalRepoKeyStore.get(context);
Certificate localCert = localRepoKeyStore.getCertificate();
String signingCert = Hasher.hex(localCert);
assertFalse(TextUtils.isEmpty(signingCert));
assertFalse(TextUtils.isEmpty(Utils.calcFingerprint(localCert)));
Repo repoToDelete = RepoProvider.Helper.findByAddress(context, FDroidApp.repo.address);
while (repoToDelete != null) {
Log.d(TAG, "Removing old test swap repo matching this one: " + repoToDelete.address);
RepoProvider.Helper.remove(context, repoToDelete.getId());
repoToDelete = RepoProvider.Helper.findByAddress(context, FDroidApp.repo.address);
}
ContentValues values = new ContentValues(4);
values.put(Schema.RepoTable.Cols.SIGNING_CERT, signingCert);
values.put(Schema.RepoTable.Cols.ADDRESS, FDroidApp.repo.address);
values.put(Schema.RepoTable.Cols.NAME, FDroidApp.repo.name);
values.put(Schema.RepoTable.Cols.IS_SWAP, true);
final String lastEtag = UUID.randomUUID().toString();
values.put(Schema.RepoTable.Cols.LAST_ETAG, lastEtag);
RepoProvider.Helper.insert(context, values);
Repo repo = RepoProvider.Helper.findByAddress(context, FDroidApp.repo.address);
assertTrue(repo.isSwap);
assertNotEquals(-1, repo.getId());
assertTrue(repo.name.startsWith(FDroidApp.repo.name));
assertEquals(lastEtag, repo.lastetag);
assertNull(repo.lastUpdated);
assertTrue(isPortInUse(FDroidApp.ipAddressString, FDroidApp.port));
Thread.sleep(100);
IndexUpdater updater = new IndexUpdater(context, repo);
updater.update();
assertTrue(updater.hasChanged());
repo = RepoProvider.Helper.findByAddress(context, FDroidApp.repo.address);
final Date lastUpdated = repo.lastUpdated;
assertTrue("repo lastUpdated should be updated", new Date(2019, 5, 13).compareTo(repo.lastUpdated) > 0);
App app = AppProvider.Helper.findSpecificApp(context.getContentResolver(),
context.getPackageName(), repo.getId());
assertEquals(context.getPackageName(), app.packageName);
List<Apk> apks = ApkProvider.Helper.findByRepo(context, repo, Schema.ApkTable.Cols.ALL);
assertEquals(1, apks.size());
for (Apk apk : apks) {
Log.i(TAG, "Apk: " + apk);
assertEquals(context.getPackageName(), apk.packageName);
assertEquals(BuildConfig.VERSION_NAME, apk.versionName);
assertEquals(BuildConfig.VERSION_CODE, apk.versionCode);
assertEquals(app.repoId, apk.repoId);
}
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentActivities(mainIntent, 0);
HashSet<String> packageNames = new HashSet<>();
for (ResolveInfo resolveInfo : resolveInfoList) {
if (!isSystemPackage(resolveInfo)) {
Log.i(TAG, "resolveInfo: " + resolveInfo);
packageNames.add(resolveInfo.activityInfo.packageName);
}
}
LocalRepoService.runProcess(context, packageNames.toArray(new String[0]));
updater = new IndexUpdater(context, repo);
updater.update();
assertTrue(updater.hasChanged());
assertTrue("repo lastUpdated should be updated", lastUpdated.compareTo(repo.lastUpdated) < 0);
for (String packageName : packageNames) {
assertNotNull(ApkProvider.Helper.findByPackageName(context, packageName));
}
} finally {
if (localHttpd != null) {
localHttpd.stop();
}
}
if (localHttpd != null) {
assertFalse(localHttpd.isAlive());
}
}
private boolean isPortInUse(String host, int port) {
boolean result = false;
try {
(new Socket(host, port)).close();
result = true;
} catch (IOException e) {
// Could not connect.
e.printStackTrace();
}
return result;
}
private boolean isSystemPackage(ResolveInfo resolveInfo) {
return (resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}
}

View File

@ -0,0 +1,110 @@
package org.fdroid.fdroid.work;
import android.app.Instrumentation;
import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
import androidx.test.filters.LargeTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkInfo;
import com.google.common.util.concurrent.ListenableFuture;
import org.apache.commons.io.FileUtils;
import org.fdroid.fdroid.compat.FileCompatTest;
import org.junit.Rule;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* This test cannot run on Robolectric unfortunately since it does not support
* getting the timestamps from the files completely.
* <p>
* This is marked with {@link LargeTest} because it always fails on the emulator
* tests on GitLab CI. That excludes it from the test run there.
*/
@LargeTest
public class CleanCacheWorkerTest {
public static final String TAG = "CleanCacheWorkerEmulatorTest";
@Rule
public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();
@Rule
public WorkManagerTestRule workManagerTestRule = new WorkManagerTestRule();
@Test
public void testWorkRequest() throws ExecutionException, InterruptedException {
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(CleanCacheWorker.class).build();
workManagerTestRule.workManager.enqueue(request).getResult();
ListenableFuture<WorkInfo> workInfo = workManagerTestRule.workManager.getWorkInfoById(request.getId());
assertEquals(WorkInfo.State.SUCCEEDED, workInfo.get().getState());
}
@Test
public void testClearOldFiles() throws IOException, InterruptedException {
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
File tempDir = FileCompatTest.getWriteableDir(instrumentation);
assertTrue(tempDir.isDirectory());
assertTrue(tempDir.canWrite());
File dir = new File(tempDir, "F-Droid-test.clearOldFiles");
FileUtils.deleteQuietly(dir);
assertTrue(dir.mkdirs());
assertTrue(dir.isDirectory());
File first = new File(dir, "first");
first.deleteOnExit();
File second = new File(dir, "second");
second.deleteOnExit();
assertFalse(first.exists());
assertFalse(second.exists());
assertTrue(first.createNewFile());
assertTrue(first.exists());
Thread.sleep(7000);
assertTrue(second.createNewFile());
assertTrue(second.exists());
CleanCacheWorker.clearOldFiles(dir, 3000); // check all in dir
assertFalse(first.exists());
assertTrue(second.exists());
Thread.sleep(7000);
CleanCacheWorker.clearOldFiles(second, 3000); // check just second file
assertFalse(first.exists());
assertFalse(second.exists());
// make sure it doesn't freak out on a non-existent file
File nonexistent = new File(tempDir, "nonexistent");
CleanCacheWorker.clearOldFiles(nonexistent, 1);
CleanCacheWorker.clearOldFiles(null, 1);
}
/*
// TODO enable this once getImageCacheDir() can be mocked or provide a writable dir in the test
@Test
public void testDeleteOldIcons() throws IOException {
Context context = InstrumentationRegistry.getInstrumentation().getContext();
File imageCacheDir = Utils.getImageCacheDir(context);
imageCacheDir.mkdirs();
assertTrue(imageCacheDir.isDirectory());
File oldIcon = new File(imageCacheDir, "old.png");
assertTrue(oldIcon.createNewFile());
Assume.assumeTrue("test environment must be able to set LastModified time",
oldIcon.setLastModified(System.currentTimeMillis() - (DateUtils.DAY_IN_MILLIS * 370)));
File currentIcon = new File(imageCacheDir, "current.png");
assertTrue(currentIcon.createNewFile());
CleanCacheWorker.deleteOldIcons(context);
assertTrue(currentIcon.exists());
assertFalse(oldIcon.exists());
}
*/
}

View File

@ -0,0 +1,72 @@
/*
* Copyright (C) 2021 Hans-Christoph Steiner <hans@eds.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.fdroid.fdroid.work;
import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
import androidx.test.filters.LargeTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkInfo;
import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import static org.junit.Assert.assertEquals;
/**
* This actually runs {@link FDroidMetricsWorker} on a device/emulator and
* submits a report to https://metrics.cleaninsights.org
* <p>
* This is marked with {@link LargeTest} to exclude it from running on GitLab CI
* because it always fails on the emulator tests there. Also, it actually submits
* a report.
*/
@LargeTest
public class FDroidMetricsWorkerTest {
public static final String TAG = "FDroidMetricsWorkerTest";
@Rule
public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();
@Rule
public WorkManagerTestRule workManagerTestRule = new WorkManagerTestRule();
/**
* A test for easy manual testing.
*/
@Ignore
@Test
public void testGenerateReport() throws IOException {
String json = FDroidMetricsWorker.generateReport(
InstrumentationRegistry.getInstrumentation().getTargetContext());
System.out.println(json);
}
@Test
public void testWorkRequest() throws ExecutionException, InterruptedException {
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(FDroidMetricsWorker.class).build();
workManagerTestRule.workManager.enqueue(request).getResult();
ListenableFuture<WorkInfo> workInfo = workManagerTestRule.workManager.getWorkInfoById(request.getId());
assertEquals(WorkInfo.State.SUCCEEDED, workInfo.get().getState());
}
}

View File

@ -0,0 +1,33 @@
package org.fdroid.fdroid.work;
import android.app.Instrumentation;
import android.content.Context;
import android.util.Log;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.work.Configuration;
import androidx.work.WorkManager;
import androidx.work.testing.SynchronousExecutor;
import androidx.work.testing.WorkManagerTestInitHelper;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
public class WorkManagerTestRule extends TestWatcher {
Context targetContext;
Context testContext;
Configuration configuration;
WorkManager workManager;
@Override
protected void starting(Description description) {
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
targetContext = instrumentation.getTargetContext();
testContext = instrumentation.getContext();
configuration = new Configuration.Builder()
.setMinimumLoggingLevel(Log.DEBUG)
.setExecutor(new SynchronousExecutor())
.build();
WorkManagerTestInitHelper.initializeTestWorkManager(targetContext, configuration);
workManager = WorkManager.getInstance(targetContext);
}
}

View File

@ -1,3 +1,7 @@
-dontoptimize
-dontwarn
-dontobfuscate
-dontwarn android.test.** -dontwarn android.test.**
-dontwarn android.support.test.** -dontwarn android.support.test.**
-dontnote junit.framework.** -dontnote junit.framework.**
@ -14,3 +18,8 @@
-keep class junit.** { *; } -keep class junit.** { *; }
-dontwarn junit.** -dontwarn junit.**
# This is necessary so that RemoteWorkManager can be initialized (also marked with @Keep)
-keep class androidx.work.multiprocess.RemoteWorkManagerClient {
public <init>(...);
}

View File

@ -17,7 +17,7 @@
* MA 02110-1301, USA. * MA 02110-1301, USA.
*/ */
package org.fdroid.fdroid.net.bluetooth; package org.fdroid.fdroid.nearby;
/** /**
* Dummy version for basic app flavor. * Dummy version for basic app flavor.

View File

@ -0,0 +1,5 @@
package org.fdroid.fdroid.nearby;
public class LocalRepoManager {
public static final String[] WEB_ROOT_ASSET_FILES = {};
}

View File

@ -17,7 +17,7 @@
* MA 02110-1301, USA. * MA 02110-1301, USA.
*/ */
package org.fdroid.fdroid.localrepo; package org.fdroid.fdroid.nearby;
import android.content.Context; import android.content.Context;

View File

@ -0,0 +1,30 @@
/*
* Copyright (C) 2018 Hans-Christoph Steiner <hans@eds.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.fdroid.fdroid.nearby;
import android.content.Context;
/**
* Dummy version for basic app flavor.
*/
public class SwapService {
public static void start(Context context) {
}
}

View File

@ -17,12 +17,18 @@
* MA 02110-1301, USA. * MA 02110-1301, USA.
*/ */
package org.fdroid.fdroid.views.swap; package org.fdroid.fdroid.nearby;
import android.content.Context;
import android.net.Uri;
/** /**
* Dummy version for basic app flavor. * Dummy version for basic app flavor.
*/ */
public class SwapWorkflowActivity { public class SwapWorkflowActivity {
public static final String EXTRA_PREVENT_FURTHER_SWAP_REQUESTS = "preventFurtherSwap"; public static final String EXTRA_PREVENT_FURTHER_SWAP_REQUESTS = "preventFurtherSwap";
public static final String EXTRA_CONFIRM = "EXTRA_CONFIRM";
public static void requestSwap(Context context, Uri uri) {
}
} }

View File

@ -0,0 +1,32 @@
/*
* Copyright (C) 2018 Senecto Limited
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.fdroid.fdroid.nearby;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
/**
* Dummy version for basic app flavor.
*/
public class TreeUriScannerIntentService {
public static void onActivityResult(AppCompatActivity activity, Intent intent) {
throw new IllegalStateException("unimplemented");
}
}

View File

@ -17,11 +17,11 @@
* MA 02110-1301, USA. * MA 02110-1301, USA.
*/ */
package org.fdroid.fdroid.net; package org.fdroid.fdroid.nearby;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.support.annotation.Nullable; import androidx.annotation.Nullable;
/** /**
* Dummy version for basic app flavor. * Dummy version for basic app flavor.

View File

@ -17,7 +17,7 @@
* MA 02110-1301, USA. * MA 02110-1301, USA.
*/ */
package org.fdroid.fdroid.localrepo.peers; package org.fdroid.fdroid.nearby.peers;
import org.fdroid.fdroid.data.NewRepoConfig; import org.fdroid.fdroid.data.NewRepoConfig;

View File

@ -17,7 +17,7 @@
* MA 02110-1301, USA. * MA 02110-1301, USA.
*/ */
package org.fdroid.fdroid.views.hiding; package org.fdroid.fdroid.panic;
import android.content.Context; import android.content.Context;

View File

@ -19,11 +19,11 @@
package org.fdroid.fdroid.views.main; package org.fdroid.fdroid.views.main;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.views.PreferencesFragment; import org.fdroid.fdroid.views.PreferencesFragment;
import org.fdroid.fdroid.views.updates.UpdatesViewBinder; import org.fdroid.fdroid.views.updates.UpdatesViewBinder;
@ -49,10 +49,10 @@ class MainViewController extends RecyclerView.ViewHolder {
} }
/** /**
* @see WhatsNewViewBinder * @see LatestViewBinder
*/ */
public void bindWhatsNewView() { public void bindLatestView() {
new WhatsNewViewBinder(activity, frame); new LatestViewBinder(activity, frame);
} }
/** /**

View File

@ -1,10 +1,9 @@
package org.fdroid.fdroid.views.main; package org.fdroid.fdroid.views.main;
import android.app.Activity; import android.content.Context;
import android.content.Intent;
class NearbyViewBinder { class NearbyViewBinder {
static void onActivityResult(Activity activity, Intent data) { public static void updateUsbOtg(Context context) {
throw new IllegalStateException("unimplemented"); throw new IllegalStateException("unimplemented");
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -1,19 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MenuTitle">
<!-- android:title and android:icon are set dynamically in MainActivity -->
<item <item
android:title="@string/main_menu__latest_apps" app:showAsAction="ifRoom|withText"
android:icon="@drawable/ic_latest" android:id="@+id/latest"/>
app:showAsAction="ifRoom|withText"
android:id="@+id/whats_new" />
<item <item
android:title="@string/updates" app:showAsAction="ifRoom|withText"
android:icon="@drawable/ic_updates" android:id="@+id/updates"/>
app:showAsAction="ifRoom|withText"
android:id="@+id/updates" />
<item <item
android:title="@string/menu_settings" app:showAsAction="ifRoom|withText"
android:icon="@drawable/ic_settings" android:id="@+id/settings"/>
app:showAsAction="ifRoom|withText"
android:id="@+id/settings" />
</menu> </menu>

View File

@ -1,30 +1,25 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.preference.PreferenceScreen <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v7.preference.PreferenceScreen android:title="@string/about_title"> <PreferenceScreen android:title="@string/about_title"
<intent android:key="pref_about" />
android:action="android.intent.action.MAIN"
android:targetPackage="@string/applicationId"
android:targetClass="org.fdroid.fdroid.AboutActivity"/>
</android.support.v7.preference.PreferenceScreen>
<android.support.v7.preference.PreferenceCategory android:title="@string/preference_category__my_apps"> <PreferenceCategory android:title="@string/preference_category__my_apps">
<android.support.v7.preference.PreferenceScreen android:title="@string/preference_manage_installed_apps"> <PreferenceScreen android:title="@string/preference_manage_installed_apps">
<intent <intent
android:action="android.intent.action.MAIN" android:action="android.intent.action.MAIN"
android:targetPackage="@string/applicationId" android:targetPackage="@string/applicationId"
android:targetClass="org.fdroid.fdroid.views.installed.InstalledAppsActivity"/> android:targetClass="org.fdroid.fdroid.views.installed.InstalledAppsActivity"/>
</android.support.v7.preference.PreferenceScreen> </PreferenceScreen>
<android.support.v7.preference.PreferenceScreen <PreferenceScreen
android:title="@string/menu_manage" android:title="@string/menu_manage"
android:summary="@string/repositories_summary"> android:summary="@string/repositories_summary">
<intent <intent
android:action="android.intent.action.MAIN" android:action="android.intent.action.MAIN"
android:targetPackage="@string/applicationId" android:targetPackage="@string/applicationId"
android:targetClass="org.fdroid.fdroid.views.ManageReposActivity"/> android:targetClass="org.fdroid.fdroid.views.ManageReposActivity"/>
</android.support.v7.preference.PreferenceScreen> </PreferenceScreen>
<android.support.v7.preference.PreferenceScreen <PreferenceScreen
android:key="installHistory" android:key="installHistory"
android:visible="false" android:visible="false"
android:title="@string/install_history" android:title="@string/install_history"
@ -33,10 +28,10 @@
android:action="android.intent.action.MAIN" android:action="android.intent.action.MAIN"
android:targetPackage="@string/applicationId" android:targetPackage="@string/applicationId"
android:targetClass="org.fdroid.fdroid.views.InstallHistoryActivity"/> android:targetClass="org.fdroid.fdroid.views.InstallHistoryActivity"/>
</android.support.v7.preference.PreferenceScreen> </PreferenceScreen>
</android.support.v7.preference.PreferenceCategory> </PreferenceCategory>
<android.support.v7.preference.PreferenceCategory android:title="@string/updates"> <PreferenceCategory android:title="@string/updates">
<org.fdroid.fdroid.views.LiveSeekBarPreference <org.fdroid.fdroid.views.LiveSeekBarPreference
android:key="overWifi" android:key="overWifi"
android:title="@string/over_wifi" android:title="@string/over_wifi"
@ -47,23 +42,22 @@
android:title="@string/over_data" android:title="@string/over_data"
android:defaultValue="@integer/defaultOverData" android:defaultValue="@integer/defaultOverData"
android:layout="@layout/preference_seekbar"/> android:layout="@layout/preference_seekbar"/>
<SwitchPreference <SwitchPreferenceCompat
android:title="@string/update_auto_download" android:title="@string/update_auto_download"
android:summary="@string/update_auto_download_summary" android:summary="@string/update_auto_download_summary"
android:defaultValue="true"
android:key="updateAutoDownload"/> android:key="updateAutoDownload"/>
<org.fdroid.fdroid.views.LiveSeekBarPreference <org.fdroid.fdroid.views.LiveSeekBarPreference
android:key="updateIntervalSeekBarPosition" android:key="updateIntervalSeekBarPosition"
android:title="@string/update_interval" android:title="@string/update_interval"
android:defaultValue="@integer/defaultUpdateInterval" android:defaultValue="@integer/defaultUpdateInterval"
android:layout="@layout/preference_seekbar"/> android:layout="@layout/preference_seekbar"/>
<SwitchPreference <SwitchPreferenceCompat
android:title="@string/notify" android:title="@string/notify"
android:defaultValue="true" android:defaultValue="true"
android:key="updateNotify"/> android:key="updateNotify"/>
</android.support.v7.preference.PreferenceCategory> </PreferenceCategory>
<android.support.v7.preference.PreferenceCategory android:title="@string/display" <PreferenceCategory android:title="@string/display"
android:key="pref_category_display"> android:key="pref_category_display">
<ListPreference <ListPreference
android:title="@string/pref_language" android:title="@string/pref_language"
@ -74,30 +68,30 @@
android:defaultValue="light" android:defaultValue="light"
android:entries="@array/themeNames" android:entries="@array/themeNames"
android:entryValues="@array/themeValues"/> android:entryValues="@array/themeValues"/>
</android.support.v7.preference.PreferenceCategory> </PreferenceCategory>
<android.support.v7.preference.PreferenceCategory android:title="@string/appcompatibility" <PreferenceCategory android:title="@string/appcompatibility"
android:key="pref_category_appcompatibility"> android:key="pref_category_appcompatibility">
<SwitchPreference <SwitchPreferenceCompat
android:title="@string/show_incompat_versions" android:title="@string/show_incompat_versions"
android:defaultValue="false" android:defaultValue="false"
android:key="incompatibleVersions"/> android:key="incompatibleVersions"/>
<SwitchPreference <SwitchPreferenceCompat
android:title="@string/show_anti_feature_apps" android:title="@string/show_anti_feature_apps"
android:defaultValue="false" android:defaultValue="false"
android:key="showAntiFeatureApps"/> android:key="showAntiFeatureApps"/>
<SwitchPreference <SwitchPreferenceCompat
android:title="@string/force_touch_apps" android:title="@string/force_touch_apps"
android:defaultValue="false" android:defaultValue="false"
android:key="ignoreTouchscreen"/> android:key="ignoreTouchscreen"/>
</android.support.v7.preference.PreferenceCategory> </PreferenceCategory>
<android.support.v7.preference.PreferenceCategory android:title="@string/proxy"> <PreferenceCategory android:title="@string/proxy">
<SwitchPreference <SwitchPreferenceCompat
android:key="useTor" android:key="useTor"
android:summary="@string/useTorSummary" android:summary="@string/useTorSummary"
android:title="@string/useTor"/> android:title="@string/useTor"/>
<SwitchPreference <SwitchPreferenceCompat
android:defaultValue="false" android:defaultValue="false"
android:key="enableProxy" android:key="enableProxy"
android:title="@string/enable_proxy_title" android:title="@string/enable_proxy_title"
@ -112,24 +106,24 @@
android:title="@string/proxy_port" android:title="@string/proxy_port"
android:summary="@string/proxy_port_summary" android:summary="@string/proxy_port_summary"
android:dependency="enableProxy"/> android:dependency="enableProxy"/>
</android.support.v7.preference.PreferenceCategory> </PreferenceCategory>
<android.support.v7.preference.PreferenceCategory <PreferenceCategory
android:key="pref_category_privacy" android:key="pref_category_privacy"
android:title="@string/privacy"> android:title="@string/privacy">
<SwitchPreference <SwitchPreferenceCompat
android:key="promptToSendCrashReports" android:key="promptToSendCrashReports"
android:title="@string/prompt_to_send_crash_reports" android:title="@string/prompt_to_send_crash_reports"
android:summary="@string/prompt_to_send_crash_reports_summary" android:summary="@string/prompt_to_send_crash_reports_summary"
android:defaultValue="true"/> android:defaultValue="true"/>
<SwitchPreference <SwitchPreferenceCompat
android:defaultValue="false" android:defaultValue="false"
android:key="preventScreenshots" android:key="preventScreenshots"
android:summary="@string/preventScreenshots_summary" android:summary="@string/preventScreenshots_summary"
android:title="@string/preventScreenshots_title"/> android:title="@string/preventScreenshots_title"/>
</android.support.v7.preference.PreferenceCategory> </PreferenceCategory>
<android.support.v7.preference.PreferenceCategory <PreferenceCategory
android:title="@string/other" android:title="@string/other"
android:key="pref_category_other"> android:key="pref_category_other">
<ListPreference <ListPreference
@ -138,7 +132,7 @@
android:defaultValue="86400000" android:defaultValue="86400000"
android:entries="@array/keepCacheNames" android:entries="@array/keepCacheNames"
android:entryValues="@array/keepCacheValues"/> android:entryValues="@array/keepCacheValues"/>
<SwitchPreference <SwitchPreferenceCompat
android:title="@string/expert" android:title="@string/expert"
android:defaultValue="false" android:defaultValue="false"
android:key="expert"/> android:key="expert"/>
@ -154,6 +148,12 @@
android:summary="@string/keep_install_history_summary" android:summary="@string/keep_install_history_summary"
android:defaultValue="false" android:defaultValue="false"
android:dependency="expert"/> android:dependency="expert"/>
<CheckBoxPreference
android:key="sendToFdroidMetrics"
android:title="@string/send_to_fdroid_metrics"
android:summary="@string/send_to_fdroid_metrics_summary"
android:defaultValue="false"
android:dependency="expert"/>
<CheckBoxPreference <CheckBoxPreference
android:key="hideAllNotifications" android:key="hideAllNotifications"
android:title="@string/hide_all_notifications" android:title="@string/hide_all_notifications"
@ -178,6 +178,6 @@
android:key="privilegedInstaller" android:key="privilegedInstaller"
android:persistent="false" android:persistent="false"
android:dependency="expert"/> android:dependency="expert"/>
</android.support.v7.preference.PreferenceCategory> </PreferenceCategory>
</android.support.v7.preference.PreferenceScreen> </PreferenceScreen>

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- This file should be outside of release manifest (in this case app/src/mock/Manifest.xml --> <!-- This file should be outside of release manifest (in this case app/src/mock/Manifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!--required to enable/disable system animations from the app itself during Espresso test runs--> <!--required to enable/disable system animations from the app itself during Espresso test runs-->
<uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/> <uses-permission android:name="android.permission.SET_ANIMATION_SCALE" />
</manifest> </manifest>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
* Copyright (C) 2010-2012 Ciaran Gultnieks * Copyright (C) 2010-2012 Ciaran Gultnieks
* Copyright (C) 2013-2017 Peter Serwylo * Copyright (C) 2013-2017 Peter Serwylo
@ -23,112 +24,155 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--> -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.fdroid.fdroid" package="org.fdroid.fdroid"
android:installLocation="auto"> android:installLocation="auto">
<uses-feature android:name="android.hardware.nfc" android:required="false"/> <uses-feature
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/> android:name="android.hardware.nfc"
android:required="false" />
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />
<uses-permission android:name="android.permission.INTERNET"/> <uses-feature
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> android:name="android.hardware.usb.host"
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> android:required="false" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.NFC"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission
android:name="android.permission.USB_PERMISSION"
android:maxSdkVersion="22" /><!-- maybe unnecessary -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application> <application>
<activity <activity
android:label="@string/swap" android:name=".nearby.SwapWorkflowActivity"
android:name=".views.swap.SwapWorkflowActivity" android:configChanges="orientation|keyboardHidden"
android:parentActivityName=".views.main.MainActivity" android:label="@string/swap"
android:theme="@style/SwapTheme.Wizard" android:launchMode="singleTask"
android:screenOrientation="portrait" android:parentActivityName=".views.main.MainActivity"
android:configChanges="orientation|keyboardHidden"> android:screenOrientation="portrait">
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value=".views.main.MainActivity"/> android:value=".views.main.MainActivity" />
</activity> </activity>
<receiver android:name=".receiver.WifiStateChangeReceiver">
<intent-filter>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
</receiver>
<receiver android:name=".receiver.DeviceStorageReceiver">
<intent-filter>
<action android:name="android.intent.action.DEVICE_STORAGE_LOW"/>
</intent-filter>
</receiver>
<service
android:name=".net.WifiStateChangeService"
android:exported="false"/>
<service android:name=".localrepo.SwapService"/>
<service
android:name=".localrepo.CacheSwapAppsService"
android:exported="false"/>
<service
android:name=".localrepo.TreeUriScannerIntentService"
android:exported="false"/>
<service
android:name=".localrepo.SDCardScannerService"
android:exported="false"/>
<activity <activity
android:name=".views.panic.PanicPreferencesActivity" android:name=".panic.PanicPreferencesActivity"
android:label="@string/panic_settings" android:label="@string/panic_settings"
android:parentActivityName=".views.main.MainActivity"> android:parentActivityName=".views.main.MainActivity">
<intent-filter>
<action android:name="info.guardianproject.panic.action.CONNECT" />
<action android:name="info.guardianproject.panic.action.DISCONNECT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value=".views.main.MainActivity"/> android:value=".views.main.MainActivity" />
<intent-filter>
<action android:name="info.guardianproject.panic.action.CONNECT"/>
<action android:name="info.guardianproject.panic.action.DISCONNECT"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity> </activity>
<activity <activity
android:name=".views.panic.PanicResponderActivity" android:name=".panic.SelectInstalledAppsActivity"
android:noHistory="true" android:parentActivityName=".panic.PanicPreferencesActivity" />
android:theme="@android:style/Theme.NoDisplay">
<activity
android:name=".panic.PanicResponderActivity"
android:noHistory="true"
android:theme="@android:style/Theme.NoDisplay">
<!-- this can never have launchMode singleTask or singleInstance! --> <!-- this can never have launchMode singleTask or singleInstance! -->
<intent-filter> <intent-filter>
<action android:name="info.guardianproject.panic.action.TRIGGER"/> <action android:name="info.guardianproject.panic.action.TRIGGER" />
<category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".views.panic.ExitActivity" android:name=".panic.ExitActivity"
android:theme="@android:style/Theme.NoDisplay"/> android:theme="@android:style/Theme.NoDisplay" />
<activity <activity
android:name=".views.hiding.CalculatorActivity" android:name=".panic.CalculatorActivity"
android:enabled="false" android:enabled="false"
android:icon="@mipmap/ic_calculator_launcher" android:icon="@mipmap/ic_calculator_launcher"
android:label="@string/hiding_calculator" android:label="@string/hiding_calculator">
android:theme="@style/AppThemeLight">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<receiver android:name=".nearby.WifiStateChangeReceiver">
<intent-filter>
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
<receiver android:name=".receiver.DeviceStorageReceiver">
<intent-filter>
<action android:name="android.intent.action.DEVICE_STORAGE_LOW" />
</intent-filter>
</receiver>
<receiver android:name=".nearby.UsbDeviceAttachedReceiver">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</receiver>
<receiver android:name=".nearby.UsbDeviceDetachedReceiver">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"
android:resource="@xml/device_filter" />
</receiver>
<receiver android:name=".nearby.UsbDeviceMediaMountedReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_EJECT" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
<data android:scheme="content" />
<data android:scheme="file" />
</intent-filter>
</receiver>
<service
android:name=".nearby.WifiStateChangeService"
android:exported="false" />
<service android:name=".nearby.SwapService" />
<service
android:name=".nearby.LocalRepoService"
android:exported="false" />
<service
android:name=".nearby.TreeUriScannerIntentService"
android:exported="false" />
<service
android:name=".nearby.SDCardScannerService"
android:exported="false" />
</application> </application>

View File

@ -4,12 +4,13 @@ import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.text.TextUtils; import android.text.TextUtils;
import javax.jmdns.ServiceInfo;
import javax.jmdns.impl.util.ByteWrangler;
import java.net.Inet4Address; import java.net.Inet4Address;
import java.net.Inet6Address; import java.net.Inet6Address;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import javax.jmdns.ServiceInfo;
import javax.jmdns.impl.util.ByteWrangler;
/** /**
* The ServiceInfo class needs to be serialized in order to be sent as an Android broadcast. * The ServiceInfo class needs to be serialized in order to be sent as an Android broadcast.
* In order to make it Parcelable (or Serializable for that matter), there are some package-scope * In order to make it Parcelable (or Serializable for that matter), there are some package-scope

View File

@ -113,7 +113,7 @@ public class KeyStoreFileManager {
File keystoreFile = new File(keystorePath); File keystoreFile = new File(keystorePath);
try { try {
if (keystoreFile.exists()) { if (keystoreFile.exists()) {
// I've had some trouble saving new verisons of the keystore file in which the file becomes empty/corrupt. // I've had some trouble saving new versions of the keystore file in which the file becomes empty/corrupt.
// Saving the new version to a new file and creating a backup of the old version. // Saving the new version to a new file and creating a backup of the old version.
File tmpFile = File.createTempFile(keystoreFile.getName(), null, keystoreFile.getParentFile()); File tmpFile = File.createTempFile(keystoreFile.getName(), null, keystoreFile.getParentFile());
FileOutputStream fos = new FileOutputStream(tmpFile); FileOutputStream fos = new FileOutputStream(tmpFile);

View File

@ -1,85 +0,0 @@
package org.fdroid.fdroid.localrepo;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import org.apache.commons.io.FileUtils;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.App;
import java.io.File;
import java.io.IOException;
import java.security.cert.CertificateEncodingException;
/**
* An {@link IntentService} subclass for generating cached info about the installed APKs
* which are available for swapping. It does not cache system apps, since those are
* rarely swapped. This is meant to start running when {@link SwapService} starts.
* <p>
* This could probably be replaced by {@link org.fdroid.fdroid.data.InstalledAppProvider}
* if that contained all of the info to generate complete {@link App} and
* {@link org.fdroid.fdroid.data.Apk} instances.
*/
public class CacheSwapAppsService extends IntentService {
private static final String TAG = "CacheSwapAppsService";
private static final String ACTION_PARSE_APP = "org.fdroid.fdroid.localrepo.action.PARSE_APP";
public CacheSwapAppsService() {
super("CacheSwapAppsService");
}
/**
* Parse the locally installed APK for {@code packageName} and save its XML
* to the APK XML cache.
*/
private static void parseApp(Context context, String packageName) {
Intent intent = new Intent();
intent.setData(Utils.getPackageUri(packageName));
intent.setClass(context, CacheSwapAppsService.class);
intent.setAction(ACTION_PARSE_APP);
context.startService(intent);
}
/**
* Parse all of the locally installed APKs into a memory cache, starting
* with the currently selected apps. APKs that are already parsed in the
* {@code index.jar} file will be read from that file.
*/
public static void startCaching(Context context) {
File indexJarFile = LocalRepoManager.get(context).getIndexJar();
PackageManager pm = context.getPackageManager();
for (ApplicationInfo applicationInfo : pm.getInstalledApplications(0)) {
if (applicationInfo.publicSourceDir.startsWith(FDroidApp.SYSTEM_DIR_NAME)) {
continue;
}
if (!indexJarFile.exists()
|| FileUtils.isFileNewer(new File(applicationInfo.sourceDir), indexJarFile)) {
parseApp(context, applicationInfo.packageName);
}
}
}
@Override
protected void onHandleIntent(Intent intent) {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST);
if (intent == null || !ACTION_PARSE_APP.equals(intent.getAction())) {
Utils.debugLog(TAG, "received bad Intent: " + intent);
return;
}
try {
PackageManager pm = getPackageManager();
String packageName = intent.getData().getSchemeSpecificPart();
App app = App.getInstance(this, pm, packageName);
if (app != null) {
SwapService.putAppInCache(packageName, app);
}
} catch (CertificateEncodingException | IOException | PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}

View File

@ -1,126 +0,0 @@
package org.fdroid.fdroid.localrepo.peers;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import org.fdroid.fdroid.Utils;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Action0;
import rx.subscriptions.Subscriptions;
@SuppressWarnings("LineLength")
final class BluetoothFinder extends PeerFinder {
public static Observable<Peer> createBluetoothObservable(final Context context) {
return Observable.create(new Observable.OnSubscribe<Peer>() {
@Override
public void call(Subscriber<? super Peer> subscriber) {
final BluetoothFinder finder = new BluetoothFinder(context, subscriber);
subscriber.add(Subscriptions.create(new Action0() {
@Override
public void call() {
finder.cancel();
}
}));
finder.scan();
}
});
}
private static final String TAG = "BluetoothFinder";
private final BluetoothAdapter adapter;
private BluetoothFinder(Context context, Subscriber<? super Peer> subscriber) {
super(context, subscriber);
adapter = BluetoothAdapter.getDefaultAdapter();
}
private BroadcastReceiver deviceFoundReceiver;
private BroadcastReceiver scanCompleteReceiver;
private void scan() {
if (adapter == null) {
Log.i(TAG, "Not scanning for bluetooth peers to swap with, couldn't find a bluetooth adapter on this device.");
return;
}
isScanning = true;
if (deviceFoundReceiver == null) {
deviceFoundReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
onDeviceFound(device);
}
}
};
context.registerReceiver(deviceFoundReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));
}
if (scanCompleteReceiver == null) {
scanCompleteReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (isScanning) {
Utils.debugLog(TAG, "Scan complete, but we haven't been asked to stop scanning yet, so will restart scan.");
startDiscovery();
}
}
};
// TODO: Unregister this receiver at the appropriate time.
context.registerReceiver(scanCompleteReceiver, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
}
startDiscovery();
}
private void startDiscovery() {
if (adapter.isDiscovering()) {
// TODO: Can we reset the discovering timeout, so that it doesn't, e.g. time out in 3
// seconds because we had already almost completed the previous scan? We could
// cancelDiscovery(), but then it will probably prompt the user again.
Utils.debugLog(TAG, "Requested bluetooth scan when already scanning, so will ignore request.");
return;
}
if (!adapter.startDiscovery()) {
Log.e(TAG, "Couldn't start bluetooth scanning.");
}
}
private void cancel() {
if (adapter != null) {
Utils.debugLog(TAG, "Stopping bluetooth discovery.");
adapter.cancelDiscovery();
}
isScanning = false;
}
private void onDeviceFound(BluetoothDevice device) {
if (device != null && device.getName() != null &&
(device.getBluetoothClass().getDeviceClass() == BluetoothClass.Device.COMPUTER_HANDHELD_PC_PDA ||
device.getBluetoothClass().getDeviceClass() == BluetoothClass.Device.COMPUTER_PALM_SIZE_PC_PDA ||
device.getBluetoothClass().getDeviceClass() == BluetoothClass.Device.PHONE_SMART)) {
subscriber.onNext(new BluetoothPeer(device));
}
}
}

View File

@ -1,162 +0,0 @@
package org.fdroid.fdroid.localrepo.peers;
import android.content.Context;
import android.net.wifi.WifiManager;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Utils;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Action0;
import rx.subscriptions.Subscriptions;
import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceInfo;
import javax.jmdns.ServiceListener;
import java.io.IOException;
import java.net.InetAddress;
@SuppressWarnings("LineLength")
final class BonjourFinder extends PeerFinder implements ServiceListener {
public static Observable<Peer> createBonjourObservable(final Context context) {
return Observable.create(new Observable.OnSubscribe<Peer>() {
@Override
public void call(Subscriber<? super Peer> subscriber) {
final BonjourFinder finder = new BonjourFinder(context, subscriber);
subscriber.add(Subscriptions.create(new Action0() {
@Override
public void call() {
finder.cancel();
}
}));
finder.scan();
}
});
}
private static final String TAG = "BonjourFinder";
private static final String HTTP_SERVICE_TYPE = "_http._tcp.local.";
private static final String HTTPS_SERVICE_TYPE = "_https._tcp.local.";
private JmDNS jmdns;
private WifiManager wifiManager;
private WifiManager.MulticastLock multicastLock;
private BonjourFinder(Context context, Subscriber<? super Peer> subscriber) {
super(context, subscriber);
}
private void scan() {
Utils.debugLog(TAG, "Requested Bonjour (mDNS) scan for peers.");
if (wifiManager == null) {
wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
multicastLock = wifiManager.createMulticastLock(context.getPackageName());
multicastLock.setReferenceCounted(false);
}
if (isScanning) {
Utils.debugLog(TAG, "Requested Bonjour scan, but already scanning. But we will still try to explicitly scan for services.");
return;
}
isScanning = true;
multicastLock.acquire();
try {
Utils.debugLog(TAG, "Searching for Bonjour (mDNS) clients...");
jmdns = JmDNS.create(InetAddress.getByName(FDroidApp.ipAddressString));
} catch (IOException e) {
subscriber.onError(e);
return;
}
Utils.debugLog(TAG, "Adding mDNS service listeners for " + HTTP_SERVICE_TYPE + " and " + HTTPS_SERVICE_TYPE);
jmdns.addServiceListener(HTTP_SERVICE_TYPE, this);
jmdns.addServiceListener(HTTPS_SERVICE_TYPE, this);
listServices();
}
private void listServices() {
Utils.debugLog(TAG, "Explicitly querying for services, in addition to waiting for notifications.");
addFDroidServices(jmdns.list(HTTP_SERVICE_TYPE));
addFDroidServices(jmdns.list(HTTPS_SERVICE_TYPE));
}
@Override
public void serviceRemoved(ServiceEvent event) {
}
@Override
public void serviceAdded(final ServiceEvent event) {
// TODO: Get clarification, but it looks like this is:
// 1) Identifying that there is _a_ bonjour service available
// 2) Adding it to the list to give some sort of feedback to the user
// 3) Requesting more detailed info in an async manner
// 4) If that is in fact an fdroid repo (after requesting info), then add it again
// so that more detailed info can be shown to the user.
//
// If so, when is the old one removed?
addFDroidService(event.getInfo());
Utils.debugLog(TAG, "Found JmDNS service, now requesting further details of service");
jmdns.requestServiceInfo(event.getType(), event.getName(), true);
}
@Override
public void serviceResolved(ServiceEvent event) {
addFDroidService(event.getInfo());
}
private void addFDroidServices(ServiceInfo[] services) {
for (ServiceInfo info : services) {
addFDroidService(info);
}
}
/**
* Broadcasts the fact that a Bonjour peer was found to swap with.
* Checks that the service is an F-Droid service, and also that it is not the F-Droid service
* for this device (by comparing its signing fingerprint to our signing fingerprint).
*/
private void addFDroidService(ServiceInfo serviceInfo) {
final String type = serviceInfo.getPropertyString("type");
final String fingerprint = serviceInfo.getPropertyString("fingerprint");
final boolean isFDroid = type != null && type.startsWith("fdroidrepo");
final boolean isSelf = FDroidApp.repo != null && fingerprint != null && fingerprint.equalsIgnoreCase(FDroidApp.repo.fingerprint);
if (isFDroid && !isSelf) {
Utils.debugLog(TAG, "Found F-Droid swap Bonjour service:\n" + serviceInfo);
subscriber.onNext(new BonjourPeer(serviceInfo));
} else {
if (isSelf) {
Utils.debugLog(TAG, "Ignoring Bonjour service because it belongs to this device:\n" + serviceInfo);
} else {
Utils.debugLog(TAG, "Ignoring Bonjour service because it doesn't look like an F-Droid swap repo:\n" + serviceInfo);
}
}
}
private void cancel() {
Utils.debugLog(TAG, "Cancelling BonjourFinder, releasing multicast lock, removing jmdns service listeners");
if (multicastLock != null) {
multicastLock.release();
}
isScanning = false;
if (jmdns == null) {
return;
}
jmdns.removeServiceListener(HTTP_SERVICE_TYPE, this);
jmdns.removeServiceListener(HTTPS_SERVICE_TYPE, this);
jmdns = null;
}
}

View File

@ -1,19 +0,0 @@
package org.fdroid.fdroid.localrepo.peers;
import android.os.Parcelable;
import android.support.annotation.DrawableRes;
public interface Peer extends Parcelable {
String getName();
@DrawableRes int getIcon();
boolean equals(Object peer);
String getRepoAddress();
String getFingerprint();
boolean shouldPromptForSwapBack();
}

View File

@ -1,31 +0,0 @@
package org.fdroid.fdroid.localrepo.peers;
import android.content.Context;
import rx.Observable;
import rx.Subscriber;
import rx.schedulers.Schedulers;
/**
* Searches for other devices in the vicinity, using specific technologies.
* Once found, emits a {@link Peer} to interested {@link Subscriber}s.
*/
public abstract class PeerFinder {
protected boolean isScanning;
protected final Context context;
protected final Subscriber<? super Peer> subscriber;
protected PeerFinder(Context context, Subscriber<? super Peer> subscriber) {
this.context = context;
this.subscriber = subscriber;
}
public static Observable<Peer> createObservable(final Context context) {
return Observable.merge(
BluetoothFinder.createBluetoothObservable(context).subscribeOn(Schedulers.newThread()),
BonjourFinder.createBonjourObservable(context).subscribeOn(Schedulers.newThread())
);
}
}

View File

@ -1,186 +0,0 @@
package org.fdroid.fdroid.localrepo.type;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.localrepo.SwapService;
import org.fdroid.fdroid.net.bluetooth.BluetoothServer;
@SuppressWarnings("LineLength")
public final class BluetoothSwap extends SwapType {
private static final String TAG = "BluetoothSwap";
public static final String BLUETOOTH_NAME_TAG = "FDroid:";
private static BluetoothSwap mInstance;
@NonNull
private final BluetoothAdapter adapter;
private boolean isDiscoverable;
@Nullable
private BluetoothServer server;
private String deviceBluetoothName;
public static SwapType create(@NonNull Context context) {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null) {
return new NoBluetoothType(context);
}
if (mInstance == null) {
mInstance = new BluetoothSwap(context, adapter);
}
return mInstance;
}
private BluetoothSwap(@NonNull Context context, @NonNull BluetoothAdapter adapter) {
super(context);
this.adapter = adapter;
}
@Override
public boolean isDiscoverable() {
return isDiscoverable;
}
@Override
public boolean isConnected() {
return server != null && server.isRunning() && super.isConnected();
}
@Override
public synchronized void start() {
if (isConnected()) {
Utils.debugLog(TAG, "already running, quitting start()");
return;
}
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, -1)) {
case BluetoothAdapter.SCAN_MODE_NONE:
setConnected(false);
break;
case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
isDiscoverable = true;
if (server != null && server.isRunning()) {
setConnected(true);
}
break;
// Only other is BluetoothAdapter.SCAN_MODE_CONNECTABLE. For now don't handle that.
}
}
};
context.registerReceiver(receiver, new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED));
/*
if (server != null) {
Utils.debugLog(TAG, "Attempting to start Bluetooth swap, but it appears to be running already. Will cancel it so it can be restarted.");
server.close();
server = null;
}*/
if (server == null) {
server = new BluetoothServer(this, context.getFilesDir());
}
sendBroadcast(SwapService.EXTRA_STARTING);
//store the original bluetoothname, and update this one to be unique
deviceBluetoothName = adapter.getName();
/*
Utils.debugLog(TAG, "Prefixing Bluetooth adapter name with " + BLUETOOTH_NAME_TAG + " to make it identifiable as a swap device.");
if (!deviceBluetoothName.startsWith(BLUETOOTH_NAME_TAG)) {
adapter.setName(BLUETOOTH_NAME_TAG + deviceBluetoothName);
}
if (!adapter.getName().startsWith(BLUETOOTH_NAME_TAG)) {
Log.e(TAG, "Couldn't change the name of the Bluetooth adapter, it will not get recognized by other swap clients.");
// TODO: Should we bail here?
}*/
if (!adapter.isEnabled()) {
Utils.debugLog(TAG, "Bluetooth adapter is disabled, attempting to enable.");
if (!adapter.enable()) {
Utils.debugLog(TAG, "Could not enable Bluetooth adapter, so bailing out of Bluetooth swap.");
setConnected(false);
return;
}
}
if (adapter.isEnabled()) {
setConnected(true);
} else {
Log.i(TAG, "Didn't start Bluetooth swapping server, because Bluetooth is disabled and couldn't be enabled.");
setConnected(false);
}
}
/**
* Don't try to start BT in the background. you can only start/stop a BT server once, else new connections don't work.
*/
@Override
public void stopInBackground() {
stop();
}
@Override
public void stop() {
if (server != null && server.isAlive()) {
server.close();
setConnected(false);
/*
if (receiver != null) {
context.unregisterReceiver(receiver);
receiver = null;
}
*/
} else {
Log.i(TAG, "Attempting to stop Bluetooth swap, but it is not currently running.");
}
}
protected void onStopped() {
Utils.debugLog(TAG, "Resetting bluetooth device name to " + deviceBluetoothName + " after swapping.");
adapter.setName(deviceBluetoothName);
}
@Override
public String getBroadcastAction() {
return SwapService.BLUETOOTH_STATE_CHANGE;
}
private static class NoBluetoothType extends SwapType {
NoBluetoothType(@NonNull Context context) {
super(context);
}
@Override
public void start() {
}
@Override
public void stop() {
}
@Override
protected String getBroadcastAction() {
return null;
}
}
}

View File

@ -1,112 +0,0 @@
package org.fdroid.fdroid.localrepo.type;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.Log;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.localrepo.SwapService;
import javax.jmdns.JmDNS;
import javax.jmdns.ServiceInfo;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
/**
* Sends a {@link SwapService#BONJOUR_STATE_CHANGE} broadcasts when starting, started or stopped.
*/
public class BonjourBroadcast extends SwapType {
private static final String TAG = "BonjourBroadcast";
private JmDNS jmdns;
private ServiceInfo pairService;
public BonjourBroadcast(Context context) {
super(context);
}
@Override
public void start() {
Utils.debugLog(TAG, "Preparing to start Bonjour service.");
sendBroadcast(SwapService.EXTRA_STARTING);
InetAddress address = getDeviceAddress();
if (address == null) {
Log.e(TAG, "Starting Bonjour service, but couldn't ascertain IP address."
+ " Seems we are not connected to a network.");
return;
}
/*
* a ServiceInfo can only be registered with a single instance
* of JmDNS, and there is only ever a single LocalHTTPD port to
* advertise anyway.
*/
if (pairService != null || jmdns != null) {
clearCurrentMDNSService();
}
String repoName = Preferences.get().getLocalRepoName();
HashMap<String, String> values = new HashMap<>();
values.put("path", "/fdroid/repo");
values.put("name", repoName);
values.put("fingerprint", FDroidApp.repo.fingerprint);
String type;
if (Preferences.get().isLocalRepoHttpsEnabled()) {
values.put("type", "fdroidrepos");
type = "_https._tcp.local.";
} else {
values.put("type", "fdroidrepo");
type = "_http._tcp.local.";
}
try {
Utils.debugLog(TAG, "Starting bonjour service...");
pairService = ServiceInfo.create(type, repoName, FDroidApp.port, 0, 0, values);
jmdns = JmDNS.create(address);
jmdns.registerService(pairService);
setConnected(true);
Utils.debugLog(TAG, "... Bounjour service started.");
} catch (IOException e) {
Log.e(TAG, "Error while registering jmdns service", e);
setConnected(false);
}
}
@Override
public void stop() {
Utils.debugLog(TAG, "Unregistering MDNS service...");
clearCurrentMDNSService();
setConnected(false);
}
private void clearCurrentMDNSService() {
if (jmdns != null) {
jmdns.unregisterAllServices();
Utils.closeQuietly(jmdns);
pairService = null;
jmdns = null;
}
}
@Override
public String getBroadcastAction() {
return SwapService.BONJOUR_STATE_CHANGE;
}
@Nullable
private InetAddress getDeviceAddress() {
if (FDroidApp.ipAddressString != null) {
try {
return InetAddress.getByName(FDroidApp.ipAddressString);
} catch (UnknownHostException ignored) {
}
}
return null;
}
}

View File

@ -1,109 +0,0 @@
package org.fdroid.fdroid.localrepo.type;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.support.v4.content.LocalBroadcastManager;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.localrepo.SwapService;
/**
* There is lots of common functionality, and a common API among different communication protocols
* associated with the swap process. This includes Bluetooth visability, Bonjour visability,
* and the web server which serves info for swapping. This class provides a common API for
* starting and stopping these services. In addition, it helps with the process of sending broadcast
* intents in response to the thing starting or stopping.
*/
public abstract class SwapType {
private static final String TAG = "SwapType";
private boolean isConnected;
@NonNull
protected final Context context;
public SwapType(@NonNull Context context) {
this.context = context;
}
public abstract void start();
public abstract void stop();
protected abstract String getBroadcastAction();
public boolean isDiscoverable() {
return isConnected();
}
protected final void setConnected(boolean connected) {
if (connected) {
isConnected = true;
sendBroadcast(SwapService.EXTRA_STARTED);
} else {
isConnected = false;
onStopped();
sendBroadcast(SwapService.EXTRA_STOPPED);
}
}
protected void onStopped() { }
/**
* Sends either a {@link org.fdroid.fdroid.localrepo.SwapService#EXTRA_STARTING},
* {@link org.fdroid.fdroid.localrepo.SwapService#EXTRA_STARTED} or
* {@link org.fdroid.fdroid.localrepo.SwapService#EXTRA_STOPPED} broadcast.
*/
protected final void sendBroadcast(String extra) {
if (getBroadcastAction() != null) {
Intent intent = new Intent(getBroadcastAction());
intent.putExtra(extra, true);
Utils.debugLog(TAG, "Sending broadcast " + extra + " from " + getClass().getSimpleName());
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
}
public boolean isConnected() {
return isConnected;
}
public void startInBackground() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
start();
return null;
}
}.execute();
}
private void ensureRunning() {
if (!isConnected()) {
start();
}
}
public void ensureRunningInBackground() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
ensureRunning();
return null;
}
}.execute();
}
public void stopInBackground() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
stop();
return null;
}
}.execute();
}
}

View File

@ -1,181 +0,0 @@
package org.fdroid.fdroid.localrepo.type;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.localrepo.SwapService;
import org.fdroid.fdroid.net.LocalHTTPD;
import org.fdroid.fdroid.net.WifiStateChangeService;
import rx.Single;
import rx.SingleSubscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func2;
import rx.schedulers.Schedulers;
import java.io.IOException;
import java.net.BindException;
import java.util.Random;
@SuppressWarnings("LineLength")
public class WifiSwap extends SwapType {
private static final String TAG = "WifiSwap";
private Handler webServerThreadHandler;
private LocalHTTPD localHttpd;
private final BonjourBroadcast bonjourBroadcast;
private final WifiManager wifiManager;
public WifiSwap(Context context, WifiManager wifiManager) {
super(context);
bonjourBroadcast = new BonjourBroadcast(context);
this.wifiManager = wifiManager;
}
protected String getBroadcastAction() {
return SwapService.WIFI_STATE_CHANGE;
}
public BonjourBroadcast getBonjour() {
return bonjourBroadcast;
}
@Override
public void start() {
wifiManager.setWifiEnabled(true);
Utils.debugLog(TAG, "Preparing swap webserver.");
sendBroadcast(SwapService.EXTRA_STARTING);
if (FDroidApp.ipAddressString == null) {
Log.e(TAG, "Not starting swap webserver, because we don't seem to be connected to a network.");
setConnected(false);
}
Single.zip(
Single.create(getWebServerTask()),
Single.create(getBonjourTask()),
new Func2<Boolean, Boolean, Boolean>() {
@Override
public Boolean call(Boolean webServerTask, Boolean bonjourServiceTask) {
return bonjourServiceTask && webServerTask;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean success) {
setConnected(success);
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
setConnected(false);
}
});
}
/**
* A task which starts the {@link WifiSwap#bonjourBroadcast} and then emits a `true` value at
* the end.
*/
private Single.OnSubscribe<Boolean> getBonjourTask() {
return new Single.OnSubscribe<Boolean>() {
@Override
public void call(SingleSubscriber<? super Boolean> singleSubscriber) {
bonjourBroadcast.start();
// TODO: Be more intelligent about failures here so that we can invoke
// singleSubscriber.onError() in the appropriate circumstances.
singleSubscriber.onSuccess(true);
}
};
}
/**
* Constructs a new {@link Thread} for the webserver to run on. If successful, it will also
* populate the webServerThreadHandler property and bind it to that particular thread. This
* allows messages to be sent to the webserver thread by posting messages to that handler.
*/
private Single.OnSubscribe<Boolean> getWebServerTask() {
return new Single.OnSubscribe<Boolean>() {
@Override
public void call(final SingleSubscriber<? super Boolean> singleSubscriber) {
new Thread(new Runnable() {
// Tell Eclipse this is not a leak because of Looper use.
@SuppressLint("HandlerLeak")
@Override
public void run() {
localHttpd = new LocalHTTPD(
context,
FDroidApp.ipAddressString,
FDroidApp.port,
context.getFilesDir(),
Preferences.get().isLocalRepoHttpsEnabled());
Looper.prepare(); // must be run before creating a Handler
webServerThreadHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(TAG, "we've been asked to stop the webserver: " + msg.obj);
localHttpd.stop();
Looper looper = Looper.myLooper();
if (looper == null) {
Log.e(TAG, "Looper.myLooper() was null for sum reason while shutting down the swap webserver.");
} else {
looper.quit();
}
}
};
try {
Utils.debugLog(TAG, "Starting swap webserver...");
localHttpd.start();
Utils.debugLog(TAG, "Swap webserver started.");
singleSubscriber.onSuccess(true);
} catch (BindException e) {
int prev = FDroidApp.port;
FDroidApp.port = FDroidApp.port + new Random().nextInt(1111);
WifiStateChangeService.start(context, null);
singleSubscriber.onError(new Exception("port " + prev + " occupied, trying on " + FDroidApp.port + "!"));
} catch (IOException e) {
Log.e(TAG, "Could not start local repo HTTP server", e);
singleSubscriber.onError(e);
}
Looper.loop(); // start the message receiving loop
}
}).start();
}
};
}
@Override
public void stop() {
sendBroadcast(SwapService.EXTRA_STOPPING);
if (webServerThreadHandler == null) {
Log.i(TAG, "null handler in stopWebServer");
} else {
Utils.debugLog(TAG, "Sending message to swap webserver to stop it.");
Message msg = webServerThreadHandler.obtainMessage();
msg.obj = webServerThreadHandler.getLooper().getThread().getName() + " says stop";
webServerThreadHandler.sendMessage(msg);
}
// Stop the Bonjour stuff after asking the webserver to stop. This is not required in this
// order, but it helps. In practice, the Bonjour stuff takes a second or two to stop. This
// should give enough time for the message we posted above to reach the web server thread
// and for the webserver to thus be stopped.
bonjourBroadcast.stop();
setConnected(false);
}
}

View File

@ -0,0 +1,32 @@
package org.fdroid.fdroid.nearby;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import java.io.IOException;
public class BluetoothClient {
private static final String TAG = "BluetoothClient";
private final BluetoothDevice device;
public BluetoothClient(String macAddress) {
device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(macAddress);
}
public BluetoothConnection openConnection() throws IOException {
BluetoothConnection connection = null;
try {
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(BluetoothConstants.fdroidUuid());
connection = new BluetoothConnection(socket);
connection.open();
return connection;
} finally {
if (connection != null) {
connection.closeQuietly();
}
}
}
}

View File

@ -0,0 +1,179 @@
package org.fdroid.fdroid.nearby;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.Process;
import android.text.TextUtils;
import android.util.Log;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.nearby.peers.BluetoothPeer;
import java.lang.ref.WeakReference;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
/**
* Manage the {@link android.bluetooth.BluetoothAdapter}in a {@link HandlerThread}.
* The start process is in {@link HandlerThread#onLooperPrepared()} so that it is
* always started before any messages get delivered from the queue.
*
* @see BonjourManager
* @see LocalRepoManager
*/
public class BluetoothManager {
private static final String TAG = "BluetoothManager";
public static final String ACTION_FOUND = "BluetoothNewPeer";
public static final String EXTRA_PEER = "extraBluetoothPeer";
public static final String ACTION_STATUS = "BluetoothStatus";
public static final String EXTRA_STATUS = "BluetoothStatusExtra";
public static final int STATUS_STARTING = 0;
public static final int STATUS_STARTED = 1;
public static final int STATUS_STOPPING = 2;
public static final int STATUS_STOPPED = 3;
public static final int STATUS_ERROR = 0xffff;
private static final int STOP = 5709;
private static WeakReference<Context> context;
private static Handler handler;
private static volatile HandlerThread handlerThread;
private static BluetoothAdapter bluetoothAdapter;
/**
* Stops the Bluetooth adapter, triggering a status broadcast via {@link #ACTION_STATUS}.
* {@link #STATUS_STOPPED} can be broadcast multiple times for the same session,
* so make sure {@link android.content.BroadcastReceiver}s handle duplicates.
*/
public static void stop(Context context) {
BluetoothManager.context = new WeakReference<>(context);
if (handler == null || handlerThread == null || !handlerThread.isAlive()) {
Log.w(TAG, "handlerThread is already stopped, doing nothing!");
sendBroadcast(STATUS_STOPPED, null);
return;
}
sendBroadcast(STATUS_STOPPING, null);
handler.sendEmptyMessage(STOP);
}
/**
* Starts the service, triggering a status broadcast via {@link #ACTION_STATUS}.
* {@link #STATUS_STARTED} can be broadcast multiple times for the same session,
* so make sure {@link android.content.BroadcastReceiver}s handle duplicates.
*/
public static void start(final Context context) {
BluetoothManager.context = new WeakReference<>(context);
if (handlerThread != null && handlerThread.isAlive()) {
sendBroadcast(STATUS_STARTED, null);
return;
}
sendBroadcast(STATUS_STARTING, null);
final BluetoothServer bluetoothServer = new BluetoothServer(context.getFilesDir());
handlerThread = new HandlerThread("BluetoothManager", Process.THREAD_PRIORITY_LESS_FAVORABLE) {
@Override
protected void onLooperPrepared() {
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
localBroadcastManager.registerReceiver(bluetoothDeviceFound,
new IntentFilter(BluetoothDevice.ACTION_FOUND));
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String name = bluetoothAdapter.getName();
if (name != null) {
SwapService.putBluetoothNameBeforeSwap(name);
}
if (!bluetoothAdapter.enable()) {
sendBroadcast(STATUS_ERROR, context.getString(R.string.swap_error_cannot_start_bluetooth));
return;
}
bluetoothServer.start();
if (bluetoothAdapter.startDiscovery()) {
sendBroadcast(STATUS_STARTED, null);
} else {
sendBroadcast(STATUS_ERROR, context.getString(R.string.swap_error_cannot_start_bluetooth));
}
for (BluetoothDevice device : bluetoothAdapter.getBondedDevices()) {
sendFoundBroadcast(context, device);
}
}
};
handlerThread.start();
handler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
localBroadcastManager.unregisterReceiver(bluetoothDeviceFound);
bluetoothServer.close();
if (bluetoothAdapter != null) {
bluetoothAdapter.cancelDiscovery();
if (!SwapService.wasBluetoothEnabledBeforeSwap()) {
bluetoothAdapter.disable();
}
String name = SwapService.getBluetoothNameBeforeSwap();
if (name != null) {
bluetoothAdapter.setName(name);
}
}
handlerThread.quit();
handlerThread = null;
sendBroadcast(STATUS_STOPPED, null);
}
};
}
public static void restart(Context context) {
stop(context);
try {
handlerThread.join(10000);
} catch (InterruptedException | NullPointerException e) {
// ignored
}
start(context);
}
public static void setName(Context context, String name) {
// TODO
}
public static boolean isAlive() {
return handlerThread != null && handlerThread.isAlive();
}
private static void sendBroadcast(int status, String message) {
Intent intent = new Intent(ACTION_STATUS);
intent.putExtra(EXTRA_STATUS, status);
if (!TextUtils.isEmpty(message)) {
intent.putExtra(Intent.EXTRA_TEXT, message);
}
LocalBroadcastManager.getInstance(context.get()).sendBroadcast(intent);
}
private static final BroadcastReceiver bluetoothDeviceFound = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
sendFoundBroadcast(context, (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE));
}
};
private static void sendFoundBroadcast(Context context, BluetoothDevice device) {
BluetoothPeer bluetoothPeer = BluetoothPeer.getInstance(device);
if (bluetoothPeer == null) {
Utils.debugLog(TAG, "IGNORING: " + device);
return;
}
Intent intent = new Intent(ACTION_FOUND);
intent.putExtra(EXTRA_PEER, bluetoothPeer);
intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
}

View File

@ -1,15 +1,14 @@
package org.fdroid.fdroid.net.bluetooth; package org.fdroid.fdroid.nearby;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket; import android.bluetooth.BluetoothSocket;
import android.util.Log; import android.util.Log;
import android.webkit.MimeTypeMap; import android.webkit.MimeTypeMap;
import fi.iki.elonen.NanoHTTPD;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.localrepo.type.BluetoothSwap; import org.fdroid.fdroid.nearby.httpish.Request;
import org.fdroid.fdroid.net.bluetooth.httpish.Request; import org.fdroid.fdroid.nearby.httpish.Response;
import org.fdroid.fdroid.net.bluetooth.httpish.Response;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -21,6 +20,8 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import fi.iki.elonen.NanoHTTPD;
/** /**
* Act as a layer on top of LocalHTTPD server, by forwarding requests served * Act as a layer on top of LocalHTTPD server, by forwarding requests served
* over bluetooth to that server. * over bluetooth to that server.
@ -34,18 +35,9 @@ public class BluetoothServer extends Thread {
private final List<ClientConnection> clients = new ArrayList<>(); private final List<ClientConnection> clients = new ArrayList<>();
private final File webRoot; private final File webRoot;
private final BluetoothSwap swap;
private boolean isRunning;
public BluetoothServer(BluetoothSwap swap, File webRoot) { public BluetoothServer(File webRoot) {
this.webRoot = webRoot; this.webRoot = webRoot;
this.swap = swap;
start();
}
public boolean isRunning() {
return isRunning;
} }
public void close() { public void close() {
@ -64,15 +56,12 @@ public class BluetoothServer extends Thread {
@Override @Override
public void run() { public void run() {
isRunning = true;
final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
try { try {
serverSocket = adapter.listenUsingInsecureRfcommWithServiceRecord("FDroid App Swap", BluetoothConstants.fdroidUuid()); serverSocket = adapter.listenUsingInsecureRfcommWithServiceRecord("FDroid App Swap", BluetoothConstants.fdroidUuid());
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, "Error starting Bluetooth server socket, will stop the server now", e); Log.e(TAG, "Error starting Bluetooth server socket, will stop the server now", e);
swap.stop();
isRunning = false;
return; return;
} }
@ -102,7 +91,6 @@ public class BluetoothServer extends Thread {
Log.e(TAG, "Error receiving client connection over Bluetooth server socket, will continue listening for other clients", e); Log.e(TAG, "Error receiving client connection over Bluetooth server socket, will continue listening for other clients", e);
} }
} }
isRunning = false;
} }
private static class ClientConnection extends Thread { private static class ClientConnection extends Thread {

View File

@ -0,0 +1,287 @@
package org.fdroid.fdroid.nearby;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.Process;
import android.text.TextUtils;
import android.util.Log;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.nearby.peers.BonjourPeer;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.InetAddress;
import java.util.HashMap;
import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceInfo;
import javax.jmdns.ServiceListener;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
/**
* Manage {@link JmDNS} in a {@link HandlerThread}. The start process is in
* {@link HandlerThread#onLooperPrepared()} so that it is always started before
* any messages get delivered from the queue.
*/
public class BonjourManager {
private static final String TAG = "BonjourManager";
public static final String ACTION_FOUND = "BonjourNewPeer";
public static final String ACTION_REMOVED = "BonjourPeerRemoved";
public static final String EXTRA_BONJOUR_PEER = "extraBonjourPeer";
public static final String ACTION_STATUS = "BonjourStatus";
public static final String EXTRA_STATUS = "BonjourStatusExtra";
public static final int STATUS_STARTING = 0;
public static final int STATUS_STARTED = 1;
public static final int STATUS_STOPPING = 2;
public static final int STATUS_STOPPED = 3;
public static final int STATUS_VISIBLE = 4;
public static final int STATUS_NOT_VISIBLE = 5;
public static final int STATUS_ERROR = 0xffff;
public static final String HTTP_SERVICE_TYPE = "_http._tcp.local.";
public static final String HTTPS_SERVICE_TYPE = "_https._tcp.local.";
private static final int STOP = 5709;
private static final int VISIBLE = 4151873;
private static final int NOT_VISIBLE = 144151873;
private static WeakReference<Context> context;
private static Handler handler;
private static volatile HandlerThread handlerThread;
private static ServiceInfo pairService;
private static JmDNS jmdns;
private static WifiManager.MulticastLock multicastLock;
public static boolean isAlive() {
return handlerThread != null && handlerThread.isAlive();
}
/**
* Stops the Bonjour/mDNS, triggering a status broadcast via {@link #ACTION_STATUS}.
* {@link #STATUS_STOPPED} can be broadcast multiple times for the same session,
* so make sure {@link android.content.BroadcastReceiver}s handle duplicates.
*/
public static void stop(Context context) {
BonjourManager.context = new WeakReference<>(context);
if (handler == null || handlerThread == null || !handlerThread.isAlive()) {
sendBroadcast(STATUS_STOPPED, null);
return;
}
sendBroadcast(STATUS_STOPPING, null);
handler.sendEmptyMessage(STOP);
}
public static void setVisible(Context context, boolean visible) {
BonjourManager.context = new WeakReference<>(context);
if (handler == null || handlerThread == null || !handlerThread.isAlive()) {
Log.e(TAG, "handlerThread is stopped, not changing visibility!");
return;
}
if (visible) {
handler.sendEmptyMessage(VISIBLE);
} else {
handler.sendEmptyMessage(NOT_VISIBLE);
}
}
/**
* Starts the service, triggering a status broadcast via {@link #ACTION_STATUS}.
* {@link #STATUS_STARTED} can be broadcast multiple times for the same session,
* so make sure {@link android.content.BroadcastReceiver}s handle duplicates.
*/
public static void start(Context context) {
start(context,
Preferences.get().getLocalRepoName(),
Preferences.get().isLocalRepoHttpsEnabled(),
httpServiceListener, httpsServiceListener);
}
/**
* Testable version, not for regular use.
*
* @see #start(Context)
*/
static void start(final Context context,
final String localRepoName, final boolean useHttps,
final ServiceListener httpServiceListener, final ServiceListener httpsServiceListener) {
BonjourManager.context = new WeakReference<>(context);
if (handlerThread != null && handlerThread.isAlive()) {
sendBroadcast(STATUS_STARTED, null);
return;
}
sendBroadcast(STATUS_STARTING, null);
final WifiManager wifiManager = ContextCompat.getSystemService(context, WifiManager.class);
handlerThread = new HandlerThread("BonjourManager", Process.THREAD_PRIORITY_LESS_FAVORABLE) {
@Override
protected void onLooperPrepared() {
try {
InetAddress address = InetAddress.getByName(FDroidApp.ipAddressString);
jmdns = JmDNS.create(address);
jmdns.addServiceListener(HTTP_SERVICE_TYPE, httpServiceListener);
jmdns.addServiceListener(HTTPS_SERVICE_TYPE, httpsServiceListener);
multicastLock = wifiManager.createMulticastLock(context.getPackageName());
multicastLock.setReferenceCounted(false);
multicastLock.acquire();
sendBroadcast(STATUS_STARTED, null);
} catch (IOException e) {
if (handler != null) {
handler.removeMessages(VISIBLE);
handler.sendMessageAtFrontOfQueue(handler.obtainMessage(STOP));
}
Log.e(TAG, "Error while registering jmdns service", e);
sendBroadcast(STATUS_ERROR, e.getLocalizedMessage());
}
}
};
handlerThread.start();
handler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case VISIBLE:
handleVisible(localRepoName, useHttps);
break;
case NOT_VISIBLE:
handleNotVisible();
break;
case STOP:
handleStop();
break;
}
}
private void handleVisible(String localRepoName, boolean useHttps) {
HashMap<String, String> values = new HashMap<>();
values.put(BonjourPeer.PATH, "/fdroid/repo");
values.put(BonjourPeer.NAME, localRepoName);
values.put(BonjourPeer.FINGERPRINT, FDroidApp.repo.fingerprint);
String type;
if (useHttps) {
values.put(BonjourPeer.TYPE, "fdroidrepos");
type = HTTPS_SERVICE_TYPE;
} else {
values.put(BonjourPeer.TYPE, "fdroidrepo");
type = HTTP_SERVICE_TYPE;
}
ServiceInfo newPairService = ServiceInfo.create(type, localRepoName, FDroidApp.port, 0, 0, values);
if (!newPairService.equals(pairService)) try {
if (pairService != null) {
jmdns.unregisterService(pairService);
}
jmdns.registerService(newPairService);
pairService = newPairService;
} catch (IOException e) {
e.printStackTrace();
sendBroadcast(STATUS_ERROR, e.getLocalizedMessage());
return;
}
sendBroadcast(STATUS_VISIBLE, null);
}
private void handleNotVisible() {
if (pairService != null) {
jmdns.unregisterService(pairService);
pairService = null;
}
sendBroadcast(STATUS_NOT_VISIBLE, null);
}
private void handleStop() {
if (multicastLock != null) {
multicastLock.release();
}
if (jmdns != null) {
jmdns.unregisterAllServices();
Utils.closeQuietly(jmdns);
pairService = null;
jmdns = null;
}
handlerThread.quit();
handlerThread = null;
sendBroadcast(STATUS_STOPPED, null);
}
};
}
public static void restart(Context context) {
restart(context,
Preferences.get().getLocalRepoName(),
Preferences.get().isLocalRepoHttpsEnabled(),
httpServiceListener, httpsServiceListener);
}
/**
* Testable version, not for regular use.
*
* @see #restart(Context)
*/
static void restart(final Context context,
final String localRepoName, final boolean useHttps,
final ServiceListener httpServiceListener, final ServiceListener httpsServiceListener) {
stop(context);
try {
handlerThread.join(10000);
} catch (InterruptedException | NullPointerException e) {
// ignored
}
start(context, localRepoName, useHttps, httpServiceListener, httpsServiceListener);
}
private static void sendBroadcast(String action, ServiceInfo serviceInfo) {
BonjourPeer bonjourPeer = BonjourPeer.getInstance(serviceInfo);
if (bonjourPeer == null) {
Utils.debugLog(TAG, "IGNORING: " + serviceInfo);
return;
}
Intent intent = new Intent(action);
intent.putExtra(EXTRA_BONJOUR_PEER, bonjourPeer);
LocalBroadcastManager.getInstance(context.get()).sendBroadcast(intent);
}
private static void sendBroadcast(int status, String message) {
Intent intent = new Intent(ACTION_STATUS);
intent.putExtra(EXTRA_STATUS, status);
if (!TextUtils.isEmpty(message)) {
intent.putExtra(Intent.EXTRA_TEXT, message);
}
LocalBroadcastManager.getInstance(context.get()).sendBroadcast(intent);
}
private static final ServiceListener httpServiceListener = new SwapServiceListener();
private static final ServiceListener httpsServiceListener = new SwapServiceListener();
private static class SwapServiceListener implements ServiceListener {
@Override
public void serviceAdded(ServiceEvent serviceEvent) {
// ignored, we only need resolved info
}
@Override
public void serviceRemoved(ServiceEvent serviceEvent) {
sendBroadcast(ACTION_REMOVED, serviceEvent.getInfo());
}
@Override
public void serviceResolved(ServiceEvent serviceEvent) {
sendBroadcast(ACTION_FOUND, serviceEvent.getInfo());
}
}
}

View File

@ -1,4 +1,4 @@
package org.fdroid.fdroid.net; package org.fdroid.fdroid.nearby;
/* /*
* #%L * #%L
@ -35,13 +35,9 @@ package org.fdroid.fdroid.net;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import fi.iki.elonen.NanoHTTPD;
import fi.iki.elonen.NanoHTTPD.Response.IStatus;
import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.localrepo.LocalRepoKeyStore;
import org.fdroid.fdroid.views.swap.SwapWorkflowActivity;
import javax.net.ssl.SSLServerSocketFactory; import org.fdroid.fdroid.BuildConfig;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -49,6 +45,7 @@ import java.io.FilenameFilter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.lang.ref.WeakReference;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -63,6 +60,11 @@ import java.util.Map;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.TimeZone; import java.util.TimeZone;
import javax.net.ssl.SSLServerSocketFactory;
import fi.iki.elonen.NanoHTTPD;
import fi.iki.elonen.NanoHTTPD.Response.IStatus;
/** /**
* A HTTP server for serving the files that are being swapped via WiFi, etc. * A HTTP server for serving the files that are being swapped via WiFi, etc.
* The only changes were to remove unneeded extras like {@code main()}, the * The only changes were to remove unneeded extras like {@code main()}, the
@ -80,7 +82,7 @@ public class LocalHTTPD extends NanoHTTPD {
*/ */
public static final String[] INDEX_FILE_NAMES = {"index.html"}; public static final String[] INDEX_FILE_NAMES = {"index.html"};
private final Context context; private final WeakReference<Context> context;
protected List<File> rootDirs; protected List<File> rootDirs;
@ -101,7 +103,7 @@ public class LocalHTTPD extends NanoHTTPD {
public LocalHTTPD(Context context, String hostname, int port, File webRoot, boolean useHttps) { public LocalHTTPD(Context context, String hostname, int port, File webRoot, boolean useHttps) {
super(hostname, port); super(hostname, port);
rootDirs = Collections.singletonList(webRoot); rootDirs = Collections.singletonList(webRoot);
this.context = context.getApplicationContext(); this.context = new WeakReference<>(context.getApplicationContext());
if (useHttps) { if (useHttps) {
enableHTTPS(); enableHTTPS();
} }
@ -370,7 +372,7 @@ public class LocalHTTPD extends NanoHTTPD {
return newFixedLengthResponse(Response.Status.BAD_REQUEST, MIME_PLAINTEXT, return newFixedLengthResponse(Response.Status.BAD_REQUEST, MIME_PLAINTEXT,
"Requires 'repo' parameter to be posted."); "Requires 'repo' parameter to be posted.");
} }
SwapWorkflowActivity.requestSwap(context, session.getParms().get("repo")); SwapWorkflowActivity.requestSwap(context.get(), session.getParms().get("repo"));
return newFixedLengthResponse(Response.Status.OK, MIME_PLAINTEXT, "Swap request received."); return newFixedLengthResponse(Response.Status.OK, MIME_PLAINTEXT, "Swap request received.");
} }
return newFixedLengthResponse(""); return newFixedLengthResponse("");
@ -491,7 +493,7 @@ public class LocalHTTPD extends NanoHTTPD {
private void enableHTTPS() { private void enableHTTPS() {
try { try {
LocalRepoKeyStore localRepoKeyStore = LocalRepoKeyStore.get(context); LocalRepoKeyStore localRepoKeyStore = LocalRepoKeyStore.get(context.get());
SSLServerSocketFactory factory = NanoHTTPD.makeSSLSocketFactory( SSLServerSocketFactory factory = NanoHTTPD.makeSSLSocketFactory(
localRepoKeyStore.getKeyStore(), localRepoKeyStore.getKeyStore(),
localRepoKeyStore.getKeyManagers()); localRepoKeyStore.getKeyManagers());

View File

@ -0,0 +1,129 @@
package org.fdroid.fdroid.nearby;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.Process;
import android.util.Log;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import java.io.IOException;
import java.net.BindException;
import java.util.Random;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
/**
* Manage {@link LocalHTTPD} in a {@link HandlerThread};
*/
public class LocalHTTPDManager {
private static final String TAG = "LocalHTTPDManager";
public static final String ACTION_STARTED = "LocalHTTPDStarted";
public static final String ACTION_STOPPED = "LocalHTTPDStopped";
public static final String ACTION_ERROR = "LocalHTTPDError";
private static final int STOP = 5709;
private static Handler handler;
private static volatile HandlerThread handlerThread;
private static LocalHTTPD localHttpd;
public static void start(Context context) {
start(context, Preferences.get().isLocalRepoHttpsEnabled());
}
/**
* Testable version, not for regular use.
*
* @see #start(Context)
*/
static void start(final Context context, final boolean useHttps) {
if (handlerThread != null && handlerThread.isAlive()) {
Log.w(TAG, "handlerThread is already running, doing nothing!");
return;
}
handlerThread = new HandlerThread("LocalHTTPD", Process.THREAD_PRIORITY_LESS_FAVORABLE) {
@Override
protected void onLooperPrepared() {
localHttpd = new LocalHTTPD(
context,
FDroidApp.ipAddressString,
FDroidApp.port,
context.getFilesDir(),
useHttps);
try {
localHttpd.start();
Intent intent = new Intent(ACTION_STARTED);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
} catch (BindException e) {
int prev = FDroidApp.port;
FDroidApp.port = FDroidApp.port + new Random().nextInt(1111);
WifiStateChangeService.start(context, null);
Intent intent = new Intent(ACTION_ERROR);
intent.putExtra(Intent.EXTRA_TEXT,
"port " + prev + " occupied, trying on " + FDroidApp.port + ": ("
+ e.getLocalizedMessage() + ")");
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
} catch (IOException e) {
e.printStackTrace();
Intent intent = new Intent(ACTION_ERROR);
intent.putExtra(Intent.EXTRA_TEXT, e.getLocalizedMessage());
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
}
};
handlerThread.start();
handler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
localHttpd.stop();
handlerThread.quit();
handlerThread = null;
}
};
}
public static void stop(Context context) {
if (handler == null || handlerThread == null || !handlerThread.isAlive()) {
Log.w(TAG, "handlerThread is already stopped, doing nothing!");
handlerThread = null;
return;
}
handler.sendEmptyMessage(STOP);
Intent stoppedIntent = new Intent(ACTION_STOPPED);
LocalBroadcastManager.getInstance(context).sendBroadcast(stoppedIntent);
}
/**
* Run {@link #stop(Context)}, wait for it to actually stop, then run
* {@link #start(Context)}.
*/
public static void restart(Context context) {
restart(context, Preferences.get().isLocalRepoHttpsEnabled());
}
/**
* Testable version, not for regular use.
*
* @see #restart(Context)
*/
static void restart(Context context, boolean useHttps) {
stop(context);
try {
handlerThread.join(10000);
} catch (InterruptedException | NullPointerException e) {
// ignored
}
start(context, useHttps);
}
public static boolean isAlive() {
return handlerThread != null && handlerThread.isAlive();
}
}

View File

@ -1,10 +1,8 @@
package org.fdroid.fdroid.localrepo; package org.fdroid.fdroid.nearby;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import kellinwood.security.zipsigner.ZipSigner;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Utils;
import org.bouncycastle.asn1.ASN1Sequence; import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.GeneralName; import org.bouncycastle.asn1.x509.GeneralName;
@ -18,10 +16,9 @@ import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Utils;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.X509KeyManager;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -49,6 +46,12 @@ import java.util.Date;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.Locale; import java.util.Locale;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.X509KeyManager;
import kellinwood.security.zipsigner.ZipSigner;
// TODO Address exception handling in a uniform way throughout // TODO Address exception handling in a uniform way throughout
@SuppressWarnings("LineLength") @SuppressWarnings("LineLength")

View File

@ -1,4 +1,4 @@
package org.fdroid.fdroid.localrepo; package org.fdroid.fdroid.nearby;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
@ -10,10 +10,9 @@ import android.graphics.Bitmap.Config;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Hasher; import org.fdroid.fdroid.Hasher;
import org.fdroid.fdroid.IndexUpdater; import org.fdroid.fdroid.IndexUpdater;
@ -21,6 +20,8 @@ import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Apk; import org.fdroid.fdroid.data.Apk;
import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.InstalledApp;
import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.SanitizedFile; import org.fdroid.fdroid.data.SanitizedFile;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlPullParserFactory;
@ -41,20 +42,22 @@ import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream; import java.util.jar.JarOutputStream;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/** /**
* The {@link SwapService} deals with managing the entire workflow from selecting apps to * The {@link SwapService} deals with managing the entire workflow from selecting apps to
* swap, to invoking this class to prepare the webroot, to enabling various communication protocols. * swap, to invoking this class to prepare the webroot, to enabling various communication protocols.
* This class deals specifically with the webroot side of things, ensuring we have a valid index.jar * This class deals specifically with the webroot side of things, ensuring we have a valid index.jar
* and the relevant .apk and icon files available. * and the relevant .apk and icon files available.
*/ */
@SuppressWarnings("LineLength")
public final class LocalRepoManager { public final class LocalRepoManager {
private static final String TAG = "LocalRepoManager"; private static final String TAG = "LocalRepoManager";
@ -63,13 +66,13 @@ public final class LocalRepoManager {
private final AssetManager assetManager; private final AssetManager assetManager;
private final String fdroidPackageName; private final String fdroidPackageName;
private static final String[] WEB_ROOT_ASSET_FILES = { public static final String[] WEB_ROOT_ASSET_FILES = {
"swap-icon.png", "swap-icon.png",
"swap-tick-done.png", "swap-tick-done.png",
"swap-tick-not-done.png", "swap-tick-not-done.png",
}; };
private final Map<String, App> apps = new HashMap<>(); private final Map<String, App> apps = new ConcurrentHashMap<>();
private final SanitizedFile xmlIndexJar; private final SanitizedFile xmlIndexJar;
private final SanitizedFile xmlIndexJarUnsigned; private final SanitizedFile xmlIndexJarUnsigned;
@ -122,7 +125,7 @@ public final class LocalRepoManager {
private String writeFdroidApkToWebroot() { private String writeFdroidApkToWebroot() {
ApplicationInfo appInfo; ApplicationInfo appInfo;
String fdroidClientURL = "https://f-droid.org/FDroid.apk"; String fdroidClientURL = "https://f-droid.org/F-Droid.apk";
try { try {
appInfo = pm.getApplicationInfo(fdroidPackageName, PackageManager.GET_META_DATA); appInfo = pm.getApplicationInfo(fdroidPackageName, PackageManager.GET_META_DATA);
@ -246,6 +249,10 @@ public final class LocalRepoManager {
return xmlIndexJar; return xmlIndexJar;
} }
public File getWebRoot() {
return webRoot;
}
public void deleteRepo() { public void deleteRepo() {
deleteContents(repoDir); deleteContents(repoDir);
} }
@ -270,12 +277,10 @@ public final class LocalRepoManager {
} }
public void addApp(Context context, String packageName) { public void addApp(Context context, String packageName) {
App app; App app = null;
try { try {
app = SwapService.getAppFromCache(packageName); InstalledApp installedApp = InstalledAppProvider.Helper.findByPackageName(context, packageName);
if (app == null) { app = App.getInstance(context, pm, installedApp, packageName);
app = App.getInstance(context.getApplicationContext(), pm, packageName);
}
if (app == null || !app.isValid()) { if (app == null || !app.isValid()) {
return; return;
} }
@ -344,7 +349,8 @@ public final class LocalRepoManager {
serializer = XmlPullParserFactory.newInstance().newSerializer(); serializer = XmlPullParserFactory.newInstance().newSerializer();
} }
public void build(Context context, Map<String, App> apps, OutputStream output) throws IOException, LocalRepoKeyStore.InitException { public void build(Context context, Map<String, App> apps, OutputStream output)
throws IOException, LocalRepoKeyStore.InitException {
serializer.setOutput(output, "UTF-8"); serializer.setOutput(output, "UTF-8");
serializer.startDocument(null, null); serializer.startDocument(null, null);
serializer.startTag("", "fdroid"); serializer.startTag("", "fdroid");
@ -352,12 +358,14 @@ public final class LocalRepoManager {
// <repo> block // <repo> block
serializer.startTag("", "repo"); serializer.startTag("", "repo");
serializer.attribute("", "icon", "blah.png"); serializer.attribute("", "icon", "blah.png");
serializer.attribute("", "name", Preferences.get().getLocalRepoName() + " on " + FDroidApp.ipAddressString); serializer.attribute("", "name", Preferences.get().getLocalRepoName()
+ " on " + FDroidApp.ipAddressString);
serializer.attribute("", "pubkey", Hasher.hex(LocalRepoKeyStore.get(context).getCertificate())); serializer.attribute("", "pubkey", Hasher.hex(LocalRepoKeyStore.get(context).getCertificate()));
long timestamp = System.currentTimeMillis() / 1000L; long timestamp = System.currentTimeMillis() / 1000L;
serializer.attribute("", "timestamp", String.valueOf(timestamp)); serializer.attribute("", "timestamp", String.valueOf(timestamp));
serializer.attribute("", "version", "10"); serializer.attribute("", "version", "10");
tag("description", "A local FDroid repo generated from apps installed on " + Preferences.get().getLocalRepoName()); tag("description", "A local FDroid repo generated from apps installed on "
+ Preferences.get().getLocalRepoName());
serializer.endTag("", "repo"); serializer.endTag("", "repo");
// <application> blocks // <application> blocks
@ -382,7 +390,7 @@ public final class LocalRepoManager {
} }
/** /**
* Alias for {@link org.fdroid.fdroid.localrepo.LocalRepoManager.IndexXmlBuilder#tag(String, String)} * Alias for {@link org.fdroid.fdroid.nearby.LocalRepoManager.IndexXmlBuilder#tag(String, String)}
* That accepts a number instead of string. * That accepts a number instead of string.
* *
* @see IndexXmlBuilder#tag(String, String) * @see IndexXmlBuilder#tag(String, String)
@ -392,7 +400,7 @@ public final class LocalRepoManager {
} }
/** /**
* Alias for {@link org.fdroid.fdroid.localrepo.LocalRepoManager.IndexXmlBuilder#tag(String, String)} * Alias for {@link org.fdroid.fdroid.nearby.LocalRepoManager.IndexXmlBuilder#tag(String, String)}
* that accepts a date instead of a string. * that accepts a date instead of a string.
* *
* @see IndexXmlBuilder#tag(String, String) * @see IndexXmlBuilder#tag(String, String)
@ -410,7 +418,7 @@ public final class LocalRepoManager {
tag("lastupdated", app.lastUpdated); tag("lastupdated", app.lastUpdated);
tag("name", app.name); tag("name", app.name);
tag("summary", app.summary); tag("summary", app.summary);
tag("icon", app.icon); tag("icon", app.iconFromApk);
tag("desc", app.description); tag("desc", app.description);
tag("license", "Unknown"); tag("license", "Unknown");
tag("categories", "LocalRepo," + Preferences.get().getLocalRepoName()); tag("categories", "LocalRepo," + Preferences.get().getLocalRepoName());

View File

@ -0,0 +1,148 @@
package org.fdroid.fdroid.nearby;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.os.Process;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
/**
* Handles setting up and generating the local repo used to swap apps, including
* the {@code index.jar}, the symlinks to the shared APKs, etc.
* <p/>
* The work is done in a {@link Thread} so that new incoming {@code Intents}
* are not blocked by processing. A new {@code Intent} immediately nullifies
* the current state because it means the user has chosen a different set of
* apps. That is also enforced here since new {@code Intent}s with the same
* {@link Set} of apps as the current one are ignored. Having the
* {@code Thread} also makes it easy to kill work that is in progress.
*/
public class LocalRepoService extends IntentService {
public static final String TAG = "LocalRepoService";
public static final String ACTION_CREATE = "org.fdroid.fdroid.nearby.action.CREATE";
public static final String EXTRA_PACKAGE_NAMES = "org.fdroid.fdroid.nearby.extra.PACKAGE_NAMES";
public static final String ACTION_STATUS = "localRepoStatusAction";
public static final String EXTRA_STATUS = "localRepoStatusExtra";
public static final int STATUS_STARTED = 0;
public static final int STATUS_PROGRESS = 1;
public static final int STATUS_ERROR = 2;
private String[] currentlyProcessedApps = new String[0];
private GenerateLocalRepoThread thread;
public LocalRepoService() {
super("LocalRepoService");
}
/**
* Creates a skeleton swap repo with only F-Droid itself in it
*/
public static void create(Context context) {
create(context, Collections.singleton(context.getPackageName()));
}
/**
* Sets up the local repo with the included {@code packageNames}
*/
public static void create(Context context, Set<String> packageNames) {
Intent intent = new Intent(context, LocalRepoService.class);
intent.setAction(ACTION_CREATE);
intent.putExtra(EXTRA_PACKAGE_NAMES, packageNames.toArray(new String[0]));
context.startService(intent);
}
@Override
protected void onHandleIntent(Intent intent) {
Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);
String[] packageNames = intent.getStringArrayExtra(EXTRA_PACKAGE_NAMES);
if (packageNames == null || packageNames.length == 0) {
Utils.debugLog(TAG, "no packageNames found, quiting");
return;
}
Arrays.sort(packageNames);
if (Arrays.equals(currentlyProcessedApps, packageNames)) {
Utils.debugLog(TAG, "packageNames list unchanged, quiting");
return;
}
currentlyProcessedApps = packageNames;
if (thread != null) {
thread.interrupt();
}
thread = new GenerateLocalRepoThread();
thread.start();
}
private class GenerateLocalRepoThread extends Thread {
private static final String TAG = "GenerateLocalRepoThread";
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST);
runProcess(LocalRepoService.this, currentlyProcessedApps);
}
}
public static void runProcess(Context context, String[] selectedApps) {
try {
final LocalRepoManager lrm = LocalRepoManager.get(context);
broadcast(context, STATUS_PROGRESS, R.string.deleting_repo);
lrm.deleteRepo();
for (String app : selectedApps) {
broadcast(context, STATUS_PROGRESS, context.getString(R.string.adding_apks_format, app));
lrm.addApp(context, app);
}
String urlString = Utils.getSharingUri(FDroidApp.repo).toString();
lrm.writeIndexPage(urlString);
broadcast(context, STATUS_PROGRESS, R.string.writing_index_jar);
lrm.writeIndexJar();
broadcast(context, STATUS_PROGRESS, R.string.linking_apks);
lrm.copyApksToRepo();
broadcast(context, STATUS_PROGRESS, R.string.copying_icons);
// run the icon copy without progress, its not a blocker
new Thread() {
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST);
lrm.copyIconsToRepo();
}
}.start();
broadcast(context, STATUS_STARTED, null);
} catch (IOException | XmlPullParserException | LocalRepoKeyStore.InitException e) {
broadcast(context, STATUS_ERROR, e.getLocalizedMessage());
e.printStackTrace();
}
}
/**
* Translate Android style broadcast {@link Intent}s to {@code PrepareSwapRepo}
*/
static void broadcast(Context context, int status, String message) {
Intent intent = new Intent(ACTION_STATUS);
intent.putExtra(EXTRA_STATUS, status);
if (message != null) {
intent.putExtra(Intent.EXTRA_TEXT, message);
}
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
static void broadcast(Context context, int status, int resId) {
broadcast(context, status, context.getString(resId));
}
}

View File

@ -17,7 +17,7 @@
* MA 02110-1301, USA. * MA 02110-1301, USA.
*/ */
package org.fdroid.fdroid.localrepo; package org.fdroid.fdroid.nearby;
import android.Manifest; import android.Manifest;
import android.app.IntentService; import android.app.IntentService;
@ -28,11 +28,10 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Environment; import android.os.Environment;
import android.os.Process; import android.os.Process;
import android.support.v4.content.ContextCompat;
import android.util.Log; import android.util.Log;
import org.fdroid.fdroid.IndexUpdater; import org.fdroid.fdroid.IndexUpdater;
import org.fdroid.fdroid.IndexV1Updater; import org.fdroid.fdroid.IndexV1Updater;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import java.io.File; import java.io.File;
@ -45,9 +44,11 @@ import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import androidx.core.content.ContextCompat;
/** /**
* An {@link IntentService} subclass for scanning removable "external storage" * An {@link IntentService} subclass for scanning removable "external storage"
* for F-Droid package repos, e.g. SD Cards. This is intented to support * for F-Droid package repos, e.g. SD Cards. This is intended to support
* sharable package repos, so it ignores non-removable storage, like the fake * sharable package repos, so it ignores non-removable storage, like the fake
* emulated sdcard from devices with only built-in storage. This method will * emulated sdcard from devices with only built-in storage. This method will
* only ever allow for reading repos, never writing. It also will not work * only ever allow for reading repos, never writing. It also will not work
@ -55,7 +56,7 @@ import java.util.List;
* "External Storage" * "External Storage"
* <p> * <p>
* Scanning the removable storage requires that the user allowed it. This * Scanning the removable storage requires that the user allowed it. This
* requires both the {@link Preferences#isScanRemovableStorageEnabled()} * requires both the {@link org.fdroid.fdroid.Preferences#isScanRemovableStorageEnabled()}
* and the {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} * and the {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
* permission to be enabled. * permission to be enabled.
* *
@ -66,7 +67,7 @@ import java.util.List;
public class SDCardScannerService extends IntentService { public class SDCardScannerService extends IntentService {
public static final String TAG = "SDCardScannerService"; public static final String TAG = "SDCardScannerService";
private static final String ACTION_SCAN = "org.fdroid.fdroid.localrepo.SCAN"; private static final String ACTION_SCAN = "org.fdroid.fdroid.nearby.SCAN";
private static final List<String> SKIP_DIRS = Arrays.asList(".android_secure", "LOST.DIR"); private static final List<String> SKIP_DIRS = Arrays.asList(".android_secure", "LOST.DIR");
@ -75,11 +76,9 @@ public class SDCardScannerService extends IntentService {
} }
public static void scan(Context context) { public static void scan(Context context) {
if (Preferences.get().isScanRemovableStorageEnabled()) { Intent intent = new Intent(context, SDCardScannerService.class);
Intent intent = new Intent(context, SDCardScannerService.class); intent.setAction(ACTION_SCAN);
intent.setAction(ACTION_SCAN); context.startService(intent);
context.startService(intent);
}
} }
@Override @Override

View File

@ -1,29 +1,16 @@
package org.fdroid.fdroid.views.swap; package org.fdroid.fdroid.nearby;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.ColorRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.CursorAdapter;
import android.support.v7.widget.SearchView;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AdapterView; import android.widget.AdapterView;
@ -36,12 +23,16 @@ import android.widget.TextView;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.Schema.InstalledAppTable; import org.fdroid.fdroid.data.Schema.InstalledAppTable;
import org.fdroid.fdroid.localrepo.SwapService;
public class SelectAppsView extends ListView implements import androidx.annotation.NonNull;
SwapWorkflowActivity.InnerView, import androidx.annotation.Nullable;
LoaderManager.LoaderCallbacks<Cursor>, import androidx.core.content.ContextCompat;
SearchView.OnQueryTextListener { import androidx.cursoradapter.widget.CursorAdapter;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
public class SelectAppsView extends SwapView implements LoaderManager.LoaderCallbacks<Cursor> {
public SelectAppsView(Context context) { public SelectAppsView(Context context) {
super(context); super(context);
@ -60,97 +51,41 @@ public class SelectAppsView extends ListView implements
super(context, attrs, defStyleAttr, defStyleRes); super(context, attrs, defStyleAttr, defStyleRes);
} }
private SwapWorkflowActivity getActivity() { private ListView listView;
return (SwapWorkflowActivity) getContext();
}
private SwapService getState() {
return getActivity().getState();
}
private static final int LOADER_INSTALLED_APPS = 253341534;
private AppListAdapter adapter; private AppListAdapter adapter;
private String currentFilterString;
@Override @Override
protected void onFinishInflate() { protected void onFinishInflate() {
super.onFinishInflate(); super.onFinishInflate();
adapter = new AppListAdapter(this, getContext(), listView = findViewById(R.id.list);
adapter = new AppListAdapter(listView, getContext(),
getContext().getContentResolver().query(InstalledAppProvider.getContentUri(), getContext().getContentResolver().query(InstalledAppProvider.getContentUri(),
InstalledAppTable.Cols.ALL, null, null, null)); null, null, null, null));
setAdapter(adapter); listView.setAdapter(adapter);
setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
// either reconnect with an existing loader or start a new one // either reconnect with an existing loader or start a new one
getActivity().getSupportLoaderManager().initLoader(LOADER_INSTALLED_APPS, null, this); getActivity().getSupportLoaderManager().initLoader(R.layout.swap_select_apps, null, this);
setOnItemClickListener(new AdapterView.OnItemClickListener() { listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) { public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
toggleAppSelected(position); toggleAppSelected(position);
} }
}); });
} }
@Override
public boolean buildMenu(Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.swap_next_search, menu);
MenuItem nextMenuItem = menu.findItem(R.id.action_next);
int flags = MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT;
MenuItemCompat.setShowAsAction(nextMenuItem, flags);
nextMenuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
getActivity().onAppsSelected();
return true;
}
});
SearchView searchView = new SearchView(getActivity());
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
MenuItemCompat.setActionView(searchMenuItem, searchView);
MenuItemCompat.setShowAsAction(searchMenuItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
searchView.setOnQueryTextListener(this);
return true;
}
@Override
public int getStep() {
return SwapService.STEP_SELECT_APPS;
}
@Override
public int getPreviousStep() {
// TODO: The STEP_JOIN_WIFI step isn't shown first, need to make it
// so that it is, or so that this doesn't go back there.
return getState().isConnectingWithPeer() ? SwapService.STEP_INTRO : SwapService.STEP_JOIN_WIFI;
}
@ColorRes
public int getToolbarColour() {
return R.color.swap_bright_blue;
}
@Override
public String getToolbarTitle() {
return getResources().getString(R.string.swap_choose_apps);
}
private void toggleAppSelected(int position) { private void toggleAppSelected(int position) {
Cursor c = (Cursor) adapter.getItem(position); Cursor c = (Cursor) adapter.getItem(position);
String packageName = c.getString(c.getColumnIndex(InstalledAppTable.Cols.Package.NAME)); String packageName = c.getString(c.getColumnIndex(InstalledAppTable.Cols.Package.NAME));
if (getState().hasSelectedPackage(packageName)) { if (getActivity().getSwapService().hasSelectedPackage(packageName)) {
getState().deselectPackage(packageName); getActivity().getSwapService().deselectPackage(packageName);
adapter.updateCheckedIndicatorView(position, false); adapter.updateCheckedIndicatorView(position, false);
} else { } else {
getState().selectPackage(packageName); getActivity().getSwapService().selectPackage(packageName);
adapter.updateCheckedIndicatorView(position, true); adapter.updateCheckedIndicatorView(position, true);
} }
LocalRepoService.create(getContext(), getActivity().getSwapService().getAppsToSwap());
} }
@Override @Override
@ -161,26 +96,20 @@ public class SelectAppsView extends ListView implements
} else { } else {
uri = InstalledAppProvider.getSearchUri(currentFilterString); uri = InstalledAppProvider.getSearchUri(currentFilterString);
} }
return new CursorLoader( return new CursorLoader(getActivity(), uri, null, null, null, null);
getActivity(),
uri,
InstalledAppTable.Cols.ALL,
null,
null,
InstalledAppTable.Cols.APPLICATION_LABEL);
} }
@Override @Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor); adapter.swapCursor(cursor);
for (int i = 0; i < getCount(); i++) { for (int i = 0; i < listView.getCount(); i++) {
Cursor c = (Cursor) getItemAtPosition(i); Cursor c = (Cursor) listView.getItemAtPosition(i);
String packageName = c.getString(c.getColumnIndex(InstalledAppTable.Cols.Package.NAME)); String packageName = c.getString(c.getColumnIndex(InstalledAppTable.Cols.Package.NAME));
getState().ensureFDroidSelected(); getActivity().getSwapService().ensureFDroidSelected();
for (String selected : getState().getAppsToSwap()) { for (String selected : getActivity().getSwapService().getAppsToSwap()) {
if (TextUtils.equals(packageName, selected)) { if (TextUtils.equals(packageName, selected)) {
setItemChecked(i, true); listView.setItemChecked(i, true);
} }
} }
} }
@ -191,26 +120,6 @@ public class SelectAppsView extends ListView implements
adapter.swapCursor(null); adapter.swapCursor(null);
} }
@Override
public boolean onQueryTextChange(String newText) {
String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
if (currentFilterString == null && newFilter == null) {
return true;
}
if (currentFilterString != null && currentFilterString.equals(newFilter)) {
return true;
}
currentFilterString = newFilter;
getActivity().getSupportLoaderManager().restartLoader(LOADER_INSTALLED_APPS, null, this);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
// this is not needed since we respond to every change in text
return true;
}
private class AppListAdapter extends CursorAdapter { private class AppListAdapter extends CursorAdapter {
@Nullable @Nullable
@ -231,14 +140,14 @@ public class SelectAppsView extends ListView implements
private LayoutInflater getInflater(Context context) { private LayoutInflater getInflater(Context context) {
if (inflater == null) { if (inflater == null) {
Context themedContext = new ContextThemeWrapper(context, R.style.SwapTheme_AppList_ListItem); Context themedContext = new ContextThemeWrapper(context, R.style.SwapTheme_AppList_ListItem);
inflater = (LayoutInflater) themedContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater = ContextCompat.getSystemService(themedContext, LayoutInflater.class);
} }
return inflater; return inflater;
} }
private Drawable getDefaultAppIcon(Context context) { private Drawable getDefaultAppIcon(Context context) {
if (defaultAppIcon == null) { if (defaultAppIcon == null) {
defaultAppIcon = context.getResources().getDrawable(android.R.drawable.sym_def_app_icon); defaultAppIcon = ContextCompat.getDrawable(context, android.R.drawable.sym_def_app_icon);
} }
return defaultAppIcon; return defaultAppIcon;
} }
@ -290,8 +199,6 @@ public class SelectAppsView extends ListView implements
} }
}); });
} }
updateCheckedIndicatorView(view, listView.isItemChecked(listPosition));
} }
public void updateCheckedIndicatorView(int position, boolean checked) { public void updateCheckedIndicatorView(int position, boolean checked) {
@ -300,26 +207,7 @@ public class SelectAppsView extends ListView implements
if (position >= firstListItemPosition && position <= lastListItemPosition) { if (position >= firstListItemPosition && position <= lastListItemPosition) {
final int childIndex = position - firstListItemPosition; final int childIndex = position - firstListItemPosition;
updateCheckedIndicatorView(listView.getChildAt(childIndex), checked);
}
}
private void updateCheckedIndicatorView(View view, boolean checked) {
ImageView imageView = (ImageView) view.findViewById(R.id.checked);
if (imageView != null) {
int resource;
int colour;
if (checked) {
resource = R.drawable.ic_check_circle_white;
colour = getResources().getColor(R.color.swap_bright_blue);
} else {
resource = R.drawable.ic_add_circle_outline_white;
colour = 0xFFD0D0D4;
}
imageView.setImageDrawable(getResources().getDrawable(resource));
imageView.setColorFilter(colour, PorterDuff.Mode.MULTIPLY);
} }
} }
} }
} }

View File

@ -0,0 +1,248 @@
package org.fdroid.fdroid.nearby;
import android.annotation.TargetApi;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.WifiConfiguration;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.nearby.peers.Peer;
import java.util.ArrayList;
import androidx.annotation.Nullable;
import com.google.android.material.switchmaterial.SwitchMaterial;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import cc.mvdan.accesspoint.WifiApControl;
@SuppressWarnings("LineLength")
public class StartSwapView extends SwapView {
private static final String TAG = "StartSwapView";
public StartSwapView(Context context) {
super(context);
}
public StartSwapView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public StartSwapView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(21)
public StartSwapView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
class PeopleNearbyAdapter extends ArrayAdapter<Peer> {
PeopleNearbyAdapter(Context context) {
super(context, 0, new ArrayList<Peer>());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.swap_peer_list_item, parent, false);
}
Peer peer = getItem(position);
((TextView) convertView.findViewById(R.id.peer_name)).setText(peer.getName());
((ImageView) convertView.findViewById(R.id.icon))
.setImageDrawable(ContextCompat.getDrawable(getContext(), peer.getIcon()));
return convertView;
}
}
@Nullable /* Emulators typically don't have bluetooth adapters */
private final BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
private SwitchMaterial bluetoothSwitch;
private TextView viewBluetoothId;
private TextView textBluetoothVisible;
private TextView viewWifiId;
private TextView viewWifiNetwork;
private TextView peopleNearbyText;
private ListView peopleNearbyList;
private ProgressBar peopleNearbyProgress;
private PeopleNearbyAdapter peopleNearbyAdapter;
/**
* Remove relevant listeners/subscriptions/etc so that they do not receive and process events
* when this view is not in use.
* <p>
*/
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (bluetoothSwitch != null) {
bluetoothSwitch.setOnCheckedChangeListener(null);
}
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(onWifiNetworkChanged);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
uiInitPeers();
uiInitBluetooth();
uiInitWifi();
uiInitButtons();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
onWifiNetworkChanged, new IntentFilter(WifiStateChangeService.BROADCAST));
}
private final BroadcastReceiver onWifiNetworkChanged = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
uiUpdateWifiNetwork();
}
};
private void uiInitButtons() {
findViewById(R.id.btn_send_fdroid).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getActivity().sendFDroid();
}
});
}
/**
* Setup the list of nearby peers with an adapter, and hide or show it and the associated
* message for when no peers are nearby depending on what is happening.
*/
private void uiInitPeers() {
peopleNearbyText = (TextView) findViewById(R.id.text_people_nearby);
peopleNearbyList = (ListView) findViewById(R.id.list_people_nearby);
peopleNearbyProgress = (ProgressBar) findViewById(R.id.searching_people_nearby);
peopleNearbyAdapter = new PeopleNearbyAdapter(getContext());
peopleNearbyList.setAdapter(peopleNearbyAdapter);
peopleNearbyAdapter.addAll(getActivity().getSwapService().getActivePeers());
peopleNearbyList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Peer peer = peopleNearbyAdapter.getItem(position);
onPeerSelected(peer);
}
});
}
private void uiShowNotSearchingForPeers() {
peopleNearbyProgress.setVisibility(View.GONE);
if (peopleNearbyList.getAdapter().getCount() > 0) {
peopleNearbyText.setText(getContext().getString(R.string.swap_people_nearby));
} else {
peopleNearbyText.setText(getContext().getString(R.string.swap_no_peers_nearby));
}
}
private void uiInitBluetooth() {
if (bluetooth != null) {
viewBluetoothId = (TextView) findViewById(R.id.device_id_bluetooth);
viewBluetoothId.setText(bluetooth.getName());
viewBluetoothId.setVisibility(bluetooth.isEnabled() ? View.VISIBLE : View.GONE);
textBluetoothVisible = findViewById(R.id.bluetooth_visible);
bluetoothSwitch = (SwitchMaterial) findViewById(R.id.switch_bluetooth);
bluetoothSwitch.setOnCheckedChangeListener(onBluetoothSwitchToggled);
bluetoothSwitch.setChecked(SwapService.getBluetoothVisibleUserPreference());
bluetoothSwitch.setEnabled(true);
bluetoothSwitch.setOnCheckedChangeListener(onBluetoothSwitchToggled);
} else {
findViewById(R.id.bluetooth_info).setVisibility(View.GONE);
}
}
private final CompoundButton.OnCheckedChangeListener onBluetoothSwitchToggled = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Utils.debugLog(TAG, "Received onCheckChanged(true) for Bluetooth swap, prompting user as to whether they want to enable Bluetooth.");
getActivity().startBluetoothSwap();
textBluetoothVisible.setText(R.string.swap_visible_bluetooth);
viewBluetoothId.setVisibility(View.VISIBLE);
Utils.debugLog(TAG, "Received onCheckChanged(true) for Bluetooth swap (prompting user or setup Bluetooth complete)");
// TODO: When they deny the request for enabling bluetooth, we need to disable this switch...
} else {
Utils.debugLog(TAG, "Received onCheckChanged(false) for Bluetooth swap, disabling Bluetooth swap.");
BluetoothManager.stop(getContext());
textBluetoothVisible.setText(R.string.swap_not_visible_bluetooth);
viewBluetoothId.setVisibility(View.GONE);
Utils.debugLog(TAG, "Received onCheckChanged(false) for Bluetooth swap, Bluetooth swap disabled successfully.");
}
SwapService.putBluetoothVisibleUserPreference(isChecked);
}
};
private void uiInitWifi() {
viewWifiId = (TextView) findViewById(R.id.device_id_wifi);
viewWifiNetwork = (TextView) findViewById(R.id.wifi_network);
uiUpdateWifiNetwork();
}
private void uiUpdateWifiNetwork() {
viewWifiId.setText(FDroidApp.ipAddressString);
viewWifiId.setVisibility(TextUtils.isEmpty(FDroidApp.ipAddressString) ? View.GONE : View.VISIBLE);
WifiApControl wifiAp = WifiApControl.getInstance(getActivity());
if (wifiAp != null && wifiAp.isWifiApEnabled()) {
WifiConfiguration config = wifiAp.getConfiguration();
TextView textWifiVisible = findViewById(R.id.wifi_visible);
if (textWifiVisible != null) {
textWifiVisible.setText(R.string.swap_visible_hotspot);
}
Context context = getContext();
if (config == null) {
viewWifiNetwork.setText(context.getString(R.string.swap_active_hotspot,
context.getString(R.string.swap_blank_wifi_ssid)));
} else {
viewWifiNetwork.setText(context.getString(R.string.swap_active_hotspot, config.SSID));
}
} else if (TextUtils.isEmpty(FDroidApp.ssid)) {
// not connected to or setup with any wifi network
viewWifiNetwork.setText(R.string.swap_no_wifi_network);
} else {
// connected to a regular wifi network
viewWifiNetwork.setText(FDroidApp.ssid);
}
}
private void onPeerSelected(Peer peer) {
getActivity().swapWith(peer);
}
}

View File

@ -1,6 +1,5 @@
package org.fdroid.fdroid.localrepo; package org.fdroid.fdroid.nearby;
import android.annotation.SuppressLint;
import android.app.Notification; import android.app.Notification;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
@ -13,41 +12,31 @@ import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.IBinder; import android.os.IBinder;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.core.app.ServiceCompat;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.NotificationHelper;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService; import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.localrepo.peers.Peer; import org.fdroid.fdroid.nearby.peers.Peer;
import org.fdroid.fdroid.localrepo.peers.PeerFinder; import org.fdroid.fdroid.net.Downloader;
import org.fdroid.fdroid.localrepo.type.BluetoothSwap;
import org.fdroid.fdroid.localrepo.type.SwapType;
import org.fdroid.fdroid.localrepo.type.WifiSwap;
import org.fdroid.fdroid.net.WifiStateChangeService;
import org.fdroid.fdroid.views.swap.SwapWorkflowActivity;
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.util.Collections; import java.util.Collections;
@ -55,188 +44,73 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
import cc.mvdan.accesspoint.WifiApControl;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
/** /**
* Central service which manages all of the different moving parts of swap which are required * Central service which manages all of the different moving parts of swap which are required
* to enable p2p swapping of apps. * to enable p2p swapping of apps.
*/ */
@SuppressWarnings("LineLength")
public class SwapService extends Service { public class SwapService extends Service {
private static final String TAG = "SwapService"; private static final String TAG = "SwapService";
private static final String SHARED_PREFERENCES = "swap-state"; private static final String SHARED_PREFERENCES = "swap-state";
private static final String KEY_APPS_TO_SWAP = "appsToSwap"; private static final String KEY_APPS_TO_SWAP = "appsToSwap";
private static final String KEY_BLUETOOTH_ENABLED = "bluetoothEnabled"; private static final String KEY_BLUETOOTH_ENABLED = "bluetoothEnabled";
private static final String KEY_WIFI_ENABLED = "wifiEnabled"; private static final String KEY_WIFI_ENABLED = "wifiEnabled";
private static final String KEY_HOTSPOT_ACTIVATED = "hotspotEnabled";
private static final String KEY_BLUETOOTH_ENABLED_BEFORE_SWAP = "bluetoothEnabledBeforeSwap"; private static final String KEY_BLUETOOTH_ENABLED_BEFORE_SWAP = "bluetoothEnabledBeforeSwap";
private static final String KEY_BLUETOOTH_NAME_BEFORE_SWAP = "bluetoothNameBeforeSwap";
private static final String KEY_WIFI_ENABLED_BEFORE_SWAP = "wifiEnabledBeforeSwap"; private static final String KEY_WIFI_ENABLED_BEFORE_SWAP = "wifiEnabledBeforeSwap";
private static final String KEY_HOTSPOT_ACTIVATED_BEFORE_SWAP = "hotspotEnabledBeforeSwap";
@NonNull @NonNull
private final Set<String> appsToSwap = new HashSet<>(); private final Set<String> appsToSwap = new HashSet<>();
private final Set<Peer> activePeers = new HashSet<>();
/** private static LocalBroadcastManager localBroadcastManager;
* A cache of parsed APKs from the file system.
*/
private static final ConcurrentHashMap<String, App> INSTALLED_APPS = new ConcurrentHashMap<>();
private static SharedPreferences swapPreferences; private static SharedPreferences swapPreferences;
private static BluetoothAdapter bluetoothAdapter; private static BluetoothAdapter bluetoothAdapter;
private static WifiManager wifiManager; private static WifiManager wifiManager;
private static Timer pollConnectedSwapRepoTimer;
public static void stop(Context context) { public static void stop(Context context) {
Intent intent = new Intent(context, SwapService.class); Intent intent = new Intent(context, SwapService.class);
context.stopService(intent); context.stopService(intent);
} }
static App getAppFromCache(String packageName) {
return INSTALLED_APPS.get(packageName);
}
static void putAppInCache(String packageName, @NonNull App app) {
INSTALLED_APPS.put(packageName, app);
}
// ==========================================================
// Search for peers to swap
// ==========================================================
private Observable<Peer> peerFinder;
/**
* Call {@link Observable#subscribe()} on this in order to be notified of peers
* which are found. Call {@link Subscription#unsubscribe()} on the resulting
* subscription when finished and you no longer want to scan for peers.
* <p>
* The returned object will scan for peers on a background thread, and emit
* found peers on the mian thread.
* <p>
* Invoking this in multiple places will return the same, cached, peer finder.
* That is, if in the past it already found some peers, then you subscribe
* to it in the future, the future subscriber will still receive the peers
* that were found previously.
* TODO: What about removing peers that no longer are present?
*/
public Observable<Peer> scanForPeers() {
Utils.debugLog(TAG, "Scanning for nearby devices to swap with...");
if (peerFinder == null) {
peerFinder = PeerFinder.createObservable(getApplicationContext())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.distinct();
}
return peerFinder;
}
// ==========================================================
// Manage the current step
// ("Step" refers to the current view being shown in the UI)
// ==========================================================
public static final int STEP_INTRO = 1;
public static final int STEP_SELECT_APPS = 2;
public static final int STEP_JOIN_WIFI = 3;
public static final int STEP_SHOW_NFC = 4;
public static final int STEP_WIFI_QR = 5;
public static final int STEP_CONNECTING = 6;
public static final int STEP_SUCCESS = 7;
public static final int STEP_CONFIRM_SWAP = 8;
/**
* Special view, that we don't really want to actually store against the
* {@link SwapService#step}. Rather, we use it for the purpose of specifying
* we are in the state waiting for the {@link SwapService} to get started and
* bound to the {@link SwapWorkflowActivity}.
*/
public static final int STEP_INITIAL_LOADING = 9;
@SwapStep
private int step = STEP_INTRO;
/**
* Current screen that the swap process is up to.
* Will be one of the SwapState.STEP_* values.
*/
@SwapStep
public int getStep() {
return step;
}
public SwapService setStep(@SwapStep int step) {
this.step = step;
return this;
}
@NonNull @NonNull
public Set<String> getAppsToSwap() { public Set<String> getAppsToSwap() {
return appsToSwap; return appsToSwap;
} }
public void refreshSwap() { @NonNull
if (peer != null) { public Set<Peer> getActivePeers() {
connectTo(peer, false); return activePeers;
}
} }
public void connectToPeer() { public void connectToPeer() {
if (getPeer() == null) { if (getPeer() == null) {
throw new IllegalStateException("Cannot connect to peer, no peer has been selected."); throw new IllegalStateException("Cannot connect to peer, no peer has been selected.");
} }
connectTo(getPeer(), getPeer().shouldPromptForSwapBack()); connectTo(getPeer());
if (LocalHTTPDManager.isAlive() && getPeer().shouldPromptForSwapBack()) {
askServerToSwapWithUs(peerRepo);
}
} }
public void connectTo(@NonNull Peer peer, boolean requestSwapBack) { public void connectTo(@NonNull Peer peer) {
if (peer != this.peer) { if (peer != this.peer) {
Log.e(TAG, "Oops, got a different peer to swap with than initially planned."); Log.e(TAG, "Oops, got a different peer to swap with than initially planned.");
} }
peerRepo = ensureRepoExists(peer); peerRepo = ensureRepoExists(peer);
// Only ask server to swap with us, if we are actually running a local repo service.
// It is possible to have a swap initiated without first starting a swap, in which
// case swapping back is pointless.
if (isEnabled() && requestSwapBack) {
askServerToSwapWithUs(peerRepo);
}
UpdateService.updateRepoNow(this, peer.getRepoAddress()); UpdateService.updateRepoNow(this, peer.getRepoAddress());
} }
@SuppressLint("StaticFieldLeak")
private void askServerToSwapWithUs(final Repo repo) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... args) {
String swapBackUri = Utils.getLocalRepoUri(FDroidApp.repo).toString();
HttpURLConnection conn = null;
try {
URL url = new URL(repo.address.replace("/fdroid/repo", "/request-swap"));
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream outputStream = conn.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
writer.write("repo=" + swapBackUri);
writer.flush();
writer.close();
outputStream.close();
int responseCode = conn.getResponseCode();
Utils.debugLog(TAG, "Asking server at " + repo.address + " to swap with us in return (by " +
"POSTing to \"/request-swap\" with repo \"" + swapBackUri + "\"): " + responseCode);
} catch (IOException e) {
Log.e(TAG, "Error while asking server to swap with us", e);
} finally {
conn.disconnect();
}
return null;
}
}.execute();
}
private Repo ensureRepoExists(@NonNull Peer peer) { private Repo ensureRepoExists(@NonNull Peer peer) {
// TODO: newRepoConfig.getParsedUri() will include a fingerprint, which may not match with // TODO: newRepoConfig.getParsedUri() will include a fingerprint, which may not match with
// the repos address in the database. Not sure on best behaviour in this situation. // the repos address in the database. Not sure on best behaviour in this situation.
@ -269,18 +143,6 @@ public class SwapService extends Service {
return peerRepo; return peerRepo;
} }
/**
* Ensure that we don't get put into an incorrect state, by forcing people to pass valid
* states to setStep. Ideally this would be done by requiring an enum or something to
* be passed rather than in integer, however that is harder to persist on disk than an int.
* This is the same as, e.g. {@link Context#getSystemService(String)}
*/
@IntDef({STEP_INTRO, STEP_SELECT_APPS, STEP_JOIN_WIFI, STEP_SHOW_NFC, STEP_WIFI_QR,
STEP_CONNECTING, STEP_SUCCESS, STEP_CONFIRM_SWAP, STEP_INITIAL_LOADING})
@Retention(RetentionPolicy.SOURCE)
public @interface SwapStep {
}
// ================================================= // =================================================
// Have selected a specific peer to swap with // Have selected a specific peer to swap with
// (Rather than showing a generic QR code to scan) // (Rather than showing a generic QR code to scan)
@ -296,6 +158,14 @@ public class SwapService extends Service {
this.peer = peer; this.peer = peer;
} }
public void addCurrentPeerToActive() {
activePeers.add(peer);
}
public void removeCurrentPeerFromActive() {
activePeers.remove(peer);
}
public boolean isConnectingWithPeer() { public boolean isConnectingWithPeer() {
return peer != null; return peer != null;
} }
@ -382,6 +252,14 @@ public class SwapService extends Service {
swapPreferences.edit().putBoolean(SwapService.KEY_WIFI_ENABLED, visible).apply(); swapPreferences.edit().putBoolean(SwapService.KEY_WIFI_ENABLED, visible).apply();
} }
public static boolean getHotspotActivatedUserPreference() {
return swapPreferences.getBoolean(SwapService.KEY_HOTSPOT_ACTIVATED, false);
}
public static void putHotspotActivatedUserPreference(boolean visible) {
swapPreferences.edit().putBoolean(SwapService.KEY_HOTSPOT_ACTIVATED, visible).apply();
}
public static boolean wasBluetoothEnabledBeforeSwap() { public static boolean wasBluetoothEnabledBeforeSwap() {
return swapPreferences.getBoolean(SwapService.KEY_BLUETOOTH_ENABLED_BEFORE_SWAP, false); return swapPreferences.getBoolean(SwapService.KEY_BLUETOOTH_ENABLED_BEFORE_SWAP, false);
} }
@ -390,6 +268,14 @@ public class SwapService extends Service {
swapPreferences.edit().putBoolean(SwapService.KEY_BLUETOOTH_ENABLED_BEFORE_SWAP, visible).apply(); swapPreferences.edit().putBoolean(SwapService.KEY_BLUETOOTH_ENABLED_BEFORE_SWAP, visible).apply();
} }
public static String getBluetoothNameBeforeSwap() {
return swapPreferences.getString(SwapService.KEY_BLUETOOTH_NAME_BEFORE_SWAP, null);
}
public static void putBluetoothNameBeforeSwap(String name) {
swapPreferences.edit().putString(SwapService.KEY_BLUETOOTH_NAME_BEFORE_SWAP, name).apply();
}
public static boolean wasWifiEnabledBeforeSwap() { public static boolean wasWifiEnabledBeforeSwap() {
return swapPreferences.getBoolean(SwapService.KEY_WIFI_ENABLED_BEFORE_SWAP, false); return swapPreferences.getBoolean(SwapService.KEY_WIFI_ENABLED_BEFORE_SWAP, false);
} }
@ -398,60 +284,17 @@ public class SwapService extends Service {
swapPreferences.edit().putBoolean(SwapService.KEY_WIFI_ENABLED_BEFORE_SWAP, visible).apply(); swapPreferences.edit().putBoolean(SwapService.KEY_WIFI_ENABLED_BEFORE_SWAP, visible).apply();
} }
/** public static boolean wasHotspotEnabledBeforeSwap() {
* Handles checking if the {@link SwapService} is running, and only restarts it if it was running. return swapPreferences.getBoolean(SwapService.KEY_HOTSPOT_ACTIVATED_BEFORE_SWAP, false);
*/
public void stopWifiIfEnabled(final boolean restartAfterStopping) {
if (wifiSwap.isConnected()) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
Utils.debugLog(TAG, "Stopping the currently running WiFi swap service (on background thread)");
wifiSwap.stop();
if (restartAfterStopping) {
Utils.debugLog(TAG, "Restarting WiFi swap service after stopping (still on background thread)");
wifiSwap.start();
}
return null;
}
}.execute();
}
} }
public boolean isEnabled() { public static void putHotspotEnabledBeforeSwap(boolean visible) {
return bluetoothSwap.isConnected() || wifiSwap.isConnected(); swapPreferences.edit().putBoolean(SwapService.KEY_HOTSPOT_ACTIVATED_BEFORE_SWAP, visible).apply();
} }
// ==========================================
// Interacting with Bluetooth adapter
// ==========================================
public boolean isBluetoothDiscoverable() {
return bluetoothSwap.isDiscoverable();
}
public boolean isBonjourDiscoverable() {
return wifiSwap.isConnected() && wifiSwap.getBonjour().isConnected();
}
// ===============================================================
// Old SwapService stuff being merged into that.
// ===============================================================
public static final String BONJOUR_STATE_CHANGE = "org.fdroid.fdroid.BONJOUR_STATE_CHANGE";
public static final String BLUETOOTH_STATE_CHANGE = "org.fdroid.fdroid.BLUETOOTH_STATE_CHANGE";
public static final String WIFI_STATE_CHANGE = "org.fdroid.fdroid.WIFI_STATE_CHANGE";
public static final String EXTRA_STARTING = "STARTING";
public static final String EXTRA_STARTED = "STARTED";
public static final String EXTRA_STOPPING = "STOPPING";
public static final String EXTRA_STOPPED = "STOPPED";
private static final int NOTIFICATION = 1; private static final int NOTIFICATION = 1;
private final Binder binder = new Binder(); private final Binder binder = new Binder();
private SwapType bluetoothSwap;
private WifiSwap wifiSwap;
private static final int TIMEOUT = 15 * 60 * 1000; // 15 mins private static final int TIMEOUT = 15 * 60 * 1000; // 15 mins
@ -461,13 +304,7 @@ public class SwapService extends Service {
@Nullable @Nullable
private Timer timer; private Timer timer;
public SwapType getBluetoothSwap() { private final CompositeDisposable compositeDisposable = new CompositeDisposable();
return bluetoothSwap;
}
public WifiSwap getWifiSwap() {
return wifiSwap;
}
public class Binder extends android.os.Binder { public class Binder extends android.os.Binder {
public SwapService getService() { public SwapService getService() {
@ -475,55 +312,107 @@ public class SwapService extends Service {
} }
} }
@Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
Utils.debugLog(TAG, "Creating swap service.");
startForeground(NOTIFICATION, createNotification()); startForeground(NOTIFICATION, createNotification());
localBroadcastManager = LocalBroadcastManager.getInstance(this);
deleteAllSwapRepos();
CacheSwapAppsService.startCaching(this);
swapPreferences = getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE); swapPreferences = getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
LocalHTTPDManager.start(this);
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter != null) { if (bluetoothAdapter != null) {
SwapService.putBluetoothEnabledBeforeSwap(bluetoothAdapter.isEnabled()); SwapService.putBluetoothEnabledBeforeSwap(bluetoothAdapter.isEnabled());
if (bluetoothAdapter.isEnabled()) {
BluetoothManager.start(this);
}
registerReceiver(bluetoothScanModeChanged,
new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED));
} }
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); wifiManager = ContextCompat.getSystemService(getApplicationContext(), WifiManager.class);
if (wifiManager != null) { if (wifiManager != null) {
SwapService.putWifiEnabledBeforeSwap(wifiManager.isWifiEnabled()); SwapService.putWifiEnabledBeforeSwap(wifiManager.isWifiEnabled());
} }
appsToSwap.addAll(deserializePackages(swapPreferences.getString(KEY_APPS_TO_SWAP, ""))); appsToSwap.addAll(deserializePackages(swapPreferences.getString(KEY_APPS_TO_SWAP, "")));
bluetoothSwap = BluetoothSwap.create(this);
wifiSwap = new WifiSwap(this, wifiManager);
Preferences.get().registerLocalRepoHttpsListeners(httpsEnabledListener); Preferences.get().registerLocalRepoHttpsListeners(httpsEnabledListener);
LocalBroadcastManager.getInstance(this).registerReceiver(onWifiChange, localBroadcastManager.registerReceiver(onWifiChange, new IntentFilter(WifiStateChangeService.BROADCAST));
new IntentFilter(WifiStateChangeService.BROADCAST)); localBroadcastManager.registerReceiver(bluetoothStatus, new IntentFilter(BluetoothManager.ACTION_STATUS));
localBroadcastManager.registerReceiver(bluetoothPeerFound, new IntentFilter(BluetoothManager.ACTION_FOUND));
localBroadcastManager.registerReceiver(bonjourPeerFound, new IntentFilter(BonjourManager.ACTION_FOUND));
localBroadcastManager.registerReceiver(bonjourPeerRemoved, new IntentFilter(BonjourManager.ACTION_REMOVED));
localBroadcastManager.registerReceiver(localRepoStatus, new IntentFilter(LocalRepoService.ACTION_STATUS));
if (getBluetoothVisibleUserPreference()) { if (getHotspotActivatedUserPreference()) {
Utils.debugLog(TAG, "Previously the user enabled Bluetooth swap, so enabling again automatically."); WifiApControl wifiApControl = WifiApControl.getInstance(this);
bluetoothSwap.startInBackground(); // TODO replace with Intent to SwapService if (wifiApControl != null) {
} else { wifiApControl.enable();
Utils.debugLog(TAG, "Bluetooth was NOT enabled last time user swapped, starting not visible."); }
} else if (getWifiVisibleUserPreference()) {
if (wifiManager != null) {
wifiManager.setWifiEnabled(true);
}
} }
if (getWifiVisibleUserPreference()) { BonjourManager.start(this);
Utils.debugLog(TAG, "Previously the user enabled WiFi swap, so enabling again automatically."); BonjourManager.setVisible(this, getWifiVisibleUserPreference() || getHotspotActivatedUserPreference());
wifiSwap.startInBackground(); // TODO replace with Intent to SwapService
} else {
Utils.debugLog(TAG, "WiFi was NOT enabled last time user swapped, starting not visible.");
}
} }
private void askServerToSwapWithUs(final Repo repo) {
compositeDisposable.add(
Completable.fromAction(() -> {
String swapBackUri = Utils.getLocalRepoUri(FDroidApp.repo).toString();
HttpURLConnection conn = null;
try {
URL url = new URL(repo.address.replace("/fdroid/repo", "/request-swap"));
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
try (OutputStream outputStream = conn.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream)) {
writer.write("repo=" + swapBackUri);
writer.flush();
}
int responseCode = conn.getResponseCode();
Utils.debugLog(TAG, "Asking server at " + repo.address + " to swap with us in return (by " +
"POSTing to \"/request-swap\" with repo \"" + swapBackUri + "\"): " + responseCode);
} finally {
if (conn != null) {
conn.disconnect();
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(e -> {
Intent intent = new Intent(Downloader.ACTION_INTERRUPTED);
intent.setData(Uri.parse(repo.address));
intent.putExtra(Downloader.EXTRA_ERROR_MESSAGE, e.getLocalizedMessage());
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
})
.subscribe()
);
}
/**
* This is for setting things up for when the {@code SwapService} was
* started by the user clicking on the initial start button. The things
* that must be run always on start-up go in {@link #onCreate()}.
*/
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY; deleteAllSwapRepos();
Intent startUiIntent = new Intent(this, SwapWorkflowActivity.class);
startUiIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startUiIntent);
return START_NOT_STICKY;
} }
@Override @Override
@ -535,25 +424,43 @@ public class SwapService extends Service {
@Override @Override
public void onDestroy() { public void onDestroy() {
compositeDisposable.dispose();
Utils.debugLog(TAG, "Destroying service, will disable swapping if required, and unregister listeners."); Utils.debugLog(TAG, "Destroying service, will disable swapping if required, and unregister listeners.");
Preferences.get().unregisterLocalRepoHttpsListeners(httpsEnabledListener); Preferences.get().unregisterLocalRepoHttpsListeners(httpsEnabledListener);
LocalBroadcastManager.getInstance(this).unregisterReceiver(onWifiChange); localBroadcastManager.unregisterReceiver(onWifiChange);
localBroadcastManager.unregisterReceiver(bluetoothStatus);
localBroadcastManager.unregisterReceiver(bluetoothPeerFound);
localBroadcastManager.unregisterReceiver(bonjourPeerFound);
localBroadcastManager.unregisterReceiver(bonjourPeerRemoved);
if (bluetoothAdapter != null && !wasBluetoothEnabledBeforeSwap()) { if (bluetoothAdapter != null) {
bluetoothAdapter.disable(); unregisterReceiver(bluetoothScanModeChanged);
} }
BluetoothManager.stop(this);
BonjourManager.stop(this);
LocalHTTPDManager.stop(this);
if (wifiManager != null && !wasWifiEnabledBeforeSwap()) { if (wifiManager != null && !wasWifiEnabledBeforeSwap()) {
wifiManager.setWifiEnabled(false); wifiManager.setWifiEnabled(false);
} }
//TODO getBluetoothSwap().stopInBackground(); WifiApControl ap = WifiApControl.getInstance(this);
getWifiSwap().stopInBackground(); if (ap != null) {
if (wasHotspotEnabledBeforeSwap()) {
ap.enable();
} else {
ap.disable();
}
}
stopPollingConnectedSwapRepo();
if (timer != null) { if (timer != null) {
timer.cancel(); timer.cancel();
} }
stopForeground(true); ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);
deleteAllSwapRepos(); deleteAllSwapRepos();
@ -564,7 +471,7 @@ public class SwapService extends Service {
Intent intent = new Intent(this, SwapWorkflowActivity.class); Intent intent = new Intent(this, SwapWorkflowActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
return new NotificationCompat.Builder(this) return new NotificationCompat.Builder(this, NotificationHelper.CHANNEL_SWAPS)
.setContentTitle(getText(R.string.local_repo_running)) .setContentTitle(getText(R.string.local_repo_running))
.setContentText(getText(R.string.touch_to_configure_local_repo)) .setContentText(getText(R.string.touch_to_configure_local_repo))
.setSmallIcon(R.drawable.ic_nearby) .setSmallIcon(R.drawable.ic_nearby)
@ -590,40 +497,151 @@ public class SwapService extends Service {
} }
} }
private void initTimer() { private void startPollingConnectedSwapRepo() {
// TODO replace by Android scheduler stopPollingConnectedSwapRepo();
pollConnectedSwapRepoTimer = new Timer("pollConnectedSwapRepoTimer", true);
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
if (peer != null) {
connectTo(peer);
}
}
};
pollConnectedSwapRepoTimer.schedule(timerTask, 5000);
}
public void stopPollingConnectedSwapRepo() {
if (pollConnectedSwapRepoTimer != null) {
pollConnectedSwapRepoTimer.cancel();
pollConnectedSwapRepoTimer = null;
}
}
/**
* Sets or resets the idel timer for {@link #TIMEOUT}ms, once the timer
* expires, this service and all things that rely on it will be stopped.
*/
public void initTimer() {
if (timer != null) { if (timer != null) {
Utils.debugLog(TAG, "Cancelling existing timeout timer so timeout can be reset."); Utils.debugLog(TAG, "Cancelling existing timeout timer so timeout can be reset.");
timer.cancel(); timer.cancel();
} }
Utils.debugLog(TAG, "Initializing swap timeout to " + TIMEOUT + "ms minutes"); Utils.debugLog(TAG, "Initializing swap timeout to " + TIMEOUT + "ms minutes");
timer = new Timer(); timer = new Timer(TAG, true);
timer.schedule(new TimerTask() { timer.schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
Utils.debugLog(TAG, "Disabling swap because " + TIMEOUT + "ms passed."); Utils.debugLog(TAG, "Disabling swap because " + TIMEOUT + "ms passed.");
String msg = getString(R.string.swap_toast_closing_nearby_after_timeout);
Utils.showToastFromService(SwapService.this, msg, android.widget.Toast.LENGTH_LONG);
stop(SwapService.this); stop(SwapService.this);
} }
}, TIMEOUT); }, TIMEOUT);
} }
@SuppressWarnings("FieldCanBeLocal") // The constructor will get bloated if these are all local... private void restartWiFiServices() {
boolean hasIp = FDroidApp.ipAddressString != null;
if (hasIp) {
LocalHTTPDManager.restart(this);
BonjourManager.restart(this);
BonjourManager.setVisible(this, getWifiVisibleUserPreference() || getHotspotActivatedUserPreference());
} else {
BonjourManager.stop(this);
LocalHTTPDManager.stop(this);
}
}
private final Preferences.ChangeListener httpsEnabledListener = new Preferences.ChangeListener() { private final Preferences.ChangeListener httpsEnabledListener = new Preferences.ChangeListener() {
@Override @Override
public void onPreferenceChange() { public void onPreferenceChange() {
Log.i(TAG, "Swap over HTTPS preference changed."); restartWiFiServices();
stopWifiIfEnabled(true);
} }
}; };
@SuppressWarnings("FieldCanBeLocal") // The constructor will get bloated if these are all local...
private final BroadcastReceiver onWifiChange = new BroadcastReceiver() { private final BroadcastReceiver onWifiChange = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent i) { public void onReceive(Context context, Intent i) {
boolean hasIp = FDroidApp.ipAddressString != null; restartWiFiServices();
stopWifiIfEnabled(hasIp);
} }
}; };
private final BroadcastReceiver bluetoothStatus = new SwapStateChangeReceiver();
private final BroadcastReceiver localRepoStatus = new SwapStateChangeReceiver();
/**
* When swapping is setup, then start the index polling.
*/
private class SwapStateChangeReceiver extends BroadcastReceiver {
private final BroadcastReceiver pollForUpdatesReceiver = new PollForUpdatesReceiver();
@Override
public void onReceive(Context context, Intent intent) {
int bluetoothStatus = intent.getIntExtra(BluetoothManager.ACTION_STATUS, -1);
int wifiStatus = intent.getIntExtra(LocalRepoService.EXTRA_STATUS, -1);
if (bluetoothStatus == BluetoothManager.STATUS_STARTED
|| wifiStatus == LocalRepoService.STATUS_STARTED) {
localBroadcastManager.registerReceiver(pollForUpdatesReceiver,
new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
} else {
localBroadcastManager.unregisterReceiver(pollForUpdatesReceiver);
}
}
}
/**
* Reschedule an index update if the last one was successful.
*/
private class PollForUpdatesReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getIntExtra(UpdateService.EXTRA_STATUS_CODE, -1)) {
case UpdateService.STATUS_COMPLETE_AND_SAME:
case UpdateService.STATUS_COMPLETE_WITH_CHANGES:
startPollingConnectedSwapRepo();
break;
}
}
}
/**
* Handle events if the user or system changes the Bluetooth setup outside of F-Droid.
*/
private final BroadcastReceiver bluetoothScanModeChanged = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, -1)) {
case BluetoothAdapter.SCAN_MODE_NONE:
BluetoothManager.stop(SwapService.this);
break;
case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
BluetoothManager.start(SwapService.this);
break;
}
}
};
private final BroadcastReceiver bluetoothPeerFound = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
activePeers.add((Peer) intent.getParcelableExtra(BluetoothManager.EXTRA_PEER));
}
};
private final BroadcastReceiver bonjourPeerFound = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
activePeers.add((Peer) intent.getParcelableExtra(BonjourManager.EXTRA_BONJOUR_PEER));
}
};
private final BroadcastReceiver bonjourPeerRemoved = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
activePeers.remove((Peer) intent.getParcelableExtra(BonjourManager.EXTRA_BONJOUR_PEER));
}
};
} }

View File

@ -1,7 +1,7 @@
package org.fdroid.fdroid.views.swap; package org.fdroid.fdroid.nearby;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Activity; import android.app.PendingIntent;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -11,23 +11,10 @@ import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Looper;
import android.support.annotation.ColorRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.CursorAdapter;
import android.support.v7.widget.SearchView;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
@ -36,8 +23,9 @@ import android.widget.ListView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService; import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
@ -47,71 +35,67 @@ import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.Schema.AppMetadataTable; import org.fdroid.fdroid.data.Schema.AppMetadataTable;
import org.fdroid.fdroid.localrepo.SwapService; import org.fdroid.fdroid.installer.InstallManagerService;
import org.fdroid.fdroid.installer.Installer;
import org.fdroid.fdroid.net.Downloader; import org.fdroid.fdroid.net.Downloader;
import org.fdroid.fdroid.net.DownloaderService; import org.fdroid.fdroid.net.DownloaderService;
import java.util.List; import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class SwapAppsView extends ListView implements import androidx.annotation.NonNull;
SwapWorkflowActivity.InnerView, import androidx.annotation.Nullable;
LoaderManager.LoaderCallbacks<Cursor>, import androidx.appcompat.app.AppCompatActivity;
SearchView.OnQueryTextListener { import androidx.core.content.ContextCompat;
import androidx.cursoradapter.widget.CursorAdapter;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
public SwapAppsView(Context context) { /**
* This is a view that shows a listing of all apps in the swap repo that this
* just connected to. The app listing and search should be replaced by
* {@link org.fdroid.fdroid.views.apps.AppListActivity}'s plumbing.
*/
// TODO merge this with AppListActivity, perhaps there could be AppListView?
public class SwapSuccessView extends SwapView implements LoaderManager.LoaderCallbacks<Cursor> {
private static final String TAG = "SwapAppsView";
public SwapSuccessView(Context context) {
super(context); super(context);
} }
public SwapAppsView(Context context, AttributeSet attrs) { public SwapSuccessView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
} }
public SwapAppsView(Context context, AttributeSet attrs, int defStyleAttr) { public SwapSuccessView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); super(context, attrs, defStyleAttr);
} }
@TargetApi(21) @TargetApi(21)
public SwapAppsView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { public SwapSuccessView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes); super(context, attrs, defStyleAttr, defStyleRes);
} }
private SwapWorkflowActivity getActivity() {
return (SwapWorkflowActivity) getContext();
}
private static final int LOADER_SWAPABLE_APPS = 759283741;
private static final String TAG = "SwapAppsView";
private Repo repo; private Repo repo;
private AppListAdapter adapter; private AppListAdapter adapter;
private String currentFilterString;
@Override @Override
protected void onFinishInflate() { protected void onFinishInflate() {
super.onFinishInflate(); super.onFinishInflate();
repo = getActivity().getState().getPeerRepo(); repo = getActivity().getSwapService().getPeerRepo();
/*
if (repo == null) {
TODO: Uh oh, something stuffed up for this to happen.
TODO: What is the best course of action from here?
}
*/
adapter = new AppListAdapter(getContext(), getContext().getContentResolver().query( adapter = new AppListAdapter(getContext(), getContext().getContentResolver().query(
AppProvider.getRepoUri(repo), AppMetadataTable.Cols.ALL, null, null, null)); AppProvider.getRepoUri(repo), AppMetadataTable.Cols.ALL, null, null, null));
ListView listView = findViewById(R.id.list);
setAdapter(adapter); listView.setAdapter(adapter);
// either reconnect with an existing loader or start a new one // either reconnect with an existing loader or start a new one
getActivity().getSupportLoaderManager().initLoader(LOADER_SWAPABLE_APPS, null, this); getActivity().getSupportLoaderManager().initLoader(R.layout.swap_success, null, this);
LocalBroadcastManager.getInstance(getActivity()).registerReceiver( LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
pollForUpdatesReceiver, new IntentFilter(UpdateService.LOCAL_ACTION_STATUS)); pollForUpdatesReceiver, new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
schedulePollForUpdates();
} }
/** /**
@ -125,64 +109,7 @@ public class SwapAppsView extends ListView implements
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(pollForUpdatesReceiver); LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(pollForUpdatesReceiver);
} }
private void pollForUpdates() { @NonNull
if (adapter.getCount() > 1 ||
(adapter.getCount() == 1 && !new App((Cursor) adapter.getItem(0)).packageName.equals(BuildConfig.APPLICATION_ID))) { // NOCHECKSTYLE LineLength
Utils.debugLog(TAG, "Not polling for new apps from swap repo, because we already have more than one.");
return;
}
Utils.debugLog(TAG, "Polling swap repo to see if it has any updates.");
getActivity().getService().refreshSwap();
}
private void schedulePollForUpdates() {
Utils.debugLog(TAG, "Scheduling poll for updated swap repo in 5 seconds.");
new Timer().schedule(new TimerTask() {
@Override
public void run() {
Looper.prepare();
pollForUpdates();
Looper.loop();
}
}, 5000);
}
@Override
public boolean buildMenu(Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.swap_search, menu);
SearchView searchView = new SearchView(getActivity());
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
MenuItemCompat.setActionView(searchMenuItem, searchView);
MenuItemCompat.setShowAsAction(searchMenuItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
searchView.setOnQueryTextListener(this);
return true;
}
@Override
public int getStep() {
return SwapService.STEP_SUCCESS;
}
@Override
public int getPreviousStep() {
return SwapService.STEP_INTRO;
}
@ColorRes
public int getToolbarColour() {
return R.color.swap_bright_blue;
}
@Override
public String getToolbarTitle() {
return getResources().getString(R.string.swap_success);
}
@Override @Override
public CursorLoader onCreateLoader(int id, Bundle args) { public CursorLoader onCreateLoader(int id, Bundle args) {
Uri uri = TextUtils.isEmpty(currentFilterString) Uri uri = TextUtils.isEmpty(currentFilterString)
@ -194,35 +121,15 @@ public class SwapAppsView extends ListView implements
} }
@Override @Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor); adapter.swapCursor(cursor);
} }
@Override @Override
public void onLoaderReset(Loader<Cursor> loader) { public void onLoaderReset(@NonNull Loader<Cursor> loader) {
adapter.swapCursor(null); adapter.swapCursor(null);
} }
@Override
public boolean onQueryTextChange(String newText) {
String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
if (currentFilterString == null && newFilter == null) {
return true;
}
if (currentFilterString != null && currentFilterString.equals(newFilter)) {
return true;
}
currentFilterString = newFilter;
getActivity().getSupportLoaderManager().restartLoader(LOADER_SWAPABLE_APPS, null, this);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
// this is not needed since we respond to every change in text
return true;
}
private class AppListAdapter extends CursorAdapter { private class AppListAdapter extends CursorAdapter {
private class ViewHolder { private class ViewHolder {
@ -242,7 +149,7 @@ public class SwapAppsView extends ListView implements
TextView statusInstalled; TextView statusInstalled;
TextView statusIncompatible; TextView statusIncompatible;
private final BroadcastReceiver downloadReceiver = new BroadcastReceiver() { private class DownloadReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) { switch (intent.getAction()) {
@ -264,9 +171,14 @@ public class SwapAppsView extends ListView implements
} }
break; break;
case Downloader.ACTION_COMPLETE: case Downloader.ACTION_COMPLETE:
localBroadcastManager.unregisterReceiver(this);
resetView(); resetView();
statusInstalled.setText(R.string.installing);
statusInstalled.setVisibility(View.VISIBLE);
btnInstall.setVisibility(View.GONE);
break; break;
case Downloader.ACTION_INTERRUPTED: case Downloader.ACTION_INTERRUPTED:
localBroadcastManager.unregisterReceiver(this);
if (intent.hasExtra(Downloader.EXTRA_ERROR_MESSAGE)) { if (intent.hasExtra(Downloader.EXTRA_ERROR_MESSAGE)) {
String msg = intent.getStringExtra(Downloader.EXTRA_ERROR_MESSAGE) String msg = intent.getStringExtra(Downloader.EXTRA_ERROR_MESSAGE)
+ " " + intent.getDataString(); + " " + intent.getDataString();
@ -280,17 +192,16 @@ public class SwapAppsView extends ListView implements
default: default:
throw new RuntimeException("intent action not handled!"); throw new RuntimeException("intent action not handled!");
} }
} }
}; }
private final ContentObserver appObserver = new ContentObserver(new Handler()) { private final ContentObserver appObserver = new ContentObserver(new Handler()) {
@Override @Override
public void onChange(boolean selfChange) { public void onChange(boolean selfChange) {
Activity activity = getActivity(); AppCompatActivity activity = getActivity();
if (activity != null) { if (activity != null && app != null) {
app = AppProvider.Helper.findSpecificApp( app = AppProvider.Helper.findSpecificApp(
getActivity().getContentResolver(), activity.getContentResolver(),
app.packageName, app.packageName,
app.repoId, app.repoId,
AppMetadataTable.Cols.ALL); AppMetadataTable.Cols.ALL);
@ -314,11 +225,48 @@ public class SwapAppsView extends ListView implements
} }
if (apk != null) { if (apk != null) {
String urlString = apk.getUrl(); localBroadcastManager.registerReceiver(new DownloadReceiver(),
DownloaderService.getIntentFilter(apk.getCanonicalUrl()));
// TODO unregister receivers? or will they just die with this instance localBroadcastManager.registerReceiver(new BroadcastReceiver() {
IntentFilter downloadFilter = DownloaderService.getIntentFilter(urlString); @Override
localBroadcastManager.registerReceiver(downloadReceiver, downloadFilter); public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case Installer.ACTION_INSTALL_STARTED:
statusInstalled.setText(R.string.installing);
statusInstalled.setVisibility(View.VISIBLE);
btnInstall.setVisibility(View.GONE);
progressView.setIndeterminate(true);
progressView.setVisibility(View.VISIBLE);
break;
case Installer.ACTION_INSTALL_USER_INTERACTION:
PendingIntent installPendingIntent =
intent.getParcelableExtra(Installer.EXTRA_USER_INTERACTION_PI);
try {
installPendingIntent.send();
} catch (PendingIntent.CanceledException e) {
Log.e(TAG, "PI canceled", e);
}
break;
case Installer.ACTION_INSTALL_COMPLETE:
localBroadcastManager.unregisterReceiver(this);
statusInstalled.setText(R.string.app_installed);
statusInstalled.setVisibility(View.VISIBLE);
btnInstall.setVisibility(View.GONE);
progressView.setVisibility(View.GONE);
break;
case Installer.ACTION_INSTALL_INTERRUPTED:
localBroadcastManager.unregisterReceiver(this);
statusInstalled.setVisibility(View.GONE);
btnInstall.setVisibility(View.VISIBLE);
progressView.setVisibility(View.GONE);
String errorMessage = intent.getStringExtra(Installer.EXTRA_ERROR_MESSAGE);
if (errorMessage != null) {
Toast.makeText(getContext(), errorMessage, Toast.LENGTH_LONG).show();
}
break;
}
}
}, Installer.getInstallIntentFilter(apk.getCanonicalUrl()));
} }
// NOTE: Instead of continually unregistering and re-registering the observer // NOTE: Instead of continually unregistering and re-registering the observer
@ -333,6 +281,25 @@ public class SwapAppsView extends ListView implements
resetView(); resetView();
} }
private final OnClickListener cancelListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (apk != null) {
InstallManagerService.cancel(getContext(), apk.getCanonicalUrl());
}
}
};
private final OnClickListener installListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (apk != null && (app.hasUpdates() || app.compatible)) {
showProgress();
InstallManagerService.queue(getContext(), app, apk);
}
}
};
private void resetView() { private void resetView() {
if (app == null) { if (app == null) {
@ -346,44 +313,43 @@ public class SwapAppsView extends ListView implements
nameView.setText(app.name); nameView.setText(app.name);
} }
ImageLoader.getInstance().displayImage(app.iconUrl, iconView, Utils.getRepoAppDisplayImageOptions()); ImageLoader.getInstance().displayImage(app.getIconUrl(iconView.getContext()), iconView, Utils.getRepoAppDisplayImageOptions());
if (app.hasUpdates()) { if (app.hasUpdates()) {
btnInstall.setText(R.string.menu_upgrade); btnInstall.setText(R.string.menu_upgrade);
btnInstall.setVisibility(View.VISIBLE); btnInstall.setVisibility(View.VISIBLE);
btnInstall.setOnClickListener(installListener);
statusIncompatible.setVisibility(View.GONE); statusIncompatible.setVisibility(View.GONE);
statusInstalled.setVisibility(View.GONE); statusInstalled.setVisibility(View.GONE);
} else if (app.isInstalled(getContext())) { } else if (app.isInstalled(getContext())) {
btnInstall.setVisibility(View.GONE); btnInstall.setVisibility(View.GONE);
statusIncompatible.setVisibility(View.GONE); statusIncompatible.setVisibility(View.GONE);
statusInstalled.setVisibility(View.VISIBLE); statusInstalled.setVisibility(View.VISIBLE);
statusInstalled.setText(R.string.app_installed);
} else if (!app.compatible) { } else if (!app.compatible) {
btnInstall.setVisibility(View.GONE); btnInstall.setVisibility(View.GONE);
statusIncompatible.setVisibility(View.VISIBLE); statusIncompatible.setVisibility(View.VISIBLE);
statusInstalled.setVisibility(View.GONE); statusInstalled.setVisibility(View.GONE);
} else if (progressView.getVisibility() == View.VISIBLE) {
btnInstall.setText(R.string.cancel);
btnInstall.setVisibility(View.VISIBLE);
btnInstall.setOnClickListener(cancelListener);
statusIncompatible.setVisibility(View.GONE);
statusInstalled.setVisibility(View.GONE);
} else { } else {
btnInstall.setText(R.string.menu_install); btnInstall.setText(R.string.menu_install);
btnInstall.setVisibility(View.VISIBLE); btnInstall.setVisibility(View.VISIBLE);
btnInstall.setOnClickListener(installListener);
statusIncompatible.setVisibility(View.GONE); statusIncompatible.setVisibility(View.GONE);
statusInstalled.setVisibility(View.GONE); statusInstalled.setVisibility(View.GONE);
} }
OnClickListener installListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (apk != null && (app.hasUpdates() || app.compatible)) {
getActivity().install(app, apk);
showProgress();
}
}
};
btnInstall.setOnClickListener(installListener);
} }
private void showProgress() { private void showProgress() {
btnInstall.setText(R.string.cancel);
btnInstall.setVisibility(View.VISIBLE);
btnInstall.setOnClickListener(cancelListener);
progressView.setVisibility(View.VISIBLE); progressView.setVisibility(View.VISIBLE);
btnInstall.setVisibility(View.GONE);
statusInstalled.setVisibility(View.GONE); statusInstalled.setVisibility(View.GONE);
statusIncompatible.setVisibility(View.GONE); statusIncompatible.setVisibility(View.GONE);
} }
@ -399,7 +365,7 @@ public class SwapAppsView extends ListView implements
@NonNull @NonNull
private LayoutInflater getInflater(Context context) { private LayoutInflater getInflater(Context context) {
if (inflater == null) { if (inflater == null) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater = ContextCompat.getSystemService(context, LayoutInflater.class);
} }
return inflater; return inflater;
} }
@ -444,17 +410,7 @@ public class SwapAppsView extends ListView implements
} }
}); });
break; break;
case UpdateService.STATUS_ERROR_GLOBAL:
// TODO: Well, if we can't get the index, we probably can't swapp apps.
// Tell the user something helpful?
break;
case UpdateService.STATUS_COMPLETE_AND_SAME:
schedulePollForUpdates();
break;
} }
} }
}; };
} }

View File

@ -0,0 +1,93 @@
package org.fdroid.fdroid.nearby;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.RelativeLayout;
import org.fdroid.fdroid.R;
import androidx.annotation.ColorInt;
import androidx.annotation.LayoutRes;
import androidx.core.content.ContextCompat;
/**
* A {@link android.view.View} that registers to handle the swap events from
* {@link SwapService}.
*/
public class SwapView extends RelativeLayout {
public static final String TAG = "SwapView";
@ColorInt
public final int toolbarColor;
public final String toolbarTitle;
private int layoutResId = -1;
protected String currentFilterString;
public SwapView(Context context) {
this(context, null);
}
public SwapView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
/**
* In order to support Android < 21, this calls {@code super} rather than
* {@code this}. {@link RelativeLayout}'s methods just use a 0 for the
* fourth argument, just like this used to.
*/
public SwapView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.SwapView, 0, 0);
toolbarColor = a.getColor(R.styleable.SwapView_toolbarColor,
ContextCompat.getColor(context, R.color.swap_blue));
toolbarTitle = a.getString(R.styleable.SwapView_toolbarTitle);
a.recycle();
}
@TargetApi(21)
public SwapView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.SwapView, 0, 0);
toolbarColor = a.getColor(R.styleable.SwapView_toolbarColor,
ContextCompat.getColor(context, R.color.swap_blue));
toolbarTitle = a.getString(R.styleable.SwapView_toolbarTitle);
a.recycle();
}
@LayoutRes
public int getLayoutResId() {
return layoutResId;
}
public void setLayoutResId(@LayoutRes int layoutResId) {
this.layoutResId = layoutResId;
}
public String getCurrentFilterString() {
return this.currentFilterString;
}
public void setCurrentFilterString(String currentFilterString) {
this.currentFilterString = currentFilterString;
}
public SwapWorkflowActivity getActivity() {
return (SwapWorkflowActivity) getContext();
}
@ColorInt
public int getToolbarColour() {
return toolbarColor;
}
public String getToolbarTitle() {
return toolbarTitle;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -17,22 +17,25 @@
* MA 02110-1301, USA. * MA 02110-1301, USA.
*/ */
package org.fdroid.fdroid.localrepo; package org.fdroid.fdroid.nearby;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.IntentService; import android.app.IntentService;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Process; import android.os.Process;
import android.support.v4.provider.DocumentFile;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.fdroid.fdroid.AddRepoIntentService; import org.fdroid.fdroid.AddRepoIntentService;
import org.fdroid.fdroid.IndexUpdater; import org.fdroid.fdroid.IndexUpdater;
import org.fdroid.fdroid.IndexV1Updater; import org.fdroid.fdroid.IndexV1Updater;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.RepoProvider;
@ -41,10 +44,13 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.security.cert.Certificate; import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.jar.JarInputStream; import java.util.jar.JarInputStream;
import androidx.documentfile.provider.DocumentFile;
/** /**
* An {@link IntentService} subclass for handling asynchronous scanning of a * An {@link IntentService} subclass for handling asynchronous scanning of a
* removable storage device like an SD Card or USB OTG thumb drive using the * removable storage device like an SD Card or USB OTG thumb drive using the
@ -57,8 +63,11 @@ import java.util.jar.JarInputStream;
* {@link android.os.Build.VERSION_CODES#KITKAT android-19}, this approach is only * {@link android.os.Build.VERSION_CODES#KITKAT android-19}, this approach is only
* workable if {@link android.content.Intent#ACTION_OPEN_DOCUMENT_TREE} is available. * workable if {@link android.content.Intent#ACTION_OPEN_DOCUMENT_TREE} is available.
* It was added in {@link android.os.Build.VERSION_CODES#LOLLIPOP android-21}. * It was added in {@link android.os.Build.VERSION_CODES#LOLLIPOP android-21}.
* {@link android.os.storage.StorageVolume#createAccessIntent(String)} is also
* necessary to do this with any kind of rational UX.
* *
* @see <a href="https://commonsware.com/blog/2017/11/15/storage-situation-removable-storage.html"> The Storage Situation: Removable Storage </a> * @see <a href="https://commonsware.com/blog/2017/11/15/storage-situation-removable-storage.html">The Storage Situation: Removable Storage </a>
* @see <a href="https://commonsware.com/blog/2016/11/18/be-careful-scoped-directory-access.html">Be Careful with Scoped Directory Access</a>
* @see <a href="https://developer.android.com/training/articles/scoped-directory-access.html">Using Scoped Directory Access</a> * @see <a href="https://developer.android.com/training/articles/scoped-directory-access.html">Using Scoped Directory Access</a>
* @see <a href="https://developer.android.com/guide/topics/providers/document-provider.html">Open Files using Storage Access Framework</a> * @see <a href="https://developer.android.com/guide/topics/providers/document-provider.html">Open Files using Storage Access Framework</a>
*/ */
@ -66,18 +75,43 @@ import java.util.jar.JarInputStream;
public class TreeUriScannerIntentService extends IntentService { public class TreeUriScannerIntentService extends IntentService {
public static final String TAG = "TreeUriScannerIntentSer"; public static final String TAG = "TreeUriScannerIntentSer";
private static final String ACTION_SCAN_TREE_URI = "org.fdroid.fdroid.localrepo.action.SCAN_TREE_URI"; private static final String ACTION_SCAN_TREE_URI = "org.fdroid.fdroid.nearby.action.SCAN_TREE_URI";
/**
* @see <a href="https://android.googlesource.com/platform/frameworks/base/+/android-10.0.0_r38/core/java/android/provider/DocumentsContract.java#238">DocumentsContract.EXTERNAL_STORAGE_PROVIDER_AUTHORITY</a>
* @see <a href="https://android.googlesource.com/platform/frameworks/base/+/android-10.0.0_r38/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java#70">ExternalStorageProvider.AUTHORITY</a>
*/
public static final String EXTERNAL_STORAGE_PROVIDER_AUTHORITY = "com.android.externalstorage.documents";
public TreeUriScannerIntentService() { public TreeUriScannerIntentService() {
super("TreeUriScannerIntentService"); super("TreeUriScannerIntentService");
} }
public static void scan(Context context, Uri data) { public static void scan(Context context, Uri data) {
if (Preferences.get().isScanRemovableStorageEnabled()) { Intent intent = new Intent(context, TreeUriScannerIntentService.class);
Intent intent = new Intent(context, TreeUriScannerIntentService.class); intent.setAction(ACTION_SCAN_TREE_URI);
intent.setAction(ACTION_SCAN_TREE_URI); intent.setData(data);
intent.setData(data); context.startService(intent);
context.startService(intent); }
/**
* Now determine if it is External Storage that must be handled by the
* {@link TreeUriScannerIntentService} or whether it is External Storage
* like an SD Card that can be directly accessed via the file system.
*/
public static void onActivityResult(Context context, Intent intent) {
if (intent == null) {
return;
}
Uri uri = intent.getData();
if (uri != null) {
if (Build.VERSION.SDK_INT >= 19) {
ContentResolver contentResolver = context.getContentResolver();
int perms = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
contentResolver.takePersistableUriPermission(uri, perms);
}
String msg = String.format(context.getString(R.string.swap_toast_using_path), uri.toString());
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
scan(context, uri);
} }
} }
@ -95,20 +129,34 @@ public class TreeUriScannerIntentService extends IntentService {
searchDirectory(treeFile); searchDirectory(treeFile);
} }
/**
* Recursively search for {@link IndexV1Updater#SIGNED_FILE_NAME} starting
* from the given directory, looking at files first before recursing into
* directories. This is "depth last" since the index file is much more
* likely to be shallow than deep, and there can be a lot of files to
* search through starting at 4 or more levels deep, like the fdroid
* icons dirs and the per-app "external storage" dirs.
*/
private void searchDirectory(DocumentFile documentFileDir) { private void searchDirectory(DocumentFile documentFileDir) {
DocumentFile[] documentFiles = documentFileDir.listFiles(); DocumentFile[] documentFiles = documentFileDir.listFiles();
if (documentFiles == null) { if (documentFiles == null) {
return; return;
} }
boolean foundIndex = false;
ArrayList<DocumentFile> dirs = new ArrayList<>();
for (DocumentFile documentFile : documentFiles) { for (DocumentFile documentFile : documentFiles) {
if (documentFile.isDirectory()) { if (documentFile.isDirectory()) {
searchDirectory(documentFile); dirs.add(documentFile);
} else { } else if (!foundIndex) {
if (IndexV1Updater.SIGNED_FILE_NAME.equals(documentFile.getName())) { if (IndexV1Updater.SIGNED_FILE_NAME.equals(documentFile.getName())) {
registerRepo(documentFile); registerRepo(documentFile);
foundIndex = true;
} }
} }
} }
for (DocumentFile dir : dirs) {
searchDirectory(dir);
}
} }
/** /**
@ -123,9 +171,7 @@ public class TreeUriScannerIntentService extends IntentService {
private void registerRepo(DocumentFile index) { private void registerRepo(DocumentFile index) {
InputStream inputStream = null; InputStream inputStream = null;
try { try {
Log.i(TAG, "FOUND: " + index.getUri());
inputStream = getContentResolver().openInputStream(index.getUri()); inputStream = getContentResolver().openInputStream(index.getUri());
Log.i(TAG, "repo URL: " + index.getParentFile().getUri());
registerRepo(this, inputStream, index.getParentFile().getUri()); registerRepo(this, inputStream, index.getParentFile().getUri());
} catch (IOException | IndexUpdater.SigningException e) { } catch (IOException | IndexUpdater.SigningException e) {
e.printStackTrace(); e.printStackTrace();
@ -145,7 +191,6 @@ public class TreeUriScannerIntentService extends IntentService {
JarEntry indexEntry = (JarEntry) jarFile.getEntry(IndexV1Updater.DATA_FILE_NAME); JarEntry indexEntry = (JarEntry) jarFile.getEntry(IndexV1Updater.DATA_FILE_NAME);
IOUtils.readLines(jarFile.getInputStream(indexEntry)); IOUtils.readLines(jarFile.getInputStream(indexEntry));
Certificate certificate = IndexUpdater.getSigningCertFromJar(indexEntry); Certificate certificate = IndexUpdater.getSigningCertFromJar(indexEntry);
Log.i(TAG, "Got certificate: " + certificate);
String fingerprint = Utils.calcFingerprint(certificate); String fingerprint = Utils.calcFingerprint(certificate);
Log.i(TAG, "Got fingerprint: " + fingerprint); Log.i(TAG, "Got fingerprint: " + fingerprint);
destFile.delete(); destFile.delete();

View File

@ -0,0 +1,97 @@
package org.fdroid.fdroid.nearby;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.storage.StorageManager;
import android.provider.DocumentsContract;
import java.io.File;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
/**
* @see <a href="https://stackoverflow.com/a/36162691">Android 5.0 DocumentFile from tree URI</a>
*/
public final class TreeUriUtils {
public static final String TAG = "TreeUriUtils";
private static final String PRIMARY_VOLUME_NAME = "primary";
@Nullable
public static String getFullPathFromTreeUri(Context context, @Nullable final Uri treeUri) {
if (treeUri == null) return null;
String volumePath = getVolumePath(getVolumeIdFromTreeUri(treeUri), context);
if (volumePath == null) return File.separator;
if (volumePath.endsWith(File.separator))
volumePath = volumePath.substring(0, volumePath.length() - 1);
String documentPath = getDocumentPathFromTreeUri(treeUri);
if (documentPath.endsWith(File.separator))
documentPath = documentPath.substring(0, documentPath.length() - 1);
if (documentPath.length() > 0) {
if (documentPath.startsWith(File.separator))
return volumePath + documentPath;
else
return volumePath + File.separator + documentPath;
} else return volumePath;
}
@SuppressLint("ObsoleteSdkInt")
private static String getVolumePath(final String volumeId, Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return null;
try {
StorageManager mStorageManager = ContextCompat.getSystemService(context, StorageManager.class);
Class<?> storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
Method getUuid = storageVolumeClazz.getMethod("getUuid");
Method getPath = storageVolumeClazz.getMethod("getPath");
Method isPrimary = storageVolumeClazz.getMethod("isPrimary");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String uuid = (String) getUuid.invoke(storageVolumeElement);
Boolean primary = (Boolean) isPrimary.invoke(storageVolumeElement);
// primary volume?
if (primary && PRIMARY_VOLUME_NAME.equals(volumeId))
return (String) getPath.invoke(storageVolumeElement);
// other volumes?
if (uuid != null && uuid.equals(volumeId))
return (String) getPath.invoke(storageVolumeElement);
}
// not found.
return null;
} catch (Exception ex) {
return null;
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String getVolumeIdFromTreeUri(final Uri treeUri) {
final String docId = DocumentsContract.getTreeDocumentId(treeUri);
final String[] split = docId.split(":");
if (split.length > 0) return split[0];
else return null;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String getDocumentPathFromTreeUri(final Uri treeUri) {
final String docId = DocumentsContract.getTreeDocumentId(treeUri);
final String[] split = docId.split(":");
if ((split.length >= 2) && (split[1] != null)) return split[1];
else return File.separator;
}
}

View File

@ -0,0 +1,77 @@
/*
* Copyright (C) 2018-2019 Hans-Christoph Steiner <hans@eds.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.fdroid.fdroid.nearby;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.UriPermission;
import android.database.ContentObserver;
import android.hardware.usb.UsbManager;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import org.fdroid.fdroid.views.main.NearbyViewBinder;
import androidx.annotation.RequiresApi;
/**
* This is just a shim to receive {@link UsbManager#ACTION_USB_ACCESSORY_ATTACHED}
* events.
*/
public class UsbDeviceAttachedReceiver extends BroadcastReceiver {
public static final String TAG = "UsbDeviceAttachedReceiv";
@RequiresApi(api = 19)
@Override
public void onReceive(final Context context, Intent intent) {
if (Build.VERSION.SDK_INT < 19) {
return;
}
if (intent == null || TextUtils.isEmpty(intent.getAction())
|| !UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
Log.i(TAG, "ignoring irrelevant intent: " + intent);
return;
}
Log.i(TAG, "handling intent: " + intent);
final ContentResolver contentResolver = context.getContentResolver();
for (final UriPermission uriPermission : contentResolver.getPersistedUriPermissions()) {
Uri uri = uriPermission.getUri();
final ContentObserver contentObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange, Uri uri) {
NearbyViewBinder.updateUsbOtg(context);
}
};
contentResolver.registerContentObserver(uri, true, contentObserver);
UsbDeviceDetachedReceiver.contentObservers.put(uri, contentObserver);
}
}
}

View File

@ -0,0 +1,68 @@
/*
* Copyright (C) 2018-2019 Hans-Christoph Steiner <hans@eds.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.fdroid.fdroid.nearby;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.hardware.usb.UsbManager;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import org.fdroid.fdroid.views.main.NearbyViewBinder;
import java.util.HashMap;
import androidx.annotation.RequiresApi;
/**
* This is just a shim to receive {@link UsbManager#ACTION_USB_DEVICE_DETACHED}
* events.
*/
public class UsbDeviceDetachedReceiver extends BroadcastReceiver {
public static final String TAG = "UsbDeviceDetachedReceiv";
static final HashMap<Uri, ContentObserver> contentObservers = new HashMap<>();
@RequiresApi(api = 19)
@Override
public void onReceive(Context context, Intent intent) {
if (Build.VERSION.SDK_INT < 19) {
return;
}
if (intent == null || TextUtils.isEmpty(intent.getAction())
|| !UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) {
Log.i(TAG, "ignoring irrelevant intent: " + intent);
return;
}
Log.i(TAG, "handling intent: " + intent);
final ContentResolver contentResolver = context.getContentResolver();
NearbyViewBinder.updateUsbOtg(context);
for (ContentObserver contentObserver : contentObservers.values()) {
contentResolver.unregisterContentObserver(contentObserver);
}
}
}

View File

@ -0,0 +1,24 @@
package org.fdroid.fdroid.nearby;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Environment;
import org.fdroid.fdroid.views.main.NearbyViewBinder;
public class UsbDeviceMediaMountedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null || intent.getAction() == null) {
return;
}
String action = intent.getAction();
if (Environment.MEDIA_BAD_REMOVAL.equals(action)
|| Environment.MEDIA_MOUNTED.equals(action)
|| Environment.MEDIA_REMOVED.equals(action)
|| Environment.MEDIA_EJECTING.equals(action)) {
NearbyViewBinder.updateUsbOtg(context);
}
}
}

View File

@ -1,11 +1,11 @@
package org.fdroid.fdroid.receiver; package org.fdroid.fdroid.nearby;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.net.WifiStateChangeService;
public class WifiStateChangeReceiver extends BroadcastReceiver { public class WifiStateChangeReceiver extends BroadcastReceiver {
private static final String TAG = "WifiStateChangeReceiver"; private static final String TAG = "WifiStateChangeReceiver";

View File

@ -1,4 +1,4 @@
package org.fdroid.fdroid.net; package org.fdroid.fdroid.nearby;
import android.app.IntentService; import android.app.IntentService;
import android.content.ComponentName; import android.content.ComponentName;
@ -6,22 +6,25 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.DhcpInfo; import android.net.DhcpInfo;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo; import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Build; import android.os.Build;
import android.support.annotation.Nullable;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.apache.commons.net.util.SubnetUtils; import org.apache.commons.net.util.SubnetUtils;
import org.fdroid.fdroid.BuildConfig; import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService; import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.localrepo.LocalRepoKeyStore;
import org.fdroid.fdroid.localrepo.LocalRepoManager;
import java.net.Inet6Address; import java.net.Inet6Address;
import java.net.InetAddress; import java.net.InetAddress;
@ -32,11 +35,14 @@ import java.security.cert.Certificate;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Locale; import java.util.Locale;
import cc.mvdan.accesspoint.WifiApControl;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
/** /**
* Handle state changes to the device's wifi, storing the required bits. * Handle state changes to the device's wifi, storing the required bits.
* The {@link Intent} that starts it either has no extras included, * The {@link Intent} that starts it either has no extras included,
* which is how it can be triggered by code, or it came in from the system * which is how it can be triggered by code, or it came in from the system
* via {@link org.fdroid.fdroid.receiver.WifiStateChangeReceiver}, in * via {@link WifiStateChangeReceiver}, in
* which case an instance of {@link NetworkInfo} is included. * which case an instance of {@link NetworkInfo} is included.
* <p> * <p>
* The work is done in a {@link Thread} so that new incoming {@code Intents} * The work is done in a {@link Thread} so that new incoming {@code Intents}
@ -59,10 +65,14 @@ public class WifiStateChangeService extends IntentService {
private static final String TAG = "WifiStateChangeService"; private static final String TAG = "WifiStateChangeService";
public static final String BROADCAST = "org.fdroid.fdroid.action.WIFI_CHANGE"; public static final String BROADCAST = "org.fdroid.fdroid.action.WIFI_CHANGE";
public static final String EXTRA_STATUS = "wifiStateChangeStatus";
private WifiManager wifiManager; private WifiManager wifiManager;
private static WifiInfoThread wifiInfoThread; private static WifiInfoThread wifiInfoThread;
private static int previousWifiState = Integer.MIN_VALUE; private static int previousWifiState = Integer.MIN_VALUE;
private static int wifiState;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public WifiStateChangeService() { public WifiStateChangeService() {
super("WifiStateChangeService"); super("WifiStateChangeService");
@ -76,6 +86,12 @@ public class WifiStateChangeService extends IntentService {
context.startService(intent); context.startService(intent);
} }
@Override
public void onDestroy() {
compositeDisposable.dispose();
super.onDestroy();
}
@Override @Override
protected void onHandleIntent(Intent intent) { protected void onHandleIntent(Intent intent) {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST); android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST);
@ -85,10 +101,11 @@ public class WifiStateChangeService extends IntentService {
} }
Utils.debugLog(TAG, "WiFi change service started."); Utils.debugLog(TAG, "WiFi change service started.");
NetworkInfo ni = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); NetworkInfo ni = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE); wifiManager = ContextCompat.getSystemService(getApplicationContext(), WifiManager.class);
int wifiState = wifiManager.getWifiState(); wifiState = wifiManager.getWifiState();
if (ni == null || ni.isConnected()) { Utils.debugLog(TAG, "ni == " + ni + " wifiState == " + printWifiState(wifiState));
Utils.debugLog(TAG, "ni == " + ni + " wifiState == " + printWifiState(wifiState)); if (ni == null
|| ni.getState() == NetworkInfo.State.CONNECTED || ni.getState() == NetworkInfo.State.DISCONNECTED) {
if (previousWifiState != wifiState && if (previousWifiState != wifiState &&
(wifiState == WifiManager.WIFI_STATE_ENABLED (wifiState == WifiManager.WIFI_STATE_ENABLED
|| wifiState == WifiManager.WIFI_STATE_DISABLING // might be switching to hotspot || wifiState == WifiManager.WIFI_STATE_DISABLING // might be switching to hotspot
@ -102,13 +119,12 @@ public class WifiStateChangeService extends IntentService {
} }
if (Build.VERSION.SDK_INT < 21 && wifiState == WifiManager.WIFI_STATE_ENABLED) { if (Build.VERSION.SDK_INT < 21 && wifiState == WifiManager.WIFI_STATE_ENABLED) {
UpdateService.scheduleIfStillOnWifi(this); compositeDisposable.add(UpdateService.scheduleIfStillOnWifi(this).subscribe());
} }
} }
} }
public class WifiInfoThread extends Thread { public class WifiInfoThread extends Thread {
private static final String TAG = "WifiInfoThread";
@Override @Override
public void run() { public void run() {
@ -127,6 +143,7 @@ public class WifiStateChangeService extends IntentService {
if (wifiState == WifiManager.WIFI_STATE_ENABLED) { if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
wifiInfo = wifiManager.getConnectionInfo(); wifiInfo = wifiManager.getConnectionInfo();
FDroidApp.ipAddressString = formatIpAddress(wifiInfo.getIpAddress()); FDroidApp.ipAddressString = formatIpAddress(wifiInfo.getIpAddress());
setSsid(wifiInfo);
DhcpInfo dhcpInfo = wifiManager.getDhcpInfo(); DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
if (dhcpInfo != null) { if (dhcpInfo != null) {
String netmask = formatIpAddress(dhcpInfo.netmask); String netmask = formatIpAddress(dhcpInfo.netmask);
@ -144,14 +161,13 @@ public class WifiStateChangeService extends IntentService {
setIpInfoFromNetworkInterface(); setIpInfoFromNetworkInterface();
} }
} else if (wifiState == WifiManager.WIFI_STATE_DISABLED } else if (wifiState == WifiManager.WIFI_STATE_DISABLED
|| wifiState == WifiManager.WIFI_STATE_DISABLING) { || wifiState == WifiManager.WIFI_STATE_DISABLING
|| wifiState == WifiManager.WIFI_STATE_UNKNOWN) {
// try once to see if its a hotspot // try once to see if its a hotspot
setIpInfoFromNetworkInterface(); setIpInfoFromNetworkInterface();
if (FDroidApp.ipAddressString == null) { if (FDroidApp.ipAddressString == null) {
return; return;
} }
} else { // a hotspot can be active during WIFI_STATE_UNKNOWN
setIpInfoFromNetworkInterface();
} }
if (retryCount > 120) { if (retryCount > 120) {
@ -168,17 +184,7 @@ public class WifiStateChangeService extends IntentService {
return; return;
} }
if (wifiInfo != null) { setSsid(wifiInfo);
String ssid = wifiInfo.getSSID();
Utils.debugLog(TAG, "Have wifi info, connected to " + ssid);
if (ssid != null) {
FDroidApp.ssid = ssid.replaceAll("^\"(.*)\"$", "$1");
}
String bssid = wifiInfo.getBSSID();
if (bssid != null) {
FDroidApp.bssid = bssid;
}
}
String scheme; String scheme;
if (Preferences.get().isLocalRepoHttpsEnabled()) { if (Preferences.get().isLocalRepoHttpsEnabled()) {
@ -228,10 +234,56 @@ public class WifiStateChangeService extends IntentService {
return; return;
} }
Intent intent = new Intent(BROADCAST); Intent intent = new Intent(BROADCAST);
intent.putExtra(EXTRA_STATUS, wifiState);
LocalBroadcastManager.getInstance(WifiStateChangeService.this).sendBroadcast(intent); LocalBroadcastManager.getInstance(WifiStateChangeService.this).sendBroadcast(intent);
} }
} }
private void setSsid(WifiInfo wifiInfo) {
if (wifiInfo != null && wifiInfo.getBSSID() != null) {
String ssid = wifiInfo.getSSID();
Utils.debugLog(TAG, "Have wifi info, connected to " + ssid);
if (ssid == null) {
FDroidApp.ssid = getString(R.string.swap_blank_wifi_ssid);
} else {
FDroidApp.ssid = ssid.replaceAll("^\"(.*)\"$", "$1");
}
FDroidApp.bssid = wifiInfo.getBSSID();
} else {
WifiApControl wifiApControl = null;
try {
wifiApControl = WifiApControl.getInstance(this);
wifiApControl.isEnabled();
} catch (NullPointerException e) {
wifiApControl = null;
}
Utils.debugLog(TAG, "WifiApControl: " + wifiApControl);
if (wifiApControl == null && FDroidApp.ipAddressString != null) {
wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo != null && wifiInfo.getBSSID() != null) {
setSsid(wifiInfo);
} else {
FDroidApp.ssid = getString(R.string.swap_active_hotspot, "");
}
} else if (wifiApControl != null && wifiApControl.isEnabled()) {
WifiConfiguration wifiConfiguration = wifiApControl.getConfiguration();
Utils.debugLog(TAG, "WifiConfiguration: " + wifiConfiguration);
if (wifiConfiguration == null) {
FDroidApp.ssid = getString(R.string.swap_active_hotspot, "");
FDroidApp.bssid = "";
return;
}
if (wifiConfiguration.hiddenSSID) {
FDroidApp.ssid = getString(R.string.swap_hidden_wifi_ssid);
} else {
FDroidApp.ssid = wifiConfiguration.SSID;
}
FDroidApp.bssid = wifiConfiguration.BSSID;
}
}
}
/** /**
* Search for known Wi-Fi, Hotspot, and local network interfaces and get * Search for known Wi-Fi, Hotspot, and local network interfaces and get
* the IP Address info from it. This is necessary because network * the IP Address info from it. This is necessary because network
@ -251,7 +303,7 @@ public class WifiStateChangeService extends IntentService {
while (networkInterfaces.hasMoreElements()) { while (networkInterfaces.hasMoreElements()) {
NetworkInterface netIf = networkInterfaces.nextElement(); NetworkInterface netIf = networkInterfaces.nextElement();
for (Enumeration<InetAddress> inetAddresses = netIf.getInetAddresses(); inetAddresses.hasMoreElements();) { for (Enumeration<InetAddress> inetAddresses = netIf.getInetAddresses(); inetAddresses.hasMoreElements(); ) {
InetAddress inetAddress = inetAddresses.nextElement(); InetAddress inetAddress = inetAddresses.nextElement();
if (inetAddress.isLoopbackAddress() || inetAddress instanceof Inet6Address) { if (inetAddress.isLoopbackAddress() || inetAddress instanceof Inet6Address) {
continue; continue;
@ -276,7 +328,7 @@ public class WifiStateChangeService extends IntentService {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
e.printStackTrace(); e.printStackTrace();
} else { } else {
Log.i(TAG, e.getLocalizedMessage()); Log.i(TAG, "Getting subnet failed: " + e.getLocalizedMessage());
} }
} }
} }

View File

@ -1,16 +1,36 @@
package org.fdroid.fdroid.localrepo.peers; package org.fdroid.fdroid.nearby.peers;
import android.bluetooth.BluetoothClass.Device;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.os.Parcel; import android.os.Parcel;
import android.text.TextUtils;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.localrepo.type.BluetoothSwap;
import androidx.annotation.Nullable;
public class BluetoothPeer implements Peer { public class BluetoothPeer implements Peer {
private static final String BLUETOOTH_NAME_TAG = "FDroid:";
private final BluetoothDevice device; private final BluetoothDevice device;
public BluetoothPeer(BluetoothDevice device) { /**
* Return a instance if the {@link BluetoothDevice} is a device that could
* host a swap repo.
*/
@Nullable
public static BluetoothPeer getInstance(@Nullable BluetoothDevice device) {
if (device != null && device.getName() != null &&
(device.getBluetoothClass().getDeviceClass() == Device.COMPUTER_HANDHELD_PC_PDA
|| device.getBluetoothClass().getDeviceClass() == Device.COMPUTER_PALM_SIZE_PC_PDA
|| device.getBluetoothClass().getDeviceClass() == Device.PHONE_SMART)) {
return new BluetoothPeer(device);
}
return null;
}
private BluetoothPeer(BluetoothDevice device) {
this.device = device; this.device = device;
} }
@ -21,19 +41,18 @@ public class BluetoothPeer implements Peer {
@Override @Override
public String getName() { public String getName() {
return device.getName().replaceAll("^" + BluetoothSwap.BLUETOOTH_NAME_TAG, ""); return device.getName().replaceAll("^" + BLUETOOTH_NAME_TAG, "");
} }
@Override @Override
public int getIcon() { public int getIcon() {
return R.drawable.ic_bluetooth_white; return R.drawable.ic_bluetooth;
} }
@Override @Override
public boolean equals(Object peer) { public boolean equals(Object peer) {
return peer != null return peer instanceof BluetoothPeer
&& peer instanceof BluetoothPeer && TextUtils.equals(((BluetoothPeer) peer).device.getAddress(), device.getAddress());
&& ((BluetoothPeer) peer).device.getAddress().equals(device.getAddress());
} }
@Override @Override
@ -48,7 +67,7 @@ public class BluetoothPeer implements Peer {
/** /**
* Return the fingerprint of the signing key, or {@code null} if it is not set. * Return the fingerprint of the signing key, or {@code null} if it is not set.
* * <p>
* This is not yet stored for Bluetooth connections. Once a device is connected to a bluetooth * This is not yet stored for Bluetooth connections. Once a device is connected to a bluetooth
* socket, if we trust it enough to accept a fingerprint from it somehow, then we may as well * socket, if we trust it enough to accept a fingerprint from it somehow, then we may as well
* trust it enough to receive an index from it that contains a fingerprint we can use. * trust it enough to receive an index from it that contains a fingerprint we can use.

View File

@ -1,16 +1,42 @@
package org.fdroid.fdroid.localrepo.peers; package org.fdroid.fdroid.nearby.peers;
import android.net.Uri; import android.net.Uri;
import android.os.Parcel; import android.os.Parcel;
import android.text.TextUtils;
import org.fdroid.fdroid.FDroidApp;
import javax.jmdns.ServiceInfo; import javax.jmdns.ServiceInfo;
import javax.jmdns.impl.FDroidServiceInfo; import javax.jmdns.impl.FDroidServiceInfo;
import androidx.annotation.Nullable;
public class BonjourPeer extends WifiPeer { public class BonjourPeer extends WifiPeer {
private static final String TAG = "BonjourPeer";
public static final String FINGERPRINT = "fingerprint";
public static final String NAME = "name";
public static final String PATH = "path";
public static final String TYPE = "type";
private final FDroidServiceInfo serviceInfo; private final FDroidServiceInfo serviceInfo;
public BonjourPeer(ServiceInfo serviceInfo) { /**
* Return a instance if the {@link ServiceInfo} is fully resolved and does
* not represent this device, but something else on the network.
*/
@Nullable
public static BonjourPeer getInstance(ServiceInfo serviceInfo) {
String type = serviceInfo.getPropertyString(TYPE);
String fingerprint = serviceInfo.getPropertyString(FINGERPRINT);
if (type == null || !type.startsWith("fdroidrepo")
|| TextUtils.equals(FDroidApp.repo.fingerprint, fingerprint)) {
return null;
}
return new BonjourPeer(serviceInfo);
}
private BonjourPeer(ServiceInfo serviceInfo) {
this.serviceInfo = new FDroidServiceInfo(serviceInfo); this.serviceInfo = new FDroidServiceInfo(serviceInfo);
this.name = serviceInfo.getDomain(); this.name = serviceInfo.getDomain();
this.uri = Uri.parse(this.serviceInfo.getRepoAddress()); this.uri = Uri.parse(this.serviceInfo.getRepoAddress());
@ -27,15 +53,6 @@ public class BonjourPeer extends WifiPeer {
return serviceInfo.getName(); return serviceInfo.getName();
} }
@Override
public boolean equals(Object peer) {
if (peer != null && peer instanceof BonjourPeer) {
BonjourPeer that = (BonjourPeer) peer;
return this.getFingerprint().equals(that.getFingerprint());
}
return false;
}
@Override @Override
public int hashCode() { public int hashCode() {
String fingerprint = getFingerprint(); String fingerprint = getFingerprint();

View File

@ -0,0 +1,29 @@
package org.fdroid.fdroid.nearby.peers;
import android.os.Parcelable;
import androidx.annotation.DrawableRes;
/**
* TODO This model assumes that "peers" from Bluetooth, Bonjour, and WiFi are
* different things. They are not different repos though, they all point to
* the same repos. This should really be combined to be a single "RemoteRepo"
* class that represents a single device's local repo, and can have zero to
* many ways to connect to it (e.g. Bluetooth, WiFi, USB Thumb Drive, SD Card,
* WiFi Direct, etc).
*/
public interface Peer extends Parcelable {
String getName();
@DrawableRes
int getIcon();
boolean equals(Object peer);
String getRepoAddress();
String getFingerprint();
boolean shouldPromptForSwapBack();
}

View File

@ -1,7 +1,8 @@
package org.fdroid.fdroid.localrepo.peers; package org.fdroid.fdroid.nearby.peers;
import android.net.Uri; import android.net.Uri;
import android.os.Parcel; import android.os.Parcel;
import android.text.TextUtils;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.NewRepoConfig; import org.fdroid.fdroid.data.NewRepoConfig;
@ -26,6 +27,35 @@ public class WifiPeer implements Peer {
this.shouldPromptForSwapBack = shouldPromptForSwapBack; this.shouldPromptForSwapBack = shouldPromptForSwapBack;
} }
/**
* Return if this instance points to the same device as that instance, even
* if some of the configuration details are not the same, like whether one
* instance supplies the fingerprint and the other does not, then use IP
* address and port number.
*/
@Override
public boolean equals(Object peer) {
if (peer instanceof BluetoothPeer) {
return false;
}
String fingerprint = getFingerprint();
if (this instanceof BonjourPeer && peer instanceof BonjourPeer) {
BonjourPeer that = (BonjourPeer) peer;
return TextUtils.equals(this.getFingerprint(), that.getFingerprint());
} else {
WifiPeer that = (WifiPeer) peer;
if (!TextUtils.isEmpty(fingerprint) && TextUtils.equals(this.getFingerprint(), that.getFingerprint())) {
return true;
}
return TextUtils.equals(this.getRepoAddress(), that.getRepoAddress());
}
}
@Override
public int hashCode() {
return (uri.getHost() + uri.getPort()).hashCode();
}
@Override @Override
public String getName() { public String getName() {
return name; return name;
@ -33,7 +63,7 @@ public class WifiPeer implements Peer {
@Override @Override
public int getIcon() { public int getIcon() {
return R.drawable.ic_network_wifi_white; return R.drawable.ic_wifi;
} }
@Override @Override

View File

@ -1,68 +0,0 @@
package org.fdroid.fdroid.net.bluetooth;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import java.io.IOException;
public class BluetoothClient {
@SuppressWarnings("unused")
private static final String TAG = "BluetoothClient";
private final BluetoothDevice device;
public BluetoothClient(BluetoothDevice device) {
this.device = device;
}
public BluetoothClient(String macAddress) {
device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(macAddress);
}
public BluetoothConnection openConnection() throws IOException {
BluetoothSocket socket = null;
BluetoothConnection connection = null;
try {
socket = device.createInsecureRfcommSocketToServiceRecord(BluetoothConstants.fdroidUuid());
connection = new BluetoothConnection(socket);
connection.open();
return connection;
} catch (IOException e1) {
if (connection != null) {
connection.closeQuietly();
}
throw e1;
/*
Log.e(TAG, "There was an error while establishing Bluetooth connection. Falling back to reflection");
Class<?> clazz = socket.getRemoteDevice().getClass();
Class<?>[] paramTypes = new Class<?>[]{Integer.TYPE};
Method method;
try {
method = clazz.getMethod("createInsecureRfcommSocket", paramTypes);
Object[] params = new Object[]{1};
BluetoothSocket sockFallback = (BluetoothSocket) method.invoke(socket.getRemoteDevice(), params);
BluetoothConnection connection = new BluetoothConnection(sockFallback);
connection.open();
return connection;
} catch (NoSuchMethodException e) {
throw e1;
} catch (IllegalAccessException e) {
throw e1;
} catch (InvocationTargetException e) {
throw e1;
}*/
// Don't catch exceptions this time, let it bubble up as we did our best but don't
// have anythign else to offer in terms of resolving the problem right now.
}
}
}

View File

@ -1,18 +1,21 @@
package org.fdroid.fdroid.views.hiding; package org.fdroid.fdroid.panic;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.google.android.material.appbar.MaterialToolbar;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
/** /**
* A very hacky calculator which is barely functional. * A very hacky calculator which is barely functional.
* It is just meant to pass a very casual inspection. * It is just meant to pass a very casual inspection.
@ -28,17 +31,21 @@ public class CalculatorActivity extends AppCompatActivity {
// unary operators // unary operators
private static final String PERCENT = "%"; private static final String PERCENT = "%";
private @Nullable String lastOp; @Nullable
private String lastOp;
// views // views
private TextView textView; private TextView textView;
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
FDroidApp fdroidApp = (FDroidApp) getApplication();
fdroidApp.applyPureBlackBackgroundInDarkTheme(this);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculator); setContentView(R.layout.activity_calculator);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); MaterialToolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
textView = (TextView) findViewById(R.id.textView); textView = (TextView) findViewById(R.id.textView);

View File

@ -0,0 +1,42 @@
package org.fdroid.fdroid.panic;
import android.content.Context;
import android.util.AttributeSet;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import androidx.core.content.ContextCompat;
import androidx.preference.CheckBoxPreference;
import androidx.preference.PreferenceViewHolder;
public class DestructiveCheckBoxPreference extends CheckBoxPreference {
public DestructiveCheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public DestructiveCheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public DestructiveCheckBoxPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DestructiveCheckBoxPreference(Context context) {
super(context);
}
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
if (!holder.itemView.isEnabled()) {
return;
}
if (FDroidApp.isAppThemeLight()) {
holder.itemView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.panic_destructive_light));
} else {
holder.itemView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.panic_destructive_dark));
}
}
}

View File

@ -0,0 +1,39 @@
package org.fdroid.fdroid.panic;
import android.content.Context;
import android.util.AttributeSet;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import androidx.core.content.ContextCompat;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
public class DestructivePreference extends Preference {
public DestructivePreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public DestructivePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public DestructivePreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DestructivePreference(Context context) {
super(context);
}
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
if (FDroidApp.isAppThemeLight()) {
holder.itemView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.panic_destructive_light));
} else {
holder.itemView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.panic_destructive_dark));
}
}
}

View File

@ -1,11 +1,11 @@
package org.fdroid.fdroid.views.panic; package org.fdroid.fdroid.panic;
import android.support.v7.app.AppCompatActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class ExitActivity extends AppCompatActivity { public class ExitActivity extends AppCompatActivity {
@Override @Override

View File

@ -1,4 +1,4 @@
package org.fdroid.fdroid.views.hiding; package org.fdroid.fdroid.panic;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
@ -7,12 +7,14 @@ import android.content.Intent;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AlertDialog;
import org.fdroid.fdroid.BuildConfig; import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.views.main.MainActivity; import org.fdroid.fdroid.views.main.MainActivity;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.NotificationManagerCompat;
/** /**
* This class is encapsulating all methods related to hiding the app from the launcher * This class is encapsulating all methods related to hiding the app from the launcher
* and restoring it. * and restoring it.

View File

@ -0,0 +1,32 @@
package org.fdroid.fdroid.panic;
import android.os.Bundle;
import android.view.View;
import com.google.android.material.appbar.MaterialToolbar;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import androidx.appcompat.app.AppCompatActivity;
public class PanicPreferencesActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle bundle) {
FDroidApp fdroidApp = (FDroidApp) getApplication();
fdroidApp.applyPureBlackBackgroundInDarkTheme(this);
super.onCreate(bundle);
setContentView(R.layout.activity_panic_settings);
MaterialToolbar toolbar = findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Handle navigation icon press
onBackPressed();
}
});
}
}

View File

@ -1,6 +1,5 @@
package org.fdroid.fdroid.views.panic; package org.fdroid.fdroid.panic;
import android.app.Activity;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
@ -8,49 +7,57 @@ import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.LightingColorFilter;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.ColorInt;
import android.support.annotation.Nullable;
import android.support.v14.preference.PreferenceFragment;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.preference.CheckBoxPreference;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.TypedValue; import android.util.TypedValue;
import info.guardianproject.panic.Panic;
import info.guardianproject.panic.PanicResponder;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.views.hiding.HidingManager; import org.fdroid.fdroid.installer.PrivilegedInstaller;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Set;
public class PanicPreferencesFragment extends PreferenceFragment import androidx.annotation.ColorInt;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.preference.CheckBoxPreference;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
import info.guardianproject.panic.Panic;
import info.guardianproject.panic.PanicResponder;
public class PanicPreferencesFragment extends PreferenceFragmentCompat
implements SharedPreferences.OnSharedPreferenceChangeListener { implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String PREF_EXIT = Preferences.PREF_PANIC_EXIT;
private static final String PREF_APP = "pref_panic_app"; private static final String PREF_APP = "pref_panic_app";
private static final String PREF_HIDE = Preferences.PREF_PANIC_HIDE;
private PackageManager pm; private PackageManager pm;
private ListPreference prefApp; private ListPreference prefApp;
private CheckBoxPreference prefExit; private CheckBoxPreference prefExit;
private CheckBoxPreference prefHide; private CheckBoxPreference prefHide;
private CheckBoxPreference prefResetRepos;
private PreferenceCategory categoryAppsToUninstall;
@Override @Override
public void onCreatePreferences(Bundle bundle, String s) { public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.preferences_panic); addPreferencesFromResource(R.xml.preferences_panic);
pm = getActivity().getPackageManager(); pm = getActivity().getPackageManager();
prefExit = (CheckBoxPreference) findPreference(PREF_EXIT); prefExit = (CheckBoxPreference) findPreference(Preferences.PREF_PANIC_EXIT);
prefApp = (ListPreference) findPreference(PREF_APP); prefApp = (ListPreference) findPreference(PREF_APP);
prefHide = (CheckBoxPreference) findPreference(PREF_HIDE); prefHide = (CheckBoxPreference) findPreference(Preferences.PREF_PANIC_HIDE);
prefHide.setTitle(getString(R.string.panic_hide_title, getString(R.string.app_name))); prefHide.setTitle(getString(R.string.panic_hide_title, getString(R.string.app_name)));
prefResetRepos = (CheckBoxPreference) findPreference(Preferences.PREF_PANIC_RESET_REPOS);
categoryAppsToUninstall = (PreferenceCategory) findPreference("pref_panic_apps_to_uninstall");
if (PanicResponder.checkForDisconnectIntent(getActivity())) { if (PanicResponder.checkForDisconnectIntent(getActivity())) {
// the necessary action should have been performed by the check already // the necessary action should have been performed by the check already
@ -73,9 +80,12 @@ public class PanicPreferencesFragment extends PreferenceFragment
if (packageName.equals(Panic.PACKAGE_NAME_NONE)) { if (packageName.equals(Panic.PACKAGE_NAME_NONE)) {
prefHide.setChecked(false); prefHide.setChecked(false);
prefHide.setEnabled(false); prefHide.setEnabled(false);
getActivity().setResult(Activity.RESULT_CANCELED); prefResetRepos.setChecked(false);
prefResetRepos.setEnabled(false);
getActivity().setResult(AppCompatActivity.RESULT_CANCELED);
} else { } else {
prefHide.setEnabled(true); prefHide.setEnabled(true);
prefResetRepos.setEnabled(true);
} }
showPanicApp(packageName); showPanicApp(packageName);
return true; return true;
@ -88,6 +98,48 @@ public class PanicPreferencesFragment extends PreferenceFragment
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
if (!PrivilegedInstaller.isDefault(getActivity())) {
getPreferenceScreen().removePreference(categoryAppsToUninstall);
return;
}
showWipeList();
}
private void showWipeList() {
Intent intent = new Intent(getActivity(), SelectInstalledAppsActivity.class);
intent.setAction(Intent.ACTION_MAIN);
Set<String> wipeSet = Preferences.get().getPanicWipeSet();
categoryAppsToUninstall.removeAll();
if (Panic.PACKAGE_NAME_NONE.equals(prefApp.getValue())) {
categoryAppsToUninstall.setEnabled(false);
return;
}
categoryAppsToUninstall.setEnabled(true);
if (wipeSet.size() > 0) {
for (String packageName : wipeSet) {
Preference preference = new DestructivePreference(getActivity());
preference.setSingleLineTitle(true);
preference.setIntent(intent);
categoryAppsToUninstall.addPreference(preference);
try {
preference.setTitle(pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0)));
preference.setIcon(pm.getApplicationIcon(packageName));
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
preference.setTitle(packageName);
}
}
} else {
Preference preference = new Preference(requireActivity());
preference.setIntent(intent);
Drawable icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_add_circle_outline);
icon.setColorFilter(new LightingColorFilter(0, getResources().getColor(R.color.swap_light_grey_icon)));
preference.setSingleLineTitle(true);
preference.setTitle(R.string.panic_add_apps_to_uninstall);
preference.setIcon(icon);
categoryAppsToUninstall.addPreference(preference);
}
} }
@Override @Override
@ -98,11 +150,13 @@ public class PanicPreferencesFragment extends PreferenceFragment
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(PREF_HIDE) && sharedPreferences.getBoolean(PREF_HIDE, false)) { if (key.equals(Preferences.PREF_PANIC_HIDE)
&& sharedPreferences.getBoolean(Preferences.PREF_PANIC_HIDE, false)) {
showHideConfirmationDialog(); showHideConfirmationDialog();
} }
// disable "hiding" if "exit" gets disabled // disable "hiding" if "exit" gets disabled
if (key.equals(PREF_EXIT) && !sharedPreferences.getBoolean(PREF_EXIT, true)) { if (key.equals(Preferences.PREF_PANIC_EXIT)
&& !sharedPreferences.getBoolean(Preferences.PREF_PANIC_EXIT, true)) {
prefHide.setChecked(false); prefHide.setChecked(false);
} }
} }
@ -156,6 +210,7 @@ public class PanicPreferencesFragment extends PreferenceFragment
// disable destructive panic actions // disable destructive panic actions
prefHide.setEnabled(false); prefHide.setEnabled(false);
showWipeList();
} else { } else {
// try to display connected panic app // try to display connected panic app
try { try {
@ -163,6 +218,8 @@ public class PanicPreferencesFragment extends PreferenceFragment
prefApp.setSummary(pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0))); prefApp.setSummary(pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0)));
prefApp.setIcon(pm.getApplicationIcon(packageName)); prefApp.setIcon(pm.getApplicationIcon(packageName));
prefHide.setEnabled(true); prefHide.setEnabled(true);
prefResetRepos.setEnabled(true);
showWipeList();
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
// revert back to no app, just to be safe // revert back to no app, just to be safe
PanicResponder.setTriggerPackageName(getActivity(), Panic.PACKAGE_NAME_NONE); PanicResponder.setTriggerPackageName(getActivity(), Panic.PACKAGE_NAME_NONE);
@ -177,13 +234,13 @@ public class PanicPreferencesFragment extends PreferenceFragment
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {
PanicResponder.setTriggerPackageName(getActivity()); PanicResponder.setTriggerPackageName(getActivity());
showPanicApp(PanicResponder.getTriggerPackageName(getActivity())); showPanicApp(PanicResponder.getTriggerPackageName(getActivity()));
getActivity().setResult(Activity.RESULT_OK); getActivity().setResult(AppCompatActivity.RESULT_OK);
} }
}; };
DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() { DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {
getActivity().setResult(Activity.RESULT_CANCELED); getActivity().setResult(AppCompatActivity.RESULT_CANCELED);
getActivity().finish(); getActivity().finish();
} }
}; };
@ -243,6 +300,7 @@ public class PanicPreferencesFragment extends PreferenceFragment
@Override @Override
public void onCancel(DialogInterface dialogInterface) { public void onCancel(DialogInterface dialogInterface) {
prefHide.setChecked(false); prefHide.setChecked(false);
prefResetRepos.setChecked(false);
} }
}); });
builder.setView(R.layout.dialog_app_hiding); builder.setView(R.layout.dialog_app_hiding);

View File

@ -0,0 +1,174 @@
package org.fdroid.fdroid.panic;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.data.Apk;
import org.fdroid.fdroid.data.DBHelper;
import org.fdroid.fdroid.data.InstalledApp;
import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.installer.Installer;
import org.fdroid.fdroid.installer.InstallerService;
import org.fdroid.fdroid.installer.PrivilegedInstaller;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import info.guardianproject.panic.Panic;
import info.guardianproject.panic.PanicResponder;
/**
* This {@link AppCompatActivity} is purely to run events in response to a panic trigger.
* It needs to be an {@code AppCompatActivity} rather than a {@link android.app.Service}
* so that it can fetch some of the required information about what sent the
* {@link Intent}. This is therefore an {@code AppCompatActivity} without any UI, which
* is a special case in Android. All the code must be in
* {@link #onCreate(Bundle)} and {@link #finish()} must be called at the end of
* that method.
*
* @see PanicResponder#receivedTriggerFromConnectedApp(AppCompatActivity)
*/
public class PanicResponderActivity extends AppCompatActivity {
private static final String TAG = PanicResponderActivity.class.getSimpleName();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (!Panic.isTriggerIntent(intent)) {
finish();
return;
}
// received intent from panic app
Log.i(TAG, "Received Panic Trigger...");
final Preferences preferences = Preferences.get();
boolean receivedTriggerFromConnectedApp = PanicResponder.receivedTriggerFromConnectedApp(this);
final boolean runningAppUninstalls = PrivilegedInstaller.isDefault(this);
ArrayList<String> wipeList = new ArrayList<>(preferences.getPanicWipeSet());
preferences.setPanicWipeSet(Collections.<String>emptySet());
preferences.setPanicTmpSelectedSet(Collections.<String>emptySet());
if (receivedTriggerFromConnectedApp && runningAppUninstalls && wipeList.size() > 0) {
// if this app (e.g. F-Droid) is to be deleted, do it last
if (wipeList.contains(getPackageName())) {
wipeList.remove(getPackageName());
wipeList.add(getPackageName());
}
final Context context = this;
final CountDownLatch latch = new CountDownLatch(1);
final LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
final String lastToUninstall = wipeList.get(wipeList.size() - 1);
final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch ((intent.getAction())) {
case Installer.ACTION_UNINSTALL_INTERRUPTED:
case Installer.ACTION_UNINSTALL_COMPLETE:
latch.countDown();
break;
}
}
};
lbm.registerReceiver(receiver, Installer.getUninstallIntentFilter(lastToUninstall));
for (String packageName : wipeList) {
InstalledApp installedApp = InstalledAppProvider.Helper.findByPackageName(context, packageName);
InstallerService.uninstall(context, new Apk(installedApp));
}
// wait for apps to uninstall before triggering final responses
new Thread() {
@Override
public void run() {
try {
latch.await(10, TimeUnit.MINUTES);
} catch (InterruptedException e) {
// ignored
}
lbm.unregisterReceiver(receiver);
if (preferences.panicResetRepos()) {
resetRepos(context);
}
if (preferences.panicHide()) {
HidingManager.hide(context);
}
if (preferences.panicExit()) {
exitAndClear();
}
}
}.start();
} else if (receivedTriggerFromConnectedApp) {
if (preferences.panicResetRepos()) {
resetRepos(this);
}
// Performing destructive panic response
if (preferences.panicHide()) {
Log.i(TAG, "Hiding app...");
HidingManager.hide(this);
}
}
// exit and clear, if not deactivated
if (!runningAppUninstalls && preferences.panicExit()) {
exitAndClear();
}
finish();
}
static void resetRepos(Context context) {
HashSet<String> enabledAddresses = new HashSet<>();
HashSet<String> disabledAddresses = new HashSet<>();
String[] defaultReposItems = DBHelper.loadInitialRepos(context).toArray(new String[0]);
for (int i = 1; i < defaultReposItems.length; i += DBHelper.REPO_XML_ITEM_COUNT) {
if ("1".equals(defaultReposItems[i + 3])) {
enabledAddresses.add(defaultReposItems[i]);
} else {
disabledAddresses.add(defaultReposItems[i]);
}
}
List<Repo> repos = RepoProvider.Helper.all(context);
for (Repo repo : repos) {
ContentValues values = new ContentValues(1);
if (enabledAddresses.contains(repo.address)) {
values.put(Schema.RepoTable.Cols.IN_USE, true);
RepoProvider.Helper.update(context, repo, values);
} else if (disabledAddresses.contains(repo.address)) {
values.put(Schema.RepoTable.Cols.IN_USE, false);
RepoProvider.Helper.update(context, repo, values);
} else {
RepoProvider.Helper.remove(context, repo.getId());
}
}
}
private void exitAndClear() {
ExitActivity.exitAndRemoveFromRecentApps(this);
if (Build.VERSION.SDK_INT >= 21) {
finishAndRemoveTask();
}
}
}

View File

@ -0,0 +1,32 @@
package org.fdroid.fdroid.panic;
import android.view.View;
import android.view.ViewGroup;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.views.installed.InstalledAppListAdapter;
import org.fdroid.fdroid.views.installed.InstalledAppListItemController;
import java.util.Set;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
public class SelectInstalledAppListAdapter extends InstalledAppListAdapter {
private final Set<String> selectedApps;
SelectInstalledAppListAdapter(AppCompatActivity activity) {
super(activity);
Preferences prefs = Preferences.get();
selectedApps = prefs.getPanicWipeSet();
prefs.setPanicTmpSelectedSet(selectedApps);
}
@NonNull
@Override
public InstalledAppListItemController onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = activity.getLayoutInflater().inflate(R.layout.installed_app_list_item, parent, false);
return new SelectInstalledAppListItemController(activity, view, selectedApps);
}
}

View File

@ -0,0 +1,39 @@
package org.fdroid.fdroid.panic;
import android.view.View;
import org.fdroid.fdroid.AppUpdateStatusManager;
import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.views.apps.AppListItemState;
import org.fdroid.fdroid.views.installed.InstalledAppListItemController;
import java.util.Set;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
/**
* Shows the currently installed apps as a selectable list.
*/
public class SelectInstalledAppListItemController extends InstalledAppListItemController {
private final Set<String> selectedApps;
public SelectInstalledAppListItemController(AppCompatActivity activity, View itemView, Set<String> selectedApps) {
super(activity, itemView);
this.selectedApps = selectedApps;
}
@NonNull
@Override
protected AppListItemState getCurrentViewState(
@NonNull App app, @Nullable AppUpdateStatusManager.AppUpdateStatus appStatus) {
return new AppListItemState(app).setCheckBoxStatus(selectedApps.contains(app.packageName));
}
@Override
protected void onActionButtonPressed(App app) {
super.onActionButtonPressed(app);
}
}

View File

@ -0,0 +1,133 @@
/*
* Copyright (C) 2010-12 Ciaran Gultnieks, ciaran@ciarang.com
* Copyright (C) 2009 Roberto Jacinto, roberto.jacinto@caixamagica.pt
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.fdroid.fdroid.panic;
import android.annotation.SuppressLint;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.google.android.material.appbar.MaterialToolbar;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.views.installed.InstalledAppListAdapter;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class SelectInstalledAppsActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private InstalledAppListAdapter adapter;
private RecyclerView appList;
private TextView emptyState;
private int checkId;
private Preferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
FDroidApp fdroidApp = (FDroidApp) getApplication();
fdroidApp.applyPureBlackBackgroundInDarkTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.installed_apps_layout);
MaterialToolbar toolbar = findViewById(R.id.toolbar);
toolbar.setTitle(getString(R.string.panic_add_apps_to_uninstall));
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
adapter = new SelectInstalledAppListAdapter(this);
appList = findViewById(R.id.app_list);
appList.setHasFixedSize(true);
appList.setLayoutManager(new LinearLayoutManager(this));
appList.setAdapter(adapter);
emptyState = findViewById(R.id.empty_state);
}
@Override
protected void onResume() {
super.onResume();
prefs = Preferences.get();
// Starts a new or restarts an existing Loader in this manager
getSupportLoaderManager().restartLoader(0, null, this);
}
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(this, InstalledAppProvider.getAllAppsUri(), null, null, null, null);
}
@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
adapter.setApps(cursor);
if (adapter.getItemCount() == 0) {
appList.setVisibility(View.GONE);
emptyState.setVisibility(View.VISIBLE);
} else {
appList.setVisibility(View.VISIBLE);
emptyState.setVisibility(View.GONE);
}
}
@Override
public void onLoaderReset(@NonNull Loader<Cursor> loader) {
adapter.setApps(null);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem menuItem = menu.add(R.string.menu_select_for_wipe);
menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
checkId = menuItem.getItemId();
menuItem.setIcon(R.drawable.check);
return true;
}
@SuppressLint("ApplySharedPref")
@Override
public boolean onOptionsItemSelected(MenuItem item) {
finish();
if (item.getItemId() == checkId) {
prefs.setPanicWipeSet(prefs.getPanicTmpSelectedSet());
return true;
}
return super.onOptionsItemSelected(item);
}
}

View File

@ -3,39 +3,44 @@ package org.fdroid.fdroid.views.main;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View; import android.view.View;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.TextView; import android.widget.TextView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService; import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.CategoryProvider; import org.fdroid.fdroid.data.CategoryProvider;
import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.panic.HidingManager;
import org.fdroid.fdroid.views.apps.AppListActivity; import org.fdroid.fdroid.views.apps.AppListActivity;
import org.fdroid.fdroid.views.categories.CategoryAdapter; import org.fdroid.fdroid.views.categories.CategoryAdapter;
import org.fdroid.fdroid.views.categories.CategoryController; import org.fdroid.fdroid.views.categories.CategoryController;
import org.fdroid.fdroid.views.hiding.HidingManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
/** /**
* Responsible for ensuring that the categories view is inflated and then populated correctly. * Responsible for ensuring that the categories view is inflated and then populated correctly.
* Will start a loader to get the list of categories from the database and populate a recycler * Will start a loader to get the list of categories from the database and populate a recycler
* view with relevant info about each. * view with relevant info about each.
*/ */
class CategoriesViewBinder implements LoaderManager.LoaderCallbacks<Cursor> { class CategoriesViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
public static final String TAG = "CategoriesViewBinder";
private static final int LOADER_ID = 429820532; private static final int LOADER_ID = 429820532;
@ -60,6 +65,7 @@ class CategoriesViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
final SwipeRefreshLayout swipeToRefresh = final SwipeRefreshLayout swipeToRefresh =
(SwipeRefreshLayout) categoriesView.findViewById(R.id.swipe_to_refresh); (SwipeRefreshLayout) categoriesView.findViewById(R.id.swipe_to_refresh);
Utils.applySwipeLayoutColors(swipeToRefresh);
swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override @Override
public void onRefresh() { public void onRefresh() {
@ -90,10 +96,11 @@ class CategoriesViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
activity.getSupportLoaderManager().restartLoader(LOADER_ID, null, this); activity.getSupportLoaderManager().restartLoader(LOADER_ID, null, this);
} }
@NonNull
@Override @Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) { public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if (id != LOADER_ID) { if (id != LOADER_ID) {
return null; throw new IllegalArgumentException("id != LOADER_ID");
} }
return new CursorLoader( return new CursorLoader(
@ -108,7 +115,7 @@ class CategoriesViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
/** /**
* Reads all categories from the cursor and stores them in memory to provide to the {@link CategoryAdapter}. * Reads all categories from the cursor and stores them in memory to provide to the {@link CategoryAdapter}.
* * <p>
* It does this so it is easier to deal with localized/unlocalized categories without having * It does this so it is easier to deal with localized/unlocalized categories without having
* to store the localized version in the database. It is not expected that the list of categories * to store the localized version in the database. It is not expected that the list of categories
* will grow so large as to make this a performance concern. If it does in the future, the * will grow so large as to make this a performance concern. If it does in the future, the

Some files were not shown because too many files have changed in this diff Show More