From 2ac0d1f13a808a377fd9b8ebaa4e416d0059809c Mon Sep 17 00:00:00 2001
From: Christian Schabesberger
Date: Tue, 2 Jul 2024 09:31:34 +0200
Subject: [PATCH 01/23] add NP icon for Android Studio's NewUI
---
.idea/icon.svg | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 .idea/icon.svg
diff --git a/.idea/icon.svg b/.idea/icon.svg
new file mode 100644
index 000000000..51fdf95de
--- /dev/null
+++ b/.idea/icon.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 9f766ebf781b770b6e1b37da084e6193698cee4c Mon Sep 17 00:00:00 2001
From: Stypox
Date: Thu, 11 Jul 2024 09:30:22 +0200
Subject: [PATCH 02/23] Fix NPE in MediaSessionPlayerUi while destroying player
---
.../newpipe/player/mediasession/MediaSessionPlayerUi.java | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java
index 737ebc5dd..c673e688c 100644
--- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java
+++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java
@@ -38,7 +38,9 @@ public class MediaSessionPlayerUi extends PlayerUi
implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = "MediaSessUi";
+ @Nullable
private MediaSessionCompat mediaSession;
+ @Nullable
private MediaSessionConnector sessionConnector;
private final String ignoreHardwareMediaButtonsKey;
@@ -198,6 +200,11 @@ public class MediaSessionPlayerUi extends PlayerUi
return;
}
+ if (sessionConnector == null) {
+ // sessionConnector will be null after destroyPlayer is called
+ return;
+ }
+
// only use the fourth and fifth actions (the settings page also shows only the last 2 on
// Android 13+)
final List newNotificationActions = IntStream.of(3, 4)
From 0e0cee1bcecc0414a25b88ff0b153273c6a9d546 Mon Sep 17 00:00:00 2001
From: Stypox
Date: Thu, 11 Jul 2024 23:27:26 +0200
Subject: [PATCH 03/23] Update NewPipeExtractor to v0.24.1
---
app/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/build.gradle b/app/build.gradle
index 28a208195..eebf9135f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -198,7 +198,7 @@ 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:v0.24.0'
+ implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.24.1'
implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0'
/** Checkstyle **/
From acc5be92ac0fcf1899ac265575b01349f4768d82 Mon Sep 17 00:00:00 2001
From: Stypox
Date: Thu, 11 Jul 2024 23:39:53 +0200
Subject: [PATCH 04/23] Add changelogs for hotfix release v0.27.1 (998)
---
fastlane/metadata/android/ar/changelogs/998.txt | 1 +
fastlane/metadata/android/az/changelogs/998.txt | 1 +
fastlane/metadata/android/cs/changelogs/998.txt | 1 +
fastlane/metadata/android/de/changelogs/998.txt | 1 +
fastlane/metadata/android/en-US/changelogs/998.txt | 4 ++++
fastlane/metadata/android/es/changelogs/998.txt | 1 +
fastlane/metadata/android/fa/changelogs/998.txt | 1 +
fastlane/metadata/android/fr/changelogs/998.txt | 1 +
fastlane/metadata/android/he/changelogs/998.txt | 1 +
fastlane/metadata/android/hi/changelogs/998.txt | 1 +
fastlane/metadata/android/id/changelogs/998.txt | 1 +
fastlane/metadata/android/it/changelogs/998.txt | 4 ++++
fastlane/metadata/android/ka/changelogs/998.txt | 1 +
fastlane/metadata/android/nl/changelogs/998.txt | 1 +
fastlane/metadata/android/pa/changelogs/998.txt | 1 +
fastlane/metadata/android/pt-BR/changelogs/998.txt | 1 +
fastlane/metadata/android/pt-PT/changelogs/998.txt | 1 +
fastlane/metadata/android/pt/changelogs/998.txt | 1 +
fastlane/metadata/android/ru/changelogs/998.txt | 1 +
fastlane/metadata/android/sv/changelogs/998.txt | 1 +
fastlane/metadata/android/tr/changelogs/998.txt | 1 +
fastlane/metadata/android/uk/changelogs/998.txt | 1 +
fastlane/metadata/android/vi/changelogs/998.txt | 1 +
fastlane/metadata/android/zh-Hans/changelogs/998.txt | 1 +
fastlane/metadata/android/zh-Hant/changelogs/998.txt | 1 +
fastlane/metadata/android/zh_Hant_HK/changelogs/998.txt | 1 +
26 files changed, 32 insertions(+)
create mode 100644 fastlane/metadata/android/ar/changelogs/998.txt
create mode 100644 fastlane/metadata/android/az/changelogs/998.txt
create mode 100644 fastlane/metadata/android/cs/changelogs/998.txt
create mode 100644 fastlane/metadata/android/de/changelogs/998.txt
create mode 100644 fastlane/metadata/android/en-US/changelogs/998.txt
create mode 100644 fastlane/metadata/android/es/changelogs/998.txt
create mode 100644 fastlane/metadata/android/fa/changelogs/998.txt
create mode 100644 fastlane/metadata/android/fr/changelogs/998.txt
create mode 100644 fastlane/metadata/android/he/changelogs/998.txt
create mode 100644 fastlane/metadata/android/hi/changelogs/998.txt
create mode 100644 fastlane/metadata/android/id/changelogs/998.txt
create mode 100644 fastlane/metadata/android/it/changelogs/998.txt
create mode 100644 fastlane/metadata/android/ka/changelogs/998.txt
create mode 100644 fastlane/metadata/android/nl/changelogs/998.txt
create mode 100644 fastlane/metadata/android/pa/changelogs/998.txt
create mode 100644 fastlane/metadata/android/pt-BR/changelogs/998.txt
create mode 100644 fastlane/metadata/android/pt-PT/changelogs/998.txt
create mode 100644 fastlane/metadata/android/pt/changelogs/998.txt
create mode 100644 fastlane/metadata/android/ru/changelogs/998.txt
create mode 100644 fastlane/metadata/android/sv/changelogs/998.txt
create mode 100644 fastlane/metadata/android/tr/changelogs/998.txt
create mode 100644 fastlane/metadata/android/uk/changelogs/998.txt
create mode 100644 fastlane/metadata/android/vi/changelogs/998.txt
create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/998.txt
create mode 100644 fastlane/metadata/android/zh-Hant/changelogs/998.txt
create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/998.txt
diff --git a/fastlane/metadata/android/ar/changelogs/998.txt b/fastlane/metadata/android/ar/changelogs/998.txt
new file mode 100644
index 000000000..562f16944
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/998.txt
@@ -0,0 +1 @@
+تم إصلاح YouTube الذي لا يقوم بتشغيل أي دفق
diff --git a/fastlane/metadata/android/az/changelogs/998.txt b/fastlane/metadata/android/az/changelogs/998.txt
new file mode 100644
index 000000000..16a2e1013
--- /dev/null
+++ b/fastlane/metadata/android/az/changelogs/998.txt
@@ -0,0 +1 @@
+YouTube-un heç bir yayım oynatmaması düzəldildi
diff --git a/fastlane/metadata/android/cs/changelogs/998.txt b/fastlane/metadata/android/cs/changelogs/998.txt
new file mode 100644
index 000000000..7035a1112
--- /dev/null
+++ b/fastlane/metadata/android/cs/changelogs/998.txt
@@ -0,0 +1 @@
+Opraveno nepřehrávání jakéhokoli streamu ve službě YouTube
diff --git a/fastlane/metadata/android/de/changelogs/998.txt b/fastlane/metadata/android/de/changelogs/998.txt
new file mode 100644
index 000000000..43623578f
--- /dev/null
+++ b/fastlane/metadata/android/de/changelogs/998.txt
@@ -0,0 +1 @@
+Behoben, dass YouTube keinen Stream abspielte
diff --git a/fastlane/metadata/android/en-US/changelogs/998.txt b/fastlane/metadata/android/en-US/changelogs/998.txt
new file mode 100644
index 000000000..468df0204
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/998.txt
@@ -0,0 +1,4 @@
+Fixed YouTube not playing any stream because of HTTP 403 errors.
+
+Occasional HTTP 403 errors in the middle of a YouTube video are not fixed yet.
+That issue will be addressed in another hotfix release as soon as possible.
diff --git a/fastlane/metadata/android/es/changelogs/998.txt b/fastlane/metadata/android/es/changelogs/998.txt
new file mode 100644
index 000000000..80b4efa55
--- /dev/null
+++ b/fastlane/metadata/android/es/changelogs/998.txt
@@ -0,0 +1 @@
+Arreglo en YouTube no reproduciendo flujos
diff --git a/fastlane/metadata/android/fa/changelogs/998.txt b/fastlane/metadata/android/fa/changelogs/998.txt
new file mode 100644
index 000000000..ba5413d49
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/998.txt
@@ -0,0 +1 @@
+مشکل عدم نمایش پخشزنده برطرف شد
diff --git a/fastlane/metadata/android/fr/changelogs/998.txt b/fastlane/metadata/android/fr/changelogs/998.txt
new file mode 100644
index 000000000..3ad3bf279
--- /dev/null
+++ b/fastlane/metadata/android/fr/changelogs/998.txt
@@ -0,0 +1 @@
+Correction de YouTube qui ne lisait aucun média
diff --git a/fastlane/metadata/android/he/changelogs/998.txt b/fastlane/metadata/android/he/changelogs/998.txt
new file mode 100644
index 000000000..50731171e
--- /dev/null
+++ b/fastlane/metadata/android/he/changelogs/998.txt
@@ -0,0 +1 @@
+תוקנה התקלה ש־YouTube לא מנגן אף תזרים
diff --git a/fastlane/metadata/android/hi/changelogs/998.txt b/fastlane/metadata/android/hi/changelogs/998.txt
new file mode 100644
index 000000000..071ab64e3
--- /dev/null
+++ b/fastlane/metadata/android/hi/changelogs/998.txt
@@ -0,0 +1 @@
+फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है
diff --git a/fastlane/metadata/android/id/changelogs/998.txt b/fastlane/metadata/android/id/changelogs/998.txt
new file mode 100644
index 000000000..d3fea84ab
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/998.txt
@@ -0,0 +1 @@
+Memperbaiki YouTube yang tidak memutar streaming apa pun
diff --git a/fastlane/metadata/android/it/changelogs/998.txt b/fastlane/metadata/android/it/changelogs/998.txt
new file mode 100644
index 000000000..73fc6f2d8
--- /dev/null
+++ b/fastlane/metadata/android/it/changelogs/998.txt
@@ -0,0 +1,4 @@
+Corretto problema di riproduzione di YouTube causato da errori HTTP 403.
+
+Gli errori HTTP 403 saltuari nel mezzo di un video di YouTube non sono ancora stati sistemati.
+Questo problema sarà affrontato in un altra release hotfix non appena possibile.
diff --git a/fastlane/metadata/android/ka/changelogs/998.txt b/fastlane/metadata/android/ka/changelogs/998.txt
new file mode 100644
index 000000000..d20512f17
--- /dev/null
+++ b/fastlane/metadata/android/ka/changelogs/998.txt
@@ -0,0 +1 @@
+გაასწორა YouTube არ უკრავს არცერთ ნაკადს
diff --git a/fastlane/metadata/android/nl/changelogs/998.txt b/fastlane/metadata/android/nl/changelogs/998.txt
new file mode 100644
index 000000000..9bd8adf86
--- /dev/null
+++ b/fastlane/metadata/android/nl/changelogs/998.txt
@@ -0,0 +1 @@
+YouTube speelt geen stream af opgelost
diff --git a/fastlane/metadata/android/pa/changelogs/998.txt b/fastlane/metadata/android/pa/changelogs/998.txt
new file mode 100644
index 000000000..fe62a1330
--- /dev/null
+++ b/fastlane/metadata/android/pa/changelogs/998.txt
@@ -0,0 +1 @@
+ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ
diff --git a/fastlane/metadata/android/pt-BR/changelogs/998.txt b/fastlane/metadata/android/pt-BR/changelogs/998.txt
new file mode 100644
index 000000000..59fc6a5cd
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/998.txt
@@ -0,0 +1 @@
+Corrigido YouTube não reproduzir qualquer transmissão
diff --git a/fastlane/metadata/android/pt-PT/changelogs/998.txt b/fastlane/metadata/android/pt-PT/changelogs/998.txt
new file mode 100644
index 000000000..93519d64d
--- /dev/null
+++ b/fastlane/metadata/android/pt-PT/changelogs/998.txt
@@ -0,0 +1 @@
+Corrigido YouTube não reproduzir nenhuma transmissão
diff --git a/fastlane/metadata/android/pt/changelogs/998.txt b/fastlane/metadata/android/pt/changelogs/998.txt
new file mode 100644
index 000000000..93519d64d
--- /dev/null
+++ b/fastlane/metadata/android/pt/changelogs/998.txt
@@ -0,0 +1 @@
+Corrigido YouTube não reproduzir nenhuma transmissão
diff --git a/fastlane/metadata/android/ru/changelogs/998.txt b/fastlane/metadata/android/ru/changelogs/998.txt
new file mode 100644
index 000000000..d3978869d
--- /dev/null
+++ b/fastlane/metadata/android/ru/changelogs/998.txt
@@ -0,0 +1 @@
+Исправлено: YouTube не воспроизводил никакие потоки
diff --git a/fastlane/metadata/android/sv/changelogs/998.txt b/fastlane/metadata/android/sv/changelogs/998.txt
new file mode 100644
index 000000000..35f298dbf
--- /dev/null
+++ b/fastlane/metadata/android/sv/changelogs/998.txt
@@ -0,0 +1 @@
+Åtgärdat att YouTube inte spelar någon stream
diff --git a/fastlane/metadata/android/tr/changelogs/998.txt b/fastlane/metadata/android/tr/changelogs/998.txt
new file mode 100644
index 000000000..e5979c68d
--- /dev/null
+++ b/fastlane/metadata/android/tr/changelogs/998.txt
@@ -0,0 +1 @@
+YouTube'un herhangi bir akışı oynatmaması düzeltildi
diff --git a/fastlane/metadata/android/uk/changelogs/998.txt b/fastlane/metadata/android/uk/changelogs/998.txt
new file mode 100644
index 000000000..905287c74
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/998.txt
@@ -0,0 +1 @@
+Виправлено проблему невідтворюваності трансляцій
diff --git a/fastlane/metadata/android/vi/changelogs/998.txt b/fastlane/metadata/android/vi/changelogs/998.txt
new file mode 100644
index 000000000..d2086b62c
--- /dev/null
+++ b/fastlane/metadata/android/vi/changelogs/998.txt
@@ -0,0 +1 @@
+Đã sửa lỗi YouTube không phát bất kỳ luồng nào
diff --git a/fastlane/metadata/android/zh-Hans/changelogs/998.txt b/fastlane/metadata/android/zh-Hans/changelogs/998.txt
new file mode 100644
index 000000000..8a5424c9e
--- /dev/null
+++ b/fastlane/metadata/android/zh-Hans/changelogs/998.txt
@@ -0,0 +1 @@
+修复YouTube无法播放任何视频
diff --git a/fastlane/metadata/android/zh-Hant/changelogs/998.txt b/fastlane/metadata/android/zh-Hant/changelogs/998.txt
new file mode 100644
index 000000000..4e8bf6537
--- /dev/null
+++ b/fastlane/metadata/android/zh-Hant/changelogs/998.txt
@@ -0,0 +1 @@
+修正 YouTube 無法播放任何串流
diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/998.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/998.txt
new file mode 100644
index 000000000..9a4721551
--- /dev/null
+++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/998.txt
@@ -0,0 +1 @@
+修正咗 YouTube 乜嘢實況串流都播唔到嘅問題
From 0f64158469d42a37df5c8ef200f7963cafabe361 Mon Sep 17 00:00:00 2001
From: Stypox
Date: Thu, 11 Jul 2024 23:41:53 +0200
Subject: [PATCH 05/23] Hotfix release v0.27.1 (998)
---
app/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index eebf9135f..397a7301e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -20,8 +20,8 @@ android {
resValue "string", "app_name", "NewPipe"
minSdk 21
targetSdk 33
- versionCode 997
- versionName "0.27.0"
+ versionCode 998
+ versionName "0.27.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
From ad6b676c81ad0beca27a287bb2d0b5f8b41f8f20 Mon Sep 17 00:00:00 2001
From: #27 <68751594+tag27@users.noreply.github.com>
Date: Sat, 13 Jul 2024 14:32:24 -0300
Subject: [PATCH 06/23] Update README.pt_BR.md (#11275)
---
doc/README.pt_BR.md | 128 +++++++++++++++++++++++---------------------
1 file changed, 66 insertions(+), 62 deletions(-)
diff --git a/doc/README.pt_BR.md b/doc/README.pt_BR.md
index 01fa718ad..59ff65db3 100644
--- a/doc/README.pt_BR.md
+++ b/doc/README.pt_BR.md
@@ -1,3 +1,6 @@
+Nós estamos planejando reescrever grandes pedaços do código base, para gerar um novo, moderno e estável NewPipe !
+Por favor, não abra solicitações de pull para novos recursos por enquanto, apenas correções de bugs serão aceitas.
+
NewPipe
@@ -13,16 +16,16 @@
-Screenshots • Descrição • Características • Atualizações • Contribuição • Doar • Licença
+Screenshots • Serviços Suportados • Descrição • Recursos • Instalação e atualizações • Contribuições • Doar • Licença
Site • Blog • FAQ • Press
-*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)*
+*Leia esse documento em outras línguas: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)*
> [!warning]
-> ESTA É UMA VERSÃO BETA, PORTANTO, VOCÊ PODE ENCONTRAR BUGS. ENCONTROU ALGUM, ABRA UM ISSUE ATRAVÉS DO NOSSO REPOSITÓRIO GITHUB.
+> ESTA É UMA VERSÃO BETA, PORTANTO, VOCÊ PODE ENCONTRAR BUGS. ENCONTROU ALGUM, ABRA UM ISSUE ATRAVÉS DO NOSSO REPOSITÓRIO GITHUB PREENCHENDO O MODELO.
>
-> COLOCAR NEWPIPE OU QUALQUER FORK DELE NA GOOGLE PLAY STORE VIOLA SEUS TERMOS E CONDIÇÕES.
+> COLOCAR NEWPIPE, OU QUALQUER FORK DELE, NA GOOGLE PLAY STORE VIOLA SEUS TERMOS E CONDIÇÕES.
## Screenshots
@@ -39,83 +42,84 @@
[ ](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)
[ ](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)
-## Descrição
-
-O NewPipe não usa nenhuma biblioteca de framework do Google, nem a API do YouTube. Os sites são apenas analisados para obter informações necessárias, para que este aplicativo possa ser usado em dispositivos sem os serviços do Google instalados. Além disso, você não precisa de uma conta no YouTube para usar o NewPipe, que é um software livre com copyleft.
-
-### Características
-
-* Procurar vídeos
-* Exibir informações gerais sobre vídeos
-* Assista aos vídeos do YouTube
-* Ouça vídeos do YouTube
-* Modo popup (player flutuante)
-* Selecione o player para assistir streaming
-* Baixar vídeos
-* Baixar somente áudio
-* Abrir vídeo no Kodi
-* Mostrar vídeos próximos/relacionados
-* Pesquise no YouTube em um idioma específico
-* Assistir/Bloquear material restrito
-* Exibir informações gerais sobre canais
-* Pesquisar canais
-* Assista a vídeos de um canal
-* Suporte Orbot/Tor (ainda não diretamente)
-* Suporte 1080p/2K/4K
-* Ver histórico
-* Inscreva-se nos canais
-* Procurar histórico
-* Porcurar/Assistir playlists
-* Assistir playlists em fila
-* Vídeos em fila
-* Playlists Local
-* Legenda
-* Suporte a live
-* Mostrar comentários
-
### Serviços Suportados
-O NewPipe suporta vários serviços. Nosso [documentação](https://teamnewpipe.github.io/documentation/) fornecer mais informações sobre como um novo serviço pode ser adicionado ao aplicativo e ao extrator. Por favor, entre em contato conosco se você pretende adicionar um novo. Atualmente, os serviços suportados são:
+Atualmente, os serviços suportados são:
-* YouTube
-* SoundCloud \[beta\]
-* media.ccc.de \[beta\]
-* PeerTube instances \[beta\]
-* Bandcamp \[beta\]
+* YouTube ([site](https://www.youtube.com/)) e YouTube Music ([site](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube))
+* PeerTube ([site](https://joinpeertube.org/)) e todas suas instâncias (abra o site para saber o que isso significa!) ([wiki](https://en.wikipedia.org/wiki/PeerTube))
+* Bandcamp ([site](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp))
+* SoundCloud ([site](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud))
+* media.ccc.de ([site](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club))
-## Atualizações
-Quando uma alteração no código NewPipe (devido à adição de recursos ou fixação de bugs), eventualmente ocorrerá uma versão. Estes estão no formato x.xx.x . A fim de obter esta nova versão, você pode:
- 1. Construa um APK de depuração você mesmo. Esta é a maneira mais rápida de obter novos recursos em seu dispositivo, mas é muito mais complicado, por isso recomendamos usar um dos outros métodos.
- 2. Adicione nosso repo personalizado ao F-Droid e instale-o a partir daí assim que publicarmos um lançamento. As instruções estão aqui.: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/
- 3. Baixe o APK do [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) e instalá-lo assim que publicarmos um lançamento.
- 4. Atualização via F-droid. Este é o método mais lento para obter atualizações, pois o F-Droid deve reconhecer alterações, construir o próprio APK, assiná-lo e, em seguida, enviar a atualização para os usuários.
+Como você pode ver, o NewPipe suporta múltiplos serviços de vídeo e áudio. Embora tenha começado com o YouTube, outras pessoas adicionaram mais serviços ao longo dos anos, tornando o NewPipe cada vez mais versátil!
-Recomendamos o método 2 para a maioria dos usuários. Os APKs instalados usando o método 2 ou 3 são compatíveis entre si, mas não com aqueles instalados usando o método 4. Isso se deve à mesma chave de assinatura (nossa) sendo usada para 2 e 3, mas uma chave de assinatura diferente (F-Droid's) está sendo usada para 4. Construir um APK depuração usando o método 1 exclui totalmente uma chave. Assinar chaves ajudam a garantir que um usuário não seja enganado para instalar uma atualização maliciosa em um aplicativo.
+Parcialmente devido as circustâncias e a sua popularidade, o YouTube tem o melhor suporte em relação a esses serviços. Se você usa ou é familarizado com qualquer um desses serviços, por favor ajude-nos a melhorar o suporte para eles! Estamos procurando mantenedores para o SoundCloud e o PeerTube.
+
+Se você pretende adicionar um novo serviço, por favor entre em contato conosco primeiro! Nossa [documentação](https://teamnewpipe.github.io/documentation/) traz mais informações em como um novo serviço pode ser adicionado ao aplicativo e no [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor).
+
+## Descrição
+
+NewPipe funciona buscando os dados necessários da API oficial (ex. PeerTube) ou do serviço que você está usando. Se a API oficial é restrita (ex. YouTube) para nossos propósitos, ou é proprietária, o aplicativo analisa o site ou usa uma API interna. Isso significa que não é preciso ter uma conta de qualquer serviço para usar o NewPipe.
+
+Também, desde que somos um software livre e de código aberto, nem o aplicativo e nem o Extractor usa qualquer biblioteca ou framework proprietário, como o Google Play Services. Isso significa que você pode usar o NewPipe em dispositivos ou ROMs customizadas em que não tem os aplicativos do Google instalados.
+
+### Recursos
+
+* Assistir vídeos em resoluções de até 4K
+* Escutar o áudio em segundo plano, carregando apenas o fluxo de áudio para salvar dados
+* Modo popup (player flutuante, aka Picture-in-Picture)
+* Assista a transmissões ao vivo
+* Mostrar/esconder legendas/closed captions
+* Buscar vídeos e áudios (no YouTube, você pode especificar o conteúdo da linguagem também)
+* Enfileirar vídeos (e opcionalmente salvar eles como playlists locais)
+* Mostrar/esconder informações gerais sobre os vídeos (como descrições e tags)
+* Mostrar/esconder vídeos próximos/relacionados
+* Mostrar/esconder comentários
+* Buscar vídeos, áudios, canais, playlists e álbuns
+* Navegar vídeos e áudios dentro de um canal
+* Inscrever-se a canais (sim, mesmo se não estiver logado a qualquer conta!)
+* Receba notificações sobre novos vídeos de canais em que você está inscrito
+* Crie e edite grupos de canais (para facilitar a navegação e o gerenciamento)
+* Navege feeds de vídeo gerados a partir dos seus grupos de canais
+* Veja e pesquise seu histórico de vídeos
+* Pesquise e assista playlists (Eles são playlists remotas, o que significa que eles serão obtidos do serviço que você está navegando)
+* Crie e edite playlists locais (Eles são criados e salvos no aplicativo, e não são relacionados com nenhum serviço)
+* Baixe vídeos/áudios/legendas (closed captions)
+* Abra no Kodi
+* Assista/Bloqueie material restrito
+
+## Instalação e atualizações
+Você pode instalar NewPipe com um dos seguintes métodos:
+ 1. Adicione nosso repo personalizado ao F-Droid e instale-o a partir daí. As instruções estão aqui: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/
+ 2. Baixe o APK aqui no [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) e instalá-lo assim que publicarmos um lançamento.
+ 3. Atualização via F-droid. Este é o método mais lento para obter atualizações, pois o F-Droid deve reconhecer alterações, construir o próprio APK, assiná-lo e, em seguida, enviar a atualização para os usuários.
+ 4. Construa um APK de depuração você mesmo. Esta é a maneira mais rápida de obter novos recursos em seu dispositivo, mas é muito mais complicado, por isso recomendamos usar um dos outros métodos.
+ 5. Se você estiver interessado em um recurso específico ou uma correção de bug fornecido em uma solicitação de Pull nesse repositório, pode instalar o APK a partir de lá. Leia a descrição da solicitação para instruções. A grande vantagem dos APKs específicos de S.P é que eles são instalados lado a lado com o aplicativo oficial, então você não precisa se preocupar em perder seus dados ou estragar alguma coisa.
+
+Recomendamos o método 1 para a maioria dos usuários. Os APKs instalados usando o método 1 ou 2 são compatíveis entre si (o que significa que se você instalou o NewPipe usando o método 1 ou 2, você também pode atualizar o NewPipe usando o outro), mas não com aqueles instalados usando o método 3. Isso se deve à mesma chave de assinatura (nossa) sendo usada para 1 e 2, mas uma chave de assinatura diferente (F-Droid's) está sendo usada para 3. Construir um APK depuração usando o método 4 exclui totalmente uma chave. Assinar chaves ajudam a garantir que um usuário não seja enganado para instalar uma atualização maliciosa em um aplicativo. Ao usar o método 5, cada APK é assinado com uma chave aleatória diferente fornecida pelo GitHub Actions, portanto você não pode nem mesmo atualizá-lo. Você terá que fazer backup e restaurar os dados do aplicativo sempre que desejar usar um novo APK.
Enquanto isso, se você quiser trocar de fontes por algum motivo (por exemplo, a funcionalidade principal do NewPipe foi quebrada e o F-Droid ainda não tem a atualização), recomendamos seguir este procedimento:
-1. Faça backup de seus dados através de Configurações > Conteúdo > Exportar Base de Dados para que você mantenha seu histórico, inscrições e playlists
+1. Faça backup de seus dados através de Configurações > Backup e Restauração > Exportar Base de Dados para que você mantenha seu histórico, inscrições e playlists
2. Desinstale o NewPipe
3. Baixe o APK da nova fonte e instale-o
-4. Importe os dados da etapa 1 via Configurações > Conteúdo > Inportar Banco de Dados
+4. Importe os dados da etapa 1 via Configurações > Backup e Restauração > Importar Base de Dados
-## Contribuição
-Se você tem ideias, traduções, alterações de design, limpeza de códigos ou mudanças reais de código, a ajuda é sempre bem-vinda.
-Quanto mais for feito, melhor fica!
-
-Se você quiser se envolver, verifique nossa [notas de contribuição](../.github/CONTRIBUTING.md).
+## Contribuições
+Se você tem ideias, traduções, alterações de design, limpeza de códigos ou mudanças reais de código, a ajuda é sempre bem-vinda. O aplicativo fica cada vez melhor a cada contribuição, não importa quão grande ou pequena! Se você quiser se envolver, verifique nossas [notas de contribuição](.github/CONTRIBUTING.md).
-
+
## Doar
-Se você gosta de NewPipe, ficaríamos felizes com uma doação. Você pode enviar bitcoin ou doar via Bountysource ou Liberapay. Para obter mais informações sobre como doar para a NewPipe, visite nosso [site](https://newpipe.net/donate).
+Se você gosta do NewPipe, pode enivar uma doação. Nós preferimos Liberapay, pois é de código aberto e sem fins lucrativos. Para mais informações sobre como doar para o NewPipe, visite nosso [site](https://newpipe.net/donate).
From 0e8303f13ae9905e20be9471c8b2cf48a2e04758 Mon Sep 17 00:00:00 2001
From: opusforlife2 <53176348+opusforlife2@users.noreply.github.com>
Date: Thu, 25 Jul 2024 14:21:21 +0000
Subject: [PATCH 07/23] Update Matrix room link, and prioritise it (#11350)
* Update Matrix room link, and prioritise it
* Update Matrix room link in CONTRIBUTING.md
* Prioritise Matrix in contribution doc too
---
.github/CONTRIBUTING.md | 6 +++---
.github/ISSUE_TEMPLATE/config.yml | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 70c81c7b1..647cfbabb 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -79,6 +79,6 @@ The [ktlint](https://github.com/pinterest/ktlint) plugin does the same job as ch
## Communication
-* The #newpipe channel on Libera Chat (`ircs://irc.libera.chat:6697/newpipe`) has the core team and other developers in it. [Click here for webchat](https://web.libera.chat/#newpipe)!
-* You can also use a Matrix account to join the NewPipe channel at [#newpipe:libera.chat](https://matrix.to/#/#newpipe:libera.chat). Some convenient clients, available both for phone and desktop, are listed at that link.
-* You can post your suggestions, changes, ideas etc. on either GitHub or IRC.
+* You can use a Matrix account to join the NewPipe channel at [#newpipe:matrix.newpipe-ev.de](https://matrix.to/#/#newpipe:matrix.newpipe-ev.de). Some convenient clients, available both for phone and desktop, are listed at that link.
+* Alternatively, the #newpipe channel on Libera Chat (`ircs://irc.libera.chat:6697/newpipe`) can also be joined, as it is bridged to the Matrix room. [Click here for webchat](https://web.libera.chat/#newpipe)!
+* You can post your suggestions, changes, ideas etc. on either GitHub or Matrix (including via IRC).
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 4721637bf..49ab78c7d 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -3,9 +3,9 @@ contact_links:
- name: ❓ Question
url: https://github.com/TeamNewPipe/NewPipe/discussions/new?category=questions
about: Ask about anything NewPipe-related
+ - name: 💬 Matrix
+ url: https://matrix.to/#/#newpipe:matrix.newpipe-ev.de
+ about: Chat with us via Matrix for quick Q/A
- name: 💬 IRC
url: https://web.libera.chat/#newpipe
about: Chat with us via IRC for quick Q/A
- - name: 💬 Matrix
- url: https://matrix.to/#/#newpipe:libera.chat
- about: Chat with us via Matrix for quick Q/A
From 947ac2826a3e118b932a9e781e0ec752a5882e9b Mon Sep 17 00:00:00 2001
From: Stypox
Date: Thu, 25 Jul 2024 18:37:05 +0200
Subject: [PATCH 08/23] Update NewPipeExtractor to v0.24.2
---
app/build.gradle | 2 +-
.../java/org/schabi/newpipe/error/ReCaptchaActivity.java | 9 +++------
.../newpipe/settings/DownloadSettingsFragment.java | 3 +--
3 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 397a7301e..142a0dba6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -198,7 +198,7 @@ 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:v0.24.1'
+ implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.24.2'
implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0'
/** Checkstyle **/
diff --git a/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java
index 3c14cfe4c..42ef261a1 100644
--- a/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java
@@ -27,8 +27,6 @@ import org.schabi.newpipe.databinding.ActivityRecaptchaBinding;
import org.schabi.newpipe.extractor.utils.Utils;
import org.schabi.newpipe.util.ThemeHelper;
-import java.io.UnsupportedEncodingException;
-
/*
* Created by beneth on 06.12.16.
*
@@ -190,11 +188,10 @@ public class ReCaptchaActivity extends AppCompatActivity {
String abuseCookie = url.substring(abuseStart + 13, abuseEnd);
abuseCookie = Utils.decodeUrlUtf8(abuseCookie);
handleCookies(abuseCookie);
- } catch (UnsupportedEncodingException | StringIndexOutOfBoundsException e) {
+ } catch (IllegalArgumentException | StringIndexOutOfBoundsException e) {
if (MainActivity.DEBUG) {
- e.printStackTrace();
- Log.d(TAG, "handleCookiesFromUrl: invalid google abuse starting at "
- + abuseStart + " and ending at " + abuseEnd + " for url " + url);
+ Log.e(TAG, "handleCookiesFromUrl: invalid google abuse starting at "
+ + abuseStart + " and ending at " + abuseEnd + " for url " + url, e);
}
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java
index 472db6afe..76163b30a 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java
@@ -30,7 +30,6 @@ import org.schabi.newpipe.util.FilePickerActivityHelper;
import java.io.File;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
import java.net.URI;
public class DownloadSettingsFragment extends BasePreferenceFragment {
@@ -125,7 +124,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
try {
rawUri = decodeUrlUtf8(rawUri);
- } catch (final UnsupportedEncodingException e) {
+ } catch (final IllegalArgumentException e) {
// nothing to do
}
From 56b62413117f3d7ca8a46dc7c326b35f16e512b4 Mon Sep 17 00:00:00 2001
From: Stypox
Date: Thu, 25 Jul 2024 18:43:03 +0200
Subject: [PATCH 09/23] Hotfix release v0.27.2 (999)
---
app/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 142a0dba6..5706f1c4b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -20,8 +20,8 @@ android {
resValue "string", "app_name", "NewPipe"
minSdk 21
targetSdk 33
- versionCode 998
- versionName "0.27.1"
+ versionCode 999
+ versionName "0.27.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
From 03a6b5c7b9ab1236d42ad2ee7fe953309ee210fd Mon Sep 17 00:00:00 2001
From: Stypox
Date: Thu, 11 Jul 2024 23:39:53 +0200
Subject: [PATCH 10/23] Add changelogs for hotfix release v0.27.2 (999)
---
fastlane/metadata/android/ar/changelogs/999.txt | 1 +
fastlane/metadata/android/az/changelogs/999.txt | 1 +
fastlane/metadata/android/cs/changelogs/999.txt | 1 +
fastlane/metadata/android/de/changelogs/999.txt | 1 +
fastlane/metadata/android/en-US/changelogs/999.txt | 12 ++++++++++++
fastlane/metadata/android/es/changelogs/999.txt | 1 +
fastlane/metadata/android/fa/changelogs/999.txt | 1 +
fastlane/metadata/android/fr/changelogs/999.txt | 1 +
fastlane/metadata/android/he/changelogs/999.txt | 1 +
fastlane/metadata/android/hi/changelogs/999.txt | 1 +
fastlane/metadata/android/id/changelogs/999.txt | 1 +
fastlane/metadata/android/it/changelogs/999.txt | 12 ++++++++++++
fastlane/metadata/android/ka/changelogs/999.txt | 1 +
fastlane/metadata/android/nl/changelogs/999.txt | 1 +
fastlane/metadata/android/pa/changelogs/999.txt | 1 +
fastlane/metadata/android/pt-BR/changelogs/999.txt | 1 +
fastlane/metadata/android/pt-PT/changelogs/999.txt | 1 +
fastlane/metadata/android/pt/changelogs/999.txt | 1 +
fastlane/metadata/android/ru/changelogs/999.txt | 1 +
fastlane/metadata/android/sv/changelogs/999.txt | 1 +
fastlane/metadata/android/tr/changelogs/999.txt | 1 +
fastlane/metadata/android/uk/changelogs/999.txt | 1 +
fastlane/metadata/android/vi/changelogs/999.txt | 1 +
fastlane/metadata/android/zh-Hans/changelogs/999.txt | 1 +
fastlane/metadata/android/zh-Hant/changelogs/999.txt | 1 +
.../metadata/android/zh_Hant_HK/changelogs/999.txt | 1 +
26 files changed, 48 insertions(+)
create mode 100644 fastlane/metadata/android/ar/changelogs/999.txt
create mode 100644 fastlane/metadata/android/az/changelogs/999.txt
create mode 100644 fastlane/metadata/android/cs/changelogs/999.txt
create mode 100644 fastlane/metadata/android/de/changelogs/999.txt
create mode 100644 fastlane/metadata/android/en-US/changelogs/999.txt
create mode 100644 fastlane/metadata/android/es/changelogs/999.txt
create mode 100644 fastlane/metadata/android/fa/changelogs/999.txt
create mode 100644 fastlane/metadata/android/fr/changelogs/999.txt
create mode 100644 fastlane/metadata/android/he/changelogs/999.txt
create mode 100644 fastlane/metadata/android/hi/changelogs/999.txt
create mode 100644 fastlane/metadata/android/id/changelogs/999.txt
create mode 100644 fastlane/metadata/android/it/changelogs/999.txt
create mode 100644 fastlane/metadata/android/ka/changelogs/999.txt
create mode 100644 fastlane/metadata/android/nl/changelogs/999.txt
create mode 100644 fastlane/metadata/android/pa/changelogs/999.txt
create mode 100644 fastlane/metadata/android/pt-BR/changelogs/999.txt
create mode 100644 fastlane/metadata/android/pt-PT/changelogs/999.txt
create mode 100644 fastlane/metadata/android/pt/changelogs/999.txt
create mode 100644 fastlane/metadata/android/ru/changelogs/999.txt
create mode 100644 fastlane/metadata/android/sv/changelogs/999.txt
create mode 100644 fastlane/metadata/android/tr/changelogs/999.txt
create mode 100644 fastlane/metadata/android/uk/changelogs/999.txt
create mode 100644 fastlane/metadata/android/vi/changelogs/999.txt
create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/999.txt
create mode 100644 fastlane/metadata/android/zh-Hant/changelogs/999.txt
create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/999.txt
diff --git a/fastlane/metadata/android/ar/changelogs/999.txt b/fastlane/metadata/android/ar/changelogs/999.txt
new file mode 100644
index 000000000..562f16944
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/999.txt
@@ -0,0 +1 @@
+تم إصلاح YouTube الذي لا يقوم بتشغيل أي دفق
diff --git a/fastlane/metadata/android/az/changelogs/999.txt b/fastlane/metadata/android/az/changelogs/999.txt
new file mode 100644
index 000000000..16a2e1013
--- /dev/null
+++ b/fastlane/metadata/android/az/changelogs/999.txt
@@ -0,0 +1 @@
+YouTube-un heç bir yayım oynatmaması düzəldildi
diff --git a/fastlane/metadata/android/cs/changelogs/999.txt b/fastlane/metadata/android/cs/changelogs/999.txt
new file mode 100644
index 000000000..7035a1112
--- /dev/null
+++ b/fastlane/metadata/android/cs/changelogs/999.txt
@@ -0,0 +1 @@
+Opraveno nepřehrávání jakéhokoli streamu ve službě YouTube
diff --git a/fastlane/metadata/android/de/changelogs/999.txt b/fastlane/metadata/android/de/changelogs/999.txt
new file mode 100644
index 000000000..43623578f
--- /dev/null
+++ b/fastlane/metadata/android/de/changelogs/999.txt
@@ -0,0 +1 @@
+Behoben, dass YouTube keinen Stream abspielte
diff --git a/fastlane/metadata/android/en-US/changelogs/999.txt b/fastlane/metadata/android/en-US/changelogs/999.txt
new file mode 100644
index 000000000..c089ed197
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/999.txt
@@ -0,0 +1,12 @@
+This hotfix release fixes HTTP 403 errors in the middle of YouTube videos.
+
+New
+• [SoundCloud] Add support for on.soundcloud.com URLs
+
+Improved
+• [Bandcamp] Show additional info in radio kiosk
+
+Fixed
+• [YouTube] Fix occasional HTTP 403 errors at the beginning or in the middle of videos
+• [YouTube] Extract avatar and banner from more channel header types
+• [Bandcamp] Fix various bugs and always use HTTPS
diff --git a/fastlane/metadata/android/es/changelogs/999.txt b/fastlane/metadata/android/es/changelogs/999.txt
new file mode 100644
index 000000000..80b4efa55
--- /dev/null
+++ b/fastlane/metadata/android/es/changelogs/999.txt
@@ -0,0 +1 @@
+Arreglo en YouTube no reproduciendo flujos
diff --git a/fastlane/metadata/android/fa/changelogs/999.txt b/fastlane/metadata/android/fa/changelogs/999.txt
new file mode 100644
index 000000000..ba5413d49
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/999.txt
@@ -0,0 +1 @@
+مشکل عدم نمایش پخشزنده برطرف شد
diff --git a/fastlane/metadata/android/fr/changelogs/999.txt b/fastlane/metadata/android/fr/changelogs/999.txt
new file mode 100644
index 000000000..3ad3bf279
--- /dev/null
+++ b/fastlane/metadata/android/fr/changelogs/999.txt
@@ -0,0 +1 @@
+Correction de YouTube qui ne lisait aucun média
diff --git a/fastlane/metadata/android/he/changelogs/999.txt b/fastlane/metadata/android/he/changelogs/999.txt
new file mode 100644
index 000000000..50731171e
--- /dev/null
+++ b/fastlane/metadata/android/he/changelogs/999.txt
@@ -0,0 +1 @@
+תוקנה התקלה ש־YouTube לא מנגן אף תזרים
diff --git a/fastlane/metadata/android/hi/changelogs/999.txt b/fastlane/metadata/android/hi/changelogs/999.txt
new file mode 100644
index 000000000..071ab64e3
--- /dev/null
+++ b/fastlane/metadata/android/hi/changelogs/999.txt
@@ -0,0 +1 @@
+फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है
diff --git a/fastlane/metadata/android/id/changelogs/999.txt b/fastlane/metadata/android/id/changelogs/999.txt
new file mode 100644
index 000000000..d3fea84ab
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/999.txt
@@ -0,0 +1 @@
+Memperbaiki YouTube yang tidak memutar streaming apa pun
diff --git a/fastlane/metadata/android/it/changelogs/999.txt b/fastlane/metadata/android/it/changelogs/999.txt
new file mode 100644
index 000000000..c2652da28
--- /dev/null
+++ b/fastlane/metadata/android/it/changelogs/999.txt
@@ -0,0 +1,12 @@
+Questo aggiornamento hotfix risolve gli errori HTTP 403 nel mezzo dei video di YouTube.
+
+Novità
+• [SoundCloud] Aggiunto il supporto per gli URL on.soundcloud.com
+
+Migliorie
+• [Bandcamp] Mostra informazioni aggiuntive nel chiosco della radio
+
+Correzioni
+• [YouTube] Corretti errori HTTP 403 occasionali all'inizio o nel mezzo dei video
+• [YouTube] Estrazione avatar e banner da più tipi di canali
+• [Bandcamp] Risolti vari bug e forzato l'uso di HTTPS
diff --git a/fastlane/metadata/android/ka/changelogs/999.txt b/fastlane/metadata/android/ka/changelogs/999.txt
new file mode 100644
index 000000000..d20512f17
--- /dev/null
+++ b/fastlane/metadata/android/ka/changelogs/999.txt
@@ -0,0 +1 @@
+გაასწორა YouTube არ უკრავს არცერთ ნაკადს
diff --git a/fastlane/metadata/android/nl/changelogs/999.txt b/fastlane/metadata/android/nl/changelogs/999.txt
new file mode 100644
index 000000000..9bd8adf86
--- /dev/null
+++ b/fastlane/metadata/android/nl/changelogs/999.txt
@@ -0,0 +1 @@
+YouTube speelt geen stream af opgelost
diff --git a/fastlane/metadata/android/pa/changelogs/999.txt b/fastlane/metadata/android/pa/changelogs/999.txt
new file mode 100644
index 000000000..fe62a1330
--- /dev/null
+++ b/fastlane/metadata/android/pa/changelogs/999.txt
@@ -0,0 +1 @@
+ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ
diff --git a/fastlane/metadata/android/pt-BR/changelogs/999.txt b/fastlane/metadata/android/pt-BR/changelogs/999.txt
new file mode 100644
index 000000000..59fc6a5cd
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/999.txt
@@ -0,0 +1 @@
+Corrigido YouTube não reproduzir qualquer transmissão
diff --git a/fastlane/metadata/android/pt-PT/changelogs/999.txt b/fastlane/metadata/android/pt-PT/changelogs/999.txt
new file mode 100644
index 000000000..93519d64d
--- /dev/null
+++ b/fastlane/metadata/android/pt-PT/changelogs/999.txt
@@ -0,0 +1 @@
+Corrigido YouTube não reproduzir nenhuma transmissão
diff --git a/fastlane/metadata/android/pt/changelogs/999.txt b/fastlane/metadata/android/pt/changelogs/999.txt
new file mode 100644
index 000000000..93519d64d
--- /dev/null
+++ b/fastlane/metadata/android/pt/changelogs/999.txt
@@ -0,0 +1 @@
+Corrigido YouTube não reproduzir nenhuma transmissão
diff --git a/fastlane/metadata/android/ru/changelogs/999.txt b/fastlane/metadata/android/ru/changelogs/999.txt
new file mode 100644
index 000000000..d3978869d
--- /dev/null
+++ b/fastlane/metadata/android/ru/changelogs/999.txt
@@ -0,0 +1 @@
+Исправлено: YouTube не воспроизводил никакие потоки
diff --git a/fastlane/metadata/android/sv/changelogs/999.txt b/fastlane/metadata/android/sv/changelogs/999.txt
new file mode 100644
index 000000000..35f298dbf
--- /dev/null
+++ b/fastlane/metadata/android/sv/changelogs/999.txt
@@ -0,0 +1 @@
+Åtgärdat att YouTube inte spelar någon stream
diff --git a/fastlane/metadata/android/tr/changelogs/999.txt b/fastlane/metadata/android/tr/changelogs/999.txt
new file mode 100644
index 000000000..e5979c68d
--- /dev/null
+++ b/fastlane/metadata/android/tr/changelogs/999.txt
@@ -0,0 +1 @@
+YouTube'un herhangi bir akışı oynatmaması düzeltildi
diff --git a/fastlane/metadata/android/uk/changelogs/999.txt b/fastlane/metadata/android/uk/changelogs/999.txt
new file mode 100644
index 000000000..905287c74
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/999.txt
@@ -0,0 +1 @@
+Виправлено проблему невідтворюваності трансляцій
diff --git a/fastlane/metadata/android/vi/changelogs/999.txt b/fastlane/metadata/android/vi/changelogs/999.txt
new file mode 100644
index 000000000..d2086b62c
--- /dev/null
+++ b/fastlane/metadata/android/vi/changelogs/999.txt
@@ -0,0 +1 @@
+Đã sửa lỗi YouTube không phát bất kỳ luồng nào
diff --git a/fastlane/metadata/android/zh-Hans/changelogs/999.txt b/fastlane/metadata/android/zh-Hans/changelogs/999.txt
new file mode 100644
index 000000000..8a5424c9e
--- /dev/null
+++ b/fastlane/metadata/android/zh-Hans/changelogs/999.txt
@@ -0,0 +1 @@
+修复YouTube无法播放任何视频
diff --git a/fastlane/metadata/android/zh-Hant/changelogs/999.txt b/fastlane/metadata/android/zh-Hant/changelogs/999.txt
new file mode 100644
index 000000000..4e8bf6537
--- /dev/null
+++ b/fastlane/metadata/android/zh-Hant/changelogs/999.txt
@@ -0,0 +1 @@
+修正 YouTube 無法播放任何串流
diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/999.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/999.txt
new file mode 100644
index 000000000..9a4721551
--- /dev/null
+++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/999.txt
@@ -0,0 +1 @@
+修正咗 YouTube 乜嘢實況串流都播唔到嘅問題
From dbcb721dc21429c25aa164afb98dc3b91e19672b Mon Sep 17 00:00:00 2001
From: Stypox
Date: Thu, 25 Jul 2024 20:56:16 +0200
Subject: [PATCH 11/23] Don't warn about rhino class in proguard
Likely related to https://github.com/mozilla/rhino/commit/01a7b20655602f7e2df59af744b47b77f678b6cf but I am not completely sure.
I tested the app and it works well, so I think that org.mozilla.javascript.JavaToJSONConverters is not used really.
This is the full list of errors:
Missing class java.beans.BeanDescriptor (referenced from: java.lang.Object org.mozilla.javascript.JavaToJSONConverters.lambda$static$4(java.lang.Object))
Missing class java.beans.BeanInfo (referenced from: java.lang.Object org.mozilla.javascript.JavaToJSONConverters.lambda$static$4(java.lang.Object))
Missing class java.beans.IntrospectionException (referenced from: java.lang.Object org.mozilla.javascript.JavaToJSONConverters.lambda$static$4(java.lang.Object))
Missing class java.beans.Introspector (referenced from: java.lang.Object org.mozilla.javascript.JavaToJSONConverters.lambda$static$4(java.lang.Object))
Missing class java.beans.PropertyDescriptor (referenced from: java.lang.Object org.mozilla.javascript.JavaToJSONConverters.lambda$static$4(java.lang.Object))
---
app/build.gradle | 3 +++
app/proguard-rules.pro | 1 +
2 files changed, 4 insertions(+)
diff --git a/app/build.gradle b/app/build.gradle
index 5706f1c4b..35cb8509e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -56,6 +56,9 @@ android {
resValue "string", "app_name", "NewPipe " + System.getProperty('packageSuffix')
archivesBaseName = 'NewPipe_' + System.getProperty('packageSuffix')
}
+ applicationIdSuffix ".whatever"
+ resValue "string", "app_name", "NewPipe whatever"
+ archivesBaseName = 'NewPipe_whatever'
minifyEnabled true
shrinkResources false // disabled to fix F-Droid's reproducible build
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index d21f33e1f..435c4e29b 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -7,6 +7,7 @@
-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }
-keep class org.mozilla.javascript.** { *; }
-keep class org.mozilla.classfile.ClassFileWriter
+-dontwarn org.mozilla.javascript.JavaToJSONConverters
-dontwarn org.mozilla.javascript.tools.**
## Rules for ExoPlayer
From d442b458361b002ab90d9608db223203601ee2cc Mon Sep 17 00:00:00 2001
From: Stypox
Date: Thu, 25 Jul 2024 20:58:29 +0200
Subject: [PATCH 12/23] Remove code committed accidentally
---
app/build.gradle | 3 ---
1 file changed, 3 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 35cb8509e..5706f1c4b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -56,9 +56,6 @@ android {
resValue "string", "app_name", "NewPipe " + System.getProperty('packageSuffix')
archivesBaseName = 'NewPipe_' + System.getProperty('packageSuffix')
}
- applicationIdSuffix ".whatever"
- resValue "string", "app_name", "NewPipe whatever"
- archivesBaseName = 'NewPipe_whatever'
minifyEnabled true
shrinkResources false // disabled to fix F-Droid's reproducible build
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
From 38c823a042ee3ca880b15d79095087a89d66f627 Mon Sep 17 00:00:00 2001
From: TwoAi
Date: Sat, 10 Aug 2024 15:42:35 -0400
Subject: [PATCH 13/23] Remove outdated returnActivity test code
returnActivity was removed in 463dd8e
---
.../schabi/newpipe/error/ErrorActivity.java | 22 ------------
.../newpipe/error/ErrorActivityTest.java | 35 -------------------
2 files changed, 57 deletions(-)
delete mode 100644 app/src/test/java/org/schabi/newpipe/error/ErrorActivityTest.java
diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java
index 831a8cc4b..2f607b487 100644
--- a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java
@@ -2,7 +2,6 @@ package org.schabi.newpipe.error;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
-import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
@@ -13,7 +12,6 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
-import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
@@ -22,7 +20,6 @@ import androidx.core.content.IntentCompat;
import com.grack.nanojson.JsonWriter;
import org.schabi.newpipe.BuildConfig;
-import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.ActivityErrorBinding;
import org.schabi.newpipe.util.Localization;
@@ -187,25 +184,6 @@ public class ErrorActivity extends AppCompatActivity {
.collect(Collectors.joining(separator + "\n", separator + "\n", separator));
}
- /**
- * Get the checked activity.
- *
- * @param returnActivity the activity to return to
- * @return the casted return activity or null
- */
- @Nullable
- static Class extends Activity> getReturnActivity(final Class> returnActivity) {
- Class extends Activity> checkedReturnActivity = null;
- if (returnActivity != null) {
- if (Activity.class.isAssignableFrom(returnActivity)) {
- checkedReturnActivity = returnActivity.asSubclass(Activity.class);
- } else {
- checkedReturnActivity = MainActivity.class;
- }
- }
- return checkedReturnActivity;
- }
-
private void buildInfo(final ErrorInfo info) {
String text = "";
diff --git a/app/src/test/java/org/schabi/newpipe/error/ErrorActivityTest.java b/app/src/test/java/org/schabi/newpipe/error/ErrorActivityTest.java
deleted file mode 100644
index f77c7b268..000000000
--- a/app/src/test/java/org/schabi/newpipe/error/ErrorActivityTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.schabi.newpipe.error;
-
-import android.app.Activity;
-
-import org.junit.Test;
-import org.schabi.newpipe.MainActivity;
-import org.schabi.newpipe.RouterActivity;
-import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-/**
- * Unit tests for {@link ErrorActivity}.
- */
-public class ErrorActivityTest {
- @Test
- public void getReturnActivity() {
- Class extends Activity> returnActivity;
- returnActivity = ErrorActivity.getReturnActivity(MainActivity.class);
- assertEquals(MainActivity.class, returnActivity);
-
- returnActivity = ErrorActivity.getReturnActivity(RouterActivity.class);
- assertEquals(RouterActivity.class, returnActivity);
-
- returnActivity = ErrorActivity.getReturnActivity(null);
- assertNull(returnActivity);
-
- returnActivity = ErrorActivity.getReturnActivity(Integer.class);
- assertEquals(MainActivity.class, returnActivity);
-
- returnActivity = ErrorActivity.getReturnActivity(VideoDetailFragment.class);
- assertEquals(MainActivity.class, returnActivity);
- }
-}
From 035c394cf6704c0af9077c01ebfa55b810d02140 Mon Sep 17 00:00:00 2001
From: Mihael_River <154642338+Stackoverflow-addict@users.noreply.github.com>
Date: Fri, 30 Aug 2024 16:32:42 +0200
Subject: [PATCH 14/23] Fixing the 404 page not found, when clicking on
"contribution notes" in multiple README.md's translated into different
languages (#11487)
Link to contribution notes wasn't working
* Update README.de.md, fix grammar in README.de.md
* Update README.asm.md
* Update README.fr.md
* Update README.hi.md
* Update README.it.md
* Update README.pa.md
* Update README.pt_BR.md
* Update README.ru.md
* Update README.sr.md
---------
Co-authored-by: Tobi
---
doc/README.asm.md | 2 +-
doc/README.de.md | 2 +-
doc/README.fr.md | 2 +-
doc/README.hi.md | 2 +-
doc/README.it.md | 2 +-
doc/README.pa.md | 2 +-
doc/README.pt_BR.md | 2 +-
doc/README.ru.md | 2 +-
doc/README.sr.md | 2 +-
9 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/doc/README.asm.md b/doc/README.asm.md
index 2a7c10f51..370319c15 100644
--- a/doc/README.asm.md
+++ b/doc/README.asm.md
@@ -106,7 +106,7 @@ NewPipe এ আপুনি ব্যৱহাৰ কৰা সেৱাৰ অ
## অৱদান
-আপোনাৰ ধাৰণা, অনুবাদ, ডিজাইন পৰিবৰ্তন, ক'ড পৰিষ্কাৰ কৰা, বা আনকি ডাঙৰ ক'ড পৰিৱৰ্তন হওক, সহায় সদায় আদৰণীয়। প্ৰতিটো অৱদানৰ লগে লগে এপটো ভাল হৈ পৰে, যিমানেই ডাঙৰ বা সৰু নহওক কিয়! যদি আপুনি জড়িত হ'ব বিচাৰে তেন্তে চাওক আমাৰ [অবদানৰ টোকা সমূহ](.github/CONTRIBUTING.md).
+আপোনাৰ ধাৰণা, অনুবাদ, ডিজাইন পৰিবৰ্তন, ক'ড পৰিষ্কাৰ কৰা, বা আনকি ডাঙৰ ক'ড পৰিৱৰ্তন হওক, সহায় সদায় আদৰণীয়। প্ৰতিটো অৱদানৰ লগে লগে এপটো ভাল হৈ পৰে, যিমানেই ডাঙৰ বা সৰু নহওক কিয়! যদি আপুনি জড়িত হ'ব বিচাৰে তেন্তে চাওক আমাৰ [অবদানৰ টোকা সমূহ](/.github/CONTRIBUTING.md).
## অনুদান
diff --git a/doc/README.de.md b/doc/README.de.md
index e269da05c..be7744332 100644
--- a/doc/README.de.md
+++ b/doc/README.de.md
@@ -126,7 +126,7 @@ So eine Aktion wird nicht unterstützt und du solltest sie nur in Erwägung zieh
## Beitrag
Egal ob du neue Ideen, Übersetzungen, Designvorschläge, kleine Code-Bereinigungen, oder sogar große Code-Verbesserungen hast, jegliche Unterstützung ist immer gern gesehen.
Die App wird mit _jedem_ Beitrag besser und besser - egal wie viel Arbeit in ihn gesteckt wird!
-Wenn du dich einbringen willst, sehe dir die [Beitragshinweise](.github/CONTRIBUTING.md) an.
+Wenn du dich einbringen willst, sieh dir die [Beitragshinweise](/.github/CONTRIBUTING.md) an.
diff --git a/doc/README.fr.md b/doc/README.fr.md
index 7d4673b69..864cc927a 100644
--- a/doc/README.fr.md
+++ b/doc/README.fr.md
@@ -109,7 +109,7 @@ Entre temps, si vous voulez changer de source pour une raison quelconque (par ex
## Contribuer
-Que vous ayez des idées, des traductions, des changements de design, du nettoyage de code, ou encore un changement de code majeur, toute aide est la bienvenue. L'app s'améliore un peu plus à chaque contribution, peu importe qu'elle soit grosse ou petite ! Si vous aimeriez être impliqué, jetez un coup d'oeil à nos [notes pour contribuer](.github/CONTRIBUTING.md).
+Que vous ayez des idées, des traductions, des changements de design, du nettoyage de code, ou encore un changement de code majeur, toute aide est la bienvenue. L'app s'améliore un peu plus à chaque contribution, peu importe qu'elle soit grosse ou petite ! Si vous aimeriez être impliqué, jetez un coup d'oeil à nos [notes pour contribuer](/.github/CONTRIBUTING.md).
diff --git a/doc/README.hi.md b/doc/README.hi.md
index 282e75420..d503f43a5 100644
--- a/doc/README.hi.md
+++ b/doc/README.hi.md
@@ -105,7 +105,7 @@ NewPipe पर कई सेवाएँ उपलब्ध हैं। हम
चाहे आप अपने विचार जोड़ना चाहे, या अनुवाद, डिज़ाइन में बदलाव, कोड में सफ़ाई, या कोड में भारी बदलाव, सहायता ज़रूर करें।
जितने योगदान हो, ऐप उतनी ही बेहतर होती जाती है!
-अगर आप योगदान करना चाहते हैं, हमारे [योगदान के दिशानिर्देश](.github/CONTRIBUTING.md) देखें।
+अगर आप योगदान करना चाहते हैं, हमारे [योगदान के दिशानिर्देश](/.github/CONTRIBUTING.md) देखें।
diff --git a/doc/README.it.md b/doc/README.it.md
index 55ae12380..8bf1eb380 100644
--- a/doc/README.it.md
+++ b/doc/README.it.md
@@ -107,7 +107,7 @@ Nel frattempo, se vuoi cambiare fonte per la stessa ragione (ad es. la funzional
## Contribuire
-Se hai idee, traduzioni, cambiamenti di *design*, pulizia di codice, o addirittura grossi cambiamenti di codice, l'aiuto è sempre apprezzato. L'app diventa sempre meglio con ogni contribuzione, non importa quanto grande o piccola essa sia! Se ti piacerebbe essere parte del progetto, vedi le nostre [note di contribuzione](.github/CONTRIBUTING.md).
+Se hai idee, traduzioni, cambiamenti di *design*, pulizia di codice, o addirittura grossi cambiamenti di codice, l'aiuto è sempre apprezzato. L'app diventa sempre meglio con ogni contribuzione, non importa quanto grande o piccola essa sia! Se ti piacerebbe essere parte del progetto, vedi le nostre [note di contribuzione](/.github/CONTRIBUTING.md).
diff --git a/doc/README.pa.md b/doc/README.pa.md
index 321e6b7d0..0ad5e0625 100644
--- a/doc/README.pa.md
+++ b/doc/README.pa.md
@@ -105,7 +105,7 @@ NewPipe ਤੁਹਾਡੇ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਰਹੀ ਸੇ
ਨੋਟ: ਜਦੋਂ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਵਿੱਚ ਇੱਕ ਡੇਟਾਬੇਸ ਨੂੰ ਆਯਾਤ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਹਮੇਸ਼ਾਂ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਇਹ ਉਹੀ ਹੈ ਜੋ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਤੋਂ ਨਿਰਯਾਤ ਕੀਤਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਤੋਂ ਇਲਾਵਾ ਕਿਸੇ ਏਪੀਕੇ ਤੋਂ ਨਿਰਯਾਤ ਕੀਤੇ ਡੇਟਾਬੇਸ ਨੂੰ ਆਯਾਤ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਹ ਚੀਜ਼ਾਂ ਨੂੰ ਤੋੜ ਸਕਦਾ ਹੈ। ਅਜਿਹੀ ਕਾਰਵਾਈ ਅਸਮਰਥਿਤ ਹੈ, ਅਤੇ ਤੁਹਾਨੂੰ ਅਜਿਹਾ ਉਦੋਂ ਹੀ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਯਕੀਨ ਹੋਵੇ ਕਿ ਤੁਸੀਂ ਜਾਣਦੇ ਹੋ ਕਿ ਤੁਸੀਂ ਕੀ ਕਰ ਰਹੇ ਹੋ।
## ਯੋਗਦਾਨ
-ਭਾਵੇਂ ਤੁਹਾਡੇ ਕੋਲ ਵਿਚਾਰ, ਅਨੁਵਾਦ, ਡਿਜ਼ਾਈਨ ਤਬਦੀਲੀਆਂ, ਕੋਡ ਦੀ ਸਫਾਈ, ਜਾਂ ਇੱਥੋਂ ਤੱਕ ਕਿ ਵੱਡੀਆਂ ਕੋਡ ਤਬਦੀਲੀਆਂ ਹੋਣ, ਮਦਦ ਦਾ ਹਮੇਸ਼ਾ ਸਵਾਗਤ ਹੈ। ਐਪ ਹਰੇਕ ਯੋਗਦਾਨ ਦੇ ਨਾਲ ਬਿਹਤਰ ਅਤੇ ਬਿਹਤਰ ਹੋ ਜਾਂਦੀ ਹੈ, ਚਾਹੇ ਉਹ ਕਿੰਨਾ ਵੱਡਾ ਜਾਂ ਛੋਟਾ ਹੋਵੇ! ਜੇਕਰ ਤੁਸੀਂ ਸ਼ਾਮਲ ਹੋਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਸਾਡੀ ਜਾਂਚ ਕਰੋ [contribution notes](.github/CONTRIBUTING.md).
+ਭਾਵੇਂ ਤੁਹਾਡੇ ਕੋਲ ਵਿਚਾਰ, ਅਨੁਵਾਦ, ਡਿਜ਼ਾਈਨ ਤਬਦੀਲੀਆਂ, ਕੋਡ ਦੀ ਸਫਾਈ, ਜਾਂ ਇੱਥੋਂ ਤੱਕ ਕਿ ਵੱਡੀਆਂ ਕੋਡ ਤਬਦੀਲੀਆਂ ਹੋਣ, ਮਦਦ ਦਾ ਹਮੇਸ਼ਾ ਸਵਾਗਤ ਹੈ। ਐਪ ਹਰੇਕ ਯੋਗਦਾਨ ਦੇ ਨਾਲ ਬਿਹਤਰ ਅਤੇ ਬਿਹਤਰ ਹੋ ਜਾਂਦੀ ਹੈ, ਚਾਹੇ ਉਹ ਕਿੰਨਾ ਵੱਡਾ ਜਾਂ ਛੋਟਾ ਹੋਵੇ! ਜੇਕਰ ਤੁਸੀਂ ਸ਼ਾਮਲ ਹੋਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਸਾਡੀ ਜਾਂਚ ਕਰੋ [contribution notes](/.github/CONTRIBUTING.md).
diff --git a/doc/README.pt_BR.md b/doc/README.pt_BR.md
index 59ff65db3..73489bb41 100644
--- a/doc/README.pt_BR.md
+++ b/doc/README.pt_BR.md
@@ -106,7 +106,7 @@ Enquanto isso, se você quiser trocar de fontes por algum motivo (por exemplo, a
4. Importe os dados da etapa 1 via Configurações > Backup e Restauração > Importar Base de Dados
## Contribuições
-Se você tem ideias, traduções, alterações de design, limpeza de códigos ou mudanças reais de código, a ajuda é sempre bem-vinda. O aplicativo fica cada vez melhor a cada contribuição, não importa quão grande ou pequena! Se você quiser se envolver, verifique nossas [notas de contribuição](.github/CONTRIBUTING.md).
+Se você tem ideias, traduções, alterações de design, limpeza de códigos ou mudanças reais de código, a ajuda é sempre bem-vinda. O aplicativo fica cada vez melhor a cada contribuição, não importa quão grande ou pequena! Se você quiser se envolver, verifique nossas [notas de contribuição](/.github/CONTRIBUTING.md).
diff --git a/doc/README.ru.md b/doc/README.ru.md
index 35058c981..35867b8bf 100644
--- a/doc/README.ru.md
+++ b/doc/README.ru.md
@@ -106,7 +106,7 @@ NewPipe работает, извлекая необходимые данные
Примечание: когда вы импортируете базу данных в официальное приложение, убедитесь, что это именно та база данных, которую вы экспортировали _из_ официального приложения. Если вы импортируете базу данных, экспортированную из APK, отличного от официального приложения, это может привести к ошибке. Такое действие не поддерживается, и вы должны делать его только тогда, когда абсолютно уверены, что знаете, что делаете.
## Участие
-Если у вас есть идеи, переводы, изменения дизайна, очистка кода или даже серьезные изменения кода, помощь всегда приветствуется. Приложение становится всё лучше и лучше с каждым вкладом, независимо от того, большой он или маленький! Если вы хотите принять участие, ознакомьтесь с нашими [заметками об участии](.github/CONTRIBUTING.md).
+Если у вас есть идеи, переводы, изменения дизайна, очистка кода или даже серьезные изменения кода, помощь всегда приветствуется. Приложение становится всё лучше и лучше с каждым вкладом, независимо от того, большой он или маленький! Если вы хотите принять участие, ознакомьтесь с нашими [заметками об участии](/.github/CONTRIBUTING.md).
diff --git a/doc/README.sr.md b/doc/README.sr.md
index 7f0ee65b7..60a21ce69 100644
--- a/doc/README.sr.md
+++ b/doc/README.sr.md
@@ -104,7 +104,7 @@ NewPipe ради тако што преузима потребне податк
Напомена: када увозите базу података у званичну апликацију, увек се уверите да је то она коју сте извезли _из_ званичне апликације. Ако увезете базу података извезену из APK-а, који није званична апликација, то може покварити ствари. Таква радња није подржана и требало би да то урадите само када сте потпуно сигурни да знате шта радите.
## Допринос
-Без обзира да ли имате идеје, преводе, промене дизајна, чишћење кода или чак велике промене кода, помоћ је увек добродошла. Апликација постаје све боља и боља са сваким доприносом, без обзира колико је он велики или мали! Ако желите да се укључите, погледајте наше [напомене о доприносима](.github/CONTRIBUTING.md).
+Без обзира да ли имате идеје, преводе, промене дизајна, чишћење кода или чак велике промене кода, помоћ је увек добродошла. Апликација постаје све боља и боља са сваким доприносом, без обзира колико је он велики или мали! Ако желите да се укључите, погледајте наше [напомене о доприносима](/.github/CONTRIBUTING.md).
From b399030e19c8ce41e4bddc0e06460f6087de2f16 Mon Sep 17 00:00:00 2001
From: Siddhesh Naik <87667048+snaik20@users.noreply.github.com>
Date: Tue, 22 Oct 2024 00:47:26 +0530
Subject: [PATCH 15/23] Settings redesign debug page (#10876)
Initial Work for Settings Page with Jetpack Compose
- Implemented a new settings page using Jetpack Compose.
- Added a new settings option to enable the redesigned settings page.
- This option allows for gradual integration and testing of the new
settings page, minimizing disruptions to current functionality.
Plan for Settings Items:
- Jetpack Compose does not have a direct equivalent to the
Preference/settings library.
- We could consider using third-party libraries that offer preference
items as composables.
- However, these libraries may be incomplete or lack active development.
- Given our specific needs for only a subset of preference types,
creating custom composables would be beneficial.
- This approach allows for fine-tuning the components to our specific
use case.
---
app/build.gradle | 32 +++++--
app/src/main/AndroidManifest.xml | 5 ++
app/src/main/java/org/schabi/newpipe/App.java | 2 +
.../main/java/org/schabi/newpipe/AppModule.kt | 22 +++++
.../schabi/newpipe/settings/DebugScreen.kt | 27 ++++++
.../schabi/newpipe/settings/SettingsScreen.kt | 23 +++++
.../newpipe/settings/SettingsV2Activity.kt | 85 +++++++++++++++++++
.../settings/viewmodel/SettingsViewModel.kt | 39 +++++++++
.../org/schabi/newpipe/ui/SwitchPreference.kt | 53 ++++++++++++
.../org/schabi/newpipe/ui/TextPreference.kt | 66 ++++++++++++++
.../schabi/newpipe/util/NavigationHelper.java | 10 ++-
app/src/main/res/values/settings_keys.xml | 1 +
app/src/main/res/values/strings.xml | 1 +
app/src/main/res/xml/debug_settings.xml | 7 ++
build.gradle | 1 +
15 files changed, 364 insertions(+), 10 deletions(-)
create mode 100644 app/src/main/java/org/schabi/newpipe/AppModule.kt
create mode 100644 app/src/main/java/org/schabi/newpipe/settings/DebugScreen.kt
create mode 100644 app/src/main/java/org/schabi/newpipe/settings/SettingsScreen.kt
create mode 100644 app/src/main/java/org/schabi/newpipe/settings/SettingsV2Activity.kt
create mode 100644 app/src/main/java/org/schabi/newpipe/settings/viewmodel/SettingsViewModel.kt
create mode 100644 app/src/main/java/org/schabi/newpipe/ui/SwitchPreference.kt
create mode 100644 app/src/main/java/org/schabi/newpipe/ui/TextPreference.kt
diff --git a/app/build.gradle b/app/build.gradle
index 92fd2a7e9..8f7036e03 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,6 +10,7 @@ plugins {
id "checkstyle"
id "org.sonarqube" version "4.0.0.2929"
id "org.jetbrains.kotlin.plugin.compose" version "${kotlin_version}"
+ id 'com.google.dagger.hilt.android'
}
android {
@@ -190,6 +191,10 @@ sonar {
}
}
+kapt {
+ correctErrorTypes true
+}
+
dependencies {
/** Desugaring **/
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.4'
@@ -200,7 +205,7 @@ 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:v0.24.2'
+ implementation 'com.github.teamnewpipe:newpipeextractor:v0.24.2'
implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0'
/** Checkstyle **/
@@ -285,20 +290,29 @@ dependencies {
// Date and time formatting
implementation "org.ocpsoft.prettytime:prettytime:5.0.8.Final"
- // Jetpack Compose
- implementation(platform('androidx.compose:compose-bom:2024.06.00'))
- implementation 'androidx.compose.material3:material3:1.3.0-beta05'
- implementation 'androidx.compose.material3.adaptive:adaptive:1.0.0-beta04'
- implementation 'androidx.activity:activity-compose'
+ // Jetpack Compose BOM group
+ implementation(platform('androidx.compose:compose-bom:2024.09.03'))
+ implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.ui:ui-tooling-preview'
- implementation 'androidx.compose.ui:ui-text:1.7.0-beta07' // Needed for parsing HTML to AnnotatedString
- implementation 'androidx.lifecycle:lifecycle-viewmodel-compose'
+ implementation 'androidx.compose.ui:ui-text' // Needed for parsing HTML to AnnotatedString
+
+ // Jetpack Compose related dependencies
+ implementation 'androidx.compose.material3.adaptive:adaptive:1.0.0'
+ implementation 'androidx.activity:activity-compose:1.9.2'
+ implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.6'
implementation 'androidx.paging:paging-compose:3.3.2'
- implementation 'com.github.nanihadesuka:LazyColumnScrollbar:2.2.0'
+ implementation "androidx.navigation:navigation-compose:2.8.2"
// Coroutines interop
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx3:1.8.1'
+ // Hilt
+ implementation("com.google.dagger:hilt-android:2.51.1")
+ kapt("com.google.dagger:hilt-compiler:2.51.1")
+
+ // Scroll
+ implementation 'com.github.nanihadesuka:LazyColumnScrollbar:2.2.0'
+
/** Debugging **/
// Memory leak detection
debugImplementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leakCanaryVersion}"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d11de9f47..c44f8bf2c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -77,6 +77,11 @@
android:exported="false"
android:label="@string/settings" />
+
+
.
*/
+@HiltAndroidApp
public class App extends Application implements ImageLoaderFactory {
public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID;
private static final String TAG = App.class.toString();
diff --git a/app/src/main/java/org/schabi/newpipe/AppModule.kt b/app/src/main/java/org/schabi/newpipe/AppModule.kt
new file mode 100644
index 000000000..0aaf2f72b
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/AppModule.kt
@@ -0,0 +1,22 @@
+package org.schabi.newpipe
+
+import android.content.Context
+import android.content.SharedPreferences
+import androidx.preference.PreferenceManager
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+class AppModule {
+
+ @Provides
+ @Singleton
+ fun providesSharedPreference(@ApplicationContext context: Context): SharedPreferences {
+ return PreferenceManager.getDefaultSharedPreferences(context)
+ }
+}
diff --git a/app/src/main/java/org/schabi/newpipe/settings/DebugScreen.kt b/app/src/main/java/org/schabi/newpipe/settings/DebugScreen.kt
new file mode 100644
index 000000000..ac08dd36b
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/settings/DebugScreen.kt
@@ -0,0 +1,27 @@
+package org.schabi.newpipe.settings
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
+import org.schabi.newpipe.R
+import org.schabi.newpipe.settings.viewmodel.SettingsViewModel
+import org.schabi.newpipe.ui.SwitchPreference
+import org.schabi.newpipe.ui.theme.SizeTokens
+
+@Composable
+fun DebugScreen(viewModel: SettingsViewModel, modifier: Modifier = Modifier) {
+
+ val settingsLayoutRedesign by viewModel.settingsLayoutRedesign.collectAsState()
+
+ Column(modifier = modifier) {
+ SwitchPreference(
+ modifier = Modifier.padding(SizeTokens.SpacingExtraSmall),
+ R.string.settings_layout_redesign,
+ settingsLayoutRedesign,
+ viewModel::toggleSettingsLayoutRedesign
+ )
+ }
+}
diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsScreen.kt b/app/src/main/java/org/schabi/newpipe/settings/SettingsScreen.kt
new file mode 100644
index 000000000..5bd8f2b08
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsScreen.kt
@@ -0,0 +1,23 @@
+package org.schabi.newpipe.settings
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.material3.HorizontalDivider
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import org.schabi.newpipe.R
+import org.schabi.newpipe.ui.TextPreference
+
+@Composable
+fun SettingsScreen(
+ onSelectSettingOption: (SettingsScreenKey) -> Unit,
+ modifier: Modifier = Modifier
+) {
+ Column(modifier = modifier) {
+ TextPreference(
+ title = R.string.settings_category_debug_title,
+ onClick = { onSelectSettingOption(SettingsScreenKey.DEBUG) }
+ )
+ HorizontalDivider(color = Color.Black)
+ }
+}
diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsV2Activity.kt b/app/src/main/java/org/schabi/newpipe/settings/SettingsV2Activity.kt
new file mode 100644
index 000000000..821ff0187
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsV2Activity.kt
@@ -0,0 +1,85 @@
+package org.schabi.newpipe.settings
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.activity.viewModels
+import androidx.annotation.StringRes
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Scaffold
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.rememberNavController
+import androidx.navigation.navArgument
+import dagger.hilt.android.AndroidEntryPoint
+import org.schabi.newpipe.R
+import org.schabi.newpipe.settings.viewmodel.SettingsViewModel
+import org.schabi.newpipe.ui.Toolbar
+import org.schabi.newpipe.ui.theme.AppTheme
+
+const val SCREEN_TITLE_KEY = "SCREEN_TITLE_KEY"
+
+@AndroidEntryPoint
+class SettingsV2Activity : ComponentActivity() {
+
+ private val settingsViewModel: SettingsViewModel by viewModels()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContent {
+ val navController = rememberNavController()
+ var screenTitle by remember { mutableIntStateOf(SettingsScreenKey.ROOT.screenTitle) }
+ navController.addOnDestinationChangedListener { _, _, arguments ->
+ screenTitle =
+ arguments?.getInt(SCREEN_TITLE_KEY) ?: SettingsScreenKey.ROOT.screenTitle
+ }
+
+ AppTheme {
+ Scaffold(topBar = {
+ Toolbar(
+ title = stringResource(id = screenTitle),
+ hasSearch = true,
+ onSearchQueryChange = null // TODO: Add suggestions logic
+ )
+ }) { padding ->
+ NavHost(
+ navController = navController,
+ startDestination = SettingsScreenKey.ROOT.name,
+ modifier = Modifier.padding(padding)
+ ) {
+ composable(
+ SettingsScreenKey.ROOT.name,
+ listOf(createScreenTitleArg(SettingsScreenKey.ROOT.screenTitle))
+ ) {
+ SettingsScreen(onSelectSettingOption = { screen ->
+ navController.navigate(screen.name)
+ })
+ }
+ composable(
+ SettingsScreenKey.DEBUG.name,
+ listOf(createScreenTitleArg(SettingsScreenKey.DEBUG.screenTitle))
+ ) {
+ DebugScreen(settingsViewModel)
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+fun createScreenTitleArg(@StringRes screenTitle: Int) = navArgument(SCREEN_TITLE_KEY) {
+ defaultValue = screenTitle
+}
+
+enum class SettingsScreenKey(@StringRes val screenTitle: Int) {
+ ROOT(R.string.settings),
+ DEBUG(R.string.settings_category_debug_title)
+}
diff --git a/app/src/main/java/org/schabi/newpipe/settings/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/schabi/newpipe/settings/viewmodel/SettingsViewModel.kt
new file mode 100644
index 000000000..ae3520c94
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/settings/viewmodel/SettingsViewModel.kt
@@ -0,0 +1,39 @@
+package org.schabi.newpipe.settings.viewmodel
+
+import android.app.Application
+import android.content.Context
+import android.content.SharedPreferences
+import androidx.core.content.ContextCompat
+import androidx.lifecycle.AndroidViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import dagger.hilt.android.qualifiers.ApplicationContext
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import org.schabi.newpipe.R
+import javax.inject.Inject
+
+@HiltViewModel
+class SettingsViewModel @Inject constructor(
+ @ApplicationContext context: Context,
+ private val preferenceManager: SharedPreferences
+) : AndroidViewModel(context.applicationContext as Application) {
+
+ private var _settingsLayoutRedesignPref: Boolean
+ get() = preferenceManager.getBoolean(
+ ContextCompat.getString(getApplication(), R.string.settings_layout_redesign_key), false
+ )
+ set(value) {
+ preferenceManager.edit().putBoolean(
+ ContextCompat.getString(getApplication(), R.string.settings_layout_redesign_key),
+ value
+ ).apply()
+ }
+ private val _settingsLayoutRedesign: MutableStateFlow =
+ MutableStateFlow(_settingsLayoutRedesignPref)
+ val settingsLayoutRedesign = _settingsLayoutRedesign.asStateFlow()
+
+ fun toggleSettingsLayoutRedesign(newState: Boolean) {
+ _settingsLayoutRedesign.value = newState
+ _settingsLayoutRedesignPref = newState
+ }
+}
diff --git a/app/src/main/java/org/schabi/newpipe/ui/SwitchPreference.kt b/app/src/main/java/org/schabi/newpipe/ui/SwitchPreference.kt
new file mode 100644
index 000000000..d479343f5
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/ui/SwitchPreference.kt
@@ -0,0 +1,53 @@
+package org.schabi.newpipe.ui
+
+import androidx.annotation.StringRes
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Switch
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextAlign
+import org.schabi.newpipe.ui.theme.SizeTokens
+
+@Composable
+fun SwitchPreference(
+ modifier: Modifier = Modifier,
+ @StringRes title: Int,
+ isChecked: Boolean,
+ onCheckedChange: (Boolean) -> Unit,
+ @StringRes summary: Int? = null
+) {
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween,
+ modifier = modifier.fillMaxWidth()
+ ) {
+ Column {
+ Text(
+ text = stringResource(id = title),
+ modifier = Modifier.padding(SizeTokens.SpacingExtraSmall),
+ style = MaterialTheme.typography.titleSmall,
+ textAlign = TextAlign.Start,
+ )
+ summary?.let {
+ Text(
+ text = stringResource(id = summary),
+ modifier = Modifier.padding(SizeTokens.SpacingExtraSmall),
+ style = MaterialTheme.typography.bodySmall,
+ textAlign = TextAlign.Start,
+ )
+ }
+ }
+ Spacer(modifier = Modifier.width(SizeTokens.SpacingSmall))
+ Switch(checked = isChecked, onCheckedChange = onCheckedChange)
+ }
+}
diff --git a/app/src/main/java/org/schabi/newpipe/ui/TextPreference.kt b/app/src/main/java/org/schabi/newpipe/ui/TextPreference.kt
new file mode 100644
index 000000000..f58f2f305
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/ui/TextPreference.kt
@@ -0,0 +1,66 @@
+package org.schabi.newpipe.ui
+
+import androidx.annotation.DrawableRes
+import androidx.annotation.StringRes
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.defaultMinSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextAlign
+import org.schabi.newpipe.ui.theme.SizeTokens
+
+@Composable
+fun TextPreference(
+ modifier: Modifier = Modifier,
+ @StringRes title: Int,
+ @DrawableRes icon: Int? = null,
+ @StringRes summary: Int? = null,
+ onClick: () -> Unit,
+) {
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween,
+ modifier = modifier
+ .fillMaxWidth()
+ .padding(SizeTokens.SpacingSmall)
+ .defaultMinSize(minHeight = SizeTokens.SpaceMinSize)
+ .clickable { onClick() }
+ ) {
+ icon?.let {
+ Icon(
+ painter = painterResource(id = icon),
+ contentDescription = "icon for $title preference"
+ )
+ Spacer(modifier = Modifier.width(SizeTokens.SpacingSmall))
+ }
+ Column {
+ Text(
+ text = stringResource(id = title),
+ modifier = Modifier.padding(SizeTokens.SpacingExtraSmall),
+ style = MaterialTheme.typography.titleSmall,
+ textAlign = TextAlign.Start,
+ )
+ summary?.let {
+ Text(
+ text = stringResource(id = summary),
+ modifier = Modifier.padding(SizeTokens.SpacingExtraSmall),
+ style = MaterialTheme.typography.bodySmall,
+ textAlign = TextAlign.Start,
+ )
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java
index 534d7085b..219328875 100644
--- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java
@@ -21,6 +21,7 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
+import androidx.preference.PreferenceManager;
import com.jakewharton.processphoenix.ProcessPhoenix;
@@ -64,6 +65,7 @@ import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
import org.schabi.newpipe.settings.SettingsActivity;
+import org.schabi.newpipe.settings.SettingsV2Activity;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import java.util.List;
@@ -648,7 +650,13 @@ public final class NavigationHelper {
}
public static void openSettings(final Context context) {
- final Intent intent = new Intent(context, SettingsActivity.class);
+ final Class> settingsClass = PreferenceManager.getDefaultSharedPreferences(context)
+ .getBoolean(
+ ContextCompat.getString(context, R.string.settings_layout_redesign_key),
+ false
+ ) ? SettingsV2Activity.class : SettingsActivity.class;
+
+ final Intent intent = new Intent(context, settingsClass);
context.startActivity(intent);
}
diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml
index e31cebb92..b0fceb89b 100644
--- a/app/src/main/res/values/settings_keys.xml
+++ b/app/src/main/res/values/settings_keys.xml
@@ -246,6 +246,7 @@
crash_the_app_key
show_error_snackbar_key
create_error_notification_key
+ settings_layout_redesign_key
theme
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 938a2497d..eecce7988 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -492,6 +492,7 @@
Crash the app
Show an error snackbar
Create an error notification
+ Enable the Redesigned Settings page
Import
Import from
diff --git a/app/src/main/res/xml/debug_settings.xml b/app/src/main/res/xml/debug_settings.xml
index d97c5aa1a..5b6909892 100644
--- a/app/src/main/res/xml/debug_settings.xml
+++ b/app/src/main/res/xml/debug_settings.xml
@@ -64,4 +64,11 @@
android:title="@string/create_error_notification"
app:singleLineTitle="false"
app:iconSpaceReserved="false" />
+
+
diff --git a/build.gradle b/build.gradle
index 1acfb6f4a..7249be503 100644
--- a/build.gradle
+++ b/build.gradle
@@ -9,6 +9,7 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:8.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
From 7787eafd3ae7652e2b1f66912d05ea4a7cdca8b9 Mon Sep 17 00:00:00 2001
From: litetex <40789489+litetex@users.noreply.github.com>
Date: Tue, 22 Oct 2024 21:03:08 +0200
Subject: [PATCH 16/23] Fix build failing locally due to outdated kotlin
version
---
build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build.gradle b/build.gradle
index 7249be503..2d03416a7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '2.0.0'
+ ext.kotlin_version = '2.0.21'
repositories {
google()
mavenCentral()
From d8759993a98cde7ebfab2968cc7473d693d43cbf Mon Sep 17 00:00:00 2001
From: litetex <40789489+litetex@users.noreply.github.com>
Date: Tue, 22 Oct 2024 20:57:21 +0200
Subject: [PATCH 17/23] CI: Use Java 21
---
.github/workflows/ci.yml | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9ae3a77c2..54415858e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -47,10 +47,10 @@ jobs:
BRANCH: ${{ github.head_ref }}
run: git checkout -B "$BRANCH"
- - name: set up JDK 17
+ - name: set up JDK
uses: actions/setup-java@v4
with:
- java-version: 17
+ java-version: 21
distribution: "temurin"
cache: 'gradle'
@@ -88,10 +88,10 @@ jobs:
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- - name: set up JDK 17
+ - name: set up JDK
uses: actions/setup-java@v4
with:
- java-version: 17
+ java-version: 21
distribution: "temurin"
cache: 'gradle'
@@ -121,10 +121,10 @@ jobs:
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- - name: Set up JDK 17
+ - name: Set up JDK
uses: actions/setup-java@v4
with:
- java-version: 17
+ java-version: 21
distribution: "temurin"
cache: 'gradle'
From 702f74291d46eec2544d4a45ae267709f5f4b253 Mon Sep 17 00:00:00 2001
From: litetex <40789489+litetex@users.noreply.github.com>
Date: Tue, 22 Oct 2024 21:03:33 +0200
Subject: [PATCH 18/23] Use working Extractor version The tag can't be resolved
by Jitpack so use the commit-hash instead
---
app/build.gradle | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/build.gradle b/app/build.gradle
index 8f7036e03..2aef7d275 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -205,7 +205,8 @@ 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:v0.24.2'
+ // WORKAROUND: v0.24.2 can't be resolved by jitpack -> use git commit hash instead
+ implementation 'com.github.TeamNewPipe:NewPipeExtractor:176da72cb4c3ec4679211339b0e59f6b01bf2f52'
implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0'
/** Checkstyle **/
From 4de3ef20be878b0cdac1c6d14135731106b1fd63 Mon Sep 17 00:00:00 2001
From: litetex <40789489+litetex@users.noreply.github.com>
Date: Tue, 22 Oct 2024 21:18:06 +0200
Subject: [PATCH 19/23] Delete symlink
---
app/src/main/res/layout-land/list_stream_card_item.xml | 1 -
1 file changed, 1 deletion(-)
delete mode 120000 app/src/main/res/layout-land/list_stream_card_item.xml
diff --git a/app/src/main/res/layout-land/list_stream_card_item.xml b/app/src/main/res/layout-land/list_stream_card_item.xml
deleted file mode 120000
index 70228ee1d..000000000
--- a/app/src/main/res/layout-land/list_stream_card_item.xml
+++ /dev/null
@@ -1 +0,0 @@
-../layout/list_stream_item.xml
\ No newline at end of file
From 6dd24033a48df40ce7105784f46c4a4445666858 Mon Sep 17 00:00:00 2001
From: litetex <40789489+litetex@users.noreply.github.com>
Date: Tue, 22 Oct 2024 21:18:34 +0200
Subject: [PATCH 20/23] Replace symlink with original
Co-Authored-By: Thompson3142 <115718208+thompson3142@users.noreply.github.com>
---
.../res/layout-land/list_stream_card_item.xml | 94 +++++++++++++++++++
1 file changed, 94 insertions(+)
create mode 100644 app/src/main/res/layout-land/list_stream_card_item.xml
diff --git a/app/src/main/res/layout-land/list_stream_card_item.xml b/app/src/main/res/layout-land/list_stream_card_item.xml
new file mode 100644
index 000000000..793942568
--- /dev/null
+++ b/app/src/main/res/layout-land/list_stream_card_item.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 97652ac0150a6e5170cd54cf02eca0635125ad7a Mon Sep 17 00:00:00 2001
From: litetex <40789489+litetex@users.noreply.github.com>
Date: Tue, 22 Oct 2024 21:39:44 +0200
Subject: [PATCH 21/23] Update Gradle to latest version
---
build.gradle | 2 +-
gradle/wrapper/gradle-wrapper.properties | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/build.gradle b/build.gradle
index 2d03416a7..25568c220 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:8.2.0'
+ classpath 'com.android.tools.build:gradle:8.7.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51.1'
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index d022615ff..4ea536e77 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionSha256Sum=38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
+distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
From 5bd4ed77dfd30592febfbaea192509dab54461be Mon Sep 17 00:00:00 2001
From: litetex <40789489+litetex@users.noreply.github.com>
Date: Tue, 22 Oct 2024 21:40:16 +0200
Subject: [PATCH 22/23] Fix Android Gradle plugin warning
---
app/build.gradle | 1 +
gradle.properties | 1 -
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/build.gradle b/app/build.gradle
index 2aef7d275..51909c6eb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -95,6 +95,7 @@ android {
buildFeatures {
viewBinding true
compose true
+ buildConfig true
}
packagingOptions {
diff --git a/gradle.properties b/gradle.properties
index 0ca913222..ed32303da 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,3 @@
-android.defaults.buildfeatures.buildconfig=true
android.enableJetifier=false
android.nonFinalResIds=false
android.nonTransitiveRClass=true
From 8ada566bf16bcafb57a1d6920f5610e156b5a495 Mon Sep 17 00:00:00 2001
From: litetex <40789489+litetex@users.noreply.github.com>
Date: Wed, 23 Oct 2024 21:28:07 +0200
Subject: [PATCH 23/23] Replaced ``Icepick`` with ``Bridge`` and
``Android-State``
* IcePick fails on Java 21 (default in Android Studio 2024.2)
* Bridge is the most modern alternative that is currently available. It is backed by ``Android-State`` and can be configured with various frameworks
* In the long term this should be replaced with something better
---
app/build.gradle | 7 ++-
app/proguard-rules.pro | 9 ---
app/src/main/java/org/schabi/newpipe/App.java | 2 +
.../java/org/schabi/newpipe/BaseFragment.java | 9 +--
.../org/schabi/newpipe/RouterActivity.java | 9 +--
.../org/schabi/newpipe/about/AboutActivity.kt | 8 ++-
.../newpipe/download/DownloadDialog.java | 12 ++--
.../newpipe/fragments/BaseStateFragment.java | 5 +-
.../fragments/detail/DescriptionFragment.java | 6 +-
.../fragments/detail/VideoDetailFragment.java | 2 +-
.../fragments/list/BaseListInfoFragment.java | 5 +-
.../list/channel/ChannelAboutFragment.java | 6 +-
.../list/channel/ChannelFragment.java | 12 ++--
.../list/channel/ChannelTabFragment.java | 6 +-
.../list/comments/CommentRepliesFragment.java | 3 +-
.../fragments/list/kiosk/KioskFragment.java | 3 +-
.../fragments/list/search/SearchFragment.java | 7 ++-
.../local/bookmark/BookmarkFragment.java | 7 ++-
.../schabi/newpipe/local/feed/FeedFragment.kt | 2 +-
.../history/StatisticsPlaylistFragment.java | 3 +-
.../local/playlist/LocalPlaylistFragment.java | 8 ++-
.../ImportConfirmationDialog.java | 14 ++---
.../subscription/SubscriptionFragment.kt | 2 +-
.../SubscriptionsImportFragment.java | 4 +-
.../subscription/dialog/FeedGroupDialog.kt | 8 +--
.../dialog/FeedGroupReorderDialog.kt | 12 ++--
.../helper/PlaybackParameterDialog.java | 10 +--
.../newpipe/settings/SettingsActivity.java | 9 ++-
.../util/BridgeStateSaverInitializer.java | 61 +++++++++++++++++++
.../schabi/newpipe/views/CollapsibleView.java | 16 ++---
30 files changed, 167 insertions(+), 100 deletions(-)
create mode 100644 app/src/main/java/org/schabi/newpipe/util/BridgeStateSaverInitializer.java
diff --git a/app/build.gradle b/app/build.gradle
index 51909c6eb..b32109692 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -116,7 +116,7 @@ ext {
androidxRoomVersion = '2.6.1'
androidxWorkVersion = '2.8.1'
- icepickVersion = '3.2.0'
+ stateSaverVersion = '1.4.1'
exoPlayerVersion = '2.18.7'
googleAutoServiceVersion = '1.1.1'
groupieVersion = '2.10.1'
@@ -243,8 +243,9 @@ dependencies {
/** Third-party libraries **/
// Instance state boilerplate elimination
- implementation "frankiesardo:icepick:${icepickVersion}"
- kapt "frankiesardo:icepick-processor:${icepickVersion}"
+ implementation 'com.github.livefront:bridge:v2.0.2'
+ implementation "com.evernote:android-state:$stateSaverVersion"
+ kapt "com.evernote:android-state-processor:$stateSaverVersion"
// HTML parser
implementation "org.jsoup:jsoup:1.17.2"
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 435c4e29b..215df0da5 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -13,15 +13,6 @@
## Rules for ExoPlayer
-keep class com.google.android.exoplayer2.** { *; }
-## Rules for Icepick. Copy pasted from https://github.com/frankiesardo/icepick
--dontwarn icepick.**
--keep class icepick.** { *; }
--keep class **$$Icepick { *; }
--keepclasseswithmembernames class * {
- @icepick.* ;
-}
--keepnames class * { @icepick.State *;}
-
## Rules for OkHttp. Copy pasted from https://github.com/square/okhttp
-dontwarn okhttp3.**
-dontwarn okio.**
diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java
index f1876c5dd..d271dba0d 100644
--- a/app/src/main/java/org/schabi/newpipe/App.java
+++ b/app/src/main/java/org/schabi/newpipe/App.java
@@ -21,6 +21,7 @@ import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.downloader.Downloader;
import org.schabi.newpipe.ktx.ExceptionUtils;
import org.schabi.newpipe.settings.NewPipeSettings;
+import org.schabi.newpipe.util.BridgeStateSaverInitializer;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.ServiceHelper;
import org.schabi.newpipe.util.StateSaver;
@@ -107,6 +108,7 @@ public class App extends Application implements ImageLoaderFactory {
Localization.getPreferredContentCountry(this));
Localization.initPrettyTime(Localization.resolvePrettyTime(getApplicationContext()));
+ BridgeStateSaverInitializer.init(this);
StateSaver.init(this);
initNotificationChannels();
diff --git a/app/src/main/java/org/schabi/newpipe/BaseFragment.java b/app/src/main/java/org/schabi/newpipe/BaseFragment.java
index 7a06771dd..a55a341e6 100644
--- a/app/src/main/java/org/schabi/newpipe/BaseFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/BaseFragment.java
@@ -10,8 +10,9 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
-import icepick.Icepick;
-import icepick.State;
+import com.evernote.android.state.State;
+import com.livefront.bridge.Bridge;
+
public abstract class BaseFragment extends Fragment {
protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
@@ -48,7 +49,7 @@ public abstract class BaseFragment extends Fragment {
+ "savedInstanceState = [" + savedInstanceState + "]");
}
super.onCreate(savedInstanceState);
- Icepick.restoreInstanceState(this, savedInstanceState);
+ Bridge.restoreInstanceState(this, savedInstanceState);
if (savedInstanceState != null) {
onRestoreInstanceState(savedInstanceState);
}
@@ -70,7 +71,7 @@ public abstract class BaseFragment extends Fragment {
@Override
public void onSaveInstanceState(@NonNull final Bundle outState) {
super.onSaveInstanceState(outState);
- Icepick.saveInstanceState(this, outState);
+ Bridge.saveInstanceState(this, outState);
}
protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {
diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java
index c59dc7532..197c965ba 100644
--- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java
@@ -41,6 +41,9 @@ import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.PreferenceManager;
+import com.evernote.android.state.State;
+import com.livefront.bridge.Bridge;
+
import org.schabi.newpipe.database.stream.model.StreamEntity;
import org.schabi.newpipe.databinding.ListRadioIconItemBinding;
import org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding;
@@ -98,8 +101,6 @@ import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
-import icepick.Icepick;
-import icepick.State;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Single;
@@ -152,7 +153,7 @@ public class RouterActivity extends AppCompatActivity {
getWindow().setAttributes(params);
super.onCreate(savedInstanceState);
- Icepick.restoreInstanceState(this, savedInstanceState);
+ Bridge.restoreInstanceState(this, savedInstanceState);
// FragmentManager will take care to recreate (Playlist|Download)Dialog when screen rotates
// We used to .setOnDismissListener(dialog -> finish()); when creating these DialogFragments
@@ -197,7 +198,7 @@ public class RouterActivity extends AppCompatActivity {
@Override
protected void onSaveInstanceState(@NonNull final Bundle outState) {
super.onSaveInstanceState(outState);
- Icepick.saveInstanceState(this, outState);
+ Bridge.saveInstanceState(this, outState);
}
@Override
diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt
index 0d0d0d48d..60a1cff37 100644
--- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt
+++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt
@@ -138,8 +138,12 @@ class AboutActivity : AppCompatActivity() {
"https://github.com/lisawray/groupie", StandardLicenses.MIT
),
SoftwareComponent(
- "Icepick", "2015", "Frankie Sardo",
- "https://github.com/frankiesardo/icepick", StandardLicenses.EPL1
+ "Android-State", "2018", "Evernote",
+ "https://github.com/Evernote/android-state", StandardLicenses.EPL1
+ ),
+ SoftwareComponent(
+ "Bridge", "2021", "Livefront",
+ "https://github.com/livefront/bridge", StandardLicenses.APACHE2
),
SoftwareComponent(
"Jsoup", "2009 - 2020", "Jonathan Hedley",
diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
index db2066b27..34a4ba022 100644
--- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
+++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
@@ -39,6 +39,8 @@ import androidx.documentfile.provider.DocumentFile;
import androidx.fragment.app.DialogFragment;
import androidx.preference.PreferenceManager;
+import com.evernote.android.state.State;
+import com.livefront.bridge.Bridge;
import com.nononsenseapps.filepicker.Utils;
import org.schabi.newpipe.MainActivity;
@@ -59,6 +61,8 @@ import org.schabi.newpipe.settings.NewPipeSettings;
import org.schabi.newpipe.streams.io.NoFileManagerSafeGuard;
import org.schabi.newpipe.streams.io.StoredDirectoryHelper;
import org.schabi.newpipe.streams.io.StoredFileHelper;
+import org.schabi.newpipe.util.AudioTrackAdapter;
+import org.schabi.newpipe.util.AudioTrackAdapter.AudioTracksWrapper;
import org.schabi.newpipe.util.FilePickerActivityHelper;
import org.schabi.newpipe.util.FilenameUtils;
import org.schabi.newpipe.util.ListHelper;
@@ -67,8 +71,6 @@ import org.schabi.newpipe.util.SecondaryStreamHelper;
import org.schabi.newpipe.util.SimpleOnSeekBarChangeListener;
import org.schabi.newpipe.util.StreamItemAdapter;
import org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper;
-import org.schabi.newpipe.util.AudioTrackAdapter;
-import org.schabi.newpipe.util.AudioTrackAdapter.AudioTracksWrapper;
import org.schabi.newpipe.util.ThemeHelper;
import java.io.File;
@@ -79,8 +81,6 @@ import java.util.Locale;
import java.util.Objects;
import java.util.Optional;
-import icepick.Icepick;
-import icepick.State;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import us.shandian.giga.get.MissionRecoveryInfo;
import us.shandian.giga.postprocessing.Postprocessing;
@@ -214,7 +214,7 @@ public class DownloadDialog extends DialogFragment
context = getContext();
setStyle(STYLE_NO_TITLE, ThemeHelper.getDialogTheme(context));
- Icepick.restoreInstanceState(this, savedInstanceState);
+ Bridge.restoreInstanceState(this, savedInstanceState);
this.audioTrackAdapter = new AudioTrackAdapter(wrappedAudioTracks);
this.subtitleStreamsAdapter = new StreamItemAdapter<>(wrappedSubtitleStreams);
@@ -372,7 +372,7 @@ public class DownloadDialog extends DialogFragment
@Override
public void onSaveInstanceState(@NonNull final Bundle outState) {
super.onSaveInstanceState(outState);
- Icepick.saveInstanceState(this, outState);
+ Bridge.saveInstanceState(this, outState);
}
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java
index a3d3d8b60..8361953b9 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java
@@ -13,6 +13,8 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;
+import com.evernote.android.state.State;
+
import org.schabi.newpipe.BaseFragment;
import org.schabi.newpipe.R;
import org.schabi.newpipe.error.ErrorInfo;
@@ -22,8 +24,6 @@ import org.schabi.newpipe.util.InfoCache;
import java.util.concurrent.atomic.AtomicBoolean;
-import icepick.State;
-
public abstract class BaseStateFragment extends BaseFragment implements ViewContract {
@State
protected AtomicBoolean wasLoading = new AtomicBoolean();
@@ -134,6 +134,7 @@ public abstract class BaseStateFragment extends BaseFragment implements ViewC
hideErrorPanel();
}
+ @Override
public void showEmptyState() {
isLoading.set(false);
if (emptyStateView != null) {
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java
index 581e54156..52fb3f29e 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java
@@ -11,6 +11,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
+import com.evernote.android.state.State;
+
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.stream.Description;
@@ -19,8 +21,6 @@ import org.schabi.newpipe.util.Localization;
import java.util.List;
-import icepick.State;
-
public class DescriptionFragment extends BaseDescriptionFragment {
@State
@@ -31,7 +31,7 @@ public class DescriptionFragment extends BaseDescriptionFragment {
}
public DescriptionFragment() {
- // keep empty constructor for IcePick when resuming fragment from memory
+ // keep empty constructor for State when resuming fragment from memory
}
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
index 11a315d69..33f489d9d 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
@@ -56,6 +56,7 @@ import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.preference.PreferenceManager;
+import com.evernote.android.state.State;
import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.material.appbar.AppBarLayout;
@@ -128,7 +129,6 @@ import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import coil.util.CoilUtils;
-import icepick.State;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java
index dd5eb6c8a..61a361f23 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java
@@ -9,6 +9,8 @@ import android.view.View;
import androidx.annotation.NonNull;
+import com.evernote.android.state.State;
+
import org.schabi.newpipe.R;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.UserAction;
@@ -24,7 +26,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
-import icepick.State;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.Disposable;
@@ -143,7 +144,7 @@ public abstract class BaseListInfoFragment {
+ .subscribe((@NonNull final L result) -> {
isLoading.set(false);
currentInfo = result;
currentNextPage = result.getNextPage();
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java
index 0dc2fb65a..b7f4a9d3d 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java
@@ -10,6 +10,8 @@ import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.evernote.android.state.State;
+
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.channel.ChannelInfo;
@@ -20,8 +22,6 @@ import org.schabi.newpipe.util.Localization;
import java.util.List;
-import icepick.State;
-
public class ChannelAboutFragment extends BaseDescriptionFragment {
@State
protected ChannelInfo channelInfo;
@@ -31,7 +31,7 @@ public class ChannelAboutFragment extends BaseDescriptionFragment {
}
public ChannelAboutFragment() {
- // keep empty constructor for IcePick when resuming fragment from memory
+ // keep empty constructor for State when resuming fragment from memory
}
@Override
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
index 3890e4865..56d8a9315 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
@@ -25,6 +25,7 @@ import androidx.core.graphics.ColorUtils;
import androidx.core.view.MenuProvider;
import androidx.preference.PreferenceManager;
+import com.evernote.android.state.State;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.tabs.TabLayout;
import com.jakewharton.rxbinding4.view.RxView;
@@ -60,7 +61,6 @@ import java.util.Queue;
import java.util.concurrent.TimeUnit;
import coil.util.CoilUtils;
-import icepick.State;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
@@ -249,7 +249,7 @@ public class ChannelFragment extends BaseStateFragment
//////////////////////////////////////////////////////////////////////////*/
private void monitorSubscription(final ChannelInfo info) {
- final Consumer onError = (Throwable throwable) -> {
+ final Consumer onError = (final Throwable throwable) -> {
animate(binding.channelSubscribeButton, false, 100);
showSnackBarError(new ErrorInfo(throwable, UserAction.SUBSCRIPTION_GET,
"Get subscription status", currentInfo));
@@ -284,14 +284,14 @@ public class ChannelFragment extends BaseStateFragment
}
private Function mapOnSubscribe(final SubscriptionEntity subscription) {
- return (@NonNull Object o) -> {
+ return (@NonNull final Object o) -> {
subscriptionManager.insertSubscription(subscription);
return o;
};
}
private Function mapOnUnsubscribe(final SubscriptionEntity subscription) {
- return (@NonNull Object o) -> {
+ return (@NonNull final Object o) -> {
subscriptionManager.deleteSubscription(subscription);
return o;
};
@@ -318,7 +318,7 @@ public class ChannelFragment extends BaseStateFragment
}
private Disposable monitorSubscribeButton(final Function action) {
- final Consumer onNext = (@NonNull Object o) -> {
+ final Consumer onNext = (@NonNull final Object o) -> {
if (DEBUG) {
Log.d(TAG, "Changed subscription status to this channel!");
}
@@ -338,7 +338,7 @@ public class ChannelFragment extends BaseStateFragment
}
private Consumer> getSubscribeUpdateMonitor(final ChannelInfo info) {
- return (List subscriptionEntities) -> {
+ return (final List subscriptionEntities) -> {
if (DEBUG) {
Log.d(TAG, "subscriptionManager.subscriptionTable.doOnNext() called with: "
+ "subscriptionEntities = [" + subscriptionEntities + "]");
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java
index 95ac42eed..5d398821a 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java
@@ -9,6 +9,8 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.evernote.android.state.State;
+
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.PlaylistControlBinding;
import org.schabi.newpipe.error.UserAction;
@@ -32,13 +34,12 @@ import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
-import icepick.State;
import io.reactivex.rxjava3.core.Single;
public class ChannelTabFragment extends BaseListInfoFragment
implements PlaylistControlViewHolder {
- // states must be protected and not private for IcePick being able to access them
+ // states must be protected and not private for State being able to access them
@State
protected ListLinkHandler tabHandler;
@State
@@ -156,6 +157,7 @@ public class ChannelTabFragment extends BaseListInfoFragment streamItems = infoListAdapter.getItemsList().stream()
.filter(StreamInfoItem.class::isInstance)
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java
index 4eb73520f..a585a5b39 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java
@@ -12,6 +12,8 @@ import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.text.HtmlCompat;
+import com.evernote.android.state.State;
+
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.CommentRepliesHeaderBinding;
import org.schabi.newpipe.error.UserAction;
@@ -30,7 +32,6 @@ import org.schabi.newpipe.util.text.TextLinkifier;
import java.util.Queue;
import java.util.function.Supplier;
-import icepick.State;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java
index b90dccb17..6823e13d3 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java
@@ -11,6 +11,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
+import com.evernote.android.state.State;
+
import org.schabi.newpipe.R;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.UserAction;
@@ -29,7 +31,6 @@ import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.KioskTranslator;
import org.schabi.newpipe.util.Localization;
-import icepick.State;
import io.reactivex.rxjava3.core.Single;
/**
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
index eef3455ae..18c60400b 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
@@ -40,6 +40,8 @@ import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
+import com.evernote.android.state.State;
+
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.FragmentSearchBinding;
import org.schabi.newpipe.error.ErrorInfo;
@@ -77,7 +79,6 @@ import java.util.Queue;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
-import icepick.State;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Single;
@@ -550,7 +551,7 @@ public class SearchFragment extends BaseListFragment {
+ searchEditText.setOnFocusChangeListener((final View v, final boolean hasFocus) -> {
if (DEBUG) {
Log.d(TAG, "onFocusChange() called with: "
+ "v = [" + v + "], hasFocus = [" + hasFocus + "]");
@@ -611,7 +612,7 @@ public class SearchFragment extends BaseListFragment {
+ (final TextView v, final int actionId, final KeyEvent event) -> {
if (DEBUG) {
Log.d(TAG, "onEditorAction() called with: v = [" + v + "], "
+ "actionId = [" + actionId + "], event = [" + event + "]");
diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java
index a366723e0..a5e1594d1 100644
--- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java
@@ -19,6 +19,8 @@ import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
+import com.evernote.android.state.State;
+
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.schabi.newpipe.NewPipeDatabase;
@@ -36,16 +38,15 @@ import org.schabi.newpipe.local.holder.LocalBookmarkPlaylistItemHolder;
import org.schabi.newpipe.local.holder.RemoteBookmarkPlaylistItemHolder;
import org.schabi.newpipe.local.playlist.LocalPlaylistManager;
import org.schabi.newpipe.local.playlist.RemotePlaylistManager;
-import org.schabi.newpipe.util.debounce.DebounceSavable;
-import org.schabi.newpipe.util.debounce.DebounceSaver;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.OnClickGesture;
+import org.schabi.newpipe.util.debounce.DebounceSavable;
+import org.schabi.newpipe.util.debounce.DebounceSaver;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
-import icepick.State;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt
index b99291309..a4e53aab1 100644
--- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt
+++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt
@@ -44,11 +44,11 @@ import androidx.lifecycle.ViewModelProvider
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.evernote.android.state.State
import com.xwray.groupie.GroupieAdapter
import com.xwray.groupie.Item
import com.xwray.groupie.OnItemClickListener
import com.xwray.groupie.OnItemLongClickListener
-import icepick.State
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.CompositeDisposable
diff --git a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java
index 1fea7e155..fac358075 100644
--- a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java
@@ -15,6 +15,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewbinding.ViewBinding;
+import com.evernote.android.state.State;
import com.google.android.material.snackbar.Snackbar;
import org.reactivestreams.Subscriber;
@@ -45,7 +46,6 @@ import java.util.Comparator;
import java.util.List;
import java.util.Objects;
-import icepick.State;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
@@ -368,6 +368,7 @@ public class StatisticsPlaylistFragment
}
}
+ @Override
public PlayQueue getPlayQueue() {
return getPlayQueue(0);
}
diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java
index d5ae431fa..c87d9cccc 100644
--- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java
@@ -26,6 +26,8 @@ import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
+import com.evernote.android.state.State;
+
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.schabi.newpipe.NewPipeDatabase;
@@ -49,12 +51,12 @@ import org.schabi.newpipe.local.BaseLocalListFragment;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
-import org.schabi.newpipe.util.debounce.DebounceSavable;
-import org.schabi.newpipe.util.debounce.DebounceSaver;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.OnClickGesture;
import org.schabi.newpipe.util.PlayButtonHelper;
+import org.schabi.newpipe.util.debounce.DebounceSavable;
+import org.schabi.newpipe.util.debounce.DebounceSaver;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import java.util.ArrayList;
@@ -63,7 +65,6 @@ import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
-import icepick.State;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
@@ -843,6 +844,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment) {
diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
index dfb49a25b..7e74c3848 100644
--- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
+++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
@@ -24,6 +24,9 @@ import androidx.core.math.MathUtils;
import androidx.fragment.app.DialogFragment;
import androidx.preference.PreferenceManager;
+import com.evernote.android.state.State;
+import com.livefront.bridge.Bridge;
+
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.DialogPlaybackParameterBinding;
import org.schabi.newpipe.player.ui.VideoPlayerUi;
@@ -37,9 +40,6 @@ import java.util.function.DoubleConsumer;
import java.util.function.DoubleFunction;
import java.util.function.DoubleSupplier;
-import icepick.Icepick;
-import icepick.State;
-
public class PlaybackParameterDialog extends DialogFragment {
private static final String TAG = "PlaybackParameterDialog";
@@ -135,7 +135,7 @@ public class PlaybackParameterDialog extends DialogFragment {
@Override
public void onSaveInstanceState(@NonNull final Bundle outState) {
super.onSaveInstanceState(outState);
- Icepick.saveInstanceState(this, outState);
+ Bridge.saveInstanceState(this, outState);
}
/*//////////////////////////////////////////////////////////////////////////
@@ -146,7 +146,7 @@ public class PlaybackParameterDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
assureCorrectAppLanguage(getContext());
- Icepick.restoreInstanceState(this, savedInstanceState);
+ Bridge.restoreInstanceState(this, savedInstanceState);
binding = DialogPlaybackParameterBinding.inflate(getLayoutInflater());
initUI();
diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java
index 529e53442..0d57ce174 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java
@@ -21,7 +21,9 @@ import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
+import com.evernote.android.state.State;
import com.jakewharton.rxbinding4.widget.RxTextView;
+import com.livefront.bridge.Bridge;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
@@ -41,9 +43,6 @@ import org.schabi.newpipe.views.FocusOverlayView;
import java.util.concurrent.TimeUnit;
-import icepick.Icepick;
-import icepick.State;
-
/*
* Created by Christian Schabesberger on 31.08.15.
*
@@ -93,7 +92,7 @@ public class SettingsActivity extends AppCompatActivity implements
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceBundle);
- Icepick.restoreInstanceState(this, savedInstanceBundle);
+ Bridge.restoreInstanceState(this, savedInstanceBundle);
final boolean restored = savedInstanceBundle != null;
final SettingsLayoutBinding settingsLayoutBinding =
@@ -125,7 +124,7 @@ public class SettingsActivity extends AppCompatActivity implements
@Override
protected void onSaveInstanceState(@NonNull final Bundle outState) {
super.onSaveInstanceState(outState);
- Icepick.saveInstanceState(this, outState);
+ Bridge.saveInstanceState(this, outState);
}
@Override
diff --git a/app/src/main/java/org/schabi/newpipe/util/BridgeStateSaverInitializer.java b/app/src/main/java/org/schabi/newpipe/util/BridgeStateSaverInitializer.java
new file mode 100644
index 000000000..aeda4717c
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/util/BridgeStateSaverInitializer.java
@@ -0,0 +1,61 @@
+package org.schabi.newpipe.util;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.evernote.android.state.StateSaver;
+import com.livefront.bridge.Bridge;
+import com.livefront.bridge.SavedStateHandler;
+import com.livefront.bridge.ViewSavedStateHandler;
+
+/**
+ * Configures Bridge's state saver.
+ */
+public final class BridgeStateSaverInitializer {
+
+ public static void init(final Context context) {
+ Bridge.initialize(
+ context,
+ new SavedStateHandler() {
+ @Override
+ public void saveInstanceState(
+ @NonNull final Object target,
+ @NonNull final Bundle state) {
+ StateSaver.saveInstanceState(target, state);
+ }
+
+ @Override
+ public void restoreInstanceState(
+ @NonNull final Object target,
+ @Nullable final Bundle state) {
+ StateSaver.restoreInstanceState(target, state);
+ }
+ },
+ new ViewSavedStateHandler() {
+ @NonNull
+ @Override
+ public Parcelable saveInstanceState(
+ @NonNull final T target,
+ @Nullable final Parcelable parentState) {
+ return StateSaver.saveInstanceState(target, parentState);
+ }
+
+ @Nullable
+ @Override
+ public Parcelable restoreInstanceState(
+ @NonNull final T target,
+ @Nullable final Parcelable state) {
+ return StateSaver.restoreInstanceState(target, state);
+ }
+ }
+ );
+ }
+
+ private BridgeStateSaverInitializer() {
+ }
+}
diff --git a/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java b/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java
index f79e1e3a3..91b5ebd07 100644
--- a/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java
+++ b/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java
@@ -19,6 +19,9 @@
package org.schabi.newpipe.views;
+import static org.schabi.newpipe.MainActivity.DEBUG;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
import android.animation.ValueAnimator;
import android.content.Context;
import android.os.Parcelable;
@@ -29,18 +32,15 @@ import android.widget.LinearLayout;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
+import com.evernote.android.state.State;
+import com.livefront.bridge.Bridge;
+
import org.schabi.newpipe.ktx.ViewUtils;
import java.lang.annotation.Retention;
import java.util.ArrayList;
import java.util.List;
-import icepick.Icepick;
-import icepick.State;
-
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-import static org.schabi.newpipe.MainActivity.DEBUG;
-
/**
* A view that can be fully collapsed and expanded.
*/
@@ -207,12 +207,12 @@ public class CollapsibleView extends LinearLayout {
@Nullable
@Override
public Parcelable onSaveInstanceState() {
- return Icepick.saveInstanceState(this, super.onSaveInstanceState());
+ return Bridge.saveInstanceState(this, super.onSaveInstanceState());
}
@Override
public void onRestoreInstanceState(final Parcelable state) {
- super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state));
+ super.onRestoreInstanceState(Bridge.restoreInstanceState(this, state));
ready();
}