From 96246dc696d5941ef1359c36686b603e6184f3c7 Mon Sep 17 00:00:00 2001 From: abidin toumi Date: Sun, 3 Oct 2021 18:57:47 +0000 Subject: [PATCH 01/39] fix(lang): Weblate translation (Arabic) Currently translated at 100.0% (354 of 354 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/ar/ --- app/src/main/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 458c653..108cac4 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -345,7 +345,7 @@ ايقاف عند الضغط على زر العودة تاريخ ووقت البناء خطأ في الوصول للشبكة، تحقق من اتصالك - فلترة القائمة + تنقيح القائمة إعدادات التشغيل في الخلفية إيقاف تشغيل الكل تابع تشغيل الصوت في الخلفية From 792bf89bb05668c0f6c56424f4428ec1cefa4609 Mon Sep 17 00:00:00 2001 From: Ivano Peddis Date: Tue, 5 Oct 2021 17:04:07 +0000 Subject: [PATCH 02/39] fix(lang): Weblate translation (Sardinian) Currently translated at 100.0% (15 of 15 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/sc/ --- fastlane/metadata/android/sc/changelogs/1051.txt | 5 +++++ fastlane/metadata/android/sc/changelogs/1052.txt | 2 ++ fastlane/metadata/android/sc/changelogs/1053.txt | 7 +++++++ fastlane/metadata/android/sc/changelogs/1054.txt | 1 + fastlane/metadata/android/sc/changelogs/1055.txt | 1 + fastlane/metadata/android/sc/changelogs/1056.txt | 6 ++++++ fastlane/metadata/android/sc/changelogs/1057.txt | 6 ++++++ 7 files changed, 28 insertions(+) create mode 100644 fastlane/metadata/android/sc/changelogs/1051.txt create mode 100644 fastlane/metadata/android/sc/changelogs/1052.txt create mode 100644 fastlane/metadata/android/sc/changelogs/1053.txt create mode 100644 fastlane/metadata/android/sc/changelogs/1054.txt create mode 100644 fastlane/metadata/android/sc/changelogs/1055.txt create mode 100644 fastlane/metadata/android/sc/changelogs/1056.txt create mode 100644 fastlane/metadata/android/sc/changelogs/1057.txt diff --git a/fastlane/metadata/android/sc/changelogs/1051.txt b/fastlane/metadata/android/sc/changelogs/1051.txt new file mode 100644 index 0000000..437c8e9 --- /dev/null +++ b/fastlane/metadata/android/sc/changelogs/1051.txt @@ -0,0 +1,5 @@ +- currègida sa limba predefinida de s'aplicatzione a su primu incumintzu (@kosharskiy) +- Tradutziones de s'ischermada de impostatziones de is limbas uk e ru (@kosharskiy) +- limpiadura de su documentu app/build.gradle (@kosharskiy) +- currègidu problema de visualizatzione de is meta-datos de vìdeu (@kosharskiy) +- tradutziones agiornadas diff --git a/fastlane/metadata/android/sc/changelogs/1052.txt b/fastlane/metadata/android/sc/changelogs/1052.txt new file mode 100644 index 0000000..9c6bdc3 --- /dev/null +++ b/fastlane/metadata/android/sc/changelogs/1052.txt @@ -0,0 +1,2 @@ +- implementada sa modìfica de serbidore in sa rubrica de is serbidores (@kosharskiy) +- Tradutziones agiornadas diff --git a/fastlane/metadata/android/sc/changelogs/1053.txt b/fastlane/metadata/android/sc/changelogs/1053.txt new file mode 100644 index 0000000..65906b3 --- /dev/null +++ b/fastlane/metadata/android/sc/changelogs/1053.txt @@ -0,0 +1,7 @@ +- Fatu X de manera chi in modalidade pip firmet s'àudiu de isfundu de manera curreta (@dhk2) +- Annànghida s'optzione de iscantzellare sa cronologia de chirca a su menù de impostatziones (@dhk2) +- Currègidos is valores predefinidos de peruna limba seletzionada in totu is limbas de vìdeu +- Agiornada biblioteca de iconas +- Annànghidu indicadore de carrigamentu a sa riprodutzione vìdeu +- Currègidos problemas de vìdeu bòidu in serbidores chi oferint vìdeu 0p +- Tradutziones agiornadas diff --git a/fastlane/metadata/android/sc/changelogs/1054.txt b/fastlane/metadata/android/sc/changelogs/1054.txt new file mode 100644 index 0000000..42bc745 --- /dev/null +++ b/fastlane/metadata/android/sc/changelogs/1054.txt @@ -0,0 +1 @@ +- Annànghidu suportu pro sa riprodutzione HLS diff --git a/fastlane/metadata/android/sc/changelogs/1055.txt b/fastlane/metadata/android/sc/changelogs/1055.txt new file mode 100644 index 0000000..45cce3d --- /dev/null +++ b/fastlane/metadata/android/sc/changelogs/1055.txt @@ -0,0 +1 @@ +- Currègidu modellu erradu chi impediat sa riprodutzione vìdeu diff --git a/fastlane/metadata/android/sc/changelogs/1056.txt b/fastlane/metadata/android/sc/changelogs/1056.txt new file mode 100644 index 0000000..cad627f --- /dev/null +++ b/fastlane/metadata/android/sc/changelogs/1056.txt @@ -0,0 +1,6 @@ +# 1.1.0 (2021-02-01) + + +### Funtzionalidades + +* **lang:** Annànghidu Finlandesu 02bcd74 diff --git a/fastlane/metadata/android/sc/changelogs/1057.txt b/fastlane/metadata/android/sc/changelogs/1057.txt new file mode 100644 index 0000000..da07aa7 --- /dev/null +++ b/fastlane/metadata/android/sc/changelogs/1057.txt @@ -0,0 +1,6 @@ +## 1.1.1 (2021-02-05) + + +### Faddinas Currègidas + +* Bogadu SHA dae su nòmine de versione pro currègere is versiones de fdroid 9dc7d54 From 697044fba32c31613484c4e1fc5260bc5fdde8a7 Mon Sep 17 00:00:00 2001 From: Ivano Peddis Date: Tue, 5 Oct 2021 17:58:33 +0000 Subject: [PATCH 03/39] fix(lang): Weblate translation (Sardinian) Currently translated at 13.5% (48 of 354 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/sc/ --- app/src/main/res/values-sc/strings.xml | 50 +++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index a6b3dae..caaef97 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -1,2 +1,50 @@ - \ No newline at end of file + + Intra + Crae + Chirca + Contu + Contu + impostatziones + Intra + Intra + Reghente + Locale + Àteru + Cumpartzi + Modalidade iscura + Tema de s\'aplicatzione + Riprodusidore de vìdeu Torrent + Versione + Cuntenutu pro adultos + Ammustra cuntenutu pro adultos + Serbidore PeerTube + URL non bàlidu. + Riprodutzione in isfundu + Contu: + Sutiscritos: + Nòmine usuàriu + Crae + Annanghe + A pitzu de + Atentzione! + Chirca + Impostatziones + Chirca PeerTube + Serbidore + Perunu resurtadu + Filtru de limba + Litzèntzia + Eja + Eticheta + Descritzione: + A pitzu de + Chirca + Sarva + 0.75x + 1.25x + ImpostatzionesAtividade2 + Contu + Nono + IN DIRETA + \ No newline at end of file From cceec2f6fffc438dc97ee738a59d71ad61200a40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Gonz=C3=A1lez?= Date: Thu, 7 Oct 2021 01:15:16 +0000 Subject: [PATCH 04/39] fix(lang): Weblate translation (Spanish) Currently translated at 100.0% (15 of 15 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/es/ --- fastlane/metadata/android/es-ES/changelogs/1056.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/es-ES/changelogs/1056.txt b/fastlane/metadata/android/es-ES/changelogs/1056.txt index 57fd964..0b389a2 100644 --- a/fastlane/metadata/android/es-ES/changelogs/1056.txt +++ b/fastlane/metadata/android/es-ES/changelogs/1056.txt @@ -1,4 +1,4 @@ -# 1.1.0 (01-02-2021) +# 1.1.0 (2021-02-01) ### Características From 9453b5a2efa800c50c24b3086cd8800fba64e182 Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Tue, 12 Oct 2021 11:07:30 +0000 Subject: [PATCH 05/39] fix(lang): Weblate translation (Arabic) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/ar/ --- app/src/main/res/values-ar/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 108cac4..2d176b2 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -361,4 +361,7 @@ حفظ تعطيل التحقق من شهادة SSL تجاهل الاتصالات غير الآمنة. استخدم هذا فقط إذا كنت تعرف الخادم الذي تتصل به. يتطلب إعادة تشغيل التطبيق. + سرعة التشغيل الافتراضية + حدد سرعة تشغيل الفيديو العامة + دفتر العناوين \ No newline at end of file From 5c9c90cc050226a117653be00fbc4740069c5429 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Mon, 11 Oct 2021 23:54:50 +0000 Subject: [PATCH 06/39] fix(lang): Weblate translation (French) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/fr/ --- app/src/main/res/values-fr/strings.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f0c1c1c..580c550 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -171,7 +171,7 @@ allemand langue des signes allemande guarani - goudjarâtî + goudjarati haïtien haoussa hébreu @@ -361,4 +361,7 @@ Désactiver la vérification des certificats SSL Ignorer les connexions non sécuritaires. Utiliser ceci seulement si vous connaissez le serveur sur lequel vous vous connectez. Requiert un redémarrage de l\'application. DIRECT + Vitesse de lecture par défaut + Sélectionnez la vitesse globale de lecture vidéo + Carnet d\'adresses \ No newline at end of file From 1202decd38f4db38284cfad04c8aa5f769358291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Mon, 11 Oct 2021 15:35:12 +0000 Subject: [PATCH 07/39] fix(lang): Weblate translation (Turkish) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/tr/ --- app/src/main/res/values-tr/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7b14121..6c0c7b4 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -371,4 +371,7 @@ Güvenli olmayan bağlantıları yok sayın. Bunu yalnızca bağlandığınız sunucuyu biliyorsanız kullanın. Uygulamanın yeniden başlatılmasını gerektirir. Kaydet CANLI + Öntanımlı Oynatma Hızı + Genel Video Oynatma Hızını Seçin + Adres Defteri \ No newline at end of file From fc07026a0ac2d88de671a2c9cbb58f75dc634989 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 12 Oct 2021 03:22:15 +0000 Subject: [PATCH 08/39] fix(lang): Weblate translation (Chinese (Traditional)) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/zh_Hant/ --- app/src/main/res/values-zh-rTW/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 6cbbcb8..13fb927 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -356,4 +356,7 @@ 忽略不安全的連線。僅在您了解您要連線的伺服器時才使用此選項。需要重新啟動應用程式。 儲存 直播 + 預設播放速度 + 選取全域影片播放速度 + 通訊錄 \ No newline at end of file From 672760accef0239dc646667f50972d7587575a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Mon, 11 Oct 2021 11:57:36 +0000 Subject: [PATCH 09/39] =?UTF-8?q?fix(lang):=20Weblate=20translation=20(Nor?= =?UTF-8?q?wegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 50.0% (178 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/nb_NO/ --- app/src/main/res/values-nb-rNO/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 649bfc6..eb65289 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -195,4 +195,9 @@ Sanntid Skru av SSL-sertifikatssjekk Ignorer usikre tilkoblinger. Kun bruk dette hvis du vet hvilken tjener du kobler til. Krever programomstart. + Spansk + Indonesisk + Adressebok + Forvalgt avspillingshastighet + Velg videoavspillingshastighet for hele systemet \ No newline at end of file From a5b7279bfc23b8b268ab3db5fe224c6d6253af1d Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Mon, 11 Oct 2021 23:41:30 +0000 Subject: [PATCH 10/39] fix(lang): Weblate translation (German) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/de/ --- app/src/main/res/values-de/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 87c0e50..f3c1888 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -356,4 +356,7 @@ SSL-Zertifikatsprüfung deaktivieren Unsichere Verbindungen ignorieren. Verwenden Sie dies nur, wenn Sie den Server kennen, mit dem Sie sich verbinden. Erfordert einen Neustart der Anwendung. LIVE + Standard-Wiedergabegeschwindigkeit + Wählen Sie die globale Videowiedergabegeschwindigkeit + Adressbuch \ No newline at end of file From 18e1221abab271ef5c9cc821a75007e2d9981a78 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Tue, 12 Oct 2021 00:02:48 +0000 Subject: [PATCH 11/39] fix(lang): Weblate translation (Spanish) Currently translated at 83.4% (297 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/es/ --- app/src/main/res/values-es/strings.xml | 113 ++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index de5be05..c104ff9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -118,13 +118,13 @@ Cerrar sesión Una URL válida es requerida La etiqueta de servidor es requerida - Ruso (Lenguaje de señas) + Lengua de señas rusa Ruso - Romano + Rumano Portugués Polaco Noruego - Pakistaní (Lenguaje de señas) + Lengua de señas de Pakistán Francés (Lenguaje de señas) Francés Finlandés @@ -193,4 +193,111 @@ Pausa la reproducción de fondo al presionar atrás durante la reproducción de vídeo. EN VIVO Corso + Navajo + Esloveno + Fiyiano + Chuvasio + Cree + Holandés + Dzongkha + Estonio + Ewe + Hindi + Hiri Motu + Húngaro + Islandés + Irlandés + Italiano + Kanuri + Malgache + Malayalam + Maltés + Manés + Maori + Panyabí + Persa + Romanche + Serbio + Tamil + Telugu + Tibetano + Tigriña + Tsonga + Tswana + Turco + Turcomano + Twi + Uigur + Mongol + Ganda + Xhosa + Tailandés + Luxemburgués + Javanés + Córnico + Dhivehi + Feroés + Fula + Gallego + Georgiano + Alemán + Lengua de señas alemana + Guaraní + Guyaratí + Haitiano + Hausa + Hebreo + Herero + Igbo + Indonesio + Inuktitut + Inupiaq + Japonés + Lengua de señas japonesa + Kalaallisut + Kannada + Cachemiro + Klingon + Coreano + Kurdo + Lao + Letón + Kazajo + Jémer + Kikuyu + Macedonio + Noruego bokmål + Noruego nynorsk + Occitano + Ojibwa + Pastún + Quechua + Lenguaje de señas de Arabia Saudita + Eslovaco + Somalí + Lengua de señas sudafricana + Español + Sueco + Lengua de señas sueca + Tagalo + Tahitiano + Tayiko + Tonga (Islas Tonga) + Ucraniano + Urdu + Uzbeko + Venda + Vietnamita + Valón + Galés + Frisón occidental + Wolof + Yidis + Yoruba + Zulú + Velocidad de reproducción por defecto + Seleccione la velocidad global de reproducción de vídeo + Malayo (macrolengua) + Gaélico escocés + Serbo-croata \ No newline at end of file From 76ef906e36cb2b448d8f117a4f04fc7f1dd75845 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Mon, 11 Oct 2021 23:43:47 +0000 Subject: [PATCH 12/39] fix(lang): Weblate translation (Italian) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/it/ --- app/src/main/res/values-it/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9b2dc8e..8c8a789 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -356,4 +356,7 @@ Avanzato Salva Ignora le connessioni insicure. Usalo solo se conosci il server a cui ti stai connettendo. Richiede il riavvio dell\'applicazione. + Rubrica + Velocità di riproduzione predefinita + Seleziona la velocità globale di riproduzione video \ No newline at end of file From 5fe4353db18e2566b60c8280b92956096217ead1 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Mon, 11 Oct 2021 23:45:55 +0000 Subject: [PATCH 13/39] fix(lang): Weblate translation (Finnish) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/fi/ --- app/src/main/res/values-fi/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index eae522d..e195b66 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -356,4 +356,7 @@ Hae Leima SUORA + Oletusarvoinen toistonopeus + Valitse yleinen videon toistonopeus + Osoitekirja \ No newline at end of file From 1995e623bde9a8c0aa64ed73c2132c5da76daaa0 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Tue, 12 Oct 2021 00:17:37 +0000 Subject: [PATCH 14/39] fix(lang): Weblate translation (Portuguese) Currently translated at 99.4% (354 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/pt/ --- app/src/main/res/values-pt/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 63409ea..cd14004 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -356,4 +356,5 @@ Guardar Desativar a verificação do certificado SSL Ignorar conexões inseguras. Use isto apenas se souber a qual servidor está a conectar-se. Requer reinicialização da aplicação. + Velocidade de reprodução predefinida \ No newline at end of file From 6707cec7e5194ac1f74e2adc1ab26e65e64dc0f9 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Mon, 11 Oct 2021 23:44:59 +0000 Subject: [PATCH 15/39] fix(lang): Weblate translation (French) Currently translated at 71.4% (15 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/fr/ --- fastlane/metadata/android/fr-FR/full_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt index c259c24..c848695 100644 --- a/fastlane/metadata/android/fr-FR/full_description.txt +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -1,6 +1,6 @@ Thorium est un client PeerTube qui peut se connecter à tout serveur PeerTube exécutant la version v1.1.0-alpha.2 ou supérieure. -PeerTube est une plateforme de streaming vidéo fédérée (ActivityPub) utilisant le P2P (BitTorrent) directement dans le navigateur web. Pour plus d'informations, veuillez visiter https://joinpeertube.org/ pour plus d'informations et une liste de serveurs. +PeerTube est une plateforme de streaming vidéo fédérée (ActivityPub) utilisant le P2P (BitTorrent) directement dans le navigateur web. Pour plus d'informations, veuillez visiter https://joinpeertube.org/ Ce client est livré préconfiguré avec un serveur PeerTube géré par le créateur de l'application - et non par le projet PeerTube lui-même, dont la liste est disponible sur http://instances.joinpeertube.org/ - afin de vous permettre d'avoir un avant-goût de ce dont le client est capable. Choisissez votre serveur pour affiner votre expérience ! From 42a01d45bcd648fbf20c2d6b5bb18ae4fede2eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Mon, 11 Oct 2021 15:49:31 +0000 Subject: [PATCH 16/39] fix(lang): Weblate translation (Turkish) Currently translated at 100.0% (21 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/tr/ --- .../metadata/android/tr-TR/changelogs/1056.txt | 2 +- .../metadata/android/tr-TR/changelogs/1058.txt | 6 ++++++ .../metadata/android/tr-TR/changelogs/1059.txt | 12 ++++++++++++ .../metadata/android/tr-TR/changelogs/1060.txt | 11 +++++++++++ .../metadata/android/tr-TR/changelogs/1061.txt | 17 +++++++++++++++++ .../metadata/android/tr-TR/changelogs/1062.txt | 6 ++++++ .../metadata/android/tr-TR/changelogs/1063.txt | 6 ++++++ .../metadata/android/tr-TR/full_description.txt | 6 +++--- 8 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 fastlane/metadata/android/tr-TR/changelogs/1058.txt create mode 100644 fastlane/metadata/android/tr-TR/changelogs/1059.txt create mode 100644 fastlane/metadata/android/tr-TR/changelogs/1060.txt create mode 100644 fastlane/metadata/android/tr-TR/changelogs/1061.txt create mode 100644 fastlane/metadata/android/tr-TR/changelogs/1062.txt create mode 100644 fastlane/metadata/android/tr-TR/changelogs/1063.txt diff --git a/fastlane/metadata/android/tr-TR/changelogs/1056.txt b/fastlane/metadata/android/tr-TR/changelogs/1056.txt index 9b1acb6..2be3d63 100644 --- a/fastlane/metadata/android/tr-TR/changelogs/1056.txt +++ b/fastlane/metadata/android/tr-TR/changelogs/1056.txt @@ -1,4 +1,4 @@ -# 1.1.0 (2021-02-01) +# 1.1.0 (1 Şubat 2021) ### Özellikler diff --git a/fastlane/metadata/android/tr-TR/changelogs/1058.txt b/fastlane/metadata/android/tr-TR/changelogs/1058.txt new file mode 100644 index 0000000..d9f22b2 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/1058.txt @@ -0,0 +1,6 @@ +# 1.2.0 (7 Şubat 2021) + + +### Özellikler + +* Video listelerinde canlı videoları işaretle 8518b80 diff --git a/fastlane/metadata/android/tr-TR/changelogs/1059.txt b/fastlane/metadata/android/tr-TR/changelogs/1059.txt new file mode 100644 index 0000000..7e7f651 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/1059.txt @@ -0,0 +1,12 @@ +# 1.3.0 (13 Şubat 2021) + + +### Hata Düzeltmeleri + +* Bozuk üst menüyü düzeltmek için video listesi Kotlin'e dönüştürüldü 06ace0d + + +### Özellikler + +* Yükleme ve hatalar için video küçük resmi yer tutucusu eklendi 830b197 +* Üst tarih yardımcısı Kotlin'e dönüştürüldü 1c34556 diff --git a/fastlane/metadata/android/tr-TR/changelogs/1060.txt b/fastlane/metadata/android/tr-TR/changelogs/1060.txt new file mode 100644 index 0000000..1d3f78d --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/1060.txt @@ -0,0 +1,11 @@ +# 1.4.0 (20 Şubat 2021) + + +### Hata Düzeltmeleri + +* SDK 21,22,23,24 aygıtlarının başlangıçta çökmesi, [#262](https://git.techdroid.com/sschueller/peertube/issues/262) düzeltildi 5622b76 + + +### Özellikler + +* Genel oynatma hızı ayarı eklendi fa79b2d diff --git a/fastlane/metadata/android/tr-TR/changelogs/1061.txt b/fastlane/metadata/android/tr-TR/changelogs/1061.txt new file mode 100644 index 0000000..4ed1808 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/1061.txt @@ -0,0 +1,17 @@ +# 1.5.0 (5 Ekim 2021) + + +### Hata Düzeltmeleri + +* Fastlane için gerekli eksik açıklama dosyaları eklendi 38eb072 +* android güncellemesi +* jdk güncellemesi +* **lang:** Weblate çeviri güncellemeleri +* node sürümü +* Docker'da gradle güncellendi 79c9e97 + + +### Özellikler + +* Android kütüphane ve gradle güncellemeleri 5f2847c +* **lang:** Weblate kullanılarak Arnavutça, Esperanto, Sardinyaca ve Sinhala çevirileri eklendi diff --git a/fastlane/metadata/android/tr-TR/changelogs/1062.txt b/fastlane/metadata/android/tr-TR/changelogs/1062.txt new file mode 100644 index 0000000..5f02dd7 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/1062.txt @@ -0,0 +1,6 @@ +## 1.5.1 (10 Ekim 2021) + + +### Hata Düzeltmeleri + +* uyumsuz diller (android play) b4efa27 diff --git a/fastlane/metadata/android/tr-TR/changelogs/1063.txt b/fastlane/metadata/android/tr-TR/changelogs/1063.txt new file mode 100644 index 0000000..765d727 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/1063.txt @@ -0,0 +1,6 @@ +## 1.5.2 (11 Ekim 2021) + + +### Hata Düzeltmeleri + +* uyumsuz diller kaldırıldı (android play) 4fd8ff9 diff --git a/fastlane/metadata/android/tr-TR/full_description.txt b/fastlane/metadata/android/tr-TR/full_description.txt index c1d19d0..93854ff 100644 --- a/fastlane/metadata/android/tr-TR/full_description.txt +++ b/fastlane/metadata/android/tr-TR/full_description.txt @@ -1,12 +1,12 @@ Thorium, sürüm v1.1.0-alpha.2 veya daha üstünü çalıştıran herhangi bir PeerTube sunucusuna bağlanabilen bir PeerTube istemcisidir. -PeerTube, doğrudan web tarayıcısında P2P (BitTorrent) kullanan bir federe (ActivityPub) video yayınlama platformudur. Daha fazla bilgi ve sunucu listesi için lütfen https://joinpeertube.org/ adresini ziyaret edin. +PeerTube, doğrudan web tarayıcısında P2P (BitTorrent) kullanan bir dağıtık (ActivityPub) video yayınlama platformudur. Daha fazla bilgi için lütfen https://joinpeertube.org/ adresini ziyaret edin. -Bu istemci, uygulamanın yaratıcısı tarafından - PeerTube projesinin kendisi değil, http://instances.joinpeertube.org/ adresinde daha fazlasını listelemektedir - yönetilen bir PeerTube sunucusuyla önceden yapılandırılmış olarak gelir, böylece istemcinin neler yapabileceğini görebilirsiniz. Deneyiminizi kendinize göre ayarlamak için sunucunuzu seçin! +Bu istemci, uygulamanın yaratıcısı tarafından yönetilen - PeerTube projesinin kendisi değil, http://instances.joinpeertube.org/ adresinde daha fazlası listelenmektedir - bir PeerTube sunucusuyla önceden yapılandırılmış olarak gelir, böylece istemcinin neler yapabileceğini görebilirsiniz. Deneyiminizi kendinize göre ayarlamak için sunucunuzu seçin! Mevcut Özellikler: - Herhangi bir PeerTube sunucusuna bağlanın -- Videoyu torrent ile paylaşma veya doğrudan oynatma +- Videoyu torrent aracılığıyla paylaşın veya doğrudan oynatın - PeerTube'de arayın - Video indirin / paylaşın - Temalar / Karanlık mod From ed28fe3789ae60d1a13de0e8955f7f45971bf49e Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Mon, 11 Oct 2021 23:44:39 +0000 Subject: [PATCH 17/39] fix(lang): Weblate translation (Italian) Currently translated at 71.4% (15 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/it/ --- fastlane/metadata/android/it-IT/full_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt index eeccf69..1adb425 100644 --- a/fastlane/metadata/android/it-IT/full_description.txt +++ b/fastlane/metadata/android/it-IT/full_description.txt @@ -1,6 +1,6 @@ Thorium è un client PeerTube in grado di connettersi a qualsiasi server peertube che esegue la versione v1.1.0-alpha.2 o successiva. -PeerTube è una piattaforma di streaming video federata (ActivityPub) che utilizza P2P (BitTorrent) direttamente nel browser web. Per ulteriori informazioni, visitare https://joinpeertube.org/ per ulteriori informazioni e un elenco dei server. +PeerTube è una piattaforma di streaming video federata (ActivityPub) che utilizza P2P (BitTorrent) direttamente nel browser web. Per ulteriori informazioni, visitare https://joinpeertube.org/ Questo client viene preconfigurato con un server PeerTube gestito dal creatore dell'applicazione – non il progetto PeerTube stesso, che elenca di più su http://instances.joinpeertube.org/ – per consentire di avere un assaggio di ciò che il client è in grado di. Scegli il tuo server per ottimizzare la tua esperienza! From 68a57c8649faa88de5f6bed6ff5b1c775b639ca3 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 11 Oct 2021 10:52:05 +0000 Subject: [PATCH 18/39] fix(lang): Weblate translation (Ukrainian) Currently translated at 100.0% (21 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/uk/ --- fastlane/metadata/android/uk/changelogs/1058.txt | 6 ++++++ fastlane/metadata/android/uk/changelogs/1059.txt | 12 ++++++++++++ fastlane/metadata/android/uk/changelogs/1060.txt | 11 +++++++++++ fastlane/metadata/android/uk/changelogs/1061.txt | 16 ++++++++++++++++ fastlane/metadata/android/uk/changelogs/1062.txt | 6 ++++++ fastlane/metadata/android/uk/changelogs/1063.txt | 6 ++++++ .../metadata/android/uk/full_description.txt | 2 +- 7 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/uk/changelogs/1058.txt create mode 100644 fastlane/metadata/android/uk/changelogs/1059.txt create mode 100644 fastlane/metadata/android/uk/changelogs/1060.txt create mode 100644 fastlane/metadata/android/uk/changelogs/1061.txt create mode 100644 fastlane/metadata/android/uk/changelogs/1062.txt create mode 100644 fastlane/metadata/android/uk/changelogs/1063.txt diff --git a/fastlane/metadata/android/uk/changelogs/1058.txt b/fastlane/metadata/android/uk/changelogs/1058.txt new file mode 100644 index 0000000..8fcc389 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1058.txt @@ -0,0 +1,6 @@ +# 1.2.0 (2021-02-07) + + +### Особливості + +* Позначки відео наживо у списках відео 8518b80 diff --git a/fastlane/metadata/android/uk/changelogs/1059.txt b/fastlane/metadata/android/uk/changelogs/1059.txt new file mode 100644 index 0000000..07965dd --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1059.txt @@ -0,0 +1,12 @@ +# 1.3.0 (2021-02-13) + + +### Виправлення помилок + +* Перетворено відеодобірки на Kotlin, щоб виправити пошкодження верхнього меню 06ace0d + + +### Особливості + +* Додано відео thumb placehoder для завантаження і помилок 830b197 +* Перетворено метадані дати помічника на kotlin 1c34556 diff --git a/fastlane/metadata/android/uk/changelogs/1060.txt b/fastlane/metadata/android/uk/changelogs/1060.txt new file mode 100644 index 0000000..5bdb78a --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1060.txt @@ -0,0 +1,11 @@ +# 1.4.0 (2021-02-20) + +### Виправлення помилок + + +* Збій sdk пристроїв 21,22,23,24 під час запуску, виправлення [#262](https://git.techdroid.com/sschueller/peertube/issues/262) 5622b76 + + +### Особливості + +* додано налаштування загальної швидкості відтворення fa79b2d diff --git a/fastlane/metadata/android/uk/changelogs/1061.txt b/fastlane/metadata/android/uk/changelogs/1061.txt new file mode 100644 index 0000000..7b77664 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1061.txt @@ -0,0 +1,16 @@ +# 1.5.0 (2021-10-05) + + +### Виправлено помилки + +* Додано відсутні файли опису, необхідні для fastlane 38eb072 +* Android оновлення +* Оновлення JDK 8889ab1 і ddb0f73 +* Оновлено переклади +* вузол версії 36b840f і 3ee6071 +* Оновлено gradle у docker 79c9e97 + +### Особливості + +* Android lib оновлення і gradle 5f2847c +* Додано переклади: албанською, есперанто, сардинською, сингальською diff --git a/fastlane/metadata/android/uk/changelogs/1062.txt b/fastlane/metadata/android/uk/changelogs/1062.txt new file mode 100644 index 0000000..435bbdd --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1062.txt @@ -0,0 +1,6 @@ +## 1.5.1 (2021-10-10) + + +### Виправлення помилок + +* несумісні мови (android play) b4efa27 diff --git a/fastlane/metadata/android/uk/changelogs/1063.txt b/fastlane/metadata/android/uk/changelogs/1063.txt new file mode 100644 index 0000000..bb8c056 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1063.txt @@ -0,0 +1,6 @@ +## 1.5.2 (2021-10-11) + + +### Виправлення помилок + +* вилучено несумісні мови (android play) 4fd8ff9 diff --git a/fastlane/metadata/android/uk/full_description.txt b/fastlane/metadata/android/uk/full_description.txt index 373f8e8..9a61ef0 100644 --- a/fastlane/metadata/android/uk/full_description.txt +++ b/fastlane/metadata/android/uk/full_description.txt @@ -1,6 +1,6 @@ Thorium — це клієнт PeerTube, який може під'єднуватися до будь-якого сервера peertube, що працює на версії v1.1.0-alpha.2 або новіших. -PeerTube - це об'єднана (ActivityPub) платформа для потокового відео, що використовує P2P (BitTorrent) безпосередньо у браузері. Додаткові відомості та перелік серверів ви знайдете за адресою https://joinpeertube.org/ . +PeerTube - це об'єднана (ActivityPub) платформа для потокового відео, що використовує P2P (BitTorrent) безпосередньо у браузері. Додаткові відомості ви знайдете за адресою https://joinpeertube.org/ . Цей клієнт постачається з попередньо налаштованим сервером PeerTube, керованим творцем програми, а не самим проєктом PeerTube, який містить докладніші відомості на сайті http://instance.joinpeertube.org/, щоб дозволити вам відчути, на що здатний клієнт. Виберіть свій сервер, щоб налаштувати все що потрібно! From 3ec928309333576e156c4b4ee290f0b6025c309c Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 11 Oct 2021 10:48:57 +0000 Subject: [PATCH 19/39] fix(lang): Weblate translation (Ukrainian) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/uk/ --- app/src/main/res/values-uk/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 66dfaf2..4e05b24 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -356,4 +356,7 @@ Додатково Зберегти НАЖИВО + Типова швидкість відтворення + Вибрати загальну швидкість відтворення відео + Адресна книга \ No newline at end of file From 8280bfb0a4fac45c62a98de924249d43a77e8c38 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 12 Oct 2021 03:23:06 +0000 Subject: [PATCH 20/39] fix(lang): Weblate translation (Chinese (Traditional)) Currently translated at 95.2% (20 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/zh_Hant/ --- fastlane/metadata/android/zh-TW/changelogs/1058.txt | 6 ++++++ fastlane/metadata/android/zh-TW/changelogs/1059.txt | 12 ++++++++++++ fastlane/metadata/android/zh-TW/changelogs/1060.txt | 11 +++++++++++ fastlane/metadata/android/zh-TW/changelogs/1062.txt | 6 ++++++ fastlane/metadata/android/zh-TW/changelogs/1063.txt | 6 ++++++ fastlane/metadata/android/zh-TW/full_description.txt | 2 +- 6 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/zh-TW/changelogs/1058.txt create mode 100644 fastlane/metadata/android/zh-TW/changelogs/1059.txt create mode 100644 fastlane/metadata/android/zh-TW/changelogs/1060.txt create mode 100644 fastlane/metadata/android/zh-TW/changelogs/1062.txt create mode 100644 fastlane/metadata/android/zh-TW/changelogs/1063.txt diff --git a/fastlane/metadata/android/zh-TW/changelogs/1058.txt b/fastlane/metadata/android/zh-TW/changelogs/1058.txt new file mode 100644 index 0000000..98ca11a --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/1058.txt @@ -0,0 +1,6 @@ +# 1.2.0 (2021-02-07) + + +### 功能 + +* 在影片清單中標記直播清單 8518b80 diff --git a/fastlane/metadata/android/zh-TW/changelogs/1059.txt b/fastlane/metadata/android/zh-TW/changelogs/1059.txt new file mode 100644 index 0000000..e418245 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/1059.txt @@ -0,0 +1,12 @@ +# 1.3.0 (2021-02-13) + + +### 錯誤修復 + +* 將影片清單轉換為 Kotlin 以修復損毀的頂部選單 06ace0d + + +### 功能 + +* 新增正在載入與錯誤的影片縮圖佔位符號 830b197 +* 將詮釋日期協助程式轉換為 kotlin 1c34556 diff --git a/fastlane/metadata/android/zh-TW/changelogs/1060.txt b/fastlane/metadata/android/zh-TW/changelogs/1060.txt new file mode 100644 index 0000000..b0bd092 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/1060.txt @@ -0,0 +1,11 @@ +# 1.4.0 (2021-02-20) + + +### 臭蟲修復 + +* 修復啟動時在裝置 sdk 21,22,23,24 上的當機問題 [#262](https://git.techdroid.com/sschueller/peertube/issues/262) 5622b76 + + +### 功能 + +* 新增全域播放速度設定 fa79b2d diff --git a/fastlane/metadata/android/zh-TW/changelogs/1062.txt b/fastlane/metadata/android/zh-TW/changelogs/1062.txt new file mode 100644 index 0000000..32edbec --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/1062.txt @@ -0,0 +1,6 @@ +## 1.5.1 (2021-10-10) + + +### 臭蟲修復 + +* 不相容的語言 (android play) b4efa27 diff --git a/fastlane/metadata/android/zh-TW/changelogs/1063.txt b/fastlane/metadata/android/zh-TW/changelogs/1063.txt new file mode 100644 index 0000000..cc6c918 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/1063.txt @@ -0,0 +1,6 @@ +## 1.5.2 (2021-10-11) + + +### 臭蟲修復 + +* 移除不相容的語言 (android play) 4fd8ff9 diff --git a/fastlane/metadata/android/zh-TW/full_description.txt b/fastlane/metadata/android/zh-TW/full_description.txt index cdb2f7f..2362084 100644 --- a/fastlane/metadata/android/zh-TW/full_description.txt +++ b/fastlane/metadata/android/zh-TW/full_description.txt @@ -1,6 +1,6 @@ Thorium 為可連線到任何執行 v1.1.0-alpha.2 或更新版本的 PeerTube 伺服器的 PeerTube 客戶端。 -PeerTube 是一個直接在網路瀏覽器中使用 P2P (BitTorrent) 的聯盟式 (ActivityPub) 視訊串流平台。要取得更多資訊,請造訪 https://joinpeertube.org/ 並可取得伺服器列表。 +PeerTube 是一個直接在網路瀏覽器中使用 P2P (BitTorrent) 的聯盟式 (ActivityPub) 視訊串流平台。要取得更多資訊,請造訪 https://joinpeertube.org/。 此客戶端帶有一個由應用程式開發者(不是 PeerTube 專案本身,可以在 http://instances.joinpeertube.org/ 看到許多其他伺服器)管理的 PeerTube 伺服器,讓您可以試試看這個客戶端的功能。選擇您的伺服器來調整您的體驗! From 4bd03934b33f4b1ffc31461b7254bad6682a2a32 Mon Sep 17 00:00:00 2001 From: SC Date: Wed, 13 Oct 2021 11:17:47 +0000 Subject: [PATCH 21/39] fix(lang): Weblate translation (Portuguese) Currently translated at 28.5% (6 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/pt/ --- .../metadata/android/pt/changelogs/1047.txt | 1 + .../metadata/android/pt/changelogs/1048.txt | 1 + .../metadata/android/pt/full_description.txt | 33 +++++++++++++++++++ .../metadata/android/pt/short_description.txt | 1 + fastlane/metadata/android/pt/title.txt | 1 + fastlane/metadata/android/pt/video.txt | 1 + 6 files changed, 38 insertions(+) create mode 100644 fastlane/metadata/android/pt/changelogs/1047.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1048.txt create mode 100644 fastlane/metadata/android/pt/full_description.txt create mode 100644 fastlane/metadata/android/pt/short_description.txt create mode 100644 fastlane/metadata/android/pt/title.txt create mode 100644 fastlane/metadata/android/pt/video.txt diff --git a/fastlane/metadata/android/pt/changelogs/1047.txt b/fastlane/metadata/android/pt/changelogs/1047.txt new file mode 100644 index 0000000..5dd5987 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1047.txt @@ -0,0 +1 @@ +- Atualização da autenticação diff --git a/fastlane/metadata/android/pt/changelogs/1048.txt b/fastlane/metadata/android/pt/changelogs/1048.txt new file mode 100644 index 0000000..e2ec938 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1048.txt @@ -0,0 +1 @@ +- lançamento f-droid para corrigir a implantação automática diff --git a/fastlane/metadata/android/pt/full_description.txt b/fastlane/metadata/android/pt/full_description.txt new file mode 100644 index 0000000..7315fc0 --- /dev/null +++ b/fastlane/metadata/android/pt/full_description.txt @@ -0,0 +1,33 @@ +Thorium é um cliente de PeerTube que se pode conectar a qualquer servidor PeerTube rodando a versão v1.1.0-alpha.2 ou superior. + +PeerTube é uma plataforma de transmissão de vídeo federada (ActivityPub) usando P2P (BitTorrent) diretamente no navegador da web. Para mais informações e uma lista de servidores visite https://joinpeertube.org/ + +Este cliente vem pré-configurado com um servidor PeerTube gerido pelo criador da aplicação - não o próprio projeto PeerTube, que apresenta mais instâncias em http://instances.joinpeertube.org/ - para permitir ter uma ideia do que o cliente é capaz de fazer. Escolha o seu servidor para melhorar a sua experiência! + +Características atuais: +- Conecta-se a qualquer servidor PeerTube +- Vídeo torrent ou reprodução direta +- Pesquisar no PeerTube +- Descarregar / partilhar vídeo +- Temas / modo escuro +- Reprodução em segundo plano +- Reprodução em ecrã cheio +- Velocidade de reprodução +- Filtro de conteúdo NSFW +- Autenticação / entrar na conta +- Gostar/não gostar do vídeo + +Brevemente: +- Comente vídeos +- Registe-se +- Página de visão geral do utilizador / canal +- Reportar vídeos + +Permissões: +- Acesso ao armazenamento, necessário para descarregar torrent ou descarregar vídeo. + +Publicado sob a GNU Affero General Public License v3.0 + +As permissões desta licença mais forte de 'copyleft' estão condicionadas a disponibilizar o código-fonte completo de obras licenciadas e alterações, que incluem obras maiores usando uma obra disponibilizada, sob a mesma licença. Os avisos de direitos de autor e de licença devem ser preservados. Os contribuidores fornecem uma concessão expressa de direitos de patente. Quando uma versão alterada é usada para fornecer um serviço através de uma rede, o código-fonte completo da versão alterada deve ser disponibilizado. + +Código-fonte disponível em: https://github.com/sschueller/peertube-android/ diff --git a/fastlane/metadata/android/pt/short_description.txt b/fastlane/metadata/android/pt/short_description.txt new file mode 100644 index 0000000..66613a7 --- /dev/null +++ b/fastlane/metadata/android/pt/short_description.txt @@ -0,0 +1 @@ +Thorium é um reprodutor de PeerTube não oficial diff --git a/fastlane/metadata/android/pt/title.txt b/fastlane/metadata/android/pt/title.txt new file mode 100644 index 0000000..a39d29c --- /dev/null +++ b/fastlane/metadata/android/pt/title.txt @@ -0,0 +1 @@ +Thorium, um cliente não oficial do PeerTube diff --git a/fastlane/metadata/android/pt/video.txt b/fastlane/metadata/android/pt/video.txt new file mode 100644 index 0000000..5824a09 --- /dev/null +++ b/fastlane/metadata/android/pt/video.txt @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=PJIsiuSdpq8 From 60abc3b9fedbcbd42d1b20d787d8a442e6f0f0ca Mon Sep 17 00:00:00 2001 From: SC Date: Wed, 13 Oct 2021 11:10:04 +0000 Subject: [PATCH 22/39] fix(lang): Weblate translation (Portuguese) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/pt/ --- app/src/main/res/values-pt/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index cd14004..76d7266 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -357,4 +357,6 @@ Desativar a verificação do certificado SSL Ignorar conexões inseguras. Use isto apenas se souber a qual servidor está a conectar-se. Requer reinicialização da aplicação. Velocidade de reprodução predefinida + Selecione a velocidade de reprodução de vídeo global + Lista de contactos \ No newline at end of file From daebed8bb5fab88772e5f24877c759442ea109e2 Mon Sep 17 00:00:00 2001 From: SC Date: Wed, 13 Oct 2021 13:48:50 +0000 Subject: [PATCH 23/39] fix(lang): Weblate translation (Portuguese) Currently translated at 100.0% (21 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/pt/ --- .../metadata/android/pt/changelogs/1049.txt | 7 +++++++ .../metadata/android/pt/changelogs/1050.txt | 2 ++ .../metadata/android/pt/changelogs/1051.txt | 5 +++++ .../metadata/android/pt/changelogs/1052.txt | 2 ++ .../metadata/android/pt/changelogs/1053.txt | 7 +++++++ .../metadata/android/pt/changelogs/1054.txt | 1 + .../metadata/android/pt/changelogs/1055.txt | 1 + .../metadata/android/pt/changelogs/1056.txt | 6 ++++++ .../metadata/android/pt/changelogs/1057.txt | 6 ++++++ .../metadata/android/pt/changelogs/1058.txt | 6 ++++++ .../metadata/android/pt/changelogs/1059.txt | 12 ++++++++++++ .../metadata/android/pt/changelogs/1060.txt | 11 +++++++++++ .../metadata/android/pt/changelogs/1061.txt | 17 +++++++++++++++++ .../metadata/android/pt/changelogs/1062.txt | 6 ++++++ .../metadata/android/pt/changelogs/1063.txt | 6 ++++++ 15 files changed, 95 insertions(+) create mode 100644 fastlane/metadata/android/pt/changelogs/1049.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1050.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1051.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1052.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1053.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1054.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1055.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1056.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1057.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1058.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1059.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1060.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1061.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1062.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1063.txt diff --git a/fastlane/metadata/android/pt/changelogs/1049.txt b/fastlane/metadata/android/pt/changelogs/1049.txt new file mode 100644 index 0000000..2c0a046 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1049.txt @@ -0,0 +1,7 @@ +- adicionar suporte de redirecionamento de hipertexto na descrição (@freeboub) + - várias correções de bloqueio (@freeboub) + - evitar ir para o 'pip' ao sair da aplicação devido ao botão de partilha (@freeboub) + - adicionada capacidade de filtrar a lista de servidores (@freeboub) + - refatorização da gestão de erros Toast para dividir o erro da rede (@freeboub) + - manter a proporção do vídeo para 'pip' (@freeboub) + - barra de navegação não foi restaurada ao deixar o modo paisagem (@freeboub) diff --git a/fastlane/metadata/android/pt/changelogs/1050.txt b/fastlane/metadata/android/pt/changelogs/1050.txt new file mode 100644 index 0000000..dc8f68e --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1050.txt @@ -0,0 +1,2 @@ +- adicionado suporte para desativar o SSL +- traduções diff --git a/fastlane/metadata/android/pt/changelogs/1051.txt b/fastlane/metadata/android/pt/changelogs/1051.txt new file mode 100644 index 0000000..03fcb4e --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1051.txt @@ -0,0 +1,5 @@ +- idioma padrão da aplicação fixo na primeira inicialização (@kosharskiy) +- traduções do ecrã de definições em uk e ru (@kosharskiy) +- ficheiro de limpeza app/build.gradle (@kosharskiy) +- problema de visualização de dados meta de vídeo fixo (@kosharskiy) +- traduções atualizadas diff --git a/fastlane/metadata/android/pt/changelogs/1052.txt b/fastlane/metadata/android/pt/changelogs/1052.txt new file mode 100644 index 0000000..a13f840 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1052.txt @@ -0,0 +1,2 @@ +- servidor de edição implementado no livro do servidor (@kosharskiy) +- traduções atualizadas diff --git a/fastlane/metadata/android/pt/changelogs/1053.txt b/fastlane/metadata/android/pt/changelogs/1053.txt new file mode 100644 index 0000000..4ae91db --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1053.txt @@ -0,0 +1,7 @@ +- Fazer X no modo 'pip' para o áudio de fundo corretamente (@dhk2) +- Adicionada a opção clara de histórico de pesquisa ao menu de configurações (@dhk2) +- Não corrigir nenhum idioma selecionado por padrão para todos os idiomas de vídeo +- Biblioteca de ícones atualizada +- Adicionado indicador de 'buffer' à reprodução de vídeo +- Corrigidos problemas de vídeo em branco nos servidores que fornecem vídeo 0p. +- Traduções atualizadas diff --git a/fastlane/metadata/android/pt/changelogs/1054.txt b/fastlane/metadata/android/pt/changelogs/1054.txt new file mode 100644 index 0000000..d3a64ff --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1054.txt @@ -0,0 +1 @@ +- Adicionado suporte a reprodução HLS diff --git a/fastlane/metadata/android/pt/changelogs/1055.txt b/fastlane/metadata/android/pt/changelogs/1055.txt new file mode 100644 index 0000000..43c27fa --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1055.txt @@ -0,0 +1 @@ +- Corrigido modelo incorreto impedindo a reprodução de vídeo diff --git a/fastlane/metadata/android/pt/changelogs/1056.txt b/fastlane/metadata/android/pt/changelogs/1056.txt new file mode 100644 index 0000000..a16a82f --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1056.txt @@ -0,0 +1,6 @@ +# 1.1.0 (2021-02-01) + + +### Características + +* **lang:** Finlandês adicionado 02bcd74 diff --git a/fastlane/metadata/android/pt/changelogs/1057.txt b/fastlane/metadata/android/pt/changelogs/1057.txt new file mode 100644 index 0000000..89fd224 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1057.txt @@ -0,0 +1,6 @@ +## 1.1.1 (2021-02-05) + + +### Correção de erros + +* Removido SHA do nome da versão para corrigir as compilações fdroid 9dc7d54 diff --git a/fastlane/metadata/android/pt/changelogs/1058.txt b/fastlane/metadata/android/pt/changelogs/1058.txt new file mode 100644 index 0000000..1514787 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1058.txt @@ -0,0 +1,6 @@ +# 1.2.0 (2021-02-07) + + +### Características + +* Marcar vídeos ao vivo em listas de vídeo 8518b80 diff --git a/fastlane/metadata/android/pt/changelogs/1059.txt b/fastlane/metadata/android/pt/changelogs/1059.txt new file mode 100644 index 0000000..3670ccb --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1059.txt @@ -0,0 +1,12 @@ +# 1.3.0 (2021-02-13) + + +### Correções + +* Lista de vídeos convertidas em Kotlin para corrigir o menu no topo 06ace0d + + +### Recursos + +* Adicionado local para miniaturas de vídeo para carregamento e erros 830b197 +* Ajudante de metadados convertido em kotlin 1c34556 diff --git a/fastlane/metadata/android/pt/changelogs/1060.txt b/fastlane/metadata/android/pt/changelogs/1060.txt new file mode 100644 index 0000000..d0039e6 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1060.txt @@ -0,0 +1,11 @@ +# 1.4.0 (2021-02-20) + + +### Correções + +* Falha de dispositivos SDK 21,22,23,24 no início, correções [# 262] (https://git.techdroid.com/sschueller/peertube/issues/262) 5622b76 + + +### Recursos + +* adicionada configuração de velocidade de reprodução global fa79b2d diff --git a/fastlane/metadata/android/pt/changelogs/1061.txt b/fastlane/metadata/android/pt/changelogs/1061.txt new file mode 100644 index 0000000..98df007 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1061.txt @@ -0,0 +1,17 @@ +# 1.5.0 (2021-10-05) + + +### Correções + +* Adicionados ficheiros de descrição ausentes necessários para o fastlane 38eb072 +* várias atualizações do Android +* várias traduções do Weblate em muitos idiomas +* versão do nó 36b840f +* versão do nó 3ee6071 +* Gradle atualizado no docker 79c9e97 + + +### Recursos + +* Atualizações da biblioteca do Android, atualização 5f2847c do gradle +* ** lang: ** Traduções adicionadas usando Weblate (albanês, esperanto, sardenho e sinhala) diff --git a/fastlane/metadata/android/pt/changelogs/1062.txt b/fastlane/metadata/android/pt/changelogs/1062.txt new file mode 100644 index 0000000..eef6c7c --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1062.txt @@ -0,0 +1,6 @@ +## 1.5.1 (2021-10-10) + + +### Correções + +* idiomas incompatíveis (android play) b4efa27 diff --git a/fastlane/metadata/android/pt/changelogs/1063.txt b/fastlane/metadata/android/pt/changelogs/1063.txt new file mode 100644 index 0000000..690457f --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1063.txt @@ -0,0 +1,6 @@ +## 1.5.2 (2021-10-11) + + +### Correções + +* removidos idiomas incompatíveis (android play) 4fd8ff9 From 6f4ad5d639ab76bf7f1500a85682e0b4d8fde73f Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Sun, 17 Oct 2021 14:55:53 +0000 Subject: [PATCH 24/39] fix(lang): Weblate translation (Russian) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/ru/ --- app/src/main/res/values-ru/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index bc12e10..de8b7a8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -362,4 +362,7 @@ "Вы собираетесь отключить валидацию всех SSL сертификатов в Thorium. Это может быть очень опасно если peertube сервер вами не контролируется, потому что \"атака посредника\" может направить трафик на другой сервер. Злоумышленник может записывать пароли и другие личные данные." Сохранить В ЭФИРЕ + Адресная книга + Скорость воспроизведения по умолчанию + Выберите глобальную скорость воспроизведения видео \ No newline at end of file From ada03b3cb8207115307c916f678e4056ef1eb292 Mon Sep 17 00:00:00 2001 From: m51d Date: Wed, 20 Oct 2021 05:18:22 +0000 Subject: [PATCH 25/39] fix(lang): Weblate translation (Indonesian) Currently translated at 52.3% (11 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/id/ --- fastlane/metadata/android/id/changelogs/1048.txt | 1 + fastlane/metadata/android/id/full_description.txt | 4 ++-- fastlane/metadata/android/id/short_description.txt | 2 +- fastlane/metadata/android/id/title.txt | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 fastlane/metadata/android/id/changelogs/1048.txt diff --git a/fastlane/metadata/android/id/changelogs/1048.txt b/fastlane/metadata/android/id/changelogs/1048.txt new file mode 100644 index 0000000..157378d --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/1048.txt @@ -0,0 +1 @@ +- f-droid dikeluarkan untuk memperbaharui deploy otomatis diff --git a/fastlane/metadata/android/id/full_description.txt b/fastlane/metadata/android/id/full_description.txt index bd5edaf..e8836d1 100644 --- a/fastlane/metadata/android/id/full_description.txt +++ b/fastlane/metadata/android/id/full_description.txt @@ -1,6 +1,6 @@ -Thorium adalah klien PeerTube yang dapat terhubung ke server peertube yang menjalankan versi v1.1.0-alpha.2 atau yang lebih tinggi. +Thorium adalah klien PeerTube yang dapat terhubung ke jaringan PeerTube yang menjalankan versi v1.1.0-alpha.2 atau yang lebih tinggi. -PeerTube adalah platform streaming video federated (ActivityPub) menggunakan P2P (BitTorrent) via browser web. Untuk informasi lebih lanjut, silakan kunjungi https://joinpeertube.org/ . +PeerTube adalah platform federasi streaming video (ActivityPub) menggunakan P2P (BitTorrent) via browser web. Untuk informasi lebih lanjut, silakan kunjungi https://joinpeertube.org/ . Klien ini hadir dengan prakonfigurasi satu server PeerTube yang dikelola oleh pembuat aplikasi - bukan proyek PeerTube itu sendiri, lihat daftar lainnya di http://instances.joinpeertube.org/ - untuk memungkinkan Anda memiliki selera apa yang mampu dilakukan klien. Pilih server Anda untuk menyelaraskan pengalaman Anda! diff --git a/fastlane/metadata/android/id/short_description.txt b/fastlane/metadata/android/id/short_description.txt index 228efc8..bcd46e6 100644 --- a/fastlane/metadata/android/id/short_description.txt +++ b/fastlane/metadata/android/id/short_description.txt @@ -1 +1 @@ -Thorium adalah unoffical pemutar PeerTube +Thorium adalah Aplikasi pemutar media bukan dari PeerTube diff --git a/fastlane/metadata/android/id/title.txt b/fastlane/metadata/android/id/title.txt index eae8dda..594950f 100644 --- a/fastlane/metadata/android/id/title.txt +++ b/fastlane/metadata/android/id/title.txt @@ -1 +1 @@ -Thorium adalah unofficial Klien PeerTube +Thorium adalah Aplikasi bukan bawaan dari PeerTube From b98e2ae0beef989b5e54538491c2e277ae5314db Mon Sep 17 00:00:00 2001 From: m51d Date: Wed, 20 Oct 2021 05:39:01 +0000 Subject: [PATCH 26/39] fix(lang): Weblate translation (Indonesian) Currently translated at 95.5% (340 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/id/ --- app/src/main/res/values-id/strings.xml | 67 ++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 6cf40b9..7e243ce 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -131,7 +131,7 @@ 0.75x Buku Alamat Server Saat Ini - Memiliki Login + Telah Login Simpan Tambah Kata sandi @@ -265,7 +265,7 @@ Ossetia Oromo Oriya (bahasa makro) - Teal + Sian Hijau Bahasa Isyarat Afrika Selatan Somalia Slovenia @@ -281,5 +281,66 @@ Sardinia Sango Samoa - Bluegray + Abu-abu Biru + Georgia + Jerman + Iñupiat (Alaska) + Jepang + Jawa (Indonesia) + Kamboja + Luksembur + Macedonia + Madagaskar + Korsika + Bhutan + Senegambia + Ganda + Gujarat (India) + Haiti + Hausa (Afro-Asia) + Ibrani + Herero - Afrika Selatan + Hindi (India Utara) + Inuit (Kanada) + Irlandia + Italia + Melayu + Mongolia + Yunani Modern + +\nLisensi Publik Umum GNU Affero v3.0 +\n +\nIzin dari lisensi copyleft ini dikondisikan untuk menyediakan kode sumber yang lengkap dari karya berlisensi dan modifikasi, yang mencakup karya yang lebih besar menggunakan karya berlisensi, di bawah lisensi yang sama. Hak cipta dan pemberitahuan lisensi harus dipertahankan. Kontributor memberikan hibah hak paten secara tegas. Ketika versi modifikasi digunakan untuk menyediakan layanan melalui jaringan, kode sumber lengkap dari versi modifikasi harus tersedia. + Lanjutkan stream suara di latar belakang + Guarani (Paraguai) + Anda akan menonaktifkan semua validasi Sertifikasi SSL di Thorium. Menonaktifkannya bisa sangat berbahaya jika server peertube tidak berada di bawah kendali Anda, karena serangan man-in-the-middle dapat mengarahkan lalu lintas ke server lain tanpa sepengetahuan Anda. Seorang penyerang dapat merekam kata sandi dan data pribadi lainnya. + Kikuyu (Kenya) + Rwanda + StarTrek + Latvia + Korea + Lithuania + Komi (Rusia) + Kongo + Kotava + Ethiopia + Kaukasian + Papua Nugini + Islandia + Igbo (Nigeria) + Indonesia + Bahasa Isyarat Jepang + Greenland + Kannada (barat daya India) + Kanuri (Nigeria) + Kasmir (India) + Kazakhstan + Kecepatan putar standar + Pilih secara umum kecepatan putar standar video + Acuhkan koneksi yang tidak aman. Gunakan ini jika Anda tahu peladan yang anda tuju. Muat Ulang Aplikasi. + Maldiva + Galisia (barat laut Spanyol) + Hungaria + Kirgistan + Saluran NSFW \ No newline at end of file From 694c52e6be13e0dc8499725ff862171d49117ebf Mon Sep 17 00:00:00 2001 From: Gabriel Cardoso Date: Sat, 23 Oct 2021 01:41:54 +0000 Subject: [PATCH 27/39] fix(lang): Weblate translation (Portuguese (Brazil)) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7b1ccdd..a4a784e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -356,4 +356,7 @@ Desativar check do certificado SSL Ignorar conexões não seguras. Use isto apenas se você conhece o servidor ao qual está se conectando. Requer o reinício do aplicativo. AO VIVO + Velocidade de reprodução padrão + Selecione a velocidade global de reprodução de vídeo + Lista de endereços \ No newline at end of file From cc6b42474e19ee3b9d88a6a2aec836e02c8e5662 Mon Sep 17 00:00:00 2001 From: SC Date: Sat, 23 Oct 2021 14:26:29 +0000 Subject: [PATCH 28/39] fix(lang): Weblate translation (Portuguese (Portugal)) Currently translated at 85.7% (18 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/pt_PT/ --- fastlane/metadata/android/pt-PT/changelogs/1058.txt | 6 ++++++ fastlane/metadata/android/pt-PT/changelogs/1059.txt | 12 ++++++++++++ fastlane/metadata/android/pt-PT/changelogs/1060.txt | 11 +++++++++++ 3 files changed, 29 insertions(+) create mode 100644 fastlane/metadata/android/pt-PT/changelogs/1058.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/1059.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/1060.txt diff --git a/fastlane/metadata/android/pt-PT/changelogs/1058.txt b/fastlane/metadata/android/pt-PT/changelogs/1058.txt new file mode 100644 index 0000000..26bd3e2 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/1058.txt @@ -0,0 +1,6 @@ +# 1.2.0 (2021-02-07) + + +### Funcionalidades + +* Marcar vídeos ao vivo em listas de vídeos 8518b80 diff --git a/fastlane/metadata/android/pt-PT/changelogs/1059.txt b/fastlane/metadata/android/pt-PT/changelogs/1059.txt new file mode 100644 index 0000000..3670ccb --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/1059.txt @@ -0,0 +1,12 @@ +# 1.3.0 (2021-02-13) + + +### Correções + +* Lista de vídeos convertidas em Kotlin para corrigir o menu no topo 06ace0d + + +### Recursos + +* Adicionado local para miniaturas de vídeo para carregamento e erros 830b197 +* Ajudante de metadados convertido em kotlin 1c34556 diff --git a/fastlane/metadata/android/pt-PT/changelogs/1060.txt b/fastlane/metadata/android/pt-PT/changelogs/1060.txt new file mode 100644 index 0000000..d0039e6 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/1060.txt @@ -0,0 +1,11 @@ +# 1.4.0 (2021-02-20) + + +### Correções + +* Falha de dispositivos SDK 21,22,23,24 no início, correções [# 262] (https://git.techdroid.com/sschueller/peertube/issues/262) 5622b76 + + +### Recursos + +* adicionada configuração de velocidade de reprodução global fa79b2d From 85c8c8e8a8775837da9c8c97519dc614fa8b2566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Sibelle?= Date: Fri, 5 Nov 2021 21:15:48 +0000 Subject: [PATCH 29/39] fix(lang): Weblate translation (French) Currently translated at 80.9% (17 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/fr/ --- fastlane/metadata/android/fr-FR/changelogs/1058.txt | 6 ++++++ fastlane/metadata/android/fr-FR/changelogs/1059.txt | 12 ++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 fastlane/metadata/android/fr-FR/changelogs/1058.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/1059.txt diff --git a/fastlane/metadata/android/fr-FR/changelogs/1058.txt b/fastlane/metadata/android/fr-FR/changelogs/1058.txt new file mode 100644 index 0000000..302bc2d --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/1058.txt @@ -0,0 +1,6 @@ +# 1.2.0 (2021-02-07) + + +### Fonctionnalités + +* Marquer les vidéos en direct dans les listes de vidéos 8518b80 diff --git a/fastlane/metadata/android/fr-FR/changelogs/1059.txt b/fastlane/metadata/android/fr-FR/changelogs/1059.txt new file mode 100644 index 0000000..4962757 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/1059.txt @@ -0,0 +1,12 @@ +# 1.3.0 (2021-02-13) + + +### Corrections de Bug + +* Ai converti videolist en Kotlin pour réparer le menu du haut cassé 06ace0d + + +### Fonctionnalités + +* Ajout du placeholder pour la miniature de la vidéo lors du chargement et en cas d'erreurs 830b197 +* Convertion du helper de "meta date" en Kotlin 1c34556 From 3f510201746b5bcece7f1931d39e0212aaf5f809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Sat, 13 Nov 2021 06:39:15 +0000 Subject: [PATCH 30/39] fix(lang): Weblate translation (Turkish) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/tr/ --- app/src/main/res/values-tr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 6c0c7b4..b1fbcb3 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -89,7 +89,7 @@ Danimarkaca Danimarka İşaret Dili Maldivce - Flemenkçe + Felemenkçe Dzongka İngilizce Esperanto From 490d8e30a88d794ab5086f436c93065ecf1db8f3 Mon Sep 17 00:00:00 2001 From: Dronrs Date: Fri, 26 Nov 2021 08:53:12 +0000 Subject: [PATCH 31/39] fix(lang): Weblate translation (Chinese (Simplified)) Currently translated at 93.8% (334 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 31 +++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5b35b87..67c5b79 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -127,7 +127,7 @@ 从下面的列表选择一个服务器或者手动输入。 PeerTube 服务器 URL 选择服务器 - 现在的服务器 + 当前的服务器 0.75倍速 1.25倍速 葡萄牙语 @@ -308,4 +308,33 @@ 罗马尼亚语 克丘亚语 普什图语 + 帮助与反馈 + 登录失败! + 过滤列表 + 默认播放速度 + 关于 + 您确定您想从地址薄中移除该服务器吗? + 选择全局视频播放速度 + 标签 + 服务器 URL + 搜索 + 用户名 + 密码 + 添加 + 保存 + 已登录 + 地址薄 + 服务器标签必填 + 网络访问错误,请检查您的网络连接 + 已登录 + 退出登录 + 移除服务器 + 搜索服务器 + 账号 + 视频播放 + 有效的 URL 必填 + 视频列表 + + + 直播 \ No newline at end of file From 514cd65539092fe7d7af509555c0fb58a7986074 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Wed, 1 Dec 2021 05:15:28 +0000 Subject: [PATCH 32/39] fix(lang): Weblate translation (Persian) Currently translated at 32.5% (116 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/fa/ --- app/src/main/res/values-fa/strings.xml | 56 +++++++++++++------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 54e586a..feba6b8 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -20,25 +20,25 @@ محلی اشتراک‌ها حساب - " بازدیدها" - تصویر ویدئو - آواتار حساب - جستجو در پیرتیوب - جستجو + " نمایش" + بندانگشتی ویدیو + چهرک حساب + جست‌وجوی پیرتیوب + جست‌وجو بدون نتیجه - بیشتر + بیش‌تر هم‌رسانی - نشانی نامعتبر + نشانی نامعتبر. حالت تاریک برای اعمال حالت تاریک، برنامه را از اول راه‌اندازی کنید. - سبک برنامه - برای اعمال سبک، برنامه را از اول راه‌اندازی کنید - پخش‌کننده ویدئوی تورنت + زمینهٔ کاره + برای تأثیر گذاشتن زمینه، کاره را دوباره آغاز کنید. + پخش‌کنندهٔ ویدیوی تورنت پروانه - نسخه - محتوا NSFW + نگارش + محتوای NSFW نمایش محتوای NSFW - صافی زبان + پالایهٔ زبان کارساز پیرتیوب پخش در پس‌زمینه گزارش @@ -89,7 +89,7 @@ فرانسوی فنلاندی انگلیسی - + آسامی دانمارکی چینی بلغاری @@ -98,23 +98,25 @@ آذربایجانی ارمنی عربی - در صورت فعال بودن، پخش ویدئو در پس‌زمینه ادامه می‌یابد. - به جای نشان دادن همه ویدئه تحت همه زبان‌ها، یک زبان برای ویدئو انتخاب کنید. + اگر به کار افتاده باشد، پخش ویدیو را در پس‌زمینه ادامه می‌دهد. + به جای نمایش تمامی ویدیوها به همهٔ زبان‌ها، زبانی برای ویدیو برگزینید. \nپروانه عمومی همگانی آفرو نسخه ۳ AGPLv3 \n \nمجوزهای این پروانه که قوی‌ترین پروانه کپی‌لفت است مشروط به دردسترس قرار دادن کامل کد منبع کارهای تحت پروانه و نسخه‌های تغییریافته‌شان است که شامل کارهای بزرگ‌تری که تحت همین پروانه × از این کار استفاده می‌کنند می‌شود. تذکر پروانه و کپی‌رایت باید محفوظ بماند. مشارکت‌کنندگان باید واگذاری حقوق پتنت را اعلام کنند. وقتی نسخه تغییر یافته برای ارائه خدمت روی شبکه استفاده شود، کد منبع نسخه تغییر یافته بایستی به صورت کامل دردسترس قرار بگیرد. - پخش ویدئو از طریق جریان تورنت. این ویژگی، نیازمند مجور دسترسی به فضای ذخیره‌سازی است. (آلفا، ناپایدار!) + پخش ویدیو با جریان تورنت. این ویژگی، نیازمند اجازهٔ ذخیره‌سازی است. (آلفا، ناپایدار!) نوار ناوبری پایین - نسخه اندروید از ویدئوی شناور پشتیبانی نمی کند - پیکربندی پخش در پس زمینه - پخش ویدیو را در پنجره شناور ادامه دهید - تمام پخش را متوقف کنید - به عنوان جریان صوتی پس زمینه ادامه دهید - انتخاب زبان برای رابط برنامه برای اعمال تغییرات ، برنامه را مجدداً راه اندازی کنید. + نگارش اندروید از ویدیوی شناور پشتیبانی نمی‌کند + پیکربندی پخش پس‌زمینه + ادامهٔ پخش ویدیو در پنجرهٔ شناور + توقّف تمامی پخش + ادامه به شکل جریان صوتی پس‌زمینه + گزینش زبان رابط برنامه.برای تأثیر گذاشتن تغییرات، کاره را دوباره آغاز کنید. زبان برنامه - هنگام فشار دادن به عقب در حین پخش ویدئو ، پخش پس زمینه را متوقف کنید. - دکمه پشت مکث - فعالیت پخش ویدئو Url - برای تکمیل ایمیل مجوز تماس بگیرید. + مکث پخش پس‌زمینه هنگام فشردن بازگشت حین پخش ویدیو. + مکث با دکمهٔ بازگشت + UrlVideoPlayActivity + اعطای اجازهٔ آشنا برای تکمیل رایانامه. + سرعت پخش پیش‌گزیده + گزینش سرعت پخش ویدیوی عمومی \ No newline at end of file From 7648633684f52aae237f215cdd535e6a8a5b2b28 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Wed, 1 Dec 2021 05:40:38 +0000 Subject: [PATCH 33/39] fix(lang): Weblate translation (Persian) Currently translated at 42.8% (9 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/fa/ --- .../metadata/android/fa/full_description.txt | 32 +++++++++---------- .../metadata/android/fa/short_description.txt | 2 +- fastlane/metadata/android/fa/title.txt | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/fastlane/metadata/android/fa/full_description.txt b/fastlane/metadata/android/fa/full_description.txt index 25d9c64..f8db963 100644 --- a/fastlane/metadata/android/fa/full_description.txt +++ b/fastlane/metadata/android/fa/full_description.txt @@ -1,33 +1,33 @@ -Thorium یک سرویس گیرنده PeerTube است که می تواند به هر سرور peertube با نسخه v1.1.0-alpha.2 یا بالاتر متصل شود. +توریوم یک کارخواه پیرتیوب است که می تواند به هر کارساز پیرتیوبی با نگارش v1.1.0-alpha.2 یا بالاتر وصل شود. -PeerTube یک پلتفرم متحد (ActivityPub) پخش ویدئو با استفاده از P2P (BitTorrent) مستقیماً در مرورگر وب است. برای اطلاعات بیشتر ، لطفاً برای اطلاعات بیشتر و لیستی از سرورها به https://joinpeertube.org/ مراجعه کنید. +پیرتیوب یک بن‌سازهٔ جریان ویدیوی خودگردان (ActivityPub) با استفاده از P2P (بیت‌تورنت) مستقیم در مرورگر وب است. برای اطلاعات بیشتر ، لطفاً به https://joinpeertube.org مراجعه کنید. -این سرویس گیرنده با یک سرور PeerTube که توسط خالق برنامه مدیریت می شود - و نه خود پروژه PeerTube ، که در http://inances.joinpeertube.org/ فهرست شده است - از پیش تنظیم شده است - به شما این امکان را می دهد تا طعم و مزه کارهایی که مشتری قادر به انجام آن است را بشنوید. سرور خود را برای تنظیم تجربه خود انتخاب کنید! +این کارخواه با کارساز پیرتیوبی که به دست خالق برنامه مدیریت می‌شود (و نه خود پروژه پیرتیوب ، که در http://inances.joinpeertube.org فهرست شده) از پیش تنظیم شده تا بگذارد طعم قابلیت‌های کارخواه را بچشید. برای تنظیم تجربه‌تان، کارساز را برگزینید! ویژگی های فعلی: -- اتصال به هر سرور PeerTube -- ویدئو تورنت یا پخش مستقیم -- جستجو در PeerTube +- اتصال به هر کارساز پیرتیوب +- ویدیوی تورنت یا پخش مستقیم +- جست‌وجو‌در پیرتیوب - بارگیری / اشتراک ویدیو -- تم / حالت تاریک +- زمینه / حالت تاریک - پخش در پس زمینه - پخش تمام صفحه در حالت افقی - سرعت پخش -- محتوای NSFW را فیلتر کنید +- پالایش محتوای NSFW - احراز هویت / ورود -- دوست داشتن/دوست نداشتن ویدئو +- پسندیدن / نپسندیدن ویدیو به زودی: -- فیلم های نظر دهید +- نظر دادن به ویدیو - ثبت نام - صفحه نمای کلی کاربر / کانال -- گزارش فیلم ها +- گزارش ویدیوها -مجوزها: -- دسترسی به ذخیره سازی ، مورد نیاز برای بارگیری تورنت یا بارگیری ویدئو. +اجازه‌ها: +- دسترسی به ذخیره سازی ، مورد نیاز برای بارگیری تورنت یا بارگیری ویدیو. -دارای مجوز تحت GNU Affero General Public License v3.0 +دارای پروانهٔ GNU Affero General Public License v3.0 -مجوزهای این قوی ترین مجوز copyleft منوط به در دسترس قرار دادن کد منبع کامل آثار مجاز و اصلاحات ، که شامل آثار بزرگتر با استفاده از یک اثر مجاز ، تحت همان مجوز است. اخطار حق نسخه برداری و مجوز باید حفظ شود. مشارکت کنندگان اعطای صریح حقوق ثبت اختراع را ارائه می دهند. هنگامی که از نسخه اصلاح شده برای ارائه خدمات در شبکه استفاده می شود ، باید کد منبع کامل نسخه اصلاح شده در دسترس باشد. +مجوزهای این قوی ترین پروانهٔ copyleft منوط به در دسترس قرار دادن کد منبع کامل آثار مجاز و اصلاحات ، که شامل آثار بزرگتر با استفاده از یک اثر مجاز ، تحت همان پروانه است. اخطار حق نسخه برداری و مجوز باید حفظ شود. مشارکت کنندگان اعطای صریح حقوق ثبت اختراع را ارائه می دهند. هنگامی که از نسخه اصلاح شده برای ارائه خدمات در شبکه استفاده می شود ، باید کد منبع کامل نسخه اصلاح شده در دسترس باشد. -کد منبع در: https://github.com/sschueller/peertube-android/ +کد مبدأ در: https://github.com/sschueller/peertube-android/ diff --git a/fastlane/metadata/android/fa/short_description.txt b/fastlane/metadata/android/fa/short_description.txt index d5cae4f..6592bfb 100644 --- a/fastlane/metadata/android/fa/short_description.txt +++ b/fastlane/metadata/android/fa/short_description.txt @@ -1 +1 @@ -Thorium یک پخش کننده PeerTube غیر رسمی است +توریوم پخش‌کننده‌ای غیررسمی برای پیرتیوب است diff --git a/fastlane/metadata/android/fa/title.txt b/fastlane/metadata/android/fa/title.txt index 42487ea..82baa60 100644 --- a/fastlane/metadata/android/fa/title.txt +++ b/fastlane/metadata/android/fa/title.txt @@ -1 +1 @@ -Thorium یک مشتری غیر رسمی PeerTube است +توریوم کارخواه غیررسمی پیرتیوب From 45ac67333c59171224e4a6fcb612a36951f18447 Mon Sep 17 00:00:00 2001 From: Oymate Date: Thu, 2 Dec 2021 10:41:43 +0000 Subject: [PATCH 34/39] fix(lang): Weblate translation (Bengali) Currently translated at 100.0% (356 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/bn/ --- app/src/main/res/values-bn/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 864783e..72d52ab 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -362,4 +362,7 @@ উন্নত সংরক্ষন লাইভ + ঠিকানা বই + সহজাত গতি + সর্বজনীন গতি নির্ধারণ করো \ No newline at end of file From 60eca32501d4ee39f2aba7afdacd3b9364811757 Mon Sep 17 00:00:00 2001 From: Daimar Stein <570cxat11@relay.firefox.com> Date: Fri, 3 Dec 2021 14:38:58 +0000 Subject: [PATCH 35/39] fix(lang): Weblate translation (Portuguese (Brazil)) Currently translated at 14.2% (3 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/pt_BR/ --- .../android/pt-BR/changelogs/1047.txt | 1 + .../android/pt-BR/full_description.txt | 33 +++++++++++++++++++ fastlane/metadata/android/pt-BR/video.txt | 1 + 3 files changed, 35 insertions(+) create mode 100644 fastlane/metadata/android/pt-BR/changelogs/1047.txt create mode 100644 fastlane/metadata/android/pt-BR/full_description.txt create mode 100644 fastlane/metadata/android/pt-BR/video.txt diff --git a/fastlane/metadata/android/pt-BR/changelogs/1047.txt b/fastlane/metadata/android/pt-BR/changelogs/1047.txt new file mode 100644 index 0000000..4ab74a0 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/1047.txt @@ -0,0 +1 @@ +- Atualização de autenticação diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt new file mode 100644 index 0000000..9e06b91 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -0,0 +1,33 @@ +Thorium é um cliente PeerTube que pode se conectar a qualquer servidor PeerTube rodando a versão v1.1.0-alpha.2 ou superior. + +PeerTube é uma plataforma de transmissão de vídeo federada (ActivityPub) usando P2P (BitTorrent) diretamente no seu navegador. Para mais informações, visite https://joinpeertube.org/. + +Este app vem pré-configurado com um servidor PeerTube gerido pelo criador da aplicação - não pelo próprio projeto PeerTube, que lista mais servidores em http://instances.joinpeertube.org/ - para lhe permitir ter uma ideia do que o app é capaz de fazer. Escolha o seu servidor para adaptar à sua experiência! + +Características atuais: +- Conecte-se a qualquer servidor PeerTube +- Baixe ou reproduza vídeos diretamente via Torrent +- Pesquise no PeerTube +- Baixe / Compartilhe vídeos +- Temas / Modo escuro +- Reprodução de fundo +- Reprodução em tela cheia no modo paisagem +- Controle da velocidade de reprodução +- Filtro de conteúdo NSFW +- Autenticação / Login +- Likes/dislikes nos vídeos + +Em breve: +- Comente vídeos +- Registre-se +- Página de Visão Geral do Usuário / Canal +- Reportar Vídeos + +Permissões: +- Acesso ao armazenamento, necessário para download de torrent ou download de vídeo. + +Licenciado sob a GNU Affero General Public License v3.0 + +As permissões desta licença mais forte de copyleft estão condicionadas a disponibilizar o código fonte completo de obras licenciadas e modificações, que incluem obras maiores usando uma obra licenciada, sob a mesma licença. Os avisos de direitos autorais e de licença devem ser preservados. Os contribuidores fornecem uma concessão expressa de direitos de patente. Quando uma versão modificada é usada para fornecer um serviço através de uma rede, o código fonte completo da versão modificada deve ser disponibilizado. + +Código fonte em: https://github.com/sschueller/peertube-android/ diff --git a/fastlane/metadata/android/pt-BR/video.txt b/fastlane/metadata/android/pt-BR/video.txt new file mode 100644 index 0000000..5824a09 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/video.txt @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=PJIsiuSdpq8 From 49a579dc30a18f1d9943ad2c584dd307824adffd Mon Sep 17 00:00:00 2001 From: Andrei Stepanov Date: Sat, 18 Dec 2021 00:57:36 +0000 Subject: [PATCH 36/39] fix(lang): Weblate translation (Russian) Currently translated at 76.1% (16 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/ru/ --- fastlane/metadata/android/ru-RU/changelogs/1058.txt | 6 ++++++ fastlane/metadata/android/ru-RU/full_description.txt | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 fastlane/metadata/android/ru-RU/changelogs/1058.txt diff --git a/fastlane/metadata/android/ru-RU/changelogs/1058.txt b/fastlane/metadata/android/ru-RU/changelogs/1058.txt new file mode 100644 index 0000000..2b46eff --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/1058.txt @@ -0,0 +1,6 @@ +# 1.2.0 (2021-02-07) + + +### Возможности + +* Метки видео в прямом эфире в списках видео 8518b80 diff --git a/fastlane/metadata/android/ru-RU/full_description.txt b/fastlane/metadata/android/ru-RU/full_description.txt index 440bf70..e5e0617 100644 --- a/fastlane/metadata/android/ru-RU/full_description.txt +++ b/fastlane/metadata/android/ru-RU/full_description.txt @@ -1,6 +1,6 @@ -Thorium - это клиент PeerTube, который может подключаться к любому серверу Peertube с версией v1.1.0-alpha.2 или выше. +Thorium — это клиент PeerTube, который может подключаться к любому серверу Peertube с версией v1.1.0-alpha.2 или выше. -PeerTube - это федеративная (ActivityPub) платформа потокового видео, использующая P2P (BitTorrent) непосредственно в веб-браузере. Для получения дополнительной информации посетите https://joinpeertube.org/, чтобы получить дополнительную информацию и список серверов. +PeerTube - это федеративная (ActivityPub) платформа потокового видео, использующая P2P (BitTorrent) непосредственно в веб-браузере. Для получения дополнительной информации посетите https://joinpeertube.org/ . Этот клиент поставляется с предварительно сконфигурированным одним сервером PeerTube, управляемым создателем приложения, а не самим проектом PeerTube, подробности которого перечислены на http://instances.joinpeertube.org/, чтобы вы могли почувствовать, на что способен клиент. Выберите свой сервер, чтобы настроить свой опыт! @@ -28,6 +28,6 @@ PeerTube - это федеративная (ActivityPub) платформа по Под лицензией GNU Affero General Public License v3.0 -Разрешения этой сильнейшей лицензии с авторским левом обусловлены предоставлением полного исходного кода лицензионных произведений и модификаций, которые включают более крупные произведения с использованием лицензионных произведений, по той же лицензии. Уведомления об авторских правах и лицензии должны быть сохранены. Соавторы предоставляют явное предоставление патентных прав. Когда измененная версия используется для предоставления услуги по сети, полный исходный код измененной версии должен быть доступен. +Разрешения этой сильнейшей лицензии с авторским левом обусловлены предоставлением полного исходного кода лицензионных произведений и модификаций, которые включают более крупные произведения с использованием лицензионных произведений, по той же лицензии. Уведомления об авторских правах и лицензии должны быть сохранены. Соавторы предоставляют явное предоставление патентных прав. Когда изменённая версия используется для предоставления услуги по сети, полный исходный код изменённой версии должен быть доступен. Исходный код: https://github.com/sschueller/peertube-android/ From 08393e82759be46cbb868cd501371658941852c1 Mon Sep 17 00:00:00 2001 From: Petter Reinholdtsen Date: Sat, 25 Dec 2021 22:11:33 +0000 Subject: [PATCH 37/39] =?UTF-8?q?fix(lang):=20Weblate=20translation=20(Nor?= =?UTF-8?q?wegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 52.5% (187 of 356 strings) Translation: PeerTube/Android Translate-URL: https://hosted.weblate.org/projects/peertube/android/nb_NO/ --- app/src/main/res/values-nb-rNO/strings.xml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index eb65289..a81f462 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -60,10 +60,10 @@ Abonnenter: Beskrivelse: Tok del: - Noe gikk galt, prøv igjen senere. + Noe gikk galt, prøv igjen senere! Innvilg kontakttilgang for fullføring av e-postadresser. Populært - " visninger" + " Visninger" Video-miniatyrbilde VOKSENT innhold Vis VOKSENT innhold @@ -103,7 +103,7 @@ Ja Nei Tjener satt til: %s - Velg en tjener fra listen, eller skriv den inn direkte + Velg en tjener fra listen under, eller skriv inn tjenernavn direkte. PeerTube tjenernettadresse Velg tjener Dansk @@ -139,7 +139,7 @@ Programspråk Tjener-nettadresse Søk - Username + Brukernavn Legg til Passord Adressebok @@ -164,7 +164,7 @@ Logg ut Gyldig nettadresse kreves Tjeneretikett kreves - Kunne ikke logge inn + Kunne ikke logge inn! Innlogget Hei blanke fragment Tilknytningsfeil, sjekk tilkoblingen din @@ -191,13 +191,14 @@ Advarsel! Avansert Lagre - Du er i ferd med å skru av all SSL-sertifisering i Thorium. Å skru av dette kan være veldig farlig hvis Peertube ikke er under din kontroll, fordi mellommanns-angrep kan sende trafikk til en annen tjener uten at du vet det. En angriper kan da se passordene når de blir brukt, og annen personlig data. + Du er i ferd med å skru av all kontroll av SSL-sertifikater i Thorium. Å skru av dette kan være veldig farlig hvis Peertube-tjeneren ikke er under din kontroll, fordi mellommanns-angrep kan styre trafikk til en annen tjener uten at du vet det. En angriper kan da registrere passord, og annen personlig data. Sanntid Skru av SSL-sertifikatssjekk - Ignorer usikre tilkoblinger. Kun bruk dette hvis du vet hvilken tjener du kobler til. Krever programomstart. + Ignorer usikre tilkoblinger. Bruk kun dette hvis du vet hvilken tjener du kobler til. Krever programomstart. Spansk Indonesisk Adressebok Forvalgt avspillingshastighet Velg videoavspillingshastighet for hele systemet + Abkhasisk \ No newline at end of file From 2742ed6064541b2369389b8aca34e320a9bcf5f7 Mon Sep 17 00:00:00 2001 From: Petter Reinholdtsen Date: Sat, 25 Dec 2021 22:01:28 +0000 Subject: [PATCH 38/39] =?UTF-8?q?fix(lang):=20=20Weblate=20translation=20(?= =?UTF-8?q?Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 28.5% (6 of 21 strings) Translation: PeerTube/PlayStoreMeta Translate-URL: https://hosted.weblate.org/projects/peertube/playstoremeta/nb_NO/ --- fastlane/metadata/android/no-NO/changelogs/1048.txt | 1 + fastlane/metadata/android/no-NO/changelogs/1054.txt | 1 + 2 files changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/no-NO/changelogs/1048.txt create mode 100644 fastlane/metadata/android/no-NO/changelogs/1054.txt diff --git a/fastlane/metadata/android/no-NO/changelogs/1048.txt b/fastlane/metadata/android/no-NO/changelogs/1048.txt new file mode 100644 index 0000000..b90116a --- /dev/null +++ b/fastlane/metadata/android/no-NO/changelogs/1048.txt @@ -0,0 +1 @@ +- f-droid-utgave for å fikse automatisk utrulling diff --git a/fastlane/metadata/android/no-NO/changelogs/1054.txt b/fastlane/metadata/android/no-NO/changelogs/1054.txt new file mode 100644 index 0000000..a0fdfc0 --- /dev/null +++ b/fastlane/metadata/android/no-NO/changelogs/1054.txt @@ -0,0 +1 @@ +- La til støtte for HLS-avspilling From b83130125d9dcb90551c13e70f0d39497f09e9ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Sch=C3=BCller?= Date: Sat, 1 Jan 2022 00:53:43 +0000 Subject: [PATCH 39/39] Player update --- Dockerfile | 2 +- app/build.gradle | 18 +- .../activity/ServerAddressBookActivity.kt | 8 +- .../peertube/activity/VideoListActivity.kt | 51 +- .../peertube/activity/VideoPlayActivity.java | 502 ----------------- .../peertube/activity/VideoPlayActivity.kt | 461 ++++++++++++++++ .../adapter/MultiViewRecycleViewAdapter.kt | 44 +- .../adapter/MultiViewRecyclerViewHolder.kt | 374 ++++++++++++- .../net/schueller/peertube/database/Server.kt | 2 +- .../peertube/database/ServerRepository.kt | 1 - .../peertube/fragment/AddServerFragment.kt | 42 +- .../fragment/VideoDescriptionFragment.kt | 120 ++++ .../fragment/VideoMetaDataFragment.java | 408 -------------- .../fragment/VideoMetaDataFragment.kt | 240 ++++++++ .../fragment/VideoPlayerFragment.java | 516 ------------------ .../peertube/fragment/VideoPlayerFragment.kt | 496 +++++++++++++++++ .../schueller/peertube/intents/Intents.java | 93 ---- .../net/schueller/peertube/intents/Intents.kt | 146 +++++ .../net/schueller/peertube/model/Comment.kt | 38 ++ .../schueller/peertube/model/CommentThread.kt | 29 + .../net/schueller/peertube/model/Video.kt | 4 +- .../peertube/model/ui/VideoMetaViewItem.kt | 7 + .../peertube/network/GetUserService.java | 21 + .../peertube/network/GetVideoDataService.java | 9 + .../peertube/service/VideoPlayerService.java | 358 ------------ .../peertube/service/VideoPlayerService.kt | 312 +++++++++++ app/src/main/res/drawable/ic_chevron_down.xml | 13 + app/src/main/res/drawable/ic_close.xml | 20 + app/src/main/res/drawable/ic_download.xml | 27 + app/src/main/res/drawable/ic_fast_forward.xml | 11 + app/src/main/res/drawable/ic_flag.xml | 20 + app/src/main/res/drawable/ic_pause.xml | 10 + app/src/main/res/drawable/ic_play.xml | 7 + app/src/main/res/drawable/ic_playlist_add.xml | 5 + app/src/main/res/drawable/ic_rewind.xml | 11 + app/src/main/res/drawable/ic_share_2.xml | 41 ++ app/src/main/res/drawable/ic_slash.xml | 20 + app/src/main/res/drawable/ic_thumbs_down.xml | 13 + .../res/drawable/ic_thumbs_down_filled.xml | 13 + app/src/main/res/drawable/ic_thumbs_up.xml | 13 + .../main/res/drawable/ic_thumbs_up_filled.xml | 13 + .../main/res/layout/activity_video_play.xml | 37 +- .../res/layout/fragment_video_description.xml | 225 ++++++++ .../main/res/layout/fragment_video_meta.xml | 363 +----------- .../layout/item_video_comments_overview.xml | 94 ++++ app/src/main/res/layout/item_video_meta.xml | 402 ++++++++++++++ .../res/layout/video_playback_controls.xml | 128 +++-- app/src/main/res/values/constants.xml | 1 + app/src/main/res/values/strings.xml | 10 + app/src/main/res/xml/root_preferences.xml | 12 +- build.gradle | 5 +- 51 files changed, 3426 insertions(+), 2390 deletions(-) delete mode 100644 app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java create mode 100644 app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.kt create mode 100644 app/src/main/java/net/schueller/peertube/fragment/VideoDescriptionFragment.kt delete mode 100644 app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java create mode 100644 app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.kt delete mode 100644 app/src/main/java/net/schueller/peertube/fragment/VideoPlayerFragment.java create mode 100644 app/src/main/java/net/schueller/peertube/fragment/VideoPlayerFragment.kt delete mode 100644 app/src/main/java/net/schueller/peertube/intents/Intents.java create mode 100644 app/src/main/java/net/schueller/peertube/intents/Intents.kt create mode 100644 app/src/main/java/net/schueller/peertube/model/Comment.kt create mode 100644 app/src/main/java/net/schueller/peertube/model/CommentThread.kt create mode 100644 app/src/main/java/net/schueller/peertube/model/ui/VideoMetaViewItem.kt delete mode 100644 app/src/main/java/net/schueller/peertube/service/VideoPlayerService.java create mode 100644 app/src/main/java/net/schueller/peertube/service/VideoPlayerService.kt create mode 100644 app/src/main/res/drawable/ic_chevron_down.xml create mode 100644 app/src/main/res/drawable/ic_close.xml create mode 100644 app/src/main/res/drawable/ic_download.xml create mode 100644 app/src/main/res/drawable/ic_fast_forward.xml create mode 100644 app/src/main/res/drawable/ic_flag.xml create mode 100644 app/src/main/res/drawable/ic_pause.xml create mode 100644 app/src/main/res/drawable/ic_play.xml create mode 100644 app/src/main/res/drawable/ic_playlist_add.xml create mode 100644 app/src/main/res/drawable/ic_rewind.xml create mode 100644 app/src/main/res/drawable/ic_share_2.xml create mode 100644 app/src/main/res/drawable/ic_slash.xml create mode 100644 app/src/main/res/drawable/ic_thumbs_down.xml create mode 100644 app/src/main/res/drawable/ic_thumbs_down_filled.xml create mode 100644 app/src/main/res/drawable/ic_thumbs_up.xml create mode 100644 app/src/main/res/drawable/ic_thumbs_up_filled.xml create mode 100644 app/src/main/res/layout/fragment_video_description.xml create mode 100644 app/src/main/res/layout/item_video_comments_overview.xml create mode 100644 app/src/main/res/layout/item_video_meta.xml diff --git a/Dockerfile b/Dockerfile index 72d6992..1a3a9a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ ENV ANDROID_SDK_CHECKSUM 124f2d5115eee365df6cf3228ffbca6fc3911d16f8025bebd5b1c6e # higher version casues Warning: Failed to find package ENV ANDROID_BUILD_TOOLS_VERSION 30.0.2 ENV ANDROID_SDK_ROOT /usr/local/android-sdk-linux -ENV ANDROID_VERSION 30 +ENV ANDROID_VERSION 32 # ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools ENV PATH ${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin diff --git a/app/build.gradle b/app/build.gradle index fa8d0c6..84d3bf2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,13 +39,13 @@ else { apply plugin: 'kotlin-kapt' android { - compileSdkVersion 30 + compileSdkVersion 32 buildToolsVersion "30.0.2" defaultConfig { applicationId "net.schueller.peertube" minSdkVersion 21 - targetSdkVersion 30 + targetSdkVersion 32 versionCode 1069 versionName "1.8.3" buildConfigField "long", "BUILD_TIME", readPropertyWithDefault('buildTimestamp', System.currentTimeMillis()) + 'L' @@ -94,10 +94,10 @@ android { } -def room_version = "2.3.0" -def lifecycleVersion = '2.3.1' -def exoplayer = '2.12.3' -def fragment_version = "1.3.6" +def room_version = "2.4.0" +def lifecycleVersion = '2.4.0' +def exoplayer = '2.16.1' +def fragment_version = "1.4.0" dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) @@ -105,8 +105,8 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" // Layouts and design - implementation 'androidx.constraintlayout:constraintlayout:2.1.1' - implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.2' + implementation 'androidx.appcompat:appcompat:1.4.0' implementation 'com.google.android.material:material:1.4.0' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.fragment:fragment-ktx:$fragment_version" @@ -118,7 +118,7 @@ dependencies { implementation 'com.mikepenz:fontawesome-typeface:5.9.0.2-kotlin@aar' // http client / REST - implementation 'com.squareup.okhttp3:okhttp:4.9.1' + implementation 'com.squareup.okhttp3:okhttp:4.9.2' implementation 'com.squareup.retrofit2:retrofit:2.9.0' // image downloading and caching library diff --git a/app/src/main/java/net/schueller/peertube/activity/ServerAddressBookActivity.kt b/app/src/main/java/net/schueller/peertube/activity/ServerAddressBookActivity.kt index 3c55cfa..59d3560 100644 --- a/app/src/main/java/net/schueller/peertube/activity/ServerAddressBookActivity.kt +++ b/app/src/main/java/net/schueller/peertube/activity/ServerAddressBookActivity.kt @@ -41,7 +41,7 @@ import java.util.* class ServerAddressBookActivity : CommonActivity() { - private val TAG = "ServerAddressBookActivity" + private val TAG = "ServerAddBookAct" private val mServerViewModel: ServerViewModel by viewModels() private var addServerFragment: AddServerFragment? = null @@ -133,15 +133,15 @@ class ServerAddressBookActivity : CommonActivity() { AlertDialog.Builder(this@ServerAddressBookActivity) .setTitle(getString(R.string.server_book_del_alert_title)) .setMessage(getString(R.string.server_book_del_alert_msg)) - .setPositiveButton(android.R.string.yes) { _: DialogInterface?, _: Int -> - val position = viewHolder.adapterPosition + .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int -> + val position = viewHolder.bindingAdapterPosition val server = adapter.getServerAtPosition(position) // Toast.makeText(ServerAddressBookActivity.this, "Deleting " + // server.getServerName(), Toast.LENGTH_LONG).show(); // Delete the server mServerViewModel.delete(server) } - .setNegativeButton(android.R.string.no) { _: DialogInterface?, _: Int -> adapter.notifyItemChanged(viewHolder.adapterPosition) } + .setNegativeButton(android.R.string.cancel) { _: DialogInterface?, _: Int -> adapter.notifyItemChanged(viewHolder.bindingAdapterPosition) } .setIcon(android.R.drawable.ic_dialog_alert) .show() } diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.kt b/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.kt index e2787e6..8a8304f 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.kt +++ b/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.kt @@ -19,6 +19,7 @@ package net.schueller.peertube.activity import android.Manifest.permission import android.R.drawable import android.R.string +import android.app.Activity import android.app.AlertDialog.Builder import android.app.SearchManager import android.content.Context @@ -33,6 +34,7 @@ import android.view.MenuItem import android.view.MenuItem.OnActionExpandListener import android.view.View import android.widget.TextView +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView.OnSuggestionListener import androidx.appcompat.widget.Toolbar @@ -116,7 +118,7 @@ class VideoListActivity : CommonActivity() { Builder(this@VideoListActivity) .setTitle(getString(R.string.clear_search_history)) .setMessage(getString(R.string.clear_search_history_prompt)) - .setPositiveButton(string.yes) { _, _ -> + .setPositiveButton(string.ok) { _, _ -> val suggestions = SearchRecentSuggestions( applicationContext, SearchSuggestionsProvider.AUTHORITY, @@ -124,7 +126,7 @@ class VideoListActivity : CommonActivity() { ) suggestions.clearHistory() } - .setNegativeButton(string.no, null) + .setNegativeButton(string.cancel, null) .setIcon(drawable.ic_dialog_alert) .show() true @@ -160,8 +162,7 @@ class VideoListActivity : CommonActivity() { position ) as Cursor return cursor.getString( - cursor - .getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1) + cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1) ) } @@ -178,15 +179,26 @@ class VideoListActivity : CommonActivity() { stopService(Intent(this, VideoPlayerService::class.java)) } - public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == SWITCH_INSTANCE) { - if (resultCode == RESULT_OK) { - loadVideos(currentStart, count, sort, filter) - } +// public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { +// super.onActivityResult(requestCode, resultCode, data) +// if (requestCode == SWITCH_INSTANCE) { +// if (resultCode == RESULT_OK) { +// loadVideos(currentStart, count, sort, filter) +// } +// } +// } + + private var resultLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + loadVideos(currentStart, count, sort, filter) } } + private fun openActivityForResult(intent: Intent) { + resultLauncher.launch(intent) + } + override fun onOptionsItemSelected(item: MenuItem): Boolean { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long @@ -213,7 +225,7 @@ class VideoListActivity : CommonActivity() { } id.action_server_address_book -> { val addressBookActivityIntent = Intent(this, ServerAddressBookActivity::class.java) - this.startActivityForResult(addressBookActivityIntent, SWITCH_INSTANCE) + openActivityForResult(addressBookActivityIntent) return false } else -> { @@ -461,7 +473,7 @@ class VideoListActivity : CommonActivity() { // new IconicsDrawable(this, FontAwesome.Icon.faw_user_circle)); // Click Listener - navigation.setOnNavigationItemSelectedListener { menuItem: MenuItem -> + navigation.setOnItemSelectedListener { menuItem: MenuItem -> when (menuItem.itemId) { id.navigation_overview -> { // TODO @@ -470,7 +482,7 @@ class VideoListActivity : CommonActivity() { loadOverview(currentPage) overViewActive = true } - return@setOnNavigationItemSelectedListener true + return@setOnItemSelectedListener true } id.navigation_trending -> { //Log.v(TAG, "navigation_trending"); @@ -482,7 +494,7 @@ class VideoListActivity : CommonActivity() { subscriptions = false loadVideos(currentStart, count, sort, filter) } - return@setOnNavigationItemSelectedListener true + return@setOnItemSelectedListener true } id.navigation_recent -> { if (!isLoading) { @@ -493,7 +505,7 @@ class VideoListActivity : CommonActivity() { subscriptions = false loadVideos(currentStart, count, sort, filter) } - return@setOnNavigationItemSelectedListener true + return@setOnItemSelectedListener true } id.navigation_local -> { //Log.v(TAG, "navigation_trending"); @@ -505,15 +517,15 @@ class VideoListActivity : CommonActivity() { subscriptions = false loadVideos(currentStart, count, sort, filter) } - return@setOnNavigationItemSelectedListener true + return@setOnItemSelectedListener true } id.navigation_subscriptions -> //Log.v(TAG, "navigation_subscriptions"); if (!Session.getInstance().isLoggedIn) { // Intent intent = new Intent(this, LoginActivity.class); // this.startActivity(intent); val addressBookActivityIntent = Intent(this, ServerAddressBookActivity::class.java) - this.startActivityForResult(addressBookActivityIntent, SWITCH_INSTANCE) - return@setOnNavigationItemSelectedListener false + openActivityForResult(addressBookActivityIntent) + return@setOnItemSelectedListener false } else { if (!isLoading) { overViewActive = false @@ -523,7 +535,7 @@ class VideoListActivity : CommonActivity() { subscriptions = true loadVideos(currentStart, count, sort, filter) } - return@setOnNavigationItemSelectedListener true + return@setOnItemSelectedListener true } } false @@ -574,6 +586,5 @@ class VideoListActivity : CommonActivity() { const val EXTRA_VIDEOID = "VIDEOID" const val EXTRA_ACCOUNTDISPLAYNAME = "ACCOUNTDISPLAYNAMEANDHOST" - const val SWITCH_INSTANCE = 2 } } \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java deleted file mode 100644 index f73041c..0000000 --- a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java +++ /dev/null @@ -1,502 +0,0 @@ -/* - * Copyright (C) 2020 Stefan Schüller - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package net.schueller.peertube.activity; - - -import android.annotation.SuppressLint; -import android.app.AppOpsManager; -import android.app.PendingIntent; -import android.app.PictureInPictureParams; -import android.app.RemoteAction; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.graphics.drawable.Icon; -import android.os.Build; -import android.os.Bundle; - -import android.preference.PreferenceManager; - -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; -import androidx.appcompat.app.AppCompatActivity; - -import android.text.TextUtils; -import android.util.Log; -import android.util.Rational; -import android.util.TypedValue; - -import android.view.WindowManager; -import android.widget.FrameLayout; - -import android.widget.RelativeLayout; - -import net.schueller.peertube.R; -import net.schueller.peertube.fragment.VideoMetaDataFragment; -import net.schueller.peertube.fragment.VideoPlayerFragment; -import net.schueller.peertube.service.VideoPlayerService; - - -import java.util.ArrayList; - -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; - - -import static com.google.android.exoplayer2.ui.PlayerNotificationManager.ACTION_PAUSE; -import static com.google.android.exoplayer2.ui.PlayerNotificationManager.ACTION_PLAY; -import static com.google.android.exoplayer2.ui.PlayerNotificationManager.ACTION_STOP; -import static net.schueller.peertube.helper.VideoHelper.canEnterPipMode; - -public class VideoPlayActivity extends AppCompatActivity { - - private static final String TAG = "VideoPlayActivity"; - - static boolean floatMode = false; - - private static final int REQUEST_CODE = 101; - private BroadcastReceiver receiver; - - //This can only be called when in entering pip mode which can't happen if the device doesn't support pip mode. - @SuppressLint("NewApi") - public void makePipControls() { - FragmentManager fragmentManager = getSupportFragmentManager(); - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) fragmentManager.findFragmentById(R.id.video_player_fragment); - - ArrayList actions = new ArrayList<>(); - - Intent actionIntent = new Intent(getString(R.string.app_background_audio)); - PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), REQUEST_CODE, actionIntent, 0); - @SuppressLint({"NewApi", "LocalSuppress"}) Icon icon = Icon.createWithResource(getApplicationContext(), android.R.drawable.stat_sys_speakerphone); - @SuppressLint({"NewApi", "LocalSuppress"}) RemoteAction remoteAction = new RemoteAction(icon, "close pip", "from pip window custom command", pendingIntent); - actions.add(remoteAction); - - actionIntent = new Intent(ACTION_STOP); - pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), REQUEST_CODE, actionIntent, 0); - icon = Icon.createWithResource(getApplicationContext(), com.google.android.exoplayer2.ui.R.drawable.exo_notification_stop); - remoteAction = new RemoteAction(icon, "play", "stop the media", pendingIntent); - actions.add(remoteAction); - - assert videoPlayerFragment != null; - if (videoPlayerFragment.isPaused()) { - Log.e(TAG, "setting actions with play button"); - actionIntent = new Intent(ACTION_PLAY); - pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), REQUEST_CODE, actionIntent, 0); - icon = Icon.createWithResource(getApplicationContext(), com.google.android.exoplayer2.ui.R.drawable.exo_notification_play); - remoteAction = new RemoteAction(icon, "play", "play the media", pendingIntent); - } else { - Log.e(TAG, "setting actions with pause button"); - actionIntent = new Intent(ACTION_PAUSE); - pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), REQUEST_CODE, actionIntent, 0); - icon = Icon.createWithResource(getApplicationContext(), com.google.android.exoplayer2.ui.R.drawable.exo_notification_pause); - remoteAction = new RemoteAction(icon, "pause", "pause the media", pendingIntent); - } - actions.add(remoteAction); - - - //add custom actions to pip window - PictureInPictureParams params = - new PictureInPictureParams.Builder() - .setActions(actions) - .build(); - setPictureInPictureParams(params); - } - - public void changedToPipMode() { - FragmentManager fragmentManager = getSupportFragmentManager(); - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) fragmentManager.findFragmentById(R.id.video_player_fragment); - - assert videoPlayerFragment != null; - videoPlayerFragment.showControls(false); - //create custom actions - makePipControls(); - - //setup receiver to handle customer actions - IntentFilter filter = new IntentFilter(); - filter.addAction(ACTION_STOP); - filter.addAction(ACTION_PAUSE); - filter.addAction(ACTION_PLAY); - filter.addAction((getString(R.string.app_background_audio))); - receiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - assert action != null; - if (action.equals(ACTION_PAUSE)) { - videoPlayerFragment.pauseVideo(); - makePipControls(); - } - if (action.equals(ACTION_PLAY)) { - videoPlayerFragment.unPauseVideo(); - makePipControls(); - } - - if (action.equals(getString(R.string.app_background_audio))) { - unregisterReceiver(receiver); - finish(); - } - if (action.equals(ACTION_STOP)) { - unregisterReceiver(receiver); - finishAndRemoveTask(); - } - } - }; - registerReceiver(receiver, filter); - - Log.v(TAG, "switched to pip "); - floatMode = true; - videoPlayerFragment.showControls(false); - } - - public void changedToNormalMode() { - FragmentManager fragmentManager = getSupportFragmentManager(); - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) fragmentManager.findFragmentById(R.id.video_player_fragment); - - assert videoPlayerFragment != null; - videoPlayerFragment.showControls(true); - if (receiver != null) { - unregisterReceiver(receiver); - } - Log.v(TAG, "switched to normal"); - floatMode = false; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // Set theme - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); - setTheme(getResources().getIdentifier( - sharedPref.getString( - getString(R.string.pref_theme_key), - getString(R.string.app_default_theme) - ), - "style", - getPackageName()) - ); - - setContentView(R.layout.activity_video_play); - - // get video ID - Intent intent = getIntent(); - String videoUuid = intent.getStringExtra(VideoListActivity.EXTRA_VIDEOID); - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) - getSupportFragmentManager().findFragmentById(R.id.video_player_fragment); - - assert videoPlayerFragment != null; - String playingVideo = videoPlayerFragment.getVideoUuid(); - Log.v(TAG, "oncreate click: " + videoUuid + " is trying to replace: " + playingVideo); - - if (TextUtils.isEmpty(playingVideo)) { - Log.v(TAG, "oncreate no video currently playing"); - videoPlayerFragment.start(videoUuid); - } else if (!playingVideo.equals(videoUuid)) { - Log.v(TAG, "oncreate different video playing currently"); - videoPlayerFragment.stopVideo(); - videoPlayerFragment.start(videoUuid); - } else { - Log.v(TAG, "oncreate same video playing currently"); - } - - // if we are in landscape set the video to fullscreen - int orientation = this.getResources().getConfiguration().orientation; - if (orientation == Configuration.ORIENTATION_LANDSCAPE) { - setOrientation(true); - } - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - setIntent(intent); - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) - getSupportFragmentManager().findFragmentById(R.id.video_player_fragment); - assert videoPlayerFragment != null; - String videoUuid = intent.getStringExtra(VideoListActivity.EXTRA_VIDEOID); - Log.v(TAG, "new intent click: " + videoUuid + " is trying to replace: " + videoPlayerFragment.getVideoUuid()); - String playingVideo = videoPlayerFragment.getVideoUuid(); - - if (TextUtils.isEmpty(playingVideo)) { - Log.v(TAG, "new intent no video currently playing"); - videoPlayerFragment.start(videoUuid); - } else if (!playingVideo.equals(videoUuid)) { - Log.v(TAG, "new intent different video playing currently"); - videoPlayerFragment.stopVideo(); - videoPlayerFragment.start(videoUuid); - } else { - Log.v(TAG, "new intent same video playing currently"); - } - - // if we are in landscape set the video to fullscreen - int orientation = this.getResources().getConfiguration().orientation; - if (orientation == Configuration.ORIENTATION_LANDSCAPE) { - setOrientation(true); - } - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - Log.v(TAG, "onConfigurationChanged()..."); - - super.onConfigurationChanged(newConfig); - - // Checking the orientation changes of the screen - if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { - setOrientation(true); - } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { - setOrientation(false); - } - } - - private void setOrientation(Boolean isLandscape) { - FragmentManager fragmentManager = getSupportFragmentManager(); - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) fragmentManager.findFragmentById(R.id.video_player_fragment); - VideoMetaDataFragment videoMetaFragment = (VideoMetaDataFragment) fragmentManager.findFragmentById(R.id.video_meta_data_fragment); - - assert videoPlayerFragment != null; - RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) videoPlayerFragment.requireView().getLayoutParams(); - params.width = FrameLayout.LayoutParams.MATCH_PARENT; - params.height = isLandscape ? FrameLayout.LayoutParams.MATCH_PARENT : (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 250, getResources().getDisplayMetrics()); - - videoPlayerFragment.requireView().setLayoutParams(params); - - if (videoMetaFragment != null) { - FragmentTransaction transaction = fragmentManager.beginTransaction() - .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); - - if (isLandscape) { - transaction.hide(videoMetaFragment); - } else { - transaction.show(videoMetaFragment); - } - - transaction.commit(); - } - - videoPlayerFragment.setIsFullscreen(isLandscape); - - if ( isLandscape ) { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } else { - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - } - - @Override - protected void onDestroy() { - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) - getSupportFragmentManager().findFragmentById(R.id.video_player_fragment); - - assert videoPlayerFragment != null; - videoPlayerFragment.destroyVideo(); - - super.onDestroy(); - Log.v(TAG, "onDestroy..."); - } - - @Override - protected void onPause() { - super.onPause(); - Log.v(TAG, "onPause()..."); - } - - @Override - protected void onResume() { - super.onResume(); - Log.v(TAG, "onResume()..."); - } - - @Override - protected void onStop() { - super.onStop(); - - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) - getSupportFragmentManager().findFragmentById(R.id.video_player_fragment); - - assert videoPlayerFragment != null; - videoPlayerFragment.stopVideo(); - - Log.v(TAG, "onStop()..."); - } - - @Override - protected void onStart() { - super.onStart(); - - Log.v(TAG, "onStart()..."); - } - - @SuppressLint("NewApi") - @Override - public void onUserLeaveHint() { - - Log.v(TAG, "onUserLeaveHint()..."); - - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); - FragmentManager fragmentManager = getSupportFragmentManager(); - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) fragmentManager.findFragmentById(R.id.video_player_fragment); - VideoMetaDataFragment videoMetaDataFragment = (VideoMetaDataFragment) fragmentManager.findFragmentById(R.id.video_meta_data_fragment); - - String backgroundBehavior = sharedPref.getString(getString(R.string.pref_background_behavior_key), getString(R.string.pref_background_stop_key)); - - assert videoPlayerFragment != null; - assert backgroundBehavior != null; - if ( videoMetaDataFragment.isLeaveAppExpected() ) - { - super.onUserLeaveHint(); - return; - } - - if (backgroundBehavior.equals(getString(R.string.pref_background_stop_key))) { - Log.v(TAG, "stop the video"); - - videoPlayerFragment.pauseVideo(); - stopService(new Intent(this, VideoPlayerService.class)); - super.onBackPressed(); - - } else if (backgroundBehavior.equals(getString(R.string.pref_background_audio_key))) { - Log.v(TAG, "play the Audio"); - super.onBackPressed(); - - } else if (backgroundBehavior.equals(getString(R.string.pref_background_float_key))) { - Log.v(TAG, "play in floating video"); - //canEnterPIPMode makes sure API level is high enough - if (canEnterPipMode(this)) { - Log.v(TAG, "enabling pip"); - enterPipMode(); - } else { - Log.v(TAG, "unable to use pip"); - } - - } else { - // Deal with bad entries from older version - Log.v(TAG, "No setting, fallback"); - super.onBackPressed(); - - } - - - } - - // @RequiresApi(api = Build.VERSION_CODES.O) - @SuppressLint("NewApi") - public void onBackPressed() { - - Log.v(TAG, "onBackPressed()..."); - - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) - getSupportFragmentManager().findFragmentById(R.id.video_player_fragment); - - assert videoPlayerFragment != null; - - // copying Youtube behavior to have back button exit full screen. - if (videoPlayerFragment.getIsFullscreen()) { - Log.v(TAG, "exiting full screen"); - videoPlayerFragment.fullScreenToggle(); - return; - } - // pause video if pref is enabled - if (sharedPref.getBoolean(getString(R.string.pref_back_pause_key), true)) { - videoPlayerFragment.pauseVideo(); - } - - String backgroundBehavior = sharedPref.getString(getString(R.string.pref_background_behavior_key), getString(R.string.pref_background_stop_key)); - - assert backgroundBehavior != null; - - if (backgroundBehavior.equals(getString(R.string.pref_background_stop_key))) { - Log.v(TAG, "stop the video"); - videoPlayerFragment.pauseVideo(); - stopService(new Intent(this, VideoPlayerService.class)); - super.onBackPressed(); - - } else if (backgroundBehavior.equals(getString(R.string.pref_background_audio_key))) { - Log.v(TAG, "play the Audio"); - super.onBackPressed(); - - } else if (backgroundBehavior.equals(getString(R.string.pref_background_float_key))) { - Log.v(TAG, "play in floating video"); - //canEnterPIPMode makes sure API level is high enough - if (canEnterPipMode(this)) { - Log.v(TAG, "enabling pip"); - enterPipMode(); - //fixes problem where back press doesn't bring up video list after returning from PIP mode - Intent intentSettings = new Intent(this, VideoListActivity.class); - this.startActivity(intentSettings); - } else { - Log.v(TAG, "Unable to enter PIP mode"); - super.onBackPressed(); - } - - } else { - // Deal with bad entries from older version - Log.v(TAG, "No setting, fallback"); - super.onBackPressed(); - - } - - - } - - @RequiresApi(api = Build.VERSION_CODES.O) - public void enterPipMode() { - final FragmentManager fragmentManager = getSupportFragmentManager(); - final VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) fragmentManager.findFragmentById( R.id.video_player_fragment ); - - if ( videoPlayerFragment.getVideoAspectRatio() == 0 ) { - Log.i( TAG, "impossible to switch to pip" ); - } else { - Rational rational = new Rational( (int) ( videoPlayerFragment.getVideoAspectRatio() * 100 ), 100 ); - PictureInPictureParams mParams = - new PictureInPictureParams.Builder() - .setAspectRatio( rational ) -// .setSourceRectHint(new Rect(0,500,400,600)) - .build(); - - enterPictureInPictureMode( mParams ); - } - } - - @Override - public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) { - FragmentManager fragmentManager = getSupportFragmentManager(); - VideoPlayerFragment videoPlayerFragment = (VideoPlayerFragment) fragmentManager.findFragmentById(R.id.video_player_fragment); - - if (videoPlayerFragment != null) { - - if (isInPictureInPictureMode) { - changedToPipMode(); - Log.v(TAG, "switched to pip "); - videoPlayerFragment.useController(false); - } else { - changedToNormalMode(); - Log.v(TAG, "switched to normal"); - videoPlayerFragment.useController(true); - } - - } else { - Log.e(TAG, "videoPlayerFragment is NULL"); - } - } - -} diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.kt b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.kt new file mode 100644 index 0000000..bdb4ae0 --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.kt @@ -0,0 +1,461 @@ +/* + * Copyright (C) 2020 Stefan Schüller + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package net.schueller.peertube.activity + +import androidx.appcompat.app.AppCompatActivity +import android.annotation.SuppressLint +import net.schueller.peertube.fragment.VideoPlayerFragment +import net.schueller.peertube.R +import android.app.RemoteAction +import android.app.PendingIntent +import com.google.android.exoplayer2.ui.PlayerNotificationManager +import android.app.PictureInPictureParams +import android.content.* +import android.content.res.Configuration +import android.graphics.drawable.Icon +import android.os.Bundle +import android.text.TextUtils +import net.schueller.peertube.fragment.VideoMetaDataFragment +import android.widget.RelativeLayout +import android.widget.FrameLayout +import android.util.TypedValue +import android.view.WindowManager +import net.schueller.peertube.service.VideoPlayerService +import net.schueller.peertube.helper.VideoHelper +import androidx.annotation.RequiresApi +import android.os.Build +import android.util.Log +import android.util.Rational +import androidx.fragment.app.Fragment +import net.schueller.peertube.fragment.VideoDescriptionFragment +import java.util.ArrayList + +class VideoPlayActivity : CommonActivity() { + private var receiver: BroadcastReceiver? = null + + //This can only be called when in entering pip mode which can't happen if the device doesn't support pip mode. + @SuppressLint("NewApi") + fun makePipControls() { + val fragmentManager = supportFragmentManager + val videoPlayerFragment = + fragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment? + val actions = ArrayList() + var actionIntent = Intent(getString(R.string.app_background_audio)) + var pendingIntent = + PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, 0) + @SuppressLint("NewApi", "LocalSuppress") var icon = Icon.createWithResource( + applicationContext, android.R.drawable.stat_sys_speakerphone + ) + @SuppressLint("NewApi", "LocalSuppress") var remoteAction = + RemoteAction(icon!!, "close pip", "from pip window custom command", pendingIntent!!) + actions.add(remoteAction) + actionIntent = Intent(PlayerNotificationManager.ACTION_STOP) + pendingIntent = + PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, 0) + icon = Icon.createWithResource( + applicationContext, + com.google.android.exoplayer2.ui.R.drawable.exo_notification_stop + ) + remoteAction = RemoteAction(icon, "play", "stop the media", pendingIntent) + actions.add(remoteAction) + assert(videoPlayerFragment != null) + if (videoPlayerFragment!!.isPaused) { + Log.e(TAG, "setting actions with play button") + actionIntent = Intent(PlayerNotificationManager.ACTION_PLAY) + pendingIntent = + PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, 0) + icon = Icon.createWithResource( + applicationContext, + com.google.android.exoplayer2.ui.R.drawable.exo_notification_play + ) + remoteAction = RemoteAction(icon, "play", "play the media", pendingIntent) + } else { + Log.e(TAG, "setting actions with pause button") + actionIntent = Intent(PlayerNotificationManager.ACTION_PAUSE) + pendingIntent = + PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, 0) + icon = Icon.createWithResource( + applicationContext, + com.google.android.exoplayer2.ui.R.drawable.exo_notification_pause + ) + remoteAction = RemoteAction(icon, "pause", "pause the media", pendingIntent) + } + actions.add(remoteAction) + + + //add custom actions to pip window + val params = PictureInPictureParams.Builder() + .setActions(actions) + .build() + setPictureInPictureParams(params) + } + + private fun changedToPipMode() { + val fragmentManager = supportFragmentManager + val videoPlayerFragment = + (fragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment?)!! + videoPlayerFragment.showControls(false) + //create custom actions + makePipControls() + + //setup receiver to handle customer actions + val filter = IntentFilter() + filter.addAction(PlayerNotificationManager.ACTION_STOP) + filter.addAction(PlayerNotificationManager.ACTION_PAUSE) + filter.addAction(PlayerNotificationManager.ACTION_PLAY) + filter.addAction(getString(R.string.app_background_audio)) + receiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val action = intent.action!! + if (action == PlayerNotificationManager.ACTION_PAUSE) { + videoPlayerFragment.pauseVideo() + makePipControls() + } + if (action == PlayerNotificationManager.ACTION_PLAY) { + videoPlayerFragment.unPauseVideo() + makePipControls() + } + if (action == getString(R.string.app_background_audio)) { + unregisterReceiver(receiver) + finish() + } + if (action == PlayerNotificationManager.ACTION_STOP) { + unregisterReceiver(receiver) + finishAndRemoveTask() + } + } + } + registerReceiver(receiver, filter) + Log.v(TAG, "switched to pip ") + floatMode = true + videoPlayerFragment.showControls(false) + } + + private fun changedToNormalMode() { + val fragmentManager = supportFragmentManager + val videoPlayerFragment = + (fragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment?)!! + videoPlayerFragment.showControls(true) + if (receiver != null) { + unregisterReceiver(receiver) + } + Log.v(TAG, "switched to normal") + floatMode = false + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + // Set theme + val sharedPref = getSharedPreferences(packageName + "_preferences", Context.MODE_PRIVATE) + setTheme( + resources.getIdentifier( + sharedPref.getString( + getString(R.string.pref_theme_key), + getString(R.string.app_default_theme) + ), + "style", + packageName + ) + ) + setContentView(R.layout.activity_video_play) + + // get video ID + val intent = intent + val videoUuid = intent.getStringExtra(VideoListActivity.EXTRA_VIDEOID) + val videoPlayerFragment = + (supportFragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment?)!! + val playingVideo = videoPlayerFragment.videoUuid + Log.v(TAG, "oncreate click: $videoUuid is trying to replace: $playingVideo") + when { + TextUtils.isEmpty(playingVideo) -> { + Log.v(TAG, "oncreate no video currently playing") + videoPlayerFragment.start(videoUuid) + } + playingVideo != videoUuid -> { + Log.v(TAG, "oncreate different video playing currently") + videoPlayerFragment.stopVideo() + videoPlayerFragment.start(videoUuid) + } + else -> { + Log.v(TAG, "oncreate same video playing currently") + } + } + + // if we are in landscape set the video to fullscreen + val orientation = this.resources.configuration.orientation + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + setOrientation(true) + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + val videoPlayerFragment = + (supportFragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment?)!! + val videoUuid = intent.getStringExtra(VideoListActivity.EXTRA_VIDEOID) + Log.v( + TAG, + "new intent click: " + videoUuid + " is trying to replace: " + videoPlayerFragment.videoUuid + ) + val playingVideo = videoPlayerFragment.videoUuid + when { + TextUtils.isEmpty(playingVideo) -> { + Log.v(TAG, "new intent no video currently playing") + videoPlayerFragment.start(videoUuid) + } + playingVideo != videoUuid -> { + Log.v(TAG, "new intent different video playing currently") + videoPlayerFragment.stopVideo() + videoPlayerFragment.start(videoUuid) + } + else -> { + Log.v(TAG, "new intent same video playing currently") + } + } + + // if we are in landscape set the video to fullscreen + val orientation = this.resources.configuration.orientation + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + setOrientation(true) + } + } + + override fun onConfigurationChanged(newConfig: Configuration) { + Log.v(TAG, "onConfigurationChanged()...") + super.onConfigurationChanged(newConfig) + + // Checking the orientation changes of the screen + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + setOrientation(true) + } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + setOrientation(false) + } + } + + private fun setOrientation(isLandscape: Boolean) { + val fragmentManager = supportFragmentManager + val videoPlayerFragment = + fragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment? + val videoMetaFragment = + fragmentManager.findFragmentById(R.id.video_meta_data_fragment) as VideoMetaDataFragment? + assert(videoPlayerFragment != null) + val params = videoPlayerFragment!!.requireView().layoutParams as RelativeLayout.LayoutParams + params.width = FrameLayout.LayoutParams.MATCH_PARENT + params.height = + if (isLandscape) FrameLayout.LayoutParams.MATCH_PARENT else TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + 250f, + resources.displayMetrics + ) + .toInt() + videoPlayerFragment.requireView().layoutParams = params + if (videoMetaFragment != null) { + val transaction = fragmentManager.beginTransaction() + .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) + if (isLandscape) { + transaction.hide(videoMetaFragment) + } else { + transaction.show(videoMetaFragment) + } + transaction.commit() + } + videoPlayerFragment.setIsFullscreen(isLandscape) + if (isLandscape) { + window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) + } + } + + override fun onDestroy() { + val videoPlayerFragment = + (supportFragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment?)!! + videoPlayerFragment.destroyVideo() + super.onDestroy() + Log.v(TAG, "onDestroy...") + } + + override fun onPause() { + super.onPause() + Log.v(TAG, "onPause()...") + } + + override fun onResume() { + super.onResume() + Log.v(TAG, "onResume()...") + } + + override fun onStop() { + super.onStop() + val videoPlayerFragment = + (supportFragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment?)!! + videoPlayerFragment.stopVideo() + + // TODO: doesn't remove fragment?? + val fragment: Fragment? = supportFragmentManager.findFragmentByTag(VideoDescriptionFragment.TAG) + if (fragment != null) { + Log.v(TAG, "remove VideoDescriptionFragment") + supportFragmentManager.beginTransaction().remove(fragment).commit() + } + + Log.v(TAG, "onStop()...") + } + + override fun onStart() { + super.onStart() + Log.v(TAG, "onStart()...") + } + + @SuppressLint("NewApi") + public override fun onUserLeaveHint() { + Log.v(TAG, "onUserLeaveHint()...") + val sharedPref = getSharedPreferences(packageName + "_preferences", Context.MODE_PRIVATE) + val fragmentManager = supportFragmentManager + val videoPlayerFragment = + fragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment? + val videoMetaDataFragment = + fragmentManager.findFragmentById(R.id.video_meta_data_fragment) as VideoMetaDataFragment? + val backgroundBehavior = sharedPref.getString( + getString(R.string.pref_background_behavior_key), + getString(R.string.pref_background_stop_key) + ) + assert(videoPlayerFragment != null) + assert(backgroundBehavior != null) + if (videoMetaDataFragment!!.isLeaveAppExpected) { + super.onUserLeaveHint() + return + } + if (backgroundBehavior == getString(R.string.pref_background_stop_key)) { + Log.v(TAG, "stop the video") + videoPlayerFragment!!.pauseVideo() + stopService(Intent(this, VideoPlayerService::class.java)) + super.onBackPressed() + } else if (backgroundBehavior == getString(R.string.pref_background_audio_key)) { + Log.v(TAG, "play the Audio") + super.onBackPressed() + } else if (backgroundBehavior == getString(R.string.pref_background_float_key)) { + Log.v(TAG, "play in floating video") + //canEnterPIPMode makes sure API level is high enough + if (VideoHelper.canEnterPipMode(this)) { + Log.v(TAG, "enabling pip") + enterPipMode() + } else { + Log.v(TAG, "unable to use pip") + } + } else { + // Deal with bad entries from older version + Log.v(TAG, "No setting, fallback") + super.onBackPressed() + } + } + + // @RequiresApi(api = Build.VERSION_CODES.O) + @SuppressLint("NewApi") + override fun onBackPressed() { + Log.v(TAG, "onBackPressed()...") + val sharedPref = getSharedPreferences(packageName + "_preferences", Context.MODE_PRIVATE) + val videoPlayerFragment = + (supportFragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment?)!! + + // copying Youtube behavior to have back button exit full screen. + if (videoPlayerFragment.getIsFullscreen()) { + Log.v(TAG, "exiting full screen") + videoPlayerFragment.fullScreenToggle() + return + } + // pause video if pref is enabled + if (sharedPref.getBoolean(getString(R.string.pref_back_pause_key), true)) { + videoPlayerFragment.pauseVideo() + } + val backgroundBehavior = sharedPref.getString( + getString(R.string.pref_background_behavior_key), + getString(R.string.pref_background_stop_key) + )!! + if (backgroundBehavior == getString(R.string.pref_background_stop_key)) { + Log.v(TAG, "stop the video") + videoPlayerFragment.pauseVideo() + stopService(Intent(this, VideoPlayerService::class.java)) + super.onBackPressed() + } else if (backgroundBehavior == getString(R.string.pref_background_audio_key)) { + Log.v(TAG, "play the Audio") + super.onBackPressed() + } else if (backgroundBehavior == getString(R.string.pref_background_float_key)) { + Log.v(TAG, "play in floating video") + //canEnterPIPMode makes sure API level is high enough + if (VideoHelper.canEnterPipMode(this)) { + Log.v(TAG, "enabling pip") + enterPipMode() + //fixes problem where back press doesn't bring up video list after returning from PIP mode + val intentSettings = Intent(this, VideoListActivity::class.java) + this.startActivity(intentSettings) + } else { + Log.v(TAG, "Unable to enter PIP mode") + super.onBackPressed() + } + } else { + // Deal with bad entries from older version + Log.v(TAG, "No setting, fallback") + super.onBackPressed() + } + } + + @RequiresApi(api = Build.VERSION_CODES.O) + fun enterPipMode() { + val fragmentManager = supportFragmentManager + val videoPlayerFragment = + fragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment? + if (videoPlayerFragment!!.videoAspectRatio == 0.toFloat()) { + Log.i(TAG, "impossible to switch to pip") + } else { + val rational = Rational((videoPlayerFragment.videoAspectRatio * 100).toInt(), 100) + val mParams = PictureInPictureParams.Builder() + .setAspectRatio(rational) // .setSourceRectHint(new Rect(0,500,400,600)) + .build() + enterPictureInPictureMode(mParams) + } + } + + override fun onPictureInPictureModeChanged( + isInPictureInPictureMode: Boolean, + newConfig: Configuration + ) { + val fragmentManager = supportFragmentManager + val videoPlayerFragment = + fragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment? + if (videoPlayerFragment != null) { + if (isInPictureInPictureMode) { + changedToPipMode() + Log.v(TAG, "switched to pip ") + videoPlayerFragment.useController(false) + } else { + changedToNormalMode() + Log.v(TAG, "switched to normal") + videoPlayerFragment.useController(true) + } + } else { + Log.e(TAG, "videoPlayerFragment is NULL") + } + } + + companion object { + private const val TAG = "VideoPlayActivity" + var floatMode = false + private const val REQUEST_CODE = 101 + } +} \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/adapter/MultiViewRecycleViewAdapter.kt b/app/src/main/java/net/schueller/peertube/adapter/MultiViewRecycleViewAdapter.kt index c55309a..6b21a64 100644 --- a/app/src/main/java/net/schueller/peertube/adapter/MultiViewRecycleViewAdapter.kt +++ b/app/src/main/java/net/schueller/peertube/adapter/MultiViewRecycleViewAdapter.kt @@ -4,19 +4,14 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import net.schueller.peertube.R -import net.schueller.peertube.databinding.ItemCategoryTitleBinding -import net.schueller.peertube.databinding.ItemChannelTitleBinding -import net.schueller.peertube.databinding.ItemTagTitleBinding -import net.schueller.peertube.databinding.RowVideoListBinding -import net.schueller.peertube.model.Category -import net.schueller.peertube.model.Channel -import net.schueller.peertube.model.TagVideo -import net.schueller.peertube.model.Video -import net.schueller.peertube.model.VideoList +import net.schueller.peertube.databinding.* +import net.schueller.peertube.fragment.VideoMetaDataFragment +import net.schueller.peertube.model.* import net.schueller.peertube.model.ui.OverviewRecycleViewItem +import net.schueller.peertube.model.ui.VideoMetaViewItem import java.util.ArrayList -class MultiViewRecycleViewAdapter : RecyclerView.Adapter() { +class MultiViewRecycleViewAdapter(private val videoMetaDataFragment: VideoMetaDataFragment? = null) : RecyclerView.Adapter() { private var items = ArrayList() set(value) { @@ -34,6 +29,11 @@ class MultiViewRecycleViewAdapter : RecyclerView.Adapter MultiViewRecyclerViewHolder.VideoMetaViewHolder( + ItemVideoMetaBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + videoMetaDataFragment + ) + R.layout.item_video_comments_overview -> MultiViewRecyclerViewHolder.VideoCommentsViewHolder( + ItemVideoCommentsOverviewBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) else -> throw IllegalArgumentException("Invalid ViewType Provided") } } @@ -93,6 +113,8 @@ class MultiViewRecycleViewAdapter : RecyclerView.Adapter holder.bind(items[position] as Category) is MultiViewRecyclerViewHolder.ChannelViewHolder -> holder.bind(items[position] as Channel) is MultiViewRecyclerViewHolder.TagViewHolder -> holder.bind(items[position] as TagVideo) + is MultiViewRecyclerViewHolder.VideoMetaViewHolder -> holder.bind(items[position] as VideoMetaViewItem) + is MultiViewRecyclerViewHolder.VideoCommentsViewHolder -> holder.bind(items[position] as CommentThread) } } @@ -104,6 +126,8 @@ class MultiViewRecycleViewAdapter : RecyclerView.Adapter R.layout.item_channel_title is Category -> R.layout.item_category_title is TagVideo -> R.layout.item_tag_title + is VideoMetaViewItem -> R.layout.item_video_meta + is CommentThread -> R.layout.item_video_comments_overview else -> { return 0} } } diff --git a/app/src/main/java/net/schueller/peertube/adapter/MultiViewRecyclerViewHolder.kt b/app/src/main/java/net/schueller/peertube/adapter/MultiViewRecyclerViewHolder.kt index 6fc4a5a..b8b19d5 100644 --- a/app/src/main/java/net/schueller/peertube/adapter/MultiViewRecyclerViewHolder.kt +++ b/app/src/main/java/net/schueller/peertube/adapter/MultiViewRecyclerViewHolder.kt @@ -16,47 +16,286 @@ */ package net.schueller.peertube.adapter +import android.content.Context import android.content.Intent +import android.util.Log import android.view.MenuItem import android.view.View +import android.view.View.GONE +import android.widget.Toast import androidx.appcompat.widget.PopupMenu import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding +import com.google.gson.JsonObject import com.squareup.picasso.Picasso -import net.schueller.peertube.R import net.schueller.peertube.R.color import net.schueller.peertube.R.string import net.schueller.peertube.activity.AccountActivity import net.schueller.peertube.activity.VideoListActivity -import net.schueller.peertube.activity.VideoListActivity.Companion import net.schueller.peertube.activity.VideoPlayActivity -import net.schueller.peertube.databinding.ItemCategoryTitleBinding -import net.schueller.peertube.databinding.ItemChannelTitleBinding -import net.schueller.peertube.databinding.RowVideoListBinding import net.schueller.peertube.helper.APIUrlHelper import net.schueller.peertube.helper.MetaDataHelper.getDuration import net.schueller.peertube.helper.MetaDataHelper.getMetaString import net.schueller.peertube.helper.MetaDataHelper.getOwnerString -import net.schueller.peertube.model.Avatar -import net.schueller.peertube.model.Category -import net.schueller.peertube.model.Channel -import net.schueller.peertube.model.Video import com.mikepenz.iconics.Iconics.Builder import net.schueller.peertube.R.id import net.schueller.peertube.R.menu -import net.schueller.peertube.databinding.ItemTagTitleBinding +import net.schueller.peertube.databinding.* +import net.schueller.peertube.fragment.VideoMetaDataFragment import net.schueller.peertube.intents.Intents -import net.schueller.peertube.model.TagVideo +import net.schueller.peertube.model.* +import net.schueller.peertube.model.ui.VideoMetaViewItem +import net.schueller.peertube.network.GetVideoDataService +import net.schueller.peertube.network.RetrofitInstance +import net.schueller.peertube.network.Session +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import net.schueller.peertube.R +import net.schueller.peertube.network.GetUserService + sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) { + var videoRating: Rating? = null + var isLeaveAppExpected = false + class CategoryViewHolder(private val binding: ItemCategoryTitleBinding): MultiViewRecyclerViewHolder(binding) { fun bind(category: Category) { binding.textViewTitle.text = category.label } } + class VideoCommentsViewHolder(private val binding: ItemVideoCommentsOverviewBinding): MultiViewRecyclerViewHolder(binding) { + fun bind(commentThread: CommentThread) { + + binding.videoCommentsTotalCount.text = commentThread.total.toString() + + if (commentThread.comments.isNotEmpty()) { + val highlightedComment: Comment = commentThread.comments[0] + + // owner / creator Avatar + val avatar = highlightedComment.account.avatar + if (avatar != null) { + val baseUrl = APIUrlHelper.getUrl(binding.videoHighlightedAvatar.context) + val avatarPath = avatar.path + Picasso.get() + .load(baseUrl + avatarPath) + .into(binding.videoHighlightedAvatar) + } + binding.videoHighlightedComment.text = highlightedComment.text + } + } + } + + + class VideoMetaViewHolder(private val binding: ItemVideoMetaBinding, private val videoMetaDataFragment: VideoMetaDataFragment?): MultiViewRecyclerViewHolder(binding) { + fun bind(videoMetaViewItem: VideoMetaViewItem) { + + val video = videoMetaViewItem.video + + if (video != null && videoMetaDataFragment != null) { + + val context = binding.avatar.context + val apiBaseURL = APIUrlHelper.getUrlWithVersion(context) + val videoDataService = RetrofitInstance.getRetrofitInstance( + apiBaseURL, + APIUrlHelper.useInsecureConnection(context) + ).create( + GetVideoDataService::class.java + ) + val userService = RetrofitInstance.getRetrofitInstance( + apiBaseURL, + APIUrlHelper.useInsecureConnection(context) + ).create( + GetUserService::class.java + ) + + // Title + binding.videoName.text = video.name + binding.videoOpenDescription.setOnClickListener { + videoMetaDataFragment.showDescriptionFragment(video) + } + + // Thumbs up + binding.videoThumbsUpWrapper.setOnClickListener { + rateVideo(true, video, context, binding) + } + + // Thumbs Down + binding.videoThumbsDownWrapper.setOnClickListener { + rateVideo(false, video, context, binding) + } + + binding.videoAddToPlaylistWrapper.setOnClickListener { + Toast.makeText( + context, + context.getString(string.video_feature_not_yet_implemented), + Toast.LENGTH_SHORT + ).show() + } + + binding.videoBlockWrapper.setOnClickListener { + Toast.makeText( + context, + context.getString(string.video_feature_not_yet_implemented), + Toast.LENGTH_SHORT + ).show() + } + + binding.videoFlagWrapper.setOnClickListener { + Toast.makeText( + context, + context.getString(string.video_feature_not_yet_implemented), + Toast.LENGTH_SHORT + ).show() + } + + // video rating + videoRating = Rating() + videoRating!!.rating = RATING_NONE // default + updateVideoRating(video, binding) + + // Retrieve which rating the user gave to this video + if (Session.getInstance().isLoggedIn) { + val call = videoDataService.getVideoRating(video.id) + call.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + videoRating = response.body() + updateVideoRating(video, binding) + } + + override fun onFailure(call: Call, t: Throwable) { + // Do nothing. + } + }) + } + + // Share + binding.videoShare.setOnClickListener { + isLeaveAppExpected = true + Intents.Share(context, video) + } + + // hide download if not supported by video + if (video.downloadEnabled) { + binding.videoDownloadWrapper.setOnClickListener { + Intents.Download(context, video) + } + } else { + binding.videoDownloadWrapper.visibility = GONE + } + + val account = video.account + + // owner / creator Avatar + val avatar = account.avatar + if (avatar != null) { + val baseUrl = APIUrlHelper.getUrl(context) + val avatarPath = avatar.path + Picasso.get() + .load(baseUrl + avatarPath) + .into(binding.avatar) + } + // created at / views + binding.videoMeta.text = getMetaString( + video.createdAt, + video.views, + context!! + ) + + // owner / creator + binding.videoOwner.text = getOwnerString( + video.account.name, + video.account.host, + context + ) + + // videoOwnerSubscribers + binding.videoOwnerSubscribers.text = video.account.followersCount.toString() + + + // get subscription status + var isSubscribed = false + + if (Session.getInstance().isLoggedIn) { + val subChannel = video.channel.name + "@" + video.channel.host + val call = userService.subscriptionsExist(subChannel) + call.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful) { + // {"video.channel.name + "@" + video.channel.host":true} + if (response.body()?.get(video.channel.name + "@" + video.channel.host)!!.asBoolean) { + binding.videoOwnerSubscribeButton.setText(string.unsubscribe) + isSubscribed = true; + } else { + binding.videoOwnerSubscribeButton.setText(string.subscribe) + } + } + } + override fun onFailure(call: Call, t: Throwable) { + // Do nothing. + } + }) + + } + + binding.videoOwnerSubscribeButton.setOnClickListener { + if (Session.getInstance().isLoggedIn) { + if (!isSubscribed) { + val payload = video.channel.name + "@" + video.channel.host + val body = "{\"uri\":\"$payload\"}".toRequestBody("application/json".toMediaType()) + val call = userService.subscribe(body) + call.enqueue(object : Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if (response.isSuccessful) { + binding.videoOwnerSubscribeButton.setText(string.unsubscribe) + isSubscribed = true + } + } + override fun onFailure(call: Call, t: Throwable) { + // Do nothing. + } + }) + } else { + val payload = video.channel.name + "@" + video.channel.host + val call = userService.unsubscribe(payload) + call.enqueue(object : Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if (response.isSuccessful) { + binding.videoOwnerSubscribeButton.setText(string.subscribe) + isSubscribed = false + } + } + override fun onFailure(call: Call, t: Throwable) { + // Do nothing. + } + }) + } + } else { + Toast.makeText( + context, + context.getString(string.video_login_required_for_service), + Toast.LENGTH_SHORT + ).show() + } + } + } + + + } + } + class ChannelViewHolder(private val binding: ItemChannelTitleBinding): MultiViewRecyclerViewHolder(binding) { fun bind(channel: Channel) { @@ -178,4 +417,117 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi } + fun updateVideoRating(video: Video?, binding: ItemVideoMetaBinding) { + + when (videoRating!!.rating) { + RATING_NONE -> { + Log.v("MWCVH", "RATING_NONE") + binding.videoThumbsUp.setImageResource(R.drawable.ic_thumbs_up) + binding.videoThumbsDown.setImageResource(R.drawable.ic_thumbs_down) + } + RATING_LIKE -> { + Log.v("MWCVH", "RATING_LIKE") + binding.videoThumbsUp.setImageResource(R.drawable.ic_thumbs_up_filled) + binding.videoThumbsDown.setImageResource(R.drawable.ic_thumbs_down) + } + RATING_DISLIKE -> { + Log.v("MWCVH", "RATING_DISLIKE") + binding.videoThumbsUp.setImageResource(R.drawable.ic_thumbs_up) + binding.videoThumbsDown.setImageResource(R.drawable.ic_thumbs_down_filled) + } + } + + // Update the texts + binding.videoThumbsUpTotal.text = video?.likes.toString() + binding.videoThumbsDownTotal.text = video?.dislikes.toString() + + } + + /** + * TODO: move this out and get update when rating changes + */ + fun rateVideo(like: Boolean, video: Video, context: Context, binding: ItemVideoMetaBinding) { + if (Session.getInstance().isLoggedIn) { + val ratePayload: String = when (videoRating!!.rating) { + RATING_LIKE -> if (like) RATING_NONE else RATING_DISLIKE + RATING_DISLIKE -> if (like) RATING_LIKE else RATING_NONE + RATING_NONE -> if (like) RATING_LIKE else RATING_DISLIKE + else -> if (like) RATING_LIKE else RATING_DISLIKE + } + + val body = "{\"rating\":\"$ratePayload\"}".toRequestBody("application/json".toMediaType()) + + val apiBaseURL = APIUrlHelper.getUrlWithVersion(context) + val videoDataService = RetrofitInstance.getRetrofitInstance( + apiBaseURL, APIUrlHelper.useInsecureConnection( + context + ) + ).create( + GetVideoDataService::class.java + ) + val call = videoDataService.rateVideo(video.id, body) + call.enqueue(object : Callback { + override fun onResponse( + call: Call, + response: Response + ) { + // if 20x, update likes/dislikes + if (response.isSuccessful) { + val previousRating = videoRating!!.rating + + // Update the likes/dislikes count of the video, if needed. + // This is only a visual trick, as the actual like/dislike count has + // already been modified on the PeerTube instance. + if (previousRating != ratePayload) { + when (previousRating) { + RATING_NONE -> if (ratePayload == RATING_LIKE) { + video.likes = video.likes + 1 + } else { + video.dislikes = video.dislikes + 1 + } + RATING_LIKE -> { + video.likes = video.likes - 1 + if (ratePayload == RATING_DISLIKE) { + video.dislikes = video.dislikes + 1 + } + } + RATING_DISLIKE -> { + video.dislikes = video.dislikes - 1 + if (ratePayload == RATING_LIKE) { + video.likes = video.likes + 1 + } + } + } + } + videoRating!!.rating = ratePayload + updateVideoRating(video, binding) + } + } + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText( + context, + context.getString(string.video_rating_failed), + Toast.LENGTH_SHORT + ).show() + } + }) + } else { + Toast.makeText( + context, + context.getString(string.video_login_required_for_service), + Toast.LENGTH_SHORT + ).show() + } + } + + companion object { + private const val RATING_NONE = "none" + private const val RATING_LIKE = "like" + private const val RATING_DISLIKE = "dislike" + const val EXTRA_VIDEOID = "VIDEOID" + const val EXTRA_ACCOUNTDISPLAYNAME = "ACCOUNTDISPLAYNAMEANDHOST" + + } + } diff --git a/app/src/main/java/net/schueller/peertube/database/Server.kt b/app/src/main/java/net/schueller/peertube/database/Server.kt index 19f9d7f..fda5781 100644 --- a/app/src/main/java/net/schueller/peertube/database/Server.kt +++ b/app/src/main/java/net/schueller/peertube/database/Server.kt @@ -20,7 +20,7 @@ import android.os.Parcelable import androidx.room.PrimaryKey import androidx.room.ColumnInfo import androidx.room.Entity -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize @Parcelize @Entity(tableName = "server_table") diff --git a/app/src/main/java/net/schueller/peertube/database/ServerRepository.kt b/app/src/main/java/net/schueller/peertube/database/ServerRepository.kt index 871b9a9..c91d351 100644 --- a/app/src/main/java/net/schueller/peertube/database/ServerRepository.kt +++ b/app/src/main/java/net/schueller/peertube/database/ServerRepository.kt @@ -17,7 +17,6 @@ package net.schueller.peertube.database import android.app.Application -import android.os.AsyncTask import androidx.lifecycle.LiveData import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/app/src/main/java/net/schueller/peertube/fragment/AddServerFragment.kt b/app/src/main/java/net/schueller/peertube/fragment/AddServerFragment.kt index 2bfc3be..40886fd 100644 --- a/app/src/main/java/net/schueller/peertube/fragment/AddServerFragment.kt +++ b/app/src/main/java/net/schueller/peertube/fragment/AddServerFragment.kt @@ -19,12 +19,13 @@ package net.schueller.peertube.fragment import android.app.Activity import android.content.Intent import android.os.Bundle -import android.util.Log import android.util.Patterns import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import net.schueller.peertube.R @@ -52,7 +53,7 @@ class AddServerFragment : Fragment() { } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { mBinding = FragmentAddServerBinding.inflate(inflater, container, false) return mBinding.root } @@ -115,7 +116,7 @@ class AddServerFragment : Fragment() { mBinding.pickServerUrl.setOnClickListener { val intentServer = Intent(activity, SearchServerActivity::class.java) - this.startActivityForResult(intentServer, PICK_SERVER) + openActivityForResult(intentServer) } } @@ -132,35 +133,24 @@ class AddServerFragment : Fragment() { } } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - - if (requestCode != PICK_SERVER) { - return - } - - if (resultCode != Activity.RESULT_OK) { - return - } - - val serverUrlTest = data?.getStringExtra("serverUrl") - //Log.d(TAG, "serverUrl " + serverUrlTest); - - mBinding.serverUrl.setText(serverUrlTest) - - mBinding.serverLabel.apply { - if (text.toString().isBlank()) { - setText(data?.getStringExtra("serverName")) + private var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + val intent = result.data + val serverUrlTest = intent?.getStringExtra("serverUrl") + mBinding.serverUrl.setText(serverUrlTest) + mBinding.serverLabel.apply { + if (text.toString().isBlank()) { + setText(intent?.getStringExtra("serverName")) + } } } + } + private fun openActivityForResult(intent: Intent) { + resultLauncher.launch(intent) } companion object { - private const val TAG = "AddServerFragment" - private const val PICK_SERVER = 1 - private const val SERVER_ARG = "server" fun newInstance(server: Server) = AddServerFragment().apply { diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoDescriptionFragment.kt b/app/src/main/java/net/schueller/peertube/fragment/VideoDescriptionFragment.kt new file mode 100644 index 0000000..7eaa58f --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/fragment/VideoDescriptionFragment.kt @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2020 Stefan Schüller + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package net.schueller.peertube.fragment + +import android.view.LayoutInflater +import android.view.ViewGroup +import android.os.Bundle +import android.util.Log +import android.view.View +import android.widget.ImageButton +import net.schueller.peertube.R +import android.widget.TextView +import androidx.fragment.app.Fragment +import net.schueller.peertube.helper.APIUrlHelper +import net.schueller.peertube.helper.ErrorHelper +import net.schueller.peertube.model.Description +import net.schueller.peertube.model.Video +import net.schueller.peertube.network.GetVideoDataService +import net.schueller.peertube.network.RetrofitInstance +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class VideoDescriptionFragment : Fragment () { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = inflater.inflate( + R.layout.fragment_video_description, container, + false + ) + + val video = video + + if (video != null) { + + val apiBaseURL = APIUrlHelper.getUrlWithVersion(context) + val videoDataService = RetrofitInstance.getRetrofitInstance( + apiBaseURL, + APIUrlHelper.useInsecureConnection(context) + ).create( + GetVideoDataService::class.java + ) + + // description, get extended if available + val videoDescription = view.findViewById(R.id.description) + val shortDescription = video.description + if (shortDescription != null && shortDescription.length > 237) { + val call = videoDataService.getVideoFullDescription(video.uuid); + call.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + val videoFullDescription: Description? = response.body(); + + videoDescription.text = videoFullDescription?.description + } + override fun onFailure(call: Call, t: Throwable) { + Log.wtf(TAG, t.fillInStackTrace()) + ErrorHelper.showToastFromCommunicationError(activity, t) + } + }) + } + videoDescription.text = shortDescription; + + val closeButton = view.findViewById(R.id.video_description_close_button) + closeButton.setOnClickListener { + videoMetaDataFragment!!.hideDescriptionFragment() + } + + // video privacy + val videoPrivacy = view.findViewById(R.id.video_privacy); + videoPrivacy.text = video!!.privacy.label; + + // video category + val videoCategory = view.findViewById(R.id.video_category); + videoCategory.text = video!!.category.label; + + // video privacy + val videoLicense = view.findViewById(R.id.video_license); + videoLicense.text = video!!.licence.label; + + // video language + val videoLanguage = view.findViewById(R.id.video_language); + videoLanguage.text = video!!.language.label; + + // video privacy + val videoTags = view.findViewById(R.id.video_tags); + videoTags.text = android.text.TextUtils.join(", ", video!!.tags); + } + + + return view + } + + companion object { + private var video: Video? = null + private var videoMetaDataFragment: VideoMetaDataFragment? = null + const val TAG = "VideoDescr" + fun newInstance(mVideo: Video?, mVideoMetaDataFragment: VideoMetaDataFragment): VideoDescriptionFragment { + video = mVideo + videoMetaDataFragment = mVideoMetaDataFragment + return VideoDescriptionFragment() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java b/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java deleted file mode 100644 index b51e304..0000000 --- a/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright (C) 2020 Stefan Schüller - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package net.schueller.peertube.fragment; - -import android.Manifest; -import android.app.Activity; -import android.content.Context; -import android.content.pm.PackageManager; -import android.content.res.ColorStateList; -import android.content.res.TypedArray; -import android.os.Bundle; -import android.util.Log; -import android.util.TypedValue; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.mikepenz.iconics.Iconics; -import com.squareup.picasso.Picasso; - -import java.util.Objects; -import net.schueller.peertube.R; -import net.schueller.peertube.helper.APIUrlHelper; -import net.schueller.peertube.helper.ErrorHelper; -import net.schueller.peertube.helper.MetaDataHelper; -import net.schueller.peertube.intents.Intents; -import net.schueller.peertube.model.Account; -import net.schueller.peertube.model.Avatar; -import net.schueller.peertube.model.Description; -import net.schueller.peertube.model.Rating; -import net.schueller.peertube.model.Video; -import net.schueller.peertube.network.GetVideoDataService; -import net.schueller.peertube.network.RetrofitInstance; -import net.schueller.peertube.network.Session; -import net.schueller.peertube.service.VideoPlayerService; - - -import androidx.annotation.NonNull; -import androidx.appcompat.widget.PopupMenu; -import androidx.core.app.ActivityCompat; -import androidx.fragment.app.Fragment; -import okhttp3.RequestBody; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -public class VideoMetaDataFragment extends Fragment { - - private static final String TAG = "VideoMetaDataFragment"; - - private static final String RATING_NONE = "none"; - private static final String RATING_LIKE = "like"; - private static final String RATING_DISLIKE = "dislike"; - - private Rating videoRating; - private ColorStateList defaultTextColor; - - private boolean leaveAppExpected = false; - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_video_meta, container, false); - } - - @Override - public void onPause() - { - leaveAppExpected = false; - super.onPause(); - } - - public boolean isLeaveAppExpected() - { - return leaveAppExpected; - } - - public void updateVideoMeta(Video video, VideoPlayerService mService) { - Context context = getContext(); - Activity activity = getActivity(); - - String apiBaseURL = APIUrlHelper.getUrlWithVersion(context); - GetVideoDataService videoDataService = RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(context)).create(GetVideoDataService.class); - - // Thumbs up - Button thumbsUpButton = activity.findViewById(R.id.video_thumbs_up); - defaultTextColor = thumbsUpButton.getTextColors(); - thumbsUpButton.setText(R.string.video_thumbs_up_icon); - new Iconics.Builder().on(thumbsUpButton).build(); - thumbsUpButton.setOnClickListener(v -> { - rateVideo(true, video); - }); - - // Thumbs Down - Button thumbsDownButton = activity.findViewById(R.id.video_thumbs_down); - thumbsDownButton.setText(R.string.video_thumbs_down_icon); - new Iconics.Builder().on(thumbsDownButton).build(); - thumbsDownButton.setOnClickListener(v -> { - rateVideo(false, video); - }); - - // video rating - videoRating = new Rating(); - videoRating.setRating(RATING_NONE); // default - updateVideoRating(video); - - // Retrieve which rating the user gave to this video - if (Session.getInstance().isLoggedIn()) { - Call call = videoDataService.getVideoRating(video.getId()); - call.enqueue(new Callback() { - - @Override - public void onResponse(Call call, Response response) { - videoRating = response.body(); - updateVideoRating(video); - } - - @Override - public void onFailure(Call call, Throwable t) { - ErrorHelper.showToastFromCommunicationError( getActivity(), t ); - // Do nothing. - } - }); - } - - // Share - Button videoShareButton = activity.findViewById(R.id.video_share); - videoShareButton.setText(R.string.video_share_icon); - new Iconics.Builder().on(videoShareButton).build(); - videoShareButton.setOnClickListener(v -> - { - leaveAppExpected = true; - Intents.Share( context, video ); - } ); - - // Download - Button videoDownloadButton = activity.findViewById(R.id.video_download); - videoDownloadButton.setText(R.string.video_download_icon); - new Iconics.Builder().on(videoDownloadButton).build(); - videoDownloadButton.setOnClickListener(v -> { - // get permission to store file - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - leaveAppExpected = true; - ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { - Intents.Download(context, video); - } else { - Toast.makeText(context, getString(R.string.video_download_permission_error), Toast.LENGTH_LONG).show(); - } - } else { - Intents.Download(context, video); - } - }); - - Account account = video.getAccount(); - - // owner / creator Avatar - Avatar avatar = account.getAvatar(); - if (avatar != null) { - ImageView avatarView = activity.findViewById(R.id.avatar); - String baseUrl = APIUrlHelper.getUrl(context); - String avatarPath = avatar.getPath(); - Picasso.get() - .load(baseUrl + avatarPath) - .into(avatarView); - } - - - // title / name - TextView videoName = activity.findViewById(R.id.sl_row_name); - videoName.setText(video.getName()); - - // created at / views - TextView videoMeta = activity.findViewById(R.id.videoMeta); - videoMeta.setText( - MetaDataHelper.getMetaString( - video.getCreatedAt(), - video.getViews(), - context - ) - ); - - // owner / creator - TextView videoOwner = activity.findViewById(R.id.videoOwner); - videoOwner.setText( - MetaDataHelper.getOwnerString(video.getAccount().getName(), - video.getAccount().getHost(), - context - ) - ); - - // description - TextView videoDescription = activity.findViewById(R.id.description); - String shortDescription = video.getDescription(); - if (shortDescription != null && Objects.requireNonNull(shortDescription).length() > 237) { - shortDescription += "\n" + getString(R.string.video_description_read_more); - videoDescription.setOnClickListener(v -> { - Call call = videoDataService.getVideoFullDescription(video.getUuid()); - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful() && response.body() != null) { - new Description(); - Description videoFullDescription; - videoFullDescription = response.body(); - videoDescription.setText(videoFullDescription.getDescription()); - } - } - @Override - public void onFailure(Call call, Throwable t) { - Toast.makeText(getContext(), getString(R.string.video_get_full_description_failed), Toast.LENGTH_SHORT).show(); - } - }); - }); - } - videoDescription.setText(shortDescription); - - // video privacy - TextView videoPrivacy = activity.findViewById(R.id.video_privacy); - videoPrivacy.setText(video.getPrivacy().getLabel()); - - // video category - TextView videoCategory = activity.findViewById(R.id.video_category); - videoCategory.setText(video.getCategory().getLabel()); - - // video privacy - TextView videoLicense = activity.findViewById(R.id.video_license); - videoLicense.setText(video.getLicence().getLabel()); - - // video language - TextView videoLanguage = activity.findViewById(R.id.video_language); - videoLanguage.setText(video.getLanguage().getLabel()); - - // video privacy - TextView videoTags = activity.findViewById(R.id.video_tags); - videoTags.setText(android.text.TextUtils.join(", ", video.getTags())); - - // more button - TextView moreButton = activity.findViewById(R.id.moreButton); - moreButton.setText(R.string.video_more_icon); - new Iconics.Builder().on(moreButton).build(); - - moreButton.setOnClickListener(v -> { - PopupMenu popup = new PopupMenu(context, v); - popup.setOnMenuItemClickListener(menuItem -> { - switch (menuItem.getItemId()) { - case R.id.video_more_report: - Log.v(TAG, "Report"); - Toast.makeText(context, "Not Implemented", Toast.LENGTH_SHORT).show(); - return true; - case R.id.video_more_blacklist: - Log.v(TAG, "Blacklist"); - Toast.makeText(context, "Not Implemented", Toast.LENGTH_SHORT).show(); - return true; - default: - return false; - } - }); - popup.inflate(R.menu.menu_video_more); - popup.show(); - }); - - // video player options - TextView videoOptions = activity.findViewById(R.id.exo_more); - videoOptions.setText(R.string.video_more_icon); - new Iconics.Builder().on(videoOptions).build(); - - videoOptions.setOnClickListener(v -> { - VideoOptionsFragment videoOptionsFragment = - VideoOptionsFragment.newInstance(mService, video.getFiles()); - videoOptionsFragment.show(getActivity().getSupportFragmentManager(), - VideoOptionsFragment.TAG); - }); - - } - - void updateVideoRating(Video video) { - Button thumbsUpButton = getActivity().findViewById(R.id.video_thumbs_up); - Button thumbsDownButton = getActivity().findViewById(R.id.video_thumbs_down); - - TypedValue typedValue = new TypedValue(); - - TypedArray a = getContext().obtainStyledAttributes(typedValue.data, new int[]{R.attr.colorPrimary}); - int accentColor = a.getColor(0, 0); - - // Change the color of the thumbs - switch (videoRating.getRating()) { - case RATING_NONE: - thumbsUpButton.setTextColor(defaultTextColor); - thumbsDownButton.setTextColor(defaultTextColor); - break; - case RATING_LIKE: - thumbsUpButton.setTextColor(accentColor); - thumbsDownButton.setTextColor(defaultTextColor); - break; - case RATING_DISLIKE: - thumbsUpButton.setTextColor(defaultTextColor); - thumbsDownButton.setTextColor(accentColor); - break; - } - - // Update the texts - TextView thumbsDownTotal = getActivity().findViewById(R.id.video_thumbs_down_total); - TextView thumbsUpTotal = getActivity().findViewById(R.id.video_thumbs_up_total); - thumbsUpTotal.setText(String.valueOf(video.getLikes())); - thumbsDownTotal.setText(String.valueOf(video.getDislikes())); - - a.recycle(); - } - - void rateVideo(Boolean like, Video video) { - if (Session.getInstance().isLoggedIn()) { - final String ratePayload; - - switch (videoRating.getRating()) { - case RATING_LIKE: - ratePayload = like ? RATING_NONE : RATING_DISLIKE; - break; - case RATING_DISLIKE: - ratePayload = like ? RATING_LIKE : RATING_NONE; - break; - case RATING_NONE: - default: - ratePayload = like ? RATING_LIKE : RATING_DISLIKE; - break; - } - - RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json"), "{\"rating\":\"" + ratePayload + "\"}"); - - String apiBaseURL = APIUrlHelper.getUrlWithVersion(getContext()); - GetVideoDataService videoDataService = RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(getContext())).create(GetVideoDataService.class); - - Call call = videoDataService.rateVideo(video.getId(), body); - - call.enqueue(new Callback() { - - @Override - public void onResponse(Call call, Response response) { - //Log.v(TAG, response.toString()); - - // if 20x, update likes/dislikes - if (response.isSuccessful()) { - String previousRating = videoRating.getRating(); - - // Update the likes/dislikes count of the video, if needed. - // This is only a visual trick, as the actual like/dislike count has - // already been modified on the PeerTube instance. - if (!previousRating.equals(ratePayload)) { - switch (previousRating) { - case RATING_NONE: - if (ratePayload.equals(RATING_LIKE)) { - video.setLikes(video.getLikes() + 1); - } else { - video.setDislikes(video.getDislikes() + 1); - } - break; - case RATING_LIKE: - video.setLikes(video.getLikes() - 1); - if (ratePayload.equals(RATING_DISLIKE)) { - video.setDislikes(video.getDislikes() + 1); - } - break; - case RATING_DISLIKE: - video.setDislikes(video.getDislikes() - 1); - if (ratePayload.equals(RATING_LIKE)) { - video.setLikes(video.getLikes() + 1); - } - break; - } - } - - videoRating.setRating(ratePayload); - updateVideoRating(video); - } - } - - @Override - public void onFailure(Call call, Throwable t) { - Toast.makeText(getContext(), getString(R.string.video_rating_failed), Toast.LENGTH_SHORT).show(); - } - }); - } else { - Toast.makeText(getContext(), getString(R.string.video_login_required_for_service), Toast.LENGTH_SHORT).show(); - } - } - -} diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.kt b/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.kt new file mode 100644 index 0000000..cac3793 --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.kt @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2020 Stefan Schüller + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package net.schueller.peertube.fragment + +import android.Manifest +import net.schueller.peertube.helper.MetaDataHelper.getMetaString +import net.schueller.peertube.helper.MetaDataHelper.getOwnerString +import android.content.res.ColorStateList +import android.view.LayoutInflater +import android.view.ViewGroup +import android.os.Bundle +import net.schueller.peertube.R +import net.schueller.peertube.service.VideoPlayerService +import android.app.Activity +import android.content.Context +import net.schueller.peertube.helper.APIUrlHelper +import net.schueller.peertube.network.GetVideoDataService +import net.schueller.peertube.network.RetrofitInstance +import net.schueller.peertube.helper.ErrorHelper +import androidx.core.app.ActivityCompat +import android.content.pm.PackageManager +import android.util.Log +import android.widget.Toast +import com.squareup.picasso.Picasso +import android.widget.TextView +import android.util.TypedValue +import android.view.View +import android.widget.Button +import android.widget.ImageView +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mikepenz.iconics.Iconics +import net.schueller.peertube.adapter.MultiViewRecycleViewAdapter +import net.schueller.peertube.intents.Intents +import net.schueller.peertube.model.CommentThread +import net.schueller.peertube.model.Rating +import net.schueller.peertube.model.Video +import net.schueller.peertube.model.VideoList +import net.schueller.peertube.model.ui.VideoMetaViewItem +import net.schueller.peertube.network.GetUserService +import net.schueller.peertube.network.Session +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import java.lang.Exception + +class VideoMetaDataFragment : Fragment() { + private var videoRating: Rating? = null + private var defaultTextColor: ColorStateList? = null + private var recyclerView: RecyclerView? = null + private var mMultiViewAdapter: MultiViewRecycleViewAdapter? = null + + private lateinit var videoDescriptionFragment: VideoDescriptionFragment + + var isLeaveAppExpected = false + private set + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_video_meta, container, false) + } + + override fun onPause() { + isLeaveAppExpected = false + super.onPause() + } + + fun showDescriptionFragment(video: Video) { + // show full description fragment + videoDescriptionFragment = VideoDescriptionFragment.newInstance(video, this) + childFragmentManager.beginTransaction() + .add(R.id.video_meta_data_fragment, videoDescriptionFragment, VideoDescriptionFragment.TAG).commit() + } + + fun hideDescriptionFragment() { + val fragment: Fragment? = childFragmentManager.findFragmentByTag(VideoDescriptionFragment.TAG) + if (fragment != null) { + childFragmentManager.beginTransaction().remove(fragment).commit() + } + } + + fun updateVideoMeta(video: Video, mService: VideoPlayerService?) { + + // Remove description if it is open as we are loading a new video + hideDescriptionFragment() + + val context = context + val activity: Activity? = activity + val apiBaseURL = APIUrlHelper.getUrlWithVersion(context) + val videoDataService = RetrofitInstance.getRetrofitInstance( + apiBaseURL, + APIUrlHelper.useInsecureConnection(context) + ).create( + GetVideoDataService::class.java + ) + + // related videos + recyclerView = activity!!.findViewById(R.id.relatedVideosView) + val layoutManager: RecyclerView.LayoutManager = LinearLayoutManager(this@VideoMetaDataFragment.context) + recyclerView?.layoutManager = layoutManager + mMultiViewAdapter = MultiViewRecycleViewAdapter(this) + recyclerView?.adapter = mMultiViewAdapter + + val videoMetaViewItem = VideoMetaViewItem() + videoMetaViewItem.video = video + mMultiViewAdapter?.setVideoMeta(videoMetaViewItem) + + loadVideos() + +// loadComments(video.id) + +// mMultiViewAdapter?.setVideoComment() + + // videoOwnerSubscribeButton + + + // description + + + // video player options + val videoOptions = activity.findViewById(R.id.exo_more) + videoOptions.setText(R.string.video_more_icon) + Iconics.Builder().on(videoOptions).build() + videoOptions.setOnClickListener { + val videoOptionsFragment = VideoOptionsFragment.newInstance(mService, video.files) + videoOptionsFragment.show( + getActivity()!!.supportFragmentManager, + VideoOptionsFragment.TAG + ) + } + } + + private fun loadComments(videoId: Int) { + val context = context + + val start = 0 + val count = 1 + val sort = "-createdAt" + + + // We set this to default to null so that on initial start there are videos listed. + val apiBaseURL = APIUrlHelper.getUrlWithVersion(context) + val service = + RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(context)).create( + GetVideoDataService::class.java + ) + val call: Call = service.getCommentThreads(videoId, start, count, sort) + + call.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.body() != null) { + val commentThread = response.body() + if (commentThread != null) { + mMultiViewAdapter!!.setVideoComment(commentThread); + } + } + } + + override fun onFailure(call: Call, t: Throwable) { + Log.wtf("err", t.fillInStackTrace()) + ErrorHelper.showToastFromCommunicationError(this@VideoMetaDataFragment.context, t) + } + }) + } + + private fun loadVideos() { + val context = context + + val start = 0 + val count = 6 + val sort = "-createdAt" + val filter: String? = null + + val sharedPref = context?.getSharedPreferences( + context.packageName + "_preferences", + Context.MODE_PRIVATE + ) + + var nsfw = "false" + var languages: Set? = emptySet() + if (sharedPref != null) { + nsfw = if (sharedPref.getBoolean(getString(R.string.pref_show_nsfw_key), false)) "both" else "false" + languages = sharedPref.getStringSet(getString(R.string.pref_video_language_key), null) + } + + // We set this to default to null so that on initial start there are videos listed. + val apiBaseURL = APIUrlHelper.getUrlWithVersion(context) + val service = + RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(context)).create( + GetVideoDataService::class.java + ) + val call: Call = service.getVideosData(start, count, sort, nsfw, filter, languages) + + /*Log the URL called*/Log.d("URL Called", call.request().url.toString() + "") + // Toast.makeText(VideoListActivity.this, "URL Called: " + call.request().url(), Toast.LENGTH_SHORT).show(); + call.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.body() != null) { + val videoList = response.body() + if (videoList != null) { + mMultiViewAdapter!!.setVideoListData(videoList) + } + } + } + + override fun onFailure(call: Call, t: Throwable) { + Log.wtf("err", t.fillInStackTrace()) + ErrorHelper.showToastFromCommunicationError(this@VideoMetaDataFragment.context, t) + } + }) + } + companion object { + const val TAG = "VMDF" + } +} \ No newline at end of file diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoPlayerFragment.java b/app/src/main/java/net/schueller/peertube/fragment/VideoPlayerFragment.java deleted file mode 100644 index 12faf1b..0000000 --- a/app/src/main/java/net/schueller/peertube/fragment/VideoPlayerFragment.java +++ /dev/null @@ -1,516 +0,0 @@ -/* - * Copyright (C) 2020 Stefan Schüller - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package net.schueller.peertube.fragment; - -import android.app.Activity; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.content.SharedPreferences; -import android.content.pm.ActivityInfo; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.Environment; -import android.os.IBinder; -import android.preference.PreferenceManager; -import android.util.Log; -import android.view.GestureDetector; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.Surface; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.widget.Toast; - -import com.github.se_bastiaan.torrentstream.StreamStatus; -import com.github.se_bastiaan.torrentstream.Torrent; -import com.github.se_bastiaan.torrentstream.TorrentOptions; -import com.github.se_bastiaan.torrentstream.TorrentStream; -import com.github.se_bastiaan.torrentstream.listeners.TorrentListener; -import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.decoder.DecoderCounters; -import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; -import com.google.android.exoplayer2.ui.PlayerView; -import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.VideoRendererEventListener; -import com.mikepenz.iconics.Iconics; - -import net.schueller.peertube.R; - -import net.schueller.peertube.helper.APIUrlHelper; -import net.schueller.peertube.helper.ErrorHelper; -import net.schueller.peertube.model.File; -import net.schueller.peertube.model.Video; -import net.schueller.peertube.network.GetVideoDataService; -import net.schueller.peertube.network.RetrofitInstance; -import net.schueller.peertube.service.VideoPlayerService; - -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; -import androidx.fragment.app.Fragment; - -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -import static net.schueller.peertube.helper.VideoHelper.canEnterPipMode; - -public class VideoPlayerFragment extends Fragment implements VideoRendererEventListener { - - private String mVideoUuid; - private ProgressBar progressBar; - private PlayerView simpleExoPlayerView; - private Intent videoPlayerIntent; - private Boolean mBound = false; - private Boolean isFullscreen = false; - private VideoPlayerService mService; - private TorrentStream torrentStream; - private LinearLayout torrentStatus; - private float aspectRatio; - - private static final String TAG = "VideoPlayerFragment"; - private GestureDetector mDetector; - - private ServiceConnection mConnection = new ServiceConnection() { - - @Override - public void onServiceConnected(ComponentName className, IBinder service) { - Log.d(TAG, "onServiceConnected"); - VideoPlayerService.LocalBinder binder = (VideoPlayerService.LocalBinder) service; - mService = binder.getService(); - - // 2. Create the player - simpleExoPlayerView.setPlayer(mService.player); - mBound = true; - - loadVideo(); - } - - @Override - public void onServiceDisconnected(ComponentName componentName) { - Log.d(TAG, "onServiceDisconnected"); - simpleExoPlayerView.setPlayer(null); - mBound = false; - } - }; - private AspectRatioFrameLayout.AspectRatioListener aspectRatioListerner = new AspectRatioFrameLayout.AspectRatioListener() - { - @Override - public void onAspectRatioUpdated( float targetAspectRatio, float naturalAspectRatio, boolean aspectRatioMismatch ) - { - aspectRatio = targetAspectRatio; - } - }; - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_video_player, container, false); - } - - - public void start(String videoUuid) { - - // start service - Context context = getContext(); - Activity activity = getActivity(); - - mVideoUuid = videoUuid; - - assert activity != null; - progressBar = activity.findViewById(R.id.torrent_progress); - progressBar.setMax(100); - - assert context != null; - simpleExoPlayerView = new PlayerView(context); - simpleExoPlayerView = activity.findViewById(R.id.video_view); - - simpleExoPlayerView.setControllerShowTimeoutMs(1000); - simpleExoPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT); - - mDetector = new GestureDetector(context, new MyGestureListener()); - simpleExoPlayerView.setOnTouchListener(touchListener); - - simpleExoPlayerView.setAspectRatioListener( aspectRatioListerner ); - - torrentStatus = activity.findViewById(R.id.exo_torrent_status); - - // Full screen Icon - TextView fullscreenText = activity.findViewById(R.id.exo_fullscreen); - FrameLayout fullscreenButton = activity.findViewById(R.id.exo_fullscreen_button); - - fullscreenText.setText(R.string.video_expand_icon); - new Iconics.Builder().on(fullscreenText).build(); - - fullscreenButton.setOnClickListener(view -> { - Log.d(TAG, "Fullscreen"); - fullScreenToggle(); - }); - - if (!mBound) { - videoPlayerIntent = new Intent(context, VideoPlayerService.class); - activity.bindService(videoPlayerIntent, mConnection, Context.BIND_AUTO_CREATE); - } - - - } - - private void loadVideo() { - Context context = getContext(); - - - // get video details from api - String apiBaseURL = APIUrlHelper.getUrlWithVersion(context); - GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(context)).create(GetVideoDataService.class); - - Call