1
mirror of https://github.com/TeamNewPipe/NewPipe synced 2025-09-19 23:40:51 +02:00

Compare commits

...

221 Commits

Author SHA1 Message Date
Stypox
0c63950429 Merge pull request #8889 from TeamNewPipe/release-0.24.0
Release v0.24.0 (990)
2022-09-25 13:56:20 +02:00
Stypox
aa9cd8c88f Update NewPipeExtractor again 2022-09-25 13:33:49 +02:00
Hosted Weblate
3110b08988 Translated using Weblate (Tamil)
Currently translated at 52.6% (337 of 640 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.5% (637 of 640 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Portuguese)

Currently translated at 60.5% (43 of 71 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Tamil)

Currently translated at 52.5% (336 of 640 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Slovak)

Currently translated at 8.4% (6 of 71 strings)

Translated using Weblate (Kurdish (Central))

Currently translated at 98.1% (628 of 640 strings)

Translated using Weblate (Galician)

Currently translated at 99.6% (638 of 640 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (German)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Spanish)

Currently translated at 88.7% (63 of 71 strings)

Translated using Weblate (Hindi)

Currently translated at 4.2% (3 of 71 strings)

Translated using Weblate (Portuguese)

Currently translated at 60.5% (43 of 71 strings)

Translated using Weblate (Hindi)

Currently translated at 68.7% (440 of 640 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Dutch)

Currently translated at 99.3% (636 of 640 strings)

Translated using Weblate (English)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (71 of 71 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 63.3% (45 of 71 strings)

Translated using Weblate (Swedish)

Currently translated at 47.8% (34 of 71 strings)

Translated using Weblate (French)

Currently translated at 90.1% (64 of 71 strings)

Translated using Weblate (Spanish)

Currently translated at 57.7% (41 of 71 strings)

Translated using Weblate (Polish)

Currently translated at 57.7% (41 of 71 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (71 of 71 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (71 of 71 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 15.4% (11 of 71 strings)

Translated using Weblate (Portuguese (Portugal))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (French)

Currently translated at 100.0% (640 of 640 strings)

Co-authored-by: Agnieszka C <aga_04@o2.pl>
Co-authored-by: Alex25820 <alexs25820@gmail.com>
Co-authored-by: Denys Nykula <vegan@libre.net.ua>
Co-authored-by: Eduardo Malaspina <vaio0@swismail.com>
Co-authored-by: Eric <hamburger1024@mailbox.org>
Co-authored-by: Error Specialist <errorspecialist02@gmail.com>
Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Hoseok Seo <ddinghoya@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Igor Nedoboy <i.nedoboy@mail.ru>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
Co-authored-by: Leonardo Brauna <leonardo_brauna@hotmail.com.br>
Co-authored-by: Maday <royalcoolness7898@gmail.com>
Co-authored-by: Marc Barten <mwbarten@hotmail.com>
Co-authored-by: Max Xie <monyxie@gmail.com>
Co-authored-by: MohammedSR Vevo <mohammednajmidin@gmail.com>
Co-authored-by: NTFSynergy <ntfsynergy@gmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Ray <ray.cfu@protonmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: SC <lalocas@protonmail.com>
Co-authored-by: SEENUVASAN T <seenuthiruvpm@gmail.com>
Co-authored-by: TXRdev Archive <lckphanaf9999@gmail.com>
Co-authored-by: Terry Louwers <t.louwers@gmail.com>
Co-authored-by: TiA4f8R <avdivers84@gmail.com>
Co-authored-by: Tom Sawyer <weblate@grymkoll.se>
Co-authored-by: Translator <kvb@tuta.io>
Co-authored-by: Vas R <mrkomododragon1234@gmail.com>
Co-authored-by: VfBFan <drop0815@posteo.de>
Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Co-authored-by: atilluF <atilluf@outlook.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: weughgh <ahmedhuntingpro@proton.me>
Co-authored-by: zmni <zmni@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/
Translation: NewPipe/Metadata
2022-09-25 13:31:17 +02:00
Stypox
489f052ef9 Fix feed menu tooltips (silly copy-paste error) 2022-09-19 11:21:42 +02:00
Stypox
8313f6bb51 Update NewPipeExtractor again 2022-09-19 09:17:25 +02:00
Stypox
bf55ed262f Merge pull request #8972 from Stypox/fix-suggestions-listadapter
Fix various issues in the search suggestions list
2022-09-19 08:54:55 +02:00
Stypox
f26bf33ead Merge pull request #8966 from Stypox/feed-menuitem-tooltip
Show correct tooltips for actions in feed
2022-09-19 08:54:06 +02:00
Stypox
ca29f6cc1f Merge pull request #8899 from Stypox/fix-player-thumbnail-handling
Fix wrong thumbnail in notification on Android 13
2022-09-19 08:49:39 +02:00
Stypox
28b34f3796 Fix scroll issues in suggestion list
Before if the list before updating contained item 'test' at position 0 and after updating that value went to the bottom, the list would incorrectly scroll to the bottom to follow that item. Now the scrolling is done after the list is updated.
2022-09-14 14:39:32 +02:00
Stypox
1f57c87859 Disable suggestion list animations: not meaningful
The animations were just in the way and did not help in choosing items, since the suggestion items keep changing too much.
2022-09-14 14:04:22 +02:00
Stypox
fbf5549182 Fix wrong icons being set on suggestion items
The diff util wrongly considered as equal two items with the same text but with different `fromHistory` value
2022-09-14 14:01:59 +02:00
Stypox
051c572e7f Show correct tooltips for actions in feed 2022-09-13 15:26:04 +02:00
Stypox
ed87465565 Only update notification large icon when it changes 2022-08-28 23:14:02 +02:00
Stypox
f9109ebc81 Use player.getThumbnail() instead of field in VideoPlayerUi 2022-08-28 18:35:21 +02:00
Stypox
4a7af6f9ac Remove thumbnail before sync, if outdated
Also refactor onPlaybackSynchronize and add comments
2022-08-28 18:32:27 +02:00
Stypox
7fbef35daa Unify onThumbnailLoaded calls to ensure UIs always updated 2022-08-28 17:24:51 +02:00
Stypox
e6391a860a Release v0.24.0 (990) 2022-08-27 14:52:49 +02:00
Stypox
ebce4c5b7e Add changelog for v0.24.0 (990) 2022-08-27 14:47:57 +02:00
Hosted Weblate
e7e61a0c4c Merge branch 'origin/dev' into Weblate. 2022-08-27 14:06:04 +02:00
Stypox
131f78c0c2 Merge pull request #8731 from Stypox/player-refactor-wrong-video-size
Fix surface view not resizing video correctly + other player fixes
2022-08-27 12:02:27 +02:00
Hosted Weblate
67b5de38b1 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (70 of 70 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (70 of 70 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (70 of 70 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 100.0% (69 of 69 strings)

Translated using Weblate (Interlingua)

Currently translated at 35.0% (224 of 640 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 62.3% (43 of 69 strings)

Translated using Weblate (Korean)

Currently translated at 10.1% (7 of 69 strings)

Translated using Weblate (French)

Currently translated at 89.8% (62 of 69 strings)

Translated using Weblate (Hebrew)

Currently translated at 55.0% (38 of 69 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (69 of 69 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (69 of 69 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 13.0% (9 of 69 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Bengali (Bangladesh))

Currently translated at 5.8% (4 of 68 strings)

Translated using Weblate (French)

Currently translated at 89.7% (61 of 68 strings)

Translated using Weblate (French)

Currently translated at 89.7% (61 of 68 strings)

Translated using Weblate (Bengali)

Currently translated at 22.0% (15 of 68 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (French)

Currently translated at 73.5% (50 of 68 strings)

Translated using Weblate (Russian)

Currently translated at 30.8% (21 of 68 strings)

Translated using Weblate (German)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Hungarian)

Currently translated at 7.3% (5 of 68 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Polish)

Currently translated at 58.8% (40 of 68 strings)

Translated using Weblate (Bengali)

Currently translated at 88.7% (568 of 640 strings)

Translated using Weblate (Malayalam)

Currently translated at 90.7% (581 of 640 strings)

Translated using Weblate (Interlingua)

Currently translated at 33.5% (215 of 640 strings)

Translated using Weblate (Croatian)

Currently translated at 98.1% (628 of 640 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Hungarian)

Currently translated at 93.9% (601 of 640 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Somali)

Currently translated at 89.0% (570 of 640 strings)

Translated using Weblate (German)

Currently translated at 66.1% (45 of 68 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Armenian)

Currently translated at 29.2% (187 of 640 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Spanish)

Currently translated at 99.5% (637 of 640 strings)

Translated using Weblate (Urdu)

Currently translated at 67.1% (430 of 640 strings)

Translated using Weblate (Croatian)

Currently translated at 97.5% (624 of 640 strings)

Translated using Weblate (Portuguese)

Currently translated at 61.7% (42 of 68 strings)

Translated using Weblate (Russian)

Currently translated at 22.0% (15 of 68 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (French)

Currently translated at 72.0% (49 of 68 strings)

Translated using Weblate (Italian)

Currently translated at 41.1% (28 of 68 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (68 of 68 strings)

Translated using Weblate (Portuguese (Portugal))

Currently translated at 99.6% (638 of 640 strings)

Translated using Weblate (Sardinian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Bulgarian)

Currently translated at 72.0% (461 of 640 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Bengali (Bangladesh))

Currently translated at 64.6% (414 of 640 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Persian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Basque)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (French)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (German)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Slovak)

Currently translated at 8.8% (6 of 68 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (French)

Currently translated at 70.5% (48 of 68 strings)

Translated using Weblate (Filipino)

Currently translated at 36.8% (236 of 640 strings)

Translated using Weblate (Bulgarian)

Currently translated at 70.6% (452 of 640 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Turkish)

Currently translated at 32.3% (22 of 68 strings)

Translated using Weblate (Telugu)

Currently translated at 65.6% (420 of 640 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 97.1% (622 of 640 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Japanese)

Currently translated at 99.2% (635 of 640 strings)

Co-authored-by: Agnieszka C <aga_04@o2.pl>
Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Co-authored-by: Alex25820 <alexs25820@gmail.com>
Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Co-authored-by: Davit Mayilyan <davit.mayilyan@protonmail.ch>
Co-authored-by: Edward <edwardchirita@mailbox.org>
Co-authored-by: Emin Tufan Çetin <etcetin@gmail.com>
Co-authored-by: Eric <alchemillatruth@purelymail.com>
Co-authored-by: Evghenii Botnari <botnarievgheniy@gmail.com>
Co-authored-by: Fjuro <fjuro@seznam.cz>
Co-authored-by: Francisco Ruiz <fjrbas@yahoo.es>
Co-authored-by: Giovanni Donisi <giovannidonisi0701@gmail.com>
Co-authored-by: GnuPGを使うべきだ <dieeeazpnnqbpddh@cock.email>
Co-authored-by: Gontzal Manuel Pujana Onaindia <thadahdenyse@gmail.com>
Co-authored-by: Hin Weisner <translatu.godwit@aleeas.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Igor Sorocean <sorocean.igor@gmail.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: JScocktail <yarbutt2005@gmail.com>
Co-authored-by: Jalaluddin <ju81@ymail.com>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
Co-authored-by: Josu <bi000@protonmail.com>
Co-authored-by: Karl Tammik <karltammik@protonmail.com>
Co-authored-by: Laura Vasconcelos Pereira Felippe <lauravpf@gmail.com>
Co-authored-by: Lenn Art <gitlab@wunstblog.de>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Louis V <michumadame1@gmail.com>
Co-authored-by: Marian Hanzel <marulinko@gmail.com>
Co-authored-by: MatthieuPh <matthieu.philippe@protonmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
Co-authored-by: MΛX <maxkorsov@protonmail.com>
Co-authored-by: Nadir Nour <dudethatwascool2@gmail.com>
Co-authored-by: Napstaguy04 <brokenscreen3@gmail.com>
Co-authored-by: Nizami <nizamismidov4@gmail.com>
Co-authored-by: Oymate <dhruboadittya96@gmail.com>
Co-authored-by: Pieter van der Razemond <pietervanderrazemond@mailbox.org>
Co-authored-by: Ray <ray.cfu@protonmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Ricardo <contatorms7@tutamail.com>
Co-authored-by: S3aBreeze <paperwork@evilcorp.ltd>
Co-authored-by: SC <lalocas@protonmail.com>
Co-authored-by: STV <steeven.lombardi@gmail.com>
Co-authored-by: Samar Ali <samarali.dev@gmail.com>
Co-authored-by: Santhosh J <santhoshj296@gmail.com>
Co-authored-by: Software In Interlingua <softinterlingua@gmail.com>
Co-authored-by: TXRdev Archive <lckphanaf9999@gmail.com>
Co-authored-by: Tadeusz Dudek <t--o_o@outlook.com>
Co-authored-by: ThePlanetaryDroid <gmeyq5y0@duck.com>
Co-authored-by: Translator <kvb@tuta.io>
Co-authored-by: Vasilis K <skyhirules@gmail.com>
Co-authored-by: VfBFan <drop0815@posteo.de>
Co-authored-by: Viktor <xasertop@gmail.com>
Co-authored-by: WB <dln0@proton.me>
Co-authored-by: Xəyyam Qocayev <xxmn77@gmail.com>
Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Co-authored-by: Zoldtukor <emailekhez@gmail.com>
Co-authored-by: chr56 <chr0056@gmail.com>
Co-authored-by: i-am-SangWoo-Lee <i.am.sangwoo.lee@gmail.com>
Co-authored-by: nautilusx <translate@disroot.org>
Co-authored-by: pjammo <adrianoghr@hotmail.it>
Co-authored-by: rakijagamer-2003 <rakijaisthebest@abv.bg>
Co-authored-by: remon-drk <omerdoruk005@gmail.com>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: subba raidu <raidu4u@gmail.com>
Co-authored-by: yunna <yunna.in@gmail.com>
Co-authored-by: Симеон Цветков <sicvetkov@uni-sofia.bg>
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/az/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bn/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bn_BD/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/he/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hu/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ko/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ru/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/
Translation: NewPipe/Metadata
2022-08-27 11:53:53 +02:00
Stypox
f9994abb94 Prevent tapping on thumbnail if video details are not loaded 2022-08-26 18:54:51 +02:00
Stypox
ca0f56eea8 Avoid setting invalid states to bottom sheet callback 2022-08-26 18:54:51 +02:00
Stypox
500acce178 Fix regression in screen rotation animation 2022-08-26 18:54:51 +02:00
Stypox
6805c75c9c Fix surface view not resizing video correctly
Also fix yet another random null pointer exception that could happen when adding the video player view
2022-08-26 18:54:51 +02:00
litetex
75917c7f61 Merge pull request #8678 from Stypox/media-session-ui
Create media session UI and fix player notification
2022-08-25 17:18:36 +02:00
litetex
59d1ded94e Fixed sonar detected problems
+ Automatically fixed code style (imports)
2022-08-25 17:02:53 +02:00
Stypox
973a966011 Review suggestions 2022-08-25 17:02:53 +02:00
Stypox
510efaae97 Keep strong reference to Picasso thumbnail loading target
Before the Target would sometimes be garbage collected before being called with the loaded thumbnail, since Picasso holds weak references to targets
2022-08-25 17:02:52 +02:00
Stypox
11bd2369e5 Merge MediaSessionManager into MediaSessionPlayerUi 2022-08-25 17:02:52 +02:00
Stypox
f80d1dc48d Let exoplayer decide when to update metadata
Though still make sure metadata is updated after the thumbnail is loaded.
This fixes the wrong seekbar properties (duration and current position) being shown in the notification sometimes.
2022-08-25 17:02:52 +02:00
Stypox
8bff445ec3 Remove useless checks before updating metadata
A while ago NewPipe called the metadata update function very often, so checks were needed to ensure not wasting time updating metadata if it were already up to date. Now, instead, the metadata update function is called exactly when needed, i.e. when metadata changes, so such checks are not needed anymore (and were probably also a little resource-heavy).
2022-08-25 17:02:51 +02:00
Stypox
d73ca41cfe Even when thumbnails should not be shown, set it to null in notification
This makes sure the thumbnail is removed from the notification if the user disables thumbnails
2022-08-25 17:02:51 +02:00
Stypox
f3a9b81b67 Fix sometimes seeing outdated thumbnail in notification
Before the thumbnail finishes loading for the new video the player is now playing, the old thumbnail was being used, leading to wrong thumbnails set in the media session and the notification.
2022-08-25 17:02:51 +02:00
Stypox
3cc43e9fb9 Fix thumbnail sometimes not set to media session metadata
The thumbnail was not being updated in the media session metadata after it was loaded, since there was no metadata update in that case, only a notification update.
2022-08-25 17:00:41 +02:00
Stypox
bc33322d4b Remove useless MediaSessionCallback
The player is now passed directly, it made no sense to wrap around it in a callback that was not really a callback but rather, actually, a wrapper.
2022-08-25 17:00:41 +02:00
Stypox
c054ea0737 Create MediaSessionPlayerUi 2022-08-25 17:00:41 +02:00
litetex
ce6f3ca5df Merge pull request #8677 from Stypox/fix-picasso-target
Keep strong references to Picasso notification icon loading targets
2022-08-25 16:55:31 +02:00
Stypox
52dbfdee00 Keep strong references to Picasso notification icon loading targets
Before the Target would sometimes be garbage collected before being called with the loaded channel icon, since Picasso holds weak references to targets. This meant that sometimes a new streams notification  would not be shown, because the lambda that should have shown it had already been garbage collected.
2022-08-25 16:41:51 +02:00
litetex
1e964a36a9 Merge pull request #8754 from mhmdanas/clarify-that-span-shouldnt-be-in-translated-readme
Clarify that span shouldn't be in translated READMEs
2022-08-25 16:27:16 +02:00
litetex
679e81e091 Merge pull request #8755 from mhmdanas/remove-whitespace
Remove extra whitespace from issue and PR templates
2022-08-25 16:26:31 +02:00
litetex
2e3e4f5a84 Merge pull request #8751 from TacoTheDank/bumpGradle
Update Gradle to 7.5.1
2022-08-25 16:25:32 +02:00
Stypox
208dde631f Merge branch 'master' into dev 2022-08-25 10:45:24 +02:00
Stypox
4227866fcf Improve changelog for v0.23.3 (989) 2022-08-25 10:44:29 +02:00
Stypox
335e682299 Merge pull request #8880 from TeamNewPipe/release-0.23.3
Hotfix release v0.23.3
2022-08-25 10:40:01 +02:00
Stypox
5c0ed22b09 Add changelog for v0.23.3 (989) 2022-08-25 10:23:09 +02:00
Stypox
e1b8a3fbdf Hotfix release v0.23.3 (989) 2022-08-25 10:16:56 +02:00
Stypox
1a432f2ee3 Update jsoup to 1.15.3
This fixes a vulnerability issue related to Cross Site Scripting
2022-08-25 10:15:30 +02:00
Stypox
db45042a56 Update NewPipeExtractor
This removes the usage of the SourceVersion class, which was not available on Android and caused issues such as #8876
2022-08-25 10:14:46 +02:00
opusforlife2
a50b9bd6ff Add FAQ entry to the template checklists (#8822)
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
2022-08-21 20:39:57 +03:00
Taco
2089f3e54c Merge pull request #8719 from Isira-Seneviratne/Use_ListAdapter
Use ListAdapter for search predictions.
2022-08-19 15:50:41 -04:00
Isira Seneviratne
5e0788b99c Use ListAdapter in PreferenceSearchAdapter. 2022-08-18 19:52:51 +05:30
Isira Seneviratne
67669c286b Use ListAdapter in SuggestionListAdapter. 2022-08-18 19:52:51 +05:30
Isira Seneviratne
4f6b5b3b89 Use ListAdapter in PeertubeInstanceListFragment. 2022-08-15 07:26:02 +05:30
Stypox
b9b09d325a Merge branch 'master' into dev 2022-08-14 17:23:30 +02:00
Stypox
571bf397c5 Merge pull request #8666 from TacoTheDank/filepicker
Update FilePicker to our custom fork and disable Jetifier
2022-08-12 09:15:34 +02:00
mhmdanas
737a331c85 Remove extra whitespace from issue and PR templates 2022-08-11 19:34:23 +03:00
mhmdanas
2de33d8d07 Clarify that span shouldn't be in translated READMEs 2022-08-11 19:24:14 +03:00
TacoTheDank
7f21f6e80e Update AGP and clojars Maven URL 2022-08-09 19:19:17 -04:00
TacoTheDank
0b11afaf2f Update Gradle to 7.5.1 2022-08-08 19:32:21 -04:00
Stypox
74921d3afa Merge pull request #8740 from Isira-Seneviratne/Cleanup_methods
Remove some unused methods.
2022-08-06 22:45:40 +02:00
Stypox
edd2b110b0 Merge pull request #8738 from Isira-Seneviratne/Collectors_joining
Use Collectors.joining().
2022-08-06 22:31:31 +02:00
Stypox
80fb21e031 Merge pull request #8728 from Isira-Seneviratne/Comparator_factory
Use Comparator factory methods.
2022-08-06 11:56:44 +02:00
Stypox
ebd06bdd24 Improve comment 2022-08-06 11:56:00 +02:00
Stypox
6f86e21605 Merge pull request #8724 from Isira-Seneviratne/toArray_improvements
Use toArray() with zero-length arrays.
2022-08-06 11:33:05 +02:00
Stypox
816154c7cb Merge pull request #8737 from Isira-Seneviratne/Fix_coerceIn
Replace coerceIn() with MathUtils.clamp().
2022-08-06 11:16:06 +02:00
Stypox
d9230c0103 Merge pull request #8708 from Isira-Seneviratne/Reduce_View.kt_size
Reduce View.kt size.
2022-08-06 10:59:10 +02:00
Isira Seneviratne
5c7dfd1d69 Remove unused method. 2022-08-06 06:54:21 +05:30
Isira Seneviratne
7aacaf8c38 Use Collectors.joining(). 2022-08-06 06:54:21 +05:30
Isira Seneviratne
ee6a279596 Remove unused methods in HistoryRecordManager. 2022-08-06 05:09:54 +05:30
Isira Seneviratne
a9af1dfdd2 Applied code review changes. 2022-08-05 06:54:03 +05:30
Isira Seneviratne
fc46233baf Use toArray() with zero-length arrays. 2022-08-05 06:50:55 +05:30
Isira Seneviratne
2eec2e9128 Replace coerceIn() with MathUtils.clamp(). 2022-08-05 06:19:06 +05:30
Isira Seneviratne
8024b437e9 Add reusable classes extending AnimatorListenerAdapter. 2022-08-05 06:08:13 +05:30
Isira Seneviratne
d1f3f15478 Use Comparator.comparingDouble(). 2022-08-05 05:36:39 +05:30
Isira Seneviratne
059cfcbad2 Use Comparator factory methods in ListHelper. 2022-08-05 05:36:21 +05:30
Stypox
1a8f396e77 Merge pull request #8721 from Isira-Seneviratne/OnClickGesture_interface
Make OnClickGesture an interface.
2022-08-04 16:15:54 +02:00
Stypox
5640365fbd Merge pull request #8682 from Isira-Seneviratne/Refactor_LicenseFragmentHelper
Refactor LicenseFragmentHelper.
2022-08-04 11:18:40 +02:00
Isira Seneviratne
4b7de86a92 Clean up getLicenseStylesheet(). 2022-08-04 11:17:30 +02:00
Stypox
24ec642181 Merge pull request #8669 from Isira-Seneviratne/Remove_setBottomSheetCallback
Remove uses of setBottomSheetCallback().
2022-08-04 11:03:57 +02:00
Stypox
22d75f3ecb Merge pull request #8716 from TacoTheDank/bumpRoom
Update AndroidX Room to 2.4.3
2022-08-04 10:40:26 +02:00
Stypox
7972678fe6 Merge branch 'dev' into bumpRoom 2022-08-04 10:40:09 +02:00
Stypox
ffc1d9a212 Merge pull request #8656 from Isira-Seneviratne/Use_WindowMetrics
Use WindowMetrics API.
2022-08-04 10:12:32 +02:00
Isira Seneviratne
7f018b90db Merge branch 'dev' into OnClickGesture_interface 2022-08-04 06:10:39 +05:30
Stypox
8a774dc90d Merge pull request #8667 from Isira-Seneviratne/Update_AppCompat
Update AppCompat to 1.4.2.
2022-08-03 22:59:45 +02:00
Stypox
368c6c0ccb Merge pull request #8709 from Isira-Seneviratne/Tags_case_insensitive
Sort tags case-insensitively.
2022-08-03 22:43:50 +02:00
Stypox
5c4874b90f Merge pull request #8701 from Isira-Seneviratne/Use_stackTraceToString
Use Throwable.stackTraceToString().
2022-08-03 21:04:22 +02:00
Stypox
3420faab08 Merge pull request #8661 from Stypox/player-refactor-npe
Fix random NullPointerException when adding video player view
2022-08-02 11:09:50 +02:00
Stypox
a548b34811 Merge pull request #8692 from TacoTheDank/bumpMaterial
Update Google Material to 1.6.1
2022-08-02 11:05:24 +02:00
Stypox
56cbf3736b Merge pull request #8691 from TacoTheDank/bumpFragment
Update AndroidX Fragment to 1.4.1
2022-08-02 10:54:52 +02:00
Stypox
ad30eb809c Merge branch 'dev' into bumpFragment 2022-08-02 10:54:39 +02:00
Stypox
ee368452ae Merge pull request #8687 from TacoTheDank/bumpExoPlayer
Update ExoPlayer to 2.18.1
2022-08-02 10:34:58 +02:00
Isira Seneviratne
a9095ca2ad Make block parameter an extension lambda. 2022-08-01 08:29:59 +05:30
Isira Seneviratne
013522c376 Convert LicenseFragmentHelper methods to top-level declarations. 2022-08-01 08:27:09 +05:30
Isira Seneviratne
947242d913 Update AppCompat to 1.4.2. 2022-08-01 08:26:07 +05:30
Isira Seneviratne
8a896114c1 Apply code review change. 2022-08-01 08:25:24 +05:30
Isira Seneviratne
47f58040d1 Make OnClickGesture an interface. 2022-08-01 06:47:00 +05:30
Stypox
35a118a2a7 Merge pull request #8683 from Isira-Seneviratne/Update_Lifecycle
Update Lifecycle to 2.5.1.
2022-07-31 09:49:36 +02:00
TacoTheDank
582032f372 Update AndroidX Room to 2.4.3 2022-07-31 00:14:23 -04:00
Isira Seneviratne
311d392386 Use Application instead of Context in FeedViewModel. 2022-07-31 08:37:16 +05:30
Stypox
404c13d4c1 Improve FeedViewModel factory 2022-07-31 08:30:17 +05:30
Isira Seneviratne
5c68c8ece8 Update Lifecycle to 2.5.1. 2022-07-31 08:30:17 +05:30
Isira Seneviratne
4d7a6fb6de Use WindowMetrics API in VideoDetailFragment and PopupPlayerUi. 2022-07-30 19:22:39 +05:30
Isira Seneviratne
630558ed4f Use nested functions. 2022-07-30 07:59:36 +05:30
Isira Seneviratne
69942003f7 Sort tags case-insensitively. 2022-07-29 09:21:48 +05:30
Isira Seneviratne
af9c2bd59d Use stackTraceToString(). 2022-07-27 07:54:49 +05:30
Mohammed Anas
81c4b822e0 Add "needs triage" label to issue templates (#8643)
This label would make it easier for issue triagers to know what they
haven't triaged yet.
2022-07-26 23:29:43 +03:00
Isira Seneviratne
81fb44c45c Remove uses of setBottomSheetCallback(). 2022-07-25 18:44:30 +05:30
TacoTheDank
d66997c2ed Update Google Material to 1.6.1 2022-07-24 16:51:26 -04:00
TacoTheDank
d7a654fc27 Update AndroidX Fragment to 1.4.1 2022-07-24 15:35:33 -04:00
TacoTheDank
229422bfa9 Update ExoPlayer to 2.18.1 2022-07-24 14:11:31 -04:00
TacoTheDank
baabba1dea Disable Jetifier 2022-07-24 15:07:31 +02:00
TacoTheDank
8f5d564f84 Migrate NoNonsense-FilePicker to our updated fork 2022-07-24 15:07:31 +02:00
litetex
dcb332e08d Merge pull request #8624 from TacoTheDank/bumpOkhttp
Update OkHttp to 4.10.0
2022-07-24 15:02:08 +02:00
litetex
51e72d1a05 Removed the "(beta)"-tag from services (#8637) 2022-07-24 15:57:23 +03:00
litetex
8f37015dbb Merge pull request #8621 from Stypox/deduplicate-feed
Deduplicate SQL queries to get feed streams
2022-07-24 14:52:35 +02:00
Stypox
74df7fcd66 Merge pull request #8670 from Isira-Seneviratne/Update_FocusAwareCoordinator
Remove deprecated method calls in FocusAwareCoordinator.
2022-07-23 17:12:29 +02:00
Stypox
bfaf074f4e Merge pull request #8663 from Isira-Seneviratne/Remove_unnecessary_methods
Remove unnecessary methods.
2022-07-23 16:31:28 +02:00
Stypox
3281ed2ef1 Merge pull request #8648 from Isira-Seneviratne/Use_IO_extensions
Use IO extensions.
2022-07-22 18:30:51 +02:00
Stypox
b2c2570a85 Merge pull request #8676 from Stypox/fix-channel-placeholders
Fix wrong thumbnail used as placeholder for channel
2022-07-22 18:16:42 +02:00
Stypox
abf185c691 Merge pull request #8679 from Stypox/fix-listhelpertest
Fix ListHelperTest failure caused by immutable list being used
2022-07-22 18:15:39 +02:00
Stypox
f4fe5fcb16 Fix ListHelperTest failure caused by immutable list being used 2022-07-22 16:09:43 +02:00
Stypox
37275e8fe3 Fix wrong thumbnail used as placeholder for channel 2022-07-22 15:13:47 +02:00
Isira Seneviratne
f1dab11f1f Remove deprecated method calls in FocusAwareCoordinator. 2022-07-21 09:01:19 +05:30
Isira Seneviratne
6d1c61407d Remove unnecessary method in ChannelFragment. 2022-07-21 08:02:23 +05:30
Isira Seneviratne
8b400b48f7 Refactor notifying method in PlayQueue. 2022-07-21 08:02:23 +05:30
Isira Seneviratne
b845645b80 Use IO extensions.
Co-authored-by: Stypox <stypox@pm.me>
2022-07-21 05:15:39 +05:30
Stypox
cacce6d2d0 Merge pull request #8651 from Isira-Seneviratne/Use_limiting_methods
Use range-limiting methods.
2022-07-20 15:06:45 +02:00
Stypox
373ee53143 Improve code style 2022-07-20 15:05:25 +02:00
Stypox
344c33d9a1 Merge pull request #8631 from Isira-Seneviratne/Use_collection_factories
Use Java 9 collection factories.
2022-07-20 14:52:18 +02:00
Stypox
c5b970cca3 Improve code style in List.of() 2022-07-20 14:50:23 +02:00
Stypox
15947161e6 Merge pull request #8635 from Isira-Seneviratne/Use_stream_sort
Use stream sorting.
2022-07-20 11:06:56 +02:00
Isira Seneviratne
394eb92e71 Use coerceIn(). 2022-07-20 05:36:01 +05:30
Isira Seneviratne
d62cdc659f Use MathUtils.clamp().
Co-authored-by: Stypox <stypox@pm.me>
2022-07-20 05:36:01 +05:30
Isira Seneviratne
a6cc13845a Use Map.of(). 2022-07-20 04:39:11 +05:30
Isira Seneviratne
55a995c4cd Replace LinkedHashMap with List.of(). 2022-07-20 04:39:11 +05:30
Isira Seneviratne
ca26fcb0eb Use List.of(). 2022-07-20 04:39:11 +05:30
Stypox
4eddd2c3d1 Fix random NullPointerException when adding video player view 2022-07-19 20:01:46 +02:00
Isira Seneviratne
c53143ef4f Use Set.of(). 2022-07-19 08:53:15 +05:30
Isira Seneviratne
e772244440 Update app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java
Co-authored-by: Stypox <stypox@pm.me>
2022-07-19 05:13:38 +05:30
Stypox
ae369ec9ba Merge pull request #8475 from TacoTheDank/bumpMiscLibraries
Update some misc libraries
2022-07-18 23:56:41 +02:00
Stypox
e8669d4ab5 Deduplicate SQL queries to get feed streams 2022-07-18 23:39:57 +02:00
Stypox
cd14096dbe Merge pull request #8633 from Isira-Seneviratne/Use_ViewCompat_setBackgroundTintList
Use ViewCompat.setBackgroundTintList().
2022-07-18 23:31:56 +02:00
Stypox
d9ff114e1a Merge pull request #8601 from litetex/checkstyle-assign-on-same-line
Checkstyle assign on same line
2022-07-18 16:39:02 +02:00
Mohammed Anas
a1c6f0073e Rename "waiting-for-author" label to "waiting for author" (#8642) 2022-07-17 20:37:15 +03:00
Isira Seneviratne
f1de353b74 Use stream sorting. 2022-07-16 08:34:04 +05:30
Isira Seneviratne
5da8d5fc73 Use ViewCompat.setBackgroundTintList(). 2022-07-16 05:49:52 +05:30
litetex
3ba04f179f Fixed conflicts/build 2022-07-15 20:00:08 +02:00
litetex
3890d0abdb Added note that explains that unused code was removed. 2022-07-15 19:55:19 +02:00
litetex
8b209df253 Changed the code accordingly
+ Removed some unused code
2022-07-15 19:55:19 +02:00
litetex
25a43b57b2 Updated checkstyle
So that the assign operators are used on the same branch
2022-07-15 19:54:32 +02:00
litetex
b7a44560f5 Merge pull request #8170 from Stypox/player-refactor
Refactor player and extract UI components
2022-07-15 19:41:23 +02:00
Stypox
0e8cc72b13 Fix random NullPointerException when adding video player view 2022-07-14 22:14:03 +02:00
Stypox
33e20766c9 Merge pull request #8530 from krlvm/improve_placeholder_images
Improve image placeholders
2022-07-14 15:55:36 +02:00
Stypox
9f993e0c49 Make video and playlist placeholder thumbnails 16:9
After making the playlist and video thumbnails' scaleType fitCenter, the 24dp*24dp thumbnails would appear as a square, which would be strange, since the image view is 16:9.
2022-07-14 14:47:54 +02:00
Stypox
6ea85e6380 Rename dummy_* and more to placeholder_* 2022-07-14 14:27:33 +02:00
Stypox
4d58026d06 Improve placeholder thumbnail SVGs and remove theme customization
Theme customization does not seem to work well with Picasso: square/picasso#1275
2022-07-14 14:14:33 +02:00
Stypox
7b9b9218dc Remove bottom-sheet-thumbnail placeholder, clear the image instead 2022-07-14 14:14:33 +02:00
krlvm
dff1adb1ad Fix swapped colors in video and playlist thumbnails 2022-07-14 14:14:32 +02:00
krlvm
35eeccd45a Rename buddy.xml to dummy_person.xml 2022-07-14 14:14:32 +02:00
krlvm
429f2536af Optimize thumbnail placeholder drawables 2022-07-14 14:14:32 +02:00
krlvm
7b41acb781 Use corresponding material icon in user profile thumbnail 2022-07-14 14:14:32 +02:00
krlvm
cc7a8fb1a6 Improve image placeholders
- Show placeholders until the image is loaded because timeout can be very long and missing profile pictures and video thumbnails make app inconvenient to use

- Adapt profile picture and video thumbnail placeholders to light theme

- Replace profile picture and video thumbnail placeholders with vector graphics
2022-07-14 14:14:32 +02:00
TacoTheDank
c1e78cf55b Update OkHttp to 4.x 2022-07-14 03:23:45 -04:00
TacoTheDank
4536e8b55b Update some miscellaneous libraries 2022-07-14 01:48:52 -04:00
Stypox
70e3c9805a Merge pull request #8542 from carmebar/share-playlist
Add 'Share playlist' option to Playlist fragment
2022-07-13 23:45:08 +02:00
Stypox
8187a3bc04 Move PlayerType into its own class and add documentation
Also replace some `isPlayerOpen` with direct `playerType == null` checks.
2022-07-13 23:33:18 +02:00
Stypox
4443c908cb Fix SonarLint java:S5320, restrict broadcasts to app package 2022-07-13 23:33:18 +02:00
Stypox
c03eac1dc9 Some SonarLint refactors 2022-07-13 23:33:18 +02:00
Stypox
61c1da144e Some refactorings after review comments 2022-07-13 23:33:18 +02:00
Stypox
3692858a3d Move popup layout param to PopupPlayerUi 2022-07-13 23:33:18 +02:00
Stypox
9c51fc3ade Move functions to get Android dimen to ThemeHelper 2022-07-13 23:33:18 +02:00
Stypox
1cf746f721 Fix volume gestures not working anymore 2022-07-13 23:33:18 +02:00
Stypox
4979f84e41 Solve some Sonarlint warnings 2022-07-13 23:33:16 +02:00
Stypox
a19073ec01 Restore checkstyle and solve its errors 2022-07-13 23:32:27 +02:00
Stypox
1b39b5376f Add some javadocs; move preparing player uis to PlayerUiList 2022-07-13 23:31:59 +02:00
Stypox
6559416bd8 Improve //region comments in player UIs 2022-07-13 23:30:30 +02:00
Stypox
fa25ecf521 Add comment about broadcast receiver 2022-07-13 23:27:24 +02:00
Stypox
6fb0256997 Remove unused PlayerServiceBinder 2022-07-13 23:27:24 +02:00
Stypox
8c26403e91 Remove unused PlayerState 2022-07-13 23:27:24 +02:00
Stypox
90a89f8ca5 Move player-notification files into their package 2022-07-13 23:27:24 +02:00
Stypox
0bba1d95de Move all notification-related calls to NotificationPlayerUi 2022-07-13 23:27:24 +02:00
Stypox
b3f99645a3 Fix some crashes / issues after player refactor 2022-07-13 23:27:23 +02:00
Stypox
76ced59b62 Refactor player: separate UIs and more 2022-07-13 23:25:26 +02:00
Stypox
bc3731265e Merge pull request #7613 from litetex/increase-minsdk
Bump minSdk to 21 - Android 5 / Lollipop
2022-07-13 19:09:05 +02:00
TacoTheDank
189c92affa More minSdk 21 cleanup 2022-07-13 19:03:47 +02:00
TacoTheDank
4ec9cbe379 Remove AndroidX Webkit 2022-07-13 19:03:47 +02:00
litetex
9648525ac1 Clean up pre-Lollipop theming 2022-07-13 19:03:47 +02:00
litetex
b125780991 Clean up pre-Lollipop compat attributes 2022-07-13 19:03:45 +02:00
litetex
99104fc11d Clean up pre-Lollipop checks 2022-07-13 19:02:24 +02:00
litetex
7cb137ae8d Remove MultiDex 2022-07-13 19:02:24 +02:00
litetex
e55e79bcca Bump minSdk to 21 (Android 5 / Lollipop) 2022-07-13 19:02:23 +02:00
Stypox
0b644fd794 Merge pull request #8569 from mhmdanas/add-workflow-permissions
Use minimum required permissions for GitHub workflows
2022-07-13 18:56:10 +02:00
Stypox
d5599ebfa3 Merge pull request #8573 from Stypox/better-thumbnails
Make thumbnails' `scaleType` `fitCenter`
2022-07-13 18:33:19 +02:00
Taco
f7d8781bac Specify used ExoPlayer libraries (#8469) 2022-07-13 17:57:14 +02:00
Alex
6f7298b9db Crop the notification thumbnail in 1:1 mode instead of stretching it (#8533)
Change square bitmap transformation strategy: change the bitmap transformation strategy when a 1:1 aspect ratio is
enabled to not stretch the bitmap but rather crop it.

On Android 11/12, the way the whole thumbnail was used for the
notification icon was not ideal, however the setting to toggle a 1:1
(as it states in settings) resulted in distortions.

Fix this by simply cropping the bitmap.

Also update the 1:1 mode strings to remove mentions of scaling or
distortions, as those no longer apply.
2022-07-13 17:19:44 +02:00
Carlos Melero
d0b6d95f1b Add Share option to local playlists
A newline-separated text is shared
2022-07-13 14:32:23 +02:00
Robin
93b913e14d Merge pull request #8536 from TacoTheDank/bumpExoPlayer
Update ExoPlayer to 2.18.0
2022-07-13 12:59:12 +02:00
Stypox
b96c8a0c2f Merge pull request #8545 from carmebar/hide-future-videos
Add option to hide future videos in feed
2022-07-13 11:07:38 +02:00
Stypox
a392a06cc0 Fix feed menu items order in category to leave space for search
The search menu item gets added in first place when the feed fragment is added as a tab to the main fragment. So the main fragment's menu items' orderInCategory should start from 2.
2022-07-13 11:04:40 +02:00
Stypox
d9af788514 Merge pull request #8397 from notaLonelyDay/add-download-to-longpress-menu
Add download to longpress menu
2022-07-06 11:47:50 +02:00
nikita.artikhovich
a4724fec4a Add download option to long-press menu 2022-07-06 11:42:57 +02:00
Stypox
0e5580390f Merge pull request #8468 from TacoTheDank/cleanProguard
Clean up proguard file
2022-07-06 11:18:03 +02:00
Stypox
acc34cb618 Merge pull request #8549 from chr56/langcode_zh-rCN
[Localization] Fix lang code for Chinese Simplified (again!)
2022-07-05 23:03:31 +02:00
chr_56
d033a6e40d Fix lang code 2/2: rename b+zh+HANS+CN to zh-rCN 2022-07-05 22:55:29 +02:00
chr_56
4fd8294b09 Fix lang code 1/2: remove localization zh-rCN 2022-07-05 22:55:29 +02:00
Hosted Weblate
8d26d9da46 Translated using Weblate (Greek)
Currently translated at 100.0% (640 of 640 strings)

Co-authored-by: Agnieszka C <aga_04@o2.pl>
Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Co-authored-by: Andrij Mizyk <andmiz@proton.me>
Co-authored-by: D āvis <dlektauers@gmail.com>
Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Co-authored-by: David Braz <davidbrazps2@gmail.com>
Co-authored-by: Davit Mayilyan <davit.mayilyan@protonmail.ch>
Co-authored-by: Eric <alchemillatruth@purelymail.com>
Co-authored-by: Erik J <ej_rostock@web.de>
Co-authored-by: Giovanni Donisi <giovannidonisi0701@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
Co-authored-by: Julie WF <julie-99@live.no>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Nizami <nizamismidov4@gmail.com>
Co-authored-by: Priit Jõerüüt <hwlate@joeruut.com>
Co-authored-by: Ray <ray.cfu@protonmail.com>
Co-authored-by: ReVanced <revanced2022@gmail.com>
Co-authored-by: Retrial <giwrgosmant@gmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: S3aBreeze <paperwork@evilcorp.ltd>
Co-authored-by: SC <lalocas@protonmail.com>
Co-authored-by: SameenAhnaf <sameenahnaf@yahoo.com>
Co-authored-by: Stypox <stypox@pm.me>
Co-authored-by: Translator <kvb@tuta.io>
Co-authored-by: Vasilis K <skyhirules@gmail.com>
Co-authored-by: VfBFan <drop0815@posteo.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Co-authored-by: Yeldar Kudaibergenov <mail@yeldar.org>
Co-authored-by: chr56 <chr0056@gmail.com>
Co-authored-by: nautilusx <translate@disroot.org>
Co-authored-by: patrik <jpekman@gmail.com>
Co-authored-by: pjammo <adrianoghr@hotmail.it>
Co-authored-by: riveravaldez <riveravaldezmail@gmail.com>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: zica <9918800@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/az/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bn/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/kk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/
Translation: NewPipe/Metadata
2022-07-05 22:53:06 +02:00
Stypox
d81607c9d5 Merge branch 'master' into dev 2022-07-05 16:10:27 +02:00
Stypox
81369d7e04 Merge pull request #8531 from litetex/fix-extractor-compile-errors-846
Updated extractor to latest revision and fix compile errors
2022-07-04 23:16:55 +02:00
Stypox
70b20f90cd Align playlist thumbnail to left for more visibility 2022-07-04 22:37:27 +02:00
Stypox
47a2adca96 Make thumbnails' scaleType fitCenter
Otherwise e.g. shorts thumbnails would be cropped too much
2022-07-04 21:43:31 +02:00
mhmdanas
a1f1acfbf9 Use minimum required permissions for GitHub workflows
This reduces the attack surface if the workflows are ever compromised.
2022-07-03 20:38:51 +03:00
TacoTheDank
00b9c082a3 Set setUsePlatformDiagnostics to false 2022-07-02 15:01:39 -04:00
Stypox
45d2492bcb Run CI on all release branches (#8565)
We don't seem to agree on which character to use as a separator between `release` and `X.X.X` in release branch names (e.g. `release-0.23.1` or `release/0.23.0`). All those names start with `release`, though, so let's use that to identify releases.
2022-07-02 00:08:44 +03:00
TacoTheDank
1404581e9b Update ExoPlayer to 2.18.0 2022-06-25 21:14:42 -04:00
opusforlife2
d5985be94a Made some much needed changes to the ReadMe (#8372)
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
Co-authored-by: Poolitzer <github@poolitzer.eu>
2022-06-26 01:13:54 +03:00
Carlos Melero
f22417e7e7 Add option to hide future videos in feed 2022-06-24 18:03:48 +02:00
litetex
ad97b3d995 Use correct `NonNull` 2022-06-22 19:54:46 +02:00
litetex
04e8e03d8f Fix compile errors 2022-06-22 19:47:03 +02:00
litetex
bd19013771 Updated extractor to latest revision 2022-06-22 19:47:02 +02:00
TacoTheDank
24cf19710f Clean up proguard file 2022-06-09 11:34:57 -04:00
468 changed files with 9884 additions and 8929 deletions

View File

@@ -1,6 +1,6 @@
name: Bug report
description: Create a bug report to help us improve
labels: [bug]
labels: [bug, needs triage]
body:
- type: markdown
attributes:
@@ -18,6 +18,8 @@ body:
required: true
- label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
required: true
- label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my problem isn't listed."
required: true
- label: "I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise."
required: true
- label: "This issue contains only one bug."
@@ -40,7 +42,7 @@ body:
label: Steps to reproduce the bug
description: |
What did you do for the bug to show up?
If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug.
placeholder: |
1. Go to '...'
@@ -69,11 +71,11 @@ body:
label: Screenshots/Screen recordings
description: |
A picture or video is worth a thousand words.
If applicable, add screenshots or a screen recording to help explain your problem.
GitHub supports uploading them directly in the text box.
If your file is too big for Github to accept, try to compress it (ZIP-file) or feel free to paste a link to an image/video hoster here instead.
:heavy_exclamation_mark: DON'T POST SCREENSHOTS OF THE ERROR PAGE.
Instead, follow the instructions in the "Logs" section below.

View File

@@ -1,6 +1,6 @@
name: Feature request
description: Suggest an idea for this project
labels: [enhancement]
labels: [enhancement, needs triage]
body:
- type: markdown
attributes:
@@ -8,7 +8,6 @@ body:
Thank you for helping to make NewPipe better by suggesting a feature. :hugs:
Your ideas are highly welcome! The app is made for you, the users, after all.
- type: checkboxes
id: checklist
attributes:
@@ -16,6 +15,8 @@ body:
options:
- label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
required: true
- label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my problem isn't listed."
required: true
- label: "I'm aware that this is a request for NewPipe itself and that requests for adding a new service need to be made at [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor/issues)."
required: true
- label: "I have taken the time to fill in all the required details. I understand that the feature request will be dismissed otherwise."
@@ -43,7 +44,7 @@ body:
Describe any problem or limitation you come across while using the app which would be solved by this feature.
validations:
required: true
- type: textarea
id: additional-information
attributes:

View File

@@ -1,6 +1,6 @@
name: Question
description: Ask about anything NewPipe-related
labels: [question]
labels: [question, needs triage]
body:
- type: markdown
attributes:
@@ -16,6 +16,8 @@ body:
options:
- label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
required: true
- label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my question isn't listed."
required: true
- label: "I have taken the time to fill in all the required details. I understand that the question will be dismissed otherwise."
required: true
- label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
@@ -27,7 +29,7 @@ body:
label: What is/are your question(s)?
validations:
required: true
- type: textarea
id: additional-information
attributes:

View File

@@ -25,7 +25,7 @@
<!-- Delete this if it doesn't apply to your PR. -->
-
#### APK testing
#### APK testing
<!-- Use a new, meaningfully named branch. The name is used as a suffix for the app ID to allow installing and testing multiple versions of NewPipe, e.g. "commentfix", if your PR implements a bugfix for comments. (No names like "patch-0" and "feature-1".) -->
<!-- Remove the following line if you directly link the APK created by the CI pipeline. Directly linking is preferred if you need to let users test.-->
The APK can be found by going to the "Checks" tab below the title. On the left pane, click on "CI", scroll down to "artifacts" and click "app" to download the zip file which contains the debug APK of this PR.

View File

@@ -6,7 +6,7 @@ on:
branches:
- dev
- master
- release/**
- release**
paths-ignore:
- 'README.md'
- 'doc/**'
@@ -31,6 +31,10 @@ on:
jobs:
build-and-test-jvm:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v3
- uses: gradle/wrapper-validation-action@v1
@@ -64,6 +68,10 @@ jobs:
matrix:
# api-level 19 is min sdk, but throws errors related to desugaring
api-level: [ 21, 29 ]
permissions:
contents: read
steps:
- uses: actions/checkout@v3
@@ -81,7 +89,7 @@ jobs:
# workaround to emulator bug: https://github.com/ReactiveCircus/android-emulator-runner/issues/160
emulator-build: 7425822
script: ./gradlew connectedCheck --stacktrace
- name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553
uses: actions/upload-artifact@v3
if: failure()
@@ -91,6 +99,10 @@ jobs:
sonar:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v3
with:

View File

@@ -6,6 +6,10 @@ on:
issues:
types: [opened, edited]
permissions:
issues: write
pull-requests: write
jobs:
try-minimize:
runs-on: ubuntu-latest

View File

@@ -9,6 +9,10 @@ on:
# Run daily at midnight.
- cron: '0 0 * * *'
permissions:
issues: write
pull-requests: write
jobs:
noResponse:
runs-on: ubuntu-latest
@@ -17,4 +21,4 @@ jobs:
with:
token: ${{ github.token }}
daysUntilClose: 14
responseRequiredLabel: waiting-for-author
responseRequiredLabel: waiting for author

124
README.md

File diff suppressed because one or more lines are too long

View File

@@ -14,15 +14,12 @@ android {
defaultConfig {
applicationId "org.schabi.newpipe"
resValue "string", "app_name", "NewPipe"
minSdk 19
minSdk 21
targetSdk 29
versionCode 988
versionName "0.23.2"
multiDexEnabled true
versionCode 990
versionName "0.24.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
javaCompileOptions {
annotationProcessorOptions {
@@ -98,14 +95,14 @@ android {
}
ext {
checkstyleVersion = '10.0'
checkstyleVersion = '10.3.1'
androidxLifecycleVersion = '2.3.1'
androidxRoomVersion = '2.4.2'
androidxLifecycleVersion = '2.5.1'
androidxRoomVersion = '2.4.3'
androidxWorkVersion = '2.7.1'
icepickVersion = '3.2.0'
exoPlayerVersion = '2.17.1'
exoPlayerVersion = '2.18.1'
googleAutoServiceVersion = '1.0.1'
groupieVersion = '2.10.1'
markwonVersion = '4.6.2'
@@ -113,7 +110,7 @@ ext {
leakCanaryVersion = '2.5'
stethoVersion = '1.6.0'
mockitoVersion = '4.0.0'
assertJVersion = '3.22.0'
assertJVersion = '3.23.1'
}
configurations {
@@ -182,7 +179,7 @@ sonarqube {
dependencies {
/** Desugaring **/
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6'
/** NewPipe libraries **/
// You can use a local version by uncommenting a few lines in settings.gradle
@@ -190,27 +187,27 @@ dependencies {
// name and the commit hash with the commit hash of the (pushed) commit you want to test
// This works thanks to JitPack: https://jitpack.io/
implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:76aad92fa54524f20c3338ab568c9cd6b50c9d33'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:5c710da160f488bb40ab2cf4469bec9bd4cefd38'
implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0'
/** Checkstyle **/
checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}"
ktlint 'com.pinterest:ktlint:0.44.0'
ktlint 'com.pinterest:ktlint:0.45.2'
/** Kotlin **/
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlin_version}"
/** AndroidX **/
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'androidx.fragment:fragment-ktx:1.3.6'
implementation "androidx.lifecycle:lifecycle-livedata:${androidxLifecycleVersion}"
implementation "androidx.lifecycle:lifecycle-viewmodel:${androidxLifecycleVersion}"
implementation 'androidx.fragment:fragment-ktx:1.4.1'
implementation "androidx.lifecycle:lifecycle-livedata-ktx:${androidxLifecycleVersion}"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${androidxLifecycleVersion}"
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'
implementation 'androidx.media:media:1.5.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.media:media:1.6.0'
implementation 'androidx.preference:preference:1.2.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation "androidx.room:room-runtime:${androidxRoomVersion}"
@@ -220,10 +217,9 @@ dependencies {
// Newer version specified to prevent accessibility regressions with RecyclerView, see:
// https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01
implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01'
implementation 'androidx.webkit:webkit:1.4.0'
implementation "androidx.work:work-runtime-ktx:${androidxWorkVersion}"
implementation "androidx.work:work-rxjava3:${androidxWorkVersion}"
implementation 'com.google.android.material:material:1.5.0'
implementation 'com.google.android.material:material:1.6.1'
/** Third-party libraries **/
// Instance state boilerplate elimination
@@ -231,14 +227,19 @@ dependencies {
kapt "frankiesardo:icepick-processor:${icepickVersion}"
// HTML parser
implementation "org.jsoup:jsoup:1.14.3"
implementation "org.jsoup:jsoup:1.15.3"
// HTTP client
//noinspection GradleDependency --> do not update okhttp to keep supporting Android 4.4 users
implementation "com.squareup.okhttp3:okhttp:3.12.13"
implementation "com.squareup.okhttp3:okhttp:4.10.0"
// Media player
implementation "com.google.android.exoplayer:exoplayer:${exoPlayerVersion}"
implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerVersion}"
implementation "com.google.android.exoplayer:exoplayer-dash:${exoPlayerVersion}"
implementation "com.google.android.exoplayer:exoplayer-database:${exoPlayerVersion}"
implementation "com.google.android.exoplayer:exoplayer-datasource:${exoPlayerVersion}"
implementation "com.google.android.exoplayer:exoplayer-hls:${exoPlayerVersion}"
implementation "com.google.android.exoplayer:exoplayer-smoothstreaming:${exoPlayerVersion}"
implementation "com.google.android.exoplayer:exoplayer-ui:${exoPlayerVersion}"
implementation "com.google.android.exoplayer:extension-mediasession:${exoPlayerVersion}"
// Metadata generator for service descriptors
@@ -257,9 +258,6 @@ dependencies {
implementation "io.noties.markwon:core:${markwonVersion}"
implementation "io.noties.markwon:linkify:${markwonVersion}"
// File picker
implementation "com.nononsenseapps:filepicker:4.2.1"
// Crash reporting
implementation "ch.acra:acra-core:5.9.3"
@@ -273,7 +271,7 @@ dependencies {
implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0"
// Date and time formatting
implementation "org.ocpsoft.prettytime:prettytime:5.0.2.Final"
implementation "org.ocpsoft.prettytime:prettytime:5.0.3.Final"
/** Debugging **/
// Memory leak detection

View File

@@ -18,7 +18,6 @@
-dontobfuscate
-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }
-keep class org.ocpsoft.prettytime.i18n.** { *; }
-keep class org.mozilla.javascript.** { *; }
@@ -26,9 +25,6 @@
-keep class com.google.android.exoplayer2.** { *; }
-dontwarn org.mozilla.javascript.tools.**
-dontwarn android.arch.util.paging.CountedDataSource
-dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource
# Rules for icepick. Copy paste from https://github.com/frankiesardo/icepick
-dontwarn icepick.**
@@ -39,12 +35,11 @@
}
-keepnames class * { @icepick.State *;}
# Rules for OkHttp. Copy paste from https://github.com/square/okhttp
## Rules for OkHttp. Copy paste from https://github.com/square/okhttp
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
##
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
!static !transient <fields>;

View File

@@ -44,7 +44,7 @@
</receiver>
<service
android:name=".player.MainPlayer"
android:name=".player.PlayerService"
android:exported="false"
android:foregroundServiceType="mediaPlayback">
<intent-filter>

View File

@@ -282,11 +282,9 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt
@Nullable
public Parcelable saveState() {
Bundle state = null;
if (mSavedState.size() > 0) {
if (!mSavedState.isEmpty()) {
state = new Bundle();
final Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()];
mSavedState.toArray(fss);
state.putParcelableArray("states", fss);
state.putParcelableArray("states", mSavedState.toArray(new Fragment.SavedState[0]));
}
for (int i = 0; i < mFragments.size(); i++) {
final Fragment f = mFragments.get(i);

View File

@@ -14,7 +14,6 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout;
import org.schabi.newpipe.R;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
// See https://stackoverflow.com/questions/56849221#57997489
@@ -27,7 +26,7 @@ public final class FlingBehavior extends AppBarLayout.Behavior {
private boolean allowScroll = true;
private final Rect globalRect = new Rect();
private final List<Integer> skipInterceptionOfElements = Arrays.asList(
private final List<Integer> skipInterceptionOfElements = List.of(
R.id.itemsListPanel, R.id.playbackSeekBar,
R.id.playPauseButton, R.id.playPreviousButton, R.id.playNextButton);
@@ -67,7 +66,7 @@ public final class FlingBehavior extends AppBarLayout.Behavior {
public boolean onInterceptTouchEvent(@NonNull final CoordinatorLayout parent,
@NonNull final AppBarLayout child,
@NonNull final MotionEvent ev) {
for (final Integer element : skipInterceptionOfElements) {
for (final int element : skipInterceptionOfElements) {
final View view = child.findViewById(element);
if (view != null) {
final boolean visible = view.getGlobalVisibleRect(globalRect);
@@ -132,8 +131,8 @@ public final class FlingBehavior extends AppBarLayout.Behavior {
try {
final Class<?> headerBehaviorType = this.getClass().getSuperclass().getSuperclass();
if (headerBehaviorType != null) {
final Field field
= headerBehaviorType.getDeclaredField("lastNestedScrollingChildRef");
final Field field =
headerBehaviorType.getDeclaredField("lastNestedScrollingChildRef");
field.setAccessible(true);
return field;
}

View File

@@ -1,5 +1,6 @@
package org.schabi.newpipe;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
@@ -7,7 +8,6 @@ import android.util.Log;
import androidx.annotation.NonNull;
import androidx.core.app.NotificationChannelCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.multidex.MultiDexApplication;
import androidx.preference.PreferenceManager;
import com.jakewharton.processphoenix.ProcessPhoenix;
@@ -27,9 +27,8 @@ import org.schabi.newpipe.util.StateSaver;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import io.reactivex.rxjava3.exceptions.CompositeException;
import io.reactivex.rxjava3.exceptions.MissingBackpressureException;
@@ -56,7 +55,7 @@ import io.reactivex.rxjava3.plugins.RxJavaPlugins;
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
*/
public class App extends MultiDexApplication {
public class App extends Application {
public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID;
private static final String TAG = App.class.toString();
private static App app;
@@ -140,7 +139,7 @@ public class App extends MultiDexApplication {
if (throwable instanceof UndeliverableException) {
// As UndeliverableException is a wrapper,
// get the cause of it to get the "real" exception
actualThrowable = throwable.getCause();
actualThrowable = Objects.requireNonNull(throwable.getCause());
} else {
actualThrowable = throwable;
}
@@ -149,7 +148,7 @@ public class App extends MultiDexApplication {
if (actualThrowable instanceof CompositeException) {
errors = ((CompositeException) actualThrowable).getExceptions();
} else {
errors = Collections.singletonList(actualThrowable);
errors = List.of(actualThrowable);
}
for (final Throwable error : errors) {
@@ -213,41 +212,37 @@ public class App extends MultiDexApplication {
private void initNotificationChannels() {
// Keep the importance below DEFAULT to avoid making noise on every notification update for
// the main and update channels
final List<NotificationChannelCompat> notificationChannelCompats = new ArrayList<>();
notificationChannelCompats.add(new NotificationChannelCompat
.Builder(getString(R.string.notification_channel_id),
final List<NotificationChannelCompat> notificationChannelCompats = List.of(
new NotificationChannelCompat.Builder(getString(R.string.notification_channel_id),
NotificationManagerCompat.IMPORTANCE_LOW)
.setName(getString(R.string.notification_channel_name))
.setDescription(getString(R.string.notification_channel_description))
.build());
notificationChannelCompats.add(new NotificationChannelCompat
.Builder(getString(R.string.app_update_notification_channel_id),
.setName(getString(R.string.notification_channel_name))
.setDescription(getString(R.string.notification_channel_description))
.build(),
new NotificationChannelCompat
.Builder(getString(R.string.app_update_notification_channel_id),
NotificationManagerCompat.IMPORTANCE_LOW)
.setName(getString(R.string.app_update_notification_channel_name))
.setDescription(getString(R.string.app_update_notification_channel_description))
.build());
notificationChannelCompats.add(new NotificationChannelCompat
.Builder(getString(R.string.hash_channel_id),
.setName(getString(R.string.app_update_notification_channel_name))
.setDescription(
getString(R.string.app_update_notification_channel_description))
.build(),
new NotificationChannelCompat.Builder(getString(R.string.hash_channel_id),
NotificationManagerCompat.IMPORTANCE_HIGH)
.setName(getString(R.string.hash_channel_name))
.setDescription(getString(R.string.hash_channel_description))
.build());
notificationChannelCompats.add(new NotificationChannelCompat
.Builder(getString(R.string.error_report_channel_id),
.setName(getString(R.string.hash_channel_name))
.setDescription(getString(R.string.hash_channel_description))
.build(),
new NotificationChannelCompat.Builder(getString(R.string.error_report_channel_id),
NotificationManagerCompat.IMPORTANCE_LOW)
.setName(getString(R.string.error_report_channel_name))
.setDescription(getString(R.string.error_report_channel_description))
.build());
notificationChannelCompats.add(new NotificationChannelCompat
.Builder(getString(R.string.streams_notification_channel_id),
NotificationManagerCompat.IMPORTANCE_DEFAULT)
.setName(getString(R.string.streams_notification_channel_name))
.setDescription(getString(R.string.streams_notification_channel_description))
.build());
.setName(getString(R.string.error_report_channel_name))
.setDescription(getString(R.string.error_report_channel_description))
.build(),
new NotificationChannelCompat
.Builder(getString(R.string.streams_notification_channel_id),
NotificationManagerCompat.IMPORTANCE_DEFAULT)
.setName(getString(R.string.streams_notification_channel_name))
.setDescription(
getString(R.string.streams_notification_channel_description))
.build()
);
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.createNotificationChannelsCompat(notificationChannelCompats);

View File

@@ -1,7 +1,6 @@
package org.schabi.newpipe;
import android.content.Context;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -12,40 +11,27 @@ import org.schabi.newpipe.extractor.downloader.Downloader;
import org.schabi.newpipe.extractor.downloader.Request;
import org.schabi.newpipe.extractor.downloader.Response;
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
import org.schabi.newpipe.util.CookieUtils;
import org.schabi.newpipe.util.InfoCache;
import org.schabi.newpipe.util.TLSSocketFactoryCompat;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import okhttp3.CipherSuite;
import okhttp3.ConnectionSpec;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import static org.schabi.newpipe.MainActivity.DEBUG;
public final class DownloaderImpl extends Downloader {
public static final String USER_AGENT
= "Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0";
public static final String YOUTUBE_RESTRICTED_MODE_COOKIE_KEY
= "youtube_restricted_mode_key";
public static final String USER_AGENT =
"Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0";
public static final String YOUTUBE_RESTRICTED_MODE_COOKIE_KEY =
"youtube_restricted_mode_key";
public static final String YOUTUBE_RESTRICTED_MODE_COOKIE = "PREF=f2=8000000";
public static final String YOUTUBE_DOMAIN = "youtube.com";
@@ -54,9 +40,6 @@ public final class DownloaderImpl extends Downloader {
private final OkHttpClient client;
private DownloaderImpl(final OkHttpClient.Builder builder) {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
enableModernTLS(builder);
}
this.client = builder
.readTimeout(30, TimeUnit.SECONDS)
// .cache(new Cache(new File(context.getExternalCacheDir(), "okhttp"),
@@ -81,69 +64,16 @@ public final class DownloaderImpl extends Downloader {
return instance;
}
/**
* Enable TLS 1.2 and 1.1 on Android Kitkat. This function is mostly taken
* from the documentation of OkHttpClient.Builder.sslSocketFactory(_,_).
* <p>
* If there is an error, the function will safely fall back to doing nothing
* and printing the error to the console.
* </p>
*
* @param builder The HTTPClient Builder on which TLS is enabled on (will be modified in-place)
*/
private static void enableModernTLS(final OkHttpClient.Builder builder) {
try {
// get the default TrustManager
final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
final TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:"
+ Arrays.toString(trustManagers));
}
final X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
// insert our own TLSSocketFactory
final SSLSocketFactory sslSocketFactory = TLSSocketFactoryCompat.getInstance();
builder.sslSocketFactory(sslSocketFactory, trustManager);
// This will try to enable all modern CipherSuites(+2 more)
// that are supported on the device.
// Necessary because some servers (e.g. Framatube.org)
// don't support the old cipher suites.
// https://github.com/square/okhttp/issues/4053#issuecomment-402579554
final List<CipherSuite> cipherSuites =
new ArrayList<>(ConnectionSpec.MODERN_TLS.cipherSuites());
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA);
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA);
final ConnectionSpec legacyTLS = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.cipherSuites(cipherSuites.toArray(new CipherSuite[0]))
.build();
builder.connectionSpecs(Arrays.asList(legacyTLS, ConnectionSpec.CLEARTEXT));
} catch (final KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
if (DEBUG) {
e.printStackTrace();
}
}
}
public String getCookies(final String url) {
final List<String> resultCookies = new ArrayList<>();
if (url.contains(YOUTUBE_DOMAIN)) {
final String youtubeCookie = getCookie(YOUTUBE_RESTRICTED_MODE_COOKIE_KEY);
if (youtubeCookie != null) {
resultCookies.add(youtubeCookie);
}
}
final String youtubeCookie = url.contains(YOUTUBE_DOMAIN)
? getCookie(YOUTUBE_RESTRICTED_MODE_COOKIE_KEY) : null;
// Recaptcha cookie is always added TODO: not sure if this is necessary
final String recaptchaCookie = getCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY);
if (recaptchaCookie != null) {
resultCookies.add(recaptchaCookie);
}
return CookieUtils.concatCookies(resultCookies);
return Stream.of(youtubeCookie, getCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY))
.filter(Objects::nonNull)
.flatMap(cookies -> Arrays.stream(cookies.split("; *")))
.distinct()
.collect(Collectors.joining("; "));
}
public String getCookie(final String key) {
@@ -203,7 +133,7 @@ public final class DownloaderImpl extends Downloader {
RequestBody requestBody = null;
if (dataToSend != null) {
requestBody = RequestBody.create(null, dataToSend);
requestBody = RequestBody.create(dataToSend);
}
final okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder()

View File

@@ -3,7 +3,6 @@ package org.schabi.newpipe;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import org.schabi.newpipe.util.NavigationHelper;
@@ -44,11 +43,7 @@ public class ExitActivity extends Activity {
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
} else {
finish();
}
finishAndRemoveTask();
NavigationHelper.restartApp(this);
}

View File

@@ -28,7 +28,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -86,7 +85,6 @@ import org.schabi.newpipe.util.PermissionHelper;
import org.schabi.newpipe.util.SerializedCache;
import org.schabi.newpipe.util.ServiceHelper;
import org.schabi.newpipe.util.StateSaver;
import org.schabi.newpipe.util.TLSSocketFactoryCompat;
import org.schabi.newpipe.util.ThemeHelper;
import org.schabi.newpipe.views.FocusOverlayView;
@@ -131,11 +129,6 @@ public class MainActivity extends AppCompatActivity {
+ "savedInstanceState = [" + savedInstanceState + "]");
}
// enable TLS1.1/1.2 for kitkat devices, to fix download and play for media.ccc.de sources
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
TLSSocketFactoryCompat.setAsDefault();
}
ThemeHelper.setDayNightMode(this);
ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this));
@@ -381,8 +374,7 @@ public class MainActivity extends AppCompatActivity {
private void showServices() {
for (final StreamingService s : NewPipe.getServices()) {
final String title = s.getServiceInfo().getName()
+ (ServiceHelper.isBeta(s) ? " (beta)" : "");
final String title = s.getServiceInfo().getName();
final MenuItem menuItem = drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_services_group, s.getServiceId(), ORDER, title)
@@ -390,7 +382,7 @@ public class MainActivity extends AppCompatActivity {
// peertube specifics
if (s.getServiceId() == 3) {
enhancePeertubeMenu(s, menuItem);
enhancePeertubeMenu(menuItem);
}
}
drawerLayoutBinding.navigation.getMenu()
@@ -398,9 +390,9 @@ public class MainActivity extends AppCompatActivity {
.setChecked(true);
}
private void enhancePeertubeMenu(final StreamingService s, final MenuItem menuItem) {
private void enhancePeertubeMenu(final MenuItem menuItem) {
final PeertubeInstance currentInstance = PeertubeHelper.getCurrentInstance();
menuItem.setTitle(currentInstance.getName() + (ServiceHelper.isBeta(s) ? " (beta)" : ""));
menuItem.setTitle(currentInstance.getName());
final Spinner spinner = InstanceSpinnerLayoutBinding.inflate(LayoutInflater.from(this))
.getRoot();
final List<PeertubeInstance> instances = PeertubeHelper.getInstanceList(this);
@@ -480,8 +472,8 @@ public class MainActivity extends AppCompatActivity {
ErrorUtil.showUiErrorSnackbar(this, "Setting up service toggle", e);
}
final SharedPreferences sharedPreferences
= PreferenceManager.getDefaultSharedPreferences(this);
final SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(this);
if (sharedPreferences.getBoolean(Constants.KEY_THEME_CHANGE, false)) {
if (DEBUG) {
Log.d(TAG, "Theme has changed, recreating activity...");
@@ -653,8 +645,8 @@ public class MainActivity extends AppCompatActivity {
}
super.onCreateOptionsMenu(menu);
final Fragment fragment
= getSupportFragmentManager().findFragmentById(R.id.fragment_holder);
final Fragment fragment =
getSupportFragmentManager().findFragmentById(R.id.fragment_holder);
if (!(fragment instanceof SearchFragment)) {
toolbarLayoutBinding.toolbarSearchContainer.getRoot().setVisibility(View.GONE);
}

View File

@@ -3,7 +3,6 @@ package org.schabi.newpipe;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
/*
@@ -40,10 +39,6 @@ public class PanicResponderActivity extends Activity {
ExitActivity.exitAndRemoveFromRecentApps(this);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
} else {
finish();
}
finishAndRemoveTask();
}
}

View File

@@ -16,7 +16,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueueItem;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.SparseItemUtil;
import java.util.Collections;
import java.util.List;
public final class QueueItemMenuUtil {
private QueueItemMenuUtil() {
@@ -53,7 +53,7 @@ public final class QueueItemMenuUtil {
case R.id.menu_item_append_playlist:
PlaylistDialog.createCorrespondingDialog(
context,
Collections.singletonList(new StreamEntity(item)),
List.of(new StreamEntity(item)),
dialog -> dialog.show(
fragmentManager,
"QueueItemMenuUtil@append_playlist"

View File

@@ -30,6 +30,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.app.NotificationCompat;
import androidx.core.app.ServiceCompat;
import androidx.core.math.MathUtils;
import androidx.fragment.app.FragmentManager;
import androidx.preference.PreferenceManager;
@@ -60,7 +61,7 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.ktx.ExceptionUtils;
import org.schabi.newpipe.local.dialog.PlaylistDialog;
import org.schabi.newpipe.player.MainPlayer;
import org.schabi.newpipe.player.PlayerType;
import org.schabi.newpipe.player.helper.PlayerHelper;
import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.ChannelPlayQueue;
@@ -81,7 +82,6 @@ import org.schabi.newpipe.views.FocusOverlayView;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import icepick.Icepick;
@@ -452,7 +452,7 @@ public class RouterActivity extends AppCompatActivity {
}
}
selectedRadioPosition = Math.min(Math.max(-1, selectedRadioPosition), choices.size() - 1);
selectedRadioPosition = MathUtils.clamp(selectedRadioPosition, -1, choices.size() - 1);
if (selectedRadioPosition != -1) {
((RadioButton) radioGroup.getChildAt(selectedRadioPosition)).setChecked(true);
}
@@ -630,8 +630,8 @@ public class RouterActivity extends AppCompatActivity {
}
// ...the player is not running or in normal Video-mode/type
final MainPlayer.PlayerType playerType = PlayerHolder.getInstance().getType();
return playerType == null || playerType == MainPlayer.PlayerType.VIDEO;
final PlayerType playerType = PlayerHolder.getInstance().getType();
return playerType == null || playerType == PlayerType.MAIN;
}
private void openAddToPlaylistDialog() {
@@ -649,7 +649,7 @@ public class RouterActivity extends AppCompatActivity {
.subscribe(
info -> PlaylistDialog.createCorrespondingDialog(
getThemeWrapperContext(),
Collections.singletonList(new StreamEntity(info)),
List.of(new StreamEntity(info)),
playlistDialog -> {
playlistDialog.setOnDismissListener(dialog -> finish());

View File

@@ -8,7 +8,6 @@ import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import io.reactivex.rxjava3.disposables.CompositeDisposable
import org.schabi.newpipe.R
import org.schabi.newpipe.about.LicenseFragmentHelper.showLicense
import org.schabi.newpipe.databinding.FragmentLicensesBinding
import org.schabi.newpipe.databinding.ItemSoftwareComponentBinding

View File

@@ -12,126 +12,92 @@ import org.schabi.newpipe.R
import org.schabi.newpipe.util.Localization
import org.schabi.newpipe.util.ThemeHelper
import org.schabi.newpipe.util.external_communication.ShareUtils
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
import java.nio.charset.StandardCharsets
object LicenseFragmentHelper {
/**
* @param context the context to use
* @param license the license
* @return String which contains a HTML formatted license page
* styled according to the context's theme
*/
private fun getFormattedLicense(context: Context, license: License): String {
val licenseContent = StringBuilder()
val webViewData: String
try {
BufferedReader(
InputStreamReader(
context.assets.open(license.filename),
StandardCharsets.UTF_8
)
).use { `in` ->
var str: String?
while (`in`.readLine().also { str = it } != null) {
licenseContent.append(str)
}
/**
* @param context the context to use
* @param license the license
* @return String which contains a HTML formatted license page
* styled according to the context's theme
*/
private fun getFormattedLicense(context: Context, license: License): String {
try {
return context.assets.open(license.filename).bufferedReader().use { it.readText() }
// split the HTML file and insert the stylesheet into the HEAD of the file
.replace("</head>", "<style>${getLicenseStylesheet(context)}</style></head>")
} catch (e: IOException) {
throw IllegalArgumentException("Could not get license file: ${license.filename}", e)
}
}
// split the HTML file and insert the stylesheet into the HEAD of the file
webViewData = "$licenseContent".replace(
"</head>",
"<style>" + getLicenseStylesheet(context) + "</style></head>"
)
}
} catch (e: IOException) {
throw IllegalArgumentException(
"Could not get license file: " + license.filename, e
)
/**
* @param context the Android context
* @return String which is a CSS stylesheet according to the context's theme
*/
private fun getLicenseStylesheet(context: Context): String {
val isLightTheme = ThemeHelper.isLightThemeSelected(context)
val licenseBackgroundColor = getHexRGBColor(
context, if (isLightTheme) R.color.light_license_background_color else R.color.dark_license_background_color
)
val licenseTextColor = getHexRGBColor(
context, if (isLightTheme) R.color.light_license_text_color else R.color.dark_license_text_color
)
val youtubePrimaryColor = getHexRGBColor(
context, if (isLightTheme) R.color.light_youtube_primary_color else R.color.dark_youtube_primary_color
)
return "body{padding:12px 15px;margin:0;background:#$licenseBackgroundColor;color:#$licenseTextColor}" +
"a[href]{color:#$youtubePrimaryColor}pre{white-space:pre-wrap}"
}
/**
* Cast R.color to a hexadecimal color value.
*
* @param context the context to use
* @param color the color number from R.color
* @return a six characters long String with hexadecimal RGB values
*/
private fun getHexRGBColor(context: Context, color: Int): String {
return context.getString(color).substring(3)
}
fun showLicense(context: Context?, component: SoftwareComponent): Disposable {
return showLicense(context, component.license) {
setPositiveButton(R.string.dismiss) { dialog, _ ->
dialog.dismiss()
}
return webViewData
}
/**
* @param context the Android context
* @return String which is a CSS stylesheet according to the context's theme
*/
private fun getLicenseStylesheet(context: Context): String {
val isLightTheme = ThemeHelper.isLightThemeSelected(context)
return (
"body{padding:12px 15px;margin:0;" + "background:#" + getHexRGBColor(
context,
if (isLightTheme) R.color.light_license_background_color
else R.color.dark_license_background_color
) + ";" + "color:#" + getHexRGBColor(
context,
if (isLightTheme) R.color.light_license_text_color
else R.color.dark_license_text_color
) + "}" + "a[href]{color:#" + getHexRGBColor(
context,
if (isLightTheme) R.color.light_youtube_primary_color
else R.color.dark_youtube_primary_color
) + "}" + "pre{white-space:pre-wrap}"
)
}
/**
* Cast R.color to a hexadecimal color value.
*
* @param context the context to use
* @param color the color number from R.color
* @return a six characters long String with hexadecimal RGB values
*/
private fun getHexRGBColor(context: Context, color: Int): String {
return context.getString(color).substring(3)
}
fun showLicense(context: Context?, license: License): Disposable {
return showLicense(context, license) { alertDialog ->
alertDialog.setPositiveButton(R.string.ok) { dialog, _ ->
dialog.dismiss()
}
}
}
fun showLicense(context: Context?, component: SoftwareComponent): Disposable {
return showLicense(context, component.license) { alertDialog ->
alertDialog.setPositiveButton(R.string.dismiss) { dialog, _ ->
dialog.dismiss()
}
alertDialog.setNeutralButton(R.string.open_website_license) { _, _ ->
ShareUtils.openUrlInBrowser(context!!, component.link)
}
}
}
private fun showLicense(
context: Context?,
license: License,
block: (AlertDialog.Builder) -> Unit
): Disposable {
return if (context == null) {
Disposable.empty()
} else {
Observable.fromCallable { getFormattedLicense(context, license) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { formattedLicense ->
val webViewData = Base64.encodeToString(
formattedLicense.toByteArray(StandardCharsets.UTF_8), Base64.NO_PADDING
)
val webView = WebView(context)
webView.loadData(webViewData, "text/html; charset=UTF-8", "base64")
AlertDialog.Builder(context).apply {
setTitle(license.name)
setView(webView)
Localization.assureCorrectAppLanguage(context)
block(this)
show()
}
}
setNeutralButton(R.string.open_website_license) { _, _ ->
ShareUtils.openUrlInBrowser(context!!, component.link)
}
}
}
fun showLicense(context: Context?, license: License) = showLicense(context, license) {
setPositiveButton(R.string.ok) { dialog, _ -> dialog.dismiss() }
}
private fun showLicense(
context: Context?,
license: License,
block: AlertDialog.Builder.() -> AlertDialog.Builder
): Disposable {
return if (context == null) {
Disposable.empty()
} else {
Observable.fromCallable { getFormattedLicense(context, license) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { formattedLicense ->
val webViewData =
Base64.encodeToString(formattedLicense.toByteArray(), Base64.NO_PADDING)
val webView = WebView(context)
webView.loadData(webViewData, "text/html; charset=UTF-8", "base64")
Localization.assureCorrectAppLanguage(context)
AlertDialog.Builder(context)
.setTitle(license.name)
.setView(webView)
.block()
.show()
}
}
}

View File

@@ -3,7 +3,6 @@ package org.schabi.newpipe.database;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Update;
import java.util.Collection;
@@ -14,13 +13,10 @@ import io.reactivex.rxjava3.core.Flowable;
@Dao
public interface BasicDAO<Entity> {
/* Inserts */
@Insert(onConflict = OnConflictStrategy.ABORT)
@Insert
long insert(Entity entity);
@Insert(onConflict = OnConflictStrategy.ABORT)
List<Long> insertAll(Entity... entities);
@Insert(onConflict = OnConflictStrategy.ABORT)
@Insert
List<Long> insertAll(Collection<Entity> entities);
/* Searches */
@@ -32,9 +28,6 @@ public interface BasicDAO<Entity> {
@Delete
void delete(Entity entity);
@Delete
int delete(Collection<Entity> entities);
int deleteAll();
/* Updates */

View File

@@ -9,6 +9,7 @@ import androidx.room.Update
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Maybe
import org.schabi.newpipe.database.feed.model.FeedEntity
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity
import org.schabi.newpipe.database.stream.StreamWithState
import org.schabi.newpipe.database.stream.model.StreamStateEntity
@@ -21,56 +22,16 @@ abstract class FeedDAO {
@Query("DELETE FROM feed")
abstract fun deleteAll(): Int
@Query(
"""
SELECT s.*, sst.progress_time
FROM streams s
LEFT JOIN stream_state sst
ON s.uid = sst.stream_id
LEFT JOIN stream_history sh
ON s.uid = sh.stream_id
INNER JOIN feed f
ON s.uid = f.stream_id
ORDER BY s.upload_date IS NULL DESC, s.upload_date DESC, s.uploader ASC
LIMIT 500
"""
)
abstract fun getAllStreams(): Maybe<List<StreamWithState>>
@Query(
"""
SELECT s.*, sst.progress_time
FROM streams s
LEFT JOIN stream_state sst
ON s.uid = sst.stream_id
LEFT JOIN stream_history sh
ON s.uid = sh.stream_id
INNER JOIN feed f
ON s.uid = f.stream_id
INNER JOIN feed_group_subscription_join fgs
ON fgs.subscription_id = f.subscription_id
WHERE fgs.group_id = :groupId
ORDER BY s.upload_date IS NULL DESC, s.upload_date DESC, s.uploader ASC
LIMIT 500
"""
)
abstract fun getAllStreamsForGroup(groupId: Long): Maybe<List<StreamWithState>>
/**
* @param groupId the group id to get feed streams of; use
* [FeedGroupEntity.GROUP_ALL_ID] to not filter by group
* @param includePlayed if false, only return all of the live, never-played or non-finished
* feed streams (see `@see` items); if true no filter is applied
* @param uploadDateBefore get only streams uploaded before this date (useful to filter out
* future streams); use null to not filter by upload date
* @return the feed streams filtered according to the conditions provided in the parameters
* @see StreamStateEntity.isFinished()
* @see StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS
* @return all of the non-live, never-played and non-finished streams in the feed
* (all of the cited conditions must hold for a stream to be in the returned list)
*/
@Query(
"""
@@ -79,67 +40,44 @@ abstract class FeedDAO {
LEFT JOIN stream_state sst
ON s.uid = sst.stream_id
LEFT JOIN stream_history sh
ON s.uid = sh.stream_id
ON s.uid = sh.stream_id
INNER JOIN feed f
ON s.uid = f.stream_id
LEFT JOIN feed_group_subscription_join fgs
ON fgs.subscription_id = f.subscription_id
WHERE (
sh.stream_id IS NULL
OR sst.stream_id IS NULL
OR sst.progress_time < s.duration * 1000 - ${StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS}
OR sst.progress_time < s.duration * 1000 * 3 / 4
OR s.stream_type = 'LIVE_STREAM'
OR s.stream_type = 'AUDIO_LIVE_STREAM'
:groupId = ${FeedGroupEntity.GROUP_ALL_ID}
OR fgs.group_id = :groupId
)
ORDER BY s.upload_date IS NULL DESC, s.upload_date DESC, s.uploader ASC
LIMIT 500
"""
)
abstract fun getLiveOrNotPlayedStreams(): Maybe<List<StreamWithState>>
/**
* @see StreamStateEntity.isFinished()
* @see StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS
* @param groupId the group id to get streams of
* @return all of the non-live, never-played and non-finished streams for the given feed group
* (all of the cited conditions must hold for a stream to be in the returned list)
*/
@Query(
"""
SELECT s.*, sst.progress_time
FROM streams s
LEFT JOIN stream_state sst
ON s.uid = sst.stream_id
LEFT JOIN stream_history sh
ON s.uid = sh.stream_id
INNER JOIN feed f
ON s.uid = f.stream_id
INNER JOIN feed_group_subscription_join fgs
ON fgs.subscription_id = f.subscription_id
WHERE fgs.group_id = :groupId
AND (
sh.stream_id IS NULL
:includePlayed
OR sh.stream_id IS NULL
OR sst.stream_id IS NULL
OR sst.progress_time < s.duration * 1000 - ${StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS}
OR sst.progress_time < s.duration * 1000 * 3 / 4
OR s.stream_type = 'LIVE_STREAM'
OR s.stream_type = 'AUDIO_LIVE_STREAM'
)
AND (
:uploadDateBefore IS NULL
OR s.upload_date IS NULL
OR s.upload_date < :uploadDateBefore
)
ORDER BY s.upload_date IS NULL DESC, s.upload_date DESC, s.uploader ASC
LIMIT 500
"""
)
abstract fun getLiveOrNotPlayedStreamsForGroup(groupId: Long): Maybe<List<StreamWithState>>
abstract fun getStreams(
groupId: Long,
includePlayed: Boolean,
uploadDateBefore: OffsetDateTime?
): Maybe<List<StreamWithState>>
@Query(
"""

View File

@@ -3,10 +3,10 @@ package org.schabi.newpipe.database.playlist;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public interface PlaylistLocalItem extends LocalItem {
String getOrderingName();
@@ -14,14 +14,9 @@ public interface PlaylistLocalItem extends LocalItem {
static List<PlaylistLocalItem> merge(
final List<PlaylistMetadataEntry> localPlaylists,
final List<PlaylistRemoteEntity> remotePlaylists) {
final List<PlaylistLocalItem> items = new ArrayList<>(
localPlaylists.size() + remotePlaylists.size());
items.addAll(localPlaylists);
items.addAll(remotePlaylists);
Collections.sort(items, Comparator.comparing(PlaylistLocalItem::getOrderingName,
Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER)));
return items;
return Stream.concat(localPlaylists.stream(), remotePlaylists.stream())
.sorted(Comparator.comparing(PlaylistLocalItem::getOrderingName,
Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER)))
.collect(Collectors.toList());
}
}

View File

@@ -1,5 +1,9 @@
package org.schabi.newpipe.download;
import static org.schabi.newpipe.extractor.stream.DeliveryMethod.PROGRESSIVE_HTTP;
import static org.schabi.newpipe.util.ListHelper.getStreamsOfSpecifiedDelivery;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
@@ -82,10 +86,6 @@ import us.shandian.giga.service.DownloadManagerService;
import us.shandian.giga.service.DownloadManagerService.DownloadManagerBinder;
import us.shandian.giga.service.MissionState;
import static org.schabi.newpipe.extractor.stream.DeliveryMethod.PROGRESSIVE_HTTP;
import static org.schabi.newpipe.util.ListHelper.getStreamsOfSpecifiedDelivery;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class DownloadDialog extends DialogFragment
implements RadioGroup.OnCheckedChangeListener, AdapterView.OnItemSelectedListener {
private static final String TAG = "DialogFragment";
@@ -205,8 +205,8 @@ public class DownloadDialog extends DialogFragment
setStyle(STYLE_NO_TITLE, ThemeHelper.getDialogTheme(context));
Icepick.restoreInstanceState(this, savedInstanceState);
final SparseArray<SecondaryStreamHelper<AudioStream>> secondaryStreams
= new SparseArray<>(4);
final SparseArray<SecondaryStreamHelper<AudioStream>> secondaryStreams =
new SparseArray<>(4);
final List<VideoStream> videoStreams = wrappedVideoStreams.getStreamsList();
for (int i = 0; i < videoStreams.size(); i++) {

View File

@@ -31,6 +31,7 @@ import org.schabi.newpipe.util.external_communication.ShareUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.stream.Collectors;
/*
* Created by Christian Schabesberger on 24.10.15.
@@ -65,11 +66,11 @@ public class ErrorActivity extends AppCompatActivity {
public static final String ERROR_EMAIL_ADDRESS = "crashreport@newpipe.schabi.org";
public static final String ERROR_EMAIL_SUBJECT = "Exception in ";
public static final String ERROR_GITHUB_ISSUE_URL
= "https://github.com/TeamNewPipe/NewPipe/issues";
public static final String ERROR_GITHUB_ISSUE_URL =
"https://github.com/TeamNewPipe/NewPipe/issues";
public static final DateTimeFormatter CURRENT_TIMESTAMP_FORMATTER
= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
public static final DateTimeFormatter CURRENT_TIMESTAMP_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
private ErrorInfo errorInfo;
@@ -182,14 +183,9 @@ public class ErrorActivity extends AppCompatActivity {
}
private String formErrorText(final String[] el) {
final StringBuilder text = new StringBuilder();
if (el != null) {
for (final String e : el) {
text.append("-------------------------------------\n").append(e);
}
}
text.append("-------------------------------------");
return text.toString();
final String separator = "-------------------------------------";
return Arrays.stream(el)
.collect(Collectors.joining(separator + "\n", separator + "\n", separator));
}
/**

View File

@@ -14,8 +14,6 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.DeobfuscateException
import org.schabi.newpipe.ktx.isNetworkRelated
import org.schabi.newpipe.util.ServiceHelper
import java.io.PrintWriter
import java.io.StringWriter
@Parcelize
class ErrorInfo(
@@ -80,19 +78,10 @@ class ErrorInfo(
companion object {
const val SERVICE_NONE = "none"
private fun getStackTrace(throwable: Throwable): String {
StringWriter().use { stringWriter ->
PrintWriter(stringWriter, true).use { printWriter ->
throwable.printStackTrace(printWriter)
return stringWriter.buffer.toString()
}
}
}
fun throwableToStringList(throwable: Throwable) = arrayOf(throwable.stackTraceToString())
fun throwableToStringList(throwable: Throwable) = arrayOf(getStackTrace(throwable))
fun throwableListToStringList(throwable: List<Throwable>) =
Array(throwable.size) { i -> getStackTrace(throwable[i]) }
fun throwableListToStringList(throwableList: List<Throwable>) =
throwableList.map { it.stackTraceToString() }.toTypedArray()
private fun getInfoServiceName(info: Info?) =
if (info == null) SERVICE_NONE else ServiceHelper.getNameOfServiceById(info.serviceId)

View File

@@ -114,13 +114,7 @@ class ErrorUtil {
context,
context.getString(R.string.error_report_channel_id)
)
.setSmallIcon(
// the vector drawable icon causes crashes on KitKat devices
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
R.drawable.ic_bug_report
else
android.R.drawable.stat_notify_error
)
.setSmallIcon(R.drawable.ic_bug_report)
.setContentTitle(context.getString(R.string.error_report_notification_title))
.setContentText(context.getString(errorInfo.messageStringId))
.setAutoCancel(true)

View File

@@ -3,14 +3,15 @@ package org.schabi.newpipe.error;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.CookieManager;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -18,7 +19,6 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NavUtils;
import androidx.preference.PreferenceManager;
import androidx.webkit.WebViewClientCompat;
import org.schabi.newpipe.databinding.ActivityRecaptchaBinding;
import org.schabi.newpipe.DownloaderImpl;
@@ -86,14 +86,15 @@ public class ReCaptchaActivity extends AppCompatActivity {
webSettings.setJavaScriptEnabled(true);
webSettings.setUserAgentString(DownloaderImpl.USER_AGENT);
recaptchaBinding.reCaptchaWebView.setWebViewClient(new WebViewClientCompat() {
recaptchaBinding.reCaptchaWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
public boolean shouldOverrideUrlLoading(final WebView view,
final WebResourceRequest request) {
if (MainActivity.DEBUG) {
Log.d(TAG, "shouldOverrideUrlLoading: url=" + url);
Log.d(TAG, "shouldOverrideUrlLoading: url=" + request.getUrl().toString());
}
handleCookiesFromUrl(url);
handleCookiesFromUrl(request.getUrl().toString());
return false;
}
@@ -107,12 +108,7 @@ public class ReCaptchaActivity extends AppCompatActivity {
// cleaning cache, history and cookies from webView
recaptchaBinding.reCaptchaWebView.clearCache(true);
recaptchaBinding.reCaptchaWebView.clearHistory();
final CookieManager cookieManager = CookieManager.getInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.removeAllCookies(value -> { });
} else {
cookieManager.removeAllCookie();
}
CookieManager.getInstance().removeAllCookies(null);
recaptchaBinding.reCaptchaWebView.loadUrl(url);
}

View File

@@ -1,5 +1,9 @@
package org.schabi.newpipe.fragments.detail;
import static android.text.TextUtils.isEmpty;
import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT;
import static org.schabi.newpipe.extractor.utils.Utils.isBlank;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -26,17 +30,9 @@ import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import org.schabi.newpipe.util.external_communication.TextLinkifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import icepick.State;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import static android.text.TextUtils.isEmpty;
import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT;
import static org.schabi.newpipe.extractor.utils.Utils.isBlank;
public class DescriptionFragment extends BaseFragment {
@State
@@ -185,8 +181,8 @@ public class DescriptionFragment extends BaseFragment {
return;
}
final ItemMetadataBinding itemBinding
= ItemMetadataBinding.inflate(inflater, layout, false);
final ItemMetadataBinding itemBinding =
ItemMetadataBinding.inflate(inflater, layout, false);
itemBinding.metadataTypeView.setText(type);
itemBinding.metadataTypeView.setOnLongClickListener(v -> {
@@ -206,19 +202,16 @@ public class DescriptionFragment extends BaseFragment {
private void addTagsMetadataItem(final LayoutInflater inflater, final LinearLayout layout) {
if (streamInfo.getTags() != null && !streamInfo.getTags().isEmpty()) {
final ItemMetadataTagsBinding itemBinding
= ItemMetadataTagsBinding.inflate(inflater, layout, false);
final var itemBinding = ItemMetadataTagsBinding.inflate(inflater, layout, false);
final List<String> tags = new ArrayList<>(streamInfo.getTags());
Collections.sort(tags);
for (final String tag : tags) {
streamInfo.getTags().stream().sorted(String.CASE_INSENSITIVE_ORDER).forEach(tag -> {
final Chip chip = (Chip) inflater.inflate(R.layout.chip,
itemBinding.metadataTagsChips, false);
chip.setText(tag);
chip.setOnClickListener(this::onTagClick);
chip.setOnLongClickListener(this::onTagLongClick);
itemBinding.metadataTagsChips.addView(chip);
}
});
layout.addView(itemBinding.getRoot());
}

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