Compare commits

...

453 Commits
1.11 ... master

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
770 changed files with 15082 additions and 9676 deletions

View File

@ -1,26 +1,36 @@
image: registry.gitlab.com/fdroid/ci-images-client:latest
cache:
paths:
- .gradle/wrapper
- .gradle/caches
stages:
- test
- deploy
before_script:
- export GRADLE_USER_HOME=$PWD/.gradle
- 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
.base:
image: registry.gitlab.com/fdroid/ci-images-client:latest
before_script:
- export GRADLE_USER_HOME=$PWD/.gradle
- 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
extends: .base
stage: test
artifacts:
name: "${CI_PROJECT_PATH}_${CI_JOB_STAGE}_${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHA}"
paths:
- kernel.log
- logcat.txt
- app/core*
- app/*.log
- app/build/reports
- app/build/outputs/*ml
- app/build/outputs/apk
@ -35,29 +45,40 @@ test_lint_pmd_checkstyle:
<<: *test-template
script:
- 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
# always report on lint errors to the build log
- sed -i -e 's,textReport .*,textReport true,' app/build.gradle
- ./gradlew testFullDebugUnitTest
- ./gradlew lint
- ./gradlew pmd || (export EXITVALUE=1; echo ERROR !!)
- ./gradlew checkstyle || (export EXITVALUE=1; echo ERROR !!)
- ./tools/check-format-strings.py || (export EXITVALUE=1; echo ERROR !!)
- ./tools/check-fastlane-whitespace.py || (export EXITVALUE=1; echo ERROR !!)
- ./tools/remove-unused-and-blank-translations.py || (export EXITVALUE=1; echo ERROR !!)
- ./gradlew testFullDebugUnitTest || set_error
- ./gradlew lint || set_error
- ./gradlew pmd || set_error
- ./gradlew checkstyle || set_error
- ./tools/check-format-strings.py || set_error
- ./tools/check-fastlane-whitespace.py || set_error
- ./tools/remove-unused-and-blank-translations.py || set_error
- 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; echo ERROR !!)
- git --no-pager diff --ignore-all-space --name-only --exit-code app/src/*/res/values*/strings.xml || set_error
- exit $EXITVALUE
errorprone:
extends: .base
stage: test
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
- ./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
# connectedCheck to test all the build flavors
.connected-template: &connected-template
extends: .base
script:
- ./gradlew assembleFullDebug
- export AVD_SDK=`echo $CI_JOB_NAME | awk '{print $2}'`
@ -74,16 +95,14 @@ errorprone:
- wait-for-emulator
- adb devices
- adb shell input keyevent 82 &
- ./gradlew installFullDebug
- 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=android.support.test.filters.LargeTest;
export FLAG=-Pandroid.testInstrumentationRunnerArguments.notAnnotation=androidx.test.filters.LargeTest;
fi
- ./gradlew connectedFullDebugAndroidTest $FLAG
|| ./gradlew connectedFullDebugAndroidTest $FLAG
|| ./gradlew connectedFullDebugAndroidTest $FLAG
|| (adb -e logcat -d > logcat.txt; exit 1)
connected 22 default armeabi-v7a:
retry: 1
no-accel 22 default x86:
<<: *test-template
<<: *connected-template
@ -91,35 +110,17 @@ connected 22 default armeabi-v7a:
tags:
- fdroid
- kvm
allow_failure: true
only:
- branches@eighthave/fdroidclient
variables:
- $RUN_KVM_JOBS
<<: *test-template
<<: *connected-template
connected 23 default x86:
kvm 29 microg x86_64:
<<: *kvm-template
connected 25 default x86:
<<: *kvm-template
connected 26 google_apis x86:
<<: *kvm-template
only:
- branches@fdroid/fdroidclient
- branches@eighthave/fdroidclient
connected 27 google_apis_playstore x86:
<<: *kvm-template
connected 28 default x86_64:
<<: *kvm-template
connected 29 default x86_64:
<<: *kvm-template
deploy_nightly:
extends: .base
stage: deploy
only:
- master
@ -139,8 +140,3 @@ deploy_nightly:
# build the APKs!
- ./gradlew assembleDebug
- 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/

View File

@ -1,3 +1,66 @@
### 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

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.
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
were making code changes. This way the changes can be reviewed before the
source strings on Weblate are changed.
suggestions on how to improve them, open an issue or merge request like you
would if you were making code changes. This way the changes can be reviewed
before the source strings on Weblate are changed.
## Code Style
We follow the [Android Java style](https://source.android.com/source/code-style.html).
Some key points:
We follow the default Android Studio code formatter (e.g. `Ctrl-Alt-L`). This
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
* UTF-8 source files
@ -45,76 +47,35 @@ Some key points:
* Braces are always used after if, for and while
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
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
connected via `adb`, or an emulator running. Then, execute the following from the
command line:
./gradlew check
Note that the CI already runs the tests on an emulator, so you don't
necessarily have to do this yourself if you open a merge request as the tests
will get run.
Many important tests require a device or emulator, but do not work in GitLab CI.
That mean they need to be run locally, and that is usually easiest in Android
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"
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_.
./gradlew testFullDebugUnitTest --tests *LocaleSelectionTest*
## 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
stable has an important bug that needs immediate fixing - will follow the
`X.Y.Z` pattern.
./gradlew connectedFullDebugAndroidTest \
-Pandroid.testInstrumentationRunnerArguments.class=org.fdroid.fdroid.MainActivityExpressoTest
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`.
So for example, 1.3.1 would be `1003150` and 0.95-alpha13 would be `95013`
(leading zeros are omitted).
## Making releases
Note that we use a trailing `50` for actual stable releases, so alphas are
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.
See https://gitlab.com/fdroid/wiki/-/wikis/Internal/Release-Process#fdroidclient

View File

@ -1,6 +1,6 @@
# 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/)
Client for [F-Droid](https://f-droid.org), the Free Software repository system

View File

@ -21,16 +21,16 @@ def basicApplicationId = "org.fdroid.basic"
def privilegedExtensionApplicationId = '"org.fdroid.fdroid.privileged"'
android {
compileSdkVersion 28
compileSdkVersion 30
defaultConfig {
versionCode 1011050
versionCode 1013001
versionName getVersionName()
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
minSdkVersion 14
minSdkVersion 24
//noinspection ExpiredTargetSdkVersion
targetSdkVersion 25
targetSdkVersion 28
/*
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
@ -38,6 +38,7 @@ android {
passing the following argument to the test runner: disableAnalytics "true".
*/
testInstrumentationRunnerArguments disableAnalytics: 'true'
vectorDrawables.useSupportLibrary = true
}
buildTypes {
@ -75,6 +76,8 @@ android {
compileOptions {
compileOptions.encoding = "UTF-8"
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
aaptOptions {
@ -99,6 +102,10 @@ android {
events "skipped", "failed", "standardOut", "standardError"
showStandardStreams = true
}
systemProperty 'robolectric.dependency.repo.url', 'https://repo1.maven.org/maven2'
// hack to avoid memory leak crashes
forkEvery = 1
}
}
}
@ -135,28 +142,29 @@ android {
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.palette:palette:1.0.0'
implementation 'androidx.work:work-runtime:2.4.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
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:1.0'
implementation 'commons-io:commons-io:2.6'
implementation 'commons-net:commons-net:3.6'
implementation 'ch.acra:acra:4.9.1'
implementation 'io.reactivex:rxjava:1.1.0'
implementation 'com.hannesdorfmann:adapterdelegates3:3.0.1'
implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.5'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'io.reactivex.rxjava3:rxjava:3.0.9'
implementation 'com.fasterxml.jackson.core:jackson-core:2.11.1'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.1'
@ -168,20 +176,22 @@ dependencies {
fullImplementation 'org.jmdns:jmdns:3.5.5'
fullImplementation 'org.nanohttpd:nanohttpd:2.3.1'
testImplementation 'androidx.test:core:1.2.0'
testImplementation 'junit:junit:4.13'
testImplementation 'androidx.test:core:1.3.0'
testImplementation 'junit:junit:4.13.1'
testImplementation 'org.robolectric:robolectric:4.3'
testImplementation 'org.mockito:mockito-core:3.3.3'
testImplementation 'org.hamcrest:hamcrest:2.2'
testImplementation 'org.bouncycastle:bcprov-jdk15on:1.65'
androidTestImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
androidTestImplementation 'androidx.test:monitor:1.2.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'androidx.arch.core:core-testing:2.1.0'
androidTestImplementation 'androidx.test:core:1.3.0'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test:rules:1.3.0'
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 {

View File

@ -4,13 +4,11 @@
-keep class org.fdroid.fdroid.** {*;}
-dontskipnonpubliclibraryclassmembers
-dontwarn android.test.**
-dontwarn com.android.support.test.**
-dontwarn javax.naming.**
-dontwarn org.slf4j.**
-dontnote org.apache.http.**
-dontnote android.net.http.**
-dontnote android.support.**
-dontnote **ILicensingService
# Needed for espresso https://stackoverflow.com/a/21706087
@ -33,13 +31,6 @@
public *;
}
# 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
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.ext.**
@ -49,3 +40,8 @@ public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; }
-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,18 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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"
xmlns:tools="http://schemas.android.com/tools"
package="org.fdroid.fdroid.tests"
android:versionCode="1"
android:versionName="1.0">
xmlns:tools="http://schemas.android.com/tools"
package="org.fdroid.fdroid.tests"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator" />
<!-- We add an application tag here just so that we can indicate that
this package needs to link against the android.test library,
which is needed when building test cases. -->
<application>
<uses-library android:name="android.test.runner"
<uses-library
android:name="android.test.runner"
android:required="false" />
</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>

View File

@ -1,65 +0,0 @@
package org.fdroid.fdroid;
import android.app.Instrumentation;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.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-existent file
File nonexistent = new File(tempDir, "nonexistent");
CleanCacheService.clearOldFiles(nonexistent, 1);
CleanCacheService.clearOldFiles(null, 1);
}
}

View File

@ -21,7 +21,7 @@ import androidx.test.uiautomator.UiObjectNotFoundException;
import androidx.test.uiautomator.UiSelector;
import android.util.Log;
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.hamcrest.Matchers;
import org.junit.After;
@ -177,6 +177,7 @@ public class MainActivityEspressoTest {
}
@LargeTest
@Test
public void showSettings() {
ViewInteraction settingsBottonNavButton = onView(
allOf(withText(R.string.menu_settings), isDisplayed()));
@ -211,6 +212,7 @@ public class MainActivityEspressoTest {
}
@LargeTest
@Test
public void showUpdates() {
ViewInteraction updatesBottonNavButton = onView(allOf(withText(R.string.main_menu__updates), isDisplayed()));
updatesBottonNavButton.perform(click());
@ -218,6 +220,7 @@ public class MainActivityEspressoTest {
}
@LargeTest
@Test
public void startSwap() {
if (!BuildConfig.FLAVOR.startsWith("full")) {
return;
@ -233,6 +236,7 @@ public class MainActivityEspressoTest {
}
@LargeTest
@Test
public void showCategories() {
if (!BuildConfig.FLAVOR.startsWith("full")) {
return;
@ -258,11 +262,12 @@ public class MainActivityEspressoTest {
}
@LargeTest
@Test
public void showLatest() {
if (!BuildConfig.FLAVOR.startsWith("full")) {
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.main_menu__latest_apps), isDisplayed())).perform(click());
onView(allOf(withId(R.id.swipe_to_refresh), isDisplayed()))
@ -280,6 +285,7 @@ public class MainActivityEspressoTest {
}
@LargeTest
@Test
public void showSearch() {
onView(allOf(withText(R.string.menu_settings), isDisplayed())).perform(click());
onView(withId(R.id.fab_search)).check(doesNotExist());

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.support.test.**
-dontnote junit.framework.**
@ -14,3 +18,8 @@
-keep class 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

@ -0,0 +1,5 @@
package org.fdroid.fdroid.nearby;
public class LocalRepoManager {
public static final String[] WEB_ROOT_ASSET_FILES = {};
}

View File

@ -19,14 +19,14 @@
package org.fdroid.fdroid.nearby;
import android.app.Activity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
/**
* Dummy version for basic app flavor.
*/
public class TreeUriScannerIntentService {
public static void onActivityResult(Activity activity, Intent intent) {
public static void onActivityResult(AppCompatActivity activity, Intent intent) {
throw new IllegalStateException("unimplemented");
}
}

View File

@ -19,11 +19,11 @@
package org.fdroid.fdroid.views.main;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
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.views.PreferencesFragment;
import org.fdroid.fdroid.views.updates.UpdatesViewBinder;
@ -49,10 +49,10 @@ class MainViewController extends RecyclerView.ViewHolder {
}
/**
* @see WhatsNewViewBinder
* @see LatestViewBinder
*/
public void bindWhatsNewView() {
new WhatsNewViewBinder(activity, frame);
public void bindLatestView() {
new LatestViewBinder(activity, frame);
}
/**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -6,7 +6,7 @@
<!-- android:title and android:icon are set dynamically in MainActivity -->
<item
app:showAsAction="ifRoom|withText"
android:id="@+id/whats_new"/>
android:id="@+id/latest"/>
<item
app:showAsAction="ifRoom|withText"
android:id="@+id/updates"/>

View File

@ -1,13 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen android:title="@string/about_title">
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="@string/applicationId"
android:targetClass="org.fdroid.fdroid.AboutActivity"/>
</PreferenceScreen>
<PreferenceScreen android:title="@string/about_title"
android:key="pref_about" />
<PreferenceCategory android:title="@string/preference_category__my_apps">
<PreferenceScreen android:title="@string/preference_manage_installed_apps">
@ -47,7 +42,7 @@
android:title="@string/over_data"
android:defaultValue="@integer/defaultOverData"
android:layout="@layout/preference_seekbar"/>
<SwitchPreference
<SwitchPreferenceCompat
android:title="@string/update_auto_download"
android:summary="@string/update_auto_download_summary"
android:key="updateAutoDownload"/>
@ -56,7 +51,7 @@
android:title="@string/update_interval"
android:defaultValue="@integer/defaultUpdateInterval"
android:layout="@layout/preference_seekbar"/>
<SwitchPreference
<SwitchPreferenceCompat
android:title="@string/notify"
android:defaultValue="true"
android:key="updateNotify"/>
@ -77,26 +72,26 @@
<PreferenceCategory android:title="@string/appcompatibility"
android:key="pref_category_appcompatibility">
<SwitchPreference
<SwitchPreferenceCompat
android:title="@string/show_incompat_versions"
android:defaultValue="false"
android:key="incompatibleVersions"/>
<SwitchPreference
<SwitchPreferenceCompat
android:title="@string/show_anti_feature_apps"
android:defaultValue="false"
android:key="showAntiFeatureApps"/>
<SwitchPreference
<SwitchPreferenceCompat
android:title="@string/force_touch_apps"
android:defaultValue="false"
android:key="ignoreTouchscreen"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/proxy">
<SwitchPreference
<SwitchPreferenceCompat
android:key="useTor"
android:summary="@string/useTorSummary"
android:title="@string/useTor"/>
<SwitchPreference
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="enableProxy"
android:title="@string/enable_proxy_title"
@ -116,12 +111,12 @@
<PreferenceCategory
android:key="pref_category_privacy"
android:title="@string/privacy">
<SwitchPreference
<SwitchPreferenceCompat
android:key="promptToSendCrashReports"
android:title="@string/prompt_to_send_crash_reports"
android:summary="@string/prompt_to_send_crash_reports_summary"
android:defaultValue="true"/>
<SwitchPreference
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="preventScreenshots"
android:summary="@string/preventScreenshots_summary"
@ -137,7 +132,7 @@
android:defaultValue="86400000"
android:entries="@array/keepCacheNames"
android:entryValues="@array/keepCacheValues"/>
<SwitchPreference
<SwitchPreferenceCompat
android:title="@string/expert"
android:defaultValue="false"
android:key="expert"/>
@ -153,6 +148,12 @@
android:summary="@string/keep_install_history_summary"
android:defaultValue="false"
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
android:key="hideAllNotifications"
android:title="@string/hide_all_notifications"

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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">
<!--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>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright (C) 2010-2012 Ciaran Gultnieks
* Copyright (C) 2013-2017 Peter Serwylo
@ -23,91 +24,128 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.fdroid.fdroid"
android:installLocation="auto">
package="org.fdroid.fdroid"
android:installLocation="auto">
<uses-feature android:name="android.hardware.nfc" android:required="false"/>
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
<uses-feature android:name="android.hardware.usb.host" android:required="false"/>
<uses-feature
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-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-feature
android:name="android.hardware.usb.host"
android:required="false" />
<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>
<activity
android:label="@string/swap"
android:name=".nearby.SwapWorkflowActivity"
android:parentActivityName=".views.main.MainActivity"
android:launchMode="singleTask"
android:theme="@style/SwapTheme.Wizard"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden">
android:name=".nearby.SwapWorkflowActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/swap"
android:launchMode="singleTask"
android:parentActivityName=".views.main.MainActivity"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".views.main.MainActivity"/>
android:name="android.support.PARENT_ACTIVITY"
android:value=".views.main.MainActivity" />
</activity>
<activity
android:name=".panic.PanicPreferencesActivity"
android:label="@string/panic_settings"
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
android:name="android.support.PARENT_ACTIVITY"
android:value=".views.main.MainActivity" />
</activity>
<activity
android:name=".panic.SelectInstalledAppsActivity"
android:parentActivityName=".panic.PanicPreferencesActivity" />
<activity
android:name=".panic.PanicResponderActivity"
android:noHistory="true"
android:theme="@android:style/Theme.NoDisplay">
<!-- this can never have launchMode singleTask or singleInstance! -->
<intent-filter>
<action android:name="info.guardianproject.panic.action.TRIGGER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".panic.ExitActivity"
android:theme="@android:style/Theme.NoDisplay" />
<activity
android:name=".panic.CalculatorActivity"
android:enabled="false"
android:icon="@mipmap/ic_calculator_launcher"
android:label="@string/hiding_calculator">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".nearby.WifiStateChangeReceiver">
<intent-filter>
<action android:name="android.net.wifi.STATE_CHANGE"/>
<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"/>
<action android:name="android.intent.action.DEVICE_STORAGE_LOW" />
</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"/>
<receiver
android:name=".nearby.UsbDeviceAttachedReceiver">
<receiver android:name=".nearby.UsbDeviceAttachedReceiver">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
<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"/>
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</receiver>
<receiver
android:name=".nearby.UsbDeviceDetachedReceiver">
<receiver android:name=".nearby.UsbDeviceDetachedReceiver">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"/>
<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"/>
android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"
android:resource="@xml/device_filter" />
</receiver>
<receiver android:name=".nearby.UsbDeviceMediaMountedReceiver">
<intent-filter>
@ -121,52 +159,20 @@
</intent-filter>
</receiver>
<activity
android:name=".panic.PanicPreferencesActivity"
android:label="@string/panic_settings"
android:parentActivityName=".views.main.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".views.main.MainActivity"/>
<service
android:name=".nearby.WifiStateChangeService"
android:exported="false" />
<service android:name=".nearby.SwapService" />
<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
android:name=".panic.SelectInstalledAppsActivity"
android:parentActivityName=".panic.PanicPreferencesActivity"/>
<activity
android:name=".panic.PanicResponderActivity"
android:noHistory="true"
android:theme="@android:style/Theme.NoDisplay">
<!-- this can never have launchMode singleTask or singleInstance! -->
<intent-filter>
<action android:name="info.guardianproject.panic.action.TRIGGER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name=".panic.ExitActivity"
android:theme="@android:style/Theme.NoDisplay"/>
<activity
android:name=".panic.CalculatorActivity"
android:enabled="false"
android:icon="@mipmap/ic_calculator_launcher"
android:label="@string/hiding_calculator"
android:theme="@style/AppThemeLight">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<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>

View File

@ -4,12 +4,13 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import javax.jmdns.ServiceInfo;
import javax.jmdns.impl.util.ByteWrangler;
import java.net.Inet4Address;
import java.net.Inet6Address;
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.
* In order to make it Parcelable (or Serializable for that matter), there are some package-scope

View File

@ -10,15 +10,17 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.Process;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
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

View File

@ -5,7 +5,7 @@ import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.util.Log;
import android.webkit.MimeTypeMap;
import fi.iki.elonen.NanoHTTPD;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.nearby.httpish.Request;
import org.fdroid.fdroid.nearby.httpish.Response;
@ -20,6 +20,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import fi.iki.elonen.NanoHTTPD;
/**
* Act as a layer on top of LocalHTTPD server, by forwarding requests served
* over bluetooth to that server.

View File

@ -10,9 +10,6 @@ import android.os.Process;
import android.text.TextUtils;
import android.util.Log;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils;
@ -28,6 +25,9 @@ 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

View File

@ -35,11 +35,9 @@ package org.fdroid.fdroid.nearby;
import android.content.Context;
import android.net.Uri;
import fi.iki.elonen.NanoHTTPD;
import fi.iki.elonen.NanoHTTPD.Response.IStatus;
import org.fdroid.fdroid.BuildConfig;
import javax.net.ssl.SSLServerSocketFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@ -62,6 +60,11 @@ import java.util.Map;
import java.util.StringTokenizer;
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.
* The only changes were to remove unneeded extras like {@code main()}, the

View File

@ -6,8 +6,8 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.Process;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.util.Log;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
@ -15,6 +15,8 @@ import java.io.IOException;
import java.net.BindException;
import java.util.Random;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
/**
* Manage {@link LocalHTTPD} in a {@link HandlerThread};
*/

View File

@ -2,7 +2,7 @@ package org.fdroid.fdroid.nearby;
import android.content.Context;
import android.util.Log;
import kellinwood.security.zipsigner.ZipSigner;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.GeneralName;
@ -19,9 +19,6 @@ 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.FileInputStream;
import java.io.FileOutputStream;
@ -49,6 +46,12 @@ import java.util.Date;
import java.util.GregorianCalendar;
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
@SuppressWarnings("LineLength")

View File

@ -10,10 +10,9 @@ import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Hasher;
import org.fdroid.fdroid.IndexUpdater;
@ -50,13 +49,15 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.jar.JarEntry;
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
* 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
* and the relevant .apk and icon files available.
*/
@SuppressWarnings("LineLength")
public final class LocalRepoManager {
private static final String TAG = "LocalRepoManager";
@ -65,7 +66,7 @@ public final class LocalRepoManager {
private final AssetManager assetManager;
private final String fdroidPackageName;
private static final String[] WEB_ROOT_ASSET_FILES = {
public static final String[] WEB_ROOT_ASSET_FILES = {
"swap-icon.png",
"swap-tick-done.png",
"swap-tick-not-done.png",
@ -348,7 +349,8 @@ public final class LocalRepoManager {
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.startDocument(null, null);
serializer.startTag("", "fdroid");
@ -356,12 +358,14 @@ public final class LocalRepoManager {
// <repo> block
serializer.startTag("", "repo");
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()));
long timestamp = System.currentTimeMillis() / 1000L;
serializer.attribute("", "timestamp", String.valueOf(timestamp));
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");
// <application> blocks

View File

@ -4,7 +4,7 @@ import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.os.Process;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
@ -15,6 +15,8 @@ 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.

View File

@ -29,7 +29,7 @@ import android.os.Build;
import android.os.Environment;
import android.os.Process;
import android.util.Log;
import androidx.core.content.ContextCompat;
import org.fdroid.fdroid.IndexUpdater;
import org.fdroid.fdroid.IndexV1Updater;
import org.fdroid.fdroid.Utils;
@ -44,6 +44,8 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import androidx.core.content.ContextCompat;
/**
* An {@link IntentService} subclass for scanning removable "external storage"
* for F-Droid package repos, e.g. SD Cards. This is intended to support

View File

@ -4,7 +4,6 @@ import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
@ -21,6 +20,10 @@ import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
@ -29,10 +32,6 @@ import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
public class SelectAppsView extends SwapView implements LoaderManager.LoaderCallbacks<Cursor> {
public SelectAppsView(Context context) {
@ -200,8 +199,6 @@ public class SelectAppsView extends SwapView implements LoaderManager.LoaderCall
}
});
}
updateCheckedIndicatorView(view, listView.isItemChecked(listPosition));
}
public void updateCheckedIndicatorView(int position, boolean checked) {
@ -210,24 +207,6 @@ public class SelectAppsView extends SwapView implements LoaderManager.LoaderCall
if (position >= firstListItemPosition && position <= lastListItemPosition) {
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;
colour = ContextCompat.getColor(getContext(), R.color.swap_bright_blue);
} else {
resource = R.drawable.ic_add_circle_outline;
colour = 0xFFD0D0D4;
}
imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), resource));
imageView.setColorFilter(colour, PorterDuff.Mode.MULTIPLY);
}
}
}

View File

@ -20,11 +20,6 @@ import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
@ -32,6 +27,10 @@ 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")
@ -80,7 +79,7 @@ public class StartSwapView extends SwapView {
@Nullable /* Emulators typically don't have bluetooth adapters */
private final BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
private SwitchCompat bluetoothSwitch;
private SwitchMaterial bluetoothSwitch;
private TextView viewBluetoothId;
private TextView textBluetoothVisible;
private TextView viewWifiId;
@ -176,7 +175,7 @@ public class StartSwapView extends SwapView {
textBluetoothVisible = findViewById(R.id.bluetooth_visible);
bluetoothSwitch = (SwitchCompat) findViewById(R.id.switch_bluetooth);
bluetoothSwitch = (SwitchMaterial) findViewById(R.id.switch_bluetooth);
bluetoothSwitch.setOnCheckedChangeListener(onBluetoothSwitchToggled);
bluetoothSwitch.setChecked(SwapService.getBluetoothVisibleUserPreference());
bluetoothSwitch.setEnabled(true);

View File

@ -1,6 +1,5 @@
package org.fdroid.fdroid.nearby;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
@ -13,7 +12,6 @@ import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
@ -37,7 +35,6 @@ import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.nearby.peers.Peer;
import org.fdroid.fdroid.net.Downloader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
@ -49,6 +46,10 @@ import java.util.Timer;
import java.util.TimerTask;
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
@ -110,46 +111,6 @@ public class SwapService extends Service {
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);
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);
} finally {
if (conn != null) {
conn.disconnect();
}
}
return null;
}
}.execute();
}
private Repo ensureRepoExists(@NonNull Peer peer) {
// 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.
@ -343,12 +304,15 @@ public class SwapService extends Service {
@Nullable
private Timer timer;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public class Binder extends android.os.Binder {
public SwapService getService() {
return SwapService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
startForeground(NOTIFICATION, createNotification());
@ -398,6 +362,45 @@ public class SwapService extends Service {
BonjourManager.setVisible(this, getWifiVisibleUserPreference() || getHotspotActivatedUserPreference());
}
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
@ -421,6 +424,8 @@ public class SwapService extends Service {
@Override
public void onDestroy() {
compositeDisposable.dispose();
Utils.debugLog(TAG, "Destroying service, will disable swapping if required, and unregister listeners.");
Preferences.get().unregisterLocalRepoHttpsListeners(httpsEnabledListener);
localBroadcastManager.unregisterReceiver(onWifiChange);
@ -429,7 +434,9 @@ public class SwapService extends Service {
localBroadcastManager.unregisterReceiver(bonjourPeerFound);
localBroadcastManager.unregisterReceiver(bonjourPeerRemoved);
unregisterReceiver(bluetoothScanModeChanged);
if (bluetoothAdapter != null) {
unregisterReceiver(bluetoothScanModeChanged);
}
BluetoothManager.stop(this);

View File

@ -1,7 +1,6 @@
package org.fdroid.fdroid.nearby;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
@ -12,14 +11,6 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.cursoradapter.widget.CursorAdapter;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
@ -32,7 +23,9 @@ import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.nostra13.universalimageloader.core.ImageLoader;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils;
@ -49,6 +42,16 @@ import org.fdroid.fdroid.net.DownloaderService;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
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;
/**
* 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
@ -195,7 +198,7 @@ public class SwapSuccessView extends SwapView implements LoaderManager.LoaderCal
private final ContentObserver appObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
Activity activity = getActivity();
AppCompatActivity activity = getActivity();
if (activity != null && app != null) {
app = AppProvider.Helper.findSpecificApp(
activity.getContentResolver(),

View File

@ -6,12 +6,12 @@ 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;
import org.fdroid.fdroid.R;
/**
* A {@link android.view.View} that registers to handle the swap events from
* {@link SwapService}.

View File

@ -1,7 +1,6 @@
package org.fdroid.fdroid.nearby;
import android.annotation.TargetApi;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@ -42,11 +41,11 @@ import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.SwitchCompat;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.switchmaterial.SwitchMaterial;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
@ -66,7 +65,6 @@ import org.fdroid.fdroid.net.BluetoothDownloader;
import org.fdroid.fdroid.net.Downloader;
import org.fdroid.fdroid.net.HttpDownloader;
import org.fdroid.fdroid.qr.CameraCharacteristicsChecker;
import org.fdroid.fdroid.qr.QrGenAsyncTask;
import org.fdroid.fdroid.views.main.MainActivity;
import java.util.Date;
@ -78,6 +76,7 @@ import java.util.Timer;
import java.util.TimerTask;
import cc.mvdan.accesspoint.WifiApControl;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import static org.fdroid.fdroid.views.main.MainActivity.ACTION_REQUEST_SWAP;
@ -107,7 +106,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
private static final int REQUEST_WRITE_SETTINGS_PERMISSION = 5;
private static final int STEP_INTRO = 1; // TODO remove this special case, only use layoutResIds
private Toolbar toolbar;
private MaterialToolbar toolbar;
private SwapView currentView;
private boolean hasPreparedLocalRepo;
private boolean newIntent;
@ -120,6 +119,8 @@ public class SwapWorkflowActivity extends AppCompatActivity {
@LayoutRes
private int currentSwapViewLayoutRes = STEP_INTRO;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public static void requestSwap(Context context, String repo) {
requestSwap(context, Uri.parse(repo));
}
@ -201,7 +202,11 @@ public class SwapWorkflowActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
((FDroidApp) getApplication()).setSecureWindow(this);
FDroidApp fdroidApp = (FDroidApp) getApplication();
fdroidApp.setSecureWindow(this);
fdroidApp.applyPureBlackBackgroundInDarkTheme(this);
super.onCreate(savedInstanceState);
currentView = new SwapView(this); // dummy placeholder to avoid NullPointerExceptions;
@ -214,8 +219,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
setContentView(R.layout.swap_activity);
toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitleTextAppearance(getApplicationContext(), R.style.SwapTheme_Wizard_Text_Toolbar);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
container = (ViewGroup) findViewById(R.id.container);
@ -234,6 +238,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
@Override
protected void onDestroy() {
compositeDisposable.dispose();
localBroadcastManager.unregisterReceiver(downloaderInterruptedReceiver);
unbindService(serviceConnection);
super.onDestroy();
@ -494,9 +499,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
currentView.setLayoutResId(viewRes);
currentSwapViewLayoutRes = viewRes;
toolbar.setBackgroundColor(currentView.getToolbarColour());
toolbar.setTitle(currentView.getToolbarTitle());
toolbar.setNavigationIcon(R.drawable.ic_close_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -594,7 +597,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
}
private void sendFDroidApk() {
((FDroidApp) getApplication()).sendViaBluetooth(this, Activity.RESULT_OK, BuildConfig.APPLICATION_ID);
((FDroidApp) getApplication()).sendViaBluetooth(this, AppCompatActivity.RESULT_OK, BuildConfig.APPLICATION_ID);
}
/**
@ -776,7 +779,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
private final BroadcastReceiver bluetoothScanModeChanged = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
SwitchCompat bluetoothSwitch = container.findViewById(R.id.switch_bluetooth);
SwitchMaterial bluetoothSwitch = container.findViewById(R.id.switch_bluetooth);
TextView textBluetoothVisible = container.findViewById(R.id.bluetooth_visible);
if (bluetoothSwitch == null || textBluetoothVisible == null
|| !BluetoothManager.ACTION_STATUS.equals(intent.getAction())) {
@ -930,18 +933,23 @@ public class SwapWorkflowActivity extends AppCompatActivity {
ImageView qrImage = container.findViewById(R.id.wifi_qr_code);
if (qrUriString != null && qrImage != null) {
Utils.debugLog(TAG, "Encoded swap URI in QR Code: " + qrUriString);
new QrGenAsyncTask(SwapWorkflowActivity.this, R.id.wifi_qr_code).execute(qrUriString);
// Replace all blacks with the background blue.
qrImage.setColorFilter(new LightingColorFilter(0xffffffff, ContextCompat.getColor(this,
R.color.swap_blue)));
compositeDisposable.add(Utils.generateQrBitmap(this, qrUriString)
.subscribe(qrBitmap -> {
qrImage.setImageBitmap(qrBitmap);
final View qrWarningMessage = container.findViewById(R.id.warning_qr_scanner);
if (CameraCharacteristicsChecker.getInstance(this).hasAutofocus()) {
qrWarningMessage.setVisibility(View.GONE);
} else {
qrWarningMessage.setVisibility(View.VISIBLE);
}
// Replace all blacks with the background blue.
qrImage.setColorFilter(new LightingColorFilter(0xffffffff,
ContextCompat.getColor(this, R.color.swap_blue)));
final View qrWarningMessage = container.findViewById(R.id.warning_qr_scanner);
if (CameraCharacteristicsChecker.getInstance(this).hasAutofocus()) {
qrWarningMessage.setVisibility(View.GONE);
} else {
qrWarningMessage.setVisibility(View.VISIBLE);
}
})
);
}
}
@ -988,7 +996,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
}
});
SwitchCompat wifiSwitch = findViewById(R.id.switch_wifi);
SwitchMaterial wifiSwitch = findViewById(R.id.switch_wifi);
wifiSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@ -1112,7 +1120,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
private final BroadcastReceiver bluetoothStatus = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
SwitchCompat bluetoothSwitch = container.findViewById(R.id.switch_bluetooth);
SwitchMaterial bluetoothSwitch = container.findViewById(R.id.switch_bluetooth);
TextView textBluetoothVisible = container.findViewById(R.id.bluetooth_visible);
TextView textDeviceIdBluetooth = container.findViewById(R.id.device_id_bluetooth);
TextView peopleNearbyText = container.findViewById(R.id.text_people_nearby);

View File

@ -29,7 +29,7 @@ import android.os.Build;
import android.os.Process;
import android.util.Log;
import android.widget.Toast;
import androidx.documentfile.provider.DocumentFile;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.fdroid.fdroid.AddRepoIntentService;
@ -49,6 +49,8 @@ import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarInputStream;
import androidx.documentfile.provider.DocumentFile;
/**
* An {@link IntentService} subclass for handling asynchronous scanning of a
* removable storage device like an SD Card or USB OTG thumb drive using the

View File

@ -8,13 +8,13 @@ import android.os.Build;
import android.os.storage.StorageManager;
import android.provider.DocumentsContract;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
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>

View File

@ -31,9 +31,11 @@ import android.os.Build;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.RequiresApi;
import org.fdroid.fdroid.views.main.NearbyViewBinder;
import androidx.annotation.RequiresApi;
/**
* This is just a shim to receive {@link UsbManager#ACTION_USB_ACCESSORY_ATTACHED}

View File

@ -29,11 +29,13 @@ import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.RequiresApi;
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.

View File

@ -4,6 +4,7 @@ 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 {

View File

@ -4,6 +4,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import org.fdroid.fdroid.Utils;
public class WifiStateChangeReceiver extends BroadcastReceiver {

View File

@ -10,12 +10,13 @@ import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.util.Log;
import cc.mvdan.accesspoint.WifiApControl;
import org.apache.commons.net.util.SubnetUtils;
import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.FDroidApp;
@ -34,6 +35,9 @@ import java.security.cert.Certificate;
import java.util.Enumeration;
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.
* The {@link Intent} that starts it either has no extras included,
@ -68,6 +72,8 @@ public class WifiStateChangeService extends IntentService {
private static int previousWifiState = Integer.MIN_VALUE;
private static int wifiState;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public WifiStateChangeService() {
super("WifiStateChangeService");
}
@ -80,6 +86,12 @@ public class WifiStateChangeService extends IntentService {
context.startService(intent);
}
@Override
public void onDestroy() {
compositeDisposable.dispose();
super.onDestroy();
}
@Override
protected void onHandleIntent(Intent intent) {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST);
@ -107,7 +119,7 @@ public class WifiStateChangeService extends IntentService {
}
if (Build.VERSION.SDK_INT < 21 && wifiState == WifiManager.WIFI_STATE_ENABLED) {
UpdateService.scheduleIfStillOnWifi(this);
compositeDisposable.add(UpdateService.scheduleIfStillOnWifi(this).subscribe());
}
}
}

View File

@ -5,10 +5,10 @@ import android.bluetooth.BluetoothDevice;
import android.os.Parcel;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import org.fdroid.fdroid.R;
import androidx.annotation.Nullable;
public class BluetoothPeer implements Peer {
private static final String BLUETOOTH_NAME_TAG = "FDroid:";

View File

@ -2,13 +2,15 @@ package org.fdroid.fdroid.nearby.peers;
import android.net.Uri;
import android.os.Parcel;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import org.fdroid.fdroid.FDroidApp;
import javax.jmdns.ServiceInfo;
import javax.jmdns.impl.FDroidServiceInfo;
import androidx.annotation.Nullable;
public class BonjourPeer extends WifiPeer {
private static final String TAG = "BonjourPeer";

View File

@ -1,6 +1,7 @@
package org.fdroid.fdroid.nearby.peers;
import android.os.Parcelable;
import androidx.annotation.DrawableRes;
/**

View File

@ -63,7 +63,7 @@ public class WifiPeer implements Peer {
@Override
public int getIcon() {
return R.drawable.ic_network_wifi;
return R.drawable.ic_wifi;
}
@Override

View File

@ -1,17 +1,21 @@
package org.fdroid.fdroid.panic;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.appbar.MaterialToolbar;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import java.util.regex.Pattern;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
/**
* A very hacky calculator which is barely functional.
* It is just meant to pass a very casual inspection.
@ -35,10 +39,13 @@ public class CalculatorActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
FDroidApp fdroidApp = (FDroidApp) getApplication();
fdroidApp.applyPureBlackBackgroundInDarkTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculator);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
MaterialToolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
textView = (TextView) findViewById(R.id.textView);

View File

@ -3,13 +3,13 @@ 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;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
public class DestructiveCheckBoxPreference extends CheckBoxPreference {
public DestructiveCheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);

View File

@ -3,13 +3,13 @@ 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;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
public class DestructivePreference extends Preference {
public DestructivePreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);

View File

@ -3,6 +3,7 @@ package org.fdroid.fdroid.panic;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class ExitActivity extends AppCompatActivity {

View File

@ -7,12 +7,14 @@ import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import androidx.core.app.NotificationManagerCompat;
import androidx.appcompat.app.AlertDialog;
import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.R;
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
* and restoring it.

View File

@ -1,37 +1,32 @@
package org.fdroid.fdroid.panic;
import android.os.Bundle;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.MenuItem;
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) getApplication()).applyTheme(this);
FDroidApp fdroidApp = (FDroidApp) getApplication();
fdroidApp.applyPureBlackBackgroundInDarkTheme(this);
super.onCreate(bundle);
setContentView(R.layout.activity_panic_settings);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar ab = getSupportActionBar();
if (ab != null) {
ab.setDisplayShowHomeEnabled(true);
ab.setDisplayHomeAsUpEnabled(true);
}
MaterialToolbar toolbar = findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Handle navigation icon press
onBackPressed();
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}

View File

@ -1,6 +1,5 @@
package org.fdroid.fdroid.panic;
import android.app.Activity;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
@ -16,16 +15,6 @@ import android.os.Bundle;
import android.text.TextUtils;
import android.util.TypedValue;
import androidx.annotation.ColorInt;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
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 org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.installer.PrivilegedInstaller;
@ -33,6 +22,16 @@ import org.fdroid.fdroid.installer.PrivilegedInstaller;
import java.util.ArrayList;
import java.util.Set;
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;
@ -83,7 +82,7 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
prefHide.setEnabled(false);
prefResetRepos.setChecked(false);
prefResetRepos.setEnabled(false);
getActivity().setResult(Activity.RESULT_CANCELED);
getActivity().setResult(AppCompatActivity.RESULT_CANCELED);
} else {
prefHide.setEnabled(true);
prefResetRepos.setEnabled(true);
@ -235,13 +234,13 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat
public void onClick(DialogInterface dialogInterface, int i) {
PanicResponder.setTriggerPackageName(getActivity());
showPanicApp(PanicResponder.getTriggerPackageName(getActivity()));
getActivity().setResult(Activity.RESULT_OK);
getActivity().setResult(AppCompatActivity.RESULT_OK);
}
};
DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
getActivity().setResult(Activity.RESULT_CANCELED);
getActivity().setResult(AppCompatActivity.RESULT_CANCELED);
getActivity().finish();
}
};

View File

@ -1,17 +1,13 @@
package org.fdroid.fdroid.panic;
import android.app.Activity;
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 androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import info.guardianproject.panic.Panic;
import info.guardianproject.panic.PanicResponder;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.data.Apk;
import org.fdroid.fdroid.data.DBHelper;
@ -31,16 +27,21 @@ 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 Activity} is purely to run events in response to a panic trigger.
* It needs to be an {@code Activity} rather than a {@link android.app.Service}
* 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 Activity} without any UI, which
* {@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(Activity)
* @see PanicResponder#receivedTriggerFromConnectedApp(AppCompatActivity)
*/
public class PanicResponderActivity extends AppCompatActivity {

View File

@ -1,9 +1,8 @@
package org.fdroid.fdroid.panic;
import android.app.Activity;
import androidx.annotation.NonNull;
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;
@ -11,10 +10,13 @@ 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(Activity activity) {
SelectInstalledAppListAdapter(AppCompatActivity activity) {
super(activity);
Preferences prefs = Preferences.get();
selectedApps = prefs.getPanicWipeSet();

View File

@ -1,9 +1,7 @@
package org.fdroid.fdroid.panic;
import android.app.Activity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.View;
import org.fdroid.fdroid.AppUpdateStatusManager;
import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.views.apps.AppListItemState;
@ -11,6 +9,10 @@ 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.
*/
@ -18,7 +20,7 @@ public class SelectInstalledAppListItemController extends InstalledAppListItemCo
private final Set<String> selectedApps;
public SelectInstalledAppListItemController(Activity activity, View itemView, Set<String> selectedApps) {
public SelectInstalledAppListItemController(AppCompatActivity activity, View itemView, Set<String> selectedApps) {
super(activity, itemView);
this.selectedApps = selectedApps;
}

View File

@ -21,23 +21,13 @@ package org.fdroid.fdroid.panic;
import android.annotation.SuppressLint;
import android.database.Cursor;
import android.graphics.LightingColorFilter;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
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 com.google.android.material.appbar.MaterialToolbar;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
@ -45,6 +35,14 @@ 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;
@ -56,13 +54,14 @@ public class SelectInstalledAppsActivity extends AppCompatActivity implements Lo
@Override
protected void onCreate(Bundle savedInstanceState) {
FDroidApp fdroidApp = (FDroidApp) getApplication();
fdroidApp.applyPureBlackBackgroundInDarkTheme(this);
((FDroidApp) getApplication()).applyTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.installed_apps_layout);
Toolbar toolbar = findViewById(R.id.toolbar);
MaterialToolbar toolbar = findViewById(R.id.toolbar);
toolbar.setTitle(getString(R.string.panic_add_apps_to_uninstall));
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@ -117,14 +116,7 @@ public class SelectInstalledAppsActivity extends AppCompatActivity implements Lo
MenuItem menuItem = menu.add(R.string.menu_select_for_wipe);
menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
checkId = menuItem.getItemId();
if (FDroidApp.isAppThemeLight()) {
Drawable icon = ContextCompat.getDrawable(this, R.drawable.check);
icon.setColorFilter(new LightingColorFilter(0xffffffff, ContextCompat.getColor(this,
android.R.color.white)));
menuItem.setIcon(icon);
} else {
menuItem.setIcon(R.drawable.check);
}
menuItem.setIcon(R.drawable.check);
return true;
}

View File

@ -3,40 +3,44 @@ package org.fdroid.fdroid.views.main;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.CategoryProvider;
import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.panic.HidingManager;
import org.fdroid.fdroid.views.apps.AppListActivity;
import org.fdroid.fdroid.views.categories.CategoryAdapter;
import org.fdroid.fdroid.views.categories.CategoryController;
import org.fdroid.fdroid.panic.HidingManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
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.
* Will start a loader to get the list of categories from the database and populate a recycler
* view with relevant info about each.
*/
class CategoriesViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
public static final String TAG = "CategoriesViewBinder";
private static final int LOADER_ID = 429820532;
@ -92,10 +96,11 @@ class CategoriesViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
activity.getSupportLoaderManager().restartLoader(LOADER_ID, null, this);
}
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if (id != LOADER_ID) {
return null;
throw new IllegalArgumentException("id != LOADER_ID");
}
return new CursorLoader(
@ -110,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}.
*
* <p>
* 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
* will grow so large as to make this a performance concern. If it does in the future, the

View File

@ -1,14 +1,16 @@
package org.fdroid.fdroid.views.main;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import android.widget.FrameLayout;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.views.PreferencesFragment;
import org.fdroid.fdroid.views.updates.UpdatesViewBinder;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
/**
* Decides which view on the main screen to attach to a given {@link FrameLayout}. This class
* doesn't know which view it will be rendering at the time it is constructed. Rather, at some
@ -30,10 +32,10 @@ class MainViewController extends RecyclerView.ViewHolder {
}
/**
* @see WhatsNewViewBinder
* @see LatestViewBinder
*/
public void bindWhatsNewView() {
new WhatsNewViewBinder(activity, frame);
public void bindLatestView() {
new LatestViewBinder(activity, frame);
}
/**

View File

@ -1,7 +1,6 @@
package org.fdroid.fdroid.views.main;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.UriPermission;
@ -22,9 +21,7 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.nearby.SDCardScannerService;
@ -34,6 +31,11 @@ import org.fdroid.fdroid.nearby.TreeUriScannerIntentService;
import java.io.File;
import java.util.List;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
/**
* A splash screen encouraging people to start the swap process. The swap
* process is quite heavy duty in that it fires up Bluetooth and/or WiFi
@ -69,7 +71,7 @@ public class NearbyViewBinder {
private static File externalStorage = null;
private static View swapView;
NearbyViewBinder(final Activity activity, FrameLayout parent) {
NearbyViewBinder(final AppCompatActivity activity, FrameLayout parent) {
swapView = activity.getLayoutInflater().inflate(R.layout.main_tab_swap, parent, true);
TextView subtext = swapView.findViewById(R.id.both_parties_need_fdroid_text);
@ -213,11 +215,11 @@ public class NearbyViewBinder {
}
}
Activity activity = null;
if (context instanceof Activity) {
activity = (Activity) context;
} else if (swapView != null && swapView.getContext() instanceof Activity) {
activity = (Activity) swapView.getContext();
AppCompatActivity activity = null;
if (context instanceof AppCompatActivity) {
activity = (AppCompatActivity) context;
} else if (swapView != null && swapView.getContext() instanceof AppCompatActivity) {
activity = (AppCompatActivity) swapView.getContext();
}
if (activity != null) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -3,6 +3,7 @@
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="#000" android:pathData="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path android:fillColor="#000" android:pathData="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
</vector>

View File

@ -1,5 +1,10 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M13,7h-2v4L7,11v2h4v4h2v-4h4v-2h-4L13,7zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FFFFFF"
android:pathData="M12,7c-0.55,0 -1,0.45 -1,1v3L8,11c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h3v3c0,0.55 0.45,1 1,1s1,-0.45 1,-1v-3h3c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-3L13,8c0,-0.55 -0.45,-1 -1,-1zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"/>
</vector>

View File

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/>

View File

@ -1,5 +1,10 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M17.71,7.71L12,2h-1v7.59L6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 11,14.41L11,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FFFFFF"
android:pathData="M17,7l-4.29,-4.29c-0.63,-0.63 -1.71,-0.19 -1.71,0.7v6.18L7.11,5.7c-0.39,-0.39 -1.02,-0.39 -1.41,0 -0.39,0.39 -0.39,1.02 0,1.41L10.59,12 5.7,16.89c-0.39,0.39 -0.39,1.02 0,1.41 0.39,0.39 1.02,0.39 1.41,0L11,14.41v6.18c0,0.89 1.08,1.34 1.71,0.71L17,17c0.39,-0.39 0.39,-1.02 0,-1.41L13.41,12 17,8.42c0.39,-0.39 0.39,-1.03 0,-1.42zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88z"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FFFFFF"
android:pathData="M15.98,10.28l-1.38,1.38c-0.2,0.2 -0.2,0.51 0,0.71l1.38,1.38c0.28,0.28 0.75,0.15 0.85,-0.23 0.11,-0.5 0.17,-1 0.17,-1.52 0,-0.51 -0.06,-1.01 -0.18,-1.48 -0.09,-0.38 -0.56,-0.52 -0.84,-0.24zM20.1,7.78c-0.25,-0.55 -0.98,-0.67 -1.4,-0.24 -0.26,0.26 -0.31,0.64 -0.17,0.98 0.46,1.07 0.72,2.24 0.72,3.47 0,1.24 -0.26,2.42 -0.73,3.49 -0.14,0.32 -0.09,0.69 0.16,0.94 0.41,0.41 1.1,0.29 1.35,-0.23 0.63,-1.3 0.98,-2.76 0.98,-4.3 -0.01,-1.45 -0.33,-2.85 -0.91,-4.11zM11.41,12L15,8.42c0.39,-0.39 0.39,-1.02 0,-1.42l-4.29,-4.29c-0.63,-0.63 -1.71,-0.19 -1.71,0.7v6.18L5.11,5.7c-0.39,-0.39 -1.02,-0.39 -1.41,0 -0.39,0.39 -0.39,1.02 0,1.41L8.59,12 3.7,16.89c-0.39,0.39 -0.39,1.02 0,1.41 0.39,0.39 1.02,0.39 1.41,0L9,14.41v6.18c0,0.89 1.08,1.34 1.71,0.71L15,17c0.39,-0.39 0.39,-1.02 0,-1.42L11.41,12zM11,5.83l1.88,1.88L11,9.59L11,5.83zM11,18.17v-3.76l1.88,1.88L11,18.17z"/>
</vector>

View File

@ -1,5 +0,0 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"/>
</vector>

View File

@ -1,18 +1,33 @@
<vector android:height="24dp" android:viewportHeight="48.0"
android:viewportWidth="48.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#ffffff"
<vector android:height="24dp"
android:viewportHeight="48.0"
android:tint="?attr/colorControlNormal"
android:viewportWidth="48.0"
android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<path
android:fillColor="#ffffff"
android:pathData="m22.75,12.78c-6.19,0 -11.22,5.03 -11.22,11.22 0,0.55 0.05,1.08 0.13,1.61 1.71,0.27 3.29,0.93 4.64,1.91 -0.57,-1.05 -0.9,-2.24 -0.9,-3.52 0,-4.05 3.3,-7.35 7.35,-7.35 4.05,0 7.35,3.3 7.35,7.35 0,4.05 -3.3,7.35 -7.35,7.35 -1.38,0 -2.66,-0.39 -3.77,-1.05 0.92,1.39 1.53,2.99 1.73,4.73 0.66,0.12 1.34,0.2 2.04,0.2 6.19,0 11.22,-5.03 11.22,-11.22 0,-6.19 -5.03,-11.22 -11.22,-11.22"
android:strokeColor="#00000000" android:strokeWidth="1"/>
<path android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:strokeWidth="1" />
<path
android:fillColor="#ffffff"
android:pathData="m42.28,25.4c-0.36,0 -0.71,-0.02 -1.06,-0.06 -0.69,9.6 -8.71,17.2 -18.48,17.2 -1.28,0 -2.53,-0.13 -3.74,-0.38 -0.83,1.26 -1.91,2.33 -3.18,3.15 2.18,0.71 4.5,1.1 6.91,1.1 12.03,0 21.87,-9.54 22.38,-21.45 -0.9,0.29 -1.85,0.44 -2.84,0.44"
android:strokeColor="#00000000" android:strokeWidth="1"/>
<path android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:strokeWidth="1" />
<path
android:fillColor="#ffffff"
android:pathData="m42.28,10.64c-2.96,0 -5.36,2.41 -5.36,5.36 0,2.96 2.41,5.36 5.36,5.36 2.96,0 5.36,-2.41 5.36,-5.36 0,-2.96 -2.41,-5.36 -5.36,-5.36"
android:strokeColor="#00000000" android:strokeWidth="1"/>
<path android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:strokeWidth="1" />
<path
android:fillColor="#ffffff"
android:pathData="m10,29.5c-3.72,0 -6.75,3.03 -6.75,6.75 0,3.72 3.03,6.75 6.75,6.75 3.72,0 6.75,-3.03 6.75,-6.75 0,-3.72 -3.03,-6.75 -6.75,-6.75"
android:strokeColor="#00000000" android:strokeWidth="1"/>
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:strokeWidth="1" />
<path
android:fillAlpha="1"
android:fillColor="#ffffff"
android:pathData="m4.47,27.01c-0.16,-0.98 -0.25,-1.98 -0.25,-3.01 0,-10.22 8.31,-18.53 18.53,-18.53 4.68,0 8.97,1.75 12.23,4.63C35.81,9.08 36.85,8.24 38.03,7.64 34.02,3.9 28.65,1.6 22.75,1.6 10.4,1.6 0.35,11.65 0.35,24c0,2.1 0.3,4.13 0.84,6.05 0.87,-1.23 1.99,-2.27 3.28,-3.04"
android:strokeColor="#00000000" android:strokeWidth="1"/>
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>

View File

@ -1,5 +0,0 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M12.01,21.49L23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4C5.28,3 0.81,6.66 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01z"/>
</vector>

View File

@ -0,0 +1,40 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FFFFFF"
android:pathData="M5,11h4c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2H5C3.9,3 3,3.9 3,5v4C3,10.1 3.9,11 5,11zM5,5h4v4H5V5z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M5,21h4c1.1,0 2,-0.9 2,-2v-4c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v4C3,20.1 3.9,21 5,21zM5,15h4v4H5V15z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M13,5v4c0,1.1 0.9,2 2,2h4c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2h-4C13.9,3 13,3.9 13,5zM19,9h-4V5h4V9z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M21,20.5v-1c0,-0.28 -0.22,-0.5 -0.5,-0.5h-1c-0.28,0 -0.5,0.22 -0.5,0.5v1c0,0.28 0.22,0.5 0.5,0.5h1C20.78,21 21,20.78 21,20.5z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M13,13.5v1c0,0.28 0.22,0.5 0.5,0.5h1c0.28,0 0.5,-0.22 0.5,-0.5v-1c0,-0.28 -0.22,-0.5 -0.5,-0.5h-1C13.22,13 13,13.22 13,13.5z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M16.5,15h-1c-0.28,0 -0.5,0.22 -0.5,0.5v1c0,0.28 0.22,0.5 0.5,0.5h1c0.28,0 0.5,-0.22 0.5,-0.5v-1C17,15.22 16.78,15 16.5,15z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M13,17.5v1c0,0.28 0.22,0.5 0.5,0.5h1c0.28,0 0.5,-0.22 0.5,-0.5v-1c0,-0.28 -0.22,-0.5 -0.5,-0.5h-1C13.22,17 13,17.22 13,17.5z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M15.5,21h1c0.28,0 0.5,-0.22 0.5,-0.5v-1c0,-0.28 -0.22,-0.5 -0.5,-0.5h-1c-0.28,0 -0.5,0.22 -0.5,0.5v1C15,20.78 15.22,21 15.5,21z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M17.5,19h1c0.28,0 0.5,-0.22 0.5,-0.5v-1c0,-0.28 -0.22,-0.5 -0.5,-0.5h-1c-0.28,0 -0.5,0.22 -0.5,0.5v1C17,18.78 17.22,19 17.5,19z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M18.5,13h-1c-0.28,0 -0.5,0.22 -0.5,0.5v1c0,0.28 0.22,0.5 0.5,0.5h1c0.28,0 0.5,-0.22 0.5,-0.5v-1C19,13.22 18.78,13 18.5,13z"/>
<path
android:fillColor="#FFFFFF"
android:pathData="M19.5,17h1c0.28,0 0.5,-0.22 0.5,-0.5v-1c0,-0.28 -0.22,-0.5 -0.5,-0.5h-1c-0.28,0 -0.5,0.22 -0.5,0.5v1C19,16.78 19.22,17 19.5,17z"/>
</vector>

View File

@ -1,5 +1,10 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M1,9l2,2c4.97,-4.97 13.03,-4.97 18,0l2,-2C16.93,2.93 7.08,2.93 1,9zM9,17l3,3 3,-3c-1.65,-1.66 -4.34,-1.66 -6,0zM5,13l2,2c2.76,-2.76 7.24,-2.76 10,0l2,-2C15.14,9.14 8.87,9.14 5,13z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M2.06,10.06c0.51,0.51 1.32,0.56 1.87,0.1 4.67,-3.84 11.45,-3.84 16.13,-0.01 0.56,0.46 1.38,0.42 1.89,-0.09 0.59,-0.59 0.55,-1.57 -0.1,-2.1 -5.71,-4.67 -13.97,-4.67 -19.69,0 -0.65,0.52 -0.7,1.5 -0.1,2.1zM9.82,17.82l1.47,1.47c0.39,0.39 1.02,0.39 1.41,0l1.47,-1.47c0.47,-0.47 0.37,-1.28 -0.23,-1.59 -1.22,-0.63 -2.68,-0.63 -3.91,0 -0.57,0.31 -0.68,1.12 -0.21,1.59zM6.09,14.09c0.49,0.49 1.26,0.54 1.83,0.13 2.44,-1.73 5.72,-1.73 8.16,0 0.57,0.4 1.34,0.36 1.83,-0.13l0.01,-0.01c0.6,-0.6 0.56,-1.62 -0.13,-2.11 -3.44,-2.49 -8.13,-2.49 -11.58,0 -0.69,0.5 -0.73,1.51 -0.12,2.12z" />
</vector>

View File

@ -1,5 +1,10 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M12,11c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,13c0,-3.31 -2.69,-6 -6,-6s-6,2.69 -6,6c0,2.22 1.21,4.15 3,5.19l1,-1.74c-1.19,-0.7 -2,-1.97 -2,-3.45 0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,1.48 -0.81,2.75 -2,3.45l1,1.74c1.79,-1.04 3,-2.97 3,-5.19zM12,3C6.48,3 2,7.48 2,13c0,3.7 2.01,6.92 4.99,8.65l1,-1.73C5.61,18.53 4,15.96 4,13c0,-4.42 3.58,-8 8,-8s8,3.58 8,8c0,2.96 -1.61,5.53 -4,6.92l1,1.73c2.99,-1.73 5,-4.95 5,-8.65 0,-5.52 -4.48,-10 -10,-10z"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FFFFFF"
android:pathData="M12,11c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,13c0,-3.56 -3.11,-6.4 -6.75,-5.95 -2.62,0.32 -4.78,2.41 -5.18,5.02 -0.33,2.15 0.49,4.11 1.93,5.4 0.48,0.43 1.23,0.33 1.56,-0.23l0.01,-0.01c0.24,-0.42 0.14,-0.93 -0.22,-1.26 -1.03,-0.93 -1.59,-2.37 -1.22,-3.94 0.33,-1.42 1.48,-2.57 2.9,-2.91C13.65,8.49 16,10.47 16,13c0,1.18 -0.52,2.23 -1.33,2.96 -0.36,0.32 -0.47,0.84 -0.23,1.26l0.01,0.01c0.31,0.53 1.03,0.69 1.5,0.28C17.2,16.41 18,14.8 18,13zM10.83,3.07c-4.62,0.52 -8.35,4.33 -8.78,8.96 -0.35,3.7 1.32,7.02 4.02,9.01 0.48,0.35 1.16,0.2 1.46,-0.31 0.25,-0.43 0.14,-0.99 -0.26,-1.29 -2.28,-1.69 -3.65,-4.55 -3.16,-7.7 0.54,-3.5 3.46,-6.29 6.98,-6.68C15.91,4.51 20,8.28 20,13c0,2.65 -1.29,4.98 -3.27,6.44 -0.4,0.3 -0.51,0.85 -0.26,1.29 0.3,0.52 0.98,0.66 1.46,0.31C20.4,19.22 22,16.3 22,13c0,-5.91 -5.13,-10.62 -11.17,-9.93z"/>
</vector>

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="130dp"
@ -12,7 +13,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/swap_start_header"/>
app:srcCompat="@drawable/swap_start_header"/>
<TextView
android:layout_width="wrap_content"

View File

@ -1,78 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingBottom="2dip"
android:paddingTop="2dip">
<ImageView
android:id="@android:id/icon"
android:layout_width="48dip"
android:layout_height="48dip"
android:layout_marginLeft="?attr/listPreferredItemPaddingLeft"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginTop="6dip"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
tools:src="@drawable/ic_launcher"
tools:ignore="ContentDescription" />
<!-- Suppress InconsistentLayout because the lower API levels use a checkbox rather than this -->
<ImageView
android:id="@+id/checked"
android:layout_width="32dip"
android:layout_height="32dip"
android:layout_marginRight="?attr/listPreferredItemPaddingLeft"
android:layout_marginEnd="?android:attr/listPreferredItemPaddingStart"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
tools:suppress="InconsistentLayout"
android:src="@drawable/ic_add_circle_outline" />
<TwoLineListItem
android:layout_toRightOf="@android:id/icon"
android:layout_toEndOf="@android:id/icon"
android:layout_toLeftOf="@id/checked"
android:layout_toStartOf="@id/checked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:mode="twoLine" >
<TextView
android:id="@+id/application_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="?attr/listPreferredItemPaddingLeft"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginTop="6dip"
android:textAppearance="?android:attr/textAppearanceMedium"
tools:text="F-Droid" />
<TextView
android:id="@+id/package_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/application_label"
android:layout_alignLeft="@+id/application_label"
android:layout_below="@+id/application_label"
android:textAppearance="?android:attr/textAppearanceSmall"
tools:text="Application Manager" />
</TwoLineListItem>
</RelativeLayout>

View File

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingBottom="2dip"
android:paddingTop="2dip">
<ImageView
android:id="@android:id/icon"
android:layout_width="48dip"
android:layout_height="48dip"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginTop="6dip"
android:layout_alignParentStart="true"
tools:src="@drawable/ic_launcher"
tools:ignore="ContentDescription" />
<!-- Suppress InconsistentLayout because the lower API levels use a checkbox rather than this -->
<ImageView
android:id="@+id/checked"
android:layout_width="32dip"
android:layout_height="32dip"
android:layout_marginEnd="?android:attr/listPreferredItemPaddingStart"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
tools:suppress="InconsistentLayout"
android:src="@drawable/ic_add_circle_outline" />
<TwoLineListItem
android:layout_toEndOf="@android:id/icon"
android:layout_toStartOf="@id/checked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:mode="twoLine" >
<TextView
android:id="@+id/application_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginTop="6dip"
android:textAppearance="?android:attr/textAppearanceMedium"
tools:text="F-Droid" />
<TextView
android:id="@+id/package_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/application_label"
android:layout_below="@+id/application_label"
android:textAppearance="?android:attr/textAppearanceSmall"
tools:text="Application Manager" />
</TwoLineListItem>
</RelativeLayout>

View File

@ -1,291 +1,302 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".panic.CalculatorActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:theme="?attr/actionBarTheme" />
android:layout_height="match_parent"
tools:context=".panic.CalculatorActivity"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/topAppBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:liftOnScroll="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:navigationIcon="@drawable/ic_back"
style="@style/Widget.MaterialComponents.Toolbar.PrimarySurface" />
</com.google.android.material.appbar.AppBarLayout>
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:gravity="bottom|end"
android:padding="5dp"
android:textAlignment="textEnd"
android:textSize="22sp"
android:typeface="monospace"
app:layout_constraintBottom_toTopOf="@+id/ce"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
tools:text="1337+42" />
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:gravity="bottom|end"
android:padding="5dp"
android:textAlignment="textEnd"
android:textSize="22sp"
android:typeface="monospace"
app:layout_constraintBottom_toTopOf="@+id/ce"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/topAppBarLayout"
tools:text="1337+42" />
<Button
android:id="@+id/times"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="×"
app:layout_constraintBottom_toTopOf="@+id/seven"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
android:id="@+id/times"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="×"
app:layout_constraintBottom_toTopOf="@+id/seven"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/divided"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="÷"
app:layout_constraintBottom_toTopOf="@+id/eight"
app:layout_constraintStart_toEndOf="@+id/times"
tools:ignore="HardcodedText" />
android:id="@+id/divided"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="÷"
app:layout_constraintBottom_toTopOf="@+id/eight"
app:layout_constraintStart_toEndOf="@+id/times"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/c"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="c"
android:text="C"
app:layout_constraintBottom_toTopOf="@+id/nine"
app:layout_constraintStart_toEndOf="@+id/divided"
tools:ignore="HardcodedText" />
android:id="@+id/c"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="c"
android:text="C"
app:layout_constraintBottom_toTopOf="@+id/nine"
app:layout_constraintStart_toEndOf="@+id/divided"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/seven"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="7"
app:layout_constraintBottom_toTopOf="@+id/four"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
android:id="@+id/seven"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="7"
app:layout_constraintBottom_toTopOf="@+id/four"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/eight"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="8"
app:layout_constraintBottom_toTopOf="@+id/five"
app:layout_constraintStart_toEndOf="@+id/seven"
tools:ignore="HardcodedText" />
android:id="@+id/eight"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="8"
app:layout_constraintBottom_toTopOf="@+id/five"
app:layout_constraintStart_toEndOf="@+id/seven"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/nine"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="9"
app:layout_constraintBottom_toTopOf="@+id/six"
app:layout_constraintStart_toEndOf="@+id/eight"
tools:ignore="HardcodedText" />
android:id="@+id/nine"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="9"
app:layout_constraintBottom_toTopOf="@+id/six"
app:layout_constraintStart_toEndOf="@+id/eight"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/ce"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:onClick="ce"
android:text="CE"
app:layout_constraintBottom_toTopOf="@+id/plus"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/nine"
tools:ignore="HardcodedText" />
android:id="@+id/ce"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:onClick="ce"
android:text="CE"
app:layout_constraintBottom_toTopOf="@+id/plus"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/nine"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/four"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="4"
app:layout_constraintBottom_toTopOf="@+id/one"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
android:id="@+id/four"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="4"
app:layout_constraintBottom_toTopOf="@+id/one"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/five"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="5"
app:layout_constraintBottom_toTopOf="@+id/two"
app:layout_constraintStart_toEndOf="@+id/four"
tools:ignore="HardcodedText" />
android:id="@+id/five"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="5"
app:layout_constraintBottom_toTopOf="@+id/two"
app:layout_constraintStart_toEndOf="@+id/four"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/six"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="6"
app:layout_constraintBottom_toTopOf="@+id/three"
app:layout_constraintStart_toEndOf="@+id/five"
tools:ignore="HardcodedText" />
android:id="@+id/six"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="6"
app:layout_constraintBottom_toTopOf="@+id/three"
app:layout_constraintStart_toEndOf="@+id/five"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/plus"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="+"
app:layout_constraintBottom_toTopOf="@+id/minus"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/six"
tools:ignore="HardcodedText" />
android:id="@+id/plus"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="+"
app:layout_constraintBottom_toTopOf="@+id/minus"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/six"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/minus"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="-"
app:layout_constraintBottom_toTopOf="@+id/equals"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/three"
tools:ignore="HardcodedText" />
android:id="@+id/minus"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="-"
app:layout_constraintBottom_toTopOf="@+id/equals"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/three"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/one"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="1"
app:layout_constraintBottom_toTopOf="@+id/zero"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
android:id="@+id/one"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="1"
app:layout_constraintBottom_toTopOf="@+id/zero"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/two"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="2"
app:layout_constraintBottom_toTopOf="@+id/comma"
app:layout_constraintStart_toEndOf="@+id/one"
tools:ignore="HardcodedText" />
android:id="@+id/two"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="2"
app:layout_constraintBottom_toTopOf="@+id/comma"
app:layout_constraintStart_toEndOf="@+id/one"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/three"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="3"
app:layout_constraintBottom_toTopOf="@+id/percent"
app:layout_constraintStart_toEndOf="@+id/two"
tools:ignore="HardcodedText" />
android:id="@+id/three"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="3"
app:layout_constraintBottom_toTopOf="@+id/percent"
app:layout_constraintStart_toEndOf="@+id/two"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/zero"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="0"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
android:id="@+id/zero"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="0"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/comma"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="."
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/zero"
tools:ignore="HardcodedText" />
android:id="@+id/comma"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="number"
android:text="."
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/zero"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/percent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="%"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/comma"
tools:ignore="HardcodedText" />
android:id="@+id/percent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="%"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/comma"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/equals"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="="
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/three"
app:layout_constraintTop_toTopOf="@+id/three"
tools:ignore="HardcodedText" />
android:id="@+id/equals"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:onClick="op"
android:text="="
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/three"
app:layout_constraintTop_toTopOf="@+id/three"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,21 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
app:theme="?attr/actionBarTheme" />
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true">
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
class="org.fdroid.fdroid.panic.PanicPreferencesFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:liftOnScroll="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:title="@string/panic_settings"
app:navigationIcon="@drawable/ic_back"
style="@style/Widget.MaterialComponents.Toolbar.PrimarySurface" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container"
class="org.fdroid.fdroid.panic.PanicPreferencesFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

View File

@ -5,7 +5,8 @@
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:layout_width="match_parent"
@ -16,7 +17,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<org.fdroid.fdroid.views.BannerUpdatingRepos
<org.fdroid.fdroid.views.StatusBanner
android:id="@+id/banner_updating_repos"
android:layout_width="0dp"
android:layout_height="wrap_content"

View File

@ -11,14 +11,14 @@
android:id="@+id/image"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/nearby_splash"
app:srcCompat="@drawable/nearby_splash"
android:importantForAccessibility="no"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/both_parties_need_fdroid_text"
android:layout_marginTop="36dp"
android:tint="?attr/mainTabSwapSplashTint"
app:tint="?attr/mainTabSwapSplashTint"
android:scaleType="fitXY"
tools:targetApi="jelly_bean"/>

View File

@ -16,7 +16,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:minHeight="?attr/listPreferredItemHeight"
android:paddingBottom="2dip"
android:paddingTop="2dip">
@ -25,10 +25,9 @@
android:layout_width="48dip"
android:layout_height="48dip"
android:layout_marginLeft="?attr/listPreferredItemPaddingLeft"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginStart="?attr/listPreferredItemPaddingStart"
android:layout_marginTop="6dip"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
tools:src="@drawable/ic_launcher"
tools:ignore="ContentDescription" />
@ -37,15 +36,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="?attr/listPreferredItemPaddingLeft"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginStart="?attr/listPreferredItemPaddingStart"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true" />
<TwoLineListItem
android:layout_toRightOf="@android:id/icon"
android:layout_toEndOf="@android:id/icon"
android:layout_toLeftOf="@id/checkbox"
android:layout_toStartOf="@id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -56,7 +53,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="?attr/listPreferredItemPaddingLeft"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginStart="?attr/listPreferredItemPaddingStart"
android:layout_marginTop="6dip"
android:textAppearance="?android:attr/textAppearanceMedium"
tools:text="F-Droid" />
@ -66,7 +63,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/application_label"
android:layout_alignLeft="@+id/application_label"
android:layout_below="@+id/application_label"
android:textAppearance="?android:attr/textAppearanceSmall"
tools:text="Application Manager" />

View File

@ -1,24 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:titleTextAppearance="@style/SwapTheme.Wizard.Text"
titleTextAppearance="@style/SwapTheme.Wizard.Text"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
tools:ignore="UnusedAttribute"/>
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:liftOnScroll="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:navigationIcon="@drawable/ic_back"
style="@style/Widget.MaterialComponents.Toolbar.PrimarySurface" />
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
android:layout_height="fill_parent" />
</LinearLayout>

View File

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:minHeight="?attr/listPreferredItemHeight"
android:paddingBottom="2dip"
android:paddingTop="2dip">
@ -12,7 +12,7 @@
android:id="@android:id/icon"
android:layout_width="48dip"
android:layout_height="48dip"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginStart="?attr/listPreferredItemPaddingStart"
android:layout_marginLeft="10dp"
android:layout_marginTop="6dip"
android:layout_alignParentStart="true"
@ -28,7 +28,7 @@
android:layout_centerInParent="true"
android:orientation="vertical"
android:gravity="end"
android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
android:layout_marginRight="10dp">
<Button
@ -68,7 +68,7 @@
android:layout_toLeftOf="@+id/button_or_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginStart="?attr/listPreferredItemPaddingStart"
android:layout_marginLeft="10dp"
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip"

View File

@ -14,7 +14,7 @@
<ImageView
android:id="@+id/icon"
android:src="@drawable/ic_launcher"
swap:srcCompat="@drawable/ic_launcher"
android:contentDescription="@string/icon"
android:layout_alignParentTop="true"
android:layout_width="117.6dp"

View File

@ -25,7 +25,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/wifi_icon"
android:src="@drawable/ic_wifi"
swap:srcCompat="@drawable/ic_wifi"
android:layout_below="@+id/text_description"
android:layout_centerHorizontal="true"/>

View File

@ -14,7 +14,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/icon_nfc"
android:src="@drawable/nfc_touch"
swap:srcCompat="@drawable/nfc_touch"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"/>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="?attr/listPreferredItemHeight"
@ -13,14 +14,14 @@
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginLeft="?attr/listPreferredItemPaddingLeft"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginStart="?attr/listPreferredItemPaddingStart"
android:layout_gravity="center_vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/circle"
android:tint="@color/swap_light_grey_icon"/>
app:srcCompat="@drawable/circle"
app:tint="@color/swap_light_grey_icon"/>
<ImageView
android:id="@+id/icon"
@ -37,7 +38,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="?attr/listPreferredItemPaddingLeft"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginStart="?attr/listPreferredItemPaddingStart"
android:textSize="20sp"
android:textAppearance="?android:attr/textAppearanceMedium"
tools:text="Nexus 4"/>

View File

@ -25,9 +25,8 @@
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:tint="@color/swap_grey_icon"
android:contentDescription="@string/use_bluetooth"
android:src="@drawable/ic_bluetooth"/>
swap:srcCompat="@drawable/ic_bluetooth_searching"/>
<LinearLayout
android:layout_width="0dp"
@ -54,7 +53,7 @@
</LinearLayout>
<androidx.appcompat.widget.SwitchCompat
<com.google.android.material.switchmaterial.SwitchMaterial
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
@ -74,9 +73,8 @@
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:tint="@color/swap_grey_icon"
android:contentDescription="@string/wifi"
android:src="@drawable/ic_network_wifi"/>
swap:srcCompat="@drawable/ic_wifi"/>
<LinearLayout
android:layout_width="0dp"
@ -112,7 +110,7 @@
</LinearLayout>
<androidx.appcompat.widget.SwitchCompat
<com.google.android.material.switchmaterial.SwitchMaterial
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/switch_wifi"/>
@ -156,32 +154,20 @@
android:layout_alignParentBottom="true">
<Button
android:id="@+id/btn_send_fdroid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_fdroid_grey"
android:drawableStart="@drawable/ic_fdroid_grey"
android:text="@string/swap_send_fdroid"
android:drawablePadding="10dp"
android:paddingLeft="25dp"
android:paddingRight="25dp"
android:paddingStart="25dp"
android:paddingEnd="25dp"
android:background="@android:color/transparent"/>
android:id="@+id/btn_send_fdroid"
style="@style/Widget.App.Button.TextButton"
android:layout_width="wrap_content"
swap:icon="@drawable/ic_fdroid_grey"
android:layout_height="wrap_content"
android:text="@string/swap_send_fdroid" />
<Button
android:id="@+id/btn_scan_qr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_qr_grey"
android:drawableStart="@drawable/ic_qr_grey"
android:text="@string/swap_scan_qr"
android:drawablePadding="10dp"
android:paddingLeft="25dp"
android:paddingRight="25dp"
android:paddingStart="25dp"
android:paddingEnd="25dp"
android:background="@android:color/transparent"/>
android:id="@+id/btn_scan_qr"
style="@style/Widget.App.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/swap_scan_qr"
swap:icon="@drawable/ic_qr_code" />
</LinearLayout>

View File

@ -1,22 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MenuTitle">
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
app:showAsAction="ifRoom|withText"
android:id="@+id/whats_new"/>
android:id="@+id/latest"
android:enabled="true"
android:icon="@drawable/ic_latest"
android:orderInCategory="0"
android:title="@string/main_menu__latest_apps"
app:showAsAction="ifRoom|withText" />
<item
app:showAsAction="ifRoom|withText"
android:id="@+id/categories"/>
android:id="@+id/categories"
android:enabled="true"
android:icon="@drawable/ic_categories"
android:orderInCategory="1"
android:title="@string/main_menu__categories"
app:showAsAction="ifRoom|withText" />
<item
app:showAsAction="ifRoom|withText"
android:id="@+id/nearby"/>
android:id="@+id/nearby"
android:enabled="true"
android:icon="@drawable/ic_nearby"
android:orderInCategory="2"
android:title="@string/main_menu__swap_nearby"
app:showAsAction="ifRoom|withText" />
<item
app:showAsAction="ifRoom|withText"
android:id="@+id/updates"/>
android:id="@+id/updates"
android:enabled="true"
android:icon="@drawable/ic_updates"
android:orderInCategory="3"
android:title="@string/main_menu__updates"
app:showAsAction="ifRoom|withText" />
<item
app:showAsAction="ifRoom|withText"
android:id="@+id/settings"/>
android:id="@+id/settings"
android:enabled="true"
android:icon="@drawable/ic_settings"
android:orderInCategory="4"
android:title="@string/menu_settings"
app:showAsAction="ifRoom|withText" />
</menu>

Some files were not shown because too many files have changed in this diff Show More