diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index dbc1c05a5b5..f9201f94851 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -7,20 +7,20 @@ assignees: ''
---
-P.S.: Our contribution guidelines might be a nice document to read before you fill out the report :) You can find it at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md
+
-To make it easier for us to help you please enter detailed information in the template we have provided below. If a section isn't relevant, just delete it, though it would be helpful to still provide as much detail as possible.
--->
+
-
+### Checklist
+
-### Version
-
--
+- [x] I am using the latest version - x.xx.x
+- [ ] I checked, but didn't find any duplicates (open OR closed) of this issue in the repo.
+- [ ] I have read the contribution guidelines given at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md.
+- [ ] This issue contains only one bug. I will open one issue for every bug report I want to file.
### Steps to reproduce the bug
+
+
+### Actual behaviour
+
+
+
+
### Expected behavior
-### Actual behaviour
-
+
### Screenshots/Screen recordings
+
+
+
+
### Logs
-
+
+
+
+
+
+
+### Device info
+
+ - Android version/Custom ROM version:
+ - Device model:
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 00000000000..3ba13e0cec6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1 @@
+blank_issues_enabled: false
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index 90134a204c2..c4d378d14c1 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -5,35 +5,42 @@ labels: enhancement
assignees: ''
---
-
+
+
+
+
+
+### Checklist
+
+
+- [x] I checked, but didn't find any duplicates (open OR closed) of this issue in the repo.
+- [ ] I have read the contribution guidelines given at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md.
+- [ ] This issue contains only one feature request. I will open one issue for every feature I want to request.
-
#### Describe the feature you want
-
-
+
#### Is your feature request related to a problem? Please describe it
-
-
+
#### Additional context
-
+
#### How will you/everyone benefit from this feature?
-
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index f12eb2fe81b..c3022d93f49 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,28 +1,28 @@
-
+
#### What is it?
-- [ ] Bug fix (user facing)
+- [ ] Bugfix (user facing)
- [ ] Feature (user facing)
-- [ ] Code base improvement (dev facing)
+- [ ] Codebase improvement (dev facing)
- [ ] Meta improvement to the project (dev facing)
#### Description of the changes in your PR
-
+
- record videos
- create clones
- take over the world
#### Fixes the following issue(s)
-
+
-
#### Relies on the following changes
-
-#### Testing apk
-
+#### APK testing
+
debug.zip
-#### Agreement
-- [ ] I carefully read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them.
+#### Due diligence
+- [ ] I read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md).
diff --git a/README.ko.md b/README.ko.md
new file mode 100644
index 00000000000..bb6bd653b0a
--- /dev/null
+++ b/README.ko.md
@@ -0,0 +1,144 @@
+
+NewPipe
+A libre lightweight streaming frontend for Android.
+
+
+
+
+
+
+
+
+
+
+
+Screenshots • Description • Features • Updates • Contribution • Donate • License
+Website • Blog • FAQ • Press
+
+
+*Read this in other languages: [English](README.md), [한국어](README.ko.md).*
+
+경고: 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GITHUB 저장소에서 ISSUE를 열람하여 주십시오.
+
+NEWPIPE 또는 이것의 FORK을 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다.
+
+## Screenshots
+
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png)
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png)
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png)
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png)
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png)
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png)
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png)
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png)
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png)
+[ ](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png)
+[ ](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png)
+[ ](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png)
+
+## Description
+
+NewPipe는 어떤 구글 프레임워크 라이브러리나, 유튜브 API를 사용하지 않습니다. 웹사이트는 단지 필요한 정보를 가져오기 위해 구문 분석 됩니다. 따라서 이 앱은 구글 서비스의 설치 없이 기기에서 사용될 수 있습니다. 또한, 카피레프트 자유 소프트웨어인 NewPipe를 사용하기 위해 유튜브 계정이 필요하지 않습니다.
+
+### Features
+
+* 영상 검색
+* 영상의 일반적인 정보 표시
+* 유튜브 영상 보기
+* 유튜브 영상 듣기
+* 팝업 모드 (floating player)
+* 영상 공유
+* 영상 다운로드
+* 음성만 다운로드
+* Kodi에서 영상 열람
+* 다음/관련된 영상 표시
+* 특정 언어로 유튜브 검색
+* 연령 제한 컨텐츠 시청/차단
+* 채널에 대한 일반적인 정보 표시
+* 채널 검색
+* 채널에서 영상 시청
+* Orbot/Tor 지원 (아직 직접적이지 않음)
+* 1080p/2K/4K 지원
+* 기록 보기
+* 채널 구독
+* 기록 검색
+* 재생목록 검색/시청
+* 추가된 재생목록 시청
+* 영상 추가
+* 지역 재생목록
+* 자막
+* 실시간 방송 지원
+* 댓글 표시
+
+### Supported Services
+
+NewPipe는 여러가지 서비스를 지원합니다. 우리의 [문서](https://teamnewpipe.github.io/documentation/)는 새로운 서비스가 앱과 추출기에 어떻게 추가될 수 있는지에 대한 더 많은 정보를 제공합니다. 만약 새로운 서비스를 추가하고자 한다면, 우리에게 연락해 주시기 바랍니다. 현재 지원되는 서비스:
+
+* YouTube
+* SoundCloud \[beta\]
+* media.ccc.de \[beta\]
+* PeerTube instances \[beta\]
+
+## Updates
+NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 인해), 결국 릴리즈가 발생할 것입니다. 이것들의 형식은 x.xx.x 입니다.
+이 새로운 버전을 얻기 위해서, 당신은:
+ 1. 직접 디버그 APK를 생성할 수 있습니다. 이 방법은 당신의 기기에서 새로운 기능을 얻을 수 있는 가장 빠른 방법이지만, 꽤 많이 복잡합니다.
+ 따라서 우리는 다른 방법들 중 하나를 사용하는 것을 추천합니다.
+ 2. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 저곳에서 릴리즈를 설치할 수 있습니다.
+ 이에 대한 설명서는 이곳에서 확인할 수 있습니다: https://newpipe.schabi.org/FAQ/tutorials/install-add-fdroid-repo/
+ 3. 우리가 릴리즈를 게시하는 대로 [Github Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 다운받고 이것을 설치할 수 있습니다.
+ 4. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에,
+ 이것은 업데이트를 받는 가장 느린 방법입니다.
+
+우리는 대부분의 사용자에게 2번쨰 방법을 추천합니다. 방법 2 또는 3을 사용하여 설치된 APK는 서로 호환되지만, 방법 4를 사용하여 설치된 것들과는 호환되지 않습니다. 이것은 방법 2 또는 3에서는 같은 (우리의)서명 키가 사용되지만, 방법 4에서는 다른 (F-Droid의)서명 키가 사용되기 때문입니다. 방법 1을 사용하여 디버그 APK를 생성하는 것에서는 키가 완전히 제외됩니다. 서명 키는 사용자가 앱에 악의적인 업데이트를 설치하는 것에 대해 속지 않도록 보장하는 것을 도와줍니다.
+
+한편, 만약 어떠한 이유(예. NewPipe의 핵심 기능이 손상되었고 F-Droid가 아직 업데이트를 가지지 않는 경우) 때문에 소스를 바꾸길 원한다면,
+우리는 다음과 같은 절차를 따르는 것을 권장합니다:
+1. 당신의 기록, 구독, 그리고 재생목록을 유지할 수 있도록 Settings > Content > Export Database 를 통해 데이터를 백업하십시오.
+2. NewPipe를 삭제하십시오.
+3. 새로운 소스에서 APK를 다운로드하고 이것을 설치하십시오.
+4. Step 1의 Settings > Content > Export Database 을 통해 데이터를 불러오십시오.
+
+## Contribution
+당신이 아이디어, 번역, 디자인 변경, 코드 정리, 또는 정말 큰 코드 수정에 대한 의견이 있다면, 도움은 항상 환영합니다.
+더 많이 수행될수록 더 많이 발전할 수 있습니다!
+
+만약 참여하고 싶다면, 우리의 [컨트리뷰션 공지](.github/CONTRIBUTING.md)를 참고하십시오.
+
+
+
+
+
+## Donate
+만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.schabi.org/donate)를 방문하여 주십시오.
+
+
+
+
+
+ 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Privacy Policy
+
+NewPipe 프로젝트는 미디어 웹 서비스를 사용하는 것에 대한 사적의, 익명의 경험을 제공하는 것을 목표로 하고 있습니다.
+그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.schabi.org/legal/privacy/)에서 확인할 수 있습니다.
+
+## License
+[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](http://www.gnu.org/licenses/gpl-3.0.en.html)
+
+NewPipe는 자유 소프트웨어입니다: 당신의 마음대로 이것을 사용하고, 연구하고, 공유하고, 개선할 수 있습니다.
+구체적으로 당신은 자유 소프트웨어 재단에서 발행되는, 버전 3 또는 (당신의 선택에 따라)이후 버전의,
+[GNU General Public License](https://www.gnu.org/licenses/gpl.html) 하에서 이것을 재배포 및/또는 수정할 수 있습니다.
diff --git a/README.md b/README.md
index 50eb40594ae..f11262da17b 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,8 @@
Website • Blog • FAQ • Press
+*Read this in other languages: [English](README.md), [한국어](README.ko.md).*
+
WARNING: THIS IS A BETA VERSION, THEREFORE YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE VIA OUR GITHUB REPOSITORY.
PUTTING NEWPIPE OR ANY FORK OF IT INTO GOOGLE PLAYSTORE VIOLATES THEIR TERMS OF CONDITIONS.
@@ -69,11 +71,6 @@ NewPipe does not use any Google framework libraries, nor the YouTube API. Websit
* Livestream support
* Show comments
-### Coming Features
-
-* Cast to UPnP and Cast
-* … and many more
-
### Supported Services
NewPipe supports multiple services. Our [docs](https://teamnewpipe.github.io/documentation/) provide more info on how a new service can be added to the app and the extractor. Please get in touch with us if you intend to add a new one. Currently supported services are:
@@ -85,17 +82,18 @@ NewPipe supports multiple services. Our [docs](https://teamnewpipe.github.io/doc
## Updates
When a change to the NewPipe code occurs (due to either adding features or bug fixing), eventually a release will occur. These are in the format x.xx.x . In order to get this new version, you can:
- * Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods.
- * Download the APK from [releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it.
- * Update via F-droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users.
+ 1. Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods.
+ 2. Add our custom repo to F-Droid and install it from there as soon as we publish a release. The instructions are here: https://newpipe.schabi.org/FAQ/tutorials/install-add-fdroid-repo/
+ 3. Download the APK from [Github Releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it as soon as we publish a release.
+ 4. Update via F-droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users.
-When you install an APK from one of these options, it will be incompatible with an APK from one of the other options. This is due to different signing keys being used. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app, and are independent. F-Droid and GitHub use different signing keys, and building an APK debug excludes a key. The signing key issue is being discussed in issue [#1981](https://github.com/TeamNewPipe/NewPipe/issues/1981), and may be fixed by setting up our own repository on F-Droid.
+We recommend method 2 for most users. APKs installed using method 2 or 3 are compatible with each other, but not with those installed using method 4. This is due to the same signing key (ours) being using for 2 and 3, but a different signing key (F-Droid's) being used for 4. Building a debug APK using method 1 excludes a key entirely. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app.
In the meanwhile, if you want to switch sources for some reason (e.g. NewPipe's core functionality was broken and F-Droid doesn't have the update yet), we recommend following this procedure:
-1. Back up your data via "Settings>Content>Export Database" so you keep your history, subscriptions, and playlists
+1. Back up your data via Settings > Content > Export Database so you keep your history, subscriptions, and playlists
2. Uninstall NewPipe
3. Download the APK from the new source and install it
-4. Import the data from step 1 via "Settings>Content>Import Database"
+4. Import the data from step 1 via Settings > Content > Import Database
## Contribution
Whether you have ideas, translations, design changes, code cleaning, or real heavy code changes, help is always welcome.
@@ -103,6 +101,10 @@ The more is done the better it gets!
If you'd like to get involved, check our [contribution notes](.github/CONTRIBUTING.md).
+
+
+
+
## Donate
If you like NewPipe we'd be happy about a donation. You can either send bitcoin or donate via Bountysource or Liberapay. For further info on donating to NewPipe, please visit our [website](https://newpipe.schabi.org/donate).
diff --git a/app/build.gradle b/app/build.gradle
index 13f3c1bb608..2050cd8efe5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -13,8 +13,10 @@ android {
resValue "string", "app_name", "NewPipe"
minSdkVersion 19
targetSdkVersion 29
- versionCode 956
- versionName "0.20.2"
+ versionCode 957
+ versionName "0.20.3"
+
+ multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
@@ -28,7 +30,6 @@ android {
buildTypes {
debug {
- multiDexEnabled true
debuggable true
// suffix the app id and the app name with git branch name
@@ -64,11 +65,18 @@ android {
}
compileOptions {
+ // Flag to enable support for the new language APIs
+ coreLibraryDesugaringEnabled true
+
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
encoding 'utf-8'
}
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_1_8
+ }
+
// Required and used only by groupie
androidExtensions {
experimental = true
@@ -81,7 +89,7 @@ android {
ext {
icepickVersion = '3.2.0'
- checkstyleVersion = '8.32'
+ checkstyleVersion = '8.36.2'
stethoVersion = '1.5.1'
leakCanaryVersion = '2.2'
exoPlayerVersion = '2.11.8'
@@ -94,7 +102,7 @@ ext {
configurations {
checkstyle
- ktlint
+// ktlint
}
checkstyle {
@@ -122,30 +130,32 @@ task runCheckstyle(type: Checkstyle) {
}
}
-task runKtlint(type: JavaExec) {
- main = "com.pinterest.ktlint.Main"
- classpath = configurations.ktlint
- args "src/**/*.kt"
-}
-
-task formatKtlint(type: JavaExec) {
- main = "com.pinterest.ktlint.Main"
- classpath = configurations.ktlint
- args "-F", "src/**/*.kt"
-}
+//task runKtlint(type: JavaExec) {
+// main = "com.pinterest.ktlint.Main"
+// classpath = configurations.ktlint
+// args "src/**/*.kt"
+//}
+//
+//task formatKtlint(type: JavaExec) {
+// main = "com.pinterest.ktlint.Main"
+// classpath = configurations.ktlint
+// args "-F", "src/**/*.kt"
+//}
afterEvaluate {
- preDebugBuild.dependsOn runCheckstyle, runKtlint
+ preDebugBuild.dependsOn runCheckstyle //, runKtlint
}
dependencies {
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "frankiesardo:icepick:${icepickVersion}"
kapt "frankiesardo:icepick-processor:${icepickVersion}"
checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}"
- ktlint "com.pinterest:ktlint:0.35.0"
+// ktlint "com.pinterest:ktlint:0.35.0"
debugImplementation "com.facebook.stetho:stetho:${stethoVersion}"
debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}"
@@ -153,9 +163,9 @@ dependencies {
debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryVersion}"
implementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leakCanaryVersion}"
- debugImplementation "androidx.multidex:multidex:2.0.1"
+ implementation "androidx.multidex:multidex:2.0.1"
- testImplementation 'junit:junit:4.13'
+ testImplementation 'junit:junit:4.13.1'
testImplementation 'org.mockito:mockito-core:3.3.3'
androidTestImplementation "androidx.test.ext:junit:1.1.1"
@@ -164,9 +174,11 @@ dependencies {
exclude module: 'support-annotations'
}
- implementation 'com.github.TeamNewPipe:NewPipeExtractor:19c0e8700db3af35e5dfc58e4eea50e75d7c4c61'
-
+ // NewPipe dependencies
+ // You can use a local version by uncommenting a few lines in settings.gradle
+ implementation 'com.github.TeamNewPipe:NewPipeExtractor:6701b0fe718f6bdc385221341fa473e8aaab560e'
implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751"
+
implementation "org.jsoup:jsoup:1.13.1"
implementation "com.squareup.okhttp3:okhttp:3.12.12"
@@ -184,6 +196,7 @@ dependencies {
implementation "androidx.recyclerview:recyclerview:1.1.0"
implementation "androidx.cardview:cardview:1.0.0"
implementation "androidx.constraintlayout:constraintlayout:1.1.3"
+ implementation 'androidx.core:core-ktx:1.3.1'
implementation "androidx.lifecycle:lifecycle-livedata:${androidxLifecycleVersion}"
implementation "androidx.lifecycle:lifecycle-viewmodel:${androidxLifecycleVersion}"
diff --git a/app/src/debug/java/org/schabi/newpipe/DebugApp.kt b/app/src/debug/java/org/schabi/newpipe/DebugApp.kt
index 9ea3bdabec8..3ace75f0bcd 100644
--- a/app/src/debug/java/org/schabi/newpipe/DebugApp.kt
+++ b/app/src/debug/java/org/schabi/newpipe/DebugApp.kt
@@ -1,6 +1,5 @@
package org.schabi.newpipe
-import androidx.multidex.MultiDex
import androidx.preference.PreferenceManager
import com.facebook.stetho.Stetho
import com.facebook.stetho.okhttp3.StethoInterceptor
@@ -28,12 +27,6 @@ class DebugApp : App() {
return downloader
}
- override fun initACRA() {
- // install MultiDex before initializing ACRA
- MultiDex.install(this)
- super.initACRA()
- }
-
private fun initStetho() {
// Create an InitializerBuilder
val initializerBuilder = Stetho.newInitializerBuilder(this)
diff --git a/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java b/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java
new file mode 100644
index 00000000000..3d63414a823
--- /dev/null
+++ b/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java
@@ -0,0 +1,27 @@
+package org.schabi.newpipe.settings;
+
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+
+import org.schabi.newpipe.R;
+
+import leakcanary.LeakCanary;
+
+public class DebugSettingsFragment extends BasePreferenceFragment {
+ @Override
+ public void onCreate(@Nullable final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ findPreference(getString(R.string.show_memory_leaks_key))
+ .setOnPreferenceClickListener(preference -> {
+ startActivity(LeakCanary.INSTANCE.newLeakDisplayActivityIntent());
+ return true;
+ });
+ }
+
+ @Override
+ public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
+ addPreferencesFromResource(R.xml.debug_settings);
+ }
+}
diff --git a/app/src/main/res/xml/main_settings.xml b/app/src/debug/res/xml/main_settings.xml
similarity index 73%
rename from app/src/main/res/xml/main_settings.xml
rename to app/src/debug/res/xml/main_settings.xml
index af093a7575c..dfb8ffa34d0 100644
--- a/app/src/main/res/xml/main_settings.xml
+++ b/app/src/debug/res/xml/main_settings.xml
@@ -1,57 +1,56 @@
-
+ android:title="@string/settings_category_video_audio_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/settings_category_downloads_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/settings_category_appearance_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/settings_category_history_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/content"
+ app:iconSpaceReserved="false" />
+ android:title="@string/settings_category_notification_title"
+ app:iconSpaceReserved="false" />
+ app:iconSpaceReserved="false" />
+ app:iconSpaceReserved="false" />
diff --git a/app/src/main/assets/gpl_2.html b/app/src/main/assets/gpl_2.html
deleted file mode 100644
index 0e1b8827e5b..00000000000
--- a/app/src/main/assets/gpl_2.html
+++ /dev/null
@@ -1,400 +0,0 @@
-
-
-
-
-
- GNU General Public License v2.0 - GNU Project - Free Software Foundation (FSF)
-
-
-
-
-
-Version 2, June 1991
-
-
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-
-
-
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
-
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
-
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
-
-
-
-
-
-
-0.
- This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-
-
-1.
- You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-
-
-2.
- You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-
-
-
-
- a)
- You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
-
-
- b)
- You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
-
-
- c)
- If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-
-
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-
-
-3.
- You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-
-
-
-
-
-
-
- a)
- Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
-
-
- b)
- Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
-
-
- c)
- Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-
-
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major softwareComponents (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-
-
-4.
- You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-
-
-5.
- You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-
-
-6.
- Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-
-
-7.
- If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-
-
-8.
- If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-
-
-9.
- The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-
-
-10.
- If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-
-NO WARRANTY
-
-
-11.
- BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-
-
-12.
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-
diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java
index 962679cd0b8..5fdc1058aad 100644
--- a/app/src/main/java/org/schabi/newpipe/App.java
+++ b/app/src/main/java/org/schabi/newpipe/App.java
@@ -1,7 +1,5 @@
package org.schabi.newpipe;
-import android.annotation.TargetApi;
-import android.app.Application;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
@@ -10,6 +8,7 @@
import android.util.Log;
import androidx.annotation.NonNull;
+import androidx.multidex.MultiDexApplication;
import androidx.preference.PreferenceManager;
import com.nostra13.universalimageloader.cache.memory.impl.LRULimitedMemoryCache;
@@ -33,9 +32,11 @@
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.SocketException;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import io.reactivex.disposables.Disposable;
import io.reactivex.exceptions.CompositeException;
import io.reactivex.exceptions.MissingBackpressureException;
import io.reactivex.exceptions.OnErrorNotImplementedException;
@@ -61,10 +62,13 @@
* along with NewPipe. If not, see .
*/
-public class App extends Application {
+public class App extends MultiDexApplication {
protected static final String TAG = App.class.toString();
private static App app;
+ private Disposable disposable = null;
+
+ @NonNull
public static App getApp() {
return app;
}
@@ -90,7 +94,7 @@ public void onCreate() {
Localization.init(getApplicationContext());
StateSaver.init(this);
- initNotificationChannel();
+ initNotificationChannels();
ServiceHelper.initServices(this);
@@ -100,7 +104,15 @@ public void onCreate() {
configureRxJavaErrorHandler();
// Check for new version
- new CheckForNewAppVersionTask().execute();
+ disposable = CheckForNewAppVersion.checkNewVersion(this);
+ }
+
+ @Override
+ public void onTerminate() {
+ if (disposable != null) {
+ disposable.dispose();
+ }
+ super.onTerminate();
}
protected Downloader getDownloader() {
@@ -219,49 +231,31 @@ protected void initACRA() {
}
}
- public void initNotificationChannel() {
+ private void initNotificationChannels() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return;
}
- final String id = getString(R.string.notification_channel_id);
- final CharSequence name = getString(R.string.notification_channel_name);
- final String description = getString(R.string.notification_channel_description);
+ String id = getString(R.string.notification_channel_id);
+ String name = getString(R.string.notification_channel_name);
+ String description = getString(R.string.notification_channel_description);
// Keep this below DEFAULT to avoid making noise on every notification update
final int importance = NotificationManager.IMPORTANCE_LOW;
- final NotificationChannel mChannel = new NotificationChannel(id, name, importance);
- mChannel.setDescription(description);
+ final NotificationChannel mainChannel = new NotificationChannel(id, name, importance);
+ mainChannel.setDescription(description);
- final NotificationManager mNotificationManager =
- (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- mNotificationManager.createNotificationChannel(mChannel);
+ id = getString(R.string.app_update_notification_channel_id);
+ name = getString(R.string.app_update_notification_channel_name);
+ description = getString(R.string.app_update_notification_channel_description);
- setUpUpdateNotificationChannel(importance);
- }
+ final NotificationChannel appUpdateChannel = new NotificationChannel(id, name, importance);
+ appUpdateChannel.setDescription(description);
- /**
- * Set up notification channel for app update.
- *
- * @param importance
- */
- @TargetApi(Build.VERSION_CODES.O)
- private void setUpUpdateNotificationChannel(final int importance) {
- final String appUpdateId
- = getString(R.string.app_update_notification_channel_id);
- final CharSequence appUpdateName
- = getString(R.string.app_update_notification_channel_name);
- final String appUpdateDescription
- = getString(R.string.app_update_notification_channel_description);
-
- final NotificationChannel appUpdateChannel
- = new NotificationChannel(appUpdateId, appUpdateName, importance);
- appUpdateChannel.setDescription(appUpdateDescription);
-
- final NotificationManager appUpdateNotificationManager
- = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- appUpdateNotificationManager.createNotificationChannel(appUpdateChannel);
+ final NotificationManager notificationManager = getSystemService(NotificationManager.class);
+ notificationManager.createNotificationChannels(Arrays.asList(mainChannel,
+ appUpdateChannel));
}
protected boolean isDisposedRxExceptionsReported() {
diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java
similarity index 57%
rename from app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java
rename to app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java
index d9123076560..a193149e202 100644
--- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java
+++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersion.java
@@ -2,7 +2,6 @@
import android.app.Application;
import android.app.PendingIntent;
-import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
@@ -10,12 +9,13 @@
import android.content.pm.Signature;
import android.net.ConnectivityManager;
import android.net.Uri;
-import android.os.AsyncTask;
-import androidx.preference.PreferenceManager;
import android.util.Log;
+import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
+import androidx.core.content.ContextCompat;
+import androidx.preference.PreferenceManager;
import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonParser;
@@ -35,16 +35,18 @@
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
-/**
- * AsyncTask to check if there is a newer version of the NewPipe github apk available or not.
- * If there is a newer version we show a notification, informing the user. On tapping
- * the notification, the user will be directed to the download link.
- */
-public class CheckForNewAppVersionTask extends AsyncTask {
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.disposables.Disposables;
+import io.reactivex.schedulers.Schedulers;
+
+public final class CheckForNewAppVersion {
+ private CheckForNewAppVersion() { }
+
private static final boolean DEBUG = MainActivity.DEBUG;
- private static final String TAG = CheckForNewAppVersionTask.class.getSimpleName();
+ private static final String TAG = CheckForNewAppVersion.class.getSimpleName();
- private static final Application APP = App.getApp();
private static final String GITHUB_APK_SHA1
= "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15";
private static final String NEWPIPE_API_URL = "https://newpipe.schabi.org/api/data.json";
@@ -52,18 +54,19 @@ public class CheckForNewAppVersionTask extends AsyncTask {
/**
* Method to get the apk's SHA1 key. See https://stackoverflow.com/questions/9293019/#22506133.
*
+ * @param application The application
* @return String with the apk's SHA1 fingeprint in hexadecimal
*/
- private static String getCertificateSHA1Fingerprint() {
- final PackageManager pm = APP.getPackageManager();
- final String packageName = APP.getPackageName();
+ private static String getCertificateSHA1Fingerprint(@NonNull final Application application) {
+ final PackageManager pm = application.getPackageManager();
+ final String packageName = application.getPackageName();
final int flags = PackageManager.GET_SIGNATURES;
PackageInfo packageInfo = null;
try {
packageInfo = pm.getPackageInfo(packageName, flags);
} catch (final PackageManager.NameNotFoundException e) {
- ErrorActivity.reportError(APP, e, null, null,
+ ErrorActivity.reportError(application, e, null, null,
ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
"Could not find package info", R.string.app_ui_crash));
}
@@ -78,7 +81,7 @@ private static String getCertificateSHA1Fingerprint() {
final CertificateFactory cf = CertificateFactory.getInstance("X509");
c = (X509Certificate) cf.generateCertificate(input);
} catch (final CertificateException e) {
- ErrorActivity.reportError(APP, e, null, null,
+ ErrorActivity.reportError(application, e, null, null,
ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
"Certificate error", R.string.app_ui_crash));
}
@@ -90,7 +93,7 @@ private static String getCertificateSHA1Fingerprint() {
final byte[] publicKey = md.digest(c.getEncoded());
hexString = byte2HexFormatted(publicKey);
} catch (NoSuchAlgorithmException | CertificateEncodingException e) {
- ErrorActivity.reportError(APP, e, null, null,
+ ErrorActivity.reportError(application, e, null, null,
ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
"Could not retrieve SHA1 key", R.string.app_ui_crash));
}
@@ -118,104 +121,108 @@ private static String byte2HexFormatted(final byte[] arr) {
return str.toString();
}
- public static boolean isGithubApk() {
- return getCertificateSHA1Fingerprint().equals(GITHUB_APK_SHA1);
- }
-
- @Override
- protected void onPreExecute() {
- final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(APP);
-
- // Check if user has enabled/disabled update checking
- // and if the current apk is a github one or not.
- if (!prefs.getBoolean(APP.getString(R.string.update_app_key), true) || !isGithubApk()) {
- this.cancel(true);
- }
- }
-
- @Override
- protected String doInBackground(final Void... voids) {
- if (isCancelled() || !isConnected()) {
- return null;
- }
-
- // Make a network request to get latest NewPipe data.
- try {
- return DownloaderImpl.getInstance().get(NEWPIPE_API_URL).responseBody();
- } catch (IOException | ReCaptchaException e) {
- // connectivity problems, do not alarm user and fail silently
- if (DEBUG) {
- Log.w(TAG, Log.getStackTraceString(e));
- }
- }
-
- return null;
- }
-
- @Override
- protected void onPostExecute(final String response) {
- // Parse the json from the response.
- if (response != null) {
-
- try {
- final JsonObject githubStableObject = JsonParser.object().from(response)
- .getObject("flavors").getObject("github").getObject("stable");
-
- final String versionName = githubStableObject.getString("version");
- final int versionCode = githubStableObject.getInt("version_code");
- final String apkLocationUrl = githubStableObject.getString("apk");
-
- compareAppVersionAndShowNotification(versionName, apkLocationUrl, versionCode);
-
- } catch (final JsonParserException e) {
- // connectivity problems, do not alarm user and fail silently
- if (DEBUG) {
- Log.w(TAG, Log.getStackTraceString(e));
- }
- }
- }
- }
-
/**
* Method to compare the current and latest available app version.
* If a newer version is available, we show the update notification.
*
+ * @param application The application
* @param versionName Name of new version
* @param apkLocationUrl Url with the new apk
* @param versionCode Code of new version
*/
- private void compareAppVersionAndShowNotification(final String versionName,
- final String apkLocationUrl,
- final int versionCode) {
+ private static void compareAppVersionAndShowNotification(@NonNull final Application application,
+ final String versionName,
+ final String apkLocationUrl,
+ final int versionCode) {
final int notificationId = 2000;
if (BuildConfig.VERSION_CODE < versionCode) {
-
// A pending intent to open the apk location url in the browser.
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl));
final PendingIntent pendingIntent
- = PendingIntent.getActivity(APP, 0, intent, 0);
+ = PendingIntent.getActivity(application, 0, intent, 0);
- final NotificationCompat.Builder notificationBuilder = new NotificationCompat
- .Builder(APP, APP.getString(R.string.app_update_notification_channel_id))
+ final String channelId = application
+ .getString(R.string.app_update_notification_channel_id);
+ final NotificationCompat.Builder notificationBuilder
+ = new NotificationCompat.Builder(application, channelId)
.setSmallIcon(R.drawable.ic_newpipe_update)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
- .setContentTitle(APP.getString(R.string.app_update_notification_content_title))
- .setContentText(APP.getString(R.string.app_update_notification_content_text)
+ .setContentTitle(application
+ .getString(R.string.app_update_notification_content_title))
+ .setContentText(application
+ .getString(R.string.app_update_notification_content_text)
+ " " + versionName);
final NotificationManagerCompat notificationManager
- = NotificationManagerCompat.from(APP);
+ = NotificationManagerCompat.from(application);
notificationManager.notify(notificationId, notificationBuilder.build());
}
}
- private boolean isConnected() {
- final ConnectivityManager cm =
- (ConnectivityManager) APP.getSystemService(Context.CONNECTIVITY_SERVICE);
+ private static boolean isConnected(@NonNull final App app) {
+ final ConnectivityManager cm = ContextCompat.getSystemService(app,
+ ConnectivityManager.class);
return cm.getActiveNetworkInfo() != null
&& cm.getActiveNetworkInfo().isConnected();
}
+
+ public static boolean isGithubApk(@NonNull final App app) {
+ return getCertificateSHA1Fingerprint(app).equals(GITHUB_APK_SHA1);
+ }
+
+ @NonNull
+ public static Disposable checkNewVersion(@NonNull final App app) {
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(app);
+
+ // Check if user has enabled/disabled update checking
+ // and if the current apk is a github one or not.
+ if (!prefs.getBoolean(app.getString(R.string.update_app_key), true)
+ || !isGithubApk(app)) {
+ return Disposables.empty();
+ }
+
+ return Observable.fromCallable(() -> {
+ if (!isConnected(app)) {
+ return null;
+ }
+
+ // Make a network request to get latest NewPipe data.
+ try {
+ return DownloaderImpl.getInstance().get(NEWPIPE_API_URL).responseBody();
+ } catch (IOException | ReCaptchaException e) {
+ // connectivity problems, do not alarm user and fail silently
+ if (DEBUG) {
+ Log.w(TAG, Log.getStackTraceString(e));
+ }
+ }
+
+ return null;
+ })
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(response -> {
+ // Parse the json from the response.
+ if (response != null) {
+ try {
+ final JsonObject githubStableObject = JsonParser.object().from(response)
+ .getObject("flavors").getObject("github").getObject("stable");
+
+ final String versionName = githubStableObject.getString("version");
+ final int versionCode = githubStableObject.getInt("version_code");
+ final String apkLocationUrl = githubStableObject.getString("apk");
+
+ compareAppVersionAndShowNotification(app, versionName, apkLocationUrl,
+ versionCode);
+ } catch (final JsonParserException e) {
+ // connectivity problems, do not alarm user and fail silently
+ if (DEBUG) {
+ Log.w(TAG, Log.getStackTraceString(e));
+ }
+ }
+ }
+ });
+ }
}
diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java
index e72d4609e43..9bcbe4ff1e1 100644
--- a/app/src/main/java/org/schabi/newpipe/MainActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java
@@ -30,9 +30,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import androidx.preference.PreferenceManager;
import android.util.Log;
-
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -46,6 +44,7 @@
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
+
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.ActionBarDrawerToggle;
@@ -55,6 +54,7 @@
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
+import androidx.preference.PreferenceManager;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.navigation.NavigationView;
@@ -69,10 +69,11 @@
import org.schabi.newpipe.fragments.list.search.SearchFragment;
import org.schabi.newpipe.player.VideoPlayer;
import org.schabi.newpipe.player.event.OnKeyDownListener;
+import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.report.ErrorActivity;
-import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.Constants;
+import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.KioskTranslator;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
@@ -87,6 +88,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
@@ -152,7 +154,7 @@ && getSupportFragmentManager().getBackStackEntryCount() == 0) {
if (DeviceUtils.isTv(this)) {
FocusOverlayView.setupFocusObserver(this);
}
- setupBroadcastReceiver();
+ openMiniPlayerUponPlayerStarted();
}
private void setupDrawer() throws Exception {
@@ -758,32 +760,36 @@ private void handleIntent(final Intent intent) {
if (intent.hasExtra(Constants.KEY_LINK_TYPE)) {
final String url = intent.getStringExtra(Constants.KEY_URL);
final int serviceId = intent.getIntExtra(Constants.KEY_SERVICE_ID, 0);
- final String title = intent.getStringExtra(Constants.KEY_TITLE);
- switch (((StreamingService.LinkType) intent
- .getSerializableExtra(Constants.KEY_LINK_TYPE))) {
+ String title = intent.getStringExtra(Constants.KEY_TITLE);
+ if (title == null) {
+ title = "";
+ }
+
+ final StreamingService.LinkType linkType = ((StreamingService.LinkType) intent
+ .getSerializableExtra(Constants.KEY_LINK_TYPE));
+ assert linkType != null;
+ switch (linkType) {
case STREAM:
- final boolean autoPlay = intent
- .getBooleanExtra(VideoDetailFragment.AUTO_PLAY, false);
- final String intentCacheKey = intent
- .getStringExtra(VideoPlayer.PLAY_QUEUE_KEY);
+ final String intentCacheKey = intent.getStringExtra(
+ VideoPlayer.PLAY_QUEUE_KEY);
final PlayQueue playQueue = intentCacheKey != null
? SerializedCache.getInstance()
.take(intentCacheKey, PlayQueue.class)
: null;
- NavigationHelper.openVideoDetailFragment(getSupportFragmentManager(),
- serviceId, url, title, autoPlay, playQueue);
+
+ final boolean switchingPlayers = intent.getBooleanExtra(
+ VideoDetailFragment.KEY_SWITCHING_PLAYERS, false);
+ NavigationHelper.openVideoDetailFragment(
+ getApplicationContext(), getSupportFragmentManager(),
+ serviceId, url, title, playQueue, switchingPlayers);
break;
case CHANNEL:
NavigationHelper.openChannelFragment(getSupportFragmentManager(),
- serviceId,
- url,
- title);
+ serviceId, url, title);
break;
case PLAYLIST:
NavigationHelper.openPlaylistFragment(getSupportFragmentManager(),
- serviceId,
- url,
- title);
+ serviceId, url, title);
break;
}
} else if (intent.hasExtra(Constants.KEY_OPEN_SEARCH)) {
@@ -805,34 +811,47 @@ private void handleIntent(final Intent intent) {
}
}
- private void setupBroadcastReceiver() {
- broadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(final Context context, final Intent intent) {
- if (intent.getAction().equals(VideoDetailFragment.ACTION_PLAYER_STARTED)) {
- final Fragment fragmentPlayer = getSupportFragmentManager()
- .findFragmentById(R.id.fragment_player_holder);
- if (fragmentPlayer == null) {
- /*
- * We still don't have a fragment attached to the activity.
- * It can happen when a user started popup or background players
- * without opening a stream inside the fragment.
- * Adding it in a collapsed state (only mini player will be visible)
- * */
- NavigationHelper.showMiniPlayer(getSupportFragmentManager());
+ private void openMiniPlayerIfMissing() {
+ final Fragment fragmentPlayer = getSupportFragmentManager()
+ .findFragmentById(R.id.fragment_player_holder);
+ if (fragmentPlayer == null) {
+ // We still don't have a fragment attached to the activity. It can happen when a user
+ // started popup or background players without opening a stream inside the fragment.
+ // Adding it in a collapsed state (only mini player will be visible).
+ NavigationHelper.showMiniPlayer(getSupportFragmentManager());
+ }
+ }
+
+ private void openMiniPlayerUponPlayerStarted() {
+ if (getIntent().getSerializableExtra(Constants.KEY_LINK_TYPE)
+ == StreamingService.LinkType.STREAM) {
+ // handleIntent() already takes care of opening video detail fragment
+ // due to an intent containing a STREAM link
+ return;
+ }
+
+ if (PlayerHolder.isPlayerOpen()) {
+ // if the player is already open, no need for a broadcast receiver
+ openMiniPlayerIfMissing();
+ } else {
+ // listen for player start intent being sent around
+ broadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(final Context context, final Intent intent) {
+ if (Objects.equals(intent.getAction(),
+ VideoDetailFragment.ACTION_PLAYER_STARTED)) {
+ openMiniPlayerIfMissing();
+ // At this point the player is added 100%, we can unregister. Other actions
+ // are useless since the fragment will not be removed after that.
+ unregisterReceiver(broadcastReceiver);
+ broadcastReceiver = null;
}
- /*
- * At this point the player is added 100%, we can unregister.
- * Other actions are useless since the fragment will not be removed after that
- * */
- unregisterReceiver(broadcastReceiver);
- broadcastReceiver = null;
}
- }
- };
- final IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(VideoDetailFragment.ACTION_PLAYER_STARTED);
- registerReceiver(broadcastReceiver, intentFilter);
+ };
+ final IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(VideoDetailFragment.ACTION_PLAYER_STARTED);
+ registerReceiver(broadcastReceiver, intentFilter);
+ }
}
private boolean bottomSheetHiddenOrCollapsed() {
diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java
index 251affaed22..537d71901ec 100644
--- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java
@@ -8,7 +8,6 @@
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
-import androidx.preference.PreferenceManager;
import android.text.TextUtils;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
@@ -27,7 +26,9 @@
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.app.NotificationCompat;
+import androidx.core.widget.TextViewCompat;
import androidx.fragment.app.FragmentManager;
+import androidx.preference.PreferenceManager;
import org.schabi.newpipe.download.DownloadDialog;
import org.schabi.newpipe.extractor.Info;
@@ -39,14 +40,16 @@
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.extractor.stream.VideoStream;
+import org.schabi.newpipe.player.MainPlayer;
import org.schabi.newpipe.player.helper.PlayerHelper;
+import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.ChannelPlayQueue;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue;
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
import org.schabi.newpipe.report.UserAction;
-import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.Constants;
+import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.ListHelper;
import org.schabi.newpipe.util.NavigationHelper;
@@ -59,8 +62,6 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
import java.util.List;
import icepick.Icepick;
@@ -115,8 +116,6 @@ protected void onCreate(final Bundle savedInstanceState) {
}
}
- internalRoute = getIntent().getBooleanExtra(INTERNAL_ROUTE_KEY, false);
-
setTheme(ThemeHelper.isLightThemeSelected(this)
? R.style.RouterActivityThemeLight : R.style.RouterActivityThemeDark);
}
@@ -326,7 +325,7 @@ private void showDialog(final List choices) {
final RadioButton radioButton
= (RadioButton) inflater.inflate(R.layout.list_radio_icon_item, null);
radioButton.setText(item.description);
- radioButton.setCompoundDrawablesWithIntrinsicBounds(
+ TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(radioButton,
AppCompatResources.getDrawable(getApplicationContext(), item.icon),
null, null, null);
radioButton.setChecked(false);
@@ -397,14 +396,22 @@ private List getChoicesForService(final StreamingService serv
// show both "show info" and "video player", they are two different activities
returnList.add(showInfo);
returnList.add(videoPlayer);
- } else if (capabilities.contains(VIDEO)
- && PlayerHelper.isAutoplayAllowedByUser(context)) {
- // show only "video player" since the details activity will be opened and the video
- // will be autoplayed there and "show info" would do the exact same thing
- returnList.add(videoPlayer);
} else {
- // show only "show info" if video player is not applicable or autoplay is disabled
- returnList.add(showInfo);
+ final MainPlayer.PlayerType playerType = PlayerHolder.getType();
+ if (capabilities.contains(VIDEO)
+ && PlayerHelper.isAutoplayAllowedByUser(context)
+ && playerType == null || playerType == MainPlayer.PlayerType.VIDEO) {
+ // show only "video player" since the details activity will be opened and the
+ // video will be auto played there. Since "show info" would do the exact same
+ // thing, use that as a key to let VideoDetailFragment load the stream instead
+ // of using FetcherService (see comment in handleChoice())
+ returnList.add(new AdapterChoiceItem(
+ showInfo.key, videoPlayer.description, videoPlayer.icon));
+ } else {
+ // show only "show info" if video player is not applicable, auto play is
+ // disabled or a video is playing in a player different than the main one
+ returnList.add(showInfo);
+ }
}
if (capabilities.contains(VIDEO)) {
@@ -491,12 +498,7 @@ private void handleChoice(final String selectedChoiceKey) {
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(intent -> {
- if (!internalRoute) {
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- }
startActivity(intent);
-
finish();
}, throwable -> handleError(throwable, currentUrl))
);
@@ -514,7 +516,7 @@ private void handleChoice(final String selectedChoiceKey) {
@SuppressLint("CheckResult")
private void openDownloadDialog() {
- ExtractorHelper.getStreamInfo(currentServiceId, currentUrl, true)
+ disposables.add(ExtractorHelper.getStreamInfo(currentServiceId, currentUrl, true)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((@NonNull StreamInfo result) -> {
@@ -531,10 +533,10 @@ private void openDownloadDialog() {
downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex);
downloadDialog.show(fm, "downloadDialog");
fm.executePendingTransactions();
- downloadDialog.getDialog().setOnDismissListener(dialog -> finish());
+ downloadDialog.requireDialog().setOnDismissListener(dialog -> finish());
}, (@NonNull Throwable throwable) -> {
showUnsupportedUrlDialog(currentUrl);
- });
+ }));
}
@Override
@@ -552,66 +554,6 @@ public void onRequestPermissionsResult(final int requestCode,
}
}
- /*//////////////////////////////////////////////////////////////////////////
- // Service Fetcher
- //////////////////////////////////////////////////////////////////////////*/
-
- private String removeHeadingGibberish(final String input) {
- int start = 0;
- for (int i = input.indexOf("://") - 1; i >= 0; i--) {
- if (!input.substring(i, i + 1).matches("\\p{L}")) {
- start = i + 1;
- break;
- }
- }
- return input.substring(start);
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Utils
- //////////////////////////////////////////////////////////////////////////*/
-
- private String trim(final String input) {
- if (input == null || input.length() < 1) {
- return input;
- } else {
- String output = input;
- while (output.length() > 0 && output.substring(0, 1).matches(REGEX_REMOVE_FROM_URL)) {
- output = output.substring(1);
- }
- while (output.length() > 0
- && output.substring(output.length() - 1).matches(REGEX_REMOVE_FROM_URL)) {
- output = output.substring(0, output.length() - 1);
- }
- return output;
- }
- }
-
- /**
- * Retrieves all Strings which look remotely like URLs from a text.
- * Used if NewPipe was called through share menu.
- *
- * @param sharedText text to scan for URLs.
- * @return potential URLs
- */
- protected String[] getUris(final String sharedText) {
- final Collection result = new HashSet<>();
- if (sharedText != null) {
- final String[] array = sharedText.split("\\p{Space}");
- for (String s : array) {
- s = trim(s);
- if (s.length() != 0) {
- if (s.matches(".+://.+")) {
- result.add(removeHeadingGibberish(s));
- } else if (s.matches(".+\\..+")) {
- result.add("http://" + s);
- }
- }
- }
- }
- return result.toArray(new String[0]);
- }
-
private static class AdapterChoiceItem {
final String description;
final String key;
@@ -724,50 +666,34 @@ public Consumer getResultHandler(final Choice choice) {
final boolean isExtAudioEnabled = preferences.getBoolean(
getString(R.string.use_external_audio_player_key), false);
- PlayQueue playQueue;
- final String playerChoice = choice.playerChoice;
-
+ final PlayQueue playQueue;
if (info instanceof StreamInfo) {
- if (playerChoice.equals(backgroundPlayerKey) && isExtAudioEnabled) {
+ if (choice.playerChoice.equals(backgroundPlayerKey) && isExtAudioEnabled) {
NavigationHelper.playOnExternalAudioPlayer(this, (StreamInfo) info);
-
- } else if (playerChoice.equals(videoPlayerKey) && isExtVideoEnabled) {
+ return;
+ } else if (choice.playerChoice.equals(videoPlayerKey) && isExtVideoEnabled) {
NavigationHelper.playOnExternalVideoPlayer(this, (StreamInfo) info);
-
- } else {
- playQueue = new SinglePlayQueue((StreamInfo) info);
-
- if (playerChoice.equals(videoPlayerKey)) {
- openMainPlayer(playQueue, choice);
- } else if (playerChoice.equals(backgroundPlayerKey)) {
- NavigationHelper.enqueueOnBackgroundPlayer(this, playQueue, true);
- } else if (playerChoice.equals(popupPlayerKey)) {
- NavigationHelper.enqueueOnPopupPlayer(this, playQueue, true);
- }
+ return;
}
+ playQueue = new SinglePlayQueue((StreamInfo) info);
+ } else if (info instanceof ChannelInfo) {
+ playQueue = new ChannelPlayQueue((ChannelInfo) info);
+ } else if (info instanceof PlaylistInfo) {
+ playQueue = new PlaylistPlayQueue((PlaylistInfo) info);
+ } else {
+ return;
}
- if (info instanceof ChannelInfo || info instanceof PlaylistInfo) {
- playQueue = info instanceof ChannelInfo
- ? new ChannelPlayQueue((ChannelInfo) info)
- : new PlaylistPlayQueue((PlaylistInfo) info);
-
- if (playerChoice.equals(videoPlayerKey)) {
- openMainPlayer(playQueue, choice);
- } else if (playerChoice.equals(backgroundPlayerKey)) {
- NavigationHelper.playOnBackgroundPlayer(this, playQueue, true);
- } else if (playerChoice.equals(popupPlayerKey)) {
- NavigationHelper.playOnPopupPlayer(this, playQueue, true);
- }
+ if (choice.playerChoice.equals(videoPlayerKey)) {
+ NavigationHelper.playOnMainPlayer(this, playQueue, false);
+ } else if (choice.playerChoice.equals(backgroundPlayerKey)) {
+ NavigationHelper.playOnBackgroundPlayer(this, playQueue, true);
+ } else if (choice.playerChoice.equals(popupPlayerKey)) {
+ NavigationHelper.playOnPopupPlayer(this, playQueue, true);
}
};
}
- private void openMainPlayer(final PlayQueue playQueue, final Choice choice) {
- NavigationHelper.playOnMainPlayer(this, playQueue, choice.linkType,
- choice.url, "", true, true);
- }
-
@Override
public void onDestroy() {
super.onDestroy();
diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java
index 81ba78ba997..a15bb9e41c6 100644
--- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java
@@ -8,16 +8,17 @@
import android.view.ViewGroup;
import android.widget.TextView;
+import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentPagerAdapter;
-import androidx.fragment.app.FragmentStatePagerAdapter;
-import androidx.viewpager.widget.PagerAdapter;
-import androidx.viewpager.widget.ViewPager;
+import androidx.fragment.app.FragmentActivity;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
import org.schabi.newpipe.BuildConfig;
import org.schabi.newpipe.R;
@@ -32,7 +33,7 @@ public class AboutActivity extends AppCompatActivity {
*/
private static final SoftwareComponent[] SOFTWARE_COMPONENTS = new SoftwareComponent[]{
new SoftwareComponent("Giga Get", "2014 - 2015", "Peter Cai",
- "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL2),
+ "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL3),
new SoftwareComponent("NewPipe Extractor", "2017 - 2020", "Christian Schabesberger",
"https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3),
new SoftwareComponent("Jsoup", "2017", "Jonathan Hedley",
@@ -64,20 +65,20 @@ public class AboutActivity extends AppCompatActivity {
"https://github.com/lisawray/groupie", StandardLicenses.MIT)
};
+ private static final int POS_ABOUT = 0;
+ private static final int POS_LICENSE = 1;
+ private static final int TOTAL_COUNT = 2;
/**
- * The {@link PagerAdapter} that will provide
+ * The {@link RecyclerView.Adapter} that will provide
* fragments for each of the sections. We use a
- * {@link FragmentPagerAdapter} derivative, which will keep every
- * loaded fragment in memory. If this becomes too memory intensive, it
- * may be best to switch to a
- * {@link FragmentStatePagerAdapter}.
+ * {@link FragmentStateAdapter} derivative, which will keep every
+ * loaded fragment in memory.
*/
private SectionsPagerAdapter mSectionsPagerAdapter;
-
/**
- * The {@link ViewPager} that will host the section contents.
+ * The {@link ViewPager2} that will host the section contents.
*/
- private ViewPager mViewPager;
+ private ViewPager2 mViewPager;
@Override
protected void onCreate(final Bundle savedInstanceState) {
@@ -93,14 +94,24 @@ protected void onCreate(final Bundle savedInstanceState) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
- mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
+ mSectionsPagerAdapter = new SectionsPagerAdapter(this);
// Set up the ViewPager with the sections adapter.
mViewPager = findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
final TabLayout tabLayout = findViewById(R.id.tabs);
- tabLayout.setupWithViewPager(mViewPager);
+ new TabLayoutMediator(tabLayout, mViewPager, (tab, position) -> {
+ switch (position) {
+ default:
+ case POS_ABOUT:
+ tab.setText(R.string.tab_about);
+ break;
+ case POS_LICENSE:
+ tab.setText(R.string.tab_licenses);
+ break;
+ }
+ }).attach();
}
@Override
@@ -162,40 +173,30 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe
}
/**
- * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
+ * A {@link FragmentStateAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
- public class SectionsPagerAdapter extends FragmentPagerAdapter {
- public SectionsPagerAdapter(final FragmentManager fm) {
- super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
+ public static class SectionsPagerAdapter extends FragmentStateAdapter {
+ public SectionsPagerAdapter(final FragmentActivity fa) {
+ super(fa);
}
+ @NonNull
@Override
- public Fragment getItem(final int position) {
+ public Fragment createFragment(final int position) {
switch (position) {
- case 0:
+ default:
+ case POS_ABOUT:
return AboutFragment.newInstance();
- case 1:
+ case POS_LICENSE:
return LicenseFragment.newInstance(SOFTWARE_COMPONENTS);
}
- return null;
}
@Override
- public int getCount() {
+ public int getItemCount() {
// Show 2 total pages.
- return 2;
- }
-
- @Override
- public CharSequence getPageTitle(final int position) {
- switch (position) {
- case 0:
- return getString(R.string.tab_about);
- case 1:
- return getString(R.string.tab_licenses);
- }
- return null;
+ return TOTAL_COUNT;
}
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java
index e869dbb147d..bac789dbd1b 100644
--- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java
@@ -1,6 +1,5 @@
package org.schabi.newpipe.about;
-import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.LayoutInflater;
@@ -19,16 +18,21 @@
import java.io.Serializable;
import java.util.Arrays;
+import java.util.Comparator;
+
+import io.reactivex.disposables.CompositeDisposable;
/**
* Fragment containing the software licenses.
*/
public class LicenseFragment extends Fragment {
private static final String ARG_COMPONENTS = "components";
+ private static final String LICENSE_KEY = "ACTIVE_LICENSE";
+
private SoftwareComponent[] softwareComponents;
private SoftwareComponent componentForContextMenu;
private License activeLicense;
- private static final String LICENSE_KEY = "ACTIVE_LICENSE";
+ private final CompositeDisposable compositeDisposable = new CompositeDisposable();
public static LicenseFragment newInstance(final SoftwareComponent[] softwareComponents) {
if (softwareComponents == null) {
@@ -41,16 +45,6 @@ public static LicenseFragment newInstance(final SoftwareComponent[] softwareComp
return fragment;
}
- /**
- * Shows a popup containing the license.
- *
- * @param context the context to use
- * @param license the license to show
- */
- private static void showLicense(final Activity context, final License license) {
- new LicenseFragmentHelper(context).execute(license);
- }
-
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -64,7 +58,13 @@ public void onCreate(@Nullable final Bundle savedInstanceState) {
}
}
// Sort components by name
- Arrays.sort(softwareComponents, (o1, o2) -> o1.getName().compareTo(o2.getName()));
+ Arrays.sort(softwareComponents, Comparator.comparing(SoftwareComponent::getName));
+ }
+
+ @Override
+ public void onDestroy() {
+ compositeDisposable.dispose();
+ super.onDestroy();
}
@Nullable
@@ -76,8 +76,9 @@ public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGrou
final View licenseLink = rootView.findViewById(R.id.app_read_license);
licenseLink.setOnClickListener(v -> {
- activeLicense = StandardLicenses.GPL3;
- showLicense(getActivity(), StandardLicenses.GPL3);
+ activeLicense = StandardLicenses.GPL3;
+ compositeDisposable.add(LicenseFragmentHelper.showLicense(getActivity(),
+ StandardLicenses.GPL3));
});
for (final SoftwareComponent component : softwareComponents) {
@@ -94,13 +95,15 @@ public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGrou
componentView.setTag(component);
componentView.setOnClickListener(v -> {
activeLicense = component.getLicense();
- showLicense(getActivity(), component.getLicense());
+ compositeDisposable.add(LicenseFragmentHelper.showLicense(getActivity(),
+ component.getLicense()));
});
softwareComponentsView.addView(componentView);
registerForContextMenu(componentView);
}
if (activeLicense != null) {
- showLicense(getActivity(), activeLicense);
+ compositeDisposable.add(LicenseFragmentHelper.showLicense(getActivity(),
+ activeLicense));
}
return rootView;
}
@@ -128,7 +131,8 @@ public boolean onContextItemSelected(@NonNull final MenuItem item) {
ShareUtils.openUrlInBrowser(getActivity(), component.getLink());
return true;
case R.id.action_show_license:
- showLicense(getActivity(), component.getLicense());
+ compositeDisposable.add(LicenseFragmentHelper.showLicense(getActivity(),
+ component.getLicense()));
}
return false;
}
diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java
index 01a01bc8834..8a2ab6fa9be 100644
--- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java
@@ -1,8 +1,6 @@
package org.schabi.newpipe.about;
-import android.app.Activity;
import android.content.Context;
-import android.os.AsyncTask;
import android.util.Base64;
import android.webkit.WebView;
@@ -16,18 +14,18 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
-import java.lang.ref.WeakReference;
import java.nio.charset.StandardCharsets;
-import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.disposables.Disposables;
+import io.reactivex.schedulers.Schedulers;
-public class LicenseFragmentHelper extends AsyncTask {
- private final WeakReference weakReference;
- private License license;
+import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
- public LicenseFragmentHelper(@Nullable final Activity activity) {
- weakReference = new WeakReference<>(activity);
- }
+public final class LicenseFragmentHelper {
+ private LicenseFragmentHelper() { }
/**
* @param context the context to use
@@ -62,7 +60,7 @@ private static String getFormattedLicense(@NonNull final Context context,
* @param context
* @return String which is a CSS stylesheet according to the context's theme
*/
- private static String getLicenseStylesheet(final Context context) {
+ private static String getLicenseStylesheet(@NonNull final Context context) {
final boolean isLightTheme = ThemeHelper.isLightThemeSelected(context);
return "body{padding:12px 15px;margin:0;"
+ "background:#" + getHexRGBColor(context, isLightTheme
@@ -84,45 +82,31 @@ private static String getLicenseStylesheet(final Context context) {
* @param color the color number from R.color
* @return a six characters long String with hexadecimal RGB values
*/
- private static String getHexRGBColor(final Context context, final int color) {
+ private static String getHexRGBColor(@NonNull final Context context, final int color) {
return context.getResources().getString(color).substring(3);
}
- @Nullable
- private Activity getActivity() {
- final Activity activity = weakReference.get();
-
- if (activity != null && activity.isFinishing()) {
- return null;
- } else {
- return activity;
- }
- }
-
- @Override
- protected Integer doInBackground(final Object... objects) {
- license = (License) objects[0];
- return 1;
- }
-
- @Override
- protected void onPostExecute(final Integer result) {
- final Activity activity = getActivity();
- if (activity == null) {
- return;
+ static Disposable showLicense(@Nullable final Context context, @NonNull final License license) {
+ if (context == null) {
+ return Disposables.empty();
}
- final String webViewData = Base64.encodeToString(getFormattedLicense(activity, license)
- .getBytes(StandardCharsets.UTF_8), Base64.NO_PADDING);
- final WebView webView = new WebView(activity);
- webView.loadData(webViewData, "text/html; charset=UTF-8", "base64");
-
- final AlertDialog.Builder alert = new AlertDialog.Builder(activity);
- alert.setTitle(license.getName());
- alert.setView(webView);
- assureCorrectAppLanguage(activity);
- alert.setNegativeButton(activity.getString(R.string.finish),
- (dialog, which) -> dialog.dismiss());
- alert.show();
+ return Observable.fromCallable(() -> getFormattedLicense(context, license))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(formattedLicense -> {
+ final String webViewData = Base64.encodeToString(formattedLicense
+ .getBytes(StandardCharsets.UTF_8), Base64.NO_PADDING);
+ final WebView webView = new WebView(context);
+ webView.loadData(webViewData, "text/html; charset=UTF-8", "base64");
+
+ final AlertDialog.Builder alert = new AlertDialog.Builder(context);
+ alert.setTitle(license.getName());
+ alert.setView(webView);
+ assureCorrectAppLanguage(context);
+ alert.setNegativeButton(context.getString(R.string.finish),
+ (dialog, which) -> dialog.dismiss());
+ alert.show();
+ });
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.java b/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.java
index 75a7a861317..50ee5ebc37a 100644
--- a/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.java
+++ b/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.java
@@ -4,8 +4,6 @@
* Class containing information about standard software licenses.
*/
public final class StandardLicenses {
- public static final License GPL2
- = new License("GNU General Public License, Version 2.0", "GPLv2", "gpl_2.html");
public static final License GPL3
= new License("GNU General Public License, Version 3.0", "GPLv3", "gpl_3.html");
public static final License APACHE2
diff --git a/app/src/main/java/org/schabi/newpipe/database/Converters.java b/app/src/main/java/org/schabi/newpipe/database/Converters.java
index ca2d8d875c7..c46b5f4275c 100644
--- a/app/src/main/java/org/schabi/newpipe/database/Converters.java
+++ b/app/src/main/java/org/schabi/newpipe/database/Converters.java
@@ -5,31 +5,35 @@
import org.schabi.newpipe.extractor.stream.StreamType;
import org.schabi.newpipe.local.subscription.FeedGroupIcon;
-import java.util.Date;
+import java.time.Instant;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
public final class Converters {
private Converters() { }
/**
- * Convert a long value to a date.
+ * Convert a long value to a {@link OffsetDateTime}.
*
* @param value the long value
- * @return the date
+ * @return the {@code OffsetDateTime}
*/
@TypeConverter
- public static Date fromTimestamp(final Long value) {
- return value == null ? null : new Date(value);
+ public static OffsetDateTime offsetDateTimeFromTimestamp(final Long value) {
+ return value == null ? null : OffsetDateTime.ofInstant(Instant.ofEpochMilli(value),
+ ZoneOffset.UTC);
}
/**
- * Convert a date to a long value.
+ * Convert a {@link OffsetDateTime} to a long value.
*
- * @param date the date
+ * @param offsetDateTime the {@code OffsetDateTime}
* @return the long value
*/
@TypeConverter
- public static Long dateToTimestamp(final Date date) {
- return date == null ? null : date.getTime();
+ public static Long offsetDateTimeToTimestamp(final OffsetDateTime offsetDateTime) {
+ return offsetDateTime == null ? null : offsetDateTime.withOffsetSameInstant(ZoneOffset.UTC)
+ .toInstant().toEpochMilli();
}
@TypeConverter
diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt
index 74f5b369e04..d8b4f72cce4 100644
--- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt
+++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt
@@ -7,7 +7,7 @@ import androidx.room.Query
import androidx.room.Transaction
import androidx.room.Update
import io.reactivex.Flowable
-import java.util.Date
+import java.time.OffsetDateTime
import org.schabi.newpipe.database.feed.model.FeedEntity
import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity
import org.schabi.newpipe.database.stream.model.StreamEntity
@@ -58,10 +58,10 @@ abstract class FeedDAO {
INNER JOIN feed f
ON s.uid = f.stream_id
- WHERE s.upload_date < :date
+ WHERE s.upload_date < :offsetDateTime
)
""")
- abstract fun unlinkStreamsOlderThan(date: Date)
+ abstract fun unlinkStreamsOlderThan(offsetDateTime: OffsetDateTime)
@Query("""
DELETE FROM feed
@@ -106,10 +106,10 @@ abstract class FeedDAO {
INNER JOIN feed_group_subscription_join fgs
ON fgs.subscription_id = lu.subscription_id AND fgs.group_id = :groupId
""")
- abstract fun oldestSubscriptionUpdate(groupId: Long): Flowable>
+ abstract fun oldestSubscriptionUpdate(groupId: Long): Flowable>
@Query("SELECT MIN(last_updated) FROM feed_last_updated")
- abstract fun oldestSubscriptionUpdateFromAll(): Flowable>
+ abstract fun oldestSubscriptionUpdateFromAll(): Flowable>
@Query("SELECT COUNT(*) FROM feed_last_updated WHERE last_updated IS NULL")
abstract fun notLoadedCount(): Flowable
@@ -135,7 +135,7 @@ abstract class FeedDAO {
WHERE lu.last_updated IS NULL OR lu.last_updated < :outdatedThreshold
""")
- abstract fun getAllOutdated(outdatedThreshold: Date): Flowable>
+ abstract fun getAllOutdated(outdatedThreshold: OffsetDateTime): Flowable>
@Query("""
SELECT s.* FROM subscriptions s
@@ -148,5 +148,5 @@ abstract class FeedDAO {
WHERE lu.last_updated IS NULL OR lu.last_updated < :outdatedThreshold
""")
- abstract fun getAllOutdatedForGroup(groupId: Long, outdatedThreshold: Date): Flowable>
+ abstract fun getAllOutdatedForGroup(groupId: Long, outdatedThreshold: OffsetDateTime): Flowable>
}
diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt
index 78b2550a55b..069d1138fbb 100644
--- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt
+++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt
@@ -4,7 +4,7 @@ import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.PrimaryKey
-import java.util.Date
+import java.time.OffsetDateTime
import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.FEED_LAST_UPDATED_TABLE
import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.SUBSCRIPTION_ID
import org.schabi.newpipe.database.subscription.SubscriptionEntity
@@ -25,9 +25,8 @@ data class FeedLastUpdatedEntity(
var subscriptionId: Long,
@ColumnInfo(name = LAST_UPDATED)
- var lastUpdated: Date? = null
+ var lastUpdated: OffsetDateTime? = null
) {
-
companion object {
const val FEED_LAST_UPDATED_TABLE = "feed_last_updated"
diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.java b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.java
index 7528351823e..fd45887000d 100644
--- a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.java
+++ b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.java
@@ -6,7 +6,7 @@
import androidx.room.Index;
import androidx.room.PrimaryKey;
-import java.util.Date;
+import java.time.OffsetDateTime;
import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.SEARCH;
@@ -24,7 +24,7 @@ public class SearchHistoryEntry {
private long id;
@ColumnInfo(name = CREATION_DATE)
- private Date creationDate;
+ private OffsetDateTime creationDate;
@ColumnInfo(name = SERVICE_ID)
private int serviceId;
@@ -32,7 +32,8 @@ public class SearchHistoryEntry {
@ColumnInfo(name = SEARCH)
private String search;
- public SearchHistoryEntry(final Date creationDate, final int serviceId, final String search) {
+ public SearchHistoryEntry(final OffsetDateTime creationDate, final int serviceId,
+ final String search) {
this.serviceId = serviceId;
this.creationDate = creationDate;
this.search = search;
@@ -46,11 +47,11 @@ public void setId(final long id) {
this.id = id;
}
- public Date getCreationDate() {
+ public OffsetDateTime getCreationDate() {
return creationDate;
}
- public void setCreationDate(final Date creationDate) {
+ public void setCreationDate(final OffsetDateTime creationDate) {
this.creationDate = creationDate;
}
diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java
index bf1f7a9dda1..ad1941adbd0 100644
--- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java
+++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java
@@ -9,7 +9,7 @@
import org.schabi.newpipe.database.stream.model.StreamEntity;
-import java.util.Date;
+import java.time.OffsetDateTime;
import static androidx.room.ForeignKey.CASCADE;
import static org.schabi.newpipe.database.history.model.StreamHistoryEntity.JOIN_STREAM_ID;
@@ -37,12 +37,12 @@ public class StreamHistoryEntity {
@NonNull
@ColumnInfo(name = STREAM_ACCESS_DATE)
- private Date accessDate;
+ private OffsetDateTime accessDate;
@ColumnInfo(name = STREAM_REPEAT_COUNT)
private long repeatCount;
- public StreamHistoryEntity(final long streamUid, @NonNull final Date accessDate,
+ public StreamHistoryEntity(final long streamUid, @NonNull final OffsetDateTime accessDate,
final long repeatCount) {
this.streamUid = streamUid;
this.accessDate = accessDate;
@@ -50,7 +50,7 @@ public StreamHistoryEntity(final long streamUid, @NonNull final Date accessDate,
}
@Ignore
- public StreamHistoryEntity(final long streamUid, @NonNull final Date accessDate) {
+ public StreamHistoryEntity(final long streamUid, @NonNull final OffsetDateTime accessDate) {
this(streamUid, accessDate, 1);
}
@@ -62,11 +62,12 @@ public void setStreamUid(final long streamUid) {
this.streamUid = streamUid;
}
- public Date getAccessDate() {
+ @NonNull
+ public OffsetDateTime getAccessDate() {
return accessDate;
}
- public void setAccessDate(@NonNull final Date accessDate) {
+ public void setAccessDate(@NonNull final OffsetDateTime accessDate) {
this.accessDate = accessDate;
}
diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt
index c653e6c6ffc..b928b00bfc3 100644
--- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt
+++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt
@@ -2,7 +2,7 @@ package org.schabi.newpipe.database.history.model
import androidx.room.ColumnInfo
import androidx.room.Embedded
-import java.util.Date
+import java.time.OffsetDateTime
import org.schabi.newpipe.database.stream.model.StreamEntity
data class StreamHistoryEntry(
@@ -13,7 +13,7 @@ data class StreamHistoryEntry(
val streamId: Long,
@ColumnInfo(name = StreamHistoryEntity.STREAM_ACCESS_DATE)
- val accessDate: Date,
+ val accessDate: OffsetDateTime,
@ColumnInfo(name = StreamHistoryEntity.STREAM_REPEAT_COUNT)
val repeatCount: Long
@@ -25,6 +25,6 @@ data class StreamHistoryEntry(
fun hasEqualValues(other: StreamHistoryEntry): Boolean {
return this.streamEntity.uid == other.streamEntity.uid && streamId == other.streamId &&
- accessDate.compareTo(other.accessDate) == 0
+ accessDate.isEqual(other.accessDate)
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java
index 3ce95631c06..43dbd89ea46 100644
--- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java
+++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java
@@ -5,6 +5,7 @@
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
public interface PlaylistLocalItem extends LocalItem {
@@ -18,15 +19,8 @@ static List merge(
items.addAll(localPlaylists);
items.addAll(remotePlaylists);
- Collections.sort(items, (left, right) -> {
- final String on1 = left.getOrderingName();
- final String on2 = right.getOrderingName();
- if (on1 == null) {
- return on2 == null ? 0 : 1;
- } else {
- return on2 == null ? -1 : on1.compareToIgnoreCase(on2);
- }
- });
+ Collections.sort(items, Comparator.comparing(PlaylistLocalItem::getOrderingName,
+ Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER)));
return items;
}
diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java
index 2cfe5440c97..ad9c148ca73 100644
--- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java
+++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java
@@ -33,4 +33,7 @@ public Flowable> listByService(final int serviceId) {
@Query("DELETE FROM " + PLAYLIST_TABLE + " WHERE " + PLAYLIST_ID + " = :playlistId")
public abstract int deletePlaylist(long playlistId);
+
+ @Query("SELECT COUNT(*) FROM " + PLAYLIST_TABLE)
+ public abstract Flowable getCount();
}
diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt
index dde1f0392bc..1e4c672ab4b 100644
--- a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt
+++ b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt
@@ -2,26 +2,25 @@ package org.schabi.newpipe.database.stream
import androidx.room.ColumnInfo
import androidx.room.Embedded
-import java.util.Date
+import java.time.OffsetDateTime
import org.schabi.newpipe.database.LocalItem
import org.schabi.newpipe.database.history.model.StreamHistoryEntity
import org.schabi.newpipe.database.stream.model.StreamEntity
import org.schabi.newpipe.extractor.stream.StreamInfoItem
class StreamStatisticsEntry(
- @Embedded
+ @Embedded
val streamEntity: StreamEntity,
- @ColumnInfo(name = StreamHistoryEntity.JOIN_STREAM_ID)
+ @ColumnInfo(name = StreamHistoryEntity.JOIN_STREAM_ID)
val streamId: Long,
- @ColumnInfo(name = STREAM_LATEST_DATE)
- val latestAccessDate: Date,
+ @ColumnInfo(name = STREAM_LATEST_DATE)
+ val latestAccessDate: OffsetDateTime,
- @ColumnInfo(name = STREAM_WATCH_COUNT)
+ @ColumnInfo(name = STREAM_WATCH_COUNT)
val watchCount: Long
) : LocalItem {
-
fun toStreamInfoItem(): StreamInfoItem {
val item = StreamInfoItem(streamEntity.serviceId, streamEntity.url, streamEntity.title, streamEntity.streamType)
item.duration = streamEntity.duration
diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt
index 921c08b4623..89757c17d71 100644
--- a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt
+++ b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt
@@ -7,7 +7,7 @@ import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Transaction
import io.reactivex.Flowable
-import java.util.Date
+import java.time.OffsetDateTime
import org.schabi.newpipe.database.BasicDAO
import org.schabi.newpipe.database.stream.model.StreamEntity
import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID
@@ -129,7 +129,7 @@ abstract class StreamDAO : BasicDAO {
var textualUploadDate: String? = null,
@ColumnInfo(name = StreamEntity.STREAM_UPLOAD_DATE)
- var uploadDate: Date? = null,
+ var uploadDate: OffsetDateTime? = null,
@ColumnInfo(name = StreamEntity.STREAM_IS_UPLOAD_DATE_APPROXIMATION)
var isUploadDateApproximation: Boolean? = null,
diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt
index d13f5cc2d13..defcb7acf5a 100644
--- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt
+++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt
@@ -6,8 +6,7 @@ import androidx.room.Ignore
import androidx.room.Index
import androidx.room.PrimaryKey
import java.io.Serializable
-import java.util.Calendar
-import java.util.Date
+import java.time.OffsetDateTime
import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_SERVICE_ID
import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_TABLE
import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_URL
@@ -55,18 +54,17 @@ data class StreamEntity(
var textualUploadDate: String? = null,
@ColumnInfo(name = STREAM_UPLOAD_DATE)
- var uploadDate: Date? = null,
+ var uploadDate: OffsetDateTime? = null,
@ColumnInfo(name = STREAM_IS_UPLOAD_DATE_APPROXIMATION)
var isUploadDateApproximation: Boolean? = null
) : Serializable {
-
@Ignore
constructor(item: StreamInfoItem) : this(
serviceId = item.serviceId, url = item.url, title = item.name,
streamType = item.streamType, duration = item.duration, uploader = item.uploaderName,
thumbnailUrl = item.thumbnailUrl, viewCount = item.viewCount,
- textualUploadDate = item.textualUploadDate, uploadDate = item.uploadDate?.date()?.time,
+ textualUploadDate = item.textualUploadDate, uploadDate = item.uploadDate?.offsetDateTime(),
isUploadDateApproximation = item.uploadDate?.isApproximation
)
@@ -75,7 +73,7 @@ data class StreamEntity(
serviceId = info.serviceId, url = info.url, title = info.name,
streamType = info.streamType, duration = info.duration, uploader = info.uploaderName,
thumbnailUrl = info.thumbnailUrl, viewCount = info.viewCount,
- textualUploadDate = info.textualUploadDate, uploadDate = info.uploadDate?.date()?.time,
+ textualUploadDate = info.textualUploadDate, uploadDate = info.uploadDate?.offsetDateTime(),
isUploadDateApproximation = info.uploadDate?.isApproximation
)
@@ -95,8 +93,7 @@ data class StreamEntity(
if (viewCount != null) item.viewCount = viewCount as Long
item.textualUploadDate = textualUploadDate
item.uploadDate = uploadDate?.let {
- DateWrapper(Calendar.getInstance().apply { time = it }, isUploadDateApproximation
- ?: false)
+ DateWrapper(it, isUploadDateApproximation ?: false)
}
return item
diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
index 17d079d50ea..93398d990af 100644
--- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
+++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
@@ -646,7 +646,7 @@ private void prepareSelectedDownload() {
mainStorage = mainStorageVideo; // subtitle & video files go together
format = subtitleStreamsAdapter.getItem(selectedSubtitleIndex).getFormat();
mime = format.mimeType;
- filename += format == MediaFormat.TTML ? MediaFormat.SRT.suffix : format.suffix;
+ filename += (format == MediaFormat.TTML ? MediaFormat.SRT : format).suffix;
break;
default:
throw new RuntimeException("No stream selected");
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
index 28a67173b15..67bc51c58c7 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
@@ -80,6 +80,7 @@
import org.schabi.newpipe.fragments.list.comments.CommentsFragment;
import org.schabi.newpipe.fragments.list.videos.RelatedVideosFragment;
import org.schabi.newpipe.local.dialog.PlaylistAppendDialog;
+import org.schabi.newpipe.local.dialog.PlaylistCreationDialog;
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.player.BasePlayer;
import org.schabi.newpipe.player.MainPlayer;
@@ -109,6 +110,7 @@
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.Objects;
import java.util.concurrent.TimeUnit;
import icepick.State;
@@ -127,7 +129,7 @@
import static org.schabi.newpipe.player.playqueue.PlayQueueItem.RECOVERY_UNSET;
import static org.schabi.newpipe.util.AnimationUtils.animateView;
-public class VideoDetailFragment
+public final class VideoDetailFragment
extends BaseStateFragment
implements BackPressable,
SharedPreferences.OnSharedPreferenceChangeListener,
@@ -135,7 +137,7 @@ public class VideoDetailFragment
View.OnLongClickListener,
PlayerServiceExtendedEventListener,
OnKeyDownListener {
- public static final String AUTO_PLAY = "auto_play";
+ public static final String KEY_SWITCHING_PLAYERS = "switching_players";
private static final int RELATED_STREAMS_UPDATE_FLAG = 0x1;
private static final int COMMENTS_UPDATE_FLAG = 0x2;
@@ -166,19 +168,23 @@ public class VideoDetailFragment
@State
protected int serviceId = Constants.NO_SERVICE_ID;
@State
- protected String name;
+ @NonNull
+ protected String title = "";
@State
- protected String url;
- protected static PlayQueue playQueue;
+ @Nullable
+ protected String url = null;
+ @Nullable
+ protected PlayQueue playQueue = null;
@State
int bottomSheetState = BottomSheetBehavior.STATE_EXPANDED;
@State
protected boolean autoPlayEnabled = true;
- private static StreamInfo currentInfo;
+ @Nullable
+ private StreamInfo currentInfo = null;
private Disposable currentWorker;
@NonNull
- private CompositeDisposable disposables = new CompositeDisposable();
+ private final CompositeDisposable disposables = new CompositeDisposable();
@Nullable
private Disposable positionSubscriber = null;
@@ -283,6 +289,7 @@ public void onServiceConnected(final VideoPlayerImpl connectedPlayer,
|| (currentInfo != null
&& isAutoplayEnabled()
&& player.getParentActivity() == null)) {
+ autoPlayEnabled = true; // forcefully start playing
openVideoPlayer();
}
}
@@ -297,8 +304,10 @@ public void onServiceDisconnected() {
/*////////////////////////////////////////////////////////////////////////*/
- public static VideoDetailFragment getInstance(final int serviceId, final String videoUrl,
- final String name, final PlayQueue queue) {
+ public static VideoDetailFragment getInstance(final int serviceId,
+ @Nullable final String videoUrl,
+ @NonNull final String name,
+ @Nullable final PlayQueue queue) {
final VideoDetailFragment instance = new VideoDetailFragment();
instance.setInitialData(serviceId, videoUrl, name, queue);
return instance;
@@ -443,8 +452,8 @@ public void onActivityResult(final int requestCode, final int resultCode, final
switch (requestCode) {
case ReCaptchaActivity.RECAPTCHA_REQUEST:
if (resultCode == Activity.RESULT_OK) {
- NavigationHelper
- .openVideoDetailFragment(getFM(), serviceId, url, name);
+ NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),
+ serviceId, url, title, null, false);
} else {
Log.e(TAG, "ReCaptcha failed");
}
@@ -482,8 +491,14 @@ public void onClick(final View v) {
break;
case R.id.detail_controls_playlist_append:
if (getFM() != null && currentInfo != null) {
- PlaylistAppendDialog.fromStreamInfo(currentInfo)
- .show(getFM(), TAG);
+
+ final PlaylistAppendDialog d = PlaylistAppendDialog.fromStreamInfo(currentInfo);
+ disposables.add(
+ PlaylistAppendDialog.onPlaylistFound(getContext(),
+ () -> d.show(getFM(), TAG),
+ () -> PlaylistCreationDialog.newInstance(d).show(getFM(), TAG)
+ )
+ );
}
break;
case R.id.detail_controls_download:
@@ -507,6 +522,7 @@ public void onClick(final View v) {
}
break;
case R.id.detail_thumbnail_root_layout:
+ autoPlayEnabled = true; // forcefully start playing
openVideoPlayer();
break;
case R.id.detail_title_root_layout:
@@ -523,6 +539,7 @@ public void onClick(final View v) {
player.hideControls(0, 0);
showSystemUi();
} else {
+ autoPlayEnabled = true; // forcefully start playing
openVideoPlayer();
}
@@ -784,7 +801,7 @@ public boolean onBackPressed() {
player.onPause();
}
restoreDefaultOrientation();
- setAutoplay(false);
+ setAutoPlay(false);
return true;
}
@@ -812,14 +829,11 @@ public boolean onBackPressed() {
}
private void setupFromHistoryItem(final StackItem item) {
- setAutoplay(false);
+ setAutoPlay(false);
hideMainPlayer();
- setInitialData(
- item.getServiceId(),
- item.getUrl(),
- !TextUtils.isEmpty(item.getTitle()) ? item.getTitle() : "",
- item.getPlayQueue());
+ setInitialData(item.getServiceId(), item.getUrl(),
+ item.getTitle() == null ? "" : item.getTitle(), item.getPlayQueue());
startLoading(false);
// Maybe an item was deleted in background activity
@@ -853,18 +867,17 @@ protected void doInitialLoadLogic() {
}
}
- public void selectAndLoadVideo(final int sid, final String videoUrl, final String title,
- final PlayQueue queue) {
- // Situation when user switches from players to main player.
- // All needed data is here, we can start watching
- if (this.playQueue != null && this.playQueue.equals(queue)) {
- openVideoPlayer();
- return;
- }
- setInitialData(sid, videoUrl, title, queue);
- if (player != null) {
+ public void selectAndLoadVideo(final int newServiceId,
+ @Nullable final String newUrl,
+ @NonNull final String newTitle,
+ @Nullable final PlayQueue newQueue) {
+ if (player != null && newQueue != null && playQueue != null
+ && !Objects.equals(newQueue.getItem(), playQueue.getItem())) {
+ // Preloading can be disabled since playback is surely being replaced.
player.disablePreloadingOfCurrentTrack();
}
+
+ setInitialData(newServiceId, newUrl, newTitle, newQueue);
startLoading(false, true);
}
@@ -949,7 +962,7 @@ private void runWorker(final boolean forceLoad, final boolean addToBackStack) {
playQueue = new SinglePlayQueue(result);
}
if (stack.isEmpty() || !stack.peek().getPlayQueue().equals(playQueue)) {
- stack.push(new StackItem(serviceId, url, name, playQueue));
+ stack.push(new StackItem(serviceId, url, title, playQueue));
}
}
if (isAutoplayEnabled()) {
@@ -970,7 +983,7 @@ private void initTabs() {
if (shouldShowComments()) {
pageAdapter.addFragment(
- CommentsFragment.getInstance(serviceId, url, name), COMMENTS_TAB_TAG);
+ CommentsFragment.getInstance(serviceId, url, title), COMMENTS_TAB_TAG);
}
if (showRelatedStreams && null == relatedStreamsLayout) {
@@ -1061,7 +1074,7 @@ private void openPopupPlayer(final boolean append) {
}
}
- private void openVideoPlayer() {
+ public void openVideoPlayer() {
if (PreferenceManager.getDefaultSharedPreferences(activity)
.getBoolean(this.getString(R.string.use_external_video_player_key), false)) {
showExternalPlaybackDialog();
@@ -1087,7 +1100,7 @@ private void openNormalBackgroundPlayer(final boolean append) {
private void openMainPlayer() {
if (playerService == null) {
- PlayerHolder.startService(App.getApp(), true, this);
+ PlayerHolder.startService(App.getApp(), autoPlayEnabled, this);
return;
}
if (currentInfo == null) {
@@ -1098,11 +1111,13 @@ private void openMainPlayer() {
// Video view can have elements visible from popup,
// We hide it here but once it ready the view will be shown in handleIntent()
- playerService.getView().setVisibility(View.GONE);
+ if (playerService.getView() != null) {
+ playerService.getView().setVisibility(View.GONE);
+ }
addVideoPlayerView();
final Intent playerIntent = NavigationHelper
- .getPlayerIntent(requireContext(), MainPlayer.class, queue, null, true);
+ .getPlayerIntent(requireContext(), MainPlayer.class, queue, true, autoPlayEnabled);
activity.startService(playerIntent);
}
@@ -1136,8 +1151,8 @@ private PlayQueue setupPlayQueueForIntent(final boolean append) {
// Utils
//////////////////////////////////////////////////////////////////////////*/
- public void setAutoplay(final boolean autoplay) {
- this.autoPlayEnabled = autoplay;
+ public void setAutoPlay(final boolean autoPlay) {
+ this.autoPlayEnabled = autoPlay;
}
private void startOnExternalPlayer(@NonNull final Context context,
@@ -1159,7 +1174,7 @@ private boolean isExternalPlayerEnabled() {
.getBoolean(getString(R.string.use_external_video_player_key), false);
}
- // This method overrides default behaviour when setAutoplay() is called.
+ // This method overrides default behaviour when setAutoPlay() is called.
// Don't auto play if the user selected an external player or disabled it in settings
private boolean isAutoplayEnabled() {
return autoPlayEnabled
@@ -1239,9 +1254,9 @@ public boolean onPreDraw() {
final DisplayMetrics metrics = getResources().getDisplayMetrics();
if (getView() != null) {
- final int height = isInMultiWindow()
- ? requireView().getHeight()
- : activity.getWindow().getDecorView().getHeight();
+ final int height = (isInMultiWindow()
+ ? requireView()
+ : activity.getWindow().getDecorView()).getHeight();
setHeightThumbnail(height, metrics);
getView().getViewTreeObserver().removeOnPreDrawListener(preDrawListener);
}
@@ -1262,9 +1277,9 @@ private void setHeightThumbnail() {
requireView().getViewTreeObserver().removeOnPreDrawListener(preDrawListener);
if (player != null && player.isFullscreen()) {
- final int height = isInMultiWindow()
- ? requireView().getHeight()
- : activity.getWindow().getDecorView().getHeight();
+ final int height = (isInMultiWindow()
+ ? requireView()
+ : activity.getWindow().getDecorView()).getHeight();
// Height is zero when the view is not yet displayed like after orientation change
if (height != 0) {
setHeightThumbnail(height, metrics);
@@ -1272,9 +1287,9 @@ private void setHeightThumbnail() {
requireView().getViewTreeObserver().addOnPreDrawListener(preDrawListener);
}
} else {
- final int height = isPortrait
- ? (int) (metrics.widthPixels / (16.0f / 9.0f))
- : (int) (metrics.heightPixels / 2.0f);
+ final int height = (int) (isPortrait
+ ? metrics.widthPixels / (16.0f / 9.0f)
+ : metrics.heightPixels / 2.0f);
setHeightThumbnail(height, metrics);
}
}
@@ -1295,12 +1310,14 @@ private void showContent() {
contentRootLayoutHiding.setVisibility(View.VISIBLE);
}
- protected void setInitialData(final int sid, final String u, final String title,
- final PlayQueue queue) {
- this.serviceId = sid;
- this.url = u;
- this.name = !TextUtils.isEmpty(title) ? title : "";
- this.playQueue = queue;
+ protected void setInitialData(final int newServiceId,
+ @Nullable final String newUrl,
+ @NonNull final String newTitle,
+ @Nullable final PlayQueue newPlayQueue) {
+ this.serviceId = newServiceId;
+ this.url = newUrl;
+ this.title = newTitle;
+ this.playQueue = newPlayQueue;
}
private void setErrorImage(final int imageResource) {
@@ -1393,7 +1410,7 @@ public void showLoading() {
animateView(detailPositionView, false, 100);
animateView(positionView, false, 50);
- videoTitleTextView.setText(name != null ? name : "");
+ videoTitleTextView.setText(title);
videoTitleTextView.setMaxLines(1);
animateView(videoTitleTextView, true, 0);
@@ -1438,7 +1455,7 @@ public void handleResult(@NonNull final StreamInfo info) {
}
}
animateView(thumbnailPlayButton, true, 200);
- videoTitleTextView.setText(name);
+ videoTitleTextView.setText(title);
if (!TextUtils.isEmpty(info.getSubChannelName())) {
displayBothUploaderAndSubChannel(info);
@@ -1520,7 +1537,7 @@ public void handleResult(@NonNull final StreamInfo info) {
if (info.getUploadDate() != null) {
videoUploadDateView.setText(Localization
- .localizeUploadDate(activity, info.getUploadDate().date().getTime()));
+ .localizeUploadDate(activity, info.getUploadDate().offsetDateTime()));
videoUploadDateView.setVisibility(View.VISIBLE);
} else {
videoUploadDateView.setText(null);
@@ -1563,7 +1580,8 @@ public void handleResult(@NonNull final StreamInfo info) {
}
private void hideAgeRestrictedContent() {
- showError(getString(R.string.restricted_video), false);
+ showError(getString(R.string.restricted_video,
+ getString(R.string.show_age_restricted_content_title)), false);
if (relatedStreamsLayout != null) { // tablet
relatedStreamsLayout.setVisibility(View.INVISIBLE);
@@ -1633,8 +1651,8 @@ protected boolean onError(final Throwable exception) {
return true;
}
- final int errorId = exception instanceof YoutubeStreamExtractor.DecryptException
- ? R.string.youtube_signature_decryption_error
+ final int errorId = exception instanceof YoutubeStreamExtractor.DeobfuscateException
+ ? R.string.youtube_signature_deobfuscation_error
: exception instanceof ExtractionException
? R.string.parsing_error
: R.string.general_error;
@@ -1727,31 +1745,33 @@ private void showPlaybackProgress(final long progress, final long duration) {
@Override
public void onQueueUpdate(final PlayQueue queue) {
playQueue = queue;
+ if (DEBUG) {
+ Log.d(TAG, "onQueueUpdate() called with: serviceId = ["
+ + serviceId + "], videoUrl = [" + url + "], name = ["
+ + title + "], playQueue = [" + playQueue + "]");
+ }
+
// This should be the only place where we push data to stack.
// It will allow to have live instance of PlayQueue with actual information about
// deleted/added items inside Channel/Playlist queue and makes possible to have
// a history of played items
- if ((stack.isEmpty() || !stack.peek().getPlayQueue().equals(queue)
- && queue.getItem() != null)) {
- stack.push(new StackItem(queue.getItem().getServiceId(),
- queue.getItem().getUrl(),
- queue.getItem().getTitle(),
- queue));
- } else {
- final StackItem stackWithQueue = findQueueInStack(queue);
- if (stackWithQueue != null) {
- // On every MainPlayer service's destroy() playQueue gets disposed and
- // no longer able to track progress. That's why we update our cached disposed
- // queue with the new one that is active and have the same history.
- // Without that the cached playQueue will have an old recovery position
- stackWithQueue.setPlayQueue(queue);
- }
+ @Nullable final StackItem stackPeek = stack.peek();
+ if (stackPeek != null && !stackPeek.getPlayQueue().equals(queue)) {
+ @Nullable final PlayQueueItem playQueueItem = queue.getItem();
+ if (playQueueItem != null) {
+ stack.push(new StackItem(playQueueItem.getServiceId(), playQueueItem.getUrl(),
+ playQueueItem.getTitle(), queue));
+ return;
+ } // else continue below
}
- if (DEBUG) {
- Log.d(TAG, "onQueueUpdate() called with: serviceId = ["
- + serviceId + "], videoUrl = [" + url + "], name = ["
- + name + "], playQueue = [" + playQueue + "]");
+ @Nullable final StackItem stackWithQueue = findQueueInStack(queue);
+ if (stackWithQueue != null) {
+ // On every MainPlayer service's destroy() playQueue gets disposed and
+ // no longer able to track progress. That's why we update our cached disposed
+ // queue with the new one that is active and have the same history.
+ // Without that the cached playQueue will have an old recovery position
+ stackWithQueue.setPlayQueue(queue);
}
}
@@ -1813,7 +1833,7 @@ public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) {
currentInfo = info;
setInitialData(info.getServiceId(), info.getUrl(), info.getName(), queue);
- setAutoplay(false);
+ setAutoPlay(false);
// Delay execution just because it freezes the main thread, and while playing
// next/previous video you see visual glitches
// (when non-vertical video goes after vertical video)
@@ -2027,7 +2047,7 @@ private void setupBrightness() {
private void checkLandscape() {
if ((!player.isPlaying() && player.getPlayQueue() != playQueue)
|| player.getPlayQueue() == null) {
- setAutoplay(true);
+ setAutoPlay(true);
}
player.checkLandscape();
@@ -2054,6 +2074,7 @@ private boolean wasCleared() {
return url == null;
}
+ @Nullable
private StackItem findQueueInStack(final PlayQueue queue) {
StackItem item = null;
final Iterator iterator = stack.descendingIterator();
@@ -2074,8 +2095,7 @@ private void replaceQueueIfUserConfirms(final Runnable onAllow) {
if (isClearingQueueConfirmationRequired(activity)
&& playerIsNotStopped()
&& activeQueue != null
- && !activeQueue.equals(playQueue)
- && activeQueue.getStreams().size() > 1) {
+ && !activeQueue.equals(playQueue)) {
showClearingQueueConfirmation(onAllow);
} else {
onAllow.run();
@@ -2277,10 +2297,10 @@ public void onSlide(@NonNull final View bottomSheet, final float slideOffset) {
});
}
- private void updateOverlayData(@Nullable final String title,
+ private void updateOverlayData(@Nullable final String overlayTitle,
@Nullable final String uploader,
@Nullable final String thumbnailUrl) {
- overlayTitleTextView.setText(TextUtils.isEmpty(title) ? "" : title);
+ overlayTitleTextView.setText(TextUtils.isEmpty(overlayTitle) ? "" : overlayTitle);
overlayChannelTextView.setText(TextUtils.isEmpty(uploader) ? "" : uploader);
overlayThumbnailImageView.setImageResource(R.drawable.dummy_thumbnail_dark);
if (!TextUtils.isEmpty(thumbnailUrl)) {
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java
index 37598eb1aec..41263bc34f5 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java
@@ -6,7 +6,6 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
-import androidx.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
@@ -15,6 +14,7 @@
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -29,6 +29,7 @@
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
import org.schabi.newpipe.info_list.InfoItemDialog;
import org.schabi.newpipe.info_list.InfoListAdapter;
+import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.OnClickGesture;
@@ -36,6 +37,8 @@
import org.schabi.newpipe.util.StreamDialogEntry;
import org.schabi.newpipe.views.SuperScrollLayoutManager;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Queue;
@@ -318,8 +321,9 @@ public void onScrolledDown(final RecyclerView recyclerView) {
private void onStreamSelected(final StreamInfoItem selectedItem) {
onItemSelected(selectedItem);
- NavigationHelper.openVideoDetailFragment(getFM(),
- selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName());
+ NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),
+ selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName(),
+ null, false);
}
protected void onScrollToBottom() {
@@ -336,21 +340,26 @@ protected void showStreamDialog(final StreamInfoItem item) {
return;
}
+ final ArrayList entries = new ArrayList<>();
+
+ if (PlayerHolder.getType() != null) {
+ entries.add(StreamDialogEntry.enqueue);
+ }
if (item.getStreamType() == StreamType.AUDIO_STREAM) {
- StreamDialogEntry.setEnabledEntries(
- StreamDialogEntry.enqueue_on_background,
+ entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.append_playlist,
- StreamDialogEntry.share);
- } else {
- StreamDialogEntry.setEnabledEntries(
- StreamDialogEntry.enqueue_on_background,
- StreamDialogEntry.enqueue_on_popup,
+ StreamDialogEntry.share
+ ));
+ } else {
+ entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.start_here_on_popup,
StreamDialogEntry.append_playlist,
- StreamDialogEntry.share);
+ StreamDialogEntry.share
+ ));
}
+ StreamDialogEntry.setEnabledEntries(entries);
new InfoItemDialog(activity, item, StreamDialogEntry.getCommands(context),
(dialog, which) -> StreamDialogEntry.clickOn(which, this, item)).show();
@@ -370,11 +379,7 @@ public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
final ActionBar supportActionBar = activity.getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setDisplayShowTitleEnabled(true);
- if (useAsFrontPage) {
- supportActionBar.setDisplayHomeAsUpEnabled(false);
- } else {
- supportActionBar.setDisplayHomeAsUpEnabled(true);
- }
+ supportActionBar.setDisplayHomeAsUpEnabled(!useAsFrontPage);
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
index 8902834e4e3..6ec818909ef 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
@@ -50,7 +50,6 @@
import org.schabi.newpipe.util.ThemeHelper;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -495,13 +494,12 @@ public void handleResult(@NonNull final ChannelInfo result) {
// handling ContentNotSupportedException not to show the error but an appropriate string
// so that crashes won't be sent uselessly and the user will understand what happened
- for (Iterator it = errors.iterator(); it.hasNext();) {
- final Throwable throwable = it.next();
+ errors.removeIf(throwable -> {
if (throwable instanceof ContentNotSupportedException) {
showContentNotSupported();
- it.remove();
}
- }
+ return throwable instanceof ContentNotSupportedException;
+ });
if (!errors.isEmpty()) {
showSnackBarError(errors, UserAction.REQUESTED_CHANNEL,
@@ -519,7 +517,7 @@ public void handleResult(@NonNull final ChannelInfo result) {
monitorSubscription(result);
headerPlayAllButton.setOnClickListener(view -> NavigationHelper
- .playOnMainPlayer(activity, getPlayQueue(), true));
+ .playOnMainPlayer(activity, getPlayQueue()));
headerPopupButton.setOnClickListener(view -> NavigationHelper
.playOnPopupPlayer(activity, getPlayQueue(), false));
headerBackgroundButton.setOnClickListener(view -> NavigationHelper
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java
index 38594553b13..71b51f9a13f 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java
@@ -33,6 +33,7 @@
import org.schabi.newpipe.fragments.list.BaseListInfoFragment;
import org.schabi.newpipe.info_list.InfoItemDialog;
import org.schabi.newpipe.local.playlist.RemotePlaylistManager;
+import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue;
import org.schabi.newpipe.report.ErrorActivity;
@@ -46,6 +47,7 @@
import org.schabi.newpipe.util.ThemeHelper;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -151,25 +153,26 @@ protected void showStreamDialog(final StreamInfoItem item) {
return;
}
+ final ArrayList entries = new ArrayList<>();
+
+ if (PlayerHolder.getType() != null) {
+ entries.add(StreamDialogEntry.enqueue);
+ }
if (item.getStreamType() == StreamType.AUDIO_STREAM) {
- StreamDialogEntry.setEnabledEntries(
- StreamDialogEntry.enqueue_on_background,
+ entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.append_playlist,
- StreamDialogEntry.share);
- } else {
- StreamDialogEntry.setEnabledEntries(
- StreamDialogEntry.enqueue_on_background,
- StreamDialogEntry.enqueue_on_popup,
+ StreamDialogEntry.share
+ ));
+ } else {
+ entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.start_here_on_popup,
StreamDialogEntry.append_playlist,
- StreamDialogEntry.share);
-
- StreamDialogEntry.start_here_on_popup.setCustomAction((fragment, infoItem) ->
- NavigationHelper.playOnPopupPlayer(context,
- getPlayQueueStartingAt(infoItem), true));
+ StreamDialogEntry.share
+ ));
}
+ StreamDialogEntry.setEnabledEntries(entries);
StreamDialogEntry.start_here_on_background.setCustomAction((fragment, infoItem) ->
NavigationHelper.playOnBackgroundPlayer(context,
@@ -316,7 +319,7 @@ public void handleResult(@NonNull final PlaylistInfo result) {
.subscribe(getPlaylistBookmarkSubscriber());
headerPlayAllButton.setOnClickListener(view ->
- NavigationHelper.playOnMainPlayer(activity, getPlayQueue(), true));
+ NavigationHelper.playOnMainPlayer(activity, getPlayQueue()));
headerPopupButton.setOnClickListener(view ->
NavigationHelper.playOnPopupPlayer(activity, getPlayQueue(), false));
headerBackgroundButton.setOnClickListener(view ->
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
index 64eaf3a3d00..1e54176d476 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
@@ -5,8 +5,6 @@
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
-import androidx.core.text.HtmlCompat;
-import androidx.preference.PreferenceManager;
import android.text.Editable;
import android.text.Html;
import android.text.TextUtils;
@@ -30,6 +28,9 @@
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.TooltipCompat;
+import androidx.core.content.ContextCompat;
+import androidx.core.text.HtmlCompat;
+import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
@@ -49,9 +50,9 @@
import org.schabi.newpipe.local.history.HistoryRecordManager;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.report.UserAction;
-import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.AnimationUtils;
import org.schabi.newpipe.util.Constants;
+import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.ExceptionUtils;
import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.NavigationHelper;
@@ -60,7 +61,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Queue;
@@ -639,8 +639,8 @@ private void showKeyboardSearch() {
}
if (searchEditText.requestFocus()) {
- final InputMethodManager imm = (InputMethodManager) activity.getSystemService(
- Context.INPUT_METHOD_SERVICE);
+ final InputMethodManager imm = ContextCompat.getSystemService(activity,
+ InputMethodManager.class);
imm.showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
}
}
@@ -653,8 +653,8 @@ private void hideKeyboardSearch() {
return;
}
- final InputMethodManager imm = (InputMethodManager) activity
- .getSystemService(Context.INPUT_METHOD_SERVICE);
+ final InputMethodManager imm = ContextCompat.getSystemService(activity,
+ InputMethodManager.class);
imm.hideSoftInputFromWindow(searchEditText.getWindowToken(),
InputMethodManager.RESULT_UNCHANGED_SHOWN);
@@ -757,16 +757,9 @@ private void initSuggestionObserver() {
}
// Remove duplicates
- final Iterator iterator = networkResult.iterator();
- while (iterator.hasNext() && localResult.size() > 0) {
- final SuggestionItem next = iterator.next();
- for (final SuggestionItem item : localResult) {
- if (item.query.equals(next.query)) {
- iterator.remove();
- break;
- }
- }
- }
+ networkResult.removeIf(networkItem ->
+ localResult.stream().anyMatch(localItem ->
+ localItem.query.equals(networkItem.query)));
if (networkResult.size() > 0) {
result.addAll(networkResult);
diff --git a/app/src/main/java/org/schabi/newpipe/ktx/OffsetDateTime.kt b/app/src/main/java/org/schabi/newpipe/ktx/OffsetDateTime.kt
new file mode 100644
index 00000000000..b3df83c2546
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/ktx/OffsetDateTime.kt
@@ -0,0 +1,10 @@
+package org.schabi.newpipe.ktx
+
+import java.time.OffsetDateTime
+import java.time.ZoneId
+import java.util.Calendar
+import java.util.GregorianCalendar
+
+fun OffsetDateTime.toCalendar(zoneId: ZoneId = ZoneId.systemDefault()): Calendar {
+ return GregorianCalendar.from(if (zoneId != offset) atZoneSameInstant(zoneId) else toZonedDateTime())
+}
diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java
index 5b67f51da9d..da8902c083c 100644
--- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java
+++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java
@@ -26,7 +26,8 @@
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.OnClickGesture;
-import java.text.DateFormat;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
import java.util.ArrayList;
import java.util.List;
@@ -69,7 +70,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter localItems;
private final HistoryRecordManager recordManager;
- private final DateFormat dateFormat;
+ private final DateTimeFormatter dateTimeFormatter;
private boolean showFooter = false;
private boolean useGridVariant = false;
@@ -80,8 +81,8 @@ public LocalItemListAdapter(final Context context) {
recordManager = new HistoryRecordManager(context);
localItemBuilder = new LocalItemBuilder(context);
localItems = new ArrayList<>();
- dateFormat = DateFormat.getDateInstance(DateFormat.SHORT,
- Localization.getPreferredLocale(context));
+ dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
+ .withLocale(Localization.getPreferredLocale(context));
}
public void setSelectedListener(final OnClickGesture listener) {
@@ -303,7 +304,7 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int
}
((LocalItemHolder) holder)
- .updateFromItem(localItems.get(position), recordManager, dateFormat);
+ .updateFromItem(localItems.get(position), recordManager, dateTimeFormatter);
} else if (holder instanceof HeaderFooterHolder && position == 0 && header != null) {
((HeaderFooterHolder) holder).view = header;
} else if (holder instanceof HeaderFooterHolder && position == sizeConsideringHeader()
diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java
index 5bb03f531dd..7a63bee3053 100644
--- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java
+++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java
@@ -1,5 +1,6 @@
package org.schabi.newpipe.local.dialog;
+import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -29,6 +30,7 @@
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.disposables.Disposable;
public final class PlaylistAppendDialog extends PlaylistDialog {
private static final String TAG = PlaylistAppendDialog.class.getCanonicalName();
@@ -38,6 +40,23 @@ public final class PlaylistAppendDialog extends PlaylistDialog {
private CompositeDisposable playlistDisposables = new CompositeDisposable();
+ public static Disposable onPlaylistFound(
+ final Context context, final Runnable onSuccess, final Runnable onFailed
+ ) {
+ final LocalPlaylistManager playlistManager =
+ new LocalPlaylistManager(NewPipeDatabase.getInstance(context));
+
+ return playlistManager.hasPlaylists()
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(hasPlaylists -> {
+ if (hasPlaylists) {
+ onSuccess.run();
+ } else {
+ onFailed.run();
+ }
+ });
+ }
+
public static PlaylistAppendDialog fromStreamInfo(final StreamInfo info) {
final PlaylistAppendDialog dialog = new PlaylistAppendDialog();
dialog.setInfo(Collections.singletonList(new StreamEntity(info)));
@@ -136,11 +155,6 @@ public void openCreatePlaylistDialog() {
}
private void onPlaylistsReceived(@NonNull final List playlists) {
- if (playlists.isEmpty()) {
- openCreatePlaylistDialog();
- return;
- }
-
if (playlistAdapter != null && playlistRecyclerView != null) {
playlistAdapter.clearStreamItemList();
playlistAdapter.addItems(playlists);
diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java
index ff696664401..55782b45253 100644
--- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java
+++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java
@@ -26,6 +26,12 @@ public static PlaylistCreationDialog newInstance(final List stream
return dialog;
}
+ public static PlaylistCreationDialog newInstance(final PlaylistAppendDialog appendDialog) {
+ final PlaylistCreationDialog dialog = new PlaylistCreationDialog();
+ dialog.setInfo(appendDialog.getStreams());
+ return dialog;
+ }
+
/*//////////////////////////////////////////////////////////////////////////
// Dialog
//////////////////////////////////////////////////////////////////////////*/
diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt
index d319c9fa345..8bd8c198627 100644
--- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt
+++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt
@@ -7,8 +7,9 @@ import io.reactivex.Flowable
import io.reactivex.Maybe
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
-import java.util.Calendar
-import java.util.Date
+import java.time.LocalDate
+import java.time.OffsetDateTime
+import java.time.ZoneOffset
import org.schabi.newpipe.MainActivity.DEBUG
import org.schabi.newpipe.NewPipeDatabase
import org.schabi.newpipe.database.feed.model.FeedEntity
@@ -29,13 +30,8 @@ class FeedDatabaseManager(context: Context) {
/**
* Only items that are newer than this will be saved.
*/
- val FEED_OLDEST_ALLOWED_DATE: Calendar = Calendar.getInstance().apply {
- add(Calendar.WEEK_OF_YEAR, -13)
- set(Calendar.HOUR_OF_DAY, 0)
- set(Calendar.MINUTE, 0)
- set(Calendar.SECOND, 0)
- set(Calendar.MILLISECOND, 0)
- }
+ val FEED_OLDEST_ALLOWED_DATE: OffsetDateTime = LocalDate.now().minusWeeks(13)
+ .atStartOfDay().atOffset(ZoneOffset.UTC)
}
fun groups() = feedGroupTable.getAll()
@@ -50,12 +46,12 @@ class FeedDatabaseManager(context: Context) {
return streams.map> {
val items = ArrayList(it.size)
- for (streamEntity in it) items.add(streamEntity.toStreamInfoItem())
+ it.mapTo(items) { it.toStreamInfoItem() }
return@map items
}
}
- fun outdatedSubscriptions(outdatedThreshold: Date) = feedTable.getAllOutdated(outdatedThreshold)
+ fun outdatedSubscriptions(outdatedThreshold: OffsetDateTime) = feedTable.getAllOutdated(outdatedThreshold)
fun notLoadedCount(groupId: Long = FeedGroupEntity.GROUP_ALL_ID): Flowable {
return when (groupId) {
@@ -64,7 +60,7 @@ class FeedDatabaseManager(context: Context) {
}
}
- fun outdatedSubscriptionsForGroup(groupId: Long = FeedGroupEntity.GROUP_ALL_ID, outdatedThreshold: Date) =
+ fun outdatedSubscriptionsForGroup(groupId: Long = FeedGroupEntity.GROUP_ALL_ID, outdatedThreshold: OffsetDateTime) =
feedTable.getAllOutdatedForGroup(groupId, outdatedThreshold)
fun markAsOutdated(subscriptionId: Long) = feedTable
@@ -73,7 +69,7 @@ class FeedDatabaseManager(context: Context) {
fun upsertAll(
subscriptionId: Long,
items: List,
- oldestAllowedDate: Date = FEED_OLDEST_ALLOWED_DATE.time
+ oldestAllowedDate: OffsetDateTime = FEED_OLDEST_ALLOWED_DATE
) {
val itemsToInsert = ArrayList()
loop@ for (streamItem in items) {
@@ -81,7 +77,7 @@ class FeedDatabaseManager(context: Context) {
itemsToInsert += when {
uploadDate == null && streamItem.streamType == StreamType.LIVE_STREAM -> streamItem
- uploadDate != null && uploadDate.date().time >= oldestAllowedDate -> streamItem
+ uploadDate != null && uploadDate.offsetDateTime() >= oldestAllowedDate -> streamItem
else -> continue@loop
}
}
@@ -96,10 +92,11 @@ class FeedDatabaseManager(context: Context) {
feedTable.insertAll(feedEntities)
}
- feedTable.setLastUpdatedForSubscription(FeedLastUpdatedEntity(subscriptionId, Calendar.getInstance().time))
+ feedTable.setLastUpdatedForSubscription(FeedLastUpdatedEntity(subscriptionId,
+ OffsetDateTime.now(ZoneOffset.UTC)))
}
- fun removeOrphansOrOlderStreams(oldestAllowedDate: Date = FEED_OLDEST_ALLOWED_DATE.time) {
+ fun removeOrphansOrOlderStreams(oldestAllowedDate: OffsetDateTime = FEED_OLDEST_ALLOWED_DATE) {
feedTable.unlinkStreamsOlderThan(oldestAllowedDate)
streamTable.deleteOrphans()
}
@@ -159,7 +156,7 @@ class FeedDatabaseManager(context: Context) {
.observeOn(AndroidSchedulers.mainThread())
}
- fun oldestSubscriptionUpdate(groupId: Long): Flowable> {
+ fun oldestSubscriptionUpdate(groupId: Long): Flowable> {
return when (groupId) {
FeedGroupEntity.GROUP_ALL_ID -> feedTable.oldestSubscriptionUpdateFromAll()
else -> feedTable.oldestSubscriptionUpdate(groupId)
diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt
index 915bc3ec063..e4d10fb6142 100644
--- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt
+++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt
@@ -29,6 +29,8 @@ import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
+import androidx.core.os.bundleOf
+import androidx.core.view.isVisible
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.preference.PreferenceManager
@@ -253,11 +255,9 @@ class FeedFragment : BaseListFragment() {
oldestSubscriptionUpdate = loadedState.oldestUpdate
+ refresh_subtitle_text.isVisible = loadedState.notLoadedCount > 0
if (loadedState.notLoadedCount > 0) {
- refresh_subtitle_text.visibility = View.VISIBLE
refresh_subtitle_text.text = getString(R.string.feed_subscription_not_loaded_count, loadedState.notLoadedCount)
- } else {
- refresh_subtitle_text.visibility = View.GONE
}
if (loadedState.itemsErrors.isNotEmpty()) {
@@ -330,12 +330,7 @@ class FeedFragment : BaseListFragment() {
@JvmStatic
fun newInstance(groupId: Long = FeedGroupEntity.GROUP_ALL_ID, groupName: String? = null): FeedFragment {
val feedFragment = FeedFragment()
-
- feedFragment.arguments = Bundle().apply {
- putLong(KEY_GROUP_ID, groupId)
- putString(KEY_GROUP_NAME, groupName)
- }
-
+ feedFragment.arguments = bundleOf(KEY_GROUP_ID to groupId, KEY_GROUP_NAME to groupName)
return feedFragment
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt
index da2b5ffa4d2..13c3183da9e 100644
--- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt
+++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt
@@ -9,11 +9,11 @@ import io.reactivex.Flowable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Function4
import io.reactivex.schedulers.Schedulers
-import java.util.Calendar
-import java.util.Date
+import java.time.OffsetDateTime
import java.util.concurrent.TimeUnit
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
import org.schabi.newpipe.extractor.stream.StreamInfoItem
+import org.schabi.newpipe.ktx.toCalendar
import org.schabi.newpipe.local.feed.service.FeedEventManager
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ErrorResultEvent
import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent
@@ -41,7 +41,7 @@ class FeedViewModel(applicationContext: Context, val groupId: Long = FeedGroupEn
feedDatabaseManager.notLoadedCount(groupId),
feedDatabaseManager.oldestSubscriptionUpdate(groupId),
- Function4 { t1: FeedEventManager.Event, t2: List, t3: Long, t4: List ->
+ Function4 { t1: FeedEventManager.Event, t2: List, t3: Long, t4: List ->
return@Function4 CombineResultHolder(t1, t2, t3, t4.firstOrNull())
}
)
@@ -51,8 +51,7 @@ class FeedViewModel(applicationContext: Context, val groupId: Long = FeedGroupEn
.subscribe {
val (event, listFromDB, notLoadedCount, oldestUpdate) = it
- val oldestUpdateCalendar =
- oldestUpdate?.let { Calendar.getInstance().apply { time = it } }
+ val oldestUpdateCalendar = oldestUpdate?.toCalendar()
mutableStateLiveData.postValue(when (event) {
is IdleEvent -> FeedState.LoadedState(listFromDB, oldestUpdateCalendar, notLoadedCount)
@@ -71,5 +70,5 @@ class FeedViewModel(applicationContext: Context, val groupId: Long = FeedGroupEn
combineDisposable.dispose()
}
- private data class CombineResultHolder(val t1: FeedEventManager.Event, val t2: List, val t3: Long, val t4: Date?)
+ private data class CombineResultHolder(val t1: FeedEventManager.Event, val t2: List, val t3: Long, val t4: OffsetDateTime?)
}
diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt
index 0181f2711ad..8d3afbc7e49 100644
--- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt
+++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt
@@ -41,7 +41,8 @@ import io.reactivex.functions.Function
import io.reactivex.processors.PublishProcessor
import io.reactivex.schedulers.Schedulers
import java.io.IOException
-import java.util.Calendar
+import java.time.OffsetDateTime
+import java.time.ZoneOffset
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger
@@ -161,8 +162,8 @@ class FeedLoadService : Service() {
companion object {
fun wrapList(subscriptionId: Long, info: ListInfo): List {
val toReturn = ArrayList(info.errors.size)
- for (error in info.errors) {
- toReturn.add(RequestException(subscriptionId, info.serviceId.toString() + ":" + info.url, error))
+ info.errors.mapTo(toReturn) {
+ RequestException(subscriptionId, info.serviceId.toString() + ":" + info.url, it)
}
return toReturn
}
@@ -172,9 +173,7 @@ class FeedLoadService : Service() {
private fun startLoading(groupId: Long = FeedGroupEntity.GROUP_ALL_ID, useFeedExtractor: Boolean, thresholdOutdatedSeconds: Int) {
feedResultsHolder = ResultsHolder()
- val outdatedThreshold = Calendar.getInstance().apply {
- add(Calendar.SECOND, -thresholdOutdatedSeconds)
- }.time
+ val outdatedThreshold = OffsetDateTime.now(ZoneOffset.UTC).minusSeconds(thresholdOutdatedSeconds.toLong())
val subscriptions = when (groupId) {
FeedGroupEntity.GROUP_ALL_ID -> feedDatabaseManager.outdatedSubscriptions(outdatedThreshold)
diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java
index 01d909c3c17..7f5c4f7a70d 100644
--- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java
+++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java
@@ -20,9 +20,9 @@
import android.content.Context;
import android.content.SharedPreferences;
-import androidx.preference.PreferenceManager;
import androidx.annotation.NonNull;
+import androidx.preference.PreferenceManager;
import org.schabi.newpipe.NewPipeDatabase;
import org.schabi.newpipe.R;
@@ -44,9 +44,10 @@
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Date;
import java.util.List;
import io.reactivex.Completable;
@@ -85,7 +86,7 @@ public Maybe onViewed(final StreamInfo info) {
return Maybe.empty();
}
- final Date currentTime = new Date();
+ final OffsetDateTime currentTime = OffsetDateTime.now(ZoneOffset.UTC);
return Maybe.fromCallable(() -> database.runInTransaction(() -> {
final long streamId = streamTable.upsert(new StreamEntity(info));
final StreamHistoryEntity latestEntry = streamHistoryTable.getLatestEntry(streamId);
@@ -101,9 +102,11 @@ public Maybe onViewed(final StreamInfo info) {
})).subscribeOn(Schedulers.io());
}
- public Single deleteStreamHistory(final long streamId) {
- return Single.fromCallable(() -> streamHistoryTable.deleteStreamHistory(streamId))
- .subscribeOn(Schedulers.io());
+ public Completable deleteStreamHistoryAndState(final long streamId) {
+ return Completable.fromAction(() -> {
+ streamStateTable.deleteState(streamId);
+ streamHistoryTable.deleteStreamHistory(streamId);
+ }).subscribeOn(Schedulers.io());
}
public Single deleteWholeStreamHistory() {
@@ -111,7 +114,7 @@ public Single deleteWholeStreamHistory() {
.subscribeOn(Schedulers.io());
}
- public Single deleteCompelteStreamStateHistory() {
+ public Single deleteCompleteStreamStateHistory() {
return Single.fromCallable(streamStateTable::deleteAll)
.subscribeOn(Schedulers.io());
}
@@ -159,7 +162,7 @@ public Maybe onSearched(final int serviceId, final String search) {
return Maybe.empty();
}
- final Date currentTime = new Date();
+ final OffsetDateTime currentTime = OffsetDateTime.now(ZoneOffset.UTC);
final SearchHistoryEntry newEntry = new SearchHistoryEntry(currentTime, serviceId, search);
return Maybe.fromCallable(() -> database.runInTransaction(() -> {
diff --git a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java
index 887e5d12494..8cd4e4c7e29 100644
--- a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java
@@ -25,10 +25,12 @@
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.stream.StreamStatisticsEntry;
+import org.schabi.newpipe.database.stream.model.StreamEntity;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import org.schabi.newpipe.extractor.stream.StreamType;
import org.schabi.newpipe.info_list.InfoItemDialog;
import org.schabi.newpipe.local.BaseLocalListFragment;
+import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
import org.schabi.newpipe.report.ErrorActivity;
@@ -40,7 +42,9 @@
import org.schabi.newpipe.util.ThemeHelper;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import icepick.State;
@@ -66,18 +70,19 @@ public class StatisticsPlaylistFragment
private HistoryRecordManager recordManager;
private List processResult(final List results) {
+ final Comparator comparator;
switch (sortMode) {
case LAST_PLAYED:
- Collections.sort(results, (left, right) ->
- right.getLatestAccessDate().compareTo(left.getLatestAccessDate()));
- return results;
+ comparator = Comparator.comparing(StreamStatisticsEntry::getLatestAccessDate);
+ break;
case MOST_PLAYED:
- Collections.sort(results, (left, right) ->
- Long.compare(right.getWatchCount(), left.getWatchCount()));
- return results;
+ comparator = Comparator.comparingLong(StreamStatisticsEntry::getWatchCount);
+ break;
default:
return null;
}
+ Collections.sort(results, comparator.reversed());
+ return results;
}
///////////////////////////////////////////////////////////////////////////
@@ -145,11 +150,10 @@ protected void initListeners() {
@Override
public void selected(final LocalItem selectedItem) {
if (selectedItem instanceof StreamStatisticsEntry) {
- final StreamStatisticsEntry item = (StreamStatisticsEntry) selectedItem;
- NavigationHelper.openVideoDetailFragment(getFM(),
- item.getStreamEntity().getServiceId(),
- item.getStreamEntity().getUrl(),
- item.getStreamEntity().getTitle());
+ final StreamEntity item =
+ ((StreamStatisticsEntry) selectedItem).getStreamEntity();
+ NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),
+ item.getServiceId(), item.getUrl(), item.getTitle(), null, false);
}
}
@@ -321,7 +325,7 @@ public void handleResult(@NonNull final List result) {
}
headerPlayAllButton.setOnClickListener(view ->
- NavigationHelper.playOnMainPlayer(activity, getPlayQueue(), true));
+ NavigationHelper.playOnMainPlayer(activity, getPlayQueue()));
headerPopupButton.setOnClickListener(view ->
NavigationHelper.playOnPopupPlayer(activity, getPlayQueue(), false));
headerBackgroundButton.setOnClickListener(view ->
@@ -387,27 +391,28 @@ private void showStreamDialog(final StreamStatisticsEntry item) {
}
final StreamInfoItem infoItem = item.toStreamInfoItem();
+ final ArrayList entries = new ArrayList<>();
+
+ if (PlayerHolder.getType() != null) {
+ entries.add(StreamDialogEntry.enqueue);
+ }
if (infoItem.getStreamType() == StreamType.AUDIO_STREAM) {
- StreamDialogEntry.setEnabledEntries(
- StreamDialogEntry.enqueue_on_background,
+ entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.delete,
StreamDialogEntry.append_playlist,
- StreamDialogEntry.share);
- } else {
- StreamDialogEntry.setEnabledEntries(
- StreamDialogEntry.enqueue_on_background,
- StreamDialogEntry.enqueue_on_popup,
+ StreamDialogEntry.share
+ ));
+ } else {
+ entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.start_here_on_popup,
StreamDialogEntry.delete,
StreamDialogEntry.append_playlist,
- StreamDialogEntry.share);
-
- StreamDialogEntry.start_here_on_popup.setCustomAction((fragment, infoItemDuplicate) ->
- NavigationHelper
- .playOnPopupPlayer(context, getPlayQueueStartingAt(item), true));
+ StreamDialogEntry.share
+ ));
}
+ StreamDialogEntry.setEnabledEntries(entries);
StreamDialogEntry.start_here_on_background.setCustomAction((fragment, infoItemDuplicate) ->
NavigationHelper
@@ -420,14 +425,14 @@ private void showStreamDialog(final StreamStatisticsEntry item) {
}
private void deleteEntry(final int index) {
- final LocalItem infoItem = itemListAdapter.getItemsList()
- .get(index);
+ final LocalItem infoItem = itemListAdapter.getItemsList().get(index);
if (infoItem instanceof StreamStatisticsEntry) {
final StreamStatisticsEntry entry = (StreamStatisticsEntry) infoItem;
- final Disposable onDelete = recordManager.deleteStreamHistory(entry.getStreamId())
+ final Disposable onDelete = recordManager
+ .deleteStreamHistoryAndState(entry.getStreamId())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
- howManyDeleted -> {
+ () -> {
if (getView() != null) {
Snackbar.make(getView(), R.string.one_item_deleted,
Snackbar.LENGTH_SHORT).show();
diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java
index c4307fcde10..a093d93e1a0 100644
--- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java
+++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java
@@ -9,7 +9,7 @@
import org.schabi.newpipe.local.LocalItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
-import java.text.DateFormat;
+import java.time.format.DateTimeFormatter;
/*
* Created by Christian Schabesberger on 12.02.17.
@@ -41,7 +41,7 @@ public LocalItemHolder(final LocalItemBuilder itemBuilder, final int layoutId,
}
public abstract void updateFromItem(LocalItem item, HistoryRecordManager historyRecordManager,
- DateFormat dateFormat);
+ DateTimeFormatter dateTimeFormatter);
public void updateState(final LocalItem localItem,
final HistoryRecordManager historyRecordManager) { }
diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java
index 458b3c30eae..5560df3e068 100644
--- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java
+++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java
@@ -10,7 +10,7 @@
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.Localization;
-import java.text.DateFormat;
+import java.time.format.DateTimeFormatter;
public class LocalPlaylistItemHolder extends PlaylistItemHolder {
public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) {
@@ -25,7 +25,7 @@ public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final Vie
@Override
public void updateFromItem(final LocalItem localItem,
final HistoryRecordManager historyRecordManager,
- final DateFormat dateFormat) {
+ final DateTimeFormatter dateTimeFormatter) {
if (!(localItem instanceof PlaylistMetadataEntry)) {
return;
}
@@ -39,6 +39,6 @@ public void updateFromItem(final LocalItem localItem,
itemBuilder.displayImage(item.thumbnailUrl, itemThumbnailView,
ImageDisplayConstants.DISPLAY_PLAYLIST_OPTIONS);
- super.updateFromItem(localItem, historyRecordManager, dateFormat);
+ super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter);
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java
index 331149e17e6..f7cf6970878 100644
--- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java
+++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java
@@ -20,7 +20,7 @@
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.views.AnimatedProgressBar;
-import java.text.DateFormat;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
@@ -52,7 +52,7 @@ public LocalPlaylistStreamItemHolder(final LocalItemBuilder infoItemBuilder,
@Override
public void updateFromItem(final LocalItem localItem,
final HistoryRecordManager historyRecordManager,
- final DateFormat dateFormat) {
+ final DateTimeFormatter dateTimeFormatter) {
if (!(localItem instanceof PlaylistStreamEntry)) {
return;
}
@@ -104,7 +104,6 @@ public void updateFromItem(final LocalItem localItem,
return true;
});
- itemThumbnailView.setOnTouchListener(getOnTouchListener(item));
itemHandleView.setOnTouchListener(getOnTouchListener(item));
}
diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java
index 8eaef807a8a..f473b027739 100644
--- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java
+++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java
@@ -20,7 +20,7 @@
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.views.AnimatedProgressBar;
-import java.text.DateFormat;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
@@ -71,10 +71,10 @@ public LocalStatisticStreamItemHolder(final LocalItemBuilder itemBuilder,
}
private String getStreamInfoDetailLine(final StreamStatisticsEntry entry,
- final DateFormat dateFormat) {
+ final DateTimeFormatter dateTimeFormatter) {
final String watchCount = Localization
.shortViewCount(itemBuilder.getContext(), entry.getWatchCount());
- final String uploadDate = dateFormat.format(entry.getLatestAccessDate());
+ final String uploadDate = dateTimeFormatter.format(entry.getLatestAccessDate());
final String serviceName = NewPipe.getNameOfService(entry.getStreamEntity().getServiceId());
return Localization.concatenateStrings(watchCount, uploadDate, serviceName);
}
@@ -82,7 +82,7 @@ private String getStreamInfoDetailLine(final StreamStatisticsEntry entry,
@Override
public void updateFromItem(final LocalItem localItem,
final HistoryRecordManager historyRecordManager,
- final DateFormat dateFormat) {
+ final DateTimeFormatter dateTimeFormatter) {
if (!(localItem instanceof StreamStatisticsEntry)) {
return;
}
@@ -116,7 +116,7 @@ public void updateFromItem(final LocalItem localItem,
}
if (itemAdditionalDetails != null) {
- itemAdditionalDetails.setText(getStreamInfoDetailLine(item, dateFormat));
+ itemAdditionalDetails.setText(getStreamInfoDetailLine(item, dateTimeFormatter));
}
// Default thumbnail is shown on error, while loading and if the url is empty
diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java
index 11e3deb6738..e8c53161e9b 100644
--- a/app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java
+++ b/app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java
@@ -9,7 +9,7 @@
import org.schabi.newpipe.local.LocalItemBuilder;
import org.schabi.newpipe.local.history.HistoryRecordManager;
-import java.text.DateFormat;
+import java.time.format.DateTimeFormatter;
public abstract class PlaylistItemHolder extends LocalItemHolder {
public final ImageView itemThumbnailView;
@@ -34,7 +34,7 @@ public PlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGrou
@Override
public void updateFromItem(final LocalItem localItem,
final HistoryRecordManager historyRecordManager,
- final DateFormat dateFormat) {
+ final DateTimeFormatter dateTimeFormatter) {
itemView.setOnClickListener(view -> {
if (itemBuilder.getOnItemSelectedListener() != null) {
itemBuilder.getOnItemSelectedListener().selected(localItem);
diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java
index a47d61d2f72..a39e3cecb5b 100644
--- a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java
+++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java
@@ -11,7 +11,7 @@
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.Localization;
-import java.text.DateFormat;
+import java.time.format.DateTimeFormatter;
public class RemotePlaylistItemHolder extends PlaylistItemHolder {
public RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder,
@@ -27,7 +27,7 @@ public RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder,
@Override
public void updateFromItem(final LocalItem localItem,
final HistoryRecordManager historyRecordManager,
- final DateFormat dateFormat) {
+ final DateTimeFormatter dateTimeFormatter) {
if (!(localItem instanceof PlaylistRemoteEntity)) {
return;
}
@@ -48,6 +48,6 @@ public void updateFromItem(final LocalItem localItem,
itemBuilder.displayImage(item.getThumbnailUrl(), itemThumbnailView,
ImageDisplayConstants.DISPLAY_PLAYLIST_OPTIONS);
- super.updateFromItem(localItem, historyRecordManager, dateFormat);
+ super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter);
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java
index 3b66fd73f14..71df07a4b50 100644
--- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java
@@ -30,12 +30,14 @@
import org.schabi.newpipe.database.LocalItem;
import org.schabi.newpipe.database.history.model.StreamHistoryEntry;
import org.schabi.newpipe.database.playlist.PlaylistStreamEntry;
+import org.schabi.newpipe.database.stream.model.StreamEntity;
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import org.schabi.newpipe.extractor.stream.StreamType;
import org.schabi.newpipe.info_list.InfoItemDialog;
import org.schabi.newpipe.local.BaseLocalListFragment;
import org.schabi.newpipe.local.history.HistoryRecordManager;
+import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
import org.schabi.newpipe.report.UserAction;
@@ -45,6 +47,7 @@
import org.schabi.newpipe.util.StreamDialogEntry;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -176,10 +179,10 @@ protected void initListeners() {
@Override
public void selected(final LocalItem selectedItem) {
if (selectedItem instanceof PlaylistStreamEntry) {
- final PlaylistStreamEntry item = (PlaylistStreamEntry) selectedItem;
- NavigationHelper.openVideoDetailFragment(getFM(),
- item.getStreamEntity().getServiceId(), item.getStreamEntity().getUrl(),
- item.getStreamEntity().getTitle());
+ final StreamEntity item =
+ ((PlaylistStreamEntry) selectedItem).getStreamEntity();
+ NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),
+ item.getServiceId(), item.getUrl(), item.getTitle(), null, false);
}
}
@@ -492,7 +495,7 @@ public void handleResult(@NonNull final List result) {
setVideoCount(itemListAdapter.getItemsList().size());
headerPlayAllButton.setOnClickListener(view ->
- NavigationHelper.playOnMainPlayer(activity, getPlayQueue(), true));
+ NavigationHelper.playOnMainPlayer(activity, getPlayQueue()));
headerPopupButton.setOnClickListener(view ->
NavigationHelper.playOnPopupPlayer(activity, getPlayQueue(), false));
headerBackgroundButton.setOnClickListener(view ->
@@ -756,29 +759,30 @@ protected void showStreamItemDialog(final PlaylistStreamEntry item) {
}
final StreamInfoItem infoItem = item.toStreamInfoItem();
+ final ArrayList entries = new ArrayList<>();
+
+ if (PlayerHolder.getType() != null) {
+ entries.add(StreamDialogEntry.enqueue);
+ }
if (infoItem.getStreamType() == StreamType.AUDIO_STREAM) {
- StreamDialogEntry.setEnabledEntries(
- StreamDialogEntry.enqueue_on_background,
+ entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.set_as_playlist_thumbnail,
StreamDialogEntry.delete,
StreamDialogEntry.append_playlist,
- StreamDialogEntry.share);
- } else {
- StreamDialogEntry.setEnabledEntries(
- StreamDialogEntry.enqueue_on_background,
- StreamDialogEntry.enqueue_on_popup,
+ StreamDialogEntry.share
+ ));
+ } else {
+ entries.addAll(Arrays.asList(
StreamDialogEntry.start_here_on_background,
StreamDialogEntry.start_here_on_popup,
StreamDialogEntry.set_as_playlist_thumbnail,
StreamDialogEntry.delete,
StreamDialogEntry.append_playlist,
- StreamDialogEntry.share);
-
- StreamDialogEntry.start_here_on_popup.setCustomAction(
- (fragment, infoItemDuplicate) -> NavigationHelper.
- playOnPopupPlayer(context, getPlayQueueStartingAt(item), true));
+ StreamDialogEntry.share
+ ));
}
+ StreamDialogEntry.setEnabledEntries(entries);
StreamDialogEntry.start_here_on_background.setCustomAction((fragment, infoItemDuplicate) ->
NavigationHelper.playOnBackgroundPlayer(context,
diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java
index 2dec53fae44..d6101eb1d90 100644
--- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java
+++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java
@@ -126,4 +126,10 @@ private Maybe modifyPlaylist(final long playlistId,
}).subscribeOn(Schedulers.io());
}
+ public Maybe hasPlaylists() {
+ return playlistTable.getCount()
+ .firstElement()
+ .map(count -> count > 0)
+ .subscribeOn(Schedulers.io());
+ }
}
diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt
index 5e9b6b6a49d..28ffa626560 100644
--- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt
+++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt
@@ -1,17 +1,19 @@
package org.schabi.newpipe.local.subscription.dialog
import android.app.Dialog
-import android.content.Context
import android.os.Bundle
import android.os.Parcelable
-import android.text.Editable
import android.text.TextUtils
-import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.Toast
+import androidx.core.content.getSystemService
+import androidx.core.os.bundleOf
+import androidx.core.view.isGone
+import androidx.core.view.isVisible
+import androidx.core.widget.doOnTextChanged
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
@@ -191,16 +193,11 @@ class FeedGroupDialog : DialogFragment(), BackPressable {
}
group_name_input_container.error = null
- group_name_input.addTextChangedListener(object : TextWatcher {
- override fun afterTextChanged(s: Editable?) {}
- override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
-
- override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
- if (group_name_input_container.isErrorEnabled && !s.isNullOrBlank()) {
- group_name_input_container.error = null
- }
+ group_name_input.doOnTextChanged { text, _, _, _ ->
+ if (group_name_input_container.isErrorEnabled && !text.isNullOrBlank()) {
+ group_name_input_container.error = null
}
- })
+ }
confirm_button.setOnClickListener { handlePositiveButton() }
@@ -242,15 +239,11 @@ class FeedGroupDialog : DialogFragment(), BackPressable {
}
}
- toolbar_search_edit_text.addTextChangedListener(object : TextWatcher {
- override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) = Unit
- override fun afterTextChanged(s: Editable) = Unit
- override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
- val newQuery: String = toolbar_search_edit_text.text.toString()
- subscriptionsCurrentSearchQuery = newQuery
- viewModel.filterSubscriptionsBy(newQuery)
- }
- })
+ toolbar_search_edit_text.doOnTextChanged { _, _, _, _ ->
+ val newQuery: String = toolbar_search_edit_text.text.toString()
+ subscriptionsCurrentSearchQuery = newQuery
+ viewModel.filterSubscriptionsBy(newQuery)
+ }
subscriptionGroupAdapter.setOnItemClickListener(subscriptionPickerItemListener)
}
@@ -414,21 +407,14 @@ class FeedGroupDialog : DialogFragment(), BackPressable {
else -> android.R.string.ok
})
- delete_button.visibility = when {
- currentScreen != InitialScreen -> View.GONE
- groupId == NO_GROUP_SELECTED -> View.GONE
- else -> View.VISIBLE
- }
+ delete_button.isGone = currentScreen != InitialScreen || groupId == NO_GROUP_SELECTED
hideKeyboard()
hideSearch()
}
private fun View.onlyVisibleIn(vararg screens: ScreenState) {
- visibility = when (currentScreen) {
- in screens -> View.VISIBLE
- else -> View.GONE
- }
+ isVisible = currentScreen in screens
}
/*///////////////////////////////////////////////////////////////////////////
@@ -459,7 +445,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable {
}
private val inputMethodManager by lazy {
- requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+ requireActivity().getSystemService()!!
}
private fun showKeyboardSearch() {
@@ -501,11 +487,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable {
fun newInstance(groupId: Long = NO_GROUP_SELECTED): FeedGroupDialog {
val dialog = FeedGroupDialog()
-
- dialog.arguments = Bundle().apply {
- putLong(KEY_GROUP_ID, groupId)
- }
-
+ dialog.arguments = bundleOf(KEY_GROUP_ID to groupId)
return dialog
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt
index e9a7e4eb70a..4b1a4df5e14 100644
--- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt
+++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt
@@ -37,8 +37,8 @@ class FeedGroupDialogViewModel(
BiFunction { t1: String, t2: Boolean -> Filter(t1, t2) }
)
.distinctUntilChanged()
- .switchMap { filter ->
- subscriptionManager.getSubscriptions(groupId, filter.query, filter.showOnlyUngrouped)
+ .switchMap { (query, showOnlyUngrouped) ->
+ subscriptionManager.getSubscriptions(groupId, query, showOnlyUngrouped)
}.map { list -> list.map { PickerSubscriptionItem(it) } }
private val mutableGroupLiveData = MutableLiveData()
diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt
index 32493225610..142bba433f8 100644
--- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt
+++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt
@@ -1,9 +1,8 @@
package org.schabi.newpipe.local.subscription.item
-import android.view.View.GONE
import android.view.View.OnClickListener
-import android.view.View.VISIBLE
import androidx.annotation.DrawableRes
+import androidx.core.view.isVisible
import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder
import com.xwray.groupie.kotlinandroidextensions.Item
import kotlinx.android.synthetic.main.header_with_menu_item.header_menu_item
@@ -47,6 +46,6 @@ class HeaderWithMenuItem(
}
private fun updateMenuItemVisibility(viewHolder: GroupieViewHolder) {
- viewHolder.header_menu_item.visibility = if (showMenuItem) VISIBLE else GONE
+ viewHolder.header_menu_item.isVisible = showMenuItem
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt
index 7d33da71f3a..df84c115a78 100644
--- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt
+++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt
@@ -1,6 +1,7 @@
package org.schabi.newpipe.local.subscription.item
import android.view.View
+import androidx.core.view.isVisible
import com.nostra13.universalimageloader.core.ImageLoader
import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder
import com.xwray.groupie.kotlinandroidextensions.Item
@@ -25,7 +26,7 @@ data class PickerSubscriptionItem(
viewHolder.thumbnail_view, ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS)
viewHolder.title_view.text = subscriptionEntity.name
- viewHolder.selected_highlight.visibility = if (isSelected) View.VISIBLE else View.GONE
+ viewHolder.selected_highlight.isVisible = isSelected
}
override fun unbind(viewHolder: GroupieViewHolder) {
diff --git a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayerActivity.java
index 0e5222f5e5f..2fc710fb0b3 100644
--- a/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayerActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/player/BackgroundPlayerActivity.java
@@ -2,11 +2,8 @@
import android.content.Intent;
import android.view.Menu;
-import android.view.MenuItem;
import org.schabi.newpipe.R;
-import org.schabi.newpipe.util.NavigationHelper;
-import org.schabi.newpipe.util.PermissionHelper;
public final class BackgroundPlayerActivity extends ServicePlayerActivity {
@@ -46,31 +43,6 @@ public int getPlayerOptionMenuResource() {
return R.menu.menu_play_queue_bg;
}
- @Override
- public boolean onPlayerOptionSelected(final MenuItem item) {
- if (item.getItemId() == R.id.action_switch_popup) {
-
- if (!PermissionHelper.isPopupEnabled(this)) {
- PermissionHelper.showPopupEnablementToast(this);
- return true;
- }
-
- this.player.setRecovery();
- NavigationHelper.playOnPopupPlayer(
- getApplicationContext(), player.playQueue, this.player.isPlaying());
- return true;
- }
-
- if (item.getItemId() == R.id.action_switch_background) {
- this.player.setRecovery();
- NavigationHelper.playOnBackgroundPlayer(
- getApplicationContext(), player.playQueue, this.player.isPlaying());
- return true;
- }
-
- return false;
- }
-
@Override
public void setupMenu(final Menu menu) {
if (player == null) {
diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java
index 70f2e158b9f..1355f428561 100644
--- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java
+++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java
@@ -125,7 +125,7 @@ public abstract class BasePlayer implements
@NonNull
public static final String RESUME_PLAYBACK = "resume_playback";
@NonNull
- public static final String START_PAUSED = "start_paused";
+ public static final String PLAY_WHEN_READY = "play_when_ready";
@NonNull
public static final String SELECT_ON_APPEND = "select_on_append";
@NonNull
@@ -224,7 +224,7 @@ public void onReceive(final Context ctx, final Intent intent) {
this.dataSource = new PlayerDataSource(context, userAgent, bandwidthMeter);
final TrackSelection.Factory trackSelectionFactory = PlayerHelper
- .getQualitySelector(context);
+ .getQualitySelector();
this.trackSelector = new CustomTrackSelector(context, trackSelectionFactory);
this.loadControl = new LoadController();
@@ -302,6 +302,7 @@ public void handleIntent(final Intent intent) {
final boolean samePlayQueue = playQueue != null && playQueue.equals(queue);
final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode());
+ final boolean playWhenReady = intent.getBooleanExtra(PLAY_WHEN_READY, true);
final boolean isMuted = intent
.getBooleanExtra(IS_MUTED, simpleExoPlayer != null && isMuted());
@@ -327,16 +328,20 @@ public void handleIntent(final Intent intent) {
simpleExoPlayer.retry();
}
simpleExoPlayer.seekTo(playQueue.getIndex(), queue.getItem().getRecoveryPosition());
- return;
+ simpleExoPlayer.setPlayWhenReady(playWhenReady);
- } else if (samePlayQueue && !playQueue.isDisposed() && simpleExoPlayer != null) {
+ } else if (simpleExoPlayer != null
+ && samePlayQueue
+ && playQueue != null
+ && !playQueue.isDisposed()) {
// Do not re-init the same PlayQueue. Save time
// Player can have state = IDLE when playback is stopped or failed
// and we should retry() in this case
if (simpleExoPlayer.getPlaybackState() == Player.STATE_IDLE) {
simpleExoPlayer.retry();
}
- return;
+ simpleExoPlayer.setPlayWhenReady(playWhenReady);
+
} else if (intent.getBooleanExtra(RESUME_PLAYBACK, false)
&& isPlaybackResumeEnabled()
&& !samePlayQueue) {
@@ -351,7 +356,7 @@ && isPlaybackResumeEnabled()
state -> {
queue.setRecovery(queue.getIndex(), state.getProgressTime());
initPlayback(queue, repeatMode, playbackSpeed, playbackPitch,
- playbackSkipSilence, true, isMuted);
+ playbackSkipSilence, playWhenReady, isMuted);
},
error -> {
if (DEBUG) {
@@ -359,24 +364,22 @@ && isPlaybackResumeEnabled()
}
// In case any error we can start playback without history
initPlayback(queue, repeatMode, playbackSpeed, playbackPitch,
- playbackSkipSilence, true, isMuted);
+ playbackSkipSilence, playWhenReady, isMuted);
},
() -> {
// Completed but not found in history
initPlayback(queue, repeatMode, playbackSpeed, playbackPitch,
- playbackSkipSilence, true, isMuted);
+ playbackSkipSilence, playWhenReady, isMuted);
}
);
databaseUpdateReactor.add(stateLoader);
- return;
}
+ } else {
+ // Good to go...
+ // In a case of equal PlayQueues we can re-init old one but only when it is disposed
+ initPlayback(samePlayQueue ? playQueue : queue, repeatMode, playbackSpeed,
+ playbackPitch, playbackSkipSilence, playWhenReady, isMuted);
}
- // Good to go...
- // In a case of equal PlayQueues we can re-init old one but only when it is disposed
- initPlayback(samePlayQueue ? playQueue : queue, repeatMode,
- playbackSpeed, playbackPitch, playbackSkipSilence,
- !intent.getBooleanExtra(START_PAUSED, false),
- isMuted);
}
private PlaybackParameters retrievePlaybackParametersFromPreferences() {
diff --git a/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java
index c7fbb444b40..63f6a400ef7 100644
--- a/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java
+++ b/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java
@@ -30,6 +30,9 @@
import android.view.ViewGroup;
import android.view.WindowManager;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
+
import org.schabi.newpipe.R;
import org.schabi.newpipe.util.ThemeHelper;
@@ -91,7 +94,7 @@ public void onCreate() {
Log.d(TAG, "onCreate() called");
}
assureCorrectAppLanguage(this);
- windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
+ windowManager = ContextCompat.getSystemService(this, WindowManager.class);
ThemeHelper.setTheme(this);
createView();
@@ -223,12 +226,13 @@ boolean isLandscape() {
// DisplayMetrics from activity context knows about MultiWindow feature
// while DisplayMetrics from app context doesn't
final DisplayMetrics metrics = (playerImpl != null
- && playerImpl.getParentActivity() != null)
- ? playerImpl.getParentActivity().getResources().getDisplayMetrics()
- : getResources().getDisplayMetrics();
+ && playerImpl.getParentActivity() != null
+ ? playerImpl.getParentActivity().getResources()
+ : getResources()).getDisplayMetrics();
return metrics.heightPixels < metrics.widthPixels;
}
+ @Nullable
public View getView() {
if (playerImpl == null) {
return null;
@@ -238,7 +242,7 @@ public View getView() {
}
public void removeViewFromParent() {
- if (getView().getParent() != null) {
+ if (getView() != null && getView().getParent() != null) {
if (playerImpl.getParentActivity() != null) {
// This means view was added to fragment
final ViewGroup parent = (ViewGroup) getView().getParent();
diff --git a/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java
index 370631116a2..62f1d5dc2ae 100644
--- a/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java
+++ b/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java
@@ -116,10 +116,14 @@ private synchronized NotificationCompat.Builder createNotification(
.setMediaSession(player.mediaSessionManager.getSessionToken())
.setShowActionsInCompactView(compactSlots))
.setPriority(NotificationCompat.PRIORITY_HIGH)
- .setSmallIcon(R.drawable.ic_newpipe_triangle_white)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
- .setColor(ContextCompat.getColor(player.context, R.color.gray))
.setCategory(NotificationCompat.CATEGORY_TRANSPORT)
+ .setShowWhen(false)
+ .setSmallIcon(R.drawable.ic_newpipe_triangle_white)
+ .setColor(ContextCompat.getColor(player.context, R.color.dark_background_color))
+ .setColorized(player.sharedPreferences.getBoolean(
+ player.context.getString(R.string.notification_colorize_key),
+ true))
.setDeleteIntent(PendingIntent.getBroadcast(player.context, NOTIFICATION_ID,
new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT));
@@ -148,7 +152,10 @@ private synchronized void updateNotification(final VideoPlayerImpl player) {
@SuppressLint("RestrictedApi")
boolean shouldUpdateBufferingSlot() {
- if (notificationBuilder.mActions.size() < 3) {
+ if (notificationBuilder == null) {
+ // if there is no notification active, there is no point in updating it
+ return false;
+ } else if (notificationBuilder.mActions.size() < 3) {
// this should never happen, but let's make sure notification actions are populated
return true;
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java
index 0ffd7f5949d..ad4c603cdbc 100644
--- a/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/player/ServicePlayerActivity.java
@@ -27,12 +27,11 @@
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
-import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
-import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
import org.schabi.newpipe.local.dialog.PlaylistAppendDialog;
+import org.schabi.newpipe.local.dialog.PlaylistCreationDialog;
import org.schabi.newpipe.player.event.PlayerEventListener;
import org.schabi.newpipe.player.helper.PlaybackParameterDialog;
import org.schabi.newpipe.player.playqueue.PlayQueue;
@@ -41,9 +40,9 @@
import org.schabi.newpipe.player.playqueue.PlayQueueItemBuilder;
import org.schabi.newpipe.player.playqueue.PlayQueueItemHolder;
import org.schabi.newpipe.player.playqueue.PlayQueueItemTouchCallback;
-import org.schabi.newpipe.util.Constants;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
+import org.schabi.newpipe.util.PermissionHelper;
import org.schabi.newpipe.util.ThemeHelper;
import java.util.Collections;
@@ -112,9 +111,8 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
public abstract int getPlayerOptionMenuResource();
- public abstract boolean onPlayerOptionSelected(MenuItem item);
-
public abstract void setupMenu(Menu m);
+
////////////////////////////////////////////////////////////////////////////
// Activity Lifecycle
////////////////////////////////////////////////////////////////////////////
@@ -186,12 +184,22 @@ public boolean onOptionsItemSelected(final MenuItem item) {
return true;
case R.id.action_switch_main:
this.player.setRecovery();
- getApplicationContext().startActivity(
- getSwitchIntent(MainActivity.class, MainPlayer.PlayerType.VIDEO)
- .putExtra(BasePlayer.START_PAUSED, !this.player.isPlaying()));
+ NavigationHelper.playOnMainPlayer(this, player.getPlayQueue(), true);
+ return true;
+ case R.id.action_switch_popup:
+ if (PermissionHelper.isPopupEnabled(this)) {
+ this.player.setRecovery();
+ NavigationHelper.playOnPopupPlayer(this, player.playQueue, true);
+ } else {
+ PermissionHelper.showPopupEnablementToast(this);
+ }
+ return true;
+ case R.id.action_switch_background:
+ this.player.setRecovery();
+ NavigationHelper.playOnBackgroundPlayer(this, player.playQueue, true);
return true;
}
- return onPlayerOptionSelected(item) || super.onOptionsItemSelected(item);
+ return super.onOptionsItemSelected(item);
}
@Override
@@ -200,24 +208,6 @@ protected void onDestroy() {
unbind();
}
- protected Intent getSwitchIntent(final Class clazz, final MainPlayer.PlayerType playerType) {
- return NavigationHelper.getPlayerIntent(getApplicationContext(), clazz,
- this.player.getPlayQueue(), this.player.getRepeatMode(),
- this.player.getPlaybackSpeed(), this.player.getPlaybackPitch(),
- this.player.getPlaybackSkipSilence(),
- null,
- true,
- !this.player.isPlaying(),
- this.player.isMuted())
- .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- .putExtra(Constants.KEY_LINK_TYPE, StreamingService.LinkType.STREAM)
- .putExtra(Constants.KEY_URL, this.player.getVideoUrl())
- .putExtra(Constants.KEY_TITLE, this.player.getVideoTitle())
- .putExtra(Constants.KEY_SERVICE_ID,
- this.player.getCurrentMetadata().getMetadata().getServiceId())
- .putExtra(VideoPlayer.PLAYER_TYPE, playerType);
- }
-
////////////////////////////////////////////////////////////////////////////
// Service Connection
////////////////////////////////////////////////////////////////////////////
@@ -366,7 +356,9 @@ private void buildItemPopupMenu(final PlayQueueItem item, final View view) {
final MenuItem detail = popupMenu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 1,
Menu.NONE, R.string.play_queue_stream_detail);
detail.setOnMenuItemClickListener(menuItem -> {
- onOpenDetail(item.getServiceId(), item.getUrl(), item.getTitle());
+ // playQueue is null since we don't want any queue change
+ NavigationHelper.openVideoDetail(this, item.getServiceId(), item.getUrl(),
+ item.getTitle(), null, false);
return true;
});
@@ -453,11 +445,6 @@ public void onStartDrag(final PlayQueueItemHolder viewHolder) {
};
}
- private void onOpenDetail(final int serviceId, final String videoUrl,
- final String videoTitle) {
- NavigationHelper.openVideoDetail(this, serviceId, videoUrl, videoTitle);
- }
-
private void scrollToSelected() {
if (player == null) {
return;
@@ -571,8 +558,13 @@ private void appendAllToPlaylist() {
}
private void openPlaylistAppendDialog(final List playlist) {
- PlaylistAppendDialog.fromPlayQueueItems(playlist)
- .show(getSupportFragmentManager(), getTag());
+ final PlaylistAppendDialog d = PlaylistAppendDialog.fromPlayQueueItems(playlist);
+
+ PlaylistAppendDialog.onPlaylistFound(getApplicationContext(),
+ () -> d.show(getSupportFragmentManager(), getTag()),
+ () -> PlaylistCreationDialog.newInstance(d)
+ .show(getSupportFragmentManager(), getTag()
+ ));
}
////////////////////////////////////////////////////////////////////////////
@@ -742,11 +734,10 @@ private void onMaybeMuteChanged() {
//2) Icon change accordingly to current App Theme
// using rootView.getContext() because getApplicationContext() didn't work
- item.setIcon(player.isMuted()
- ? ThemeHelper.resolveResourceIdFromAttr(rootView.getContext(),
- R.attr.ic_volume_off)
- : ThemeHelper.resolveResourceIdFromAttr(rootView.getContext(),
- R.attr.ic_volume_up));
+ item.setIcon(ThemeHelper.resolveResourceIdFromAttr(rootView.getContext(),
+ player.isMuted()
+ ? R.attr.ic_volume_off
+ : R.attr.ic_volume_up));
}
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java
index f1bbc731206..5b4b987a4fb 100644
--- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java
+++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java
@@ -32,8 +32,6 @@
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
-import android.view.DisplayCutout;
-import androidx.preference.PreferenceManager;
import android.provider.Settings;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -60,8 +58,13 @@
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.content.res.AppCompatResources;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.DisplayCutoutCompat;
+import androidx.core.view.ViewCompat;
+import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
+
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer;
@@ -72,9 +75,8 @@
import com.google.android.exoplayer2.ui.SubtitleView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.nostra13.universalimageloader.core.assist.FailReason;
-import org.schabi.newpipe.MainActivity;
+
import org.schabi.newpipe.R;
-import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.extractor.stream.VideoStream;
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
@@ -92,9 +94,8 @@
import org.schabi.newpipe.player.resolver.AudioPlaybackResolver;
import org.schabi.newpipe.player.resolver.MediaSourceTag;
import org.schabi.newpipe.player.resolver.VideoPlaybackResolver;
-import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.AnimationUtils;
-import org.schabi.newpipe.util.Constants;
+import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.KoreUtil;
import org.schabi.newpipe.util.ListHelper;
import org.schabi.newpipe.util.NavigationHelper;
@@ -102,7 +103,6 @@
import java.util.List;
-import static android.content.Context.WINDOW_SERVICE;
import static org.schabi.newpipe.player.MainPlayer.ACTION_CLOSE;
import static org.schabi.newpipe.player.MainPlayer.ACTION_FAST_FORWARD;
import static org.schabi.newpipe.player.MainPlayer.ACTION_FAST_REWIND;
@@ -257,7 +257,12 @@ public void handleIntent(final Intent intent) {
onQueueClosed();
// Android TV: without it focus will frame the whole player
playPauseButton.requestFocus();
- onPlay();
+
+ if (simpleExoPlayer.getPlayWhenReady()) {
+ onPlay();
+ } else {
+ onPause();
+ }
}
NavigationHelper.sendPlayerStartedEvent(service);
}
@@ -266,7 +271,7 @@ public void handleIntent(final Intent intent) {
super("MainPlayer" + TAG, service);
this.service = service;
this.shouldUpdateOnProgress = true;
- this.windowManager = (WindowManager) service.getSystemService(WINDOW_SERVICE);
+ this.windowManager = ContextCompat.getSystemService(service, WindowManager.class);
this.defaultPreferences = PreferenceManager.getDefaultSharedPreferences(service);
this.resolver = new AudioPlaybackResolver(context, dataSource);
}
@@ -475,16 +480,14 @@ public void onChange(final boolean selfChange) {
settingsContentObserver);
getRootView().addOnLayoutChangeListener(this);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
- queueLayout.setOnApplyWindowInsetsListener((view, windowInsets) -> {
- final DisplayCutout cutout = windowInsets.getDisplayCutout();
- if (cutout != null) {
- view.setPadding(cutout.getSafeInsetLeft(), cutout.getSafeInsetTop(),
- cutout.getSafeInsetRight(), cutout.getSafeInsetBottom());
- }
- return windowInsets;
- });
- }
+ ViewCompat.setOnApplyWindowInsetsListener(queueLayout, (view, windowInsets) -> {
+ final DisplayCutoutCompat cutout = windowInsets.getDisplayCutout();
+ if (cutout != null) {
+ view.setPadding(cutout.getSafeInsetLeft(), cutout.getSafeInsetTop(),
+ cutout.getSafeInsetRight(), cutout.getSafeInsetBottom());
+ }
+ return windowInsets;
+ });
// PlaybackControlRoot already consumed window insets but we should pass them to
// player_overlays too. Without it they will be off-centered
@@ -755,40 +758,6 @@ public void toggleFullscreen() {
setupScreenRotationButton();
}
- public void switchFromPopupToMain() {
- if (DEBUG) {
- Log.d(TAG, "switchFromPopupToMain() called");
- }
- if (!popupPlayerSelected() || simpleExoPlayer == null || getCurrentMetadata() == null) {
- return;
- }
-
- setRecovery();
- service.removeViewFromParent();
- final Intent intent = NavigationHelper.getPlayerIntent(
- service,
- MainActivity.class,
- this.getPlayQueue(),
- this.getRepeatMode(),
- this.getPlaybackSpeed(),
- this.getPlaybackPitch(),
- this.getPlaybackSkipSilence(),
- null,
- true,
- !isPlaying(),
- isMuted()
- );
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.putExtra(Constants.KEY_SERVICE_ID,
- getCurrentMetadata().getMetadata().getServiceId());
- intent.putExtra(Constants.KEY_LINK_TYPE, StreamingService.LinkType.STREAM);
- intent.putExtra(Constants.KEY_URL, getVideoUrl());
- intent.putExtra(Constants.KEY_TITLE, getVideoTitle());
- intent.putExtra(VideoDetailFragment.AUTO_PLAY, true);
- service.onDestroy();
- context.startActivity(intent);
- }
-
@Override
public void onClick(final View v) {
super.onClick(v);
@@ -816,7 +785,9 @@ public void onClick(final View v) {
} else if (v.getId() == openInBrowser.getId()) {
onOpenInBrowserClicked();
} else if (v.getId() == fullscreenButton.getId()) {
- switchFromPopupToMain();
+ setRecovery();
+ NavigationHelper.playOnMainPlayer(context, getPlayQueue(), true);
+ return;
} else if (v.getId() == screenRotationButton.getId()) {
// Only if it's not a vertical video or vertical video but in landscape with locked
// orientation a screen orientation can be changed automatically
@@ -2093,6 +2064,10 @@ public WindowManager.LayoutParams getPopupLayoutParams() {
return popupLayoutParams;
}
+ public MainPlayer.PlayerType getPlayerType() {
+ return playerType;
+ }
+
public float getScreenWidth() {
return screenWidth;
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt
new file mode 100644
index 00000000000..681c1b9af46
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt
@@ -0,0 +1,500 @@
+package org.schabi.newpipe.player.event
+
+import android.content.Context
+import android.os.Handler
+import android.util.Log
+import android.view.GestureDetector
+import android.view.MotionEvent
+import android.view.View
+import android.view.ViewConfiguration
+import org.schabi.newpipe.player.BasePlayer
+import org.schabi.newpipe.player.MainPlayer
+import org.schabi.newpipe.player.VideoPlayerImpl
+import org.schabi.newpipe.player.helper.PlayerHelper
+import org.schabi.newpipe.util.AnimationUtils
+import kotlin.math.abs
+import kotlin.math.hypot
+import kotlin.math.max
+
+/**
+ * Base gesture handling for [VideoPlayerImpl]
+ *
+ * This class contains the logic for the player gestures like View preparations
+ * and provides some abstract methods to make it easier separating the logic from the UI.
+ */
+abstract class BasePlayerGestureListener(
+ @JvmField
+ protected val playerImpl: VideoPlayerImpl,
+ @JvmField
+ protected val service: MainPlayer
+) : GestureDetector.SimpleOnGestureListener(), View.OnTouchListener {
+
+ // ///////////////////////////////////////////////////////////////////
+ // Abstract methods for VIDEO and POPUP
+ // ///////////////////////////////////////////////////////////////////
+
+ abstract fun onDoubleTap(event: MotionEvent, portion: DisplayPortion)
+
+ abstract fun onSingleTap(playerType: MainPlayer.PlayerType)
+
+ abstract fun onScroll(
+ playerType: MainPlayer.PlayerType,
+ portion: DisplayPortion,
+ initialEvent: MotionEvent,
+ movingEvent: MotionEvent,
+ distanceX: Float,
+ distanceY: Float
+ )
+
+ abstract fun onScrollEnd(playerType: MainPlayer.PlayerType, event: MotionEvent)
+
+ // ///////////////////////////////////////////////////////////////////
+ // Abstract methods for POPUP (exclusive)
+ // ///////////////////////////////////////////////////////////////////
+
+ abstract fun onPopupResizingStart()
+
+ abstract fun onPopupResizingEnd()
+
+ private var initialPopupX: Int = -1
+ private var initialPopupY: Int = -1
+
+ private var isMovingInMain = false
+ private var isMovingInPopup = false
+ private var isResizing = false
+
+ private val tossFlingVelocity = PlayerHelper.getTossFlingVelocity()
+
+ // [popup] initial coordinates and distance between fingers
+ private var initPointerDistance = -1.0
+ private var initFirstPointerX = -1f
+ private var initFirstPointerY = -1f
+ private var initSecPointerX = -1f
+ private var initSecPointerY = -1f
+
+ // ///////////////////////////////////////////////////////////////////
+ // onTouch implementation
+ // ///////////////////////////////////////////////////////////////////
+
+ override fun onTouch(v: View, event: MotionEvent): Boolean {
+ return if (playerImpl.popupPlayerSelected()) {
+ onTouchInPopup(v, event)
+ } else {
+ onTouchInMain(v, event)
+ }
+ }
+
+ private fun onTouchInMain(v: View, event: MotionEvent): Boolean {
+ playerImpl.gestureDetector.onTouchEvent(event)
+ if (event.action == MotionEvent.ACTION_UP && isMovingInMain) {
+ isMovingInMain = false
+ onScrollEnd(MainPlayer.PlayerType.VIDEO, event)
+ }
+ return when (event.action) {
+ MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> {
+ v.parent.requestDisallowInterceptTouchEvent(playerImpl.isFullscreen)
+ true
+ }
+ MotionEvent.ACTION_UP -> {
+ v.parent.requestDisallowInterceptTouchEvent(false)
+ false
+ }
+ else -> true
+ }
+ }
+
+ private fun onTouchInPopup(v: View, event: MotionEvent): Boolean {
+ playerImpl.gestureDetector.onTouchEvent(event)
+ if (event.pointerCount == 2 && !isMovingInPopup && !isResizing) {
+ if (DEBUG) {
+ Log.d(TAG, "onTouch() 2 finger pointer detected, enabling resizing.")
+ }
+ onPopupResizingStart()
+
+ // record coordinates of fingers
+ initFirstPointerX = event.getX(0)
+ initFirstPointerY = event.getY(0)
+ initSecPointerX = event.getX(1)
+ initSecPointerY = event.getY(1)
+ // record distance between fingers
+ initPointerDistance = Math.hypot(initFirstPointerX - initSecPointerX.toDouble(),
+ initFirstPointerY - initSecPointerY.toDouble())
+
+ isResizing = true
+ }
+ if (event.action == MotionEvent.ACTION_MOVE && !isMovingInPopup && isResizing) {
+ if (DEBUG) {
+ Log.d(TAG, "onTouch() ACTION_MOVE > v = [$v], e1.getRaw = [${event.rawX}" +
+ ", ${event.rawY}]")
+ }
+ return handleMultiDrag(event)
+ }
+ if (event.action == MotionEvent.ACTION_UP) {
+ if (DEBUG) {
+ Log.d(TAG, "onTouch() ACTION_UP > v = [$v], e1.getRaw = [${event.rawX}" +
+ ", ${event.rawY}]")
+ }
+ if (isMovingInPopup) {
+ isMovingInPopup = false
+ onScrollEnd(MainPlayer.PlayerType.POPUP, event)
+ }
+ if (isResizing) {
+ isResizing = false
+
+ initPointerDistance = (-1).toDouble()
+ initFirstPointerX = (-1).toFloat()
+ initFirstPointerY = (-1).toFloat()
+ initSecPointerX = (-1).toFloat()
+ initSecPointerY = (-1).toFloat()
+
+ onPopupResizingEnd()
+ playerImpl.changeState(playerImpl.currentState)
+ }
+ if (!playerImpl.isPopupClosing) {
+ playerImpl.savePositionAndSize()
+ }
+ }
+
+ v.performClick()
+ return true
+ }
+
+ private fun handleMultiDrag(event: MotionEvent): Boolean {
+ if (initPointerDistance != -1.0 && event.pointerCount == 2) {
+ // get the movements of the fingers
+ val firstPointerMove = hypot(event.getX(0) - initFirstPointerX.toDouble(),
+ event.getY(0) - initFirstPointerY.toDouble())
+ val secPointerMove = hypot(event.getX(1) - initSecPointerX.toDouble(),
+ event.getY(1) - initSecPointerY.toDouble())
+
+ // minimum threshold beyond which pinch gesture will work
+ val minimumMove = ViewConfiguration.get(service).scaledTouchSlop
+
+ if (max(firstPointerMove, secPointerMove) > minimumMove) {
+ // calculate current distance between the pointers
+ val currentPointerDistance = hypot(event.getX(0) - event.getX(1).toDouble(),
+ event.getY(0) - event.getY(1).toDouble())
+
+ val popupWidth = playerImpl.popupWidth.toDouble()
+ // change co-ordinates of popup so the center stays at the same position
+ val newWidth = popupWidth * currentPointerDistance / initPointerDistance
+ initPointerDistance = currentPointerDistance
+ playerImpl.popupLayoutParams.x += ((popupWidth - newWidth) / 2.0).toInt()
+
+ playerImpl.checkPopupPositionBounds()
+ playerImpl.updateScreenSize()
+
+ playerImpl.updatePopupSize(
+ Math.min(playerImpl.screenWidth.toDouble(), newWidth).toInt(),
+ -1)
+ return true
+ }
+ }
+ return false
+ }
+
+ // ///////////////////////////////////////////////////////////////////
+ // Simple gestures
+ // ///////////////////////////////////////////////////////////////////
+
+ override fun onDown(e: MotionEvent): Boolean {
+ if (DEBUG)
+ Log.d(TAG, "onDown called with e = [$e]")
+
+ if (isDoubleTapping && isDoubleTapEnabled) {
+ doubleTapControls?.onDoubleTapProgressDown(getDisplayPortion(e))
+ return true
+ }
+
+ return if (playerImpl.popupPlayerSelected())
+ onDownInPopup(e)
+ else
+ true
+ }
+
+ private fun onDownInPopup(e: MotionEvent): Boolean {
+ // Fix popup position when the user touch it, it may have the wrong one
+ // because the soft input is visible (the draggable area is currently resized).
+ playerImpl.updateScreenSize()
+ playerImpl.checkPopupPositionBounds()
+ initialPopupX = playerImpl.popupLayoutParams.x
+ initialPopupY = playerImpl.popupLayoutParams.y
+ playerImpl.popupWidth = playerImpl.popupLayoutParams.width.toFloat()
+ playerImpl.popupHeight = playerImpl.popupLayoutParams.height.toFloat()
+ return super.onDown(e)
+ }
+
+ override fun onDoubleTap(e: MotionEvent): Boolean {
+ if (DEBUG)
+ Log.d(TAG, "onDoubleTap called with e = [$e]")
+
+ onDoubleTap(e, getDisplayPortion(e))
+ return true
+ }
+
+ override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
+ if (DEBUG)
+ Log.d(TAG, "onSingleTapConfirmed() called with: e = [$e]")
+
+ if (isDoubleTapping)
+ return true
+
+ if (playerImpl.popupPlayerSelected()) {
+ if (playerImpl.player == null)
+ return false
+
+ onSingleTap(MainPlayer.PlayerType.POPUP)
+ return true
+ } else {
+ super.onSingleTapConfirmed(e)
+ if (playerImpl.currentState == BasePlayer.STATE_BLOCKED)
+ return true
+
+ onSingleTap(MainPlayer.PlayerType.VIDEO)
+ }
+ return true
+ }
+
+ override fun onLongPress(e: MotionEvent?) {
+ if (playerImpl.popupPlayerSelected()) {
+ playerImpl.updateScreenSize()
+ playerImpl.checkPopupPositionBounds()
+ playerImpl.updatePopupSize(playerImpl.screenWidth.toInt(), -1)
+ }
+ }
+
+ override fun onScroll(
+ initialEvent: MotionEvent,
+ movingEvent: MotionEvent,
+ distanceX: Float,
+ distanceY: Float
+ ): Boolean {
+ return if (playerImpl.popupPlayerSelected()) {
+ onScrollInPopup(initialEvent, movingEvent, distanceX, distanceY)
+ } else {
+ onScrollInMain(initialEvent, movingEvent, distanceX, distanceY)
+ }
+ }
+
+ override fun onFling(
+ e1: MotionEvent?,
+ e2: MotionEvent?,
+ velocityX: Float,
+ velocityY: Float
+ ): Boolean {
+ return if (playerImpl.popupPlayerSelected()) {
+ val absVelocityX = abs(velocityX)
+ val absVelocityY = abs(velocityY)
+ if (absVelocityX.coerceAtLeast(absVelocityY) > tossFlingVelocity) {
+ if (absVelocityX > tossFlingVelocity) {
+ playerImpl.popupLayoutParams.x = velocityX.toInt()
+ }
+ if (absVelocityY > tossFlingVelocity) {
+ playerImpl.popupLayoutParams.y = velocityY.toInt()
+ }
+ playerImpl.checkPopupPositionBounds()
+ playerImpl.windowManager
+ .updateViewLayout(playerImpl.rootView, playerImpl.popupLayoutParams)
+ return true
+ }
+ return false
+ } else {
+ true
+ }
+ }
+
+ private fun onScrollInMain(
+ initialEvent: MotionEvent,
+ movingEvent: MotionEvent,
+ distanceX: Float,
+ distanceY: Float
+ ): Boolean {
+
+ if (!playerImpl.isFullscreen) {
+ return false
+ }
+
+ val isTouchingStatusBar: Boolean = initialEvent.y < getStatusBarHeight(service)
+ val isTouchingNavigationBar: Boolean = (initialEvent.y
+ > playerImpl.rootView.height - getNavigationBarHeight(service))
+ if (isTouchingStatusBar || isTouchingNavigationBar) {
+ return false
+ }
+
+ val insideThreshold = abs(movingEvent.y - initialEvent.y) <= MOVEMENT_THRESHOLD
+ if (!isMovingInMain && (insideThreshold || abs(distanceX) > abs(distanceY)) ||
+ playerImpl.currentState == BasePlayer.STATE_COMPLETED) {
+ return false
+ }
+
+ isMovingInMain = true
+
+ onScroll(MainPlayer.PlayerType.VIDEO, getDisplayHalfPortion(initialEvent),
+ initialEvent, movingEvent, distanceX, distanceY)
+
+ return true
+ }
+
+ private fun onScrollInPopup(
+ initialEvent: MotionEvent,
+ movingEvent: MotionEvent,
+ distanceX: Float,
+ distanceY: Float
+ ): Boolean {
+
+ if (isResizing) {
+ return super.onScroll(initialEvent, movingEvent, distanceX, distanceY)
+ }
+
+ if (!isMovingInPopup) {
+ AnimationUtils.animateView(playerImpl.closeOverlayButton, true, 200)
+ }
+
+ isMovingInPopup = true
+
+ val diffX: Float = (movingEvent.rawX - initialEvent.rawX)
+ var posX: Float = (initialPopupX + diffX)
+ val diffY: Float = (movingEvent.rawY - initialEvent.rawY)
+ var posY: Float = (initialPopupY + diffY)
+
+ if (posX > playerImpl.screenWidth - playerImpl.popupWidth) {
+ posX = (playerImpl.screenWidth - playerImpl.popupWidth)
+ } else if (posX < 0) {
+ posX = 0f
+ }
+
+ if (posY > playerImpl.screenHeight - playerImpl.popupHeight) {
+ posY = (playerImpl.screenHeight - playerImpl.popupHeight)
+ } else if (posY < 0) {
+ posY = 0f
+ }
+
+ playerImpl.popupLayoutParams.x = posX.toInt()
+ playerImpl.popupLayoutParams.y = posY.toInt()
+
+ onScroll(MainPlayer.PlayerType.POPUP, getDisplayHalfPortion(initialEvent),
+ initialEvent, movingEvent, distanceX, distanceY)
+
+ playerImpl.windowManager
+ .updateViewLayout(playerImpl.rootView, playerImpl.popupLayoutParams)
+ return true
+ }
+
+ // ///////////////////////////////////////////////////////////////////
+ // Multi double tapping
+ // ///////////////////////////////////////////////////////////////////
+
+ var doubleTapControls: DoubleTapListener? = null
+ private set
+
+ val isDoubleTapEnabled: Boolean
+ get() = doubleTapDelay > 0
+
+ var isDoubleTapping = false
+ private set
+
+ fun doubleTapControls(listener: DoubleTapListener) = apply {
+ doubleTapControls = listener
+ }
+
+ private var doubleTapDelay = DOUBLE_TAP_DELAY
+ private val doubleTapHandler: Handler = Handler()
+ private val doubleTapRunnable = Runnable {
+ if (DEBUG)
+ Log.d(TAG, "doubleTapRunnable called")
+
+ isDoubleTapping = false
+ doubleTapControls?.onDoubleTapFinished()
+ }
+
+ fun startMultiDoubleTap(e: MotionEvent) {
+ if (!isDoubleTapping) {
+ if (DEBUG)
+ Log.d(TAG, "startMultiDoubleTap called with e = [$e]")
+
+ keepInDoubleTapMode()
+ doubleTapControls?.onDoubleTapStarted(getDisplayPortion(e))
+ }
+ }
+
+ fun keepInDoubleTapMode() {
+ if (DEBUG)
+ Log.d(TAG, "keepInDoubleTapMode called")
+
+ isDoubleTapping = true
+ doubleTapHandler.removeCallbacks(doubleTapRunnable)
+ doubleTapHandler.postDelayed(doubleTapRunnable, doubleTapDelay)
+ }
+
+ fun endMultiDoubleTap() {
+ if (DEBUG)
+ Log.d(TAG, "endMultiDoubleTap called")
+
+ isDoubleTapping = false
+ doubleTapHandler.removeCallbacks(doubleTapRunnable)
+ doubleTapControls?.onDoubleTapFinished()
+ }
+
+ fun enableMultiDoubleTap(enable: Boolean) = apply {
+ doubleTapDelay = if (enable) DOUBLE_TAP_DELAY else 0
+ }
+
+ // ///////////////////////////////////////////////////////////////////
+ // Utils
+ // ///////////////////////////////////////////////////////////////////
+
+ private fun getDisplayPortion(e: MotionEvent): DisplayPortion {
+ return if (playerImpl.playerType == MainPlayer.PlayerType.POPUP) {
+ when {
+ e.x < playerImpl.popupWidth / 3.0 -> DisplayPortion.LEFT
+ e.x > playerImpl.popupWidth * 2.0 / 3.0 -> DisplayPortion.RIGHT
+ else -> DisplayPortion.MIDDLE
+ }
+ } else /* MainPlayer.PlayerType.VIDEO */ {
+ when {
+ e.x < playerImpl.rootView.width / 3.0 -> DisplayPortion.LEFT
+ e.x > playerImpl.rootView.width * 2.0 / 3.0 -> DisplayPortion.RIGHT
+ else -> DisplayPortion.MIDDLE
+ }
+ }
+ }
+
+ // Currently needed for scrolling since there is no action more the middle portion
+ private fun getDisplayHalfPortion(e: MotionEvent): DisplayPortion {
+ return if (playerImpl.playerType == MainPlayer.PlayerType.POPUP) {
+ when {
+ e.x < playerImpl.popupWidth / 2.0 -> DisplayPortion.LEFT_HALF
+ else -> DisplayPortion.RIGHT_HALF
+ }
+ } else /* MainPlayer.PlayerType.VIDEO */ {
+ when {
+ e.x < playerImpl.rootView.width / 2.0 -> DisplayPortion.LEFT_HALF
+ else -> DisplayPortion.RIGHT_HALF
+ }
+ }
+ }
+
+ private fun getNavigationBarHeight(context: Context): Int {
+ val resId = context.resources
+ .getIdentifier("navigation_bar_height", "dimen", "android")
+ return if (resId > 0) {
+ context.resources.getDimensionPixelSize(resId)
+ } else 0
+ }
+
+ private fun getStatusBarHeight(context: Context): Int {
+ val resId = context.resources
+ .getIdentifier("status_bar_height", "dimen", "android")
+ return if (resId > 0) {
+ context.resources.getDimensionPixelSize(resId)
+ } else 0
+ }
+
+ companion object {
+ private const val TAG = "BasePlayerGestListener"
+ private val DEBUG = BasePlayer.DEBUG
+
+ private const val DOUBLE_TAP_DELAY = 550L
+ private const val MOVEMENT_THRESHOLD = 40
+ }
+}
diff --git a/app/src/main/java/org/schabi/newpipe/player/event/CustomBottomSheetBehavior.java b/app/src/main/java/org/schabi/newpipe/player/event/CustomBottomSheetBehavior.java
index 5405d01c174..26ecb187105 100644
--- a/app/src/main/java/org/schabi/newpipe/player/event/CustomBottomSheetBehavior.java
+++ b/app/src/main/java/org/schabi/newpipe/player/event/CustomBottomSheetBehavior.java
@@ -42,6 +42,14 @@ public boolean onInterceptTouchEvent(@NonNull final CoordinatorLayout parent,
return false;
}
+ // The interception listens for the child view with the id "fragment_player_holder",
+ // so the following two-finger gesture will be triggered only for the player view on
+ // portrait and for the top controls (visible) on landscape.
+ setSkipCollapsed(event.getPointerCount() == 2);
+ if (event.getPointerCount() == 2) {
+ return super.onInterceptTouchEvent(parent, child, event);
+ }
+
// Don't need to do anything if bottomSheet isn't expanded
if (getState() == BottomSheetBehavior.STATE_EXPANDED
&& event.getAction() == MotionEvent.ACTION_DOWN) {
diff --git a/app/src/main/java/org/schabi/newpipe/player/event/DisplayPortion.kt b/app/src/main/java/org/schabi/newpipe/player/event/DisplayPortion.kt
new file mode 100644
index 00000000000..f15e42897ca
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/player/event/DisplayPortion.kt
@@ -0,0 +1,5 @@
+package org.schabi.newpipe.player.event
+
+enum class DisplayPortion {
+ LEFT, MIDDLE, RIGHT, LEFT_HALF, RIGHT_HALF
+}
diff --git a/app/src/main/java/org/schabi/newpipe/player/event/DoubleTapListener.kt b/app/src/main/java/org/schabi/newpipe/player/event/DoubleTapListener.kt
new file mode 100644
index 00000000000..84cfb9b8d5a
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/player/event/DoubleTapListener.kt
@@ -0,0 +1,7 @@
+package org.schabi.newpipe.player.event
+
+interface DoubleTapListener {
+ fun onDoubleTapStarted(portion: DisplayPortion) {}
+ fun onDoubleTapProgressDown(portion: DisplayPortion) {}
+ fun onDoubleTapFinished() {}
+}
diff --git a/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java b/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java
index a2def2a64a0..fdea20775c2 100644
--- a/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java
+++ b/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java
@@ -1,16 +1,16 @@
package org.schabi.newpipe.player.event;
import android.app.Activity;
-import android.content.Context;
import android.util.Log;
-import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewConfiguration;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ProgressBar;
+
import androidx.appcompat.content.res.AppCompatResources;
+
+import org.jetbrains.annotations.NotNull;
import org.schabi.newpipe.R;
import org.schabi.newpipe.player.BasePlayer;
import org.schabi.newpipe.player.MainPlayer;
@@ -23,217 +23,116 @@
import static org.schabi.newpipe.util.AnimationUtils.Type.SCALE_AND_ALPHA;
import static org.schabi.newpipe.util.AnimationUtils.animateView;
+/**
+ * GestureListener for the player
+ *
+ * While {@link BasePlayerGestureListener} contains the logic behind the single gestures
+ * this class focuses on the visual aspect like hiding and showing the controls or changing
+ * volume/brightness during scrolling for specific events.
+ */
public class PlayerGestureListener
- extends GestureDetector.SimpleOnGestureListener
+ extends BasePlayerGestureListener
implements View.OnTouchListener {
private static final String TAG = ".PlayerGestureListener";
private static final boolean DEBUG = BasePlayer.DEBUG;
- private final VideoPlayerImpl playerImpl;
- private final MainPlayer service;
-
- private int initialPopupX;
- private int initialPopupY;
-
- private boolean isMovingInMain;
- private boolean isMovingInPopup;
-
- private boolean isResizing;
-
- private final int tossFlingVelocity;
-
private final boolean isVolumeGestureEnabled;
private final boolean isBrightnessGestureEnabled;
private final int maxVolume;
- private static final int MOVEMENT_THRESHOLD = 40;
-
- // [popup] initial coordinates and distance between fingers
- private double initPointerDistance = -1;
- private float initFirstPointerX = -1;
- private float initFirstPointerY = -1;
- private float initSecPointerX = -1;
- private float initSecPointerY = -1;
-
public PlayerGestureListener(final VideoPlayerImpl playerImpl, final MainPlayer service) {
- this.playerImpl = playerImpl;
- this.service = service;
- this.tossFlingVelocity = PlayerHelper.getTossFlingVelocity(service);
+ super(playerImpl, service);
isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(service);
isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(service);
maxVolume = playerImpl.getAudioReactor().getMaxVolume();
}
- /*//////////////////////////////////////////////////////////////////////////
- // Helpers
- //////////////////////////////////////////////////////////////////////////*/
-
- /*
- * Main and popup players' gesture listeners is too different.
- * So it will be better to have different implementations of them
- * */
- @Override
- public boolean onDoubleTap(final MotionEvent e) {
- if (DEBUG) {
- Log.d(TAG, "onDoubleTap() called with: e = [" + e + "]" + "rawXy = "
- + e.getRawX() + ", " + e.getRawY() + ", xy = " + e.getX() + ", " + e.getY());
- }
-
- if (playerImpl.popupPlayerSelected()) {
- return onDoubleTapInPopup(e);
- } else {
- return onDoubleTapInMain(e);
- }
- }
-
@Override
- public boolean onSingleTapConfirmed(final MotionEvent e) {
+ public void onDoubleTap(@NotNull final MotionEvent event,
+ @NotNull final DisplayPortion portion) {
if (DEBUG) {
- Log.d(TAG, "onSingleTapConfirmed() called with: e = [" + e + "]");
+ Log.d(TAG, "onDoubleTap called with playerType = ["
+ + playerImpl.getPlayerType() + "], portion = ["
+ + portion + "]");
}
-
- if (playerImpl.popupPlayerSelected()) {
- return onSingleTapConfirmedInPopup(e);
- } else {
- return onSingleTapConfirmedInMain(e);
- }
- }
-
- @Override
- public boolean onDown(final MotionEvent e) {
- if (DEBUG) {
- Log.d(TAG, "onDown() called with: e = [" + e + "]");
+ if (playerImpl.isSomePopupMenuVisible()) {
+ playerImpl.hideControls(0, 0);
}
- if (playerImpl.popupPlayerSelected()) {
- return onDownInPopup(e);
- } else {
- return true;
+ if (portion == DisplayPortion.LEFT) {
+ playerImpl.onFastRewind();
+ } else if (portion == DisplayPortion.MIDDLE) {
+ playerImpl.onPlayPause();
+ } else if (portion == DisplayPortion.RIGHT) {
+ playerImpl.onFastForward();
}
}
@Override
- public void onLongPress(final MotionEvent e) {
+ public void onSingleTap(@NotNull final MainPlayer.PlayerType playerType) {
if (DEBUG) {
- Log.d(TAG, "onLongPress() called with: e = [" + e + "]");
+ Log.d(TAG, "onSingleTap called with playerType = ["
+ + playerImpl.getPlayerType() + "]");
}
+ if (playerType == MainPlayer.PlayerType.POPUP) {
- if (playerImpl.popupPlayerSelected()) {
- onLongPressInPopup(e);
- }
- }
-
- @Override
- public boolean onScroll(final MotionEvent initialEvent, final MotionEvent movingEvent,
- final float distanceX, final float distanceY) {
- if (playerImpl.popupPlayerSelected()) {
- return onScrollInPopup(initialEvent, movingEvent, distanceX, distanceY);
- } else {
- return onScrollInMain(initialEvent, movingEvent, distanceX, distanceY);
- }
- }
+ if (playerImpl.isControlsVisible()) {
+ playerImpl.hideControls(100, 100);
+ } else {
+ playerImpl.getPlayPauseButton().requestFocus();
+ playerImpl.showControlsThenHide();
+ }
- @Override
- public boolean onFling(final MotionEvent e1, final MotionEvent e2,
- final float velocityX, final float velocityY) {
- if (DEBUG) {
- Log.d(TAG, "onFling() called with velocity: dX=["
- + velocityX + "], dY=[" + velocityY + "]");
- }
+ } else /* playerType == MainPlayer.PlayerType.VIDEO */ {
- if (playerImpl.popupPlayerSelected()) {
- return onFlingInPopup(e1, e2, velocityX, velocityY);
- } else {
- return true;
+ if (playerImpl.isControlsVisible()) {
+ playerImpl.hideControls(150, 0);
+ } else {
+ if (playerImpl.getCurrentState() == BasePlayer.STATE_COMPLETED) {
+ playerImpl.showControls(0);
+ } else {
+ playerImpl.showControlsThenHide();
+ }
+ }
}
}
@Override
- public boolean onTouch(final View v, final MotionEvent event) {
- /*if (DEBUG && false) {
- Log.d(TAG, "onTouch() called with: v = [" + v + "], event = [" + event + "]");
- }*/
-
- if (playerImpl.popupPlayerSelected()) {
- return onTouchInPopup(v, event);
- } else {
- return onTouchInMain(v, event);
- }
- }
-
-
- /*//////////////////////////////////////////////////////////////////////////
- // Main player listener
- //////////////////////////////////////////////////////////////////////////*/
-
- private boolean onDoubleTapInMain(final MotionEvent e) {
- if (e.getX() > playerImpl.getRootView().getWidth() * 2.0 / 3.0) {
- playerImpl.onFastForward();
- } else if (e.getX() < playerImpl.getRootView().getWidth() / 3.0) {
- playerImpl.onFastRewind();
- } else {
- playerImpl.getPlayPauseButton().performClick();
- }
-
- return true;
- }
-
-
- private boolean onSingleTapConfirmedInMain(final MotionEvent e) {
+ public void onScroll(@NotNull final MainPlayer.PlayerType playerType,
+ @NotNull final DisplayPortion portion,
+ @NotNull final MotionEvent initialEvent,
+ @NotNull final MotionEvent movingEvent,
+ final float distanceX, final float distanceY) {
if (DEBUG) {
- Log.d(TAG, "onSingleTapConfirmed() called with: e = [" + e + "]");
+ Log.d(TAG, "onScroll called with playerType = ["
+ + playerImpl.getPlayerType() + "], portion = ["
+ + portion + "]");
}
+ if (playerType == MainPlayer.PlayerType.VIDEO) {
+ if (portion == DisplayPortion.LEFT_HALF) {
+ onScrollMainBrightness(distanceX, distanceY);
- if (playerImpl.getCurrentState() == BasePlayer.STATE_BLOCKED) {
- return true;
- }
+ } else /* DisplayPortion.RIGHT_HALF */ {
+ onScrollMainVolume(distanceX, distanceY);
+ }
- if (playerImpl.isControlsVisible()) {
- playerImpl.hideControls(150, 0);
- } else {
- if (playerImpl.getCurrentState() == BasePlayer.STATE_COMPLETED) {
- playerImpl.showControls(0);
+ } else /* MainPlayer.PlayerType.POPUP */ {
+ final View closingOverlayView = playerImpl.getClosingOverlayView();
+ if (playerImpl.isInsideClosingRadius(movingEvent)) {
+ if (closingOverlayView.getVisibility() == View.GONE) {
+ animateView(closingOverlayView, true, 250);
+ }
} else {
- playerImpl.showControlsThenHide();
+ if (closingOverlayView.getVisibility() == View.VISIBLE) {
+ animateView(closingOverlayView, false, 0);
+ }
}
}
- return true;
}
- private boolean onScrollInMain(final MotionEvent initialEvent, final MotionEvent movingEvent,
- final float distanceX, final float distanceY) {
- if ((!isVolumeGestureEnabled && !isBrightnessGestureEnabled)
- || !playerImpl.isFullscreen()) {
- return false;
- }
-
- final boolean isTouchingStatusBar = initialEvent.getY() < getStatusBarHeight(service);
- final boolean isTouchingNavigationBar = initialEvent.getY()
- > playerImpl.getRootView().getHeight() - getNavigationBarHeight(service);
- if (isTouchingStatusBar || isTouchingNavigationBar) {
- return false;
- }
-
- /*if (DEBUG && false) Log.d(TAG, "onScrollInMain = " +
- ", e1.getRaw = [" + initialEvent.getRawX() + ", " + initialEvent.getRawY() + "]" +
- ", e2.getRaw = [" + movingEvent.getRawX() + ", " + movingEvent.getRawY() + "]" +
- ", distanceXy = [" + distanceX + ", " + distanceY + "]");*/
-
- final boolean insideThreshold =
- Math.abs(movingEvent.getY() - initialEvent.getY()) <= MOVEMENT_THRESHOLD;
- if (!isMovingInMain && (insideThreshold || Math.abs(distanceX) > Math.abs(distanceY))
- || playerImpl.getCurrentState() == BasePlayer.STATE_COMPLETED) {
- return false;
- }
-
- isMovingInMain = true;
-
- final boolean acceptAnyArea = isVolumeGestureEnabled != isBrightnessGestureEnabled;
- final boolean acceptVolumeArea = acceptAnyArea
- || initialEvent.getX() > playerImpl.getRootView().getWidth() / 2.0;
-
- if (isVolumeGestureEnabled && acceptVolumeArea) {
+ private void onScrollMainVolume(final float distanceX, final float distanceY) {
+ if (isVolumeGestureEnabled) {
playerImpl.getVolumeProgressBar().incrementProgressBy((int) distanceY);
final float currentProgressPercent = (float) playerImpl
.getVolumeProgressBar().getProgress() / playerImpl.getMaxGestureLength();
@@ -258,10 +157,14 @@ private boolean onScrollInMain(final MotionEvent initialEvent, final MotionEvent
if (playerImpl.getBrightnessRelativeLayout().getVisibility() == View.VISIBLE) {
playerImpl.getBrightnessRelativeLayout().setVisibility(View.GONE);
}
- } else {
+ }
+ }
+
+ private void onScrollMainBrightness(final float distanceX, final float distanceY) {
+ if (isBrightnessGestureEnabled) {
final Activity parent = playerImpl.getParentActivity();
if (parent == null) {
- return true;
+ return;
}
final Window window = parent.getWindow();
@@ -299,330 +202,71 @@ private boolean onScrollInMain(final MotionEvent initialEvent, final MotionEvent
playerImpl.getVolumeRelativeLayout().setVisibility(View.GONE);
}
}
- return true;
}
- private void onScrollEndInMain() {
+ @Override
+ public void onScrollEnd(@NotNull final MainPlayer.PlayerType playerType,
+ @NotNull final MotionEvent event) {
if (DEBUG) {
- Log.d(TAG, "onScrollEnd() called");
- }
-
- if (playerImpl.getVolumeRelativeLayout().getVisibility() == View.VISIBLE) {
- animateView(playerImpl.getVolumeRelativeLayout(), SCALE_AND_ALPHA, false, 200, 200);
- }
- if (playerImpl.getBrightnessRelativeLayout().getVisibility() == View.VISIBLE) {
- animateView(playerImpl.getBrightnessRelativeLayout(), SCALE_AND_ALPHA, false, 200, 200);
- }
-
- if (playerImpl.isControlsVisible() && playerImpl.getCurrentState() == STATE_PLAYING) {
- playerImpl.hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
- }
- }
-
- private boolean onTouchInMain(final View v, final MotionEvent event) {
- playerImpl.getGestureDetector().onTouchEvent(event);
- if (event.getAction() == MotionEvent.ACTION_UP && isMovingInMain) {
- isMovingInMain = false;
- onScrollEndInMain();
- }
- // This hack allows to stop receiving touch events on appbar
- // while touching video player's view
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- case MotionEvent.ACTION_MOVE:
- v.getParent().requestDisallowInterceptTouchEvent(playerImpl.isFullscreen());
- return true;
- case MotionEvent.ACTION_UP:
- v.getParent().requestDisallowInterceptTouchEvent(false);
- return false;
- default:
- return true;
- }
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Popup player listener
- //////////////////////////////////////////////////////////////////////////*/
-
- private boolean onDoubleTapInPopup(final MotionEvent e) {
- if (playerImpl == null || !playerImpl.isPlaying()) {
- return false;
- }
-
- playerImpl.hideControls(0, 0);
-
- if (e.getX() > playerImpl.getPopupWidth() / 2) {
- playerImpl.onFastForward();
- } else {
- playerImpl.onFastRewind();
- }
-
- return true;
- }
-
- private boolean onSingleTapConfirmedInPopup(final MotionEvent e) {
- if (playerImpl == null || playerImpl.getPlayer() == null) {
- return false;
+ Log.d(TAG, "onScrollEnd called with playerType = ["
+ + playerImpl.getPlayerType() + "]");
}
- if (playerImpl.isControlsVisible()) {
- playerImpl.hideControls(100, 100);
- } else {
- playerImpl.getPlayPauseButton().requestFocus();
- playerImpl.showControlsThenHide();
- }
- return true;
- }
-
- private boolean onDownInPopup(final MotionEvent e) {
- // Fix popup position when the user touch it, it may have the wrong one
- // because the soft input is visible (the draggable area is currently resized).
- playerImpl.updateScreenSize();
- playerImpl.checkPopupPositionBounds();
-
- initialPopupX = playerImpl.getPopupLayoutParams().x;
- initialPopupY = playerImpl.getPopupLayoutParams().y;
- playerImpl.setPopupWidth(playerImpl.getPopupLayoutParams().width);
- playerImpl.setPopupHeight(playerImpl.getPopupLayoutParams().height);
- return super.onDown(e);
- }
-
- private void onLongPressInPopup(final MotionEvent e) {
- playerImpl.updateScreenSize();
- playerImpl.checkPopupPositionBounds();
- playerImpl.updatePopupSize((int) playerImpl.getScreenWidth(), -1);
- }
-
- private boolean onScrollInPopup(final MotionEvent initialEvent,
- final MotionEvent movingEvent,
- final float distanceX,
- final float distanceY) {
- if (isResizing || playerImpl == null) {
- return super.onScroll(initialEvent, movingEvent, distanceX, distanceY);
- }
-
- if (!isMovingInPopup) {
- animateView(playerImpl.getCloseOverlayButton(), true, 200);
- }
-
- isMovingInPopup = true;
-
- final float diffX = (int) (movingEvent.getRawX() - initialEvent.getRawX());
- float posX = (int) (initialPopupX + diffX);
- final float diffY = (int) (movingEvent.getRawY() - initialEvent.getRawY());
- float posY = (int) (initialPopupY + diffY);
-
- if (posX > (playerImpl.getScreenWidth() - playerImpl.getPopupWidth())) {
- posX = (int) (playerImpl.getScreenWidth() - playerImpl.getPopupWidth());
- } else if (posX < 0) {
- posX = 0;
- }
-
- if (posY > (playerImpl.getScreenHeight() - playerImpl.getPopupHeight())) {
- posY = (int) (playerImpl.getScreenHeight() - playerImpl.getPopupHeight());
- } else if (posY < 0) {
- posY = 0;
- }
-
- playerImpl.getPopupLayoutParams().x = (int) posX;
- playerImpl.getPopupLayoutParams().y = (int) posY;
-
- final View closingOverlayView = playerImpl.getClosingOverlayView();
- if (playerImpl.isInsideClosingRadius(movingEvent)) {
- if (closingOverlayView.getVisibility() == View.GONE) {
- animateView(closingOverlayView, true, 250);
- }
- } else {
- if (closingOverlayView.getVisibility() == View.VISIBLE) {
- animateView(closingOverlayView, false, 0);
- }
- }
-
-// if (DEBUG) {
-// Log.d(TAG, "onScrollInPopup = "
-// + "e1.getRaw = [" + initialEvent.getRawX() + ", "
-// + initialEvent.getRawY() + "], "
-// + "e1.getX,Y = [" + initialEvent.getX() + ", "
-// + initialEvent.getY() + "], "
-// + "e2.getRaw = [" + movingEvent.getRawX() + ", "
-// + movingEvent.getRawY() + "], "
-// + "e2.getX,Y = [" + movingEvent.getX() + ", " + movingEvent.getY() + "], "
-// + "distanceX,Y = [" + distanceX + ", " + distanceY + "], "
-// + "posX,Y = [" + posX + ", " + posY + "], "
-// + "popupW,H = [" + popupWidth + " x " + popupHeight + "]");
-// }
- playerImpl.windowManager
- .updateViewLayout(playerImpl.getRootView(), playerImpl.getPopupLayoutParams());
- return true;
- }
-
- private void onScrollEndInPopup(final MotionEvent event) {
- if (playerImpl == null) {
- return;
- }
- if (playerImpl.isControlsVisible() && playerImpl.getCurrentState() == STATE_PLAYING) {
- playerImpl.hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
- }
-
- if (playerImpl.isInsideClosingRadius(event)) {
- playerImpl.closePopup();
- } else {
- animateView(playerImpl.getClosingOverlayView(), false, 0);
-
- if (!playerImpl.isPopupClosing) {
- animateView(playerImpl.getCloseOverlayButton(), false, 200);
+ if (playerType == MainPlayer.PlayerType.VIDEO) {
+ if (DEBUG) {
+ Log.d(TAG, "onScrollEnd() called");
}
- }
- }
- private boolean onFlingInPopup(final MotionEvent e1,
- final MotionEvent e2,
- final float velocityX,
- final float velocityY) {
- if (playerImpl == null) {
- return false;
- }
-
- final float absVelocityX = Math.abs(velocityX);
- final float absVelocityY = Math.abs(velocityY);
- if (Math.max(absVelocityX, absVelocityY) > tossFlingVelocity) {
- if (absVelocityX > tossFlingVelocity) {
- playerImpl.getPopupLayoutParams().x = (int) velocityX;
- }
- if (absVelocityY > tossFlingVelocity) {
- playerImpl.getPopupLayoutParams().y = (int) velocityY;
+ if (playerImpl.getVolumeRelativeLayout().getVisibility() == View.VISIBLE) {
+ animateView(playerImpl.getVolumeRelativeLayout(), SCALE_AND_ALPHA,
+ false, 200, 200);
}
- playerImpl.checkPopupPositionBounds();
- playerImpl.windowManager
- .updateViewLayout(playerImpl.getRootView(), playerImpl.getPopupLayoutParams());
- return true;
- }
- return false;
- }
-
- private boolean onTouchInPopup(final View v, final MotionEvent event) {
- if (playerImpl == null) {
- return false;
- }
- playerImpl.getGestureDetector().onTouchEvent(event);
-
- if (event.getPointerCount() == 2 && !isMovingInPopup && !isResizing) {
- if (DEBUG) {
- Log.d(TAG, "onTouch() 2 finger pointer detected, enabling resizing.");
+ if (playerImpl.getBrightnessRelativeLayout().getVisibility() == View.VISIBLE) {
+ animateView(playerImpl.getBrightnessRelativeLayout(), SCALE_AND_ALPHA,
+ false, 200, 200);
}
- playerImpl.showAndAnimateControl(-1, true);
- playerImpl.getLoadingPanel().setVisibility(View.GONE);
-
- playerImpl.hideControls(0, 0);
- animateView(playerImpl.getCurrentDisplaySeek(), false, 0, 0);
- animateView(playerImpl.getResizingIndicator(), true, 200, 0);
- //record coordinates of fingers
- initFirstPointerX = event.getX(0);
- initFirstPointerY = event.getY(0);
- initSecPointerX = event.getX(1);
- initSecPointerY = event.getY(1);
- //record distance between fingers
- initPointerDistance = Math.hypot(initFirstPointerX - initSecPointerX,
- initFirstPointerY - initSecPointerY);
-
- isResizing = true;
- }
- if (event.getAction() == MotionEvent.ACTION_MOVE && !isMovingInPopup && isResizing) {
- if (DEBUG) {
- Log.d(TAG, "onTouch() ACTION_MOVE > v = [" + v + "], "
- + "e1.getRaw = [" + event.getRawX() + ", " + event.getRawY() + "]");
+ if (playerImpl.isControlsVisible() && playerImpl.getCurrentState() == STATE_PLAYING) {
+ playerImpl.hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
}
- return handleMultiDrag(event);
- }
-
- if (event.getAction() == MotionEvent.ACTION_UP) {
- if (DEBUG) {
- Log.d(TAG, "onTouch() ACTION_UP > v = [" + v + "], "
- + "e1.getRaw = [" + event.getRawX() + ", " + event.getRawY() + "]");
+ } else {
+ if (playerImpl == null) {
+ return;
}
- if (isMovingInPopup) {
- isMovingInPopup = false;
- onScrollEndInPopup(event);
+ if (playerImpl.isControlsVisible() && playerImpl.getCurrentState() == STATE_PLAYING) {
+ playerImpl.hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);
}
- if (isResizing) {
- isResizing = false;
-
- initPointerDistance = -1;
- initFirstPointerX = -1;
- initFirstPointerY = -1;
- initSecPointerX = -1;
- initSecPointerY = -1;
-
- animateView(playerImpl.getResizingIndicator(), false, 100, 0);
- playerImpl.changeState(playerImpl.getCurrentState());
- }
+ if (playerImpl.isInsideClosingRadius(event)) {
+ playerImpl.closePopup();
+ } else {
+ animateView(playerImpl.getClosingOverlayView(), false, 0);
- if (!playerImpl.isPopupClosing) {
- playerImpl.savePositionAndSize();
+ if (!playerImpl.isPopupClosing) {
+ animateView(playerImpl.getCloseOverlayButton(), false, 200);
+ }
}
}
-
- v.performClick();
- return true;
}
- private boolean handleMultiDrag(final MotionEvent event) {
- if (initPointerDistance != -1 && event.getPointerCount() == 2) {
- // get the movements of the fingers
- final double firstPointerMove = Math.hypot(event.getX(0) - initFirstPointerX,
- event.getY(0) - initFirstPointerY);
- final double secPointerMove = Math.hypot(event.getX(1) - initSecPointerX,
- event.getY(1) - initSecPointerY);
-
- // minimum threshold beyond which pinch gesture will work
- final int minimumMove = ViewConfiguration.get(service).getScaledTouchSlop();
-
- if (Math.max(firstPointerMove, secPointerMove) > minimumMove) {
- // calculate current distance between the pointers
- final double currentPointerDistance =
- Math.hypot(event.getX(0) - event.getX(1),
- event.getY(0) - event.getY(1));
-
- final double popupWidth = playerImpl.getPopupWidth();
- // change co-ordinates of popup so the center stays at the same position
- final double newWidth = (popupWidth * currentPointerDistance / initPointerDistance);
- initPointerDistance = currentPointerDistance;
- playerImpl.getPopupLayoutParams().x += (popupWidth - newWidth) / 2;
-
- playerImpl.checkPopupPositionBounds();
- playerImpl.updateScreenSize();
-
- playerImpl.updatePopupSize(
- (int) Math.min(playerImpl.getScreenWidth(), newWidth),
- -1);
- return true;
- }
+ @Override
+ public void onPopupResizingStart() {
+ if (DEBUG) {
+ Log.d(TAG, "onPopupResizingStart called");
}
- return false;
- }
-
+ playerImpl.showAndAnimateControl(-1, true);
+ playerImpl.getLoadingPanel().setVisibility(View.GONE);
- /*
- * Utils
- * */
-
- private int getNavigationBarHeight(final Context context) {
- final int resId = context.getResources()
- .getIdentifier("navigation_bar_height", "dimen", "android");
- if (resId > 0) {
- return context.getResources().getDimensionPixelSize(resId);
- }
- return 0;
+ playerImpl.hideControls(0, 0);
+ animateView(playerImpl.getCurrentDisplaySeek(), false, 0, 0);
+ animateView(playerImpl.getResizingIndicator(), true, 200, 0);
}
- private int getStatusBarHeight(final Context context) {
- final int resId = context.getResources()
- .getIdentifier("status_bar_height", "dimen", "android");
- if (resId > 0) {
- return context.getResources().getDimensionPixelSize(resId);
+ @Override
+ public void onPopupResizingEnd() {
+ if (DEBUG) {
+ Log.d(TAG, "onPopupResizingEnd called");
}
- return 0;
+ animateView(playerImpl.getResizingIndicator(), false, 100, 0);
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java
index f434b062120..ffe19599d20 100644
--- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java
+++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java
@@ -12,6 +12,7 @@
import android.util.Log;
import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.analytics.AnalyticsListener;
@@ -39,7 +40,7 @@ public AudioReactor(@NonNull final Context context,
@NonNull final SimpleExoPlayer player) {
this.player = player;
this.context = context;
- this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ this.audioManager = ContextCompat.getSystemService(context, AudioManager.class);
player.addAnalyticsListener(this);
if (SHOULD_BUILD_FOCUS_REQUEST) {
@@ -163,7 +164,7 @@ public void onAnimationEnd(final Animator animation) {
@Override
public void onAudioSessionId(final EventTime eventTime, final int audioSessionId) {
- if (!PlayerHelper.isUsingDSP(context)) {
+ if (!PlayerHelper.isUsingDSP()) {
return;
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java b/app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java
index 6d0cf8e85fd..270156fe977 100644
--- a/app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java
+++ b/app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java
@@ -5,8 +5,7 @@
import android.os.PowerManager;
import android.util.Log;
-import static android.content.Context.POWER_SERVICE;
-import static android.content.Context.WIFI_SERVICE;
+import androidx.core.content.ContextCompat;
public class LockManager {
private final String TAG = "LockManager@" + hashCode();
@@ -18,10 +17,9 @@ public class LockManager {
private WifiManager.WifiLock wifiLock;
public LockManager(final Context context) {
- powerManager = ((PowerManager) context.getApplicationContext()
- .getSystemService(POWER_SERVICE));
- wifiManager = ((WifiManager) context.getApplicationContext()
- .getSystemService(WIFI_SERVICE));
+ powerManager = ContextCompat.getSystemService(context.getApplicationContext(),
+ PowerManager.class);
+ wifiManager = ContextCompat.getSystemService(context, WifiManager.class);
}
public void acquireWifiAndCpu() {
diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java
index 6efe7510c95..d89b5dd1930 100644
--- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java
@@ -8,6 +8,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;
import com.google.android.exoplayer2.SeekParameters;
@@ -83,12 +84,12 @@ public static String getTimeString(final int milliSeconds) {
final int days = (milliSeconds % (86400000 * 7)) / 86400000;
STRING_BUILDER.setLength(0);
- return days > 0
+ return (days > 0
? STRING_FORMATTER.format("%d:%02d:%02d:%02d", days, hours, minutes, seconds)
- .toString()
: hours > 0
- ? STRING_FORMATTER.format("%d:%02d:%02d", hours, minutes, seconds).toString()
- : STRING_FORMATTER.format("%02d:%02d", minutes, seconds).toString();
+ ? STRING_FORMATTER.format("%d:%02d:%02d", hours, minutes, seconds)
+ : STRING_FORMATTER.format("%02d:%02d", minutes, seconds)
+ ).toString();
}
public static String formatSpeed(final double speed) {
@@ -298,7 +299,7 @@ public static int getPlaybackOptimalBufferMs() {
return 60000;
}
- public static TrackSelection.Factory getQualitySelector(@NonNull final Context context) {
+ public static TrackSelection.Factory getQualitySelector() {
return new AdaptiveTrackSelection.Factory(
1000,
AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS,
@@ -306,18 +307,18 @@ public static TrackSelection.Factory getQualitySelector(@NonNull final Context c
AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION);
}
- public static boolean isUsingDSP(@NonNull final Context context) {
+ public static boolean isUsingDSP() {
return true;
}
- public static int getTossFlingVelocity(@NonNull final Context context) {
+ public static int getTossFlingVelocity() {
return 2500;
}
@NonNull
public static CaptionStyleCompat getCaptionStyle(@NonNull final Context context) {
- final CaptioningManager captioningManager = (CaptioningManager)
- context.getSystemService(Context.CAPTIONING_SERVICE);
+ final CaptioningManager captioningManager = ContextCompat.getSystemService(context,
+ CaptioningManager.class);
if (captioningManager == null || !captioningManager.isEnabled()) {
return CaptionStyleCompat.DEFAULT;
}
@@ -340,8 +341,8 @@ public static CaptionStyleCompat getCaptionStyle(@NonNull final Context context)
* @return caption scaling
*/
public static float getCaptionScale(@NonNull final Context context) {
- final CaptioningManager captioningManager
- = (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);
+ final CaptioningManager captioningManager = ContextCompat.getSystemService(context,
+ CaptioningManager.class);
if (captioningManager == null || !captioningManager.isEnabled()) {
return 1.0f;
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java
index a5760eddc86..854e3eb2b26 100644
--- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java
+++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java
@@ -6,8 +6,12 @@
import android.content.ServiceConnection;
import android.os.IBinder;
import android.util.Log;
+
+import androidx.annotation.Nullable;
+
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.PlaybackParameters;
+
import org.schabi.newpipe.App;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.extractor.stream.StreamInfo;
@@ -31,6 +35,31 @@ private PlayerHolder() {
private static MainPlayer playerService;
private static VideoPlayerImpl player;
+ /**
+ * Returns the current {@link MainPlayer.PlayerType} of the {@link MainPlayer} service,
+ * otherwise `null` if no service running.
+ *
+ * @return Current PlayerType
+ */
+ @Nullable
+ public static MainPlayer.PlayerType getType() {
+ if (player == null) {
+ return null;
+ }
+ return player.getPlayerType();
+ }
+
+ public static boolean isPlaying() {
+ if (player == null) {
+ return false;
+ }
+ return player.isPlaying();
+ }
+
+ public static boolean isPlayerOpen() {
+ return player != null;
+ }
+
public static void setListener(final PlayerServiceExtendedEventListener newListener) {
listener = newListener;
// Force reload data from service
diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java
index 8bef0b2e023..b8bb677e033 100644
--- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java
+++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java
@@ -1,12 +1,8 @@
package org.schabi.newpipe.player.playqueue;
-import android.util.Log;
-
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import org.reactivestreams.Subscriber;
-import org.reactivestreams.Subscription;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.player.playqueue.events.AppendEvent;
import org.schabi.newpipe.player.playqueue.events.ErrorEvent;
@@ -43,7 +39,6 @@
*
*/
public abstract class PlayQueue implements Serializable {
- private final String TAG = "PlayQueue@" + Integer.toHexString(hashCode());
public static final boolean DEBUG = MainActivity.DEBUG;
private ArrayList backup;
@@ -55,7 +50,6 @@ public abstract class PlayQueue implements Serializable {
private transient BehaviorSubject eventBroadcast;
private transient Flowable broadcastReceiver;
- private transient Subscription reportingReactor;
private transient boolean disposed;
@@ -87,10 +81,6 @@ public void init() {
broadcastReceiver = eventBroadcast.toFlowable(BackpressureStrategy.BUFFER)
.observeOn(AndroidSchedulers.mainThread())
.startWith(new InitEvent());
-
- if (DEBUG) {
- broadcastReceiver.subscribe(getSelfReporter());
- }
}
/**
@@ -100,13 +90,9 @@ public void dispose() {
if (eventBroadcast != null) {
eventBroadcast.onComplete();
}
- if (reportingReactor != null) {
- reportingReactor.cancel();
- }
eventBroadcast = null;
broadcastReceiver = null;
- reportingReactor = null;
disposed = true;
}
@@ -167,19 +153,20 @@ public synchronized void setIndex(final int index) {
}
/**
- * @return the current item that should be played
+ * @return the current item that should be played, or null if the queue is empty
*/
+ @Nullable
public PlayQueueItem getItem() {
return getItem(getIndex());
}
/**
* @param index the index of the item to return
- * @return the item at the given index
- * @throws IndexOutOfBoundsException
+ * @return the item at the given index, or null if the index is out of bounds
*/
+ @Nullable
public PlayQueueItem getItem(final int index) {
- if (index < 0 || index >= streams.size() || streams.get(index) == null) {
+ if (index < 0 || index >= streams.size()) {
return null;
}
return streams.get(index);
@@ -543,35 +530,5 @@ private void broadcast(@NonNull final PlayQueueEvent event) {
eventBroadcast.onNext(event);
}
}
-
- private Subscriber getSelfReporter() {
- return new Subscriber() {
- @Override
- public void onSubscribe(final Subscription s) {
- if (reportingReactor != null) {
- reportingReactor.cancel();
- }
- reportingReactor = s;
- reportingReactor.request(1);
- }
-
- @Override
- public void onNext(final PlayQueueEvent event) {
- Log.d(TAG, "Received broadcast: " + event.type().name() + ". "
- + "Current index: " + getIndex() + ", play queue length: " + size() + ".");
- reportingReactor.request(1);
- }
-
- @Override
- public void onError(final Throwable t) {
- Log.e(TAG, "Received broadcast error", t);
- }
-
- @Override
- public void onComplete() {
- Log.d(TAG, "Broadcast is shutting down.");
- }
- };
- }
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java
index 74aef07fadb..79efc03aeea 100644
--- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java
+++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java
@@ -64,6 +64,20 @@ private PlayQueueItem(@Nullable final String name, @Nullable final String url,
this.recoveryPosition = RECOVERY_UNSET;
}
+ @Override
+ public boolean equals(final Object o) {
+ if (o instanceof PlayQueueItem) {
+ return url.equals(((PlayQueueItem) o).url);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return url.hashCode();
+ }
+
@NonNull
public String getTitle() {
return title;
diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java
index 1c50dc6b410..3e0865a3e97 100644
--- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java
+++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java
@@ -52,7 +52,6 @@ public void buildStreamInfoItem(final PlayQueueItemHolder holder, final PlayQueu
return false;
});
- holder.itemThumbnailView.setOnTouchListener(getOnTouchListener(holder));
holder.itemHandle.setOnTouchListener(getOnTouchListener(holder));
}
diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
index df30a21f3ba..37431fa582f 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
@@ -7,13 +7,13 @@
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
-import androidx.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
import com.nononsenseapps.filepicker.Utils;
import com.nostra13.universalimageloader.core.ImageLoader;
@@ -21,6 +21,7 @@
import org.schabi.newpipe.DownloaderImpl;
import org.schabi.newpipe.NewPipeDatabase;
import org.schabi.newpipe.R;
+import org.schabi.newpipe.ReCaptchaActivity;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.localization.ContentCountry;
import org.schabi.newpipe.extractor.localization.Localization;
@@ -75,6 +76,22 @@ public void onCreate(@Nullable final Bundle savedInstanceState) {
.getPreferredContentCountry(requireContext());
initialLanguage = PreferenceManager
.getDefaultSharedPreferences(requireContext()).getString("app_language_key", "en");
+
+ final Preference clearCookiePref = findPreference(getString(R.string.clear_cookie_key));
+
+ clearCookiePref.setOnPreferenceClickListener(preference -> {
+ defaultPreferences.edit()
+ .putString(getString(R.string.recaptcha_cookies_key), "").apply();
+ DownloaderImpl.getInstance().setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, "");
+ Toast.makeText(getActivity(), R.string.recaptcha_cookies_cleared,
+ Toast.LENGTH_SHORT).show();
+ clearCookiePref.setVisible(false);
+ return true;
+ });
+
+ if (defaultPreferences.getString(getString(R.string.recaptcha_cookies_key), "").isEmpty()) {
+ clearCookiePref.setVisible(false);
+ }
}
@Override
diff --git a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java
deleted file mode 100644
index af3e3f5a905..00000000000
--- a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.schabi.newpipe.settings;
-
-import android.os.Bundle;
-
-import org.schabi.newpipe.R;
-
-public class DebugSettingsFragment extends BasePreferenceFragment {
- @Override
- public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
- addPreferencesFromResource(R.xml.debug_settings);
- }
-}
diff --git a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java
index d9b404204ad..893e7c740e0 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java
@@ -55,7 +55,7 @@ public boolean onPreferenceTreeClick(final Preference preference) {
.setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss()))
.setPositiveButton(R.string.delete, ((dialog, which) -> {
final Disposable onDeletePlaybackStates
- = recordManager.deleteCompelteStreamStateHistory()
+ = recordManager.deleteCompleteStreamStateHistory()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
howManyDeleted -> Toast.makeText(getActivity(),
@@ -113,7 +113,7 @@ public boolean onPreferenceTreeClick(final Preference preference) {
.setPositiveButton(R.string.delete, ((dialog, which) -> {
final Disposable onDeletePlaybackStates
- = recordManager.deleteCompelteStreamStateHistory()
+ = recordManager.deleteCompleteStreamStateHistory()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
howManyDeleted -> Toast.makeText(getActivity(),
diff --git a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java
index 5502a06ebb4..2f65af4d6b0 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java
@@ -4,7 +4,8 @@
import androidx.preference.Preference;
-import org.schabi.newpipe.CheckForNewAppVersionTask;
+import org.schabi.newpipe.App;
+import org.schabi.newpipe.CheckForNewAppVersion;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
@@ -15,16 +16,11 @@ public class MainSettingsFragment extends BasePreferenceFragment {
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
addPreferencesFromResource(R.xml.main_settings);
- if (!CheckForNewAppVersionTask.isGithubApk()) {
+ if (!CheckForNewAppVersion.isGithubApk(App.getApp())) {
final Preference update = findPreference(getString(R.string.update_pref_screen_key));
getPreferenceScreen().removePreference(update);
defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply();
}
-
- if (!DEBUG) {
- final Preference debug = findPreference(getString(R.string.debug_pref_screen_key));
- getPreferenceScreen().removePreference(debug);
- }
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.kt b/app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.kt
new file mode 100644
index 00000000000..c68b699d35b
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.kt
@@ -0,0 +1,19 @@
+package org.schabi.newpipe.settings
+
+import android.os.Build
+import android.os.Bundle
+import androidx.preference.Preference
+import org.schabi.newpipe.R
+
+class NotificationSettingsFragment : BasePreferenceFragment() {
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ addPreferencesFromResource(R.xml.notification_settings)
+
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ val colorizePref: Preference? = findPreference(getString(R.string.notification_colorize_key))
+ colorizePref?.let {
+ preferenceScreen.removePreference(it)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java
index c858c7f7719..153adf4c047 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java
@@ -1,7 +1,6 @@
package org.schabi.newpipe.settings;
import android.app.Activity;
-import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -34,6 +33,7 @@
import java.util.Vector;
import io.reactivex.Flowable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
public class SelectPlaylistFragment extends DialogFragment {
@@ -46,12 +46,11 @@ public class SelectPlaylistFragment extends DialogFragment {
private final ImageLoader imageLoader = ImageLoader.getInstance();
private OnSelectedListener onSelectedListener = null;
- private OnCancelListener onCancelListener = null;
private ProgressBar progressBar;
private TextView emptyView;
private RecyclerView recyclerView;
- private Disposable playlistsSubscriber;
+ private Disposable disposable = null;
private List playlists = new Vector<>();
@@ -59,10 +58,6 @@ public void setOnSelectedListener(final OnSelectedListener listener) {
onSelectedListener = listener;
}
- public void setOnCancelListener(final OnCancelListener listener) {
- onCancelListener = listener;
- }
-
/*//////////////////////////////////////////////////////////////////////////
// Fragment's Lifecycle
//////////////////////////////////////////////////////////////////////////*/
@@ -70,15 +65,32 @@ public void setOnCancelListener(final OnCancelListener listener) {
@Override
public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
- final View v =
- inflater.inflate(R.layout.select_playlist_fragment, container, false);
+ final View v = inflater.inflate(R.layout.select_playlist_fragment, container, false);
+ progressBar = v.findViewById(R.id.progressBar);
recyclerView = v.findViewById(R.id.items_list);
+ emptyView = v.findViewById(R.id.empty_state_view);
+
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
final SelectPlaylistAdapter playlistAdapter = new SelectPlaylistAdapter();
recyclerView.setAdapter(playlistAdapter);
- progressBar = v.findViewById(R.id.progressBar);
- emptyView = v.findViewById(R.id.empty_state_view);
+ loadPlaylists();
+ return v;
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (disposable != null) {
+ disposable.dispose();
+ }
+ }
+
+ /*//////////////////////////////////////////////////////////////////////////
+ // Load and display playlists
+ //////////////////////////////////////////////////////////////////////////*/
+
+ private void loadPlaylists() {
progressBar.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.GONE);
emptyView.setVisibility(View.GONE);
@@ -87,43 +99,36 @@ public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup
final LocalPlaylistManager localPlaylistManager = new LocalPlaylistManager(database);
final RemotePlaylistManager remotePlaylistManager = new RemotePlaylistManager(database);
- playlistsSubscriber = Flowable.combineLatest(localPlaylistManager.getPlaylists(),
+ disposable = Flowable.combineLatest(localPlaylistManager.getPlaylists(),
remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge)
+ .observeOn(AndroidSchedulers.mainThread())
.subscribe(this::displayPlaylists, this::onError);
-
- return v;
}
- @Override
- public void onDestroy() {
- super.onDestroy();
+ private void displayPlaylists(final List newPlaylists) {
+ playlists = newPlaylists;
+ progressBar.setVisibility(View.GONE);
+ emptyView.setVisibility(newPlaylists.isEmpty() ? View.VISIBLE : View.GONE);
+ recyclerView.setVisibility(newPlaylists.isEmpty() ? View.GONE : View.VISIBLE);
+ }
- if (playlistsSubscriber != null) {
- playlistsSubscriber.dispose();
- playlistsSubscriber = null;
- }
+ protected void onError(final Throwable e) {
+ final Activity activity = requireActivity();
+ ErrorActivity.reportError(activity, e, activity.getClass(), null, ErrorActivity.ErrorInfo
+ .make(UserAction.UI_ERROR, "none", "load_playlists", R.string.app_ui_crash));
}
/*//////////////////////////////////////////////////////////////////////////
// Handle actions
//////////////////////////////////////////////////////////////////////////*/
- @Override
- public void onCancel(final DialogInterface dialogInterface) {
- super.onCancel(dialogInterface);
- if (onCancelListener != null) {
- onCancelListener.onCancel();
- }
- }
-
private void clickedItem(final int position) {
if (onSelectedListener != null) {
final LocalItem selectedItem = playlists.get(position);
if (selectedItem instanceof PlaylistMetadataEntry) {
final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem);
- onSelectedListener
- .onLocalPlaylistSelected(entry.uid, entry.name);
+ onSelectedListener.onLocalPlaylistSelected(entry.uid, entry.name);
} else if (selectedItem instanceof PlaylistRemoteEntity) {
final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem);
@@ -134,31 +139,6 @@ private void clickedItem(final int position) {
dismiss();
}
- /*//////////////////////////////////////////////////////////////////////////
- // Item handling
- //////////////////////////////////////////////////////////////////////////*/
-
- private void displayPlaylists(final List newPlaylists) {
- this.playlists = newPlaylists;
- progressBar.setVisibility(View.GONE);
- if (newPlaylists.isEmpty()) {
- emptyView.setVisibility(View.VISIBLE);
- return;
- }
- recyclerView.setVisibility(View.VISIBLE);
-
- }
-
- /*//////////////////////////////////////////////////////////////////////////
- // Error
- //////////////////////////////////////////////////////////////////////////*/
-
- protected void onError(final Throwable e) {
- final Activity activity = getActivity();
- ErrorActivity.reportError(activity, e, activity.getClass(), null, ErrorActivity.ErrorInfo
- .make(UserAction.UI_ERROR, "none", "", R.string.app_ui_crash));
- }
-
/*//////////////////////////////////////////////////////////////////////////
// Interfaces
//////////////////////////////////////////////////////////////////////////*/
@@ -168,22 +148,20 @@ public interface OnSelectedListener {
void onRemotePlaylistSelected(int serviceId, String url, String name);
}
- public interface OnCancelListener {
- void onCancel();
- }
-
private class SelectPlaylistAdapter
extends RecyclerView.Adapter {
+ @NonNull
@Override
public SelectPlaylistItemHolder onCreateViewHolder(final ViewGroup parent,
- final int viewType) {
+ final int viewType) {
final View item = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_playlist_mini_item, parent, false);
return new SelectPlaylistItemHolder(item);
}
@Override
- public void onBindViewHolder(final SelectPlaylistItemHolder holder, final int position) {
+ public void onBindViewHolder(@NonNull final SelectPlaylistItemHolder holder,
+ final int position) {
final PlaylistLocalItem selectedItem = playlists.get(position);
if (selectedItem instanceof PlaylistMetadataEntry) {
diff --git a/app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java
similarity index 70%
rename from app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.java
rename to app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java
index ce1e9e5a534..1fe405552db 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java
@@ -1,12 +1,10 @@
-package org.schabi.newpipe.settings;
+package org.schabi.newpipe.settings.custom;
+import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
-import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
+import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -15,16 +13,16 @@
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
-import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
-
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources;
-import androidx.fragment.app.Fragment;
-
+import androidx.core.graphics.drawable.DrawableCompat;
+import androidx.core.widget.TextViewCompat;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+import java.util.List;
import org.schabi.newpipe.R;
import org.schabi.newpipe.player.MainPlayer;
import org.schabi.newpipe.player.NotificationConstants;
@@ -32,56 +30,35 @@
import org.schabi.newpipe.util.ThemeHelper;
import org.schabi.newpipe.views.FocusOverlayView;
-import java.util.List;
+public class NotificationActionsPreference extends Preference {
+
+ public NotificationActionsPreference(final Context context, final AttributeSet attrs) {
+ super(context, attrs);
+ setLayoutResource(R.layout.settings_notification);
+ }
-public class NotificationSettingsFragment extends Fragment {
- private Switch scaleSwitch;
private NotificationSlot[] notificationSlots;
- private SharedPreferences pref;
private List compactSlots;
- private String scaleKey;
////////////////////////////////////////////////////////////////////////////
// Lifecycle
////////////////////////////////////////////////////////////////////////////
@Override
- public void onCreate(@Nullable final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- pref = PreferenceManager.getDefaultSharedPreferences(requireContext());
- scaleKey = getString(R.string.scale_to_square_image_in_notifications_key);
- }
-
- @Override
- public View onCreateView(@NonNull final LayoutInflater inflater,
- final ViewGroup container,
- @Nullable final Bundle savedInstanceState) {
- return inflater.inflate(R.layout.settings_notification, container, false);
- }
-
- @Override
- public void onViewCreated(@NonNull final View rootView,
- @Nullable final Bundle savedInstanceState) {
- super.onViewCreated(rootView, savedInstanceState);
+ public void onBindViewHolder(final PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
- setupScaleSwitch(rootView);
- setupActions(rootView);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- ThemeHelper.setTitleToAppCompatActivity(getActivity(),
- getString(R.string.settings_category_notification_title));
+ holder.itemView.setClickable(false);
+ setupActions(holder.itemView);
}
@Override
- public void onPause() {
- super.onPause();
+ public void onDetached() {
+ super.onDetached();
saveChanges();
- requireContext().sendBroadcast(new Intent(MainPlayer.ACTION_RECREATE_NOTIFICATION));
+ getContext().sendBroadcast(new Intent(MainPlayer.ACTION_RECREATE_NOTIFICATION));
}
@@ -89,17 +66,10 @@ public void onPause() {
// Setup
////////////////////////////////////////////////////////////////////////////
- private void setupScaleSwitch(@NonNull final View view) {
- scaleSwitch = view.findViewById(R.id.notificationScaleSwitch);
- scaleSwitch.setChecked(pref.getBoolean(scaleKey, false));
-
- view.findViewById(R.id.notificationScaleSwitchClickableArea)
- .setOnClickListener(v -> scaleSwitch.toggle());
- }
-
private void setupActions(@NonNull final View view) {
compactSlots =
- NotificationConstants.getCompactSlotsFromPreferences(requireContext(), pref, 5);
+ NotificationConstants.getCompactSlotsFromPreferences(
+ getContext(), getSharedPreferences(), 5);
notificationSlots = new NotificationSlot[5];
for (int i = 0; i < 5; i++) {
notificationSlots[i] = new NotificationSlot(i, view);
@@ -112,16 +82,15 @@ private void setupActions(@NonNull final View view) {
////////////////////////////////////////////////////////////////////////////
private void saveChanges() {
- final SharedPreferences.Editor editor = pref.edit();
- editor.putBoolean(scaleKey, scaleSwitch.isChecked());
+ final SharedPreferences.Editor editor = getSharedPreferences().edit();
for (int i = 0; i < 3; i++) {
- editor.putInt(getString(NotificationConstants.SLOT_COMPACT_PREF_KEYS[i]),
+ editor.putInt(getContext().getString(NotificationConstants.SLOT_COMPACT_PREF_KEYS[i]),
(i < compactSlots.size() ? compactSlots.get(i) : -1));
}
for (int i = 0; i < 5; i++) {
- editor.putInt(getString(NotificationConstants.SLOT_PREF_KEYS[i]),
+ editor.putInt(getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]),
notificationSlots[i].selectedAction);
}
@@ -183,7 +152,7 @@ void setupCheckbox(final View view) {
} else if (compactSlots.size() < 3) {
compactSlots.add(i);
} else {
- Toast.makeText(requireContext(),
+ Toast.makeText(getContext(),
R.string.notification_actions_at_most_three,
Toast.LENGTH_SHORT).show();
return;
@@ -196,7 +165,8 @@ void setupCheckbox(final View view) {
void setupSelectedAction(final View view) {
icon = view.findViewById(R.id.notificationActionIcon);
summary = view.findViewById(R.id.notificationActionSummary);
- selectedAction = pref.getInt(getString(NotificationConstants.SLOT_PREF_KEYS[i]),
+ selectedAction = getSharedPreferences().getInt(
+ getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]),
NotificationConstants.SLOT_DEFAULTS[i]);
updateInfo();
}
@@ -205,20 +175,20 @@ void updateInfo() {
if (NotificationConstants.ACTION_ICONS[selectedAction] == 0) {
icon.setImageDrawable(null);
} else {
- icon.setImageDrawable(AppCompatResources.getDrawable(requireContext(),
+ icon.setImageDrawable(AppCompatResources.getDrawable(getContext(),
NotificationConstants.ACTION_ICONS[selectedAction]));
}
- summary.setText(NotificationConstants.getActionName(requireContext(), selectedAction));
+ summary.setText(NotificationConstants.getActionName(getContext(), selectedAction));
}
void openActionChooserDialog() {
- final LayoutInflater inflater = LayoutInflater.from(requireContext());
+ final LayoutInflater inflater = LayoutInflater.from(getContext());
final LinearLayout rootLayout = (LinearLayout) inflater.inflate(
R.layout.single_choice_dialog_view, null, false);
final RadioGroup radioGroup = rootLayout.findViewById(android.R.id.list);
- final AlertDialog alertDialog = new AlertDialog.Builder(requireContext())
+ final AlertDialog alertDialog = new AlertDialog.Builder(getContext())
.setTitle(SLOT_TITLES[i])
.setView(radioGroup)
.setCancelable(true)
@@ -237,22 +207,19 @@ void openActionChooserDialog() {
// if present set action icon with correct color
if (NotificationConstants.ACTION_ICONS[action] != 0) {
- final Drawable drawable = AppCompatResources.getDrawable(requireContext(),
+ Drawable drawable = AppCompatResources.getDrawable(getContext(),
NotificationConstants.ACTION_ICONS[action]);
if (drawable != null) {
- final int color = ThemeHelper.resolveColorFromAttr(requireContext(),
+ final int color = ThemeHelper.resolveColorFromAttr(getContext(),
android.R.attr.textColorPrimary);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- drawable.setTint(color);
- } else {
- drawable.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
- }
- radioButton.setCompoundDrawablesWithIntrinsicBounds(
+ drawable = DrawableCompat.wrap(drawable).mutate();
+ DrawableCompat.setTint(drawable, color);
+ TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(radioButton,
null, null, drawable, null);
}
}
- radioButton.setText(NotificationConstants.getActionName(requireContext(), action));
+ radioButton.setText(NotificationConstants.getActionName(getContext(), action));
radioButton.setChecked(action == selectedAction);
radioButton.setId(id);
radioButton.setLayoutParams(new RadioGroup.LayoutParams(
@@ -262,7 +229,7 @@ void openActionChooserDialog() {
}
alertDialog.show();
- if (DeviceUtils.isTv(requireContext())) {
+ if (DeviceUtils.isTv(getContext())) {
FocusOverlayView.setupFocusObserver(alertDialog);
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java
index d852c2296fe..1afedcaef31 100644
--- a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java
+++ b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java
@@ -9,10 +9,9 @@
import android.view.KeyEvent;
import androidx.annotation.NonNull;
-import org.schabi.newpipe.App;
+import androidx.core.content.ContextCompat;
-import static android.content.Context.BATTERY_SERVICE;
-import static android.content.Context.UI_MODE_SERVICE;
+import org.schabi.newpipe.App;
public final class DeviceUtils {
@@ -30,15 +29,14 @@ public static boolean isTv(final Context context) {
final PackageManager pm = App.getApp().getPackageManager();
// from doc: https://developer.android.com/training/tv/start/hardware.html#runtime-check
- boolean isTv = ((UiModeManager) context.getSystemService(UI_MODE_SERVICE))
+ boolean isTv = ContextCompat.getSystemService(context, UiModeManager.class)
.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION
|| pm.hasSystemFeature(AMAZON_FEATURE_FIRE_TV)
|| pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION);
// from https://stackoverflow.com/a/58932366
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- final boolean isBatteryAbsent
- = ((BatteryManager) context.getSystemService(BATTERY_SERVICE))
+ final boolean isBatteryAbsent = context.getSystemService(BatteryManager.class)
.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) == 0;
isTv = isTv || (isBatteryAbsent
&& !pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)
diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java
index a1a73d7acbf..e6dffaec42e 100644
--- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java
@@ -293,8 +293,8 @@ public static void handleGeneralException(final Context context, final int servi
} else if (exception instanceof ContentNotSupportedException) {
Toast.makeText(context, R.string.content_not_supported, Toast.LENGTH_LONG).show();
} else {
- final int errorId = exception instanceof YoutubeStreamExtractor.DecryptException
- ? R.string.youtube_signature_decryption_error
+ final int errorId = exception instanceof YoutubeStreamExtractor.DeobfuscateException
+ ? R.string.youtube_signature_deobfuscation_error
: exception instanceof ParsingException
? R.string.parsing_error : R.string.general_error;
ErrorActivity.reportError(handler, context, exception, MainActivity.class, null,
diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java
index 7a428a05d1f..0c840f8c331 100644
--- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java
@@ -3,6 +3,8 @@
import android.content.Context;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
+
+import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;
import androidx.annotation.Nullable;
@@ -16,6 +18,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@@ -263,10 +266,8 @@ static List getSortedStreamVideosList(final MediaFormat defaultForm
*/
private static void sortStreamList(final List videoStreams,
final boolean ascendingOrder) {
- Collections.sort(videoStreams, (o1, o2) -> {
- final int result = compareVideoStreamResolution(o1, o2);
- return result == 0 ? 0 : (ascendingOrder ? result : -result);
- });
+ final Comparator comparator = ListHelper::compareVideoStreamResolution;
+ Collections.sort(videoStreams, ascendingOrder ? comparator : comparator.reversed());
}
/**
@@ -543,7 +544,7 @@ private static String getResolutionLimit(final Context context) {
*/
public static boolean isMeteredNetwork(final Context context) {
final ConnectivityManager manager
- = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ = ContextCompat.getSystemService(context, ConnectivityManager.class);
if (manager == null || manager.getActiveNetworkInfo() == null) {
return false;
}
diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java
index 838e4e986bc..9cebfa8635b 100644
--- a/app/src/main/java/org/schabi/newpipe/util/Localization.java
+++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java
@@ -5,13 +5,15 @@
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
-import androidx.preference.PreferenceManager;
+import android.icu.text.CompactDecimalFormat;
+import android.os.Build;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import androidx.annotation.NonNull;
import androidx.annotation.PluralsRes;
import androidx.annotation.StringRes;
+import androidx.preference.PreferenceManager;
import org.ocpsoft.prettytime.PrettyTime;
import org.ocpsoft.prettytime.units.Decade;
@@ -21,11 +23,13 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
-import java.text.DateFormat;
import java.text.NumberFormat;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
import java.util.Arrays;
import java.util.Calendar;
-import java.util.Date;
import java.util.List;
import java.util.Locale;
@@ -137,13 +141,16 @@ public static String localizeNumber(final Context context, final double number)
return nf.format(number);
}
- public static String formatDate(final Date date, final Context context) {
- return DateFormat.getDateInstance(DateFormat.MEDIUM, getAppLocale(context)).format(date);
+ public static String formatDate(final OffsetDateTime offsetDateTime, final Context context) {
+ return DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
+ .withLocale(getAppLocale(context)).format(offsetDateTime
+ .atZoneSameInstant(ZoneId.systemDefault()));
}
@SuppressLint("StringFormatInvalid")
- public static String localizeUploadDate(final Context context, final Date date) {
- return context.getString(R.string.upload_date_text, formatDate(date, context));
+ public static String localizeUploadDate(final Context context,
+ final OffsetDateTime offsetDateTime) {
+ return context.getString(R.string.upload_date_text, formatDate(offsetDateTime, context));
}
public static String localizeViewCount(final Context context, final long viewCount) {
@@ -184,6 +191,11 @@ public static String localizeWatchingCount(final Context context, final long wat
}
public static String shortCount(final Context context, final long count) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ return CompactDecimalFormat.getInstance(getAppLocale(context),
+ CompactDecimalFormat.CompactStyle.SHORT).format(count);
+ }
+
final double value = (double) count;
if (count >= 1000000000) {
return localizeNumber(context, round(value / 1000000000, 1))
diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java
index eef70c1e5fb..b45a1e7b9bc 100644
--- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java
@@ -7,14 +7,14 @@
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
-import androidx.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
@@ -37,7 +37,6 @@
import org.schabi.newpipe.fragments.MainFragment;
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
import org.schabi.newpipe.fragments.list.channel.ChannelFragment;
-import org.schabi.newpipe.fragments.list.comments.CommentsFragment;
import org.schabi.newpipe.fragments.list.kiosk.KioskFragment;
import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment;
import org.schabi.newpipe.fragments.list.search.SearchFragment;
@@ -51,13 +50,14 @@
import org.schabi.newpipe.player.BasePlayer;
import org.schabi.newpipe.player.MainPlayer;
import org.schabi.newpipe.player.VideoPlayer;
+import org.schabi.newpipe.player.helper.PlayerHelper;
+import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
import org.schabi.newpipe.settings.SettingsActivity;
import java.util.ArrayList;
-@SuppressWarnings({"unused"})
public final class NavigationHelper {
public static final String MAIN_FRAGMENT_TAG = "main_fragment_tag";
public static final String SEARCH_FRAGMENT_TAG = "search_fragment_tag";
@@ -72,7 +72,6 @@ private NavigationHelper() { }
public static Intent getPlayerIntent(@NonNull final Context context,
@NonNull final Class targetClazz,
@Nullable final PlayQueue playQueue,
- @Nullable final String quality,
final boolean resumePlayback) {
final Intent intent = new Intent(context, targetClazz);
@@ -82,9 +81,6 @@ public static Intent getPlayerIntent(@NonNull final Context context,
intent.putExtra(VideoPlayer.PLAY_QUEUE_KEY, cacheKey);
}
}
- if (quality != null) {
- intent.putExtra(VideoPlayer.PLAYBACK_QUALITY, quality);
- }
intent.putExtra(VideoPlayer.RESUME_PLAYBACK, resumePlayback);
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_VIDEO);
@@ -95,8 +91,10 @@ public static Intent getPlayerIntent(@NonNull final Context context,
public static Intent getPlayerIntent(@NonNull final Context context,
@NonNull final Class targetClazz,
@Nullable final PlayQueue playQueue,
- final boolean resumePlayback) {
- return getPlayerIntent(context, targetClazz, playQueue, null, resumePlayback);
+ final boolean resumePlayback,
+ final boolean playWhenReady) {
+ return getPlayerIntent(context, targetClazz, playQueue, resumePlayback)
+ .putExtra(BasePlayer.PLAY_WHEN_READY, playWhenReady);
}
@NonNull
@@ -110,61 +108,25 @@ public static Intent getPlayerEnqueueIntent(@NonNull final Context context,
.putExtra(BasePlayer.SELECT_ON_APPEND, selectOnAppend);
}
- @NonNull
- public static Intent getPlayerIntent(@NonNull final Context context,
- @NonNull final Class targetClazz,
- @Nullable final PlayQueue playQueue,
- final int repeatMode,
- final float playbackSpeed,
- final float playbackPitch,
- final boolean playbackSkipSilence,
- @Nullable final String playbackQuality,
- final boolean resumePlayback,
- final boolean startPaused,
- final boolean isMuted) {
- return getPlayerIntent(context, targetClazz, playQueue, playbackQuality, resumePlayback)
- .putExtra(BasePlayer.REPEAT_MODE, repeatMode)
- .putExtra(BasePlayer.START_PAUSED, startPaused)
- .putExtra(BasePlayer.IS_MUTED, isMuted);
+ public static void playOnMainPlayer(final AppCompatActivity activity,
+ @NonNull final PlayQueue playQueue) {
+ final PlayQueueItem item = playQueue.getItem();
+ assert item != null;
+ openVideoDetailFragment(activity, activity.getSupportFragmentManager(),
+ item.getServiceId(), item.getUrl(), item.getTitle(), playQueue, false);
}
- public static void playOnMainPlayer(final AppCompatActivity activity,
- final PlayQueue queue,
- final boolean autoPlay) {
- playOnMainPlayer(activity.getSupportFragmentManager(), queue, autoPlay);
- }
-
- public static void playOnMainPlayer(final FragmentManager fragmentManager,
- final PlayQueue queue,
- final boolean autoPlay) {
- final PlayQueueItem currentStream = queue.getItem();
- openVideoDetailFragment(
- fragmentManager,
- currentStream.getServiceId(),
- currentStream.getUrl(),
- currentStream.getTitle(),
- autoPlay,
- queue);
- }
-
- public static void playOnMainPlayer(@NonNull final Context context,
- @Nullable final PlayQueue queue,
- @NonNull final StreamingService.LinkType linkType,
- @NonNull final String url,
- @NonNull final String title,
- final boolean autoPlay,
- final boolean resumePlayback) {
-
- final Intent intent = getPlayerIntent(context, MainActivity.class, queue, resumePlayback);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.putExtra(Constants.KEY_LINK_TYPE, linkType);
- intent.putExtra(Constants.KEY_URL, url);
- intent.putExtra(Constants.KEY_TITLE, title);
- intent.putExtra(VideoDetailFragment.AUTO_PLAY, autoPlay);
- context.startActivity(intent);
+ public static void playOnMainPlayer(final Context context,
+ @NonNull final PlayQueue playQueue,
+ final boolean switchingPlayers) {
+ final PlayQueueItem item = playQueue.getItem();
+ assert item != null;
+ openVideoDetail(context,
+ item.getServiceId(), item.getUrl(), item.getTitle(), playQueue, switchingPlayers);
}
- public static void playOnPopupPlayer(final Context context, final PlayQueue queue,
+ public static void playOnPopupPlayer(final Context context,
+ final PlayQueue queue,
final boolean resumePlayback) {
if (!PermissionHelper.isPopupEnabled(context)) {
PermissionHelper.showPopupEnablementToast(context);
@@ -174,7 +136,7 @@ public static void playOnPopupPlayer(final Context context, final PlayQueue queu
Toast.makeText(context, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show();
final Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback);
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_POPUP);
- startService(context, intent);
+ ContextCompat.startForegroundService(context, intent);
}
public static void playOnBackgroundPlayer(final Context context,
@@ -184,7 +146,24 @@ public static void playOnBackgroundPlayer(final Context context,
.show();
final Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback);
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_AUDIO);
- startService(context, intent);
+ ContextCompat.startForegroundService(context, intent);
+ }
+
+ public static void enqueueOnVideoPlayer(final Context context, final PlayQueue queue,
+ final boolean resumePlayback) {
+ enqueueOnVideoPlayer(context, queue, false, resumePlayback);
+ }
+
+ public static void enqueueOnVideoPlayer(final Context context, final PlayQueue queue,
+ final boolean selectOnAppend,
+ final boolean resumePlayback) {
+
+ Toast.makeText(context, R.string.enqueued, Toast.LENGTH_SHORT).show();
+ final Intent intent = getPlayerEnqueueIntent(
+ context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
+
+ intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_VIDEO);
+ ContextCompat.startForegroundService(context, intent);
}
public static void enqueueOnPopupPlayer(final Context context, final PlayQueue queue,
@@ -200,11 +179,11 @@ public static void enqueueOnPopupPlayer(final Context context, final PlayQueue q
return;
}
- Toast.makeText(context, R.string.popup_playing_append, Toast.LENGTH_SHORT).show();
+ Toast.makeText(context, R.string.enqueued, Toast.LENGTH_SHORT).show();
final Intent intent = getPlayerEnqueueIntent(
context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_POPUP);
- startService(context, intent);
+ ContextCompat.startForegroundService(context, intent);
}
public static void enqueueOnBackgroundPlayer(final Context context, final PlayQueue queue,
@@ -216,19 +195,11 @@ public static void enqueueOnBackgroundPlayer(final Context context,
final PlayQueue queue,
final boolean selectOnAppend,
final boolean resumePlayback) {
- Toast.makeText(context, R.string.background_player_append, Toast.LENGTH_SHORT).show();
+ Toast.makeText(context, R.string.enqueued, Toast.LENGTH_SHORT).show();
final Intent intent = getPlayerEnqueueIntent(
context, MainPlayer.class, queue, selectOnAppend, resumePlayback);
intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_AUDIO);
- startService(context, intent);
- }
-
- public static void startService(@NonNull final Context context, @NonNull final Intent intent) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- context.startForegroundService(intent);
- } else {
- context.startService(intent);
- }
+ ContextCompat.startForegroundService(context, intent);
}
/*//////////////////////////////////////////////////////////////////////////
@@ -290,9 +261,6 @@ public static void resolveActivityOrAskToInstall(final Context context, final In
.setNegativeButton(R.string.cancel, (dialog, which)
-> Log.i("NavigationHelper", "You unlocked a secret unicorn."))
.show();
-// Log.e("NavigationHelper",
-// "Either no Streaming player for audio was installed, "
-// + "or something important crashed:");
} else {
Toast.makeText(context, R.string.no_player_found_toast, Toast.LENGTH_LONG).show();
}
@@ -348,41 +316,6 @@ public static void openSearchFragment(final FragmentManager fragmentManager,
.commit();
}
- public static void openVideoDetailFragment(final FragmentManager fragmentManager,
- final int serviceId, final String url,
- final String title) {
- openVideoDetailFragment(fragmentManager, serviceId, url, title, true, null);
- }
-
- public static void openVideoDetailFragment(
- final FragmentManager fragmentManager,
- final int serviceId,
- final String url,
- final String title,
- final boolean autoPlay,
- final PlayQueue playQueue) {
- final Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_player_holder);
-
- if (fragment instanceof VideoDetailFragment && fragment.isVisible()) {
- expandMainPlayer(fragment.requireActivity());
- final VideoDetailFragment detailFragment = (VideoDetailFragment) fragment;
- detailFragment.setAutoplay(autoPlay);
- detailFragment
- .selectAndLoadVideo(serviceId, url, title == null ? "" : title, playQueue);
- detailFragment.scrollToTop();
- return;
- }
-
- final VideoDetailFragment instance = VideoDetailFragment
- .getInstance(serviceId, url, title == null ? "" : title, playQueue);
- instance.setAutoplay(autoPlay);
-
- defaultTransaction(fragmentManager)
- .replace(R.id.fragment_player_holder, instance)
- .runOnCommit(() -> expandMainPlayer(instance.requireActivity()))
- .commit();
- }
-
public static void expandMainPlayer(final Context context) {
context.sendBroadcast(new Intent(VideoDetailFragment.ACTION_SHOW_MAIN_PLAYER));
}
@@ -396,36 +329,79 @@ public static void showMiniPlayer(final FragmentManager fragmentManager) {
defaultTransaction(fragmentManager)
.replace(R.id.fragment_player_holder, instance)
.runOnCommit(() -> sendPlayerStartedEvent(instance.requireActivity()))
- .commit();
+ .commitAllowingStateLoss();
+ }
+
+ private interface RunnableWithVideoDetailFragment {
+ void run(VideoDetailFragment detailFragment);
+ }
+
+ public static void openVideoDetailFragment(@NonNull final Context context,
+ @NonNull final FragmentManager fragmentManager,
+ final int serviceId,
+ @Nullable final String url,
+ @NonNull final String title,
+ @Nullable final PlayQueue playQueue,
+ final boolean switchingPlayers) {
+
+ final boolean autoPlay;
+ @Nullable final MainPlayer.PlayerType playerType = PlayerHolder.getType();
+ if (playerType == null) {
+ // no player open
+ autoPlay = PlayerHelper.isAutoplayAllowedByUser(context);
+ } else if (switchingPlayers) {
+ // switching player to main player
+ autoPlay = PlayerHolder.isPlaying(); // keep play/pause state
+ } else if (playerType == MainPlayer.PlayerType.VIDEO) {
+ // opening new stream while already playing in main player
+ autoPlay = PlayerHelper.isAutoplayAllowedByUser(context);
+ } else {
+ // opening new stream while already playing in another player
+ autoPlay = false;
+ }
+
+ final RunnableWithVideoDetailFragment onVideoDetailFragmentReady = (detailFragment) -> {
+ expandMainPlayer(detailFragment.requireActivity());
+ detailFragment.setAutoPlay(autoPlay);
+ if (switchingPlayers) {
+ // Situation when user switches from players to main player. All needed data is
+ // here, we can start watching (assuming newQueue equals playQueue).
+ detailFragment.openVideoPlayer();
+ } else {
+ detailFragment.selectAndLoadVideo(serviceId, url, title, playQueue);
+ }
+ detailFragment.scrollToTop();
+ };
+
+ final Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_player_holder);
+ if (fragment instanceof VideoDetailFragment && fragment.isVisible()) {
+ onVideoDetailFragmentReady.run((VideoDetailFragment) fragment);
+ } else {
+ final VideoDetailFragment instance = VideoDetailFragment
+ .getInstance(serviceId, url, title, playQueue);
+ instance.setAutoPlay(autoPlay);
+
+ defaultTransaction(fragmentManager)
+ .replace(R.id.fragment_player_holder, instance)
+ .runOnCommit(() -> onVideoDetailFragmentReady.run(instance))
+ .commit();
+ }
}
public static void openChannelFragment(final FragmentManager fragmentManager,
final int serviceId, final String url,
- final String name) {
+ @NonNull final String name) {
defaultTransaction(fragmentManager)
- .replace(R.id.fragment_holder, ChannelFragment.getInstance(serviceId, url,
- name == null ? "" : name))
- .addToBackStack(null)
- .commit();
- }
-
- public static void openCommentsFragment(final FragmentManager fragmentManager,
- final int serviceId, final String url,
- final String name) {
- fragmentManager.beginTransaction()
- .setCustomAnimations(R.anim.switch_service_in, R.anim.switch_service_out)
- .replace(R.id.fragment_holder, CommentsFragment.getInstance(serviceId, url,
- name == null ? "" : name))
+ .replace(R.id.fragment_holder, ChannelFragment.getInstance(serviceId, url, name))
.addToBackStack(null)
.commit();
}
public static void openPlaylistFragment(final FragmentManager fragmentManager,
final int serviceId, final String url,
- final String name) {
+ @NonNull final String name) {
defaultTransaction(fragmentManager)
- .replace(R.id.fragment_holder, PlaylistFragment.getInstance(serviceId, url,
- name == null ? "" : name))
+ .replace(R.id.fragment_holder, PlaylistFragment.getInstance(serviceId, url, name))
.addToBackStack(null)
.commit();
}
@@ -501,33 +477,26 @@ public static void openSearch(final Context context, final int serviceId,
context.startActivity(mIntent);
}
- public static void openChannel(final Context context, final int serviceId, final String url) {
- openChannel(context, serviceId, url, null);
- }
+ public static void openVideoDetail(final Context context,
+ final int serviceId,
+ final String url,
+ @NonNull final String title,
+ @Nullable final PlayQueue playQueue,
+ final boolean switchingPlayers) {
- public static void openChannel(final Context context, final int serviceId,
- final String url, final String name) {
- final Intent openIntent = getOpenIntent(context, url, serviceId,
- StreamingService.LinkType.CHANNEL);
- if (name != null && !name.isEmpty()) {
- openIntent.putExtra(Constants.KEY_TITLE, name);
- }
- context.startActivity(openIntent);
- }
-
- public static void openVideoDetail(final Context context, final int serviceId,
- final String url) {
- openVideoDetail(context, serviceId, url, null);
- }
-
- public static void openVideoDetail(final Context context, final int serviceId,
- final String url, final String title) {
- final Intent openIntent = getOpenIntent(context, url, serviceId,
+ final Intent intent = getOpenIntent(context, url, serviceId,
StreamingService.LinkType.STREAM);
- if (title != null && !title.isEmpty()) {
- openIntent.putExtra(Constants.KEY_TITLE, title);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(Constants.KEY_TITLE, title);
+ intent.putExtra(VideoDetailFragment.KEY_SWITCHING_PLAYERS, switchingPlayers);
+
+ if (playQueue != null) {
+ final String cacheKey = SerializedCache.getInstance().put(playQueue, PlayQueue.class);
+ if (cacheKey != null) {
+ intent.putExtra(VideoPlayer.PLAY_QUEUE_KEY, cacheKey);
+ }
}
- context.startActivity(openIntent);
+ context.startActivity(intent);
}
public static void openMainActivity(final Context context) {
@@ -540,7 +509,6 @@ public static void openMainActivity(final Context context) {
public static void openRouterActivity(final Context context, final String url) {
final Intent mIntent = new Intent(context, RouterActivity.class);
mIntent.setData(Uri.parse(url));
- mIntent.putExtra(RouterActivity.INTERNAL_ROUTE_KEY, true);
context.startActivity(mIntent);
}
@@ -554,14 +522,12 @@ public static void openSettings(final Context context) {
context.startActivity(intent);
}
- public static boolean openDownloads(final Activity activity) {
- if (!PermissionHelper.checkStoragePermissions(
+ public static void openDownloads(final Activity activity) {
+ if (PermissionHelper.checkStoragePermissions(
activity, PermissionHelper.DOWNLOADS_REQUEST_CODE)) {
- return false;
+ final Intent intent = new Intent(activity, DownloadActivity.class);
+ activity.startActivity(intent);
}
- final Intent intent = new Intent(activity, DownloadActivity.class);
- activity.startActivity(intent);
- return true;
}
public static Intent getPlayQueueActivityIntent(final Context context) {
@@ -590,7 +556,8 @@ public static Intent getIntentByLink(final Context context, final String url)
return getIntentByLink(context, NewPipe.getServiceByUrl(url), url);
}
- public static Intent getIntentByLink(final Context context, final StreamingService service,
+ public static Intent getIntentByLink(final Context context,
+ final StreamingService service,
final String url) throws ExtractionException {
final StreamingService.LinkType linkType = service.getLinkTypeByUrl(url);
@@ -599,15 +566,7 @@ public static Intent getIntentByLink(final Context context, final StreamingServi
+ " url=" + url);
}
- final Intent rIntent = getOpenIntent(context, url, service.getServiceId(), linkType);
-
- if (linkType == StreamingService.LinkType.STREAM) {
- rIntent.putExtra(VideoDetailFragment.AUTO_PLAY,
- PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
- context.getString(R.string.autoplay_through_intent_key), false));
- }
-
- return rIntent;
+ return getOpenIntent(context, url, service.getServiceId(), linkType);
}
private static Uri openMarketUrl(final String packageName) {
diff --git a/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java
index 1283f67f519..b631f19da53 100644
--- a/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java
+++ b/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java
@@ -9,6 +9,8 @@
import android.net.Uri;
import android.widget.Toast;
+import androidx.core.content.ContextCompat;
+
import org.schabi.newpipe.R;
public final class ShareUtils {
@@ -95,7 +97,7 @@ public static void shareUrl(final Context context, final String subject, final S
*/
public static void copyToClipboard(final Context context, final String text) {
final ClipboardManager clipboardManager =
- (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+ ContextCompat.getSystemService(context, ClipboardManager.class);
if (clipboardManager == null) {
Toast.makeText(context,
diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java
index a1e2e6eb9d2..34ff637ad61 100644
--- a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java
+++ b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java
@@ -7,22 +7,41 @@
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import org.schabi.newpipe.local.dialog.PlaylistAppendDialog;
+import org.schabi.newpipe.local.dialog.PlaylistCreationDialog;
+import org.schabi.newpipe.player.MainPlayer;
+import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.SinglePlayQueue;
import java.util.Collections;
+import java.util.List;
+
+import static org.schabi.newpipe.player.MainPlayer.PlayerType.AUDIO;
+import static org.schabi.newpipe.player.MainPlayer.PlayerType.POPUP;
public enum StreamDialogEntry {
//////////////////////////////////////
// enum values with DEFAULT actions //
//////////////////////////////////////
- enqueue_on_background(R.string.enqueue_on_background, (fragment, item) ->
- NavigationHelper.enqueueOnBackgroundPlayer(fragment.getContext(),
- new SinglePlayQueue(item), false)),
+ /**
+ * Enqueues the stream automatically to the current PlayerType.
+ *
+ * Info: Add this entry within showStreamDialog.
+ */
+ enqueue(R.string.enqueue_stream, (fragment, item) -> {
+ final MainPlayer.PlayerType type = PlayerHolder.getType();
- enqueue_on_popup(R.string.enqueue_on_popup, (fragment, item) ->
+ if (type == AUDIO) {
+ NavigationHelper.enqueueOnBackgroundPlayer(fragment.getContext(),
+ new SinglePlayQueue(item), false);
+ } else if (type == POPUP) {
NavigationHelper.enqueueOnPopupPlayer(fragment.getContext(),
- new SinglePlayQueue(item), false)),
+ new SinglePlayQueue(item), false);
+ } else /* type == VIDEO */ {
+ NavigationHelper.enqueueOnVideoPlayer(fragment.getContext(),
+ new SinglePlayQueue(item), false);
+ }
+ }),
start_here_on_background(R.string.start_here_on_background, (fragment, item) ->
NavigationHelper.playOnBackgroundPlayer(fragment.getContext(),
@@ -40,8 +59,14 @@ public enum StreamDialogEntry {
append_playlist(R.string.append_playlist, (fragment, item) -> {
if (fragment.getFragmentManager() != null) {
- PlaylistAppendDialog.fromStreamInfoItems(Collections.singletonList(item))
- .show(fragment.getFragmentManager(), "StreamDialogEntry@append_playlist");
+ final PlaylistAppendDialog d = PlaylistAppendDialog
+ .fromStreamInfoItems(Collections.singletonList(item));
+
+ PlaylistAppendDialog.onPlaylistFound(fragment.getContext(),
+ () -> d.show(fragment.getFragmentManager(), "StreamDialogEntry@append_playlist"),
+ () -> PlaylistCreationDialog.newInstance(d)
+ .show(fragment.getFragmentManager(), "StreamDialogEntry@create_playlist")
+ );
}
}),
@@ -69,6 +94,10 @@ public enum StreamDialogEntry {
// non-static methods to initialize and edit entries //
///////////////////////////////////////////////////////
+ public static void setEnabledEntries(final List entries) {
+ setEnabledEntries(entries.toArray(new StreamDialogEntry[0]));
+ }
+
/**
* To be called before using {@link #setCustomAction(StreamDialogEntryAction)}.
*
diff --git a/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java b/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java
index a23172bd318..e7a028d508d 100644
--- a/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java
+++ b/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java
@@ -1,8 +1,7 @@
package org.schabi.newpipe.views;
import android.content.Context;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
+import android.os.Build;
import android.util.AttributeSet;
import android.view.SurfaceView;
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
@@ -47,7 +46,8 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec
if (resizeMode == RESIZE_MODE_FIT
// KitKat doesn't work well when a view has a scale like needed for ZOOM
- || (resizeMode == RESIZE_MODE_ZOOM && VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)) {
+ || (resizeMode == RESIZE_MODE_ZOOM
+ && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)) {
if (aspectDeformation > 0) {
height = (int) (width / videoAspectRatio);
} else {
diff --git a/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java b/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java
index dc5bf7133b3..29c38511c2e 100644
--- a/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java
+++ b/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java
@@ -270,7 +270,7 @@ private static void fixFocusHierarchy(final View decor) {
clearFocusObstacles((ViewGroup) decor);
}
- @RequiresApi(api = 26)
+ @RequiresApi(api = Build.VERSION_CODES.O)
private static void clearFocusObstacles(final ViewGroup viewGroup) {
viewGroup.setTouchscreenBlocksFocus(false);
diff --git a/app/src/main/java/us/shandian/giga/get/Mission.java b/app/src/main/java/us/shandian/giga/get/Mission.java
index 8e814a2aff5..ff131988428 100644
--- a/app/src/main/java/us/shandian/giga/get/Mission.java
+++ b/app/src/main/java/us/shandian/giga/get/Mission.java
@@ -35,6 +35,10 @@ public abstract class Mission implements Serializable {
*/
public StoredFileHelper storage;
+ public long getTimestamp() {
+ return timestamp;
+ }
+
/**
* Delete the downloaded file
*
diff --git a/app/src/main/java/us/shandian/giga/io/StoredDirectoryHelper.java b/app/src/main/java/us/shandian/giga/io/StoredDirectoryHelper.java
index 8f6070ff4d3..8f7e18a3173 100644
--- a/app/src/main/java/us/shandian/giga/io/StoredDirectoryHelper.java
+++ b/app/src/main/java/us/shandian/giga/io/StoredDirectoryHelper.java
@@ -212,7 +212,7 @@ public boolean canWrite() {
@NonNull
@Override
public String toString() {
- return docTree == null ? Uri.fromFile(ioTree).toString() : docTree.getUri().toString();
+ return (docTree == null ? Uri.fromFile(ioTree) : docTree.getUri()).toString();
}
diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManager.java b/app/src/main/java/us/shandian/giga/service/DownloadManager.java
index 994c6ee63ea..dc4d5701bc9 100644
--- a/app/src/main/java/us/shandian/giga/service/DownloadManager.java
+++ b/app/src/main/java/us/shandian/giga/service/DownloadManager.java
@@ -12,7 +12,8 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Iterator;
+import java.util.Comparator;
+import java.util.List;
import us.shandian.giga.get.DownloadMission;
import us.shandian.giga.get.FinishedMission;
@@ -198,7 +199,7 @@ private void loadPendingMissions(Context ctx) {
}
if (mMissionsPending.size() > 1)
- Collections.sort(mMissionsPending, (mission1, mission2) -> Long.compare(mission1.timestamp, mission2.timestamp));
+ Collections.sort(mMissionsPending, Comparator.comparingLong(Mission::getTimestamp));
}
/**
@@ -563,14 +564,10 @@ private ArrayList getSpecialItems() {
synchronized (DownloadManager.this) {
ArrayList pending = new ArrayList<>(mMissionsPending);
ArrayList finished = new ArrayList<>(mMissionsFinished);
- ArrayList remove = new ArrayList<>(hidden);
+ List remove = new ArrayList<>(hidden);
// hide missions (if required)
- Iterator iterator = remove.iterator();
- while (iterator.hasNext()) {
- Mission mission = iterator.next();
- if (pending.remove(mission) || finished.remove(mission)) iterator.remove();
- }
+ remove.removeIf(mission -> pending.remove(mission) || finished.remove(mission));
int fakeTotal = pending.size();
if (fakeTotal > 0) fakeTotal++;
diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java
index 828f1adaf91..0392e723538 100755
--- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java
+++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java
@@ -24,6 +24,8 @@
import android.os.IBinder;
import android.os.Message;
import android.os.Parcelable;
+
+import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;
import android.util.Log;
import android.util.SparseArray;
@@ -157,8 +159,10 @@ public void onCreate() {
mNotification = builder.build();
- mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+ mNotificationManager = ContextCompat.getSystemService(this,
+ NotificationManager.class);
+ mConnectivityManager = ContextCompat.getSystemService(this,
+ ConnectivityManager.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mNetworkStateListenerL = new ConnectivityManager.NetworkCallback() {
diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java
index c9518e477fc..80c238d9109 100644
--- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java
+++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java
@@ -1,13 +1,11 @@
package us.shandian.giga.ui.adapter;
import android.annotation.SuppressLint;
-import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
@@ -26,7 +24,6 @@
import android.widget.Toast;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.FileProvider;
@@ -46,12 +43,15 @@
import org.schabi.newpipe.util.NavigationHelper;
import java.io.File;
-import java.lang.ref.WeakReference;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.schedulers.Schedulers;
import us.shandian.giga.get.DownloadMission;
import us.shandian.giga.get.FinishedMission;
import us.shandian.giga.get.Mission;
@@ -116,11 +116,13 @@ public class MissionAdapter extends Adapter implements Handler.Callb
private final Runnable rUpdater = this::updater;
private final Runnable rDelete = this::deleteFinishedDownloads;
+ private final CompositeDisposable compositeDisposable = new CompositeDisposable();
+
public MissionAdapter(Context context, @NonNull DownloadManager downloadManager, View emptyMessage, View root) {
mContext = context;
mDownloadManager = downloadManager;
- mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ mInflater = LayoutInflater.from(mContext);
mLayout = R.layout.mission_item;
mHandler = new Handler(context.getMainLooper());
@@ -675,7 +677,30 @@ private boolean handlePopupItem(@NonNull ViewHolderItem h, @NonNull MenuItem opt
return true;
case R.id.md5:
case R.id.sha1:
- new ChecksumTask(mContext).execute(h.item.mission.storage, ALGORITHMS.get(id));
+ ProgressDialog progressDialog = null;
+ if (mContext != null) {
+ // Create dialog
+ progressDialog = new ProgressDialog(mContext);
+ progressDialog.setCancelable(false);
+ progressDialog.setMessage(mContext.getString(R.string.msg_wait));
+ progressDialog.show();
+ }
+ final ProgressDialog finalProgressDialog = progressDialog;
+ final StoredFileHelper storage = h.item.mission.storage;
+ compositeDisposable.add(
+ Observable.fromCallable(() -> Utility.checksum(storage, ALGORITHMS.get(id)))
+ .subscribeOn(Schedulers.computation())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(result -> {
+ if (finalProgressDialog != null) {
+ Utility.copyToClipboard(finalProgressDialog.getContext(),
+ result);
+ if (mContext != null) {
+ finalProgressDialog.dismiss();
+ }
+ }
+ })
+ );
return true;
case R.id.source:
/*Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(h.item.mission.source));
@@ -758,8 +783,8 @@ public void refreshMissionItems() {
}
}
-
public void onDestroy() {
+ compositeDisposable.dispose();
mDeleter.dispose();
}
@@ -960,60 +985,7 @@ class ViewHolderHeader extends RecyclerView.ViewHolder {
}
}
-
- static class ChecksumTask extends AsyncTask {
- ProgressDialog progressDialog;
- WeakReference weakReference;
-
- ChecksumTask(@NonNull Context context) {
- weakReference = new WeakReference<>((Activity) context);
- }
-
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
-
- Activity activity = getActivity();
- if (activity != null) {
- // Create dialog
- progressDialog = new ProgressDialog(activity);
- progressDialog.setCancelable(false);
- progressDialog.setMessage(activity.getString(R.string.msg_wait));
- progressDialog.show();
- }
- }
-
- @Override
- protected String doInBackground(Object... params) {
- return Utility.checksum((StoredFileHelper) params[0], (String) params[1]);
- }
-
- @Override
- protected void onPostExecute(String result) {
- super.onPostExecute(result);
-
- if (progressDialog != null) {
- Utility.copyToClipboard(progressDialog.getContext(), result);
- if (getActivity() != null) {
- progressDialog.dismiss();
- }
- }
- }
-
- @Nullable
- private Activity getActivity() {
- Activity activity = weakReference.get();
-
- if (activity != null && activity.isFinishing()) {
- return null;
- } else {
- return activity;
- }
- }
- }
-
public interface RecoverHelper {
void tryRecover(DownloadMission mission);
}
-
}
diff --git a/app/src/main/java/us/shandian/giga/ui/common/ProgressDrawable.java b/app/src/main/java/us/shandian/giga/ui/common/ProgressDrawable.java
index bec947540d2..2a8077d51fa 100644
--- a/app/src/main/java/us/shandian/giga/ui/common/ProgressDrawable.java
+++ b/app/src/main/java/us/shandian/giga/ui/common/ProgressDrawable.java
@@ -83,8 +83,8 @@ public void draw(@NonNull Canvas canvas) {
// render marquee
width += size * 2;
Path marquee = new Path();
- for (float i = -size; i < width; i += size) {
- marquee.addPath(mMarqueeLine, i + mMarqueeProgress, 0);
+ for (int i = -size; i < width; i += size) {
+ marquee.addPath(mMarqueeLine, ((float)i + mMarqueeProgress), 0);
}
marquee.close();
diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java
index 35f40aa825b..265491b8a74 100644
--- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java
+++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java
@@ -224,9 +224,10 @@ private void updateList() {
mList.setAdapter(mAdapter);
if (mSwitch != null) {
- mSwitch.setIcon(mLinear
- ? ThemeHelper.resolveResourceIdFromAttr(requireContext(), R.attr.ic_grid)
- : ThemeHelper.resolveResourceIdFromAttr(requireContext(), R.attr.ic_list));
+ mSwitch.setIcon(ThemeHelper.resolveResourceIdFromAttr(
+ requireContext(), mLinear
+ ? R.attr.ic_grid
+ : R.attr.ic_list));
mSwitch.setTitle(mLinear ? R.string.grid : R.string.list);
mPrefs.edit().putBoolean("linear", mLinear).apply();
}
diff --git a/app/src/main/java/us/shandian/giga/util/Utility.java b/app/src/main/java/us/shandian/giga/util/Utility.java
index 551e80a3e65..79924435ff2 100644
--- a/app/src/main/java/us/shandian/giga/util/Utility.java
+++ b/app/src/main/java/us/shandian/giga/util/Utility.java
@@ -201,7 +201,7 @@ public static int getIconForFileType(FileType type) {
}
public static void copyToClipboard(Context context, String str) {
- ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+ ClipboardManager cm = ContextCompat.getSystemService(context, ClipboardManager.class);
if (cm == null) {
Toast.makeText(context, R.string.permission_denied, Toast.LENGTH_LONG).show();
diff --git a/app/src/main/res/anim/switch_service_in.xml b/app/src/main/res/anim/switch_service_in.xml
index a49d1dabab6..b15e579995a 100644
--- a/app/src/main/res/anim/switch_service_in.xml
+++ b/app/src/main/res/anim/switch_service_in.xml
@@ -1,9 +1,9 @@
+ android:interpolator="@android:interpolator/decelerate_quint">
+ android:toAlpha="1.0" />
diff --git a/app/src/main/res/anim/switch_service_out.xml b/app/src/main/res/anim/switch_service_out.xml
index 635d1630ee7..824efc9a8fd 100644
--- a/app/src/main/res/anim/switch_service_out.xml
+++ b/app/src/main/res/anim/switch_service_out.xml
@@ -1,9 +1,9 @@
+ android:interpolator="@android:interpolator/accelerate_quint">
+ android:toAlpha="0.00" />
diff --git a/app/src/main/res/animator/custom_fade_in.xml b/app/src/main/res/animator/custom_fade_in.xml
index fa7f516c24f..f8df118cc18 100644
--- a/app/src/main/res/animator/custom_fade_in.xml
+++ b/app/src/main/res/animator/custom_fade_in.xml
@@ -5,5 +5,5 @@
android:interpolator="@android:interpolator/accelerate_decelerate"
android:propertyName="alpha"
android:valueFrom="0.0f"
- android:valueTo="1.0f"/>
-
\ No newline at end of file
+ android:valueTo="1.0f" />
+
diff --git a/app/src/main/res/animator/custom_fade_out.xml b/app/src/main/res/animator/custom_fade_out.xml
index db3662647e1..3f71e5c5820 100644
--- a/app/src/main/res/animator/custom_fade_out.xml
+++ b/app/src/main/res/animator/custom_fade_out.xml
@@ -5,5 +5,5 @@
android:interpolator="@android:interpolator/accelerate_decelerate"
android:propertyName="alpha"
android:valueFrom="1.0f"
- android:valueTo="0.0f"/>
-
\ No newline at end of file
+ android:valueTo="0.0f" />
+
diff --git a/app/src/main/res/drawable-hdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-hdpi/ic_close_white_24dp_png.png
index 2f73a04b16d..9af50602df3 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_close_white_24dp_png.png and b/app/src/main/res/drawable-hdpi/ic_close_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-hdpi/ic_hourglass_top_white_24dp_png.png
index 13050da089b..dc2f5122a91 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_hourglass_top_white_24dp_png.png and b/app/src/main/res/drawable-hdpi/ic_hourglass_top_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-hdpi/ic_newpipe_triangle_white.png
index cb26a5f65ea..6c05313dd12 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-hdpi/ic_newpipe_triangle_white.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_newpipe_update.png b/app/src/main/res/drawable-hdpi/ic_newpipe_update.png
index cbf336a1f17..f8e0fc5970a 100755
Binary files a/app/src/main/res/drawable-hdpi/ic_newpipe_update.png and b/app/src/main/res/drawable-hdpi/ic_newpipe_update.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-hdpi/ic_replay_white_24dp_png.png
index 8c5afb38015..01b248180c0 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_replay_white_24dp_png.png and b/app/src/main/res/drawable-hdpi/ic_replay_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-mdpi/ic_close_white_24dp_png.png
index d8aa2f7c472..199af130323 100644
Binary files a/app/src/main/res/drawable-mdpi/ic_close_white_24dp_png.png and b/app/src/main/res/drawable-mdpi/ic_close_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-mdpi/ic_hourglass_top_white_24dp_png.png
index 2343e8cb9e2..8df1a61ec82 100644
Binary files a/app/src/main/res/drawable-mdpi/ic_hourglass_top_white_24dp_png.png and b/app/src/main/res/drawable-mdpi/ic_hourglass_top_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-mdpi/ic_newpipe_triangle_white.png
index fc86823ac08..97c60c91c5f 100644
Binary files a/app/src/main/res/drawable-mdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-mdpi/ic_newpipe_triangle_white.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_newpipe_update.png b/app/src/main/res/drawable-mdpi/ic_newpipe_update.png
index 8ab23eb6a23..23b1dbfa377 100755
Binary files a/app/src/main/res/drawable-mdpi/ic_newpipe_update.png and b/app/src/main/res/drawable-mdpi/ic_newpipe_update.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-mdpi/ic_replay_white_24dp_png.png
index 038804d1133..f351cf709a8 100644
Binary files a/app/src/main/res/drawable-mdpi/ic_replay_white_24dp_png.png and b/app/src/main/res/drawable-mdpi/ic_replay_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-nodpi/background_header.png b/app/src/main/res/drawable-nodpi/background_header.png
index b417038f6b9..04032b55d3f 100644
Binary files a/app/src/main/res/drawable-nodpi/background_header.png and b/app/src/main/res/drawable-nodpi/background_header.png differ
diff --git a/app/src/main/res/drawable-nodpi/buddy.png b/app/src/main/res/drawable-nodpi/buddy.png
index 1b414ffa7e5..878c5dff3ee 100644
Binary files a/app/src/main/res/drawable-nodpi/buddy.png and b/app/src/main/res/drawable-nodpi/buddy.png differ
diff --git a/app/src/main/res/drawable-nodpi/buddy_channel_item.png b/app/src/main/res/drawable-nodpi/buddy_channel_item.png
index d43c2cbd996..3c5f8f994b7 100644
Binary files a/app/src/main/res/drawable-nodpi/buddy_channel_item.png and b/app/src/main/res/drawable-nodpi/buddy_channel_item.png differ
diff --git a/app/src/main/res/drawable-nodpi/channel_banner.png b/app/src/main/res/drawable-nodpi/channel_banner.png
index 94b25e98b6d..7532bd3a2f8 100644
Binary files a/app/src/main/res/drawable-nodpi/channel_banner.png and b/app/src/main/res/drawable-nodpi/channel_banner.png differ
diff --git a/app/src/main/res/drawable-nodpi/dummy_thumbnail.png b/app/src/main/res/drawable-nodpi/dummy_thumbnail.png
index 24230b261e2..49d6e511060 100644
Binary files a/app/src/main/res/drawable-nodpi/dummy_thumbnail.png and b/app/src/main/res/drawable-nodpi/dummy_thumbnail.png differ
diff --git a/app/src/main/res/drawable-nodpi/dummy_thumbnail_dark.png b/app/src/main/res/drawable-nodpi/dummy_thumbnail_dark.png
index 7123a6f01be..d6ab854c33b 100644
Binary files a/app/src/main/res/drawable-nodpi/dummy_thumbnail_dark.png and b/app/src/main/res/drawable-nodpi/dummy_thumbnail_dark.png differ
diff --git a/app/src/main/res/drawable-nodpi/dummy_thumbnail_playlist.png b/app/src/main/res/drawable-nodpi/dummy_thumbnail_playlist.png
index c70e4bf14d0..3873b83cce7 100644
Binary files a/app/src/main/res/drawable-nodpi/dummy_thumbnail_playlist.png and b/app/src/main/res/drawable-nodpi/dummy_thumbnail_playlist.png differ
diff --git a/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png b/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png
index 99b91d3745e..55c5c105da7 100644
Binary files a/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png and b/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png differ
diff --git a/app/src/main/res/drawable-nodpi/not_available_monkey.png b/app/src/main/res/drawable-nodpi/not_available_monkey.png
index ef0068bed43..babd536024a 100644
Binary files a/app/src/main/res/drawable-nodpi/not_available_monkey.png and b/app/src/main/res/drawable-nodpi/not_available_monkey.png differ
diff --git a/app/src/main/res/drawable-nodpi/place_holder_circle.png b/app/src/main/res/drawable-nodpi/place_holder_circle.png
index 704729e8fc8..630d0454e53 100644
Binary files a/app/src/main/res/drawable-nodpi/place_holder_circle.png and b/app/src/main/res/drawable-nodpi/place_holder_circle.png differ
diff --git a/app/src/main/res/drawable-nodpi/place_holder_cloud.png b/app/src/main/res/drawable-nodpi/place_holder_cloud.png
index f78e846e155..0f9bd26c282 100644
Binary files a/app/src/main/res/drawable-nodpi/place_holder_cloud.png and b/app/src/main/res/drawable-nodpi/place_holder_cloud.png differ
diff --git a/app/src/main/res/drawable-nodpi/place_holder_gadse.png b/app/src/main/res/drawable-nodpi/place_holder_gadse.png
index f11dd57e536..7e3d22e8105 100644
Binary files a/app/src/main/res/drawable-nodpi/place_holder_gadse.png and b/app/src/main/res/drawable-nodpi/place_holder_gadse.png differ
diff --git a/app/src/main/res/drawable-nodpi/place_holder_peertube.png b/app/src/main/res/drawable-nodpi/place_holder_peertube.png
index 68850054d27..331bf94f68d 100644
Binary files a/app/src/main/res/drawable-nodpi/place_holder_peertube.png and b/app/src/main/res/drawable-nodpi/place_holder_peertube.png differ
diff --git a/app/src/main/res/drawable-nodpi/place_holder_youtube.png b/app/src/main/res/drawable-nodpi/place_holder_youtube.png
index c4113e005cb..d147c6643a2 100644
Binary files a/app/src/main/res/drawable-nodpi/place_holder_youtube.png and b/app/src/main/res/drawable-nodpi/place_holder_youtube.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-xhdpi/ic_close_white_24dp_png.png
index 40782d05716..fc69b5bb517 100644
Binary files a/app/src/main/res/drawable-xhdpi/ic_close_white_24dp_png.png and b/app/src/main/res/drawable-xhdpi/ic_close_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white_24dp_png.png
index bdf88fb3b62..29a36f5431d 100644
Binary files a/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white_24dp_png.png and b/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-xhdpi/ic_newpipe_triangle_white.png
index b90c550500a..d4e94d0d1b3 100644
Binary files a/app/src/main/res/drawable-xhdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-xhdpi/ic_newpipe_triangle_white.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_newpipe_update.png b/app/src/main/res/drawable-xhdpi/ic_newpipe_update.png
index 5ee02aaa935..b9a296064c5 100755
Binary files a/app/src/main/res/drawable-xhdpi/ic_newpipe_update.png and b/app/src/main/res/drawable-xhdpi/ic_newpipe_update.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-xhdpi/ic_replay_white_24dp_png.png
index 4456670babc..153e3dbf31a 100644
Binary files a/app/src/main/res/drawable-xhdpi/ic_replay_white_24dp_png.png and b/app/src/main/res/drawable-xhdpi/ic_replay_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp_png.png
index 2cd1a88659f..9ec308cef34 100644
Binary files a/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp_png.png and b/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white_24dp_png.png
index f9a097f4de3..9d214c497cd 100644
Binary files a/app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white_24dp_png.png and b/app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-xxhdpi/ic_newpipe_triangle_white.png
index acde4439ee5..fa554585f59 100644
Binary files a/app/src/main/res/drawable-xxhdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-xxhdpi/ic_newpipe_triangle_white.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_newpipe_update.png b/app/src/main/res/drawable-xxhdpi/ic_newpipe_update.png
index 22f0e99d1b7..5d348e6e326 100755
Binary files a/app/src/main/res/drawable-xxhdpi/ic_newpipe_update.png and b/app/src/main/res/drawable-xxhdpi/ic_newpipe_update.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-xxhdpi/ic_replay_white_24dp_png.png
index e456ce595db..dc60f4ecd20 100644
Binary files a/app/src/main/res/drawable-xxhdpi/ic_replay_white_24dp_png.png and b/app/src/main/res/drawable-xxhdpi/ic_replay_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp_png.png
index 4d278c5bfba..535d1df0c9f 100644
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp_png.png and b/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white_24dp_png.png
index 7a099dabfe7..a0d5ba81e29 100644
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white_24dp_png.png and b/app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_newpipe_triangle_white.png b/app/src/main/res/drawable-xxxhdpi/ic_newpipe_triangle_white.png
index 93cfda12d84..26e134fac58 100644
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_newpipe_triangle_white.png and b/app/src/main/res/drawable-xxxhdpi/ic_newpipe_triangle_white.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_newpipe_update.png b/app/src/main/res/drawable-xxxhdpi/ic_newpipe_update.png
index 1f44c1aaf28..bc06d395323 100755
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_newpipe_update.png and b/app/src/main/res/drawable-xxxhdpi/ic_newpipe_update.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-xxxhdpi/ic_replay_white_24dp_png.png
index c2e9eb27bb5..372bc8bd150 100644
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_replay_white_24dp_png.png and b/app/src/main/res/drawable-xxxhdpi/ic_replay_white_24dp_png.png differ
diff --git a/app/src/main/res/drawable/background_oval_black_transparent.xml b/app/src/main/res/drawable/background_oval_black_transparent.xml
index 5db5969c654..e665f529960 100644
--- a/app/src/main/res/drawable/background_oval_black_transparent.xml
+++ b/app/src/main/res/drawable/background_oval_black_transparent.xml
@@ -2,4 +2,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/custom_progress_bar.xml b/app/src/main/res/drawable/custom_progress_bar.xml
index 251cde1718d..0ead1c4be97 100644
--- a/app/src/main/res/drawable/custom_progress_bar.xml
+++ b/app/src/main/res/drawable/custom_progress_bar.xml
@@ -2,16 +2,16 @@
-
-
+
-
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/dashed_border_black.xml b/app/src/main/res/drawable/dashed_border_black.xml
index b6bac6252c5..137184b86a2 100644
--- a/app/src/main/res/drawable/dashed_border_black.xml
+++ b/app/src/main/res/drawable/dashed_border_black.xml
@@ -3,6 +3,6 @@
-
\ No newline at end of file
+ android:dashWidth="4dp"
+ android:dashGap="4dp" />
+
diff --git a/app/src/main/res/drawable/dashed_border_dark.xml b/app/src/main/res/drawable/dashed_border_dark.xml
index 5af152ecc17..ff714a4489e 100644
--- a/app/src/main/res/drawable/dashed_border_dark.xml
+++ b/app/src/main/res/drawable/dashed_border_dark.xml
@@ -3,6 +3,6 @@
-
\ No newline at end of file
+ android:dashWidth="4dp"
+ android:dashGap="4dp" />
+
diff --git a/app/src/main/res/drawable/dashed_border_light.xml b/app/src/main/res/drawable/dashed_border_light.xml
index 5d29112bdc7..cc71acb7244 100644
--- a/app/src/main/res/drawable/dashed_border_light.xml
+++ b/app/src/main/res/drawable/dashed_border_light.xml
@@ -3,6 +3,6 @@
-
\ No newline at end of file
+ android:dashWidth="4dp"
+ android:dashGap="4dp" />
+
diff --git a/app/src/main/res/drawable/dot_default.xml b/app/src/main/res/drawable/dot_default.xml
index 3380dca3b40..fac1a2e8145 100644
--- a/app/src/main/res/drawable/dot_default.xml
+++ b/app/src/main/res/drawable/dot_default.xml
@@ -6,7 +6,7 @@
android:shape="ring"
android:thickness="4dp"
android:useLevel="false">
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/dot_selected.xml b/app/src/main/res/drawable/dot_selected.xml
index 017e99d43d2..77992e4a63e 100644
--- a/app/src/main/res/drawable/dot_selected.xml
+++ b/app/src/main/res/drawable/dot_selected.xml
@@ -6,7 +6,7 @@
android:shape="ring"
android:thickness="6dp"
android:useLevel="false">
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/drawer_header_bottom_background.xml b/app/src/main/res/drawable/drawer_header_bottom_background.xml
index 9135222749a..9f9792340e8 100644
--- a/app/src/main/res/drawable/drawer_header_bottom_background.xml
+++ b/app/src/main/res/drawable/drawer_header_bottom_background.xml
@@ -3,5 +3,5 @@
-
\ No newline at end of file
+ android:startColor="#4D000000" />
+
diff --git a/app/src/main/res/drawable/ic_add_black_24dp.xml b/app/src/main/res/drawable/ic_add_black_24dp.xml
index 0258249cc48..fedd077d841 100644
--- a/app/src/main/res/drawable/ic_add_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_add_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" />
diff --git a/app/src/main/res/drawable/ic_add_circle_outline_black_24dp.xml b/app/src/main/res/drawable/ic_add_circle_outline_black_24dp.xml
index 900f2275e48..1596099f3b1 100644
--- a/app/src/main/res/drawable/ic_add_circle_outline_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_add_circle_outline_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M13,7h-2v4L7,11v2h4v4h2v-4h4v-2h-4L13,7zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" />
diff --git a/app/src/main/res/drawable/ic_add_circle_outline_white_24dp.xml b/app/src/main/res/drawable/ic_add_circle_outline_white_24dp.xml
index 66d3247ae7c..2f2cfe3e3d9 100644
--- a/app/src/main/res/drawable/ic_add_circle_outline_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_add_circle_outline_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_add_white_24dp.xml b/app/src/main/res/drawable/ic_add_white_24dp.xml
index e3979cd7f25..bbda803b053 100644
--- a/app/src/main/res/drawable/ic_add_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_add_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_apps_black_24dp.xml b/app/src/main/res/drawable/ic_apps_black_24dp.xml
index ff485cf1a32..b8c4ab12e23 100644
--- a/app/src/main/res/drawable/ic_apps_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_apps_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z" />
diff --git a/app/src/main/res/drawable/ic_apps_white_24dp.xml b/app/src/main/res/drawable/ic_apps_white_24dp.xml
index 373f7752b8b..2d7d796f7cf 100644
--- a/app/src/main/res/drawable/ic_apps_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_apps_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml
index beafea3959e..2d68f797b50 100644
--- a/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" />
diff --git a/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml b/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml
index 71d5bbd2926..b7c7287839b 100644
--- a/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml
index 65e1e422817..270637216c1 100644
--- a/app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_drop_up_white_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_up_white_24dp.xml
index 1d266cecc8f..fdc9dcf8de5 100644
--- a/app/src/main/res/drawable/ic_arrow_drop_up_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_arrow_drop_up_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_asterisk_black_24dp.xml b/app/src/main/res/drawable/ic_asterisk_black_24dp.xml
index fa16cd5e8e7..840682feeb5 100644
--- a/app/src/main/res/drawable/ic_asterisk_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_asterisk_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
-
\ No newline at end of file
+ android:pathData="M10,2H14L13.21,9.91L19.66,5.27L21.66,8.73L14.42,12L21.66,15.27L19.66,18.73L13.21,14.09L14,22H10L10.79,14.09L4.34,18.73L2.34,15.27L9.58,12L2.34,8.73L4.34,5.27L10.79,9.91L10,2Z" />
+
diff --git a/app/src/main/res/drawable/ic_asterisk_white_24dp.xml b/app/src/main/res/drawable/ic_asterisk_white_24dp.xml
index bd487cb5579..c66bb405121 100644
--- a/app/src/main/res/drawable/ic_asterisk_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_asterisk_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
-
\ No newline at end of file
+ android:pathData="M10,2H14L13.21,9.91L19.66,5.27L21.66,8.73L14.42,12L21.66,15.27L19.66,18.73L13.21,14.09L14,22H10L10.79,14.09L4.34,18.73L2.34,15.27L9.58,12L2.34,8.73L4.34,5.27L10.79,9.91L10,2Z" />
+
diff --git a/app/src/main/res/drawable/ic_attach_money_black_24dp.xml b/app/src/main/res/drawable/ic_attach_money_black_24dp.xml
index b520fc98d09..dd93a7599c9 100644
--- a/app/src/main/res/drawable/ic_attach_money_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_attach_money_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M11.8,10.9c-2.27,-0.59 -3,-1.2 -3,-2.15 0,-1.09 1.01,-1.85 2.7,-1.85 1.78,0 2.44,0.85 2.5,2.1h2.21c-0.07,-1.72 -1.12,-3.3 -3.21,-3.81V3h-3v2.16c-1.94,0.42 -3.5,1.68 -3.5,3.61 0,2.31 1.91,3.46 4.7,4.13 2.5,0.6 3,1.48 3,2.41 0,0.69 -0.49,1.79 -2.7,1.79 -2.06,0 -2.87,-0.92 -2.98,-2.1h-2.2c0.12,2.19 1.76,3.42 3.68,3.83V21h3v-2.15c1.95,-0.37 3.5,-1.5 3.5,-3.55 0,-2.84 -2.43,-3.81 -4.7,-4.4z" />
diff --git a/app/src/main/res/drawable/ic_attach_money_white_24dp.xml b/app/src/main/res/drawable/ic_attach_money_white_24dp.xml
index d198dd14d41..fcc1ab160c0 100644
--- a/app/src/main/res/drawable/ic_attach_money_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_attach_money_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_backup_black_24dp.xml b/app/src/main/res/drawable/ic_backup_black_24dp.xml
index 086281669fa..200bb70814a 100644
--- a/app/src/main/res/drawable/ic_backup_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_backup_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM14,13v4h-4v-4H7l5,-5 5,5h-3z" />
diff --git a/app/src/main/res/drawable/ic_backup_white_24dp.xml b/app/src/main/res/drawable/ic_backup_white_24dp.xml
index 55dbbae85cc..29259b0e03a 100644
--- a/app/src/main/res/drawable/ic_backup_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_backup_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_bookmark_black_24dp.xml b/app/src/main/res/drawable/ic_bookmark_black_24dp.xml
index 6a6a1b39d7c..5bf2e951cbd 100644
--- a/app/src/main/res/drawable/ic_bookmark_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_bookmark_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z" />
diff --git a/app/src/main/res/drawable/ic_bookmark_white_24dp.xml b/app/src/main/res/drawable/ic_bookmark_white_24dp.xml
index feb16ed6325..2e919f18d06 100644
--- a/app/src/main/res/drawable/ic_bookmark_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_bookmark_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_brightness_high_white_24dp.xml b/app/src/main/res/drawable/ic_brightness_high_white_24dp.xml
index 9ed0b086ca7..1ff2d2e26bf 100644
--- a/app/src/main/res/drawable/ic_brightness_high_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_brightness_high_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_brightness_low_white_24dp.xml b/app/src/main/res/drawable/ic_brightness_low_white_24dp.xml
index da4e0ca3074..1a00ce2dd44 100644
--- a/app/src/main/res/drawable/ic_brightness_low_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_brightness_low_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_brightness_medium_white_24dp.xml b/app/src/main/res/drawable/ic_brightness_medium_white_24dp.xml
index c522453f124..853e219bd3c 100644
--- a/app/src/main/res/drawable/ic_brightness_medium_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_brightness_medium_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_bug_report_black_24dp.xml b/app/src/main/res/drawable/ic_bug_report_black_24dp.xml
index 4d83902b899..206702ff247 100644
--- a/app/src/main/res/drawable/ic_bug_report_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_bug_report_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z" />
diff --git a/app/src/main/res/drawable/ic_bug_report_white_24dp.xml b/app/src/main/res/drawable/ic_bug_report_white_24dp.xml
index 5c8f5bc16b7..e1a204a29c6 100644
--- a/app/src/main/res/drawable/ic_bug_report_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_bug_report_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_cast_black_24dp.xml b/app/src/main/res/drawable/ic_cast_black_24dp.xml
index 7b143de9f88..4ffbdc42122 100644
--- a/app/src/main/res/drawable/ic_cast_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_cast_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v3h2L3,5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM1,18v3h3c0,-1.66 -1.34,-3 -3,-3zM1,14v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM1,10v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.93,-11 -11,-11z" />
diff --git a/app/src/main/res/drawable/ic_cast_white_24dp.xml b/app/src/main/res/drawable/ic_cast_white_24dp.xml
index 434c6441679..61a1f61fe6f 100644
--- a/app/src/main/res/drawable/ic_cast_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_cast_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_child_care_black_24dp.xml b/app/src/main/res/drawable/ic_child_care_black_24dp.xml
index 5af39255e97..25a51bb23ff 100644
--- a/app/src/main/res/drawable/ic_child_care_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_child_care_black_24dp.xml
@@ -1,15 +1,15 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M14.5,10.5m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" />
+ android:pathData="M9.5,10.5m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0" />
+ android:pathData="M22.94,12.66c0.04,-0.21 0.06,-0.43 0.06,-0.66s-0.02,-0.45 -0.06,-0.66c-0.25,-1.51 -1.36,-2.74 -2.81,-3.17 -0.53,-1.12 -1.28,-2.1 -2.19,-2.91C16.36,3.85 14.28,3 12,3s-4.36,0.85 -5.94,2.26c-0.92,0.81 -1.67,1.8 -2.19,2.91 -1.45,0.43 -2.56,1.65 -2.81,3.17 -0.04,0.21 -0.06,0.43 -0.06,0.66s0.02,0.45 0.06,0.66c0.25,1.51 1.36,2.74 2.81,3.17 0.52,1.11 1.27,2.09 2.17,2.89C7.62,20.14 9.71,21 12,21s4.38,-0.86 5.97,-2.28c0.9,-0.8 1.65,-1.79 2.17,-2.89 1.44,-0.43 2.55,-1.65 2.8,-3.17zM19,14c-0.1,0 -0.19,-0.02 -0.29,-0.03 -0.2,0.67 -0.49,1.29 -0.86,1.86C16.6,17.74 14.45,19 12,19s-4.6,-1.26 -5.85,-3.17c-0.37,-0.57 -0.66,-1.19 -0.86,-1.86 -0.1,0.01 -0.19,0.03 -0.29,0.03 -1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2c0.1,0 0.19,0.02 0.29,0.03 0.2,-0.67 0.49,-1.29 0.86,-1.86C7.4,6.26 9.55,5 12,5s4.6,1.26 5.85,3.17c0.37,0.57 0.66,1.19 0.86,1.86 0.1,-0.01 0.19,-0.03 0.29,-0.03 1.1,0 2,0.9 2,2s-0.9,2 -2,2zM7.5,14c0.76,1.77 2.49,3 4.5,3s3.74,-1.23 4.5,-3h-9z" />
diff --git a/app/src/main/res/drawable/ic_child_care_white_24dp.xml b/app/src/main/res/drawable/ic_child_care_white_24dp.xml
index 81fa2ddc12b..9375e3116ea 100644
--- a/app/src/main/res/drawable/ic_child_care_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_child_care_white_24dp.xml
@@ -1,7 +1,16 @@
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_close_black_24dp.xml b/app/src/main/res/drawable/ic_close_black_24dp.xml
index ede4b7108d5..f50fd991b75 100644
--- a/app/src/main/res/drawable/ic_close_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_close_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" />
diff --git a/app/src/main/res/drawable/ic_close_white_24dp.xml b/app/src/main/res/drawable/ic_close_white_24dp.xml
index d11cc5c9c40..c63eeb59765 100644
--- a/app/src/main/res/drawable/ic_close_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_close_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" />
diff --git a/app/src/main/res/drawable/ic_cloud_download_black_24dp.xml b/app/src/main/res/drawable/ic_cloud_download_black_24dp.xml
index 261c312175b..aa051b25da5 100644
--- a/app/src/main/res/drawable/ic_cloud_download_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_cloud_download_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z" />
diff --git a/app/src/main/res/drawable/ic_cloud_download_white_24dp.xml b/app/src/main/res/drawable/ic_cloud_download_white_24dp.xml
index 0feb270af4d..67e87045662 100644
--- a/app/src/main/res/drawable/ic_cloud_download_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_cloud_download_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_computer_black_24dp.xml b/app/src/main/res/drawable/ic_computer_black_24dp.xml
index 4599f98cd35..04eb86a51e8 100644
--- a/app/src/main/res/drawable/ic_computer_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_computer_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M20,18c1.1,0 1.99,-0.9 1.99,-2L22,6c0,-1.1 -0.9,-2 -2,-2H4c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2H0v2h24v-2h-4zM4,6h16v10H4V6z" />
diff --git a/app/src/main/res/drawable/ic_computer_white_24dp.xml b/app/src/main/res/drawable/ic_computer_white_24dp.xml
index 9569b7747ad..68f85594d75 100644
--- a/app/src/main/res/drawable/ic_computer_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_computer_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_crop_portrait_black_24dp.xml b/app/src/main/res/drawable/ic_crop_portrait_black_24dp.xml
index e8c60a1a298..d906df150cf 100644
--- a/app/src/main/res/drawable/ic_crop_portrait_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_crop_portrait_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M17,3L7,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,5c0,-1.1 -0.9,-2 -2,-2zM17,19L7,19L7,5h10v14z" />
diff --git a/app/src/main/res/drawable/ic_crop_portrait_white_24dp.xml b/app/src/main/res/drawable/ic_crop_portrait_white_24dp.xml
index caba925a146..fc11eba5725 100644
--- a/app/src/main/res/drawable/ic_crop_portrait_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_crop_portrait_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_delete_black_24dp.xml b/app/src/main/res/drawable/ic_delete_black_24dp.xml
index 39e64d6980a..962e033743f 100644
--- a/app/src/main/res/drawable/ic_delete_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_delete_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z" />
diff --git a/app/src/main/res/drawable/ic_delete_white_24dp.xml b/app/src/main/res/drawable/ic_delete_white_24dp.xml
index 8bed121aa60..3760de238c8 100644
--- a/app/src/main/res/drawable/ic_delete_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_delete_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_directions_bike_black_24dp.xml b/app/src/main/res/drawable/ic_directions_bike_black_24dp.xml
index ded5e335981..328fbe39331 100644
--- a/app/src/main/res/drawable/ic_directions_bike_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_directions_bike_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M15.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM5,12c-2.8,0 -5,2.2 -5,5s2.2,5 5,5 5,-2.2 5,-5 -2.2,-5 -5,-5zM5,20.5c-1.9,0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5 3.5,1.6 3.5,3.5 -1.6,3.5 -3.5,3.5zM10.8,10.5l2.4,-2.4 0.8,0.8c1.3,1.3 3,2.1 5.1,2.1L19.1,9c-1.5,0 -2.7,-0.6 -3.6,-1.5l-1.9,-1.9c-0.5,-0.4 -1,-0.6 -1.6,-0.6s-1.1,0.2 -1.4,0.6L7.8,8.4c-0.4,0.4 -0.6,0.9 -0.6,1.4 0,0.6 0.2,1.1 0.6,1.4L11,14v5h2v-6.2l-2.2,-2.3zM19,12c-2.8,0 -5,2.2 -5,5s2.2,5 5,5 5,-2.2 5,-5 -2.2,-5 -5,-5zM19,20.5c-1.9,0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5 3.5,1.6 3.5,3.5 -1.6,3.5 -3.5,3.5z" />
diff --git a/app/src/main/res/drawable/ic_directions_bike_white_24dp.xml b/app/src/main/res/drawable/ic_directions_bike_white_24dp.xml
index f165cea9c83..90c7f7a775e 100644
--- a/app/src/main/res/drawable/ic_directions_bike_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_directions_bike_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_directions_car_black_24dp.xml b/app/src/main/res/drawable/ic_directions_car_black_24dp.xml
index 6d6337c3abf..b2fe8bdbd6d 100644
--- a/app/src/main/res/drawable/ic_directions_car_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_directions_car_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M18.92,6.01C18.72,5.42 18.16,5 17.5,5h-11c-0.66,0 -1.21,0.42 -1.42,1.01L3,12v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8l-2.08,-5.99zM6.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,13 6.5,13s1.5,0.67 1.5,1.5S7.33,16 6.5,16zM17.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM5,11l1.5,-4.5h11L19,11L5,11z" />
diff --git a/app/src/main/res/drawable/ic_directions_car_white_24dp.xml b/app/src/main/res/drawable/ic_directions_car_white_24dp.xml
index 981334c173e..26404bddbf2 100644
--- a/app/src/main/res/drawable/ic_directions_car_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_directions_car_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_done_black_24dp.xml b/app/src/main/res/drawable/ic_done_black_24dp.xml
index 7affe9ba9f1..bda675f1429 100644
--- a/app/src/main/res/drawable/ic_done_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_done_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z" />
diff --git a/app/src/main/res/drawable/ic_done_white_24dp.xml b/app/src/main/res/drawable/ic_done_white_24dp.xml
index cab2aed1ac6..bb657f6ec0d 100644
--- a/app/src/main/res/drawable/ic_done_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_done_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_drag_handle_black_24dp.xml b/app/src/main/res/drawable/ic_drag_handle_black_24dp.xml
index 68a71905231..8f7f335a3b5 100644
--- a/app/src/main/res/drawable/ic_drag_handle_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_drag_handle_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M20,9H4v2h16V9zM4,15h16v-2H4v2z" />
diff --git a/app/src/main/res/drawable/ic_drag_handle_white_24dp.xml b/app/src/main/res/drawable/ic_drag_handle_white_24dp.xml
index 50f9e6c2914..9378f4b23a6 100644
--- a/app/src/main/res/drawable/ic_drag_handle_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_drag_handle_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_edit_black_24dp.xml b/app/src/main/res/drawable/ic_edit_black_24dp.xml
index 43489826e01..5505cc77560 100644
--- a/app/src/main/res/drawable/ic_edit_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_edit_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" />
diff --git a/app/src/main/res/drawable/ic_edit_white_24dp.xml b/app/src/main/res/drawable/ic_edit_white_24dp.xml
index 88f94780ffe..85d32985f9b 100644
--- a/app/src/main/res/drawable/ic_edit_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_edit_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" />
diff --git a/app/src/main/res/drawable/ic_expand_less_black_24dp.xml b/app/src/main/res/drawable/ic_expand_less_black_24dp.xml
index 3afdf968269..7b6a65628c3 100644
--- a/app/src/main/res/drawable/ic_expand_less_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_expand_less_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,8l-6,6 1.41,1.41L12,10.83l4.59,4.58L18,14z" />
diff --git a/app/src/main/res/drawable/ic_expand_less_white_24dp.xml b/app/src/main/res/drawable/ic_expand_less_white_24dp.xml
index 5042d801afc..4ff5565fa6b 100644
--- a/app/src/main/res/drawable/ic_expand_less_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_expand_less_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_expand_more_black_24dp.xml b/app/src/main/res/drawable/ic_expand_more_black_24dp.xml
index 8d57dbc10f8..c1f391b6170 100644
--- a/app/src/main/res/drawable/ic_expand_more_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_expand_more_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z" />
diff --git a/app/src/main/res/drawable/ic_expand_more_white_24dp.xml b/app/src/main/res/drawable/ic_expand_more_white_24dp.xml
index bc72bdce08d..b6a470043f3 100644
--- a/app/src/main/res/drawable/ic_expand_more_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_expand_more_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_explore_black_24dp.xml b/app/src/main/res/drawable/ic_explore_black_24dp.xml
index c898ed9a570..e94079fedcc 100644
--- a/app/src/main/res/drawable/ic_explore_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_explore_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,10.9c-0.61,0 -1.1,0.49 -1.1,1.1s0.49,1.1 1.1,1.1c0.61,0 1.1,-0.49 1.1,-1.1s-0.49,-1.1 -1.1,-1.1zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM14.19,14.19L6,18l3.81,-8.19L18,6l-3.81,8.19z" />
diff --git a/app/src/main/res/drawable/ic_explore_white_24dp.xml b/app/src/main/res/drawable/ic_explore_white_24dp.xml
index 65f2818a669..a910c54297d 100644
--- a/app/src/main/res/drawable/ic_explore_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_explore_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,10.9c-0.61,0 -1.1,0.49 -1.1,1.1s0.49,1.1 1.1,1.1c0.61,0 1.1,-0.49 1.1,-1.1s-0.49,-1.1 -1.1,-1.1zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM14.19,14.19L6,18l3.81,-8.19L18,6l-3.81,8.19z" />
diff --git a/app/src/main/res/drawable/ic_fast_forward_white_24dp.xml b/app/src/main/res/drawable/ic_fast_forward_white_24dp.xml
index da7c3fb1ef4..ab5ae6c37b9 100644
--- a/app/src/main/res/drawable/ic_fast_forward_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_fast_forward_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_fast_rewind_white_24dp.xml b/app/src/main/res/drawable/ic_fast_rewind_white_24dp.xml
index 4bab93ecb77..ccc0721584a 100644
--- a/app/src/main/res/drawable/ic_fast_rewind_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_fast_rewind_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_fastfood_black_24dp.xml b/app/src/main/res/drawable/ic_fastfood_black_24dp.xml
index 4de2eb9af33..4d43eafd281 100644
--- a/app/src/main/res/drawable/ic_fastfood_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_fastfood_black_24dp.xml
@@ -3,7 +3,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_fastfood_white_24dp.xml b/app/src/main/res/drawable/ic_fastfood_white_24dp.xml
index 517b925731f..ddb9b6257e1 100644
--- a/app/src/main/res/drawable/ic_fastfood_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_fastfood_white_24dp.xml
@@ -3,7 +3,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_favorite_black_24dp.xml b/app/src/main/res/drawable/ic_favorite_black_24dp.xml
index cfba5d846f5..17cea9270c7 100644
--- a/app/src/main/res/drawable/ic_favorite_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_favorite_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z" />
diff --git a/app/src/main/res/drawable/ic_favorite_white_24dp.xml b/app/src/main/res/drawable/ic_favorite_white_24dp.xml
index 67a25e713e8..efc717ee9ad 100644
--- a/app/src/main/res/drawable/ic_favorite_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_favorite_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_file_download_black_24dp.xml b/app/src/main/res/drawable/ic_file_download_black_24dp.xml
index 492b41d3466..370bba93dd0 100644
--- a/app/src/main/res/drawable/ic_file_download_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_file_download_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z" />
diff --git a/app/src/main/res/drawable/ic_file_download_white_24dp.xml b/app/src/main/res/drawable/ic_file_download_white_24dp.xml
index b8e836142db..97bdac0f1e6 100644
--- a/app/src/main/res/drawable/ic_file_download_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_file_download_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_filter_list_black_24dp.xml b/app/src/main/res/drawable/ic_filter_list_black_24dp.xml
index b99b672f4e6..6826b3d5acf 100644
--- a/app/src/main/res/drawable/ic_filter_list_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_filter_list_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z" />
diff --git a/app/src/main/res/drawable/ic_filter_list_white_24dp.xml b/app/src/main/res/drawable/ic_filter_list_white_24dp.xml
index 5d4ec18eef8..2df495e1549 100644
--- a/app/src/main/res/drawable/ic_filter_list_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_filter_list_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_fitness_center_black_24dp.xml b/app/src/main/res/drawable/ic_fitness_center_black_24dp.xml
index 846deb4315d..3e2425e4080 100644
--- a/app/src/main/res/drawable/ic_fitness_center_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_fitness_center_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M20.57,14.86L22,13.43 20.57,12 17,15.57 8.43,7 12,3.43 10.57,2 9.14,3.43 7.71,2 5.57,4.14 4.14,2.71 2.71,4.14l1.43,1.43L2,7.71l1.43,1.43L2,10.57 3.43,12 7,8.43 15.57,17 12,20.57 13.43,22l1.43,-1.43L16.29,22l2.14,-2.14 1.43,1.43 1.43,-1.43 -1.43,-1.43L22,16.29z" />
diff --git a/app/src/main/res/drawable/ic_fitness_center_white_24dp.xml b/app/src/main/res/drawable/ic_fitness_center_white_24dp.xml
index fec3c955cc0..892def49124 100644
--- a/app/src/main/res/drawable/ic_fitness_center_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_fitness_center_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_fullscreen_exit_white_24dp.xml b/app/src/main/res/drawable/ic_fullscreen_exit_white_24dp.xml
index bb7140f29bb..a940aa13c86 100644
--- a/app/src/main/res/drawable/ic_fullscreen_exit_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_fullscreen_exit_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_fullscreen_white_24dp.xml b/app/src/main/res/drawable/ic_fullscreen_white_24dp.xml
index 86b7649b65f..eeda8b43090 100644
--- a/app/src/main/res/drawable/ic_fullscreen_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_fullscreen_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_headset_black_24dp.xml b/app/src/main/res/drawable/ic_headset_black_24dp.xml
index d4503ce607e..674aa8def40 100644
--- a/app/src/main/res/drawable/ic_headset_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_headset_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,1c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7c0,-4.97 -4.03,-9 -9,-9z" />
diff --git a/app/src/main/res/drawable/ic_headset_shadow.xml b/app/src/main/res/drawable/ic_headset_shadow.xml
index 53a3ec31a5c..2d6f61eee70 100644
--- a/app/src/main/res/drawable/ic_headset_shadow.xml
+++ b/app/src/main/res/drawable/ic_headset_shadow.xml
@@ -1,14 +1,17 @@
+ android:viewportHeight="24">
+ android:strokeWidth="1"
+ android:strokeAlpha="0.34090909"
+ android:strokeColor="#000000"
+ android:strokeLineCap="butt"
+ android:strokeLineJoin="miter" />
+ android:fillColor="#ffffff"
+ android:pathData="M12,1c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7c0,-4.97 -4.03,-9 -9,-9z" />
diff --git a/app/src/main/res/drawable/ic_headset_white_24dp.xml b/app/src/main/res/drawable/ic_headset_white_24dp.xml
index 2027245b3c7..3ca2936b8cb 100644
--- a/app/src/main/res/drawable/ic_headset_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_headset_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_help_black_24dp.xml b/app/src/main/res/drawable/ic_help_black_24dp.xml
index 1517747d07b..b1d7a2cf55a 100644
--- a/app/src/main/res/drawable/ic_help_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_help_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z" />
diff --git a/app/src/main/res/drawable/ic_help_white_24dp.xml b/app/src/main/res/drawable/ic_help_white_24dp.xml
index d813b72b81f..04c1c00fc25 100644
--- a/app/src/main/res/drawable/ic_help_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_help_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z" />
diff --git a/app/src/main/res/drawable/ic_history_black_24dp.xml b/app/src/main/res/drawable/ic_history_black_24dp.xml
index a61de1bc9e0..d9f75ea6d73 100644
--- a/app/src/main/res/drawable/ic_history_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_history_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z" />
diff --git a/app/src/main/res/drawable/ic_history_white_24dp.xml b/app/src/main/res/drawable/ic_history_white_24dp.xml
index de25eb445f3..2418fd6f94b 100644
--- a/app/src/main/res/drawable/ic_history_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_history_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable/ic_home_black_24dp.xml
index 70fb2910c01..f8bb0b55633 100644
--- a/app/src/main/res/drawable/ic_home_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_home_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" />
diff --git a/app/src/main/res/drawable/ic_home_white_24dp.xml b/app/src/main/res/drawable/ic_home_white_24dp.xml
index 30296ba99b4..12afe905189 100644
--- a/app/src/main/res/drawable/ic_home_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_home_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_hourglass_top_white_24dp.xml b/app/src/main/res/drawable/ic_hourglass_top_white_24dp.xml
index d6156dfa18c..59ad4b2d2e3 100644
--- a/app/src/main/res/drawable/ic_hourglass_top_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_hourglass_top_white_24dp.xml
@@ -3,7 +3,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_import_export_black_24dp.xml b/app/src/main/res/drawable/ic_import_export_black_24dp.xml
index a2d1fa99f36..d826451b477 100644
--- a/app/src/main/res/drawable/ic_import_export_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_import_export_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M9,3L5,6.99h3L8,14h2L10,6.99h3L9,3zM16,17.01L16,10h-2v7.01h-3L15,21l4,-3.99h-3z" />
diff --git a/app/src/main/res/drawable/ic_import_export_white_24dp.xml b/app/src/main/res/drawable/ic_import_export_white_24dp.xml
index 4c6fc6ef6e9..bab84a60dc1 100644
--- a/app/src/main/res/drawable/ic_import_export_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_import_export_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_info_outline_black_24dp.xml b/app/src/main/res/drawable/ic_info_outline_black_24dp.xml
index cf53e145cd7..9c51a4ffb9a 100644
--- a/app/src/main/res/drawable/ic_info_outline_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_info_outline_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z" />
diff --git a/app/src/main/res/drawable/ic_info_outline_white_24dp.xml b/app/src/main/res/drawable/ic_info_outline_white_24dp.xml
index af0d4d067a5..2465f780819 100644
--- a/app/src/main/res/drawable/ic_info_outline_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_info_outline_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_insert_emoticon_black_24dp.xml b/app/src/main/res/drawable/ic_insert_emoticon_black_24dp.xml
index 43d5552cd45..7c2d4625564 100644
--- a/app/src/main/res/drawable/ic_insert_emoticon_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_insert_emoticon_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z" />
diff --git a/app/src/main/res/drawable/ic_insert_emoticon_white_24dp.xml b/app/src/main/res/drawable/ic_insert_emoticon_white_24dp.xml
index a438c34efe0..de8e66530cd 100644
--- a/app/src/main/res/drawable/ic_insert_emoticon_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_insert_emoticon_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_language_black_24dp.xml b/app/src/main/res/drawable/ic_language_black_24dp.xml
index d07324c87df..340a4bf0f54 100644
--- a/app/src/main/res/drawable/ic_language_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_language_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z" />
diff --git a/app/src/main/res/drawable/ic_language_white_24dp.xml b/app/src/main/res/drawable/ic_language_white_24dp.xml
index 74bc2790343..9b97aa59221 100644
--- a/app/src/main/res/drawable/ic_language_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_language_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_list_black_24dp.xml b/app/src/main/res/drawable/ic_list_black_24dp.xml
index 4c2fb88349a..1471c52f5ce 100644
--- a/app/src/main/res/drawable/ic_list_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_list_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M3,13h2v-2L3,11v2zM3,17h2v-2L3,15v2zM3,9h2L5,7L3,7v2zM7,13h14v-2L7,11v2zM7,17h14v-2L7,15v2zM7,7v2h14L21,7L7,7z" />
diff --git a/app/src/main/res/drawable/ic_list_white_24dp.xml b/app/src/main/res/drawable/ic_list_white_24dp.xml
index f47037629f0..4fd341d82cf 100644
--- a/app/src/main/res/drawable/ic_list_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_list_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_megaphone_black_24dp.xml b/app/src/main/res/drawable/ic_megaphone_black_24dp.xml
index 21622c16271..f75a104db79 100644
--- a/app/src/main/res/drawable/ic_megaphone_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_megaphone_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,8H4A2,2 0 0,0 2,10V14A2,2 0 0,0 4,16H5V20A1,1 0 0,0 6,21H8A1,1 0 0,0 9,20V16H12L17,20V4L12,8M21.5,12C21.5,13.71 20.54,15.26 19,16V8C20.53,8.75 21.5,10.3 21.5,12Z" />
diff --git a/app/src/main/res/drawable/ic_megaphone_white_24dp.xml b/app/src/main/res/drawable/ic_megaphone_white_24dp.xml
index 90e6ff21563..dd87fde1798 100644
--- a/app/src/main/res/drawable/ic_megaphone_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_megaphone_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,8H4A2,2 0 0,0 2,10V14A2,2 0 0,0 4,16H5V20A1,1 0 0,0 6,21H8A1,1 0 0,0 9,20V16H12L17,20V4L12,8M21.5,12C21.5,13.71 20.54,15.26 19,16V8C20.53,8.75 21.5,10.3 21.5,12Z" />
diff --git a/app/src/main/res/drawable/ic_mic_black_24dp.xml b/app/src/main/res/drawable/ic_mic_black_24dp.xml
index 25d8951a72f..8b765ffd42c 100644
--- a/app/src/main/res/drawable/ic_mic_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_mic_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,14c1.66,0 2.99,-1.34 2.99,-3L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6c0,1.66 1.34,3 3,3zM17.3,11c0,3 -2.54,5.1 -5.3,5.1S6.7,14 6.7,11L5,11c0,3.41 2.72,6.23 6,6.72L11,21h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z" />
diff --git a/app/src/main/res/drawable/ic_mic_white_24dp.xml b/app/src/main/res/drawable/ic_mic_white_24dp.xml
index 36ee9ff81e4..c0c92fcc76e 100644
--- a/app/src/main/res/drawable/ic_mic_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_mic_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,14c1.66,0 2.99,-1.34 2.99,-3L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6c0,1.66 1.34,3 3,3zM17.3,11c0,3 -2.54,5.1 -5.3,5.1S6.7,14 6.7,11L5,11c0,3.41 2.72,6.23 6,6.72L11,21h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z" />
diff --git a/app/src/main/res/drawable/ic_more_vert_black_24dp.xml b/app/src/main/res/drawable/ic_more_vert_black_24dp.xml
index 5176d8a4b15..7b7f195546f 100644
--- a/app/src/main/res/drawable/ic_more_vert_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_more_vert_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
diff --git a/app/src/main/res/drawable/ic_more_vert_white_24dp.xml b/app/src/main/res/drawable/ic_more_vert_white_24dp.xml
index c097d3e4030..19703e8e7db 100644
--- a/app/src/main/res/drawable/ic_more_vert_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_more_vert_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_motorcycle_black_24dp.xml b/app/src/main/res/drawable/ic_motorcycle_black_24dp.xml
index 539182f831c..185d6992c58 100644
--- a/app/src/main/res/drawable/ic_motorcycle_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_motorcycle_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M19.44,9.03L15.41,5H11v2h3.59l2,2H5c-2.8,0 -5,2.2 -5,5s2.2,5 5,5c2.46,0 4.45,-1.69 4.9,-4h1.65l2.77,-2.77c-0.21,0.54 -0.32,1.14 -0.32,1.77 0,2.8 2.2,5 5,5s5,-2.2 5,-5c0,-2.65 -1.97,-4.77 -4.56,-4.97zM7.82,15C7.4,16.15 6.28,17 5,17c-1.63,0 -3,-1.37 -3,-3s1.37,-3 3,-3c1.28,0 2.4,0.85 2.82,2H5v2h2.82zM19,17c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3z" />
diff --git a/app/src/main/res/drawable/ic_motorcycle_white_24dp.xml b/app/src/main/res/drawable/ic_motorcycle_white_24dp.xml
index d5f2519d7a0..2a42a1d093e 100644
--- a/app/src/main/res/drawable/ic_motorcycle_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_motorcycle_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_movie_black_24dp.xml b/app/src/main/res/drawable/ic_movie_black_24dp.xml
index d70c00f0065..4e5289d38b8 100644
--- a/app/src/main/res/drawable/ic_movie_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_movie_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M18,4l2,4h-3l-2,-4h-2l2,4h-3l-2,-4H8l2,4H7L5,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4h-4z" />
diff --git a/app/src/main/res/drawable/ic_movie_white_24dp.xml b/app/src/main/res/drawable/ic_movie_white_24dp.xml
index a1d539a3f26..79f93d1c1ad 100644
--- a/app/src/main/res/drawable/ic_movie_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_movie_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_music_note_black_24dp.xml b/app/src/main/res/drawable/ic_music_note_black_24dp.xml
index 736c004ef49..830a7fab179 100644
--- a/app/src/main/res/drawable/ic_music_note_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_music_note_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z" />
diff --git a/app/src/main/res/drawable/ic_music_note_white_24dp.xml b/app/src/main/res/drawable/ic_music_note_white_24dp.xml
index 69f0a3a4dd8..ca80ad5ad9b 100644
--- a/app/src/main/res/drawable/ic_music_note_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_music_note_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_next_white_24dp.xml b/app/src/main/res/drawable/ic_next_white_24dp.xml
index 603880c2b40..1459bff0a0c 100644
--- a/app/src/main/res/drawable/ic_next_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_next_white_24dp.xml
@@ -1,10 +1,11 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:tint="#ffffff"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_palette_black_24dp.xml b/app/src/main/res/drawable/ic_palette_black_24dp.xml
index f75e2fbe39a..71c37ddacff 100644
--- a/app/src/main/res/drawable/ic_palette_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_palette_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9c0.83,0 1.5,-0.67 1.5,-1.5 0,-0.39 -0.15,-0.74 -0.39,-1.01 -0.23,-0.26 -0.38,-0.61 -0.38,-0.99 0,-0.83 0.67,-1.5 1.5,-1.5L16,16c2.76,0 5,-2.24 5,-5 0,-4.42 -4.03,-8 -9,-8zM6.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,9 6.5,9 8,9.67 8,10.5 7.33,12 6.5,12zM9.5,8C8.67,8 8,7.33 8,6.5S8.67,5 9.5,5s1.5,0.67 1.5,1.5S10.33,8 9.5,8zM14.5,8c-0.83,0 -1.5,-0.67 -1.5,-1.5S13.67,5 14.5,5s1.5,0.67 1.5,1.5S15.33,8 14.5,8zM17.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.67,9 17.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" />
diff --git a/app/src/main/res/drawable/ic_palette_white_24dp.xml b/app/src/main/res/drawable/ic_palette_white_24dp.xml
index 4abeea58f9a..a6cdb536e7a 100644
--- a/app/src/main/res/drawable/ic_palette_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_palette_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_pause_black_24dp.xml b/app/src/main/res/drawable/ic_pause_black_24dp.xml
index bb28a6c415c..53b5e6a9aac 100644
--- a/app/src/main/res/drawable/ic_pause_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_pause_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z" />
diff --git a/app/src/main/res/drawable/ic_pause_white_24dp.xml b/app/src/main/res/drawable/ic_pause_white_24dp.xml
index 08b34c2da94..ea843aff309 100644
--- a/app/src/main/res/drawable/ic_pause_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_pause_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_people_black_24dp.xml b/app/src/main/res/drawable/ic_people_black_24dp.xml
index 4cfd869603b..603c006db55 100644
--- a/app/src/main/res/drawable/ic_people_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_people_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z" />
diff --git a/app/src/main/res/drawable/ic_people_white_24dp.xml b/app/src/main/res/drawable/ic_people_white_24dp.xml
index 23afe227031..8b925badcb1 100644
--- a/app/src/main/res/drawable/ic_people_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_people_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_person_black_24dp.xml b/app/src/main/res/drawable/ic_person_black_24dp.xml
index b2cb337b0d3..55495d5a08e 100644
--- a/app/src/main/res/drawable/ic_person_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_person_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z" />
diff --git a/app/src/main/res/drawable/ic_person_white_24dp.xml b/app/src/main/res/drawable/ic_person_white_24dp.xml
index d7366bda062..5efaaf0dd79 100644
--- a/app/src/main/res/drawable/ic_person_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_person_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_pets_black_24dp.xml b/app/src/main/res/drawable/ic_pets_black_24dp.xml
index b6247bd8716..58e52bf6cb9 100644
--- a/app/src/main/res/drawable/ic_pets_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_pets_black_24dp.xml
@@ -1,21 +1,21 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M4.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" />
+ android:pathData="M9,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" />
+ android:pathData="M15,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" />
+ android:pathData="M19.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" />
+ android:pathData="M17.34,14.86c-0.87,-1.02 -1.6,-1.89 -2.48,-2.91 -0.46,-0.54 -1.05,-1.08 -1.75,-1.32 -0.11,-0.04 -0.22,-0.07 -0.33,-0.09 -0.25,-0.04 -0.52,-0.04 -0.78,-0.04s-0.53,0 -0.79,0.05c-0.11,0.02 -0.22,0.05 -0.33,0.09 -0.7,0.24 -1.28,0.78 -1.75,1.32 -0.87,1.02 -1.6,1.89 -2.48,2.91 -1.31,1.31 -2.92,2.76 -2.62,4.79 0.29,1.02 1.02,2.03 2.33,2.32 0.73,0.15 3.06,-0.44 5.54,-0.44h0.18c2.48,0 4.81,0.58 5.54,0.44 1.31,-0.29 2.04,-1.31 2.33,-2.32 0.31,-2.04 -1.3,-3.49 -2.61,-4.8z" />
diff --git a/app/src/main/res/drawable/ic_pets_white_24dp.xml b/app/src/main/res/drawable/ic_pets_white_24dp.xml
index 46724a33d00..14373a3c5b8 100644
--- a/app/src/main/res/drawable/ic_pets_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_pets_white_24dp.xml
@@ -1,21 +1,21 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M4.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" />
+ android:pathData="M9,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" />
+ android:pathData="M15,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" />
+ android:pathData="M19.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" />
+ android:pathData="M17.34,14.86c-0.87,-1.02 -1.6,-1.89 -2.48,-2.91 -0.46,-0.54 -1.05,-1.08 -1.75,-1.32 -0.11,-0.04 -0.22,-0.07 -0.33,-0.09 -0.25,-0.04 -0.52,-0.04 -0.78,-0.04s-0.53,0 -0.79,0.05c-0.11,0.02 -0.22,0.05 -0.33,0.09 -0.7,0.24 -1.28,0.78 -1.75,1.32 -0.87,1.02 -1.6,1.89 -2.48,2.91 -1.31,1.31 -2.92,2.76 -2.62,4.79 0.29,1.02 1.02,2.03 2.33,2.32 0.73,0.15 3.06,-0.44 5.54,-0.44h0.18c2.48,0 4.81,0.58 5.54,0.44 1.31,-0.29 2.04,-1.31 2.33,-2.32 0.31,-2.04 -1.3,-3.49 -2.61,-4.8z" />
diff --git a/app/src/main/res/drawable/ic_picture_in_picture_black_24dp.xml b/app/src/main/res/drawable/ic_picture_in_picture_black_24dp.xml
index b61c5218b52..326ff030430 100644
--- a/app/src/main/res/drawable/ic_picture_in_picture_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_picture_in_picture_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M19,7h-8v6h8L19,7zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,1.98 2,1.98h18c1.1,0 2,-0.88 2,-1.98L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.98h18v14.03z" />
diff --git a/app/src/main/res/drawable/ic_picture_in_picture_white_24dp.xml b/app/src/main/res/drawable/ic_picture_in_picture_white_24dp.xml
index db1b46f8141..f6b3205cc0c 100644
--- a/app/src/main/res/drawable/ic_picture_in_picture_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_picture_in_picture_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_play_arrow_black_24dp.xml b/app/src/main/res/drawable/ic_play_arrow_black_24dp.xml
index bf9b895aca9..dbe3ec664e8 100644
--- a/app/src/main/res/drawable/ic_play_arrow_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_play_arrow_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M8,5v14l11,-7z" />
diff --git a/app/src/main/res/drawable/ic_play_arrow_shadow.xml b/app/src/main/res/drawable/ic_play_arrow_shadow.xml
index 8d5871fad31..bf4b895b0ae 100644
--- a/app/src/main/res/drawable/ic_play_arrow_shadow.xml
+++ b/app/src/main/res/drawable/ic_play_arrow_shadow.xml
@@ -1,12 +1,25 @@
-
-
+
-
+
+ android:strokeWidth="5"
+ android:strokeAlpha="0.73333333"
+ android:strokeColor="#ffffff"
+ android:strokeLineCap="butt"
+ android:strokeLineJoin="miter" />
diff --git a/app/src/main/res/drawable/ic_play_arrow_white_24dp.xml b/app/src/main/res/drawable/ic_play_arrow_white_24dp.xml
index e135a55b789..098b71d1fb1 100644
--- a/app/src/main/res/drawable/ic_play_arrow_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_play_arrow_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_playlist_add_black_24dp.xml b/app/src/main/res/drawable/ic_playlist_add_black_24dp.xml
index 905d86e6461..f30f2955781 100644
--- a/app/src/main/res/drawable/ic_playlist_add_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_playlist_add_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M14,10L2,10v2h12v-2zM14,6L2,6v2h12L14,6zM18,14v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2,16h8v-2L2,14v2z" />
diff --git a/app/src/main/res/drawable/ic_playlist_add_check_black_24dp.xml b/app/src/main/res/drawable/ic_playlist_add_check_black_24dp.xml
index 4f7a1c13f42..d99e6e75c12 100644
--- a/app/src/main/res/drawable/ic_playlist_add_check_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_playlist_add_check_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M14,10L2,10v2h12v-2zM14,6L2,6v2h12L14,6zM2,16h8v-2L2,14v2zM21.5,11.5L23,13l-6.99,7 -4.51,-4.5L13,14l3.01,3 5.49,-5.5z" />
diff --git a/app/src/main/res/drawable/ic_playlist_add_check_white_24dp.xml b/app/src/main/res/drawable/ic_playlist_add_check_white_24dp.xml
index 04b4b785591..0581bbe4ba6 100644
--- a/app/src/main/res/drawable/ic_playlist_add_check_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_playlist_add_check_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml b/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml
index ed27c167e09..1ea41dc2205 100644
--- a/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_playlist_play_white_24dp.xml b/app/src/main/res/drawable/ic_playlist_play_white_24dp.xml
index 06ccbb8ebb2..4e31a4dded5 100644
--- a/app/src/main/res/drawable/ic_playlist_play_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_playlist_play_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_previous_white_24dp.xml b/app/src/main/res/drawable/ic_previous_white_24dp.xml
index 14279ecb20d..e9fe7448d69 100644
--- a/app/src/main/res/drawable/ic_previous_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_previous_white_24dp.xml
@@ -1,10 +1,11 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:tint="#ffffff"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_public_black_24dp.xml b/app/src/main/res/drawable/ic_public_black_24dp.xml
index d976b424424..19288457023 100644
--- a/app/src/main/res/drawable/ic_public_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_public_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM11,19.93c-3.95,-0.49 -7,-3.85 -7,-7.93 0,-0.62 0.08,-1.21 0.21,-1.79L9,15v1c0,1.1 0.9,2 2,2v1.93zM17.9,17.39c-0.26,-0.81 -1,-1.39 -1.9,-1.39h-1v-3c0,-0.55 -0.45,-1 -1,-1L8,12v-2h2c0.55,0 1,-0.45 1,-1L11,7h2c1.1,0 2,-0.9 2,-2v-0.41c2.93,1.19 5,4.06 5,7.41 0,2.08 -0.8,3.97 -2.1,5.39z" />
diff --git a/app/src/main/res/drawable/ic_public_white_24dp.xml b/app/src/main/res/drawable/ic_public_white_24dp.xml
index 880e4277095..6ae97422a84 100644
--- a/app/src/main/res/drawable/ic_public_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_public_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_radio_black_24dp.xml b/app/src/main/res/drawable/ic_radio_black_24dp.xml
index 00da9101fc7..ca4501bb7c6 100644
--- a/app/src/main/res/drawable/ic_radio_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_radio_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M3.24,6.15C2.51,6.43 2,7.17 2,8v12c0,1.1 0.89,2 2,2h16c1.11,0 2,-0.9 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2L8.3,6l8.26,-3.34L15.88,1 3.24,6.15zM7,20c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM20,12h-2v-2h-2v2L4,12L4,8h16v4z" />
diff --git a/app/src/main/res/drawable/ic_radio_white_24dp.xml b/app/src/main/res/drawable/ic_radio_white_24dp.xml
index df563ec1d27..d0902426bec 100644
--- a/app/src/main/res/drawable/ic_radio_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_radio_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M3.24,6.15C2.51,6.43 2,7.17 2,8v12c0,1.1 0.89,2 2,2h16c1.11,0 2,-0.9 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2L8.3,6l8.26,-3.34L15.88,1 3.24,6.15zM7,20c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM20,12h-2v-2h-2v2L4,12L4,8h16v4z" />
diff --git a/app/src/main/res/drawable/ic_refresh_black_24dp.xml b/app/src/main/res/drawable/ic_refresh_black_24dp.xml
index 8229a9a64c2..1f9072a36fa 100644
--- a/app/src/main/res/drawable/ic_refresh_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_refresh_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z" />
diff --git a/app/src/main/res/drawable/ic_refresh_white_24dp.xml b/app/src/main/res/drawable/ic_refresh_white_24dp.xml
index cc2d1e04ff6..4ca5e73a705 100644
--- a/app/src/main/res/drawable/ic_refresh_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_refresh_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_repeat_white_24dp.xml b/app/src/main/res/drawable/ic_repeat_white_24dp.xml
index f4e1a4f39b0..24d9f44f0a6 100644
--- a/app/src/main/res/drawable/ic_repeat_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_repeat_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_replay_white_24dp.xml b/app/src/main/res/drawable/ic_replay_white_24dp.xml
index 8e84c195bd9..d00231b51c1 100644
--- a/app/src/main/res/drawable/ic_replay_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_replay_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,5V1L7,6l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6 -6,-2.69 -6,-6H4c0,4.42 3.58,8 8,8s8,-3.58 8,-8 -3.58,-8 -8,-8z" />
diff --git a/app/src/main/res/drawable/ic_restaurant_black_24dp.xml b/app/src/main/res/drawable/ic_restaurant_black_24dp.xml
index e14429d09ec..51f1145c682 100644
--- a/app/src/main/res/drawable/ic_restaurant_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_restaurant_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M11,9L9,9L9,2L7,2v7L5,9L5,2L3,2v7c0,2.12 1.66,3.84 3.75,3.97L6.75,22h2.5v-9.03C11.34,12.84 13,11.12 13,9L13,2h-2v7zM16,6v8h2.5v8L21,22L21,2c-2.76,0 -5,2.24 -5,4z" />
diff --git a/app/src/main/res/drawable/ic_restaurant_white_24dp.xml b/app/src/main/res/drawable/ic_restaurant_white_24dp.xml
index 1e2d89c0ff4..dbb84968023 100644
--- a/app/src/main/res/drawable/ic_restaurant_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_restaurant_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_rss_feed_black_24dp.xml b/app/src/main/res/drawable/ic_rss_feed_black_24dp.xml
index 4da9b623b63..ed6228cc253 100644
--- a/app/src/main/res/drawable/ic_rss_feed_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_rss_feed_black_24dp.xml
@@ -1,12 +1,12 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M6.18,17.82m-2.18,0a2.18,2.18 0,1 1,4.36 0a2.18,2.18 0,1 1,-4.36 0" />
+ android:pathData="M4,4.44v2.83c7.03,0 12.73,5.7 12.73,12.73h2.83c0,-8.59 -6.97,-15.56 -15.56,-15.56zM4,10.1v2.83c3.9,0 7.07,3.17 7.07,7.07h2.83c0,-5.47 -4.43,-9.9 -9.9,-9.9z" />
diff --git a/app/src/main/res/drawable/ic_rss_feed_white_24dp.xml b/app/src/main/res/drawable/ic_rss_feed_white_24dp.xml
index 42a802c7ef0..193f4fe924e 100644
--- a/app/src/main/res/drawable/ic_rss_feed_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_rss_feed_white_24dp.xml
@@ -1,6 +1,13 @@
-
-
-
+
+
+
diff --git a/app/src/main/res/drawable/ic_save_black_24dp.xml b/app/src/main/res/drawable/ic_save_black_24dp.xml
index a561d632a54..0651fcc6c36 100644
--- a/app/src/main/res/drawable/ic_save_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_save_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z" />
diff --git a/app/src/main/res/drawable/ic_save_white_24dp.xml b/app/src/main/res/drawable/ic_save_white_24dp.xml
index 74ca299c360..b32b11451fc 100644
--- a/app/src/main/res/drawable/ic_save_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_save_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_school_black_24dp.xml b/app/src/main/res/drawable/ic_school_black_24dp.xml
index 30d83f84072..54dc17ddb53 100644
--- a/app/src/main/res/drawable/ic_school_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_school_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M5,13.18v4L12,21l7,-3.82v-4L12,17l-7,-3.82zM12,3L1,9l11,6 9,-4.91V17h2V9L12,3z" />
diff --git a/app/src/main/res/drawable/ic_school_white_24dp.xml b/app/src/main/res/drawable/ic_school_white_24dp.xml
index e9fbe593135..dc16c478223 100644
--- a/app/src/main/res/drawable/ic_school_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_school_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_screen_rotation_white_24dp.xml b/app/src/main/res/drawable/ic_screen_rotation_white_24dp.xml
index 1372f04a03c..cc851bd83ca 100644
--- a/app/src/main/res/drawable/ic_screen_rotation_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_screen_rotation_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_search_add_black_24dp.xml b/app/src/main/res/drawable/ic_search_add_black_24dp.xml
index a5264a6a3c2..398f1407db2 100644
--- a/app/src/main/res/drawable/ic_search_add_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_search_add_black_24dp.xml
@@ -3,7 +3,7 @@
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
-
+
diff --git a/app/src/main/res/drawable/ic_search_add_white_24dp.xml b/app/src/main/res/drawable/ic_search_add_white_24dp.xml
index 9341522dff6..57c8a1ada51 100644
--- a/app/src/main/res/drawable/ic_search_add_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_search_add_white_24dp.xml
@@ -3,7 +3,7 @@
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
-
+
diff --git a/app/src/main/res/drawable/ic_search_black_24dp.xml b/app/src/main/res/drawable/ic_search_black_24dp.xml
index affc7ba26f8..d23ea57f880 100644
--- a/app/src/main/res/drawable/ic_search_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_search_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" />
diff --git a/app/src/main/res/drawable/ic_search_white_24dp.xml b/app/src/main/res/drawable/ic_search_white_24dp.xml
index be5ad99c638..4d0f185842a 100644
--- a/app/src/main/res/drawable/ic_search_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_search_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_settings_backup_restore_black_24dp.xml b/app/src/main/res/drawable/ic_settings_backup_restore_black_24dp.xml
index aa424c0d4e5..57f96653687 100644
--- a/app/src/main/res/drawable/ic_settings_backup_restore_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_settings_backup_restore_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M14,12c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2 0.9,2 2,2 2,-0.9 2,-2zM12,3c-4.97,0 -9,4.03 -9,9L0,12l4,4 4,-4L5,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.51,0 -2.91,-0.49 -4.06,-1.3l-1.42,1.44C8.04,20.3 9.94,21 12,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9z" />
diff --git a/app/src/main/res/drawable/ic_settings_backup_restore_white_24dp.xml b/app/src/main/res/drawable/ic_settings_backup_restore_white_24dp.xml
index e3e6530bfe3..ae22bc141f8 100644
--- a/app/src/main/res/drawable/ic_settings_backup_restore_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_settings_backup_restore_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_settings_black_24dp.xml b/app/src/main/res/drawable/ic_settings_black_24dp.xml
index 24a5623cd86..a671514fcf9 100644
--- a/app/src/main/res/drawable/ic_settings_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_settings_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ android:pathData="M19.1,12.9a2.8,2.8 0,0 0,0.1 -0.9,2.8 2.8,0 0,0 -0.1,-0.9l2.1,-1.6a0.7,0.7 0,0 0,0.1 -0.6L19.4,5.5a0.7,0.7 0,0 0,-0.6 -0.2l-2.4,1a6.5,6.5 0,0 0,-1.6 -0.9l-0.4,-2.6a0.5,0.5 0,0 0,-0.5 -0.4H10.1a0.5,0.5 0,0 0,-0.5 0.4L9.3,5.4a5.6,5.6 0,0 0,-1.7 0.9l-2.4,-1a0.4,0.4 0,0 0,-0.5 0.2l-2,3.4c-0.1,0.2 0,0.4 0.2,0.6l2,1.6a2.8,2.8 0,0 0,-0.1 0.9,2.8 2.8,0 0,0 0.1,0.9L2.8,14.5a0.7,0.7 0,0 0,-0.1 0.6l1.9,3.4a0.7,0.7 0,0 0,0.6 0.2l2.4,-1a6.5,6.5 0,0 0,1.6 0.9l0.4,2.6a0.5,0.5 0,0 0,0.5 0.4h3.8a0.5,0.5 0,0 0,0.5 -0.4l0.3,-2.6a5.6,5.6 0,0 0,1.7 -0.9l2.4,1a0.4,0.4 0,0 0,0.5 -0.2l2,-3.4c0.1,-0.2 0,-0.4 -0.2,-0.6ZM12,15.6A3.6,3.6 0,1 1,15.6 12,3.6 3.6,0 0,1 12,15.6Z" />
diff --git a/app/src/main/res/drawable/ic_settings_white_24dp.xml b/app/src/main/res/drawable/ic_settings_white_24dp.xml
index 1397d370ead..bc30c52d8f3 100644
--- a/app/src/main/res/drawable/ic_settings_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_settings_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_share_black_24dp.xml b/app/src/main/res/drawable/ic_share_black_24dp.xml
index e3fe874d61e..338d95ad509 100644
--- a/app/src/main/res/drawable/ic_share_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_share_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z" />
diff --git a/app/src/main/res/drawable/ic_share_white_24dp.xml b/app/src/main/res/drawable/ic_share_white_24dp.xml
index 045bbc0c0e0..9dad7b85f24 100644
--- a/app/src/main/res/drawable/ic_share_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_share_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_shopping_cart_black_24dp.xml b/app/src/main/res/drawable/ic_shopping_cart_black_24dp.xml
index 452332095ec..18e1b930d61 100644
--- a/app/src/main/res/drawable/ic_shopping_cart_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_shopping_cart_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
-
\ No newline at end of file
+ android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
+
diff --git a/app/src/main/res/drawable/ic_shopping_cart_white_24dp.xml b/app/src/main/res/drawable/ic_shopping_cart_white_24dp.xml
index a55bf8a88bb..75c330cefc4 100644
--- a/app/src/main/res/drawable/ic_shopping_cart_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_shopping_cart_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
diff --git a/app/src/main/res/drawable/ic_shuffle_white_24dp.xml b/app/src/main/res/drawable/ic_shuffle_white_24dp.xml
index 9ab22017bd9..1192dec9ffd 100644
--- a/app/src/main/res/drawable/ic_shuffle_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_shuffle_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_sort_black_24dp.xml b/app/src/main/res/drawable/ic_sort_black_24dp.xml
index fd4c56f0e09..b537e982ec1 100644
--- a/app/src/main/res/drawable/ic_sort_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_sort_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z" />
diff --git a/app/src/main/res/drawable/ic_sort_white_24dp.xml b/app/src/main/res/drawable/ic_sort_white_24dp.xml
index a0c153ad014..484be5ad2db 100644
--- a/app/src/main/res/drawable/ic_sort_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_sort_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z" />
diff --git a/app/src/main/res/drawable/ic_stars_black_24dp.xml b/app/src/main/res/drawable/ic_stars_black_24dp.xml
index 61c5d7ace25..35957427d0a 100644
--- a/app/src/main/res/drawable/ic_stars_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_stars_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM16.23,18L12,15.45 7.77,18l1.12,-4.81 -3.73,-3.23 4.92,-0.42L12,5l1.92,4.53 4.92,0.42 -3.73,3.23L16.23,18z" />
diff --git a/app/src/main/res/drawable/ic_stars_white_24dp.xml b/app/src/main/res/drawable/ic_stars_white_24dp.xml
index 926e5a10612..135980afebe 100644
--- a/app/src/main/res/drawable/ic_stars_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_stars_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_subtitles_white_24dp.xml b/app/src/main/res/drawable/ic_subtitles_white_24dp.xml
index 1052d147570..1d997a03251 100644
--- a/app/src/main/res/drawable/ic_subtitles_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_subtitles_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_telescope_black_24dp.xml b/app/src/main/res/drawable/ic_telescope_black_24dp.xml
index 9c6132eccbd..8077e9325ac 100644
--- a/app/src/main/res/drawable/ic_telescope_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_telescope_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M21.9,8.9L20.2,9.9L16.2,3L17.9,2L21.9,8.9M9.8,7.9L12.8,13.1L18.9,9.6L15.9,4.4L9.8,7.9M11.4,12.7L9.4,9.2L5.1,11.7L7.1,15.2L11.4,12.7M2.1,14.6L3.1,16.3L5.7,14.8L4.7,13.1L2.1,14.6M12.1,14L11.8,13.6L7.5,16.1L7.8,16.5C8,16.8 8.3,17.1 8.6,17.3L7,22H9L10.4,17.7H10.5L12,22H14L12.1,16.4C12.6,15.7 12.6,14.8 12.1,14Z" />
diff --git a/app/src/main/res/drawable/ic_telescope_white_24dp.xml b/app/src/main/res/drawable/ic_telescope_white_24dp.xml
index ea870fd8733..86468f34ad7 100644
--- a/app/src/main/res/drawable/ic_telescope_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_telescope_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M21.9,8.9L20.2,9.9L16.2,3L17.9,2L21.9,8.9M9.8,7.9L12.8,13.1L18.9,9.6L15.9,4.4L9.8,7.9M11.4,12.7L9.4,9.2L5.1,11.7L7.1,15.2L11.4,12.7M2.1,14.6L3.1,16.3L5.7,14.8L4.7,13.1L2.1,14.6M12.1,14L11.8,13.6L7.5,16.1L7.8,16.5C8,16.8 8.3,17.1 8.6,17.3L7,22H9L10.4,17.7H10.5L12,22H14L12.1,16.4C12.6,15.7 12.6,14.8 12.1,14Z" />
diff --git a/app/src/main/res/drawable/ic_thumb_down_black_24dp.xml b/app/src/main/res/drawable/ic_thumb_down_black_24dp.xml
index 26ba95c859a..0484764da9c 100644
--- a/app/src/main/res/drawable/ic_thumb_down_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_thumb_down_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M15,3L6,3c-0.83,0 -1.54,0.5 -1.84,1.22l-3.02,7.05c-0.09,0.23 -0.14,0.47 -0.14,0.73v1.91l0.01,0.01L1,14c0,1.1 0.9,2 2,2h6.31l-0.95,4.57 -0.03,0.32c0,0.41 0.17,0.79 0.44,1.06L9.83,23l6.59,-6.59c0.36,-0.36 0.58,-0.86 0.58,-1.41L17,5c0,-1.1 -0.9,-2 -2,-2zM19,3v12h4L23,3h-4z" />
diff --git a/app/src/main/res/drawable/ic_thumb_down_white_24dp.xml b/app/src/main/res/drawable/ic_thumb_down_white_24dp.xml
index 72a99e6b0bc..0303551c792 100644
--- a/app/src/main/res/drawable/ic_thumb_down_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_thumb_down_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_thumb_up_black_24dp.xml b/app/src/main/res/drawable/ic_thumb_up_black_24dp.xml
index 34fb51ab30c..58dbfafe413 100644
--- a/app/src/main/res/drawable/ic_thumb_up_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_thumb_up_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M1,21h4L5,9L1,9v12zM23,10c0,-1.1 -0.9,-2 -2,-2h-6.31l0.95,-4.57 0.03,-0.32c0,-0.41 -0.17,-0.79 -0.44,-1.06L14.17,1 7.59,7.59C7.22,7.95 7,8.45 7,9v10c0,1.1 0.9,2 2,2h9c0.83,0 1.54,-0.5 1.84,-1.22l3.02,-7.05c0.09,-0.23 0.14,-0.47 0.14,-0.73v-1.91l-0.01,-0.01L23,10z" />
diff --git a/app/src/main/res/drawable/ic_thumb_up_white_24dp.xml b/app/src/main/res/drawable/ic_thumb_up_white_24dp.xml
index d9acf75000b..f83de1ecc8a 100644
--- a/app/src/main/res/drawable/ic_thumb_up_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_thumb_up_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_trending_up_black_24dp.xml b/app/src/main/res/drawable/ic_trending_up_black_24dp.xml
index 4c9da94b922..c00c42e4392 100644
--- a/app/src/main/res/drawable/ic_trending_up_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_trending_up_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M16,6l2.29,2.29 -4.88,4.88 -4,-4L2,16.59 3.41,18l6,-6 4,4 6.3,-6.29L22,12V6z" />
diff --git a/app/src/main/res/drawable/ic_trending_up_white_24dp.xml b/app/src/main/res/drawable/ic_trending_up_white_24dp.xml
index 4d3859d53a1..ca4eb654b46 100644
--- a/app/src/main/res/drawable/ic_trending_up_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_trending_up_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_tv_black_24dp.xml b/app/src/main/res/drawable/ic_tv_black_24dp.xml
index 771363883e5..11d2d25b649 100644
--- a/app/src/main/res/drawable/ic_tv_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_tv_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M21,6h-7.59l3.29,-3.29L16,2l-4,4 -4,-4 -0.71,0.71L10.59,6L3,6c-1.1,0 -2,0.89 -2,2v12c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.11 -0.9,-2 -2,-2zM21,20L3,20L3,8h18v12z" />
diff --git a/app/src/main/res/drawable/ic_tv_white_24dp.xml b/app/src/main/res/drawable/ic_tv_white_24dp.xml
index 0286ef16e2a..b9d14869b61 100644
--- a/app/src/main/res/drawable/ic_tv_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_tv_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_videogame_asset_black_24dp.xml b/app/src/main/res/drawable/ic_videogame_asset_black_24dp.xml
index 52658f650e6..02fa7eb56a4 100644
--- a/app/src/main/res/drawable/ic_videogame_asset_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_videogame_asset_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M21,6L3,6c-1.1,0 -2,0.9 -2,2v8c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.1 -0.9,-2 -2,-2zM11,13L8,13v3L6,16v-3L3,13v-2h3L6,8h2v3h3v2zM15.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM19.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S18.67,9 19.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" />
diff --git a/app/src/main/res/drawable/ic_videogame_asset_white_24dp.xml b/app/src/main/res/drawable/ic_videogame_asset_white_24dp.xml
index 46ec002cb05..4861bf809d0 100644
--- a/app/src/main/res/drawable/ic_videogame_asset_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_videogame_asset_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_volume_down_white_24dp.xml b/app/src/main/res/drawable/ic_volume_down_white_24dp.xml
index 3a769637bf1..bcc36327986 100644
--- a/app/src/main/res/drawable/ic_volume_down_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_volume_down_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_volume_mute_white_24dp.xml b/app/src/main/res/drawable/ic_volume_mute_white_24dp.xml
index dac85f981d8..2c915139695 100644
--- a/app/src/main/res/drawable/ic_volume_mute_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_volume_mute_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_volume_off_black_24dp.xml b/app/src/main/res/drawable/ic_volume_off_black_24dp.xml
index 3aed66ddc7b..19f166ddce8 100644
--- a/app/src/main/res/drawable/ic_volume_off_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_volume_off_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z" />
diff --git a/app/src/main/res/drawable/ic_volume_off_white_24dp.xml b/app/src/main/res/drawable/ic_volume_off_white_24dp.xml
index a266d9731bf..2f8d6cfb430 100644
--- a/app/src/main/res/drawable/ic_volume_off_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_volume_off_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_volume_up_black_24dp.xml b/app/src/main/res/drawable/ic_volume_up_black_24dp.xml
index bb0c74ba12d..2ee5bce4333 100644
--- a/app/src/main/res/drawable/ic_volume_up_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_volume_up_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" />
diff --git a/app/src/main/res/drawable/ic_volume_up_white_24dp.xml b/app/src/main/res/drawable/ic_volume_up_white_24dp.xml
index 2715409466b..5d604f823ad 100644
--- a/app/src/main/res/drawable/ic_volume_up_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_volume_up_white_24dp.xml
@@ -5,5 +5,5 @@
android:viewportHeight="24.0">
+ android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" />
diff --git a/app/src/main/res/drawable/ic_watch_later_black_24dp.xml b/app/src/main/res/drawable/ic_watch_later_black_24dp.xml
index 5a1b9ac74b5..5fe8273d929 100644
--- a/app/src/main/res/drawable/ic_watch_later_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_watch_later_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10 10,-4.5 10,-10S17.5,2 12,2zM16.2,16.2L11,13L11,7h1.5v5.2l4.5,2.7 -0.8,1.3z" />
diff --git a/app/src/main/res/drawable/ic_watch_later_white_24dp.xml b/app/src/main/res/drawable/ic_watch_later_white_24dp.xml
index f9fffbc435d..b7991f0c7cf 100644
--- a/app/src/main/res/drawable/ic_watch_later_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_watch_later_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10 10,-4.5 10,-10S17.5,2 12,2zM16.2,16.2L11,13L11,7h1.5v5.2l4.5,2.7 -0.8,1.3z" />
diff --git a/app/src/main/res/drawable/ic_wb_sunny_black_24dp.xml b/app/src/main/res/drawable/ic_wb_sunny_black_24dp.xml
index a56fb5049c8..36c8089a324 100644
--- a/app/src/main/res/drawable/ic_wb_sunny_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_wb_sunny_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M6.76,4.84l-1.8,-1.79 -1.41,1.41 1.79,1.79 1.42,-1.41zM4,10.5L1,10.5v2h3v-2zM13,0.55h-2L11,3.5h2L13,0.55zM20.45,4.46l-1.41,-1.41 -1.79,1.79 1.41,1.41 1.79,-1.79zM17.24,18.16l1.79,1.8 1.41,-1.41 -1.8,-1.79 -1.4,1.4zM20,10.5v2h3v-2h-3zM12,5.5c-3.31,0 -6,2.69 -6,6s2.69,6 6,6 6,-2.69 6,-6 -2.69,-6 -6,-6zM11,22.45h2L13,19.5h-2v2.95zM3.55,18.54l1.41,1.41 1.79,-1.8 -1.41,-1.41 -1.79,1.8z" />
diff --git a/app/src/main/res/drawable/ic_wb_sunny_white_24dp.xml b/app/src/main/res/drawable/ic_wb_sunny_white_24dp.xml
index 5d22bab000d..12a5d977491 100644
--- a/app/src/main/res/drawable/ic_wb_sunny_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_wb_sunny_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_whatshot_black_24dp.xml b/app/src/main/res/drawable/ic_whatshot_black_24dp.xml
index 1cbc037f728..07965067e95 100644
--- a/app/src/main/res/drawable/ic_whatshot_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_whatshot_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M13.5,0.67s0.74,2.65 0.74,4.8c0,2.06 -1.35,3.73 -3.41,3.73 -2.07,0 -3.63,-1.67 -3.63,-3.73l0.03,-0.36C5.21,7.51 4,10.62 4,14c0,4.42 3.58,8 8,8s8,-3.58 8,-8C20,8.61 17.41,3.8 13.5,0.67zM11.71,19c-1.78,0 -3.22,-1.4 -3.22,-3.14 0,-1.62 1.05,-2.76 2.81,-3.12 1.77,-0.36 3.6,-1.21 4.62,-2.58 0.39,1.29 0.59,2.65 0.59,4.04 0,2.65 -2.15,4.8 -4.8,4.8z" />
diff --git a/app/src/main/res/drawable/ic_whatshot_white_24dp.xml b/app/src/main/res/drawable/ic_whatshot_white_24dp.xml
index 9aa2124f3f9..935ac845088 100644
--- a/app/src/main/res/drawable/ic_whatshot_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_whatshot_white_24dp.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_work_black_24dp.xml b/app/src/main/res/drawable/ic_work_black_24dp.xml
index 2668f2c43d3..2ee55ea23e0 100644
--- a/app/src/main/res/drawable/ic_work_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_work_black_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M20,6h-4L16,4c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM14,6h-4L10,4h4v2z" />
diff --git a/app/src/main/res/drawable/ic_work_white_24dp.xml b/app/src/main/res/drawable/ic_work_white_24dp.xml
index 8a1db78288a..8af0219f954 100644
--- a/app/src/main/res/drawable/ic_work_white_24dp.xml
+++ b/app/src/main/res/drawable/ic_work_white_24dp.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ android:pathData="M20,6h-4L16,4c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM14,6h-4L10,4h4v2z" />
diff --git a/app/src/main/res/drawable/player_controls_background.xml b/app/src/main/res/drawable/player_controls_background.xml
index f250e3558f5..cd25f2b04ec 100644
--- a/app/src/main/res/drawable/player_controls_background.xml
+++ b/app/src/main/res/drawable/player_controls_background.xml
@@ -3,5 +3,5 @@
-
\ No newline at end of file
+ android:startColor="@color/video_overlay_color" />
+
diff --git a/app/src/main/res/drawable/player_controls_top_background.xml b/app/src/main/res/drawable/player_controls_top_background.xml
index ba62ce8638d..92f9fddca9f 100644
--- a/app/src/main/res/drawable/player_controls_top_background.xml
+++ b/app/src/main/res/drawable/player_controls_top_background.xml
@@ -3,5 +3,5 @@
-
\ No newline at end of file
+ android:startColor="@color/video_overlay_color" />
+
diff --git a/app/src/main/res/drawable/progress_circular_white.xml b/app/src/main/res/drawable/progress_circular_white.xml
index 0de71afec1b..79e6f54a604 100644
--- a/app/src/main/res/drawable/progress_circular_white.xml
+++ b/app/src/main/res/drawable/progress_circular_white.xml
@@ -9,4 +9,4 @@
android:useLevel="true">
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/progress_soundcloud_horizontal_dark.xml b/app/src/main/res/drawable/progress_soundcloud_horizontal_dark.xml
index bf6a3ae2317..54a85012543 100644
--- a/app/src/main/res/drawable/progress_soundcloud_horizontal_dark.xml
+++ b/app/src/main/res/drawable/progress_soundcloud_horizontal_dark.xml
@@ -1,6 +1,6 @@
- -
+
-
@@ -12,4 +12,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/progress_soundcloud_horizontal_light.xml b/app/src/main/res/drawable/progress_soundcloud_horizontal_light.xml
index 0b3000de02b..3fb6651fa57 100644
--- a/app/src/main/res/drawable/progress_soundcloud_horizontal_light.xml
+++ b/app/src/main/res/drawable/progress_soundcloud_horizontal_light.xml
@@ -12,4 +12,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/progress_youtube_horizontal_dark.xml b/app/src/main/res/drawable/progress_youtube_horizontal_dark.xml
index 7f4520eb880..4815aec7c9f 100644
--- a/app/src/main/res/drawable/progress_youtube_horizontal_dark.xml
+++ b/app/src/main/res/drawable/progress_youtube_horizontal_dark.xml
@@ -12,4 +12,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/progress_youtube_horizontal_light.xml b/app/src/main/res/drawable/progress_youtube_horizontal_light.xml
index d1556de914c..4c85370d55d 100644
--- a/app/src/main/res/drawable/progress_youtube_horizontal_light.xml
+++ b/app/src/main/res/drawable/progress_youtube_horizontal_light.xml
@@ -12,4 +12,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/selector_checked_dark.xml b/app/src/main/res/drawable/selector_checked_dark.xml
index 59019470ff0..da05e96c685 100644
--- a/app/src/main/res/drawable/selector_checked_dark.xml
+++ b/app/src/main/res/drawable/selector_checked_dark.xml
@@ -4,4 +4,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/selector_checked_light.xml b/app/src/main/res/drawable/selector_checked_light.xml
index b782a3688d3..e64b8d083ae 100644
--- a/app/src/main/res/drawable/selector_checked_light.xml
+++ b/app/src/main/res/drawable/selector_checked_light.xml
@@ -4,4 +4,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/selector_dark.xml b/app/src/main/res/drawable/selector_dark.xml
index eb658e16d5f..0c79be29279 100644
--- a/app/src/main/res/drawable/selector_dark.xml
+++ b/app/src/main/res/drawable/selector_dark.xml
@@ -1,5 +1,5 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/selector_focused_dark.xml b/app/src/main/res/drawable/selector_focused_dark.xml
index 102f40d76ee..508083fcde2 100644
--- a/app/src/main/res/drawable/selector_focused_dark.xml
+++ b/app/src/main/res/drawable/selector_focused_dark.xml
@@ -1,5 +1,5 @@
-
-
-
\ No newline at end of file
+
+
+
diff --git a/app/src/main/res/drawable/selector_focused_light.xml b/app/src/main/res/drawable/selector_focused_light.xml
index 102f40d76ee..508083fcde2 100644
--- a/app/src/main/res/drawable/selector_focused_light.xml
+++ b/app/src/main/res/drawable/selector_focused_light.xml
@@ -1,5 +1,5 @@
-
-
-
\ No newline at end of file
+
+
+
diff --git a/app/src/main/res/drawable/selector_light.xml b/app/src/main/res/drawable/selector_light.xml
index 63f2ccaf36d..0c79be29279 100644
--- a/app/src/main/res/drawable/selector_light.xml
+++ b/app/src/main/res/drawable/selector_light.xml
@@ -1,5 +1,5 @@
-
-
-
\ No newline at end of file
+
+
+
diff --git a/app/src/main/res/drawable/splash_background.xml b/app/src/main/res/drawable/splash_background.xml
index 5b805cffaf6..61c3d058ff7 100644
--- a/app/src/main/res/drawable/splash_background.xml
+++ b/app/src/main/res/drawable/splash_background.xml
@@ -1,7 +1,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/splash_foreground.xml b/app/src/main/res/drawable/splash_foreground.xml
index cfb65075840..63fd0351f28 100644
--- a/app/src/main/res/drawable/splash_foreground.xml
+++ b/app/src/main/res/drawable/splash_foreground.xml
@@ -3,8 +3,8 @@
android:height="100dp"
android:viewportWidth="100"
android:viewportHeight="100">
-
+
diff --git a/app/src/main/res/drawable/tab_selector.xml b/app/src/main/res/drawable/tab_selector.xml
index dc472133f06..35581f25d42 100644
--- a/app/src/main/res/drawable/tab_selector.xml
+++ b/app/src/main/res/drawable/tab_selector.xml
@@ -1,8 +1,7 @@
-
+
-
-
\ No newline at end of file
+
+
diff --git a/app/src/main/res/drawable/toolbar_shadow_dark.xml b/app/src/main/res/drawable/toolbar_shadow_dark.xml
index d5ebfc8fd82..b9419029f23 100644
--- a/app/src/main/res/drawable/toolbar_shadow_dark.xml
+++ b/app/src/main/res/drawable/toolbar_shadow_dark.xml
@@ -3,5 +3,5 @@
+ android:startColor="@color/dark_shadow_start_color" />
diff --git a/app/src/main/res/drawable/toolbar_shadow_light.xml b/app/src/main/res/drawable/toolbar_shadow_light.xml
index 7b800786c7c..6546bdd2039 100644
--- a/app/src/main/res/drawable/toolbar_shadow_light.xml
+++ b/app/src/main/res/drawable/toolbar_shadow_light.xml
@@ -3,5 +3,5 @@
+ android:startColor="@color/light_shadow_start_color" />
diff --git a/app/src/main/res/layout-land/activity_player_queue_control.xml b/app/src/main/res/layout-land/activity_player_queue_control.xml
index a7872a83a82..2adea98683c 100644
--- a/app/src/main/res/layout-land/activity_player_queue_control.xml
+++ b/app/src/main/res/layout-land/activity_player_queue_control.xml
@@ -1,7 +1,7 @@
+ app:title="@string/app_name" />
@@ -30,33 +30,33 @@
android:id="@+id/play_queue"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_below="@+id/appbar"
android:layout_above="@id/progress_bar"
- android:layout_toLeftOf="@+id/control_pane"
+ android:layout_below="@+id/appbar"
android:layout_toStartOf="@+id/control_pane"
+ android:layout_toLeftOf="@+id/control_pane"
android:scrollbars="vertical"
app:layoutManager="LinearLayoutManager"
- tools:listitem="@layout/play_queue_item"/>
+ tools:listitem="@layout/play_queue_item" />
+ android:layout_below="@id/appbar"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true">
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec aliquam augue, eget cursus est. Ut id tristique enim, ut scelerisque tellus. Sed ultricies ipsum non mauris ultricies, commodo malesuada velit porta." />
+ tools:visibility="visible" />
+ android:tint="?attr/colorAccent"
+ tools:ignore="ContentDescription" />
+ tools:ignore="ContentDescription" />
+ android:padding="2dp"
+ android:scaleType="fitCenter"
+ android:tint="?attr/colorAccent"
+ android:visibility="invisible" />
+ android:tint="?attr/colorAccent"
+ tools:ignore="ContentDescription" />
+ tools:ignore="ContentDescription" />
-
+ android:layout_centerInParent="true" />
+ tools:ignore="ContentDescription" />
@@ -263,10 +263,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
+ android:background="@drawable/player_controls_background"
android:gravity="center"
android:orientation="horizontal"
android:paddingLeft="16dp"
- android:background="@drawable/player_controls_background"
android:paddingRight="16dp">
+ tools:text="1:06:29" />
+ tools:secondaryProgress="50" />
+ tools:text="1:23:49" />
+ android:visibility="gone" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml
index 9c0f03cb3bc..13e3c1b5fac 100644
--- a/app/src/main/res/layout-large-land/fragment_video_detail.xml
+++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml
@@ -2,696 +2,695 @@
-
-
-
-
+ android:background="?attr/windowBackground">
-
+
+
+
-
+ android:background="@android:color/transparent"
+ android:touchscreenBlocksFocus="false"
+ app:elevation="0dp"
+ app:layout_behavior="com.google.android.material.appbar.FlingBehavior">
-
-
-
-
-
-
+ app:layout_scrollFlags="scroll">
-
+
+ android:background="@android:color/black"
+ android:clickable="true"
+ android:descendantFocusability="afterDescendants"
+ android:focusable="true"
+ android:foreground="?attr/selectableItemBackground"
+ app:layout_collapseMode="parallax">
-
+
+
+
-
+
-
+
-
-
+
-
+
+
+
+
-
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
+ android:layout_marginEnd="30dp"
+ android:ellipsize="end"
+ android:maxLines="1"
+ android:paddingTop="12dp"
+ android:paddingBottom="8dp"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textSize="@dimen/video_item_detail_title_text_size"
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ultricies ex. Integer sit amet sodales risus. Duis non mi et urna pretium bibendum. Nunc eleifend est quis ipsum porttitor egestas. Sed facilisis, nisl quis eleifend pellentesque, orci metus egestas dolor, at accumsan eros metus quis libero." />
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
+
+
+
+ android:orientation="horizontal"
+ android:padding="6dp">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tools:text="2,816,821,505 views" />
+
+
+
+
+
+
+
+
-
-
-
-
+ tools:visibility="visible" />
+
+
-
-
+
+
-
-
+ android:id="@+id/detail_controls_playlist_append"
+ android:layout_width="80dp"
+ android:layout_height="55dp"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:contentDescription="@string/append_playlist"
+ android:focusable="true"
+ android:gravity="center"
+ android:paddingTop="6dp"
+ android:paddingBottom="6dp"
+ android:text="@string/controls_add_to_playlist_title"
+ android:textSize="12sp"
+ app:drawableTopCompat="?attr/ic_playlist_add" />
-
-
+ android:id="@+id/detail_controls_background"
+ android:layout_width="80dp"
+ android:layout_height="55dp"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:contentDescription="@string/play_audio"
+ android:focusable="true"
+ android:gravity="center"
+ android:paddingTop="6dp"
+ android:paddingBottom="6dp"
+ android:text="@string/controls_background_title"
+ android:textSize="12sp"
+ app:drawableTopCompat="?attr/ic_headset" />
+ android:id="@+id/detail_controls_popup"
+ android:layout_width="80dp"
+ android:layout_height="55dp"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:contentDescription="@string/open_in_popup_mode"
+ android:focusable="true"
+ android:gravity="center"
+ android:paddingTop="6dp"
+ android:paddingBottom="6dp"
+ android:text="@string/controls_popup_title"
+ android:textSize="12sp"
+ app:drawableTopCompat="?attr/ic_popup" />
-
-
-
-
+ android:id="@+id/detail_controls_download"
+ android:layout_width="80dp"
+ android:layout_height="55dp"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:contentDescription="@string/controls_download_desc"
+ android:focusable="true"
+ android:gravity="center"
+ android:paddingTop="6dp"
+ android:paddingBottom="6dp"
+ android:text="@string/download"
+ android:textSize="12sp"
+ app:drawableTopCompat="?attr/ic_file_download" />
-
-
+
-
+
-
+
+ android:orientation="vertical"
+ android:visibility="gone"
+ tools:visibility="visible">
-
+
-
+
-
+
-
-
+
-
+
+
-
+
-
+
-
+
-
-
+
-
+
-
+ android:layout_marginTop="10dp"
+ android:layout_weight="3">
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ android:alpha="0.9"
+ android:background="?attr/windowBackground"
+ android:descendantFocusability="blocksDescendants">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout-large-land/player.xml b/app/src/main/res/layout-large-land/player.xml
index 23481f40be3..145d1e2f891 100644
--- a/app/src/main/res/layout-large-land/player.xml
+++ b/app/src/main/res/layout-large-land/player.xml
@@ -1,8 +1,7 @@
-
+ android:layout_centerInParent="true" />
+ android:layout_alignBottom="@+id/surfaceView"
+ android:background="@android:color/black" />
+ android:layout_gravity="center" />
+ android:background="@drawable/player_controls_top_background"
+ android:visibility="gone" />
+ android:background="@drawable/player_controls_background"
+ android:visibility="gone" />
+ tools:visibility="visible" />
@@ -74,256 +73,256 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
- android:orientation="vertical"
- android:gravity="top"
- android:descendantFocusability="afterDescendants"
- android:paddingTop="@dimen/player_main_top_padding"
- android:paddingStart="@dimen/player_main_controls_padding"
- android:paddingEnd="@dimen/player_main_controls_padding"
- android:baselineAligned="false">
-
-
-
-
+ android:orientation="vertical"
+ android:paddingStart="@dimen/player_main_controls_padding"
+ android:paddingTop="@dimen/player_main_top_padding"
+ android:paddingEnd="@dimen/player_main_controls_padding">
+ android:minHeight="45dp"
+ tools:ignore="RtlHardcoded">
-
+
+
+
+
+
+
+
+
+
+ tools:ignore="HardcodedText,RtlHardcoded" />
-
-
-
-
-
-
-
-
+ android:textStyle="bold"
+ tools:ignore="RtlHardcoded,RtlSymmetry"
+ tools:text="1x" />
-
+
+
+
-
-
-
-
-
+ android:gravity="top"
+ android:visibility="invisible"
+ tools:ignore="RtlHardcoded"
+ tools:visibility="visible">
-
-
-
+ tools:ignore="HardcodedText,RtlHardcoded"
+ tools:text="FIT" />
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
+
+
@@ -333,9 +332,9 @@
android:id="@+id/bottomControls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="40dp"
android:layout_alignParentBottom="true"
android:gravity="center"
+ android:minHeight="40dp"
android:orientation="horizontal"
android:paddingLeft="@dimen/player_main_controls_padding"
android:paddingRight="@dimen/player_main_controls_padding">
@@ -349,7 +348,7 @@
android:text="-:--:--"
android:textColor="@android:color/white"
tools:ignore="HardcodedText"
- tools:text="1:06:29"/>
+ tools:text="1:06:29" />
+ tools:progress="25"
+ tools:secondaryProgress="50" />
+ tools:text="1:23:49" />
+ tools:visibility="visible" />
@@ -413,42 +412,42 @@
android:orientation="horizontal"
android:weightSum="5.5">
-
-
-
-
-
-
+
+
+
+
+
+
@@ -457,18 +456,18 @@
+ android:focusable="true">
+ android:tint="?attr/colorAccent"
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:listitem="@layout/play_queue_item" />
@@ -634,10 +633,10 @@
android:layout_centerInParent="true"
android:layout_marginBottom="58dp"
android:background="#64000000"
- android:paddingBottom="10dp"
android:paddingLeft="30dp"
- android:paddingRight="30dp"
android:paddingTop="10dp"
+ android:paddingRight="30dp"
+ android:paddingBottom="10dp"
android:textColor="@android:color/white"
android:textSize="26sp"
android:textStyle="bold"
diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml
index fb11677f843..525b2371f50 100644
--- a/app/src/main/res/layout/activity_about.xml
+++ b/app/src/main/res/layout/activity_about.xml
@@ -1,6 +1,5 @@
-
+ app:layout_scrollFlags="scroll|enterAlways" />
+ android:layout_height="wrap_content" />
-
+ app:layout_behavior="@string/appbar_scrolling_view_behavior" />
diff --git a/app/src/main/res/layout/activity_downloader.xml b/app/src/main/res/layout/activity_downloader.xml
index 0c37f6813b1..272f6e76e30 100644
--- a/app/src/main/res/layout/activity_downloader.xml
+++ b/app/src/main/res/layout/activity_downloader.xml
@@ -1,14 +1,13 @@
-
-
+
+ android:layout_height="match_parent" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/activity_error.xml b/app/src/main/res/layout/activity_error.xml
index 3542d814aa0..f265c26585c 100644
--- a/app/src/main/res/layout/activity_error.xml
+++ b/app/src/main/res/layout/activity_error.xml
@@ -5,7 +5,7 @@
android:layout_height="match_parent"
tools:context=".report.ErrorActivity">
-
+
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin">
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:text="@string/what_happened_headline"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ android:text="@string/info_labels"
+ android:textColor="?attr/colorAccent" />
-
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:text="@string/what_device_headline"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
-
+
+ android:text="@string/info_labels"
+ android:textColor="?attr/colorAccent" />
+ android:layout_height="wrap_content"
+ android:paddingLeft="16dp">
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:text="@string/error_details_headline"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ android:layout_gravity="center">
+
+ android:typeface="monospace" />
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:text="@string/your_comment"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ android:text="@string/error_report_open_github_notice"
+ android:textStyle="bold" />
-
-
+ app:layout_behavior="org.schabi.newpipe.player.event.CustomBottomSheetBehavior">
-
+
diff --git a/app/src/main/res/layout/activity_player_queue_control.xml b/app/src/main/res/layout/activity_player_queue_control.xml
index 991108e11a5..69e603e7629 100644
--- a/app/src/main/res/layout/activity_player_queue_control.xml
+++ b/app/src/main/res/layout/activity_player_queue_control.xml
@@ -1,7 +1,7 @@
+ app:title="@string/app_name" />
@@ -30,27 +30,27 @@
android:id="@+id/play_queue"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_below="@id/appbar"
android:layout_above="@id/center"
+ android:layout_below="@id/appbar"
android:scrollbars="vertical"
app:layoutManager="LinearLayoutManager"
- tools:listitem="@layout/play_queue_item"/>
+ tools:listitem="@layout/play_queue_item" />
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec aliquam augue, eget cursus est. Ut id tristique enim, ut scelerisque tellus. Sed ultricies ipsum non mauris ultricies, commodo malesuada velit porta." />
+ tools:text="Duis posuere arcu condimentum lobortis mattis." />
+ tools:visibility="visible" />
+ android:paddingRight="12dp">
+ tools:text="1:06:29" />
+ tools:secondaryProgress="50" />
+ tools:text="1:23:49" />
+ android:visibility="gone" />
+ tools:ignore="ContentDescription" />
+ tools:ignore="ContentDescription" />
+ android:src="@drawable/exo_controls_rewind"
+ android:tint="?attr/colorAccent" />
+ tools:ignore="ContentDescription" />
+ tools:visibility="visible" />
+ android:src="@drawable/exo_controls_fastforward"
+ android:tint="?attr/colorAccent" />
+ tools:ignore="ContentDescription" />
+ tools:ignore="ContentDescription" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/activity_recaptcha.xml b/app/src/main/res/layout/activity_recaptcha.xml
index 759e1f296f8..65428d9f14a 100644
--- a/app/src/main/res/layout/activity_recaptcha.xml
+++ b/app/src/main/res/layout/activity_recaptcha.xml
@@ -14,12 +14,12 @@
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar"
- app:titleTextAppearance="@style/Toolbar.Title"/>
+ app:titleTextAppearance="@style/Toolbar.Title" />
+ android:layout_marginTop="?attr/actionBarSize" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/dialog_bookmark.xml b/app/src/main/res/layout/dialog_bookmark.xml
index e42ff47016d..010f6604986 100644
--- a/app/src/main/res/layout/dialog_bookmark.xml
+++ b/app/src/main/res/layout/dialog_bookmark.xml
@@ -1,17 +1,17 @@
-
-
+ android:orientation="vertical">
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/dialog_feed_group_create.xml b/app/src/main/res/layout/dialog_feed_group_create.xml
index 6d8cb8c233f..6dafc427c36 100644
--- a/app/src/main/res/layout/dialog_feed_group_create.xml
+++ b/app/src/main/res/layout/dialog_feed_group_create.xml
@@ -117,8 +117,8 @@
android:id="@+id/subscriptions_header_info_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:gravity="center_vertical">
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+ android:visibility="gone" />
@@ -150,8 +150,8 @@
android:id="@+id/subscriptions_selector_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:padding="2dp"
android:clipToPadding="false"
+ android:padding="2dp"
tools:itemCount="200"
tools:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
tools:listitem="@layout/picker_subscription_item"
@@ -196,8 +196,8 @@
android:layout_centerVertical="true"
android:minWidth="0dp"
android:scaleType="centerInside"
- app:srcCompat="?attr/ic_delete"
android:visibility="gone"
+ app:srcCompat="?attr/ic_delete"
tools:ignore="ContentDescription"
tools:visibility="visible" />
diff --git a/app/src/main/res/layout/dialog_playback_parameter.xml b/app/src/main/res/layout/dialog_playback_parameter.xml
index cdea6a8cc2e..050f66545c2 100644
--- a/app/src/main/res/layout/dialog_playback_parameter.xml
+++ b/app/src/main/res/layout/dialog_playback_parameter.xml
@@ -5,103 +5,103 @@
android:layout_height="match_parent"
android:clickable="false"
android:paddingLeft="@dimen/video_item_search_padding"
- android:paddingRight="@dimen/video_item_search_padding"
- android:paddingTop="@dimen/video_item_search_padding">
+ android:paddingTop="@dimen/video_item_search_padding"
+ android:paddingRight="@dimen/video_item_search_padding">
+ android:scrollbarAlwaysDrawVerticalTrack="true"
+ android:scrollbars="vertical">
+ android:textStyle="bold" />
+ android:orientation="horizontal">
+ tools:text="-5%" />
+ android:layout_toEndOf="@id/tempoStepDown"
+ android:layout_toRightOf="@id/tempoStepDown"
+ android:orientation="horizontal">
+ tools:text="1.00x" />
+ tools:text="100%" />
+ tools:text="300%" />
+ tools:progress="50" />
+ tools:text="+5%" />
+ android:background="?attr/separator_color" />
+ android:textStyle="bold" />
+ android:orientation="horizontal">
+ tools:text="-5%" />
+ android:layout_toEndOf="@+id/pitchStepDown"
+ android:layout_toRightOf="@+id/pitchStepDown"
+ android:orientation="horizontal">
+ tools:text="25%" />
+ tools:text="100%" />
+ tools:text="300%" />
+ tools:progress="50" />
+ tools:text="+5%" />
+ android:background="?attr/separator_color" />
+ android:layout_below="@id/separatorStepSizeSelector"
+ android:orientation="horizontal">
+ android:textColor="?attr/colorAccent"
+ android:textStyle="bold" />
+ android:gravity="center"
+ android:textColor="?attr/colorAccent" />
+ android:gravity="center"
+ android:textColor="?attr/colorAccent" />
+ android:gravity="center"
+ android:textColor="?attr/colorAccent" />
+ android:gravity="center"
+ android:textColor="?attr/colorAccent" />
+ android:gravity="center"
+ android:textColor="?attr/colorAccent" />
+ android:background="?attr/separator_color" />
+ android:text="@string/unhook_checkbox" />
+ android:text="@string/skip_silence_checkbox" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/dialog_playlist_name.xml b/app/src/main/res/layout/dialog_playlist_name.xml
index bb39db75160..0e0747381c1 100644
--- a/app/src/main/res/layout/dialog_playlist_name.xml
+++ b/app/src/main/res/layout/dialog_playlist_name.xml
@@ -4,18 +4,18 @@
android:layout_height="wrap_content"
android:clickable="false"
android:paddingLeft="@dimen/video_item_search_padding"
- android:paddingRight="@dimen/video_item_search_padding"
- android:paddingTop="@dimen/video_item_search_padding">
+ android:paddingTop="@dimen/video_item_search_padding"
+ android:paddingRight="@dimen/video_item_search_padding">
-
\ No newline at end of file
+ android:inputType="text"
+ android:maxLines="1"
+ android:saveEnabled="true" />
+
diff --git a/app/src/main/res/layout/dialog_playlists.xml b/app/src/main/res/layout/dialog_playlists.xml
index eebeb29515b..77b884f4f33 100644
--- a/app/src/main/res/layout/dialog_playlists.xml
+++ b/app/src/main/res/layout/dialog_playlists.xml
@@ -1,16 +1,17 @@
+ android:layout_height="match_parent">
+ android:clickable="true"
+ android:focusable="true">
+
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:ignore="RtlHardcoded" />
+ android:background="?attr/separator_color" />
+ tools:listitem="@layout/list_playlist_mini_item"
+ tools:visibility="visible" />
diff --git a/app/src/main/res/layout/dialog_title.xml b/app/src/main/res/layout/dialog_title.xml
index 36af65eb37d..b901aade08a 100644
--- a/app/src/main/res/layout/dialog_title.xml
+++ b/app/src/main/res/layout/dialog_title.xml
@@ -1,14 +1,13 @@
-
+ android:paddingTop="@dimen/video_item_search_padding"
+ android:paddingRight="@dimen/video_item_search_padding">
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. " />
-
\ No newline at end of file
+ tools:text="UPLOADER"
+ tools:visibility="visible" />
+
diff --git a/app/src/main/res/layout/download_dialog.xml b/app/src/main/res/layout/download_dialog.xml
index 985ce03f5e3..b0f7110980a 100644
--- a/app/src/main/res/layout/download_dialog.xml
+++ b/app/src/main/res/layout/download_dialog.xml
@@ -1,42 +1,41 @@
-
+ layout="@layout/toolbar_layout" />
+ android:layout_marginRight="24dp"
+ android:layout_marginBottom="6dp"
+ android:text="@string/msg_name" />
+ android:maxLines="1" />
@@ -46,19 +45,19 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
- android:text="@string/video"/>
+ android:text="@string/video" />
+ android:text="@string/audio" />
+ android:text="@string/caption_setting_title" />
+ tools:listitem="@layout/stream_quality_item" />
+ android:layout_marginBottom="6dp"
+ android:text="@string/msg_threads" />
+ tools:text="3" />
+ android:progress="3" />
diff --git a/app/src/main/res/layout/drawer_header.xml b/app/src/main/res/layout/drawer_header.xml
index 324a3e79935..2abafacc38e 100644
--- a/app/src/main/res/layout/drawer_header.xml
+++ b/app/src/main/res/layout/drawer_header.xml
@@ -1,12 +1,11 @@
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/drawer_layout.xml b/app/src/main/res/layout/drawer_layout.xml
index 55c19c52c78..2bd9950036d 100644
--- a/app/src/main/res/layout/drawer_layout.xml
+++ b/app/src/main/res/layout/drawer_layout.xml
@@ -1,11 +1,10 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/error_retry.xml b/app/src/main/res/layout/error_retry.xml
index 583b304f7cd..b1c9faa9606 100644
--- a/app/src/main/res/layout/error_retry.xml
+++ b/app/src/main/res/layout/error_retry.xml
@@ -1,22 +1,21 @@
-
+ android:orientation="vertical"
+ android:padding="16dp">
+ tools:text="Network error" />
+ android:theme="@style/ServiceColoredButton" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/feed_group_add_new_item.xml b/app/src/main/res/layout/feed_group_add_new_item.xml
index e95d8cd6065..14ee19ad48c 100644
--- a/app/src/main/res/layout/feed_group_add_new_item.xml
+++ b/app/src/main/res/layout/feed_group_add_new_item.xml
@@ -1,6 +1,5 @@
-
+ tools:ignore="ContentDescription" />
+ tools:ignore="SmallSp" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/feed_group_card_item.xml b/app/src/main/res/layout/feed_group_card_item.xml
index b6bf8656bea..b4783ee3699 100644
--- a/app/src/main/res/layout/feed_group_card_item.xml
+++ b/app/src/main/res/layout/feed_group_card_item.xml
@@ -1,6 +1,5 @@
-
+ tools:src="?attr/ic_fastfood" />
+ tools:text="ALL" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/feed_import_export_group.xml b/app/src/main/res/layout/feed_import_export_group.xml
index 5699b571a8b..33d50f59337 100644
--- a/app/src/main/res/layout/feed_import_export_group.xml
+++ b/app/src/main/res/layout/feed_import_export_group.xml
@@ -1,6 +1,5 @@
-
+ android:background="?attr/toolbar_shadow" />
+ android:background="?attr/separator_color" />
+ tools:text="Header" />
+ tools:ignore="ContentDescription,RtlHardcoded" />
@@ -77,15 +76,15 @@
android:text="@string/import_from"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="13sp"
- tools:ignore="RtlHardcoded"/>
+ tools:ignore="RtlHardcoded" />
+ android:layout_marginLeft="36dp"
+ android:orientation="vertical" />
+ tools:ignore="RtlHardcoded" />
+ android:orientation="vertical" />
+ android:layout_marginEnd="8dp"
+ android:background="?attr/separator_color" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/feed_item_carousel.xml b/app/src/main/res/layout/feed_item_carousel.xml
index db3d9cb11ff..4e8fc2c909f 100644
--- a/app/src/main/res/layout/feed_item_carousel.xml
+++ b/app/src/main/res/layout/feed_item_carousel.xml
@@ -1,7 +1,6 @@
-
\ No newline at end of file
+ android:scrollbars="none" />
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
index d510bf26d37..77f94068531 100644
--- a/app/src/main/res/layout/fragment_about.xml
+++ b/app/src/main/res/layout/fragment_about.xml
@@ -1,5 +1,4 @@
-
+ android:paddingBottom="@dimen/activity_vertical_margin">
+ android:contentDescription="TODO"
+ app:srcCompat="@mipmap/ic_launcher" />
+ android:layout_height="match_parent">
+ android:visibility="gone"
+ tools:visibility="visible" />
+ android:layout_alignParentTop="true"
+ android:background="?attr/toolbar_shadow" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/fragment_bookmarks.xml b/app/src/main/res/layout/fragment_bookmarks.xml
index 896679c34a0..df7fdc6485e 100644
--- a/app/src/main/res/layout/fragment_bookmarks.xml
+++ b/app/src/main/res/layout/fragment_bookmarks.xml
@@ -1,6 +1,5 @@
-
+ tools:listitem="@layout/list_playlist_mini_item" />
+ tools:visibility="visible" />
+ tools:visibility="visible" />
+ android:layout_alignParentTop="true"
+ android:background="?attr/toolbar_shadow" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/fragment_channel.xml b/app/src/main/res/layout/fragment_channel.xml
index 9d5d7053537..1a81c75fd1f 100644
--- a/app/src/main/res/layout/fragment_channel.xml
+++ b/app/src/main/res/layout/fragment_channel.xml
@@ -1,6 +1,5 @@
-
@@ -10,7 +9,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
- tools:listitem="@layout/list_stream_item"/>
+ tools:listitem="@layout/list_stream_item" />
+ tools:visibility="visible" />
+ tools:ignore="HardcodedText,UnusedAttribute" />
+ android:textSize="24sp" />
@@ -70,12 +69,12 @@
android:layout_centerInParent="true"
android:layout_marginTop="50dp"
android:visibility="gone"
- tools:visibility="visible"/>
+ tools:visibility="visible" />
+ android:layout_alignParentTop="true"
+ android:background="?attr/toolbar_shadow" />
diff --git a/app/src/main/res/layout/fragment_choose_tabs.xml b/app/src/main/res/layout/fragment_choose_tabs.xml
index 20fbc0bf86b..b41066226f1 100644
--- a/app/src/main/res/layout/fragment_choose_tabs.xml
+++ b/app/src/main/res/layout/fragment_choose_tabs.xml
@@ -1,6 +1,5 @@
-
+ tools:listitem="@layout/list_choose_tabs" />
+ app:srcCompat="?attr/ic_add" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/fragment_comments.xml b/app/src/main/res/layout/fragment_comments.xml
index 7159dd5b96c..54448356525 100644
--- a/app/src/main/res/layout/fragment_comments.xml
+++ b/app/src/main/res/layout/fragment_comments.xml
@@ -1,6 +1,5 @@
-
@@ -10,7 +9,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
- tools:listitem="@layout/list_comments_item"/>
+ tools:listitem="@layout/list_comments_item" />
+ tools:visibility="visible" />
+ tools:ignore="HardcodedText,UnusedAttribute" />
+ android:textSize="24sp" />
@@ -59,13 +58,13 @@
android:layout_centerInParent="true"
android:layout_marginTop="50dp"
android:visibility="gone"
- tools:visibility="visible"/>
+ tools:visibility="visible" />
+ android:background="?attr/toolbar_shadow"
+ android:visibility="gone" />
diff --git a/app/src/main/res/layout/fragment_empty.xml b/app/src/main/res/layout/fragment_empty.xml
index 8ce25d2aec8..6a8d3c1c678 100644
--- a/app/src/main/res/layout/fragment_empty.xml
+++ b/app/src/main/res/layout/fragment_empty.xml
@@ -15,7 +15,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="90dp"
- tools:visibility="visible"/>
+ tools:visibility="visible" />
diff --git a/app/src/main/res/layout/fragment_import.xml b/app/src/main/res/layout/fragment_import.xml
index dd45bcc74e0..bdc2c45578d 100644
--- a/app/src/main/res/layout/fragment_import.xml
+++ b/app/src/main/res/layout/fragment_import.xml
@@ -1,6 +1,5 @@
-
@@ -15,7 +14,7 @@
android:padding="16dp"
android:scrollbars="vertical"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
- tools:text="@string/import_soundcloud_instructions"/>
+ tools:text="@string/import_soundcloud_instructions" />
+ tools:visibility="visible" />
+ tools:text="@string/import_title" />
@@ -50,6 +49,6 @@
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_alignParentTop="true"
- android:background="?attr/toolbar_shadow"/>
+ android:background="?attr/toolbar_shadow" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/fragment_instance_list.xml b/app/src/main/res/layout/fragment_instance_list.xml
index 970b67c2612..563c0088f90 100644
--- a/app/src/main/res/layout/fragment_instance_list.xml
+++ b/app/src/main/res/layout/fragment_instance_list.xml
@@ -12,13 +12,13 @@
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:autoLink="web"
- android:text="@string/peertube_instance_url_help"/>
+ android:text="@string/peertube_instance_url_help" />
@@ -48,4 +48,4 @@
app:fabSize="auto"
app:srcCompat="?attr/ic_add" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/fragment_kiosk.xml b/app/src/main/res/layout/fragment_kiosk.xml
index 5617c258143..d19058981a4 100644
--- a/app/src/main/res/layout/fragment_kiosk.xml
+++ b/app/src/main/res/layout/fragment_kiosk.xml
@@ -1,16 +1,16 @@
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+ tools:listitem="@layout/list_stream_item" />
+ tools:visibility="visible" />
+ tools:ignore="HardcodedText,UnusedAttribute" />
+ android:textSize="24sp" />
@@ -59,12 +59,12 @@
android:layout_centerInParent="true"
android:layout_marginTop="50dp"
android:visibility="gone"
- tools:visibility="visible"/>
+ tools:visibility="visible" />
+ android:layout_alignParentTop="true"
+ android:background="?attr/toolbar_shadow" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/fragment_licenses.xml b/app/src/main/res/layout/fragment_licenses.xml
index 2d5f4bac761..95778431e7d 100644
--- a/app/src/main/res/layout/fragment_licenses.xml
+++ b/app/src/main/res/layout/fragment_licenses.xml
@@ -8,17 +8,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingTop="@dimen/activity_vertical_margin">
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin">
@@ -35,16 +35,16 @@
style="@style/Base.Widget.AppCompat.Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginRight="@dimen/activity_vertical_margin"
android:layout_gravity="end"
+ android:layout_marginRight="@dimen/activity_vertical_margin"
android:text="@string/read_full_license" />
@@ -54,4 +54,4 @@
android:layout_height="wrap_content"
android:orientation="vertical" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml
index 1a2455691fa..6087e2b2dd3 100644
--- a/app/src/main/res/layout/fragment_main.xml
+++ b/app/src/main/res/layout/fragment_main.xml
@@ -1,6 +1,5 @@
-
@@ -12,13 +11,13 @@
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="?attr/colorPrimary"
- app:tabMinWidth="60dp"
- app:tabGravity="fill"/>
+ app:tabGravity="fill"
+ app:tabMinWidth="60dp" />
+ android:layout_below="@id/main_tab_layout" />
diff --git a/app/src/main/res/layout/fragment_playlist.xml b/app/src/main/res/layout/fragment_playlist.xml
index 49edaecfb0f..f9c83f0eb51 100644
--- a/app/src/main/res/layout/fragment_playlist.xml
+++ b/app/src/main/res/layout/fragment_playlist.xml
@@ -1,6 +1,5 @@
-
@@ -10,7 +9,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
- tools:listitem="@layout/list_stream_mini_item"/>
+ tools:listitem="@layout/list_stream_mini_item" />
+ tools:visibility="visible" />
+ tools:ignore="HardcodedText,UnusedAttribute" />
+ android:textSize="24sp" />
@@ -59,12 +58,12 @@
android:layout_centerInParent="true"
android:layout_marginTop="50dp"
android:visibility="gone"
- tools:visibility="visible"/>
+ tools:visibility="visible" />
+ android:layout_alignParentTop="true"
+ android:background="?attr/toolbar_shadow" />
diff --git a/app/src/main/res/layout/fragment_related_streams.xml b/app/src/main/res/layout/fragment_related_streams.xml
index 6e9fc25886e..22357131824 100644
--- a/app/src/main/res/layout/fragment_related_streams.xml
+++ b/app/src/main/res/layout/fragment_related_streams.xml
@@ -1,6 +1,5 @@
-
@@ -10,7 +9,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
- tools:listitem="@layout/list_stream_item"/>
+ tools:listitem="@layout/list_stream_item" />
+ tools:visibility="visible" />
+ tools:ignore="HardcodedText,UnusedAttribute" />
+ android:textSize="24sp" />
@@ -59,13 +58,13 @@
android:layout_centerInParent="true"
android:layout_marginTop="50dp"
android:visibility="gone"
- tools:visibility="visible"/>
+ tools:visibility="visible" />
+ android:background="?attr/toolbar_shadow"
+ android:visibility="gone" />
diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml
index 0550f059b2b..ed651b17a8e 100644
--- a/app/src/main/res/layout/fragment_search.xml
+++ b/app/src/main/res/layout/fragment_search.xml
@@ -1,6 +1,5 @@
-
+ tools:visibility="visible" />
+ tools:ignore="HardcodedText,UnusedAttribute" />
+ android:textSize="24sp" />
@@ -92,12 +91,12 @@
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:visibility="gone"
- tools:visibility="visible"/>
+ tools:visibility="visible" />
+ android:layout_alignParentTop="true"
+ android:background="?attr/toolbar_shadow" />
diff --git a/app/src/main/res/layout/fragment_subscription.xml b/app/src/main/res/layout/fragment_subscription.xml
index 60a8fb3346a..cb07112046a 100644
--- a/app/src/main/res/layout/fragment_subscription.xml
+++ b/app/src/main/res/layout/fragment_subscription.xml
@@ -1,6 +1,5 @@
-
@@ -11,7 +10,7 @@
android:layout_height="match_parent"
android:scrollbars="vertical"
android:visibility="gone"
- tools:listitem="@layout/list_channel_item"/>
+ tools:listitem="@layout/list_channel_item" />
+ tools:visibility="visible" />
+ tools:visibility="visible" />
+ android:layout_alignParentTop="true"
+ android:background="?attr/toolbar_shadow" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml
index bf4f59a8c95..0df85fe959e 100644
--- a/app/src/main/res/layout/fragment_video_detail.xml
+++ b/app/src/main/res/layout/fragment_video_detail.xml
@@ -5,13 +5,13 @@
android:id="@+id/video_item_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="?attr/windowBackground"
+ android:background="?attr/windowBackground"
android:focusableInTouchMode="true">
+ android:layout_height="wrap_content">
@@ -139,12 +139,11 @@
tools:progress="40"
tools:visibility="visible" />
-
-
+
+
@@ -431,13 +430,13 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/append_playlist"
- app:drawableTopCompat="?attr/ic_playlist_add"
android:focusable="true"
android:gravity="center"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:text="@string/controls_add_to_playlist_title"
- android:textSize="12sp" />
+ android:textSize="12sp"
+ app:drawableTopCompat="?attr/ic_playlist_add" />
+ android:textSize="12sp"
+ app:drawableTopCompat="?attr/ic_headset" />
+ android:textSize="12sp"
+ app:drawableTopCompat="?attr/ic_popup" />
+ android:textSize="12sp"
+ app:drawableTopCompat="?attr/ic_file_download" />
@@ -551,117 +550,117 @@
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
- app:layout_behavior="@string/appbar_scrolling_view_behavior">
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
-
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ tools:ignore="RtlHardcoded">
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/header_divider_item_layout.xml b/app/src/main/res/layout/header_divider_item_layout.xml
index 29e080d7ceb..d9bcdfb386b 100644
--- a/app/src/main/res/layout/header_divider_item_layout.xml
+++ b/app/src/main/res/layout/header_divider_item_layout.xml
@@ -1,14 +1,13 @@
-
+ tools:text="@string/fragment_feed_title" />
-
\ No newline at end of file
+ android:background="?attr/separator_color" />
+
diff --git a/app/src/main/res/layout/header_item.xml b/app/src/main/res/layout/header_item.xml
index 4d4e1b884f5..71cd8c9df7c 100644
--- a/app/src/main/res/layout/header_item.xml
+++ b/app/src/main/res/layout/header_item.xml
@@ -1,16 +1,15 @@
-
\ No newline at end of file
+ tools:text="Header" />
diff --git a/app/src/main/res/layout/header_with_text_item.xml b/app/src/main/res/layout/header_with_text_item.xml
index 871893ad64b..c4ba18f0946 100644
--- a/app/src/main/res/layout/header_with_text_item.xml
+++ b/app/src/main/res/layout/header_with_text_item.xml
@@ -1,6 +1,5 @@
-
+ tools:text="Header" />
-
\ No newline at end of file
+ tools:text="1 selected" />
+
diff --git a/app/src/main/res/layout/history_disabled_view.xml b/app/src/main/res/layout/history_disabled_view.xml
index 5819aa768f6..bf446535672 100644
--- a/app/src/main/res/layout/history_disabled_view.xml
+++ b/app/src/main/res/layout/history_disabled_view.xml
@@ -1,6 +1,5 @@
-
+ tools:ignore="HardcodedText" />
-
\ No newline at end of file
+ android:text="@string/history_disabled" />
+
diff --git a/app/src/main/res/layout/instance_spinner_layout.xml b/app/src/main/res/layout/instance_spinner_layout.xml
index 63e910d9611..556d59785b7 100644
--- a/app/src/main/res/layout/instance_spinner_layout.xml
+++ b/app/src/main/res/layout/instance_spinner_layout.xml
@@ -2,8 +2,8 @@
+ android:prompt="@string/choose_instance_prompt"
+ tools:listitem="@layout/instance_spinner_item" />
diff --git a/app/src/main/res/layout/item_instance.xml b/app/src/main/res/layout/item_instance.xml
index 587712e61d2..534dc0ca4a6 100644
--- a/app/src/main/res/layout/item_instance.xml
+++ b/app/src/main/res/layout/item_instance.xml
@@ -1,15 +1,14 @@
-
+ tools:src="@drawable/place_holder_peertube" />
+ tools:text="Framatube" />
+ tools:text="https://framatube.org" />
+ android:layout_centerVertical="true"
+ android:layout_toLeftOf="@id/handle" />
+ tools:ignore="ContentDescription,RtlHardcoded" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/item_search_history.xml b/app/src/main/res/layout/item_search_history.xml
index d6cfeec99f4..8a8b1dabd04 100644
--- a/app/src/main/res/layout/item_search_history.xml
+++ b/app/src/main/res/layout/item_search_history.xml
@@ -1,28 +1,27 @@
-
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingBottom="8dp">
+ tools:text="10/11/2017 11:32" />
-
\ No newline at end of file
+ tools:text="Search query" />
+
diff --git a/app/src/main/res/layout/item_search_suggestion.xml b/app/src/main/res/layout/item_search_suggestion.xml
index d93032cc567..8d2a226d98f 100644
--- a/app/src/main/res/layout/item_search_suggestion.xml
+++ b/app/src/main/res/layout/item_search_suggestion.xml
@@ -1,25 +1,25 @@
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp">
+ tools:src="?attr/ic_history" />
+ tools:text="Search query" />
+ android:paddingBottom="8dp">
+ tools:ignore="ContentDescription,RtlHardcoded" />
diff --git a/app/src/main/res/layout/item_software_component.xml b/app/src/main/res/layout/item_software_component.xml
index acf511b636a..b5e224a3e8a 100644
--- a/app/src/main/res/layout/item_software_component.xml
+++ b/app/src/main/res/layout/item_software_component.xml
@@ -3,12 +3,12 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:orientation="vertical"
android:background="?attr/selectableItemBackground"
android:clickable="true"
- android:focusable="true">
+ android:focusable="true"
+ android:orientation="vertical"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin">
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/list_channel_item.xml b/app/src/main/res/layout/list_channel_item.xml
index 547054cc0f6..d6a9a51e42b 100644
--- a/app/src/main/res/layout/list_channel_item.xml
+++ b/app/src/main/res/layout/list_channel_item.xml
@@ -1,6 +1,5 @@
-
+ tools:ignore="RtlHardcoded" />
+ tools:text="10M subscribers • 1000 videos" />
diff --git a/app/src/main/res/layout/list_channel_mini_item.xml b/app/src/main/res/layout/list_channel_mini_item.xml
index e009aa7d6c6..cc91b858fb5 100644
--- a/app/src/main/res/layout/list_channel_mini_item.xml
+++ b/app/src/main/res/layout/list_channel_mini_item.xml
@@ -1,6 +1,5 @@
-
+ tools:ignore="RtlHardcoded" />
+ tools:text="Channel Title, Lorem ipsum" />
+ tools:text="10M subscribers" />
diff --git a/app/src/main/res/layout/list_choose_tabs.xml b/app/src/main/res/layout/list_choose_tabs.xml
index d09f887ea0d..a385f64a82a 100644
--- a/app/src/main/res/layout/list_choose_tabs.xml
+++ b/app/src/main/res/layout/list_choose_tabs.xml
@@ -1,18 +1,17 @@
-
@@ -29,23 +28,23 @@
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
tools:ignore="ContentDescription,RtlHardcoded"
- tools:src="?attr/ic_kiosk_hot"/>
+ tools:src="?attr/ic_kiosk_hot" />
+ tools:text="Lorem ipsum dolor sit amet" />
+ tools:ignore="ContentDescription,RtlHardcoded" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/list_choose_tabs_dialog.xml b/app/src/main/res/layout/list_choose_tabs_dialog.xml
index 9f50333688e..1fd917d1e16 100644
--- a/app/src/main/res/layout/list_choose_tabs_dialog.xml
+++ b/app/src/main/res/layout/list_choose_tabs_dialog.xml
@@ -1,6 +1,5 @@
-
+ tools:src="?attr/ic_kiosk_hot" />
-
\ No newline at end of file
+ tools:text="Lorem ipsum dolor sit amet" />
+
diff --git a/app/src/main/res/layout/list_comments_item.xml b/app/src/main/res/layout/list_comments_item.xml
index 02af7e98a73..001d3ae04c9 100644
--- a/app/src/main/res/layout/list_comments_item.xml
+++ b/app/src/main/res/layout/list_comments_item.xml
@@ -1,7 +1,7 @@
+ tools:ignore="RtlHardcoded" />
-
+ tools:ignore="HardcodedText" />
-
\ No newline at end of file
+ android:text="@string/empty_subscription_feed_subtitle" />
+
diff --git a/app/src/main/res/layout/list_playlist_grid_item.xml b/app/src/main/res/layout/list_playlist_grid_item.xml
index 4100ba39f51..59d067960b7 100644
--- a/app/src/main/res/layout/list_playlist_grid_item.xml
+++ b/app/src/main/res/layout/list_playlist_grid_item.xml
@@ -1,7 +1,7 @@
+ tools:ignore="RtlHardcoded" />
+ tools:text="314159" />
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
+ tools:text="Uploader" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/list_playlist_item.xml b/app/src/main/res/layout/list_playlist_item.xml
index 2aeefef3856..61a6fca82cb 100644
--- a/app/src/main/res/layout/list_playlist_item.xml
+++ b/app/src/main/res/layout/list_playlist_item.xml
@@ -1,7 +1,7 @@
+ tools:ignore="RtlHardcoded" />
+ tools:text="314159" />
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
+ tools:text="Uploader" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/list_playlist_mini_item.xml b/app/src/main/res/layout/list_playlist_mini_item.xml
index 3935d30ca72..f31ef67f295 100644
--- a/app/src/main/res/layout/list_playlist_mini_item.xml
+++ b/app/src/main/res/layout/list_playlist_mini_item.xml
@@ -1,7 +1,7 @@
+ tools:ignore="RtlHardcoded" />
+ tools:text="3141" />
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
+ tools:text="Uploader" />
diff --git a/app/src/main/res/layout/list_radio_icon_item.xml b/app/src/main/res/layout/list_radio_icon_item.xml
index 3446e351c61..abbd82a5c1e 100644
--- a/app/src/main/res/layout/list_radio_icon_item.xml
+++ b/app/src/main/res/layout/list_radio_icon_item.xml
@@ -3,15 +3,15 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:background="?attr/checked_selector"
android:button="@null"
android:drawablePadding="24dp"
android:ellipsize="marquee"
android:gravity="center_vertical"
android:maxLines="2"
android:minHeight="?attr/listPreferredItemHeightSmall"
- android:paddingEnd="?attr/listPreferredItemPaddingRight"
android:paddingStart="?attr/listPreferredItemPaddingLeft"
- android:background="?attr/checked_selector"
+ android:paddingEnd="?attr/listPreferredItemPaddingRight"
android:textColor="?attr/textColorAlertDialogListItem"
tools:drawableLeft="?attr/ic_play_arrow"
tools:text="Lorem ipsum dolor sit amet" />
diff --git a/app/src/main/res/layout/list_stream_grid_item.xml b/app/src/main/res/layout/list_stream_grid_item.xml
index 27c69aee8bb..4e3d6edfb3b 100644
--- a/app/src/main/res/layout/list_stream_grid_item.xml
+++ b/app/src/main/res/layout/list_stream_grid_item.xml
@@ -1,6 +1,5 @@
-
+ tools:ignore="RtlHardcoded" />
+ tools:text="1:09:10" />
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
+ tools:text="Uploader" />
+ tools:text="2 years ago • 10M views" />
+ android:layout_marginTop="-2dp"
+ android:progressDrawable="?progress_horizontal_drawable" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/list_stream_item.xml b/app/src/main/res/layout/list_stream_item.xml
index d2000381d90..e35168bba96 100644
--- a/app/src/main/res/layout/list_stream_item.xml
+++ b/app/src/main/res/layout/list_stream_item.xml
@@ -1,6 +1,5 @@
-
+ tools:ignore="RtlHardcoded" />
+ tools:text="1:09:10" />
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
+ tools:text="Uploader" />
+ tools:text="2 years ago • 10M views" />
+ android:layout_marginTop="-2dp"
+ android:progressDrawable="?progress_horizontal_drawable" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/list_stream_mini_item.xml b/app/src/main/res/layout/list_stream_mini_item.xml
index 667798128f8..cb4031aa28b 100644
--- a/app/src/main/res/layout/list_stream_mini_item.xml
+++ b/app/src/main/res/layout/list_stream_mini_item.xml
@@ -1,6 +1,5 @@
-
+ tools:ignore="RtlHardcoded" />
+ tools:text="1:09:10" />
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
+ android:layout_marginTop="-2dp"
+ android:progressDrawable="?progress_horizontal_drawable" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/list_stream_playlist_grid_item.xml b/app/src/main/res/layout/list_stream_playlist_grid_item.xml
index 2b578e2f282..75aef9a9e4c 100644
--- a/app/src/main/res/layout/list_stream_playlist_grid_item.xml
+++ b/app/src/main/res/layout/list_stream_playlist_grid_item.xml
@@ -1,7 +1,7 @@
+ android:layout_marginTop="-2dp"
+ android:progressDrawable="?progress_horizontal_drawable" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/list_stream_playlist_item.xml b/app/src/main/res/layout/list_stream_playlist_item.xml
index a36d6f0d857..9434af86716 100644
--- a/app/src/main/res/layout/list_stream_playlist_item.xml
+++ b/app/src/main/res/layout/list_stream_playlist_item.xml
@@ -1,7 +1,7 @@
+ tools:ignore="RtlHardcoded" />
+ tools:text="1:09:10" />
+ tools:ignore="RtlHardcoded,RtlSymmetry" />
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique..." />
+ android:layout_marginTop="-2dp"
+ android:progressDrawable="?progress_horizontal_drawable" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/local_playlist_header.xml b/app/src/main/res/layout/local_playlist_header.xml
index 95da8144750..5cd44944e99 100644
--- a/app/src/main/res/layout/local_playlist_header.xml
+++ b/app/src/main/res/layout/local_playlist_header.xml
@@ -1,6 +1,5 @@
-
+ tools:text="Mix musics #23 title Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
+ tools:text="234 videos" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/main_bg.xml b/app/src/main/res/layout/main_bg.xml
index 7c8c877d521..996ecdde485 100644
--- a/app/src/main/res/layout/main_bg.xml
+++ b/app/src/main/res/layout/main_bg.xml
@@ -1,28 +1,29 @@
+ android:fontFamily="sans-serif-condensed"
+ android:text="@string/app_name"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textSize="40sp" />
+ android:textAppearance="?android:attr/textAppearanceMedium" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/mission_item.xml b/app/src/main/res/layout/mission_item.xml
index 781fd036b5a..8fec490dd14 100644
--- a/app/src/main/res/layout/mission_item.xml
+++ b/app/src/main/res/layout/mission_item.xml
@@ -1,13 +1,12 @@
-
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
@@ -27,20 +26,20 @@
android:layout_marginLeft="6dp"
android:singleLine="true"
android:text="0%"
- android:textSize="20sp"
- android:textColor="@color/white"/>
+ android:textColor="@color/white"
+ android:textSize="20sp" />
+ app:srcCompat="@drawable/ic_more_vert_white_24dp" />
@@ -50,25 +49,25 @@
android:layout_height="72dp"
android:layout_below="@id/item_title_line"
android:layout_centerHorizontal="true"
- android:scaleType="fitXY"
+ android:contentDescription="TODO"
android:gravity="center"
android:padding="10dp"
- android:contentDescription="TODO" />
+ android:scaleType="fitXY" />
+ android:textStyle="bold" />
+ android:textColor="@color/white"
+ android:textSize="12sp" />
-
+
diff --git a/app/src/main/res/layout/mission_item_linear.xml b/app/src/main/res/layout/mission_item_linear.xml
index 0916fc5e152..ad3a6aad516 100644
--- a/app/src/main/res/layout/mission_item_linear.xml
+++ b/app/src/main/res/layout/mission_item_linear.xml
@@ -1,13 +1,12 @@
-
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
@@ -16,10 +15,10 @@
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_centerVertical="true"
- android:scaleType="fitXY"
+ android:contentDescription="TODO"
android:gravity="center"
android:padding="15dp"
- android:contentDescription="TODO" />
+ android:scaleType="fitXY" />
+ android:textColor="@color/white"
+ android:textSize="12sp" />
+ android:textSize="12sp"
+ android:textStyle="bold" />
+ app:srcCompat="@drawable/ic_more_vert_white_24dp" />
diff --git a/app/src/main/res/layout/missions.xml b/app/src/main/res/layout/missions.xml
index 81eaeb9b33a..b3f3e3f95d4 100644
--- a/app/src/main/res/layout/missions.xml
+++ b/app/src/main/res/layout/missions.xml
@@ -1,17 +1,16 @@
-
-
+ android:layout_height="match_parent" />
+
diff --git a/app/src/main/res/layout/missions_header.xml b/app/src/main/res/layout/missions_header.xml
index 6de38664d55..2eb38c1fc15 100644
--- a/app/src/main/res/layout/missions_header.xml
+++ b/app/src/main/res/layout/missions_header.xml
@@ -1,15 +1,14 @@
-
+ android:layout_marginTop="16dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginRight="8dp"
+ android:orientation="vertical">
+ android:textStyle="bold" />
-
\ No newline at end of file
+ tools:src="?attr/ic_rss" />
diff --git a/app/src/main/res/layout/picker_subscription_item.xml b/app/src/main/res/layout/picker_subscription_item.xml
index 3f9b0bd2c50..62f5b28ecc8 100644
--- a/app/src/main/res/layout/picker_subscription_item.xml
+++ b/app/src/main/res/layout/picker_subscription_item.xml
@@ -1,14 +1,13 @@
-
+ android:focusable="true">
+ tools:src="@drawable/buddy_channel_item" />
+ tools:text="Channel Title, Lorem ipsum" />
+ tools:ignore="ContentDescription" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/pignate_footer.xml b/app/src/main/res/layout/pignate_footer.xml
index c73d0a7371f..628b1eaa9c6 100644
--- a/app/src/main/res/layout/pignate_footer.xml
+++ b/app/src/main/res/layout/pignate_footer.xml
@@ -1,6 +1,5 @@
-
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/play_queue_item.xml b/app/src/main/res/layout/play_queue_item.xml
index aa64cd2e306..4364aa84dc6 100644
--- a/app/src/main/res/layout/play_queue_item.xml
+++ b/app/src/main/res/layout/play_queue_item.xml
@@ -1,14 +1,14 @@
@@ -16,57 +16,57 @@
android:id="@+id/itemSelected"
android:layout_width="10dp"
android:layout_height="10dp"
- android:layout_centerInParent="true"
- android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
+ android:layout_alignParentLeft="true"
+ android:layout_centerInParent="true"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:scaleType="fitXY"
app:srcCompat="?attr/ic_selected"
- tools:ignore="ContentDescription,RtlHardcoded"/>
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:ignore="RtlHardcoded" />
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:text="1:09:10" />
+ tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. " />
+ tools:text="Uploader" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml
index f257c207b01..11b8bc5db36 100644
--- a/app/src/main/res/layout/player.xml
+++ b/app/src/main/res/layout/player.xml
@@ -1,8 +1,7 @@
-
+ android:layout_centerInParent="true" />
+ android:layout_alignBottom="@+id/surfaceView"
+ android:background="@android:color/black" />
+ android:layout_gravity="center" />
+ android:background="@drawable/player_controls_top_background"
+ android:visibility="gone" />
+ android:background="@drawable/player_controls_background"
+ android:visibility="gone" />
+ tools:visibility="visible" />
@@ -74,137 +73,137 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
- android:orientation="vertical"
+ android:baselineAligned="false"
android:gravity="top"
- android:paddingTop="@dimen/player_main_top_padding"
+ android:orientation="vertical"
android:paddingStart="@dimen/player_main_controls_padding"
- android:paddingEnd="@dimen/player_main_controls_padding"
- android:baselineAligned="false">
+ android:paddingTop="@dimen/player_main_top_padding"
+ android:paddingEnd="@dimen/player_main_controls_padding">
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ android:layout_weight="1"
+ android:gravity="top"
+ android:orientation="vertical"
+ tools:ignore="RtlHardcoded">
+ tools:text="The Video Title LONG very LONG" />
+ tools:text="The Video Artist LONG very LONG very Long" />
+ tools:ignore="HardcodedText,RtlHardcoded" />
+ tools:text="1x" />
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:ignore="ContentDescription,RtlHardcoded" />
@@ -221,108 +220,108 @@
android:id="@+id/resizeTextView"
android:layout_width="wrap_content"
android:layout_height="35dp"
- android:padding="@dimen/player_main_buttons_padding"
android:layout_marginEnd="8dp"
+ android:background="?attr/selectableItemBackground"
android:gravity="center"
android:minWidth="50dp"
+ android:padding="@dimen/player_main_buttons_padding"
android:textColor="@android:color/white"
android:textStyle="bold"
- android:background="?attr/selectableItemBackground"
tools:ignore="HardcodedText,RtlHardcoded"
- tools:text="FIT"/>
-
-
+ tools:text="FIT" />
-
+ android:layout_weight="3">
-
+
+
+
+ tools:ignore="RtlHardcoded" />
+ tools:ignore="RtlHardcoded" />
+ tools:ignore="RtlHardcoded" />
-
+
@@ -332,9 +331,9 @@
android:id="@+id/bottomControls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="40dp"
android:layout_alignParentBottom="true"
android:gravity="center"
+ android:minHeight="40dp"
android:orientation="horizontal"
android:paddingLeft="@dimen/player_main_controls_padding"
android:paddingRight="@dimen/player_main_controls_padding">
@@ -348,7 +347,7 @@
android:text="-:--:--"
android:textColor="@android:color/white"
tools:ignore="HardcodedText"
- tools:text="1:06:29"/>
+ tools:text="1:06:29" />
+ tools:secondaryProgress="50" />
+ tools:text="1:23:49" />
+ tools:visibility="visible" />
@@ -414,14 +413,14 @@
android:id="@+id/playPreviousButton"
android:layout_width="0dp"
android:layout_height="40dp"
- android:layout_weight="1"
android:layout_marginEnd="10dp"
+ android:layout_weight="1"
+ android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
- android:background="?attr/selectableItemBackgroundBorderless"
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_previous_white_24dp"
- tools:ignore="ContentDescription"/>
+ tools:ignore="ContentDescription" />
+ tools:ignore="ContentDescription" />
+ tools:ignore="ContentDescription" />
@@ -455,16 +454,16 @@
android:id="@+id/playQueuePanel"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:visibility="gone"
android:background="?attr/queue_background_color"
+ android:visibility="gone"
tools:visibility="visible">
+ android:focusable="true">
+ android:tint="?attr/colorAccent"
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:listitem="@layout/play_queue_item" />
@@ -541,8 +540,8 @@
android:id="@+id/controlAnimationView"
android:layout_width="100dp"
android:layout_height="100dp"
- android:padding="15dp"
android:background="@drawable/background_oval_black_transparent"
+ android:padding="15dp"
android:visibility="gone"
tools:ignore="ContentDescription"
tools:src="@drawable/ic_fast_rewind_white_24dp"
@@ -630,10 +629,10 @@
android:layout_centerInParent="true"
android:layout_marginBottom="58dp"
android:background="#64000000"
- android:paddingBottom="10dp"
android:paddingLeft="30dp"
- android:paddingRight="30dp"
android:paddingTop="10dp"
+ android:paddingRight="30dp"
+ android:paddingBottom="10dp"
android:textColor="@android:color/white"
android:textSize="26sp"
android:textStyle="bold"
diff --git a/app/src/main/res/layout/player_notification.xml b/app/src/main/res/layout/player_notification.xml
deleted file mode 100644
index dc7215fb533..00000000000
--- a/app/src/main/res/layout/player_notification.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/player_notification_expanded.xml b/app/src/main/res/layout/player_notification_expanded.xml
deleted file mode 100644
index 80bc2262710..00000000000
--- a/app/src/main/res/layout/player_notification_expanded.xml
+++ /dev/null
@@ -1,165 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/playlist_control.xml b/app/src/main/res/layout/playlist_control.xml
index 53890d017a2..c493802626e 100644
--- a/app/src/main/res/layout/playlist_control.xml
+++ b/app/src/main/res/layout/playlist_control.xml
@@ -3,9 +3,9 @@
@@ -14,74 +14,79 @@
android:layout_width="match_parent"
android:layout_height="@dimen/playlist_ctrl_height"
android:layout_weight="1"
- android:gravity="center"
+ android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
- android:background="?attr/selectableItemBackground">
+ android:gravity="center">
+
+ app:drawableStartCompat="?attr/ic_headset" />
-
+ android:layout_marginBottom="@dimen/playlist_ctrl_seperator_margin"
+ android:background="?attr/colorAccent"
+ android:clickable="false" />
+ android:gravity="center">
+
+ android:textColor="?attr/colorAccent"
+ android:textSize="@dimen/channel_rss_title_size" />
-
+ android:layout_marginBottom="@dimen/playlist_ctrl_seperator_margin"
+ android:background="?attr/colorAccent"
+ android:clickable="false" />
+ android:gravity="center">
+
+ app:drawableStartCompat="?attr/ic_popup" />
diff --git a/app/src/main/res/layout/playlist_header.xml b/app/src/main/res/layout/playlist_header.xml
index 28132521101..d27c868726f 100644
--- a/app/src/main/res/layout/playlist_header.xml
+++ b/app/src/main/res/layout/playlist_header.xml
@@ -1,6 +1,5 @@
-
+ android:paddingTop="6dp">
+
+ app:civ_border_width="1dp" />
+ tools:text="Typical uploader name" />
+ tools:text="234 videos" />
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/related_streams_header.xml b/app/src/main/res/layout/related_streams_header.xml
index 99aa439272e..c23adc33952 100644
--- a/app/src/main/res/layout/related_streams_header.xml
+++ b/app/src/main/res/layout/related_streams_header.xml
@@ -10,8 +10,8 @@
android:id="@+id/next_stream_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="12dp"
android:layout_alignBaseline="@+id/autoplay_switch"
+ android:layout_marginLeft="12dp"
android:text="@string/exo_controls_next_description"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="12sp"
@@ -21,12 +21,12 @@
android:id="@+id/autoplay_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
+ android:layout_alignParentEnd="true"
android:paddingRight="5dp"
android:switchPadding="5dp"
- android:textSize="12sp"
+ android:text="@string/auto_queue_toggle"
android:textColor="@android:color/tab_indicator_text"
- android:text="@string/auto_queue_toggle" />
+ android:textSize="12sp" />
diff --git a/app/src/main/res/layout/select_channel_fragment.xml b/app/src/main/res/layout/select_channel_fragment.xml
index 6da60c0af1d..a340b517f78 100644
--- a/app/src/main/res/layout/select_channel_fragment.xml
+++ b/app/src/main/res/layout/select_channel_fragment.xml
@@ -1,44 +1,43 @@
+ android:layout_marginRight="5dp"
+ android:layout_marginBottom="10dp"
+ android:text="@string/select_a_channel"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
-
+ tools:listitem="@layout/select_channel_item">
+ android:textAppearance="?android:attr/textAppearanceListItem" />
-
\ No newline at end of file
+ android:layout_margin="5dp" />
+
diff --git a/app/src/main/res/layout/select_channel_item.xml b/app/src/main/res/layout/select_channel_item.xml
index 5d00c1b018e..44a2e74a701 100644
--- a/app/src/main/res/layout/select_channel_item.xml
+++ b/app/src/main/res/layout/select_channel_item.xml
@@ -1,25 +1,25 @@
+ android:focusable="true"
+ android:orientation="vertical"
+ android:padding="5dp">
+ tools:ignore="RtlHardcoded" />
+ tools:text="Channel Title, Lorem ipsum" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/select_kiosk_fragment.xml b/app/src/main/res/layout/select_kiosk_fragment.xml
index a2c9da9047a..6e2fe3e8561 100644
--- a/app/src/main/res/layout/select_kiosk_fragment.xml
+++ b/app/src/main/res/layout/select_kiosk_fragment.xml
@@ -1,27 +1,26 @@
+ android:text="@string/select_a_kiosk"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
-
-
\ No newline at end of file
+ tools:listitem="@layout/select_kiosk_item">
+
diff --git a/app/src/main/res/layout/select_kiosk_item.xml b/app/src/main/res/layout/select_kiosk_item.xml
index 9d073c7bdd6..69b7f0b52d9 100644
--- a/app/src/main/res/layout/select_kiosk_item.xml
+++ b/app/src/main/res/layout/select_kiosk_item.xml
@@ -1,24 +1,24 @@
+ android:focusable="true"
+ android:orientation="vertical"
+ android:padding="5dp">
+ android:contentDescription="TODO"
+ tools:ignore="RtlHardcoded" />
+ tools:text="Channel Title, Lorem ipsum" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/select_playlist_fragment.xml b/app/src/main/res/layout/select_playlist_fragment.xml
index ca0d49e3258..e6dadf2d34f 100644
--- a/app/src/main/res/layout/select_playlist_fragment.xml
+++ b/app/src/main/res/layout/select_playlist_fragment.xml
@@ -1,9 +1,9 @@
+ android:layout_margin="5dp" />
diff --git a/app/src/main/res/layout/settings_category_header_layout.xml b/app/src/main/res/layout/settings_category_header_layout.xml
index 4873d9677d1..2901cf01dff 100644
--- a/app/src/main/res/layout/settings_category_header_layout.xml
+++ b/app/src/main/res/layout/settings_category_header_layout.xml
@@ -1,6 +1,5 @@
-
@@ -13,13 +12,13 @@
+ android:background="?attr/toolbar_shadow" />
+ android:background="?attr/separator_color" />
-
-
\ No newline at end of file
+
+
diff --git a/app/src/main/res/layout/settings_category_header_title.xml b/app/src/main/res/layout/settings_category_header_title.xml
index cc4f82fc015..679b9048c3e 100644
--- a/app/src/main/res/layout/settings_category_header_title.xml
+++ b/app/src/main/res/layout/settings_category_header_title.xml
@@ -1,15 +1,14 @@
-
\ No newline at end of file
+ tools:text="Header" />
diff --git a/app/src/main/res/layout/settings_layout.xml b/app/src/main/res/layout/settings_layout.xml
index 1e56b5ce8df..d50924c46ad 100644
--- a/app/src/main/res/layout/settings_layout.xml
+++ b/app/src/main/res/layout/settings_layout.xml
@@ -1,6 +1,5 @@
-
+ android:layout_marginTop="?attr/actionBarSize" />
-
+
diff --git a/app/src/main/res/layout/settings_notification.xml b/app/src/main/res/layout/settings_notification.xml
index a566ea2698a..2ade057d133 100644
--- a/app/src/main/res/layout/settings_notification.xml
+++ b/app/src/main/res/layout/settings_notification.xml
@@ -1,78 +1,17 @@
-
-
+ android:paddingTop="16dp">
-
-
-
-
-
-
-
-
-
-
-
+ app:layout_constraintTop_toTopOf="parent" />
+ app:layout_constraintTop_toBottomOf="@+id/textView" />
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/settings_notification_action.xml b/app/src/main/res/layout/settings_notification_action.xml
index 531b20fabe2..6bbb2211610 100644
--- a/app/src/main/res/layout/settings_notification_action.xml
+++ b/app/src/main/res/layout/settings_notification_action.xml
@@ -13,11 +13,11 @@
android:layout_marginStart="12dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
- app:tint="?android:textColorPrimary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="H,1:1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
+ app:tint="?android:textColorPrimary"
tools:ignore="ContentDescription"
tools:src="@drawable/ic_previous_white_24dp" />
@@ -85,4 +85,4 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/single_choice_dialog_view.xml b/app/src/main/res/layout/single_choice_dialog_view.xml
index 83e1031a574..7275fadd06e 100644
--- a/app/src/main/res/layout/single_choice_dialog_view.xml
+++ b/app/src/main/res/layout/single_choice_dialog_view.xml
@@ -3,4 +3,4 @@
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingTop="?attr/listPreferredItemPaddingLeft" />
\ No newline at end of file
+ android:paddingTop="?attr/listPreferredItemPaddingLeft" />
diff --git a/app/src/main/res/layout/statistic_playlist_control.xml b/app/src/main/res/layout/statistic_playlist_control.xml
index 2bddfffa498..ef090807ccd 100644
--- a/app/src/main/res/layout/statistic_playlist_control.xml
+++ b/app/src/main/res/layout/statistic_playlist_control.xml
@@ -1,18 +1,18 @@
+ android:focusable="true">
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:ignore="RtlHardcoded" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/stream_quality_item.xml b/app/src/main/res/layout/stream_quality_item.xml
index 000907bb0f4..c0b7ec5e9f9 100644
--- a/app/src/main/res/layout/stream_quality_item.xml
+++ b/app/src/main/res/layout/stream_quality_item.xml
@@ -1,9 +1,9 @@
+ android:layout_height="48dp">
+ tools:ignore="ContentDescription,RtlHardcoded" />
+ tools:text="MPEG-4" />
+ tools:text="1080p60" />
-
\ No newline at end of file
+ tools:visibility="visible" />
+
diff --git a/app/src/main/res/layout/subscription_import_export_item.xml b/app/src/main/res/layout/subscription_import_export_item.xml
index 75b588f048b..8950bb20d1e 100644
--- a/app/src/main/res/layout/subscription_import_export_item.xml
+++ b/app/src/main/res/layout/subscription_import_export_item.xml
@@ -1,6 +1,5 @@
-
+ tools:src="@drawable/place_holder_youtube" />
-
\ No newline at end of file
+ tools:text="@string/youtube" />
+
diff --git a/app/src/main/res/layout/toolbar_layout.xml b/app/src/main/res/layout/toolbar_layout.xml
index 318d16ff560..65b979312fb 100644
--- a/app/src/main/res/layout/toolbar_layout.xml
+++ b/app/src/main/res/layout/toolbar_layout.xml
@@ -1,6 +1,5 @@
-
+ tools:visibility="visible" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/toolbar_search_layout.xml b/app/src/main/res/layout/toolbar_search_layout.xml
index 74647e2e0e1..6a5bec6acd5 100644
--- a/app/src/main/res/layout/toolbar_search_layout.xml
+++ b/app/src/main/res/layout/toolbar_search_layout.xml
@@ -1,8 +1,7 @@
-
@@ -12,18 +11,18 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
- android:layout_marginBottom="4dp"
- android:layout_marginRight="48dp"
android:layout_marginTop="4dp"
+ android:layout_marginRight="48dp"
+ android:layout_marginBottom="4dp"
android:background="@null"
android:focusable="true"
android:focusableInTouchMode="true"
- android:nextFocusDown="@+id/suggestions_list"
android:hint="@string/search"
android:imeOptions="actionSearch|flagNoFullscreen"
android:inputType="textFilter|textNoSuggestions"
android:maxLines="1"
- tools:ignore="RtlHardcoded"/>
+ android:nextFocusDown="@+id/suggestions_list"
+ tools:ignore="RtlHardcoded" />
+ android:background="?attr/selectableItemBackgroundBorderless" />
+ app:showAsAction="always" />
diff --git a/app/src/main/res/menu/download_menu.xml b/app/src/main/res/menu/download_menu.xml
index ced932bcc01..f28d3d0744e 100644
--- a/app/src/main/res/menu/download_menu.xml
+++ b/app/src/main/res/menu/download_menu.xml
@@ -1,29 +1,33 @@
-
+
-
+ app:showAsAction="always"
+ tools:ignore="AlwaysShowAction" />
-
-
-
diff --git a/app/src/main/res/menu/drawer_items.xml b/app/src/main/res/menu/drawer_items.xml
index 9d5e67bb46a..542e2a55035 100644
--- a/app/src/main/res/menu/drawer_items.xml
+++ b/app/src/main/res/menu/drawer_items.xml
@@ -1,12 +1,6 @@
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
diff --git a/app/src/main/res/menu/error_menu.xml b/app/src/main/res/menu/error_menu.xml
index b024a9f9fa2..d1dd8888c58 100644
--- a/app/src/main/res/menu/error_menu.xml
+++ b/app/src/main/res/menu/error_menu.xml
@@ -2,8 +2,9 @@
-
-
\ No newline at end of file
+ app:showAsAction="ifRoom" />
+
diff --git a/app/src/main/res/menu/main_fragment_menu.xml b/app/src/main/res/menu/main_fragment_menu.xml
index 88aa80f31bc..0cc6ec1b02a 100644
--- a/app/src/main/res/menu/main_fragment_menu.xml
+++ b/app/src/main/res/menu/main_fragment_menu.xml
@@ -1,11 +1,11 @@
+ xmlns:app="http://schemas.android.com/apk/res-auto">
-
\ No newline at end of file
+ app:showAsAction="always" />
+
diff --git a/app/src/main/res/menu/menu_channel.xml b/app/src/main/res/menu/menu_channel.xml
index 692b7ca1a26..7e19d6d423b 100644
--- a/app/src/main/res/menu/menu_channel.xml
+++ b/app/src/main/res/menu/menu_channel.xml
@@ -1,5 +1,4 @@
-
@@ -10,23 +9,23 @@
android:title="@string/rss_button_title"
android:visible="false"
app:showAsAction="ifRoom"
- tools:visible="true"/>
+ tools:visible="true" />
+ app:showAsAction="ifRoom" />
+ app:showAsAction="never" />
+ app:showAsAction="never" />
diff --git a/app/src/main/res/menu/menu_feed_fragment.xml b/app/src/main/res/menu/menu_feed_fragment.xml
index 3519875eb1c..d96b382d04a 100644
--- a/app/src/main/res/menu/menu_feed_fragment.xml
+++ b/app/src/main/res/menu/menu_feed_fragment.xml
@@ -7,4 +7,4 @@
android:icon="?attr/ic_help"
android:title="@string/help"
app:showAsAction="always" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/menu/menu_feed_group_dialog.xml b/app/src/main/res/menu/menu_feed_group_dialog.xml
index af9be1c65b5..237faf41ac3 100644
--- a/app/src/main/res/menu/menu_feed_group_dialog.xml
+++ b/app/src/main/res/menu/menu_feed_group_dialog.xml
@@ -1,7 +1,7 @@
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/menu/menu_history.xml b/app/src/main/res/menu/menu_history.xml
index 9c030b5fed4..a0a3e78af0a 100644
--- a/app/src/main/res/menu/menu_history.xml
+++ b/app/src/main/res/menu/menu_history.xml
@@ -3,8 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
tools:context="org.schabi.newpipe.history.HistoryActivity">
-
+ app:showAsAction="never" />
diff --git a/app/src/main/res/menu/menu_local_playlist.xml b/app/src/main/res/menu/menu_local_playlist.xml
index a955e953904..f6563dc81f8 100644
--- a/app/src/main/res/menu/menu_local_playlist.xml
+++ b/app/src/main/res/menu/menu_local_playlist.xml
@@ -5,5 +5,5 @@
+ app:showAsAction="never" />
diff --git a/app/src/main/res/menu/menu_play_queue.xml b/app/src/main/res/menu/menu_play_queue.xml
index cab2e8df592..8e54d79608f 100644
--- a/app/src/main/res/menu/menu_play_queue.xml
+++ b/app/src/main/res/menu/menu_play_queue.xml
@@ -8,7 +8,7 @@
android:icon="?attr/ic_playlist_add"
android:title="@string/append_playlist"
android:visible="true"
- app:showAsAction="ifRoom"/>
+ app:showAsAction="ifRoom" />
+ app:showAsAction="ifRoom" />
-
+ app:showAsAction="never" />
-
+ app:showAsAction="never" />
-
+ app:showAsAction="never" />
diff --git a/app/src/main/res/menu/menu_play_queue_bg.xml b/app/src/main/res/menu/menu_play_queue_bg.xml
index 92f5ae67b5a..5cb2820ba08 100644
--- a/app/src/main/res/menu/menu_play_queue_bg.xml
+++ b/app/src/main/res/menu/menu_play_queue_bg.xml
@@ -3,13 +3,15 @@
xmlns:tools="http://schemas.android.com/tools"
tools:context="org.schabi.newpipe.history.HistoryActivity">
-
+ app:showAsAction="never" />
-
+
diff --git a/app/src/main/res/menu/menu_playlist.xml b/app/src/main/res/menu/menu_playlist.xml
index 9a60caf545c..9796dce688a 100644
--- a/app/src/main/res/menu/menu_playlist.xml
+++ b/app/src/main/res/menu/menu_playlist.xml
@@ -7,7 +7,7 @@
android:id="@+id/menu_item_share"
android:icon="?attr/ic_share"
android:title="@string/share"
- app:showAsAction="ifRoom"/>
+ app:showAsAction="ifRoom" />
+ tools:visible="true" />
+ app:showAsAction="never" />
-
\ No newline at end of file
+ app:showAsAction="never" />
+
diff --git a/app/src/main/res/menu/menu_recaptcha.xml b/app/src/main/res/menu/menu_recaptcha.xml
index 07ad07b38d7..5fd15490229 100644
--- a/app/src/main/res/menu/menu_recaptcha.xml
+++ b/app/src/main/res/menu/menu_recaptcha.xml
@@ -4,7 +4,7 @@
-
\ No newline at end of file
+ android:title="@string/recaptcha_done_button"
+ app:showAsAction="always" />
+
diff --git a/app/src/main/res/menu/menu_search.xml b/app/src/main/res/menu/menu_search.xml
index e0dcd715362..f9310dc0747 100644
--- a/app/src/main/res/menu/menu_search.xml
+++ b/app/src/main/res/menu/menu_search.xml
@@ -1,6 +1,6 @@
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ android:title="@string/all" />
+ android:title="@string/video" />
+ android:title="@string/channel" />
+ android:title="@string/playlist" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/menu/mission.xml b/app/src/main/res/menu/mission.xml
index ac77da8c823..4273c1ed6ee 100644
--- a/app/src/main/res/menu/mission.xml
+++ b/app/src/main/res/menu/mission.xml
@@ -18,8 +18,8 @@
+ android:checkable="true"
+ android:title="@string/enqueue" />
-
-
-
\ No newline at end of file
+ android:title="@string/read_full_license">
+
diff --git a/app/src/main/res/menu/video_detail_menu.xml b/app/src/main/res/menu/video_detail_menu.xml
index 609b5a08c44..574fbc7378c 100644
--- a/app/src/main/res/menu/video_detail_menu.xml
+++ b/app/src/main/res/menu/video_detail_menu.xml
@@ -1,28 +1,28 @@
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ app:showAsAction="ifRoom" />
+ app:showAsAction="ifRoom" />
+ app:showAsAction="never" />
+ app:showAsAction="never" />
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index 80b730f3673..be438580f7f 100644
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,5 +1,5 @@
-
-
+
+
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index f916bb64303..06be5728226 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
index a95153a1fc5..eaef380e72d 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index e176556b26d..f9105e69be2 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
index bccfaff0e97..634c793afff 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 8d1aeefb9ca..7d138d3ea39 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
index 65ced7a8bdd..c62ccd5bffb 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/newpipe_tv_banner.png b/app/src/main/res/mipmap-xhdpi/newpipe_tv_banner.png
index 4be6644504b..177f370d986 100644
Binary files a/app/src/main/res/mipmap-xhdpi/newpipe_tv_banner.png and b/app/src/main/res/mipmap-xhdpi/newpipe_tv_banner.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 3a40049dac9..8f0c0642067 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
index b7b42cbff7f..5c3b3f9032a 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index b1765abce98..15d11932119 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
index 4ce44894630..cedbf061aa9 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index bc51d6871e0..87622e580e5 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -3,7 +3,7 @@
يتم التشغيل في الخلفية
إلغاء
اختر المتصفح
- مظلم
+ داكن
صيغة الصوت الإفتراضية
الدقة الافتراضية
عدم الإعجاب
@@ -15,7 +15,7 @@
تنزيل
اختر مجلد التنزيل للملفات الصوتية
يتم تخزين الملفات الصوتية التي تم تنزيلها هنا
- مسار مجلد الصوتيات المحفوظة
+ مجلد الصوتيات المحفوظة
اختر مجلد التنزيل لملفات الفيديو
يتم تخزين ملفات الفيديو التي تم تنزيلها هنا
مجلد تحميل الفيديو
@@ -23,7 +23,7 @@
إنشاء دليل التحميل \'%1$s\'
تثبيت
تطبيق Kore غير موجود. هل تريد تنصيبه؟
- مضيء
+ فاتح
صور معاينة الفيديو
خطأ في الشبكة
لم يتم العثور على مشغل بث. تثبيت VLC؟
@@ -31,7 +31,7 @@
الصوت
تشغيل بواسطة كودي
التدوير
- بحث
+ البحث
اللغة الإفتراضية للمحتوى
الإعدادات
المظهر
@@ -44,18 +44,19 @@
عرض خيار التشغيل بواسطة كودي
السمة
تم النشر بتاريخ %1$s
- رابط URL غير معتمد
+ رابط غير مدعوم
استخدام مشغل صوت خارجي
استخدام مشغل فيديو خارجي
(إختبارية) إجراء التنزيلات من خلال استخدام بروكسي Tor لزيادة الخصوصية ( تشغيل الفيديو المباشر غير مدعوم حتى الأن ).
استخدام تور
- %1$s مشاهدات
+ %1$s مشاهدة
محتوى غير متوفر
تعذرت عملية تحميل كافة صور المعاينة
خطأ
تعذرت عملية تحليل الموقع
- تعذر فك تشفير توقيع رابط الفيديو
- انقر على \"بحث\" للبدء
+ تعذر فك تشفير توقيع رابط الفيديو
+ اضغط على \"بحث\" للبدء
+\n
اشتراك
مشترك
الرئيسية
@@ -63,8 +64,8 @@
ما الجديد
في الخلفية
تشغيل تلقائي
- اسود
- مراقبة السجل
+ أسود
+ تاريخ المشاهدة
التاريخ و ذاكرة التخزين المؤقت
محتوى
التحميلات
@@ -99,17 +100,16 @@
تخزين طلبات البحث محليا
تتبع مقاطع الفيديو التي تمت مشاهدتها
استئناف التشغيل
- مواصلة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية)
+ متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية)
إظهار التلميحات \"اضغط للتجاهل\"
- إظهار تلميح عندما الضغط على الخلفية أو الزر المنبثق في الفيديو \"تفاصيل:\"
+ عرض تلميح عند الضغط على الخلفية أو الزر المنبثق في الفيديو \"التفاصيل:\"
المشغل
السلوك
الوضع المنبثق
تشغيل في وضع منبثق
تم وضعه على قائمة الانتظار في مشغل الخلفية
تم وضعه على قائمة الانتظار في مشغل النافذة المنبثقة
- محتوى مقيد بحسب العمر
- إظهار الفيديو المقيد بحسب العمر. التغييرات المستقبلية ممكنة من \"الإعدادات\".
+ إظهار محتوى مقيد حسب العمر
بث مباشر
تقرير خطأ
قائمة التشغيل
@@ -156,12 +156,12 @@
بليون
ليس هناك مشترِكون
- - %s لا مشتركين
- - %s مشترِك
- - مشتركين
+ - %s مشترك
+ - %s مشترك
+ - %s مشتركين
- %s مشتركين
- %s مشتركين
- - %s الاشتراكات
+ - %s مشتركين
دون مشاهدات
لاتوجد فيديوهات
@@ -233,12 +233,12 @@
تحدي الكابتشا
ضغط مطول للإدراج الى قائمة الانتظار
- - %s بدون مشاهد
- - %s مشاهدة
- - %s مشاهدات
- - %s مشاهدات
- - %s مشاهدات
- - %s مشاهدات
+ - %s مشاهدة
+ - %s مشاهد
+ - %s مشاهدة
+ - %s مشاهدة
+ - %s مشاهدة
+ - %s مشاهدة
- %s فيديو
@@ -253,8 +253,6 @@
صفحة الكشك
حدد كشك
الكشك
- إدراج في قائمة الانتظار في الخلفية
- إدراج في قائمة الانتظار على المنبثقة
ابدأ التشغيل في الخلفية
المحتوى الإفتراضي حسب البلد
تغيير الإتجاه
@@ -267,7 +265,7 @@
دائماً
مرة واحدة فقط
العنوان خاطئ
- لم يتم العثور على مشغل دفق (يمكنك تثبيت VLC لتشغيله).
+ لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله).
استيراد قاعدة البيانات
تصدير قاعدة البيانات
يتجاوز السجل والاشتراكات الحالية
@@ -305,7 +303,7 @@
تنزيل ملف البث
الإشارات المرجعية
استعمال التقديم السريع الغير دقيق
- الطلب غير الدقيق يسمح للمشغل بالبحث عن مواقع أسرع ودقة أقل. البحث عن 5 ,15 أو 25 ثانية لا يعمل مع هذا.
+ يسمح البحث غير الدقيق للمشغل بالبحث عن مواضع بشكل أسرع وبدقة منخفضة. البحث عن 5 ,15 أو 25 ثانية لا يعمل مع هذا.
تحميل الصور المصغرة
تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور
الملف
@@ -324,12 +322,12 @@
عملية التصدير جارية …
إستيراد ملف
معرفك, soundcloud.com/هويتك
- عند إيقاف تحميل أي صور مصغرة ، وتوفير البيانات واستخدام الذاكرة. تعمل التغييرات على محو ذاكرة التخزين المؤقت للصورة الموجودة على الذاكرة أو على القرص.
+ عند إيقاف تحميل أي صور مصغرة، وتوفير البيانات واستخدام الذاكرة. تعمل التغييرات على محو ذاكرة التخزين المؤقت للصورة الموجودة على الذاكرة أو على القرص.
امسح البيانات الوصفية المخزنة مؤقتًا
إزالة جميع بيانات صفحات الويب المخزنة مؤقتًا
تم محو ذاكرة التخزين المؤقت للبيانات الوصفية
وضع البث القادم تلقائيا في قائمة الإنتظار
- متابعة إنهاء قائمة انتظار التشغيل (غير المتكررة) من خلال إلحاق تدفق ذي صلة
+ استمر في إنهاء قائمة انتظار التشغيل (غير-المتكررة) من خلال إلحاق تدفق ذي صلة
إضافة صورة مصغرة إلى قائمة التشغيل
تفضيل قائمة التشغيل
تم تغيير الصورة المصغرة لقائمة التشغيل.
@@ -366,11 +364,14 @@
نسخة احتياطية
تعذر استيراد الاشتراكات
لا يمكن تصدير الاشتراكات
- استيراد اشتراكات YouTube عن طريق تنزيل ملف التصدير:
-\n
-\n1. انتقل إلى عنوان URL هذا: %1$s
-\n2. تسجيل الدخول عندما يطلب منك
-\n3. يجب أن يبدأ التنزيل (وهذا ملف التصدير)
+ استيراد اشتراكات YouTube من Google Takeout
+\n
+\n1. انتقل إلى عنوان URL هذا : %1$s
+\n2. تسجيل الدخول عندما يُطلب منك ذلك
+\n3. انقر على \"جميع البيانات المدرجة\" ، ثم على \"إلغاء تحديد الكل\" ، ثم حدد \"الاشتراكات\" فقط وانقر على \"موافق\"
+\n4. انقر على \"الخطوة التالية\" ثم على \"إنشاء تصدير\"
+\n5. انقر فوق الزر \"تنزيل\" بعد ظهوره و
+\n6. من الملف المضغوط الذي تم تنزيله ، استخرج ملف .json (عادةً ضمن \"YouTube و YouTube)Music/subscriptions/subscriptions.json\") واستورده
قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك:
\n
\n1. تمكين \"وضع سطح المكتب\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة)
@@ -412,7 +413,7 @@
اختر علامة التبويب
استخدم إيماءات التحكم في صوت المشغل
التحكم بالإيماءات السطوع
- استخدم الإيماءات للتحكم في سطوع المشغل
+ استخدام الإيماءات للتحكم في سطوع المشغل
التحديثات
تم حذف الملف
تتبيه تحديث التطبيق
@@ -506,11 +507,11 @@
تغيير مجلدات التنزيل إلى حيز التنفيذ
تبديل الخدمة ، المحدد حاليًا:
الكشك الافتراضي
- لاتوجد مشاهدة
+ لا توجد مشاهدة
لا أحد يستمع
ستتغير اللغة بمجرد إعادة تشغيل التطبيق.
- - %s مشاهد
+ - %s مشاهدة
- %s مشاهدة
- %s مشاهدة
- %s مشاهدات
@@ -518,8 +519,8 @@
- %s مشاهدات
- - %s مستمع
- - %s مستمع
+ - %s الاستماع
+ - %s الاستماع
- %s مستمعين
- %s مستمعين
- %s مستمعين
@@ -529,7 +530,7 @@
مثيلات خوادم پيرتيوب
حدد مثيلات PeerTube المفضلة لديك
إضافة نموذج
- أدخل عنوان URL للمثيل
+ أدخل عنوان للمثيل
لا يمكن التحقق من صحة المثال
يتم دعم عناوين URL HTTPS فقط
مثيل الخادم موجود بالفعل
@@ -633,7 +634,7 @@
الأغاني
هذا الفيديو مقيد بالفئة العمرية.
\n
-\nقم بتشغيل \"المحتوى المقيد بالفئة العمرية\" في الإعدادات إذا كنت تريد مشاهدته.
+\nقم بتشغيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته.
نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا
ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل.
\nهل أنت واثق؟ هذا لا يمكن التراجع عنها!
@@ -641,7 +642,7 @@
إزالة ماتمت مشاهدته
ستكون النصوص الأصلية من الخدمات مرئية في عناصر البث
عرض الوقت الأصلي على العناصر
- وضع مقيد يوتيوب
+ شغيل \"وضع تقييد المحتوى\" في يوتيوب
لـ %s
أنشأها %s
الصورة الرمزية للقناة
@@ -652,19 +653,19 @@
يرجى التحقق مما إذا كانت هناك مشكلة في مناقشة تعطلك بالفعل. عند إنشاء تذاكر مكررة ، ستأخذ وقتًا منا يمكن أن نقضيه في إصلاح الخطأ الفعلي.
تقرير على جيثب
نسخ تقرير منسق
- عرض النتائج ل : %s
+ إظهار النتائج ل %s
أبدا
- فقط على واي فاي
+ فقط على شبكة Wi-Fi
بدء التشغيل تلقائياً — %s
تشغيل قائمة الانتظار
الاشعار
- تعذر التعرف على URL. فتح باستخدام تطبيق آخر؟
+ تعذر التعرف على الرابط. فتح باستخدام تطبيق آخر؟
قائمة انتظار تلقائية
سيتم استبدال قائمة انتظار للمشغل النشط
قد يؤدي التبديل من مشغل إلى آخر إلى استبدال قائمة الانتظار الخاصة بك
طلب تأكيد قبل مسح قائمة الانتظار
- لا شيئ
- التخزين المؤقت
+ لا شيء
+ جارٍ التحميل
خلط
كرر
يمكنك تحديد ثلاثة إجراءات كحد أقصى لإظهارها في الإشعار المضغوط!
@@ -676,4 +677,14 @@
زر الإجراء الأول
قياس الصورة المصغرة للفيديو المعروض في الإشعار من 16: 9 إلى 1: 1 نسبة العرض إلى الارتفاع (قد يؤدي إلى تشوهات)
مقياس الصورة المصغرة إلى نسبة عرض إلى ارتفاع 1: 1
+ امسح ملفات تعريف الارتباط التي يخزنها NewPipe عند حل reCAPTCHA
+ تم مسح ملفات تعريف الارتباط reCAPTCHA
+ امسح ملفات تعريف الارتباط reCAPTCHA
+ يوفر YouTube \"وضع تقييد المحتوى\" الذي يخفي المحتوى المحتمل للكبار.
+ عرض المحتوى الذي يُحتمل أن يكون غير مناسب للأطفال لأن له حدًا عمريًا (مثل 18+).
+ إظهار تسرب الذاكرة
+ قائمة الانتظار
+ قائمة الانتظار
+ اجعل أندرويد يخصص لون الإشعار وفقا للون الرئيسي في الصورة المصغرة (لاحظ أن هذا غير متوفر على جميع الأجهزة
+ تلوين الاشعارات
\ No newline at end of file
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index caca4086265..6deac3beed7 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -1,23 +1,24 @@
- Başlamaq üçün axtarışa bas
+ Başlamaq üçün \"Axtarış\" bölməsinə toxunun
+\n
%1$s baxış
Dərc edilib %1$s
- Axın oynadıcısı tapılmadı. VLC ni yükləmək istərdinizmi?
- Axın oynadıcısı tapılmadı (baxmaq üçün VLC ni yükləyə bilərsən)
+ Axın pleyeri tapılmadı. \"VLC\" yüklənilsin\?
+ Axın pleyeri tapılmadı (baxmaq üçün \"VLC\"ni yükləyə bilərsiniz).
Quraşdır
İmtina
Brauzerdə aç
Paylaş
Endir
- Axın faylını endir.
+ Axın faylını endirin
Axtarış
Ayarlar
- Bunu mu demək istədin: %1$s ?
+ Bunu demək istədiniz: \"%1$s\"\?
Paylaş
Brauzeri seç
Kənar video oynadıcı istifadə et
- Bu seçim aktivləşdirildiyi zaman bəzi ölçülərdə səs OLMAYACAQ
+ Bəzi görüntü keyfiyyətlərində səsi aradan qaldırır
Kənar audio oynadıcı istifadə et
Abunə ol
Abunə olunub
@@ -25,21 +26,21 @@
Məlumat göstər
Əsas
Abunəliklər
- Əlfəcinlər
+ Əlfəcinlənmiş Oynatma Siyahıları
Yeni nə var
Arxa fon
- Video yükləmə ünvanı
- Yüklənən videoları saxlamaq üçün yer
- Videolar üçün yükləmə yerini daxil et
- Audio yükləmə yeri
- Yüklənən audioları saxlamaq üçün yer
- Audiolar üçün yükləmə yerini daxil et
- NewPipe başqa bir uyğulamadan çağrıldığı zaman avtomatik olaraq videonu oynadır
+ Video yükləmə qovluğu
+ Yüklənmiş videolar burada saxlanılır
+ Video faylları üçün yükləmə qovluğunu seçin
+ Audio yükləmə qovluğu
+ Yüklənmiş audio faylları burada saxlanılır
+ Audio faylları üçün yükləmə qovluğunu seçin
+ \"NewPipe\" başqa bir proqramdan çağrıldığı zaman avtomatik olaraq videonu oynadır
Defolt ölçü
Daha böyük ölçüləri göstər
- Kodi ilə oynat
- Kore app tapılmadı. Yükləyək?
- \"Kodi ilə oynat\" seçimini göstər
+ \"Kodi\" ilə oxut
+ Çatışmayan \"Kore\" tətbiqi yüklənilsin\?
+ \"Kodi ilə oxut\" seçimini göstər
Videonu Kodi media center ilə oynatmaq üçün seçim göstər
Audio
Defolt audio formatı
@@ -52,4 +53,87 @@
Açılan pəncərə
Fırlanma
Açılan pəncərə modunda aç
+ Avto-oxutma
+ Yüklə
+ Kəsintilərdən sonra (məs. telefon zəngi) oxutmağa davam et
+ Oxutmağa davam et
+ İzlənmiş videoları qeyd et
+ Verilənləri təmizlə
+ Oxutma siyahılarındakı oxutma mövqeyi göstəricisini nümayiş et
+ Siyahılardakı mövqelər
+ Video oxutmanı axırıncı qaldığı yerdən bərpa et
+ Oxutmanı davam etdir
+ İzləmə tarixçəsi
+ Axtarış sorğularını lokal olaraq saxlayın
+ Axtarış tarixçəsi
+ Axtarış edərkən təklifləri göstər
+ Axtarış təklifləri
+ Pleyerin parlaqlığını və səsini idarə etmək üçün jestlərdən istifadə edin
+ Jestli pleyer idarəetmələri
+ Pleyerin parlaqlığını idarə etmək üçün jestlərdən istifadə edin
+ Parlaqlığın jestlə idarə edilməsi
+ Pleyerin səsini idarə etmək üçün jestlərdən istifadə edin
+ Səsin jestlə idarə edilməsi
+ Avto-növbələmə
+ Növbəti axını avtomatik olaraq növbəyə əlavə et
+ Metadata keşi silindi
+ Keşlənmiş bütün veb-səhifə verilənlərini sil
+ Keşlənmiş metadatanı təmizlə
+ Şəkil keşi silindi
+ Şərhləri gizlətmək üçün söndürün
+ Şərhləri göstər
+ Aktiv pleyerin növbəsi dəyişdiriləcək
+ Bir pleyerdən digərinə keçmək növbənizi dəyişdirə bilər
+ Növbəni təmizləmədən öncə təsdiq üçün soruş
+ Qeyri-dəqiq axtarış (videonu irəli/geri çəkmə) istifadə edin
+ Qeyri-dəqiq axtarış pleyerə azaldılmış həssaslıqla mövqeləri daha sürətlə axtarmağa imkan verir. 5, 15 və ya 25 saniyəlik axtarış bununla işləmir.
+ Cəld irəli/geri çəkmə müddəti
+ Heç nə
+ Buferizasiya olunur
+ Qarışdır
+ Təkrarla
+ Beşinci hərəkət düyməsi
+ Dördüncü hərəkət düyməsi
+ Üçüncü hərəkət düyməsi
+ İkinci hərəkət düyməsi
+ Birinci hərəkət düyməsi
+ Yalnız bəzi cihazlar 2K/4K videoları oxuda bilir
+ Ani pəncərədə standart görüntü keyfiyyəti
+ Avto-oxutma
+ Effektiv olması üçün yükləmə qovluqlarını dəyişdirin
+ Əlavə et
+ Ani pəncərə (popup)
+ Tab-vərəqəni Seçin
+ Yeni Tab-vərəqə
+ Abunəlik yenilənmədi
+ Abunəlik dəyişdirilmədi
+ Nəticələr göstərilir: %s
+ Kanallar
+ Kanal
+ %s tərəfindən
+ \"Youtube\"un \"Məhdudiyyətli Rejimi\"ni aktivləşdir
+ Yaş limiti olduğuna görə (məs. 18+) böyük ehtimal uşaqlar üçün uyğun olmayan məzmunu göstər.
+ Yaş məhdudiyyətli məzmunu göstər
+ Məzmun
+ Ani pəncərə növbəyə salındı
+ Fon pleyeri növbəyə salındı
+ Ani pəncərədə oxudulur
+ Fonda oxudulur
+ Bildiriş
+ Yeniləmələr
+ Sazlama
+ Digər
+ Görünüş
+ Ani pəncərə
+ Tarix və keş
+ Video və səs
+ Davranış
+ Pleyer
+ İlkin məzmun dili
+ Xidmət
+ Məzmun üçün ilkin ölkə
+ URL tanınmadı. Başqa bir tətbiq ilə açılsın\?
+ Dəstəklənməyən URL
+ \"Əlavə etmək üçün basılı tutun\" məsləhətini göstər
+ \"Növbəti\" və \"Bənzər\" videoları göstər
\ No newline at end of file
diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml
index 44a1264bcff..99ced66c3a3 100644
--- a/app/src/main/res/values-b+ast/strings.xml
+++ b/app/src/main/res/values-b+ast/strings.xml
@@ -26,7 +26,7 @@
En direuto
Fallu
Nun pudieron cargase toles miniatures
- Nun pudo descifrase la robla de la URL del videu
+ Nun pudo descifrase la robla de la URL del videu
Nun pudo analizase\'l sitiu web
Entá nun se sofiten los fluxos en direuto
Nun pudo consiguise dengún fluxu
diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml
new file mode 100644
index 00000000000..497994e8a50
--- /dev/null
+++ b/app/src/main/res/values-b+uz+Latn/strings.xml
@@ -0,0 +1,402 @@
+
+
+ Tashqi video pleerdan foydalanish
+ aylantirish
+ Brauzer tanlang
+ Bilan baham ko\'rish
+ %s uchun natijalar ko\'rsatilmoqda
+ \"%1$s\" demoqchimisiz\?
+ Sozlashlar
+ Qidirish
+ stream file yuklab olish
+ Yuklab olish
+ Baham ko\'rish
+ O\'rnatish
+ Brauzerda ochish
+ Qalqib chiqadigan rejimda ochish
+ Bekor qilish
+ Stream pleer topilmadi (uni ijro etish uchun VLC o\'rnatishingiz mumkin).
+ Hech qanday translatsiya pleyeri topilmadi. VLC o\'rnatilsinmi\?
+ %1$s tomonidan e‘lon qilingan
+ %1$s marta ko‘rilgan
+ Boshlash uchun \"Izlash\" tugmasini bosing
+\n
+ Player yorqinligini va ovoz balandligini boshqarish uchun imo-ishoralardan foydalanish
+ Player imo-ishoralarini boshqarish
+ Player tovushini boshqarish uchun imo-ishoralardan foydalanish
+ Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning
+ Yorqinlik ishoralarini boshqarish
+ Ovoz balandligini ishoralarni boshqarish
+ Avto-navbat
+ Tegishli stream qo\'shib, ijro etish navbatini tugatishni (takrorlanmaydigan) davom ettirish
+ avtomatik navbat next stream
+ Metadata keshi o\'chirildi
+ Barcha keshlangan veb-sahifa ma\'lumotlarini olib tashlash
+ Keshlangan metadatalarni o\'chirish
+ Rasm keshi o\'chirildi
+ Eskizlarni yuklash, ma\'lumotlarni tejash va xotiradan foydalanishni oldini olish uchun o\'chirib qo\'ying. O\'zgarishlar xotiradagi va diskdagi rasm keshini tozalaydi.
+ sharhlarni yashirishni o\'chirish
+ Izohlarni ko\'rsatish
+ Eskizlarni yuklang
+ Aktiv ijro etish navbati almashtiriladi
+ Bir ijro etishdan boshqasiga o\'tish sizning navbatingizni almashtirishi mumkin
+ Navbatni tozalashdan oldin tasdiqlashni so\'rash
+ Oldinga tez / oldinga siljish davomiyligini qidirish
+ Noto\'g\'ri izlash ijro etuvchiga aniqlikni pasayishi bilan tezroq pozitsiyalarni qidirishga imkon beradi. 5, 15 yoki 25 soniyani qidirish bu bilan ishlamaydi.
+ Tez aniq bo\'lmagan izlashdan foydalanish
+ Qora
+ qorong\'i
+ Yorug\'
+ Tema
+ Standart video format
+ Standart audio format
+ Audio
+ Hech narsa
+ Buferlash
+ Aralash
+ Takrorlash
+ Bildirishnomada ko\'rsatish uchun eng ko\'p uchta amalni tanlashingiz mumkin!
+ Quyidagi har bir bildirishnomani ustiga bosib uni tahrir qiling. O\'ng tomondagi katakchalar yordamida ixcham bildirishnomada ko\'rsatilishi uchun ulardan uchtasini tanlang.
+ Beshinchi harakat tugmasi
+ To\'rtinchi harakat tugmasi
+ Uchinchi harakat tugmasi
+ Ikkinchi harakat tugmasi
+ Birinchi harakat tugmasi
+ Bildirishnomada ko\'rsatilgan video eskizini 16: 9dan 1: 1 gacha tomonlarning nisbatiga qarab o\'lchamang (buzilishlarni keltirib chiqarishi mumkin)
+ Eskizini 1: 1 tomonlar nisbatiga o‘lchash
+ Kodi media-markazi orqali videoni ijro etish variantini ko\'rsatish
+ \"Kodi bilan ijro etish\" parametrini ko\'rsatish
+ missing Kore dasturini o\'rnatasizmi\?
+ Kodi bilan ijro etish
+ Faqat ba\'zi qurilmalar 2K / 4K videolarni ijro etishi mumkin
+ Yuqori o\'lchamlarni ko\'rsatish
+ "Standart pop-up o\'lchamlari"
+ Standart o\'lchamlari
+ NewPipe boshqa dasturdan chaqirilganda videoni ijro etadi
+ Avtomatikplay
+ Yuklash papkalarini kuchga kirishi uchun o\'zgartirish
+ Audio fayllar uchun yuklab olish papkasini tanlash
+ Yuklab olingan videofayllar shu yerda saqlanadi
+ Yuklab olingan audio fayllar shu yerda saqlanadi
+ Ovozni yuklab olish papkasi
+ Video fayllar uchun yuklab olish papkasini tanlash
+ Videoni yuklab olish jildi
+ Qo\'shish
+ Qalqib ko\'rinish
+ Fon ko\'rinishi
+ Yorliqlangan pleylistlar
+ Yorliqni tanlash
+ Yangi yorliq
+ Obunalar
+ Asosiy
+ Ma\'lumotni ko\'rsatish
+ Obunani yangilab bo\'lmadi
+ Obunani o\'zgartirib bo\'lmadi
+ Kanal obunasi bekor qilindi
+ Obunani bekor qilish
+ Obuna bo\'lindi
+ Obuna bo\'lish
+ Qalqib ko\'rinadigan rejim
+ Tashqi audio pleerdan foydalanish
+ Ba\'zi piksellarda ovozni o\'chirish
+ Tomosha tarixini tozalash
+ ReCAPTCHA-ni hal qilganingizda NewPipe-da saqlanadigan cookie-fayllarni o\'chirib tashlang
+ Eksport tarixi, obunalari va pleylistlari
+ Joriy tarixingiz va obunalaringizni bekor qiladi
+ reCAPTCHA cookies fayllari o\'chirildi
+ ReCAPTCHA cookie-fayllarini o\'chirish
+ Ma\'lumotlar bazasini eksport qilish
+ Ma\'lumotlar bazasini import qilish
+ Asosiyga o\'tish
+ Pop-upga o\'tish
+ Orqa fonga o\'tish
+ Yo\'nalishni almashtirish / yoqish
+ [Noma\'lum]
+ NewPipe yangi versiyasi haqida bildirishnomalar
+ Ilovani yangilash bildirishnomasi
+ NewPipe fon va popup pleyerlari uchun bildirishnomalar
+ NewPipe bildirishnomasi
+ Fayl
+ Faqat bittasi
+ Har doim
+ Barchasini ijro etish
+ Fayl o\'chirildi
+ Bekor qilish
+ Eng yaxshi qaror
+ Hajmi o\'zgartirilmoqda
+ Tozalash
+ Yangilash
+ Filter
+ Ijrochilar o\'chirib qo\'yilgan
+ Keyin
+ Ha
+ Artistlar
+ Albomlar
+ Qo\'shiqlar
+ Natijalar
+ Foydalanuvchilar
+ Treklar
+ Videolar
+ Playlistlar
+ Playlist
+ Kanallar
+ Kanal
+ Hammasi
+ Xato haqida xabar berish
+ Yuklanganlar
+ Yuklanganlar
+ Jonli
+ Ushbu video yoshga cheklangan.
+\n
+\nAgar xohlasangiz, sozlamalarda \"%1$s\" ni yoqing.
+ YouTube \"cheklangan rejim\" ni taqdim etadi, u katta yoshlilar uchun tarkibni yashiradi.
+ YouTube-ning \"Cheklangan rejimi\" ni yoqish
+ Tarkibni bolalar uchun yaroqsiz deb ko\'rsating, chunki uning yosh chegarasi bor (18+ kabi).
+ Yoshi cheklangan tarkibni ko\'rsatish
+ Tarkib
+ Pop-up pleyerida navbat ketma-ketlikda
+ Orqa fon pleyerida navbat ketma-ketlikda
+ Pop-up rejimda ijro etish
+ Ijro etish foni
+ Bildirishnoma
+ Yangilanishlar
+ Nosozliklarni tuzatish
+ Boshqalar
+ Tashqi ko\'rinish
+ Pop-up
+ Tarix va kesh
+ Video va audio
+ Xatti-harakat
+ Ijro etish
+ Namuna allaqachon mavjud
+ Faqat HTTPS URL-lari qo\'llab-quvvatlanadi
+ Namunani tasdiqlab bo\'lmadi
+ Namuna URL manzilini kiriting
+ Namuna qo\'shish
+ %s da sizga yoqadigan misollarni toping
+ Sevimli PeerTube nusxalarini tanlang
+ PeerTube misollari
+ Standart kontent tili
+ Xizmatlar
+ Standart kontent mamlakati
+ URL manzili aniqlanmadi. Boshqa ilova bilan ochilsinmi\?
+ Qo\'llab-quvvatlanmaydigan URL manzili
+ \"Tafsilotlar:\" videodagi fon yoki po-pup tugmachasini bosganda ko\'rsatma.
+ \"Qo\'shish uchun ushlab turish\" maslahatini ko\'rsatish
+ \'Keyingi\' va \'O\'xshash\' videolarni namoyish etish
+ Avtoplay
+ Uzilishlardan keyin ijro etishni davom ettirish (masalan. phonecalls)
+ Yuklab olish
+ Ijro etishni davom ettirish
+ Ko\'rilgan videolarni kuzatib borish
+ Ma\'lumotlarni tozalash
+ Ro\'yxatlarda ijro holati ko\'rsatkichlarini ko\'rsatish
+ Ro\'yxatlardagi pozitsiyalar
+ Oxirgi ijro holatini tiklash
+ Ijro etishni davom ettirish
+ Qidirayotganda takliflarni ko\'rsatish
+ Tarixni ko\'rish
+ Qidiruv so\'rovlarini mahalliy sifatida saqlash
+ Qidiruv tarixi
+ Takliflarni qidirish
+ Ogohlantirish: Barcha fayllarni import qilib bo\'lmadi.
+ Haqiqiy ZIP fayli yo‘q
+ Import qilindi
+ Eksport qilindi
+ kiosk tanlash
+ Hali pleylist xatcho\'plari yo\'q
+ Pleylistni tanlang
+ Hech qanday kanal obunasi yo\'q
+ Kanal tanlash
+ Kanal sahifasi
+ Feed sahifasi
+ Obuna sahifasi
+ Standart kiosk
+ Kiosk sahifasi
+ Bo\'sh sahifa
+ Tanlash
+ Asosiy sahifada qanday yorliqlar ko\'rsatilgan
+ Asosiy sahifaning tarkibi
+ Eng ko\'p ijrolar etilganlar
+ Oxirgi ijro
+ Haqiqatan ham barcha narsalarni tarixdan o\'chirishni xohlaysizmi\?
+ Ushbu narsani tomosha tarixidan o\'chirishni xohlaysizmi\?
+ Ushbu narsani qidiruv tarixidan o\'chirmoqchimisiz\?
+ Element o\'chirildi
+ Tarix tozlandi
+ Tarix bo\'sh
+ Tarix
+ Tarix o\'chirilgan
+ Qidirilgan
+ Ko\'rilgan
+ Tarix
+ Litsenziyani o\'qish
+ NewPipe - bu nusxa ko\'chirish dasturiy ta\'minotidir: Siz foydalanishingiz, baham ko\'rishingiz va o\'zingizning xohishingiz bilan yaxshilashingiz mumkin. Xususan, siz uni bepul dasturiy ta\'minot fondi tomonidan e\'lon qilingan GNU umumiy jamoat litsenziyasi shartlari asosida qayta tarqatishingiz va / yoki o\'zgartirishingiz mumkin, Litsenziyaning 3-versiyasi yoki (sizning xohishingizga ko\'ra) har qanday keyingi versiyada.
+ NewPipe litsenziyasi
+ Maxfiylik siyosatini o\'qish
+ NewPipe loyihasi sizning shaxsiy hayotingizga jiddiy e\'tibor beradi. Shuning uchun ilova sizning roziligingizsiz biron bir ma\'lumot to\'plamaydi.
+\nNewPipe-ning maxfiylik siyosati halokat to\'g\'risidagi hisobotni yuborganingizda qanday ma\'lumotlar yuborilishi va saqlanishi haqida batafsil ma\'lumot beradi.
+ NewPipe-ning maxfiylik siyosati
+ Qo\'shimcha ma\'lumot va yangiliklar uchun NewPipe veb-saytiga tashrif buyuring.
+ Websayt
+ Qaytarib berish
+ Hadya etish
+ NewPipe ko\'ngillilar tomonidan bo\'sh vaqtlarini sarflash orqali sizga eng yaxshi foydalanuvchi tajribasini taqdim etadi. Ishlab chiquvchilarga bir chashka qahvadan zavqlanib, NewPipe-ni yanada yaxshiroq qilishlariga yordam berish.
+ GitHubda ko\'rish
+ Sizda g\'oyalar bormi; tarjima, dizayndagi o\'zgarishlar, kodni tozalash yoki haqiqiy og\'ir kodni o\'zgartirish - yordam har doim mamnuniyat bilan qabul qilinadi. Qancha ko\'p ish qilinsa, shuncha yaxshi bo\'ladi!
+ Hissa qo\'shish
+ Androidda Libre yengil streaming.
+ Litsenziyalar
+ Xissadorlar
+ Haqida
+ Veb-saytni ochish
+ Litsenziyani yuklab bo\'lmadi
+ © %1$s tomonidan %2$s gacha %3$s
+ Uchinchi tomon litsenziyalari
+ Haqida
+ Sozlamalar
+ NewPipe haqida
+ Ushbu faylni ijro etish uchun dastur o\'rnatilmagan
+ Ko\'pchilik maxsus belgilar
+ Yozuvlar va raqamlar
+ O\'zgartirish belgisi
+ Noto\'g\'ri belgilar ushbu qiymat bilan almashtiriladi
+ Fayl nomidagi ruxsat berilgan belgilar
+ Yuklab olish
+ Bajarildi
+ reCAPTCHA muammosi so\'raldi
+ Hal etilganda \"Bajarildi\" tugmasini bosing
+ reCAPTCHA muammosi
+ 1 ta element o\'chirildi.
+ Ushbu ruxsat zarur
+\npopup rejimida oching
+ Yuklab olish papkasini keyinroq sozlamalarda belgilang
+ Buferga nusxa olindi
+ Iltimos kuting…
+ Tafsilotlar uchun bosing
+ NePipe yuklab olinmoqda
+ Noto\'g\'ri shakllangan URL yoki Internet mavjud emas
+ Fayl allaqachon mavjud
+ Qo\'llab-quvvatlanmaydigan server
+ Xato
+ Iplar
+ Faylnomi
+ Ok
+ Yangi missiya
+ Nomni o\'zgartirish
+ Tarqatish
+ Sumnazorat
+ Hammasini o\'chirish
+ Bittasini o\'chirish
+ O\'chirish
+ Yaratish
+ Ijro etish
+ Pauza
+ Boshlash
+ Izohlar yo\'q
+
+ - %s video
+ - %s videolar
+
+ ∞ videolar
+ 100+ videolar
+ Videolar yo\'q
+
+ - %s tinglovchi
+ - %s tinglovchilar
+
+ Hech kim tinglamayapti
+
+ - %s ko\'ryapti
+ - %s ko\'ryaptilar
+
+ Hech kim ko\'rmayapti
+
+ - %s ko\'rish
+ - %s ko\'rishlar
+
+ Ko\'rishlar yo\'q
+ Obunachilar soni mavjud emas
+
+ - %s bunachisi
+ - %s obunachilar
+
+ Obunachilar yo\'q
+ Hozirda tanlangan xizmatni yoqish:
+ B
+ M
+ k
+ Avval omborga kirishga ruxsat berish
+ Qayta
+ Audio
+ Video
+ \'%1$s\' yuklab olish katalogi yaratildi
+ \'%1$s \' yuklab olish katalogini yaratib bo\'lmadi
+ Qayta tartiblash uchun tortish
+ Bu erda kriketlardan boshqa hech narsa yo\'q
+ Natija yo\'q
+ Foydalanuvchi hisoboti
+ Hisobotda xato
+ (Eksperimental) Maxfiylikni oshirish uchun Tor orqali trafikni majburan yuklab oling (videolarni streamlash hali qo\'llab-quvvatlanmaydi).
+ Tor-dan foydalanish
+ Dislayklar
+ Layklar
+ Yuklovchining avatar eskizi
+ Videoni ijro etish muddati, davomiyligi:
+ Videoni oldindan ko\'rish uchun eskiz
+ Detallar:
+ Sizning sharhingiz (ingliz tilida):
+ Nima: \\n So\'rov: \\nTarkib tili: \\nTarkib mamlakati: \\nIlova tili: \\ nXizmat: \\ nGMT vaqti: \\ nPaket: \\ nVersion: \\ nOS versiyasi:
+ Nima sodir bo\'ldi:
+ Info:
+ Hisobot
+ Kechirasiz, biron bir xato yuz berdi.
+ Iltimos, sizning harakatingizni muhokama qiladigan muammo allaqachon mavjudligini tekshiring. Ikki nusxadagi ticketlarni yaratishda siz bizdan vaqt ajratib, biz haqiqiy xatolarni tuzatishga sarflashimiz mumkin edi.
+ GitHub haqida hisobot
+ Formatlangan hisobotni nusxalash
+ Ushbu xato haqida elektron pochta orqali xabar berish
+ Kechirasiz, bunday bo\'lmasligi kerak edi.
+ Boshqa ilovalar orqali ko\'rsatishga ruxsat berish
+ Birlamchi parametrlarni tiklashni xohlaysizmi\?
+ Birlamchi parametrlarni tiklash
+ Saqlangan yorliqlarni o\'qib bo\'lmadi, shuning uchun standartlardan foydalaning
+ Yuklash uchun stream mavjud emas
+ Xato yuz berdi: %1$s
+ Fayl nomi bo\'sh bo\'lishi mumkin emas
+ Fayl mavjud emas yoki uni o\'qish yoki yozish uchun ruxsat yo\'q
+ Bunday fayl / tarkib manbai yo\'q
+ Bunday papka yo\'q
+ Fayl ko\'chirildi yoki o\'chirildi
+ Hech qanday audio stream topilmadi
+ Hech qanday video stream topilmadi
+ URL manzili yaroqsiz
+ Tashqi playerlar ushbu turdagi havolalarni qo\'llab-quvvatlamaydilar
+ Player xatosidan qutulish
+ Qayta tiklanmaydigan pleyerda xatolik yuz berdi
+ Ushbu stream ijro etilmadi
+ Rasm yuklanmadi
+ Hech qanday stream olinmadi
+ Live streamlar hali qo\'llab-quvvatlanmaydi
+ Yuklab olish menyusi sozlanmadi
+ Tarkib mavjud emas
+ Veb-saytni to\'liq tahlil qilib bo\'lmadi
+ Veb-saytni tahlil qilib bo\'lmadi
+ Videoning URL manzilini o\'chirib bo\'lmadi
+ Barcha eskizlarni yuklab bo\'lmadi
+ Tarmoqda xato
+ Tashqi SD-kartaga yuklab olishning iloji yo\'q. Yuklash papkasining joylashuvi tiklansinmi\?
+ Tashqi xotira mavjud emas
+ Xato
+ Yordam
+ Qidiruv tarixi o\'chirildi.
+ Butun qidiruv tarixi o\'chirilsinmi\?
+ Qidiruv kalit so\'zlar tarixini o\'chiradi
+ Qidiruv tarixini tozalash
+ Ijro pozitsiyalari o\'chirildi.
+ Barcha ijro holatlari o\'chirilsinmi\?
+ Barcha ijro holatlarini o\'chiradi
+ Ijro pozitsiyalarini o\'chirib tashlash
+ Tomosha tarixi o\'chirildi.
+ Tomosha tarixi butunlay o\'chirib tashlansinmi\?
+ Ijro etilgan streamlar tarixi va ijro holatlarini o\'chiradi
+
\ No newline at end of file
diff --git a/app/src/main/res/values-b+zh+HANS+CN/strings.xml b/app/src/main/res/values-b+zh+HANS+CN/strings.xml
index 9e4c8f3ccd7..d0f2731eb92 100644
--- a/app/src/main/res/values-b+zh+HANS+CN/strings.xml
+++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml
@@ -1,6 +1,7 @@
- 点击搜索按钮即可开始使用
+ 点击\"搜索\" 开始使用
+\n
%1$s 次观看
发布于 %1$s
在浏览器中打开
@@ -166,15 +167,14 @@
视频和音频
在后台播放
内容
- 受年龄限制的内容
- 显示受年龄限制的视频。可从设置允许此类内容。
+ 展示年龄限制的内容
直播
下载
下载
错误报告
错误
无法加载所有缩略图
- 无法解密视频的 URL 签名
+ 无法解密视频的 URL 签名
无法解析网址
无法完全解析网址
内容不可用
@@ -276,13 +276,11 @@
音频设置
长按队列
[未知]
- 添加到后台部分队列
- 加入悬浮窗队列
开始在此处开始播放
开始后台播放
开始在悬浮窗中播放
捐赠
- NewPipe 是由志愿者花费时间为您带来最佳体验开发的。回馈帮助开发人员在享用一杯咖啡的同时,让 NewPipe 变得更好。
+ NewPipe是由志愿者开发的,他们利用自己的空闲时间为您带来最佳的用户体验。在开发者享受一杯咖啡的时候,回报他们,帮助他们让NewPipe变得更好。
反馈
网站
请访问 NewPipe 网站了解更多信息和讯息。
@@ -361,11 +359,14 @@
以前的导出
无法导入订阅
无法导出订阅
- 通过下载导出文件来导入 YouTube 订阅:
+ 从 Google takeout 导入YouTube 订阅:
\n
-\n1. 转到此网站: %1$s
-\n2. 登录(如果需要)
-\n3. 应该立即开始下载(即导出文件)
+\n1. 转到这个URL:%1$s
+\n2. 登录谷歌账户
+\n3. 点击“所有包含的数据”,然后点击“取消选择全部”,然后只选择“订阅”,然后点击“确定”
+\n4. 点击“下一步”然后点击“创建导出”
+\n5. 在“下载”按钮出现后,点击它
+\n6. 从下载的takeout压缩包提取.json文件 (通常能够位于\"YouTube and YouTube Music/subscriptions/subscriptions.json\")并在此导入它。
通过输入网址或你的 ID 导入 SoundCloud 配置文件:
\n
\n1. 在浏览器中启用\"电脑模式\"(该网站不适用于移动设备)
@@ -497,7 +498,7 @@
没有人在听
- %s 人在听
-
+
重新启动应用后,语言将更改。
PeerTube 服务器
@@ -584,7 +585,7 @@
歌曲
该视频有年龄限制。
\n
-\n如果您想要观看,请在设置中启用“年龄限制内容”。
+\n如果您想要观看,请在设置中启用\"%1$s\"。
由 %s
由%s创建
频道的头像缩略图
@@ -595,7 +596,7 @@
移除看过的视频
来自服务的原始文本将在流项目中可见
在项目上显示原始时间
- YouTube受限模式
+ 打开YouTube\"受限模式\"
仅显示未分组订阅
播放列表页
尚无播放列表书签
@@ -627,4 +628,14 @@
将通知中显示的视频缩略图长宽比从16:9缩放到1:1(可能会导致失真)
缩放缩略图到1:1的长宽比
通知
+ 显示内存泄漏
+ 已加入队列
+ 加入队列
+ 清理你在解决验证码时 NewPipe 存储的cookies
+ reCAPTCHA cookies 已被清理
+ 清理 reCAPTCHA cookies
+ YouTube提供了一个“受限模式”,会隐藏潜在的成人内容。
+ 展示可能不适合儿童观看的内容,因为它有年龄限制(比如18岁以上)。
+ 让安卓系统根据视频缩略图的主色彩自定义通知的颜色(注意,该特性并非在所有设备上都可用)
+ 对通知着色
\ No newline at end of file
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 5458618882a..89d0b3997fd 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -102,7 +102,6 @@
Дададзена ў чаргу ў акне
Кантэнт
Кантэнт 18+
- Відэа з узроставымі абмежаваннямі. Дазволіць падобны кантэнт можна ў \"Наладах\".
Трансляцыя
Загрузкі
Загрузкі
@@ -149,7 +148,7 @@
Памылка
Памылка сеткі
Не атрымалася загрузіць усе мініяцюры
- Не атрымалася расшыфраваць подпіс URL у відэа
+ Не атрымалася расшыфраваць подпіс URL у відэа
Не атрымалася разабраць вэб-сайт
Не атрымалася цалкам разабраць вэб-сайт
Кантэнт недаступны
@@ -316,8 +315,6 @@
Падрабязнасці
Налады аўдыё
Зацісніце, каб дадаць у чаргу
- Дадаць ў чаргу \"У фоне\"
- Дадаць ў чаргу \"У акне\"
Пачаць адсюль у плэеры
Пачаць адсюль у фоне
Пачаць адсюль у акне
diff --git a/app/src/main/res/values-ber/strings.xml b/app/src/main/res/values-ber/strings.xml
index 2598d627f36..96d293d0a00 100644
--- a/app/src/main/res/values-ber/strings.xml
+++ b/app/src/main/res/values-ber/strings.xml
@@ -14,7 +14,7 @@
- %d ⵜⵙⴷⵉⴷⵉⵜ
- %d ⵜⵙⴷⵉⴷⵉⵏ
- ⵜⵓⵜⵍⴰⵢⵜ ⵏ ⵓⵙⵏⵙⵉ
+ ⵜⵓⵜⵍⴰⵢⵜ ⵏ ⵜⵙⵏⵙⵉ
ⵇⵇⵏ
ⵡⴰⵍⵓ
ⴰⵙⵓⵔⵉⴼ
@@ -73,7 +73,7 @@
ⵓⴳⴳⴰⵎⵏ
ⵓⵙⵔⵉⴷ
ⵢⴰⴹⵏ
- ⴰⴼⵉⴷⵢⵓ ⴷ ⵓⵎⵙⵍⴰⵢ
+ ⴰⴼⵉⴷⵢⵓ ⴷ ⵉⵎⵙⵍⵉ
ⴰⴳⵎ
ⵥⵕ ⴰⵎⵣⵔⵓⵢ
ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⵔⵣⵣⵓ
@@ -126,7 +126,8 @@
ⴰⵙⵎⴰⵍ ⵏ ⵜⴰⵢⴰⴼⵓⵜ ⵉ: %s
ⵎⵉⵏ ⵜⵅⵙⴷ ⴰⴷ ⵜⵉⵏⵉⴷ:\"%1$s\"\?
%1$s ⵏ ⵜⴰⵏⵏⴰⵢⵉⵏ
- ⴰⴷⵔ ⵅ \"ⵔⵣⵓ\"ⴰⴼⴰⴷ ⴰⴷ ⵜⵜⴰⵡⵍⴷ
+ ⴰⴷⵔ ⵅ \"ⵔⵣⵓ\"ⴰⴼⴰⴷ ⴰⴷ ⵜⵜⴰⵡⵍⴷ
+\n
ⵙⴽⵏ ⵉⵅⴼⴰⵡⴰⵍⵏ
ⴰⵙⴳⵓⵎ
\ No newline at end of file
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 5a1484ddb7e..73ec90c82ae 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -82,7 +82,6 @@
Включен в опашката в нов прозорец
Съдържание
Съдържание за възрастни
- Покажи съдържание за възрастни. Разрешаването на такова съдържание става от Настройки.
НА ЖИВО
Изтегляния
Изтегляния
@@ -219,7 +218,7 @@
Изтрива историята с въвежданите за търсене ключови думи
Изтрий цялата история на търсенията\?
Историята на търсенията е изтрита.
- URL подписът на клипа не можа да бъде дешифрован
+ URL подписът на клипа не можа да бъде дешифрован
Външните плейъри не поддържат този вид линкове
Невалиден URL
Невалидна директория
@@ -309,8 +308,6 @@
Детайли
Аудио настройки
Задръжте, за да поставите на опашката
- На опашката при „фонов режим“
- На опашката при „режим в прозорец“
Възпроизвеждане от тук
Възпроизвеждане от тук при фонов режим
Възпроизвеждане от тук при прозорец
diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml
index 150c6023ba8..647160e69f2 100644
--- a/app/src/main/res/values-bn-rBD/strings.xml
+++ b/app/src/main/res/values-bn-rBD/strings.xml
@@ -58,7 +58,6 @@
পপআপ মোডে চলছে
কন্টেন্ট
বয়স সীমাবদ্ধ কন্টেন্ট দেখাও
- ভিডিওটিকে বয়স সীমিত করা হয়েছে। প্রথমে সেটিংসে বয়স সীমাবদ্ধ ভিডিওগুলি সক্ষম করো।
লাইভ
ডাউনলোডগুলি
ডাউনলোডগুলি
@@ -76,7 +75,7 @@
ত্রুটি
নেটওয়ার্ক ত্রুটি
সব থাম্বনেইল লোড করা যায়নি
- ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি
+ ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি
ওয়েবসাইট বিশ্লেষন করা যায়নি
ওয়েবসাইট সম্পুর্নভাবে বিশ্লেষন করা যায়নি
কন্টেন্ট উপলব্ধ নয়
@@ -361,4 +360,5 @@
পুনরায়
প্রথম ক্রিয়া বোতাম
থাম্বনেলে ১:১ অনুপাতে করো
+ আমদানি/রপ্তানি
\ No newline at end of file
diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml
index 98ef3810d5c..8cdef455358 100644
--- a/app/src/main/res/values-bn-rIN/strings.xml
+++ b/app/src/main/res/values-bn-rIN/strings.xml
@@ -61,7 +61,7 @@
কন্টেন্ট উপলব্ধ নয়
ওয়েবসাইট সম্পুর্নভাবে বিশ্লেষন করা যায়নি
ওয়েবসাইট বিশ্লেষন করা যায়নি
- ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি
+ ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি
সব থাম্বনেইল লোড করা যায়নি
নেটওয়ার্ক ত্রুটি
ত্রুটি
@@ -82,7 +82,6 @@
ডাউনলোডগুলি
ডাউনলোডগুলি
লাইভ
- ভিডিওটিকে বয়স সীমিত করা হয়েছে। প্রথমে সেটিংসে বয়স সীমাবদ্ধ ভিডিওগুলি সক্ষম করো।
বয়স সীমাবদ্ধ কন্টেন্ট দেখাও
কন্টেন্ট
পপআপ মোডে চলছে
@@ -166,7 +165,7 @@
ঘূর্ণন
ব্রাউজার বাছাই করুন
শেয়ার করুন
- আপনি কি বুঝিয়েছেনঃ %1$s\?
+ আপনি কি বুঝিয়েছেন \"%1$s\"\?
সেটিংস
খুঁজুন
স্ট্রিম ফাইল ডাউনলোড করুন
@@ -180,7 +179,8 @@
কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান\?
প্রকাশকাল %1$s
%1$s জন দেখেছে
- অনুসন্ধান এ চাপ দিয়ে শুরু করুন
+ অনুসন্ধান এ চাপ দিয়ে শুরু করুন
+\n
নতুন
নতুন কি
অ্যাপ এর ভাষা
@@ -333,4 +333,6 @@
গিটহাব এ এরর রিপোর্ট করুন
ডিফল্ট এ ফিরে যান
রেজাল্ট দেখান হচ্ছেঃ %s
+ কিউ মোছার আগে নিশ্চিত করুন
+ পুনরায়
\ No newline at end of file
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index d55d109c361..01d49226080 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -176,7 +176,7 @@
কন্টেন্ট উপলব্ধ নয়
ওয়েবসাইট সম্পুর্নভাবে বিশ্লেষন করা যায়নি
ওয়েবসাইট বিশ্লেষন করা যায়নি
- ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি
+ ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি
সব থাম্বনেইল লোড করা যায়নি
নেটওয়ার্ক ত্রুটি
বাহ্যিক স্টোরেজ নেই
@@ -233,7 +233,6 @@
ডাউনলোডগুলি
লাইভ
YouTube নিষিদ্ধ মোড
- ভিডিওটিকে বয়স সীমিত করা হয়েছে। প্রথমে সেটিংসে বয়স সীমাবদ্ধ ভিডিওগুলি সক্ষম করো।
বয়স সীমাবদ্ধ কন্টেন্ট দেখাও
কন্টেন্ট
পপআপ মোডে চলছে
@@ -361,4 +360,119 @@
চতুর্থ অ্যাকশন বাটন
তৃতীয় অ্যাকশন বাটন
দ্বিতীয় অ্যাকশান বাটন
+ একটি সংশ্লিষ্ট স্ট্রিম যোগ করে প্লেব্যাক সারি শেষ করা অব্যাহত রাখো (পুনরাবৃত্তি ছাড়া)
+ সক্রিয় প্লেয়ার সারি প্রতিস্থাপন করা হবে
+ এক প্লেয়ার থেকে অন্য প্লেয়ারে পরিবর্তন করলে তোমার সারি প্রতিস্থাপিত হতে পারে
+ কিউ মোছার আগে নিশ্চিত করো
+ কমপ্যাক্ট বিজ্ঞপ্তিতে প্রদর্শন করতে তুমি সর্বাধিক তিনটি ক্রিয়া নির্বাচন করতে পারো!
+ নিচের প্রতিটি প্রজ্ঞাপন ক্রিয়া সম্পাদনা করো। ডান দিকের চেকবাক্স ব্যবহার করে কম্প্যাক্ট নোটিফিকেশনে দেখানোর জন্য তিনটি পর্যন্ত নির্বাচন করো।
+ ১৬:৯ থেকে ১:১অনুপাতে প্রদর্শিত ভিডিও থাম্বনেইল পরিবর্তন করো (বিকৃতি প্রবর্তন করতে পারে)
+ ফিড
+ ওভাররাইট
+ সারিবদ্ধ
+ পুনরুদ্ধাররত
+ পরে-প্রক্রিয়াকরণ
+ সারিবদ্ধ
+ প্রক্রিয়ারত
+ কখনো না
+ হালনাগাদ
+ পুনশুরু
+ স্টেপ
+ পিচ
+ টেম্পো
+ রপ্তানি করা হচ্ছে…
+ আমদানি করা হচ্ছে…
+
+ - %s সদস্যতা
+ - %s সদস্যতাগণ
+
+ ব্যবহারকারীরা
+ বিজ্ঞপ্তি
+ বাধার পর প্লে চালিয়ে যাও (উদাহরণস্বরূপ ফোনকল)
+ সদস্যতা রপ্তানি করা যায়নি
+ সদস্যতা/সাবস্ক্রিপশন আমদানি করা যায়নি
+ স্বয়ংক্রিয়ভাবে উৎপাদিত (কোনও আপলোডার পাওয়া যায়নি)
+ পছন্দ-তালিকা মুছে ফেলা যায়নি।
+ প্লে-তালিকা থাম্বনেইল হিসেবে সেট করো
+ কোনও বৈধ জিপ ফাইল নেই
+ এখনো কোন প্লে-তালিকা বুকমার্ক নেই
+ এখনও কোনও চ্যানেল সাবস্ক্রিপশন নেই
+ মূল পৃষ্ঠার বিষয়বস্তু
+ ফাইলের নামে অনুমোদিত অক্ষরসমূহ
+ সমাধান হয়ে গেলে \"সম্পন্ন\" টিপো
+ কেউ শুনছে না
+ কেউ দেখছে না
+ সেবাটি পরিবর্তন করো, বর্তমানে নির্বাচিত:
+ এখানে ঝিঝিপোকা ছাড়া আর কিছু নেই
+ এই ধরনের কোন ফাইল/বিষয়বস্তুর উৎস নেই
+ অপুনরুদ্ধারযোগ্য প্লেয়ার ত্রুটি ঘটেছে
+ পপআপ প্লেয়ারে সারিবদ্ধ
+ পটভূমি প্লেয়ারে সারিবদ্ধ
+ ইন্সট্যান্সটি যাচাই করা যায়নি
+ রিক্যাপচা কুকিগুলো পরিষ্কার করা হয়েছে
+ হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও
+ সিস্টেম দ্বারা অনুমতি অগ্রাহ্য করা হয়েছে
+ ব্যবস্থা দ্বারা ক্রিয়া অস্বীকার করা হয়েছে
+ "স্বয়ংক্রিয়ভাবে প্লেব্যাক শুরু করো %s — তে"
+ একটি পপ-আপে প্লে শুরু করো
+ পটভূমিতে প্লে শুরু করো
+ অ্যান্ড্রয়েডে মুক্ত সহজ স্ট্রিমিং।
+ ইতিহাস, সদস্যতা এবং পছন্দ-তালিকা রপ্তানি করো
+ \"সংযোজন করতে ধরে রাখো\" পরামর্শ দেখাও
+ উপলব্ধ হলে আলাদা ফিড থেকে এনো
+ সার্ভার ডেটা পাঠায় না
+ সার্ভারে সংযোগ করা যাচ্ছে না
+ আমদানি
+ আমদানি/রপ্তানি
+ সম্মেলন
+ নির্বাচন
+ তালিকায় প্লেব্যাক অবস্থান সূচক দেখাও
+ স্বত-সারি
+ সংযোগের সময় শেষ
+ পোস্ট-প্রক্রিয়াকরণ ব্যর্থ হয়েছে
+ প্রদর্শন পরিবর্তন করো
+ তোমার আইডি, soundcloud.com/আইডি
+ আগের রপ্তানি
+ ফাইল আমদানি করো
+ রপ্তানি করো
+ আমদানি করো
+ বুকমার্ক প্লেলিস্ট
+ তথ্য আনা হচ্ছে…
+ পপআপ প্লেয়ার
+ পটভূমি প্লেয়ার
+ প্লে সারি
+ সর্বোচ্চ পছন্দ
+ ফিড পৃষ্ঠা
+ সদস্যতা পৃষ্ঠা
+ ডিফল্ট কিয়স্ক
+ কিয়স্ক পৃষ্ঠা
+ প্রতিস্থাপক অক্ষর
+
+ - %sটি ভিডিও
+ - %sটি ভিডিও
+
+ ∞ ভিডিও
+ ১০০+ ভিডিও
+
+ - %s জন শ্রোতা
+ - %s জন শ্রোতা
+
+
+ - %s জন দেখছে
+ - %s জন দেখছে
+
+
+ - %s বার দেখা
+ - %s বার দেখা
+
+ সারিবদ্ধ করা হয়েছে
+ এনকুই
+
+ - %d সেকেন্ড
+ - %d সেকেন্ড
+
+ দেখা থেকে অপসারণ করো
+ সিস্টেম ডিফল্ট
+ সাফ ব্যবহার করো
+ বিজ্ঞপ্তি রঙিন করো
\ No newline at end of file
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 8dcc076535c..78ee40d1580 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -37,7 +37,6 @@
Depuració
Contingut
Desactiva les restriccions per edat
- Mostra el vídeo restringit per edat. Podeu permetre aquesta mena de continguts des dels paràmetres.
Directe
Baixades
Baixades
@@ -169,7 +168,7 @@
Notificació del NewPipe
Notificacions dels reproductors en rerefons o emergents del NewPipe
No s\'han pogut carregar totes les miniatures
- No s\'ha pogut desxifrar la signatura de l\'URL del vídeo
+ No s\'ha pogut desxifrar la signatura de l\'URL del vídeo
No s\'ha pogut processar el lloc web
No s\'ha pogut processar del tot el lloc web
Contingut no disponible
@@ -257,8 +256,6 @@
Quiosc
Tendències
Els millors 50
- Afegeix a la cua de reproducció en rerefons
- Afegeix a la cua de reproducció emergent
Reprodueix aquí
Obre el calaix
Tanca el calaix
diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml
index d33c527b4f0..75161746afc 100644
--- a/app/src/main/res/values-ckb/strings.xml
+++ b/app/src/main/res/values-ckb/strings.xml
@@ -188,7 +188,6 @@
داگرتن
ژێرنووسەکان
بەستەر هەڵەیە
- ڕیزنەبوون لە پاشبنەما
کۆنترۆڵی دەنگ بەجوڵەی پەنجە
ڕیزکردنی خۆکاری کارپێکردنی دواتر
کارپێکەرە ڤیدیۆییە دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن
@@ -370,7 +369,6 @@
هیچ داوانامەیەک دانەمەزراوە بۆ کارپێکردنی ئەم پەڕگەیە
كردنهوه له پهنجهرهی بچووک
سنووری قەبارە لەکاتی بەکارهێنانی داتای مۆبایل
- ڕیزنەبوون لە پەنجەرەی بچووک
داخستنی پلیکانە
کەناڵ
کۆد
@@ -453,7 +451,7 @@
هەمان فۆڵدەر بوونی نییە
دڵخوازکردنی لیستی کارپێکردن
ناوی پەڕگە ناکرێ بەتاڵ بێت
- ناتوانرێ واژووی بەستەری ڤیدیۆ بخوێنرێتەوە
+ ناتوانرێ واژووی بەستەری ڤیدیۆ بخوێنرێتەوە
پیشاندانی ئاگانامەیەک بۆ ئامادەبوونی داوانامە لەکاتی بەردەست بوونی وەشانی نوێ
بەشداربووەکان
مێژووی تەماشاکردن
@@ -589,7 +587,6 @@
پاشگهزبوونهوه
تراکەکان
ڕێکخستنەکانی دەنگ
- پیشاندانی ئەو ڤیدیۆیانەی سنوری تەمەنیان بۆ دانراوە. لە ڕێکخستنەکانەوە ڕێگەی پێدەدرێت.
پرسیارت لێ دەکرێت بۆ شوێنی داگرتنی هەر پەڕگەیەک
دواین کارپێکراو
ناتوانرێ لیستی داگرتن دابنرێ
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 1096f8b6105..be34475403f 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -43,7 +43,7 @@
Chyba
Chyba sítě
Nebylo možné nahrát všechny náhledy
- Nebylo možné dekódovat URL videa
+ Nebylo možné dekódovat URL videa
Nebylo možné analyzovat stránku
Obsah není k dispozici
Náhled videa
@@ -58,11 +58,11 @@
Automaticky přehrávat
Přehrává video, když je NewPipe otevřen z jiné aplikace
Obsah
- Věkově omezený obsah
- Zobrazit video s věkovým omezením. Změnit tuto volbu v budoucnu lze v \"Nastavení\".
+ Zobrazit věkově omezený obsah
Živě
Nebylo možné kompletně analyzovat stránku
- Začít klepnutím na \"Hledat\"
+ Začít klepnutím na \"Hledat\"
+\n
Zkopírováno do schránky
Počkejte prosím…
NewPipe stahuje
@@ -237,8 +237,6 @@
Nastavení zvuku
Podrž pro zařazení do fronty
[Neznámý]
- Do fronty na pozadí
- Do fronty v pop-upu
Začne hrát zde
Začít přehrávat na pozadí
Začít přehrávat v pop-upu
@@ -603,7 +601,7 @@
Písně
Toto je video s věkovým omezením.
\n
-\nPokud ho chcete vidět, povolte \"Věkově omezený obsah\" v Nastavení.
+\nPokud ho chcete vidět, povolte \"%1$s\" v Nastavení.
Ano, i zčásti shlédnutá videa
Odstranit shlédnutá videa\?
Odstranit shlédnutá
@@ -611,7 +609,7 @@
\nJste se jisti\? Nelze zvrátit!
Původní texty služeb budou viditelné u položek streamů
U položek ukázat původní čas \"před\"
- Omezený režim YouTube
+ Zapnout \"Omezený režim YouTube\"
Od %s
Vytvořil %s
Miniatura avatara kanálu
@@ -646,4 +644,12 @@
První akční tlačítko
Zmenšit miniaturu videa zobrazenou v oznámení z poměru stran 16: 9 na 1: 1 (může způsobit zkreslení)
Změnit poměr stran miniatury na 1:1
+ Ukázat memory leaks
+ Zařazeno do fronty
+ Zařadit do fronty
+ Vymazat cookies, které NewPipe uloží, po vyřešení reCAPTCHA
+ Cookies reCAPTCHA byly vymazány
+ Vymazat cookies reCAPTCHA
+ YouTube poskytuje \"Omezený režim\", který skrývá potenciální obsahy pro dospělé.
+ Zobrazit obsah, i když je patrně nevhodný pro děti, protože odkazuje na věkové omezení (např. 18+).
\ No newline at end of file
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 5bdc1a23c13..2b85a253965 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -110,7 +110,6 @@
Føjet til pop op-afspilningskøen
Indhold
Aldersbegrænset indhold
- Vis aldersbegrænsede videoer. Du kan tillade denne type videoer under Indstillinger.
LIVE
Downloads
Downloads
@@ -166,7 +165,7 @@
Download til eksternt SD-kort er endnu ikke muligt. Nulstil placering af download-mappe\?
Netværksfejl
Kunne ikke indlæse alle miniaturebilleder
- Kunne ikke dekryptere URL-signatur for video
+ Kunne ikke dekryptere URL-signatur for video
Kunne ikke analysere websted
Kunne ikke analysere webstedet fuldstændig
Indhold ikke tilgængeligt
@@ -317,7 +316,6 @@
Detaljer
Lydindstillinger
Hold for at føje til kø
- Føj til kø når baggrundstilstand aktiveres
Start afspilning her
Noget vil dukke op her snart ;D
Foretrukket \'åbn\'-handling
@@ -393,7 +391,6 @@
Kunne ikke eksportere abonnementer
Brugerrapport
Konferencer
- Føj til kø ved ny pop op
Start her når i baggrunden
Start her ved ny pop op
Åbn skuffe
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index a692a4ca264..d03b85f89a3 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -2,7 +2,7 @@
%1$s Aufrufe
Veröffentlicht am %1$s
- Keinen Stream-Player gefunden. VLC installieren\?
+ Kein Stream-Player gefunden. VLC installieren\?
Installieren
Abbrechen
Im Browser öffnen
@@ -10,7 +10,7 @@
Herunterladen
Suchen
Einstellungen
- Meintest du: \"%1$s\"\?
+ Meintest du „%1$s“\?
Teilen mit
Browser auswählen
Bildschirm drehen
@@ -52,12 +52,11 @@
Downloadverzeichnis „%1$s“ erstellt
Fehler
Konnte nicht alle Vorschaubilder laden
- Konnte Video-URL-Signatur nicht entschlüsseln
+ Konnte Video-URL-Signatur nicht entschlüsseln
Konnte Webseite nicht analysieren
Inhalt nicht verfügbar
Inhalt
- Altersbeschränkte Inhalte
- Altersbeschränktes Video anzeigen. Spätere Änderungen sind in den Einstellungen möglich.
+ Altersbeschränkte Inhalte anzeigen
Konnte Download-Menü nicht einrichten
Live-Streams werden noch nicht unterstützt
Konnte Webseite nicht vollständig analysieren
@@ -82,7 +81,8 @@
Fehler melden
Anwenderbericht
Live
- „Suchen“ antippen, um zu beginnen
+ „Suchen“ antippen, um zu beginnen
+\n
Downloads
Downloads
Fehlerbericht
@@ -230,14 +230,12 @@
Kiosk-Seite
Kiosk auswählen
Kiosk
- Tipp anzeigen, wenn der Hintergrundwiedergabe- oder Pop-up-Button „Details:“ im Video gedrückt wird
+ Tipp anzeigen, wenn der Hintergrundwiedergabe- oder Pop-up-Knopf „Details:“ im Video gedrückt wird
In der Warteschlange der Hintergrundwiedergabe
Neu und Heiß
Halten, um zur Wiedergabeliste hinzuzufügen
„Zum Anhängen gedrückt halten“ Tipp anzeigen
[Unbekannt]
- In Warteschlange für Hintergrundwiedergabe
- In Warteschlange in einem Pop-up
Ab hier wiedergeben
Wiedergabe im Hintergrund starten
Wiedergabe in einem Pop-up starten
@@ -346,16 +344,19 @@
Die Überwachung von Speicherlecks kann dazu führen, dass die App beim Heap-Dumping nicht mehr reagiert
Fehler außerhalb des Lebenszyklus melden
Erzwingen der Meldung unzustellbarer Rx-Ausnahmen außerhalb des Lebenszyklus von Fragmenten oder Aktivitäten nach der Entsorgung
- Importiere YouTube-Abonnements, indem du die Exportdatei herunterlädst:
-\n
-\n1. Gehe zu dieser URL: %1$s
-\n2. Melde dich an, falls du dazu aufgefordert wirst.
-\n3. Der Ladevorgang sollte beginnen (das ist die Exportdatei)
- Importiere ein SoundCloud-Profil, indem du entweder die URL oder deine ID eingibst:
-\n
-\n1. Aktiviere den Desktop-Modus in einem Web-Browser (die Seite ist für mobile Geräte nicht verfügbar)
-\n2. Gehe zu dieser URL: %1$s
-\n3. Melde dich an, falls du dazu aufgefordert wirst
+ Importiere YouTube-Abonnements aus dem Google Takeout:
+\n
+\n1. Gehe zu dieser URL: %1$s
+\n2. Melde dich an, falls du dazu aufgefordert wirst
+\n3. Klicke auf \"Alle Daten enthalten\", dann auf \"Alle abwählen\", wähle dann nur \"Abonnements\" und klicke auf \"OK\"
+\n4. Klicke auf \"Nächster Schritt\" und dann auf \"Export erstellen\"
+\n5. Klicke auf die Schaltfläche \"Download\", nachdem sie erscheint und
+\n6. Entpacke aus dem heruntergeladenen Takeout-Zip die .json-Datei (normalerweise unter \"YouTube und YouTube Music/subscriptions/subscriptions.json\") und importiere sie hier.
+ Importiere ein SoundCloud-Profil, indem die URL oder deine ID eingegeben wird:
+\n
+\n1. Aktiviere den Desktop-Modus in einem Web-Browser (die Seite ist für mobile Geräte nicht verfügbar)
+\n2. Gehe zu dieser URL: %1$s
+\n3. Melde dich an, falls du dazu aufgefordert wirst
\n4. Kopiere die Profil-URL, zu der du weitergeleitet wurdest.
yourID, soundcloud.com/yourid
Keine Streams zum Download verfügbar
@@ -401,7 +402,7 @@
Neuer Tab
Tab wählen
Gestensteuerung für Lautstärke
- Player-Lautstärke über Gesten steuern
+ Verwende Gesten um die Abspielerlautstärke einzustellen
Gestensteuerung für Helligkeit
Player-Helligkeit über Gesten steuern
Aktualisierungen
@@ -423,7 +424,7 @@
Gitter
Auto
Ansicht wechseln
- NewPipe-Update ist verfügbar!
+ Eine NewPipe-Aktualisierung ist verfügbar!
Zum Herunterladen antippen
Fertig
Ausstehend
@@ -484,7 +485,7 @@
Downloads starten
Downloads anhalten
Download-Ziel abfragen
- Du wirst gefragt, wohin du jeden Download speichern willst
+ Du wirst gefragt, wo jede heruntergeladene Datei gespeichert werden soll
Du wirst gefragt, wohin du jeden Download speichern willst.
\nAktiviere diese Option, wenn du auf die externe SD-Karte herunterladen möchtest
SAF verwenden
@@ -493,7 +494,7 @@
Wiedergabepositionen löschen
Alle Wiedergabepositionen löschen
Alle Wiedergabepositionen löschen\?
- Ändere die Downloadordner, damit sie wirksam werden
+ Wähle einen neuen Heruntergeladen-Ordner
Dienst umschalten, aktuell ausgewählt:
Standard-Kiosk
Niemand schaut zu
@@ -595,7 +596,7 @@
\nEs wird hoffentlich in einer zukünftigen Version unterstützt.
Dieses Video ist altersbeschränkt.
\n
-\nAktiviere in den Einstellungen „Altersbeschränkte Inhalte“, falls du diese sehen möchtest.
+\nAktiviere in den Einstellungen „%1$s“, falls du diese sehen möchtest.
Videos, die vor und nach dem Hinzufügen zur Wiedergabeliste angeschaut wurden, werden entfernt.
\nBist du sicher\? Dies kann nicht rückgängig gemacht werden!
Ja, und teilweise gesehene Videos
@@ -603,7 +604,7 @@
Gesehene Videos entfernen\?
Originalzeit vor Elementen anzeigen
Originaltexte von Diensten werden in Stream-Elementen sichtbar sein
- Eingeschränkter YouTube-Modus
+ Aktivieren des „Eingeschränkten Modus“ von YouTube
Avatarbild des Kanals
Erstellt von %s
Von %s
@@ -636,4 +637,14 @@
Den Player zu wechseln könnte deine Warteschlange überschreiben
Bestätige das Leeren der Warteschlange
Die aktive Wiedergabeliste wird ersetzt werden
+ Eingereiht
+ YouTube bietet einen „Eingeschränkten Modus“, der potenzielle Inhalte für Erwachsene ausblendet.
+ Speicherlecks anzeigen
+ Lösche Cookies, die NewPipe speichert, wenn du ein reCAPTCHA löst
+ reCAPTCHA-Cookies wurden gelöscht
+ reCAPTCHA-Cookies löschen
+ Zeige Inhalt, der möglicherweise unpassend für Kinder ist, da er eine Altersbeschränkung (wie z.B. 18+) hat.
+ Wiedergabe einreihen
+ Android kann die Farbe der Benachrichtigung entsprechend der Hauptfarbe in der Miniaturansicht anpassen (beachte, dass dies nicht auf allen Geräten verfügbar ist)
+ Benachrichtigung farblich anpassen
\ No newline at end of file
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index c76505f9493..f709f2a9b02 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -19,7 +19,7 @@
Φάκελος λήψης βίντεο
Τα ληφθέντα αρχεία βίντεο αποθηκεύονται εδώ
Επιλέξτε φάκελο λήψης για αρχεία βίντεο
- Διαδρομή λήψης αρχείων ήχου
+ Φάκελος λήψης ήχου
Τα ληφθέντα αρχεία ήχου αποθηκεύονται εδώ
Επιλέξτε φάκελο λήψης για αρχεία ήχου
Προεπιλεγμένη ανάλυση
@@ -41,16 +41,16 @@
Άλλα
Αναπαραγωγή στο παρασκήνιο
Σφάλμα δικτύου
- Μικρογραφία προεπισκόπισης βίντεο
+ Μικρογραφία προεπισκόπησης βίντεο
Αναπαραγωγή βίντεο, διάρκεια:
Μικρογραφία εικόνας προφίλ του χρήστη
Like
Dislike
Χρήση του Tor
- (Πειραματικό) Αναγκάζει την κίνηση λήψης μέσω Tor για αυξημένη προστασία προσωπικών δεδομένων (η αναπαραγωγή δεν υποστηρίζεται ακόμη).
- Δεν μπόρεσε να δημιουργηθεί ο φάκελος \'%1$s\'
- Δημιουργήθηκε ο φάκελος \'%1$s\'
- Δις
+ (Πειραματικό) Εξαναγκάζει τη λήψη μέσω του Tor για αυξημένη ιδιωτικότητα (η αναπαραγωγή δεν υποστηρίζεται ακόμη).
+ Αδυναμία δημιουργίας φακέλου λήψεων \'%1$s\'
+ Δημιουργήθηκε ο φάκελος λήψεων \'%1$s\'
+ δισ/ρια
Άνοιγμα σε αναδυόμενο παράθυρο
Εγγραφή
Εγγεγραμμένος
@@ -71,7 +71,7 @@
Τι συνέβη:
Το σχόλιό σας (στα Αγγλικά):
Λεπτομέρειες:
- Αναφορά σφάλματος
+ Αναφορά Σφάλματος
Βίντεο
Ήχος
Παύση
@@ -87,18 +87,19 @@
Ιστορικό
Ιστορικό
Εμφάνιση πληροφοριών
- Πατήστε \"Αναζήτηση\" για να ξεκινήσετε
+ Πατήστε \"Αναζήτηση\" για να ξεκινήσετε
+\n
Δε βρέθηκε πρόγραμμα αναπαραγωγής ροής δεδομένων (μπορείτε να εγκαταστήσετε το VLC για να κάνετε αναπαραγωγή).
Λήψη του αρχείου ροής
- Αφαίρεση του ήχου από κάποιες αναλύσεις
+ Αφαιρείται ο ήχος από κάποιες αναλύσεις
Λειτουργία αναδυόμενου παραθύρου
- Απεγγραφή από το κανάλι
+ Το κανάλι διαγράφηκε
Αδύνατη η αλλαγή της εγγραφής
Αδύνατη η ενημέρωση της εγγραφής
Κύριο
Συνδρομές
Αγαπημένες λίστες αναπαραγωγής
- Νέα
+ Τι νέο υπάρχει
Στο παρασκήνιο
Αναδυόμενο παράθυρο
Προσθήκη σε
@@ -112,36 +113,35 @@
Χρήση γρήγορης ανακριβούς αναζήτησης
Η μην ακριβής αναζήτηση επιτρέπει στην εφαρμογή να αναζητεί θέσεις στο βίντεο γρηγορότερα με μειωμένη ακρίβεια. Δε λειτουργεί για διαστήματα των 5, 15 ή 25 δευτερολέπτων.
Φόρτωση μικρογραφιών
- Με την απενεργοποίηση δε φορτώνονται οι μικρογραφίες, χρησιμοποιώντας λιγότερα δεδομένα και μνήμη. Οι αλλαγές σβήνουν τις προσωρινά αποθηκευμένες εικόνες στη μνήμη και στον δίσκο.
+ Με την απενεργοποίηση δε φορτώνονται οι μικρογραφίες, εξοικονομώντας δεδομένα και μνήμη. Οι αλλαγές σβήνουν τις προσωρινά αποθηκευμένες εικόνες στη μνήμη και στον δίσκο.
Εκκαθαρίστηκε η προσωρινή μνήμη εικόνων
Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων
Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων
Η προσωρινή μνήμη μεταδεδομένων εκκαθαρίστηκε
Αυτόματη πρόσθεση της επόμενης ροής στην ουρά
- Αυτόματη πρόσθεση μιας σχετικής ροής όταν αναπαράγεται η προηγούμενη ροή σε μια μη-επαναλαμβανόμενη ουρά
+ Συνέχεια της τρέχουσας (μη επαναλαμβανόμενης) ουράς μετά τη λήξη της, με την προσθήκη μιας σχετικής ροής
Έλεγχος αναπαραγωγής με χειρονομίες
Χρήση χειρονομιών για τον έλεγχο της φωτεινότητας και της έντασης ήχου
Εμφάνιση προτάσεων ενώ κάνετε αναζήτηση
Αποθήκευση αναζητήσεων στη συσκευή
Προβολή Ιστορικού
- Κρατήστε ιστορικό των βίντεο που έχετε δει
- Συνέχεια αναπαραγωγής
+ Κρατήστε ιστορικό των αναπαραχθέντων βίντεο
+ Ανάκτηση αναπαραγωγής
Συνέχιση της αναπαραγωγής έπειτα από διακοπές (π.χ. κλήσεις)
- Εμφάνιση της βοήθειας \"Πιέστε παρατεταμένα για πρόσθεση\"
- Εμφάνιση υπόδειξης όταν πατηθεί το κουμπί Παρασκηνίου ή Αναδυόμενου παραθύρου στη σελίδα λεπτομερειών του βίντεο
+ Εμφάνιση επεξήγησης του \"Πιέστε παρατεταμένα για προσθήκη\"
+ Εμφάνιση υπόδειξης όταν πατηθεί το κουμπί παρασκηνίου ή αναδυόμενου παραθύρου στη σελίδα λεπτομερειών του βίντεο
Προεπιλεγμένη χώρα περιεχομένου
Υπηρεσία
- Συσκευή Αναπαραγωγής
+ Αναπαραγωγός
Συμπεριφορά
- Ιστορικό και προσωρινή αποθήκευση
+ Ιστορικό και προσωρινή μνήμη
Αναδυόμενο παράθυρο
- Απασφαλμάτωση
+ Αποσφαλμάτωση
Αναπαραγωγή σε αναδυόμενο παράθυρο
Προστέθηκε στη λίστα αναπαραγωγής παρασκηνίου
Προστέθηκε στη λίστα αναπαραγωγής αναδυόμενου παραθύρου
Περιεχόμενο
- Περιεχόμενο περιορισμένης ηλικίας
- Εμφάνιση βίντεο με περιορισμό ηλικίας. Μελλοντικές αλλαγές είναι δυνατές από τις ρυθμίσεις.
+ Εμφάνιση περιεχομένου περιορισμένης ηλικίας
Ζωντανά
Αναφορά σφαλμάτων
Κανάλια
@@ -160,7 +160,7 @@
Μόνο μία φορά
Αρχείο
Ειδοποίηση NewPipe
- Ειδοποιήσεις για την αναπαραγωγή Παρασκηνίου και Αναδυόμενου Παραθύρου
+ Ειδοποιήσεις αναπαραγωγής παρασκηνίου και αναδυόμενου παραθύρου
[Άγνωστο]
Αλλαγή προσανατολισμού
Αλλαγή σε Παρασκήνιο
@@ -168,10 +168,10 @@
Αλλαγή σε Κύριο
Εισαγωγή βάσης δεδομένων
Εξαγωγή βάσης δεδομένων
- Θα παρακάμψει το τρέχον ιστορικό και εγγραφές σας
+ Παρακάμπτει το τρέχον ιστορικό και τις εγγραφές σας
Εξαγωγή ιστορικού, εγγραφών και λιστών αναπαραγωγής
Εκκαθάριση ιστορικού προβολής
- Διαγράφει το ιστορικό των ροών που έχουν αναπαραχθεί
+ Διαγράφει το ιστορικό των αναπαραχθέντων ροών και των θέσεων αναπαραγωγής
Διαγραφή ολόκληρου του ιστορικού προβολής;
Το στορικό προβολής διαγράφηκε.
Διαγραφή ιστορικού αναζητήσεων
@@ -179,25 +179,25 @@
Διαγραφή ολόκληρου του ιστορικού αναζητήσεων;
Το ιστορικό αναζητήσεων διαγράφηκε.
Δεν ήταν δυνατή η φόρτωση όλων των εικονιδίων
- Δεν ήταν δυνατή η αποκρυπτογράφηση της υπογραφής του URL του βίντεο
+ Δεν ήταν δυνατή η αποκρυπτογράφηση της υπογραφής της URL του βίντεο
Δεν ήταν δυνατή η ανάλυση του ιστοτόπου
Δεν ήταν δυνατή η ανάλυση ολόκληρου του ιστοτόπου
Το περιεχόμενο δεν είναι διαθέσιμο
Δεν ήταν δυνατή η ρύθμιση του μενού λήψεων
- Η Ζωντανή Ροή δεν υποστηρίζεται ακόμα
- Δεν ήταν δυνατή η λήψη καμίας ροής
+ Οι ζωντανές ροές δεν υποστηρίζονται ακόμα
+ Δεν ήταν δυνατή η λήψη οποιασδήποτε ροής
Δεν ήταν δυνατή η φόρτωση της εικόνας
- Η εφαρμογή κράσαρε
+ Η εφαρμογή κατέρρευσε
Δεν ήταν δυνατή η αναπαραγωγή αυτής της ροής
Συνέβη ένα μη ανακτήσιμο σφάλμα στη συσκευή αναπαραγωγής
Ανάκτηση από σφάλμα της συσκευής αναπαραγωγής
Οι εξωτερικές συσκευές αναπαραγωγής δεν υποστηρίζουν αυτού του είδους συνδέσμους
- Μη έγκυρο URL
+ Μη έγκυρη URL
Δε βρέθηκαν ροές βίντεο
Δε βρέθηκαν ροές ήχου
Δεν υπάρχει αυτός ο φάκελος
Δεν υπάρχει το αρχείο/πηγή περιεχομένου
- Το αρχείο δεν υπάρχει ή δεν έχουμε επαρκή εξουσιοδότηση για να διαβάσουμε ή να γράψουμε σε αυτό
+ Το αρχείο δεν υπάρχει ή δεν υπάρχει επαρκής εξουσιοδότηση ανάγνωσης ή εγγραφής σε αυτό
Το όνομα αρχείου δεν μπορεί να είναι κενό
Προέκυψε ένα σφάλμα: %1$s
Δεν υπάρχουν διαθέσιμες ροές για λήψη
@@ -210,13 +210,13 @@
Δεν υπάρχει τίποτα εδώ
Σύρετε για ταξινόμηση
Προσπάθεια εκ νέου
- Παραχώρηση πρόσβασης πρώτα στον αποθηκευτικό χώρο
- χιλ
- Εκ
- Κανένας εγγεγραμένος χρήστης
+ Παραχώρηση πρώτα πρόσβασης στον αποθηκευτικό χώρο
+ χιλ.
+ εκ/ρια
+ Κανένας συνδρομητής
- - %s εγγεγραμένος χρήστης
- - %s εγγεγραμένοι χρήστες
+ - %s συνδρομητής
+ - %s συνδρομητές
Καμία προβολή
@@ -225,8 +225,8 @@
Κανένα βίντεο
- - %s Βίντεο
- - %s Βίντεο
+ - %s βίντεο
+ - %s βίντεο
Εκκίνηση
Αναπαραγωγή
@@ -236,7 +236,7 @@
Άθροισμα ελέγχου
Αγνόηση
Μετονομασία
- Νέα αποστολη
+ Νέα αποστολή
ΟΚ
Όνομα αρχείου
Νήματα
@@ -245,40 +245,40 @@
Λήψη NewPipe
Παρακαλώ περιμένετε…
Αντιγράφηκε στο πρόχειρο
- Παρακαλώ ορίστε έναν διαθέσιμο φάκελο λήψεων αργότερα στις ρυθμίσεις
+ Παρακαλώ ορίστε έναν φάκελο λήψεων αργότερα στις ρυθμίσεις
Αυτή η άδεια είναι απαραίτητη για
\nτο άνοιγμα αναδυόμενων παραθύρων
1 αντικείμενο διαγράφηκε.
- Πρόκληση reCAPTCHA
- Ζητήθηκε πρόκληση reCAPTCHA
+ Δοκιμασία reCAPTCHA
+ Ζητήθηκε δοκιμασία reCAPTCHA
Επιτρεπόμενοι χαρακτήρες σε ονόματα αρχείων
Οι μη έγκυροι χαρακτήρες αντικαθίστανται με αυτήν την τιμή
Αντικαταστάτης χαρακτήρας
Οι περισσότεροι ειδικοί χαρακτήρες
- Δεν υπάρχει εφαρμογή εγκατεστημένη για την αναπαραγωγή αυτού του αρχείου
+ Δεν υπάρχει εγκατεστημένη εφαρμογή για την αναπαραγωγή αυτού του αρχείου
Σχετικά με το NewPipe
Περί
Άδειες Τρίτων
© %1$s από %2$s υπό %3$s
Δεν ήταν δυνατή η φόρτωση της άδειας
Περί
- Συνεισφέροντες
+ Συντελεστές
Ανοιχτού κώδικα, ελαφριά εφαρμογή Android, για την αναπαραγωγή πολυμέσων από το διαδίκτυο.
Συνεισφέρετε
- Αν έχετε ιδέες για μετάφραση, αλλαγή σχεδιασμού, εκκαθάριση ή ριζικές αλλαγές κώδικα της εφαρμογής—η βοήθεια σας είναι πάντα ευπρόσδεκτη. Όσο περισσότερη έχουμε, τόσο καλύτεροι γινόμαστε!
+ Αν έχετε ιδέες για μετάφραση, αλλαγή σχεδιασμού, εκκαθάριση ή ριζικές αλλαγές κώδικα της εφαρμογής, η βοήθεια σας είναι πάντα ευπρόσδεκτη. Όσο περισσότερη έχουμε, τόσο καλύτεροι γινόμαστε!
Δείτε το στο GitHub
Κάντε μια δωρεά
- Το NewPipe αναπτύσσεται από εθελοντές που δαπανούν τον ελεύθερο χρόνο τους για να σας προσφέρουν τη βέλτιστη δυνατή εμπειρία χρήστη. Δώστε πίσω για να βοηθήσετε τους προγραμματιστές του NewPipe να το κάνουν ακόμα καλύτερο, όσο απολαμβάνουν ένα φλιτζάνι καφέ.
- Προσφέρτε
+ Το NewPipe αναπτύσσεται από εθελοντές που δαπανούν τον ελεύθερο χρόνο τους για να σας προσφέρουν τη βέλτιστη δυνατή εμπειρία χρήστη. Ανταποδώστε το, για να βοηθήσετε τους προγραμματιστές του NewPipe να το κάνουν ακόμα καλύτερο, όσο απολαμβάνουν ένα φλιτζάνι καφέ.
+ Προσφέρετε
Ιστότοπος
Επισκευτείτε τον ιστότοπο του NewPipe για περισσότερες πληροφορίες και νέα.
- Η πολιτική ιδιωτικού απόρρητου του NewPipe
- Το NewPipe παίρνει πολύ σοβαρά το ιδιωτικό σας απόρρητο. Έτσι, η εφαρμογή αυτή δεν συλλέγει δεδομένα από εσάς χωρίς τη συγκατάθεσή σας.
+ Πολιτική ιδιωτικού απόρρητου του NewPipe
+ Το NewPipe παίρνει πολύ σοβαρά την ιδιωτικότητα σας. Έτσι, η εφαρμογή αυτή δεν συλλέγει δεδομένα από εσάς χωρίς τη συγκατάθεσή σας.
\nΗ πολιτική ιδιωτικού απόρρητου του NewPipe εξηγεί λεπτομερώς ποια δεδομένα αποστέλλονται και αποθηκεύονται όταν επιλέγετε να στείλετε μια αναφορά σφαλμάτων.
- Διαβάστε την πολιτική ιδιωτικού απόρρητου
+ Ανάγνωση της πολιτικής ιδιωτικού απόρρητου
Η άδεια του NewPipe
Το NewPipe είναι copylelft ελεύθερο λογισμικό: Μπορείτε να το χρησιμοποιήσετε, να το μελετήσετε, να το μοιραστείτε και να το βελτιώσετε κατά βούληση. Ειδικότερα, μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό την άδεια GNU General Public Licence όπως αυτή εκδόθηκε από το Free Software Foundation, είτε υπό την έκδοση 3 της Άδειας είτε (προεραιτικά) υπό οποιαδήποτε μεταγενέστερη άδεια.
- Διαβάστε την άδεια
+ Ανάγνωση της άδειας
Αναζητήθηκαν
Προβλήθηκαν
Το ιστορικό έχει απενεργοποιηθεί
@@ -293,7 +293,7 @@
Περιεχόμενο της κεντρικής σελίδας
Κενή σελίδα
Σελίδα περιπτέρου
- Σελίδα εγγραφών
+ Σελίδα συνδρομών
Σελίδα καναλιών
Επιλέξτε ένα κανάλι
Δεν έχει γίνει εγγραφή σε κάποιο κανάλι ακόμα
@@ -308,33 +308,31 @@
Αφαίρεση
Λεπτομέρειες
Ρυθμίσεις ήχου
- Πιέστε για να προστεθεί στην ουρά
- Προσθήκη στη λίστα αναπαραγωγής του παρασκηνίου
- Προσθήκη στη λίστα αναπαραγωγής αναδυόμενου παραθύρου
- Εκκίνηση Αναπαραγωγής εδώ
+ Πιέστε παρατεταμένα για να προστεθεί στην ουρά
+ Εκκίνηση αναπαραγωγής εδώ
Εκκίνηση αναπαραγωγής στο παρασκήνιο
Εκκίνηση αναπαραγωγής σε ένα αναδυόμενο παράθυρο
- Άνοιγμα Συρταριού
- Κλείσιμο Συρταριού
- Κάτι θα παιχτεί εδω σύντομα ;D
+ Άνοιγμα συρταριού
+ Κλείσιμο συρταριού
+ Κάτι θα εμφανιστεί εδώ σύντομα ;D
Τοπ 50
Καινούρια και δημοφιλή
- Προτιμώμενη ενέργεια ανοίγματος
+ Προτιμώμενη ενέργεια κοινοποίησης
Προεπιλεγμένη ενέργεια για το άνοιγμα περιεχομένου — %s
Συσκευή αναπαραγωγής βίντεο
- Αναπαραγωγή Παρασκηνίου
- Αναπαραγωγή σε Αναδυόμενο Παράθυρο
+ Αναπαραγωγή παρασκηνίου
+ Αναπαραγωγή σε αναδυόμενο παράθυρο
Πάντα ερώτηση
Γίνεται λήψη πληροφοριών…
Γίνεται φόρτωση του ζητούμενου περιεχομένου
- Νέα Λίστα Αναπαραγωγής
+ Νέα λίστα αναπαραγωγής
Διαγραφή
Μετονομασία
Όνομα
- Προσθήκη στη Λίστα
+ Προσθήκη σε λίστα αναπαραγωγής
Ορισμός ως μικρογραφία λίστας αναπαραγωγής
- Προσθήκη Σελιδοδείκτη στη Λίστα
- Διαγραφή Σελιδοδείκτη
+ Προσθήκη σελιδοδείκτη στη λίστα
+ Διαγραφή σελιδοδείκτη
Διαγραφή αυτής της λίστας αναπαραγωγής;
Η λίστα αναπαραγωγής δημιουργήθηκε
Προστέθηκε στη λίστα αναπαραγωγής
@@ -358,10 +356,10 @@
Εισαγωγή αρχείου
Προηγούμενη εξαγωγή
Δεν ήταν δυνατή η εισαγωγή των εγγραφών
- Δεν ήταν δυνατή η εισαγωγή των εγγραφών
+ Δεν ήταν δυνατή η εξαγωγή των εγγραφών
Κάντε εισαγωγή των εγγραφών σας στο YouTube κατεβάζοντας το εξής αρχείο:
\n
-\n1. Πλοηγηθήτε στο: %1$s
+\n1. Πλοηγηθείτε στο: %1$s
\n2. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί
\n3. Η λήψη του αρχείου των εγγραφών σας θα ξεκινήσει
Για να εισάγετε τον λογαριασμό SoundCloud σας, πληκτρολογήστε τον σύνδεσμο ή το ID σας:
@@ -369,7 +367,7 @@
\n1. Ενεργοποιήστε τη λειτουργία \"Desktop mode\" στον φυλλομετρητή σας (καθώς η ιστοσελίδα δεν είναι διαθέσιμη για κινητά)
\n2. Πλοηθηθείτε στο %1$s
\n3. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί
-\n4. Αντιγράψτε τον σύνδεσμο του λογαριαμού στον οποίο ανακατευθυνθήκατε.
+\n4. Αντιγράψτε τον σύνδεσμο του λογαριασμού στον οποίο ανακατευθυνθήκατε.
Αυτή η διαδικασία μπορεί να χρησιμοποιήσει μεγάλο όγκο δεδομένων.
\n
\nΕπιθυμείτε να συνεχίσετε;
@@ -377,16 +375,16 @@
Τέμπο
Τόνος
Ενέργεια κατά τη μετάβαση σε άλλη εφαρμογή — %s
- Σελίδα Ροής
+ Σελίδα ροής
Δημοφιλή
Αναφορά σφαλμάτων εκτός κύκλου ζωής
Το όνομα χρήστη σας, soundcloud.com/όνομαχρήστη
- Αποσύνδεση (μπορεί να προκαλέσει παραμόρφωση)
- Επιτάχυνση αναπαραγωγής κατά τη διάρκεια σιωπής
+ Απαγκίστρωση (μπορεί να προκαλέσει παραμόρφωση)
+ Γρήγορη αναπαραγωγή κατά τη διάρκεια της σίγασης
Βήμα
Επαναφορά
- Προς συμμόρφωση με τον Ευρωπαϊκό Γενικό Κανονισμό για την Προστασία Δεδομένων (GDPR), σας επιστούμε την προσοχή στην πολιτική προστασίας προσωπικών δεδομένων του NewPipe. Παραλούμε, διαβάστε την προσεκτικά.
-\nΘα πρέπει να την αποδεχτέιτε προκειμένου να μας αποστείλετε την αναφορά σφάλματος.
+ Προς συμμόρφωση με τον Ευρωπαϊκό Γενικό Κανονισμό για την Προστασία Δεδομένων (GDPR), σας εφιστούμε την προσοχή στην πολιτική προστασίας προσωπικών δεδομένων του NewPipe. Παραλούμε, διαβάστε την προσεκτικά.
+\nΘα πρέπει να την αποδεχτείτε προκειμένου να μας αποστείλετε την αναφορά σφάλματος.
Αποδοχή
Απόρριψη
Χωρίς όριο
@@ -398,9 +396,9 @@
Απεγγραφή
Νέα Καρτέλα
Επιλογή Καρτέλας
- Ρυθμίσεις χειρονομιών ήχου
- Χρησιμοποιήστε χειρονομίες για τον έλεγχο έντασης του ήχου
- Ρυθμίσεις χειρονομιών φωτεινότητας
+ Έλεγχος ήχου με χειρονομιές
+ Χρησιμοποιήστε χειρονομίες για τον έλεγχο της έντασης του ήχου
+ Έλεγχος φωτεινότητας με χειρονομίες
Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας
Ενημερώσεις
Συμβάντα
@@ -409,51 +407,51 @@
Ειδοποίηση για νεότερη έκδοση του NewPipe
Εξωτερική μνήμη αποθήκευσης μη διαθέσιμη
Η αποθήκευση στην SD κάρτα δεν είναι δυνατή. Επαναφορά στην αρχική τοποθεσία λήψης;
- Δεν ήταν δυνατή η ανάγνωση αποθηκευμένων καρτελών, επομένως χρήση προεπιλεγμένων καρτελών
+ Δεν ήταν δυνατή η ανάγνωση των αποθηκευμένων καρτελών. Θα γίνει χρήση των προεπιλεγμένων
Επαναφορά προεπιλεγμένων ρυθμίσεων
- Θέλετε να επαναφέρετε τις προεπιλογές;
- Ο αριθμός συνδρομητών δεν είναι διαθέσιμος
+ Θέλετε να επαναφέρετε τις προεπιλεγμένες ρυθμίσεις;
+ Το πλήθος των συνδρομητών δεν είναι διαθέσιμο
Ποιές καρτέλες θα εμφανίζονται στην αρχική σελίδα
Επιλογή
Συνέδρια
Ενημερώσεις
Εμφάνιση ειδοποίησης όταν μια υπάρχει μια νεότερη έκδοση
- Λειτουργία προβολής ως λίστα
+ Προβολή λίστας
Λίστα
Πλέγμα
Αυτόματα
Αλλαγή τρόπου προβολής
- Νέα έκδοση του NewPipe είναι διαθέσιμη!
+ Μια νέα έκδοση του NewPipe είναι διαθέσιμη!
Πατήστε για λήψη
Ολοκληρώθηκε
Εκκρεμεί
- Παύση
- στην ουρά
- Μετεπεξεργασία
+ σε παύση
+ σε ουρά
+ σε μετεπεξεργασία
Ουρά
- Η δράση απορρίφθηκε από το σύστημα
+ Η ενέργεια απορρίφθηκε από το σύστημα
Η λήψη απέτυχε
Η λήψη ολοκληρώθηκε
- %s λήψεις ολοκρηρώθηκαν
+ %s λήψεις ολοκληρώθηκαν
Δημιουργία μοναδικού ονόματος
Αντικατάσταση
Ένα αρχείο με αυτό το όνομα υπάρχει ήδη
- Ένα αρχείο που έχει ληφθεί με αυτό το όνομα υπάρχει ήδη
+ Ένα ληφθέν αρχείο με αυτό το όνομα υπάρχει ήδη
Υπάρχει μια λήψη σε εξέλιξη με αυτό το όνομα
Εμφάνιση σφάλματος
- Κωδικός
+ Κώδικας
Δεν είναι δυνατή η δημιουργία του φακέλου προορισμού
Δεν είναι δυνατή η δημιουργία του αρχείου
- Η αδειοδότηση απορρίφθηκε απο το σύστημα
+ Η άδεια απορρίφθηκε από το σύστημα
Δεν ήταν δυνατή η δημιουργία ασφαλούς σύνδεσης
Αδυναμία εύρεσης του εξυπηρετητή
Αδυναμία σύνδεσης με τον εξυπηρετητή
- Ο εξυπηρετητής δεν μπορεί να στείλει τα δεδομένα
- Ο εξυπηρετητής δέν υποστηρίζει πολυνηματικές λήψεις, ξαναπροσπαθήστε με @string/msg_threads = 1
- Δεν βρέθηκε
- Μετεπεξεργασία απέτυχε
+ Ο εξυπηρετητής δεν στέλνει δεδομένα
+ Ο εξυπηρετητής δεν υποστηρίζει πολυνηματικές λήψεις, ξαναπροσπαθήστε με @string/msg_threads = 1
+ Δε βρέθηκε
+ Η μετεπεξεργασία απέτυχε
Διακοπή
- Μέγιστες επαναπροσπάθειες
+ Μέγιστος αριθμός προσπαθειών
Μέγιστος αριθμός προσπαθειών προτού γίνει ακύρωση της λήψης
Διακοπή σε δίκτυα με ογκοχρέωση
Χρήσιμο κατά τη μετάβαση σε δεδομένα κινητής τηλεφωνίας, αν και ορισμένες λήψεις δεν μπορούν να ανασταλούν
@@ -463,7 +461,7 @@
Χωρίς σχόλια
Δεν ήταν δυνατή η φόρτωση σχολίων
Κλείσιμο
- Συνέχιση αναπαραγωγής
+ Ανάκτηση αναπαραγωγής
Επαναφορά της τελευταίας θέσης αναπαραγωγής
Θέσεις στις λίστες
Εμφάνιση ενδείξεων θέσης αναπαραγωγής στις λίστες
@@ -471,17 +469,17 @@
Οι θέσεις αναπαραγωγής διαγράφηκαν.
Το αρχείο μετακινήθηκε ή διαγράφηκε
δεν είναι δυνατή η αντικατάσταση του αρχείου
- Υπάρχει μια εκκρεμή λήψη με αυτό το όνομα
- Το NewPipe έκλεισε, ενώ εργάζονται στο αρχείο
- Δεν είναι αρκετός ο χώρος στη συσκευή
+ Υπάρχει μια εκκρεμής λήψη με αυτό το όνομα
+ Το NewPipe τερματίστηκε ενώ επεξεργάζονταν το αρχείο
+ Δεν υπάρχει αρκετός χώρος στη συσκευή
Η πρόοδος χάθηκε, επειδή το αρχείο διαγράφηκε
Λήξη χρονικού ορίου σύνδεσης
Θέλετε να διαγράψετε το ιστορικό λήψεων σας ή να διαγράψετε όλα τα αρχεία που έχετε λάβει;
Περιορισμός ουράς λήψης
- Μια λήψη θα εκτελεστεί ταυτόχρονα
+ Μόνο μια λήψη θα εκτελείται κάθε φορά
Έναρξη λήψεων
Παύση λήψεων
- Ερώτηση που να γίνει η λήψη
+ Ερώτηση πού να γίνει η λήψη
Θα ερωτηθείτε πού να αποθηκεύσετε κάθε λήψη
Θα σας ζητηθεί πού να αποθηκεύσετε κάθε λήψη.
\nΕπιλέξτε SAF αν θέλετε να κατεβάσετε σε μια εξωτερική κάρτα SD
@@ -492,7 +490,7 @@
Διαγράφει όλες τις θέσεις αναπαραγωγής
Να διαγραφούν όλες οι θέσεις αναπαραγωγής;
Αλλαγή των φακέλων λήψης για να τεθούν σε ισχύ
- Εναλλαγή υπηρεσιών, επιλεγμένη αυτήν τη στιγμή:
+ Εναλλαγή υπηρεσιών, επιλεγμένη αυτή τη στιγμή:
Κανείς δεν παρακολουθεί
- %s παρακολουθεί
@@ -503,15 +501,15 @@
- %s ακροατής
- %s ακροατές
- Η γλώσσα θα αλλάξει μόλις θα επανεκκινηθεί η εφαρμογή.
+ Η γλώσσα θα αλλάξει αφού επανεκκινηθεί η εφαρμογή.
Προεπιλεγμένο περίπτερο
- Υποστηρίζονται μόνο HTTPS URLς
- Τοπικό
- Προστέθηκε πρόσφατα
+ Μόνο HTTPS σύνδεσμοι υποστηρίζονται
+ Τοπικά
+ Προστέθηκαν πρόσφατα
Δημιουργήθηκε αυτόματα (δεν βρέθηκε χρήστης μεταφόρτωσης)
- Ανάκτηση
+ σε ανάκτηση
Δεν είναι δυνατή η ανάκτηση αυτής της λήψης
- Διάρκεια fastforward και rewind
+ Διάρκεια αναζήτησης fast-forward και rewind
Προεπιλογή συστήματος
Βίντεο
Εμφάνιση αποτελεσμάτων για: %s
@@ -524,15 +522,15 @@
Δημιουργήθηκε από %s
Σελίδα λίστας αναπαραγωγής
Από %s
- Διαθέσιμο σε ορισμένες υπηρεσίες, είναι συνήθως πολύ πιο γρήγορο, αλλά μπορεί να επιστρέψει έναν περιορισμένο αριθμό αντικειμένων και συχνά ελλιπείς πληροφορίες (π.χ. χωρίς διάρκεια, τύπο αντικειμένου, χωρίς ζωντανή κατάσταση).
+ Διαθέσιμο σε ορισμένες υπηρεσίες, είναι συνήθως πολύ πιο γρήγορο, αλλά μπορεί να επιστρέψει έναν περιορισμένο αριθμό αντικειμένων και συχνά ελλειπείς πληροφορίες (π.χ. χωρίς διάρκεια, τύπο αντικειμένου).
Λήψη από ειδική ροή όταν είναι διαθέσιμη
Να γίνεται πάντα ενημέρωση
- Ώρα μετά την τελευταία ενημέρωση πριν από μια συνδρομή θεωρείται ξεπερασμένη — %s
+ Χρόνος μετά την τελευταία ενημέρωση πριν μια συνδρομή θεωρηθεί ξεπερασμένη — %s
Όριο ενημέρωσης ροής
Ροή
Εμφάνιση μόνο μη ομαδοποιημένων συνδρομών
Νέα
- Θέλετε να διαγράψετε αυτήν την ομάδα;
+ Θέλετε να διαγράψετε αυτή την ομάδα;
Κενό όνομα ομάδας
Δεν έχει επιλεγεί συνδρομή
Επιλέξτε συνδρομές
@@ -553,13 +551,13 @@
Τραγούδια
Αυτό το βίντεο έχει περιορισμό ηλικίας.
\n
-\nΕνεργοποιήστε το \"Περιεχόμενο περιορισμένης ηλικίας\" στις ρυθμίσεις εάν θέλετε να το δείτε.
- Λειτουργία περιορισμένης πρόσβασης στο YouTube
+\nΕνεργοποιήστε το \"%1$s\" στις ρυθμίσεις εάν θέλετε να το δείτε.
+ Λειτουργία περιορισμένης πρόσβασης του YouTube
Ειδοποίηση
Δεν ήταν δυνατή η αναγνώριση της διεύθυνσης URL. Άνοιγμα με άλλη εφαρμογή;
Αυτόματη ουρά
- Η ουρά ενεργού παίκτη θα αντικατασταθεί
- Η εναλλαγή από έναν παίκτη σε άλλο μπορεί να αντικαταστήσει την ουρά σας
+ Η ουρά του ενεργού αναπαραγωγού θα αντικατασταθεί
+ Η εναλλαγή από έναν αναπαραγωγό σε άλλον, μπορεί να αντικαταστήσει την ουρά σας
Ζητήστε επιβεβαίωση πριν από την εκκαθάριση μιας ουράς
Τίποτα
Ανάμιξη
@@ -571,6 +569,76 @@
Κουμπί τρίτης ενέργειας
Κουμπί δεύτερης ενέργειας
Κουμπί πρώτης ενέργειας
- Κλιμάκωση της μικρογραφίας βίντεο που εμφανίζεται στην ειδοποίηση από 16:9 σε αναλογία διαστάσεων 1:1 (μπορεί να προκαλέσει στρεβλώσεις)
+ Κλιμάκωση της μικρογραφίας βίντεο που εμφανίζεται στην ειδοποίηση από 16:9 σε αναλογία διαστάσεων 1:1 (μπορεί να προκαλέσει παραμορφώσεις)
Κλιμάκωση μικρογραφίας σε αναλογία διαστάσεων 1:1
+ Φόρτωση
+ Πιστεύετε ότι η ροή φορτώνει πολύ αργά; Δοκιμάστε να ενεργοποιήσετε τη γρήγορη φόρτωση (από τις ρυθμίσεις ή το παρακάτω κουμπί).
+\n
+\nΤο NewPipe προσφέρει δύο στρατηγικές φόρτωσης:
+\n- Λήψη ολόκληρου του καναλιού της συνδρομής, η οποία είναι αργή αλλά πλήρης.
+\n- Χρήση ενός αποκλειστικού τελικού σημείου υπηρεσίας, η οποία είναι γρήγορη αλλά συνήθως όχι πλήρης.
+\n
+\nΤο YouTube είναι ένα παράδειγμα χρήσης της δεύτερης μεθόδου.
+\n
+\nΣυνεπώς επιλέγετε ανάλογα: ταχύτητα ή ακριβείς πληροφορίες.
+ Η ροή ανανεώθηκε: %s
+ Φόρτωση ροής…
+ Επεξεργασία ροής…
+
+ - %d επιλέχθηκε
+ - %d επιλέχθηκαν
+
+ Δεν φορτώθηκε: %d
+ Οι ομάδες του καναλιού
+
+ - %d ημέρα
+ - %d ημέρες
+
+
+ - %d ώρα
+ - %d ώρες
+
+
+ - %d λεπτό
+ - %d λεπτά
+
+
+ - %d δευτερόλεπτο
+ - %d δευτερόλεπτα
+
+ Λόγω περιορισμών του ExoPlayer, η διάρκεια αναζήτησης ορίστηκε στα %d δευτερόλεπτα
+ Ναι. Και τα μερικώς θεαθέντα βίντεο
+ Τα βίντεο που εθεάθησαν πριν και αφού προστέθηκαν στη λίστα αναπαραγωγής θα απομακρυνθούν
+\nΕίστε σίγουρος; Δεν μπορεί να αναιρεθεί!
+ Απομάκρυνση θεαθέντων βίντεο;
+ Απομάκρυνση όσων θεάθησαν
+ Γλώσσα εφαρμογής
+ Επιλογή μιας instance
+ Διαγράφηκαν %1$d λήψεις
+ Διαγραφή ληφθέντων αρχείων
+ Εκκαθάριση ιστορικού λήψεων
+ Ποτέ
+ Μόνο με Wi-Fi
+ Αυτόματη έναρξη αναπαραγωγής — %s
+ Τα αυθεντικά κείμενα των υπηρεσιών θα εμφανίζονται στα αντικείμενα ροής
+ Εμφάνιση διαρροών μνήμης
+ Αποσίγαση
+ Προστέθηκε στην ουρά
+ Προσθήκη στην ουρά
+ Πιο αγαπημένα
+ Παρακαλούμε ελέγξτε αν το πρόβλημα σας έχει ήδη αναφερθεί. Οι διπλές αναφορές μας στερούν το χρόνο που θα μπορούσαμε να διαθέσουμε για την επίλυση του προβλήματος.
+ Εκκαθάριση των cookies που αποθηκεύει η εφαρμογή όταν λύνετε ένα reCAPTCHA
+ Τα reCAPTCHA cookies εκκαθαρίστηκαν
+ Εκκαθάριση reCAPTCHA cookies
+ Το YouTube διαθέτει \"Περιορισμένη Λειτουργία\" η οποία κρύβει πιθανώς ακατάλληλο περιεχόμενο.
+ Εμφάνιση πιθανώς ακατάλληλου περιεχομένου (18+).
+ Το instance υπάρχει ήδη
+ Αδυναμία πιστοποίησης του instance
+ Προσθέστε την URL του instance
+ Προσθήκη instance
+ Βρείτε τα instances που σας αρέσουν στο %s
+ Επιλογή των αγαπημένων σας PeerTube instances
+ Εμφάνιση αυθεντικού παρελθόντος χρόνου στα αντικείμενα
+ PeerTube instances
+ Χρωματισμός ειδοποιήσεων
\ No newline at end of file
diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/app/src/main/res/values-en-rGB/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 7ecef1d5003..2172ec1576d 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -9,7 +9,7 @@
Elŝuti
Serĉi
Agordoj
- Ĉu vi signifis: %1$s\?
+ Ĉu vi signifis \"%1$s\"\?
Konigi kun
Elekti retumilon
turno
@@ -40,7 +40,7 @@
Ĉu instali la mankan aplikaĵon Kore\?
Montri la sekvan filmeton kaj similajn filmetojn
Ĉiuj bildetoj ne ŝargeblas
- La subskribo de la ligilo de la filmeto ne malĉifreblas
+ La subskribo de la ligilo de la filmeto ne malĉifreblas
La retejo ne analizeblas
Bildeto de la antaŭrigardo de la filmeto
Ludi filmeton, daŭro:
@@ -64,7 +64,8 @@
Signali eraron
Filmeto
Reprovi
- Premi \"Serĉi\" por komenci
+ Premi \"Serĉi\" por komenci
+\n
Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin).
Malfermi en ŝprucfenestran modon
Forigas aŭdon ĉe kelkaj rezolucioj
@@ -98,7 +99,6 @@
Ne povis konstrui la dosierujon de elŝuto
Nunaj filmetoj ne estas ankoraŭ subtenataj
Enhavo limigita al aĝo
- Montri limigitan al aĝo filmeto. Postaj ŝanĝoj eblas ĉe la agordoj.
Ne povis tute analizi la retejon
Ne povis akiri ajnan torenton
Nuna
@@ -151,7 +151,7 @@
Kiosko
Tendencoj
Supro 50
- Nova & varma
+ Nova kaj varma
Montri la indiko « Tenu por aldoni »
Montri indikon premante la fona aŭ la ŝprucfenestra butono en filmeta \"Detaloj:\"
Viciĝita en la fona ludilo
@@ -165,8 +165,6 @@
Sonaj parametroj
Teni por viciĝi
[Nekonata]
- Viciĝi en la fona ludilo
- Viciĝi en ŝprucfenestro
Komenci ludi en nova ŝprucfenestro
Preferata enhavlando
Ŝangi Orientiĝon
@@ -210,7 +208,10 @@
\n
\n1. Iru ĉe tiu retpaĝo: %1$s
\n2. Ensalutu kiam oni petas vin
-\n3. Elŝuto devus komenci (ĝi estas la dosiero de eksporto)
+\n3. Click on \"All data included\", then on \"Deselect all\", then select only \"subscriptions\" and click \"OK\"
+\n4. Click on \"Next step\" and then on \"Create export\"
+\n5. Click on the \"Download\" button after it appears and
+\n6. From the downloaded takeout zip extract the .json file (usually under \"YouTube and YouTube Music/subscriptions/subscriptions.json\") and import it here.
Importu Soundcloud-n profilon tajpante ĉu la ligilon, ĉu vian ID :
\n
\n1. Ebligu komputilon modon en retumilon (la retejo malhaveblas por poŝtelefonoj)
@@ -289,9 +290,9 @@
Ĉu vi volas forviŝi ĉiujn ludajn poziciojn \?
Ŝanĝu la elŝutojn dosierujojn por efekti
Pardonu, eraro okazis.
- Pardonu, kelkaj eraroj okazis.
+ Pardonon, io mizokasis.
Kio okazis:
- Kio:\\nPeto:\\nEnhavlingvo:\\nServo:\\nGMT Horo:\\nPako:\\nVersio:\\nOperaciumo versio:
+ Kio:\\nPeto:\\nEnhavlingvo:\\nEnhavlando:\\nAplingvo:\\nServo:\\nGMT Horo:\\nPako:\\nVersio:\\nOperaciumo versio:
Aŭdio
Permesi la konservadon unue
Uzantosignalo
@@ -439,7 +440,7 @@
Rifuzi
Neniu limo
Minimumigi dum la apo ŝanĝo
- Ago dum ŝanĝante al alia apo el la ĉefa filmetludilo—%s
+ Ago dum ŝanĝante al alia apo el la ĉefa filmetludilo — %s
Neniu
Minimumigi por ludi fone
Plirapidigi dum silentoj
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 86c8a890d21..6c4b687956c 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -10,7 +10,7 @@
Descargar
Buscar
Ajustes
- ¿Quiso decir \"%1$s\"\?
+ ¿Quiso decir «%1$s»\?
Compartir con
Elegir navegador
giro
@@ -18,13 +18,13 @@
Los archivos de vídeo descargados se almacenan aquí
Elija la carpeta de descarga para los archivos de vídeo
Cambie las carpetas de descarga para que surtan efecto
- Resolución predeterminada
+ Resolución predefinida
Reproducir con Kodi
- ¿Instalar la app Kore que falta\?
+ ¿Instalar la aplicación Kore que falta\?
Mostrar opción «Reproducir con Kodi»
Mostrar opción para reproducir vídeo a través del centro de medios Kodi
Audio
- Formato de audio predeterminado
+ Formato de audio predefinido
Descargar
No se admite el URL
Usar reproductor de vídeo externo
@@ -47,10 +47,10 @@
Error
Error de conexión
No se pudo cargar las miniaturas
- No se pudo descifrar la URL del vídeo
+ No se pudo descifrar la URL del vídeo
No se pudo analizar el sitio web
Mostrar vídeos \'Siguientes\' y \'Similares\'
- Idioma predeterminado del contenido
+ Idioma predefinido del contenido
Miniatura de previsualización del vídeo
Reproducir vídeo; duración:
Me gusta
@@ -58,11 +58,11 @@
Miniatura del avatar del usuario
Las transmisiones en vivo no son soportadas aún
Contenido
- Contenido restringido por edad
- Mostrar vídeo restringido por edad. Se pueden realizar cambios futuros desde los ajustes.
- Toque «Buscar» para empezar
+ Mostrar contenido con restricción de edad
+ Toque «Buscar» para empezar
+\n
Reproducción automática
- Reproducir un vídeo cuando NewPipe es llamado desde otra app
+ Reproducir un vídeo cuando NewPipe es llamado desde otra aplicación
En directo
Descargas
Descargas
@@ -71,7 +71,7 @@
No se pudo configurar el menú de descarga
No se pudo obtener ninguna transmisión
Lo siento, esto no debería haber ocurrido.
- Informar de este error vía email
+ Informar de este error vía correo electrónico
Lo siento, algo salió mal.
Informar
Información:
@@ -79,7 +79,7 @@
Su comentario (en Inglés):
Detalles:
Informar de un error
- Reporte de usuario
+ Informe de usuario
Vídeo
Audio
Reintentar
@@ -87,7 +87,7 @@
Iniciar
Pausar
Reproducir
- Eliminar
+ Borrar
Suma de comprobación
Misión nueva
Aceptar
@@ -101,9 +101,9 @@
Toque para ver detalles
Espere, por favor…
Copiado en el portapapeles
- Defina una carpeta de descargas más tarde en la configuración
+ Defina una carpeta de descargas más tarde en los ajustes
No se pudo cargar la imagen
- La interfaz de la app dejó de funcionar
+ La interfaz de la aplicación dejó de funcionar
Lo sucedido:\\nPetición:\\nIdioma del Contenido:\\nPaís del contenido:\\nIdioma de la aplicación:\\nServicio:\\nHora GMT:\\nPaquete:\\nVersión:\\nVersión del SO:
Negro
Todo
@@ -120,11 +120,11 @@
Reto reCAPTCHA requerido
Modo emergente
Reproduciendo en modo emergente
- Formato de vídeo predeterminado
+ Formato de vídeo predefinido
Desactivado
Mostrar resoluciones más altas
Sólo algunos dispositivos pueden reproducir vídeos en 2K / 4K
- Resolución predeterminada de emergente
+ Resolución predefinida de emergente
Segundo plano
Emergente
Filtro
@@ -134,11 +134,11 @@
Recordar el último tamaño y posición del reproductor emergente
Emergente
Redimensionando
- Elimina el audio en algunas resoluciones
+ Quita el audio en algunas resoluciones
Controles del reproductor por gestos
Usar gestos para controlar el brillo y volumen del reproductor
Sugerencias de búsqueda
- Mostrar sugerencias cuando esté buscando
+ Mostrar sugerencias al buscar
Mejor resolución
Acerca de NewPipe
Ajustes
@@ -159,7 +159,7 @@
Suscribirse
Suscrito
Canal no suscrito
- No se pudo cambiar la suscripción
+ No se puede cambiar la suscripción
No se pudo actualizar la suscripción
Principal
Suscripciones
@@ -207,8 +207,8 @@
- %s vídeo
- %s vídeos
- Se eliminó el elemento
- ¿Quiere eliminar este elemento del historial de búsquedas\?
+ Elemento borrado
+ ¿Quieres borrar este elemento del historial de búsquedas\?
Contenido de la página principal
Página en blanco
Página del quiosco
@@ -221,7 +221,7 @@
Quiosco
Tendencias
50 mejores
- Mostrar sugerencia cuando se presiona el botón de segundo plano o emergente en la página \"Detalles:\" del vídeo
+ Mostrar sugerencia al pulsar el botón de segundo plano o emergente en la página «Detalles:» del vídeo
En cola en el reproductor de 2.º plano
En cola en el reproductor emergente
Reproducir todo
@@ -230,22 +230,20 @@
Recuperándose del error del reproductor
Quitar
Detalles
- Configuración de audio
+ Ajustes del audio
[Desconocido]
- Añadir a cola en segundo plano
- Añadir al reproductor emergente
Comenzar a reproducir aquí
Comenzar a reproducir en segundo plano
Reproducir en modo emergente
- Mostrar consejo \"Mantener presionado para añadir\"
+ Mostrar consejo «Mantener pulsado para añadir»
Nuevo y lo mejor
- Mantener presionado para agregar a la cola
+ Mantener pulsado para añadir a la cola
Donar
NewPipe es desarrollado por voluntarios que emplean su tiempo libre para brindarle la mejor experiencia. Haga una aportación para ayudarlos a crear un NewPipe mejor mientras disfrutan de una taza de café.
Dar de vuelta
Sitio web
Visite el sitio web de NewPipe para más información y noticias.
- País predeterminado del contenido
+ País predefinido del contenido
Alternar orientación
Cambiar a segundo plano
Cambiar a emergente
@@ -280,28 +278,28 @@
Añadir a
Arrastrar para reordenar
Crear
- Eliminar uno
- Eliminar todos
+ Borrar uno
+ Borrar todos
Descartar
Cambiar nombre
- ¿Quiere eliminar este elemento del historial de reproducciones\?
- ¿Confirma que quiere eliminar todos los elementos del historial\?
+ ¿Quieres borrar este elemento del historial de reproducciones\?
+ ¿Quieres borrar todos los elementos del historial\?
Última reproducción
Más reproducido
Preguntar siempre
Lista de reproducción nueva
- Eliminar
+ Borrar
Cambiar nombre
Nombre
Añadir a la lista de reproducción
Definir como miniatura de lista de reproducción
Marcar lista de reproducción
- Eliminar marcador
- ¿Quiere eliminar esta lista\?
+ Quitar marcador
+ ¿Quieres borrar esta lista\?
Lista de reproducción creada
Añadido a la lista de reproducción
Miniatura de lista de reproducción cambiada.
- No se pudo eliminar la lista de reproducción.
+ No se pudo borrar la lista de reproducción.
Algo aparecerá aquí pronto ;D
Sin subtítulos
Ajustar
@@ -309,15 +307,15 @@
Zoom
Depuración
Auto generados
- La monitorización de fugas de memoria puede causar que la app no responda cuando hay Heap Dump
- Reportar errores fuera del ciclo de duración
- Forzar reporte de excepciones no entregables de RX fuera del fragmento o del ciclo de actividad después del descarte
+ La monitorización de fugas de memoria puede causar que la aplicación no responda al realizar el volcado de memoria
+ Informar errores fuera del ciclo de duración
+ Forzar informe de excepciones no entregables de RX fuera del fragmento o del ciclo de actividad después del descarte
Usar búsqueda rápida e inexacta
La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión. Buscar de a 5, 15 o 25 segundos no funciona.
Poner en cola vídeo relacionado siguiente
Continuar reproducción sin repetir al añadir de forma automática un vídeo relacionado con el último visto
Archivo
- Archivo movido o eliminado
+ Archivo movido o borrado
La carpeta no existe
No existe tal archivo/origen del contenido
El archivo no existe o carece de los permisos para leer o escribir en él
@@ -338,11 +336,11 @@
\n1. Vaya a esta URL: %1$s
\n2. Inicie sesión cuando se le pida
\n3. Una descarga debería empezar (ese es el archivo de exportación)
- Importe un perfil de SoundCloud escribiendo la URL o su ID:
-\n
-\n1. Active el \"modo escritorio\" en un navegador web (el sitio no está disponible para dispositivos móviles)
-\n2. Vaya a esta URL: %1$s
-\n3. Inicie sesión cuando se le pida
+ Importe un perfil de SoundCloud escribiendo la URL o su ID:
+\n
+\n1. Active el «modo escritorio» en un navegador web (el sitio no está disponible para dispositivos móviles)
+\n2. Vaya a esta URL: %1$s
+\n3. Inicie sesión cuando se le pida
\n4. Copie la URL del perfil a la que fue redireccionado.
suID, soundcloud.com/suID
Observe que esta operación puede causar un uso intensivo de la red.
@@ -352,7 +350,7 @@
Desactivar para evitar la carga de miniaturas y ahorrar datos y memoria. Se vaciará la caché de imágenes en la memoria volátil y en el disco.
Se vació la caché de imágenes
Vaciar metadatos en memoria caché
- Eliminar todos los datos de páginas web en antememoria
+ Quitar todos los datos guardados de páginas web
Se vació la caché de metadatos
Controles de velocidad de reproducción
Tiempo
@@ -360,31 +358,31 @@
Desvincular (puede causar distorsión)
No hay streams disponibles para descargar
Acción de apertura preferida
- Acción predeterminada al abrir contenido: %s
+ Acción predefinida al abrir contenido: %s
No se encontró ninguna aplicación que reproduzca este archivo
Subtítulos
- Modificar la escala de texto de los subtítulos y los estilos de fondo. Requiere reiniciar la app para que surta efecto.
+ Modificar la escala de texto de los subtítulos y los estilos de fondo. Requiere reiniciar la aplicación para que surta efecto.
Vaciar historial de reproducciones
- Elimina el historial de contenido visto y posiciones de reproducción
- ¿Eliminar todo el historial de reproducciones\?
- Se eliminó el historial de reproducciones.
+ Borra el historial de contenido visto y posiciones de reproducción
+ ¿Borrar todo el historial de reproducciones\?
+ Historial de reproducciones borrado.
Vaciar historial de búsquedas
- Elimina el historial de palabras clave de búsqueda
- ¿Eliminar todo el historial de búsqueda\?
- Historial de búsquedas eliminado.
- Se eliminó 1 elemento.
+ Borra el historial de búsqueda de palabras clave
+ ¿Borrar todo el historial de búsqueda\?
+ Historial de búsquedas borrado.
+ Se ha borrado 1 elemento.
NewPipe es un software copyleft libre: puedes usarlo, estudiarlo, compartirlo y mejorarlo a voluntad. Específicamente, puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a tu elección) cualquier versión posterior.
- ¿Quiere importar también la configuración\?
+ ¿Quiere importar también los ajustes\?
Normativa de privacidad de NewPipe
El proyecto NewPipe toma su privacidad muy en serio. Por ello, la aplicación no recopila algún dato sin su consentimiento.
-\nLa normativa de privacidad de NewPipe explica en detalle qué datos se envían y almacenan cuando envía un informe de fallo.
+\nLa normativa de privacidad de NewPipe explica en detalle qué datos se envían y almacenan al enviar un informe de fallo.
Leer la normativa de privacidad
- Para cumplir con el Reglamento general europeo de protección de datos (GDPR), atraemos su atención sobre la política de privacidad de NewPipe. Por favor léase cuidadosamente.
+ Para cumplir con el «Reglamento general europeo de protección de datos (GDPR)», atraemos su atención sobre la política de privacidad de NewPipe. Por favor léase cuidadosamente.
\nDebe aceptarlo para enviarnos el informe de error.
Aceptar
Declinar
Sin límite
- Limitar la resolución cuando se usen datos móviles
+ Limitar la resolución al usar datos móviles
Minimizar al cambiar de aplicación
Acción de cambiar a otra aplicación desde el reproductor principal — %s
Ninguna
@@ -405,7 +403,7 @@
recuperando
Añadir a cola
Acción denegada por el sistema
- Se eliminó el archivo
+ Archivo borrado
Descarga fallida
Descarga finalizada
@@ -420,7 +418,7 @@
Hay una descarga pendiente con este nombre
Mostrar como grilla
Mostrar como lista
- ¿Quiere limpiar su historial de descargas o eliminar todos los ficheros descargados\?
+ ¿Quieres vaciar el historial de descargas o borrar todos los ficheros descargados\?
Detener
Intentos máximos
Cantidad máxima de intentos antes de cancelar la descarga
@@ -445,7 +443,7 @@
Falló el posprocesamiento
NewPipe se cerró mientras se trabajaba en el archivo
No hay suficiente espacio disponible en el dispositivo
- Se perdió el progreso porque el archivo fue eliminado
+ Se perdió el progreso porque el archivo fue borrado
Tiempo de espera excedido
No se puede recuperar esta descarga
Preguntar dónde descargar
@@ -468,15 +466,15 @@
Notificaciones de versiones nuevas de NewPipe
Almacenamiento externo no disponible
No es posible descargar a una tarjeta SD externa. \¿Restablecer la ubicación de la carpeta de descarga\?
- No se pudo leer las pestañas guardadas, se usarán las pestañas por defecto
- Restaurar valores por defecto
- ¿Quieres restaurar los valores por defecto\?
+ No se pudo leer las pestañas guardadas, se usarán las pestañas predefinidas
+ Restaurar valores predefinidos
+ ¿Quieres restaurar los valores predefinidos\?
Número de suscriptores no disponible
Qué pestañas aparecen en la página principal
Selección
Conferencias
Actualizaciones
- Mostrar una notificación para solicitar actualizar la aplicación cuando haya una nueva versión disponible
+ Mostrar una notificación para solicitar actualizar la aplicación al haber una nueva versión disponible
Modo de vista de lista
Automático
Cambiar vista
@@ -493,12 +491,12 @@
Posiciones en listas
Mostrar indicador de posición en listas de reproducción
Vaciar datos
- Se eliminaron las posiciones de reproducción.
- Eliminar posiciones de reproducción
- Elimina todas las posiciones de reproducción
- ¿Quiere eliminar todas las posiciones de reproducción\?
+ Posiciones de reproducción borradas.
+ Borrar posiciones de reproducción
+ Borra todas las posiciones de reproducción
+ ¿Quieres borrar todas las posiciones de reproducción\?
Activar/desactivar servicio, seleccionados actualmente:
- Quiosco predeterminado
+ Quiosco predefinido
Nadie está viendo
- %s viendo
@@ -514,30 +512,30 @@
Instancias de PeerTube
Selecciona tus instancias favoritas de PeerTube
Encuentra las instancias que te gusten en %s
- Agregar instancia
+ Añadir instancia
Ingresar URL de la instancia
No se pudo validar la instancia
Solo se admiten URL HTTPS
La instancia ya existe
Local
- Agregados recientemente
+ Añadidos recientemente
Más gustados
Generado automáticamente (no se encontró creador)
Elige una instancia
Limpiar historial de descargas
- Eliminar archivos descargados
- Eliminadas %1$d descargas
+ Borrar archivos descargados
+ Borradas %1$d descargas
Permitir mostrar sobre otras aplicaciones
Idioma de aplicación
- Predeterminado del sistema
- Pulse en «Hecho» cuando esté resuelto
+ Predefinido del sistema
+ Pulse en «Hecho» al resolverlo
Hecho
Vídeos
- %d segundo
- %d segundos
- Debido a limitaciones de ExoPlayer la duración de la búsqueda fue fijada en %d segundos
+ Debido a limitaciones de ExoPlayer, la duración de la búsqueda fue definida en %d segundos
Silenciar
Desactivar silencio
Ayuda
@@ -575,7 +573,7 @@
Disponible para algunos servicios, suele ser más rápido pero puede mostrar una cantidad limitada de ítems y a menudo información incompleta (por ejemplo falta de duración, tipo de ítem o estado).
Activar modo rápido
Desactivar modo rápido
- ¿Piensas que la carga de contenidos es muy lenta\? Entonces intenta habilitar la carga rápida (puedes cambiarlo en los ajustes o presionando el botón debajo).
+ ¿Piensas que la carga de contenidos es muy lenta\? Entonces intenta habilitar la carga rápida (puedes cambiarlo en los ajustes o pulsando el botón debajo).
\n
\nNewpipe ofrece dos formas de cargar los contenidos:
\n• Obtener todos los canales con suscripciones, lento pero completo.
@@ -596,25 +594,25 @@
Canciones
Este video tiene restricción por edades.
\n
-\nHabilita \"Contenido restringido por edades\" en los ajustes si quieres verlo.
+\nHabilita «%1$s» en los ajustes si quieres verlo.
Sí, y también videos vistos parcialmente
- Los videos que ya se hayan visto luego de agregados a la lista de reproducción, serán eliminados.
+ Los videos que ya se hayan visto luego de añadidos a la lista de reproducción, serán quitados.
\n¿Estás seguro\? ¡Esta acción no se puede deshacer!
- ¿Borrar videos ya vistos\?
- Borrar videos ya vistos
+ ¿Quitar videos ya vistos\?
+ Quitar videos ya vistos
Por %s
Creado por %s
Miniatura de avatar del canal
Los textos originales de los servicios serán visibles en los ítems de transmisiones
Mostrar tiempo atrás original en ítems
- Modo restringido de YouTube
+ Activar el «Modo restringido» de YouTube
Página de lista de reproducción
Mostrar sólo suscripciones desagrupadas
Sin marcadores de lista de reproducción aún
Seleccione una lista de reproducción
- Por favor revise si ya existe una discusión sobre su problema. Cuando se crean entradas duplicadas, toma tiempo de nosotros que podríamos usar para arreglar tal problema.
- Reportar en Github
- Copiar reporte con formato
+ Por favor revise si ya existe una discusión sobre su problema. Al crear entradas duplicadas, toma tiempo de nosotros que podríamos usar para arreglar tal problema.
+ Informar en Github
+ Copiar informe con formato
Mostrando resultados para: %s
Orden aleatorio
Escalar miniatura a relación de aspecto 1:1
@@ -627,7 +625,7 @@
Poner en cola
Cambiar de un reproductor a otro puede reemplazar la cola de reproducción
La cola de reproducción activa será reemplazada
- Pedir confirmación antes de eliminar una cola
+ Pedir confirmación antes de vaciar una cola
Nada
Almacenar en memoria (búfer)
Repetir
@@ -639,4 +637,12 @@
Botón de segunda acción
Botón de primera acción
Escalar la miniatura del vídeo mostrada en la notificación de relación de aspecto 16:9 a 1:1 (puede ocasionar distorsiones)
+ Vaciar las cookies que NewPipe guarda al resolver un reCAPTCHA
+ Mostrar contenido inapropiado para niños porque tiene un limite de edad (como 18+).
+ Mostrar pérdidas de memoria
+ Añadido a la cola
+ Añadir a la cola
+ Las cookies reCAPTCHA han sido limpiadas
+ Limpiar las cookies reCAPTCHA
+ YouTube provee un «Modo restringido», el cual oculta contenido potencialmente sólo apto para adultos.
\ No newline at end of file
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index f6c89020dd9..9f06f3fee16 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -101,7 +101,6 @@
Lisati hüpikpleieri järjekorda
Sisu
Vanusepiiranguga sisu
- Kuva vanusepiiranguga video. Sellist sisu saab lubada seadetes.
OTSE
Allalaadimised
Allalaadimised
@@ -143,7 +142,7 @@
Viga
Võrgu viga
Kõiki pisipilte ei õnnestunud laadida
- Video URLi dekrüptimine nurjus
+ Video URLi dekrüptimine nurjus
Veebilehe töötlemine nurjus
Veebilehe täielik töötlemine nurjus
Sisu pole saadaval
@@ -297,8 +296,6 @@
Üksikasjad
Heli seaded
Hoia järjekorda lisamiseks
- Lisa järjekorda taustal
- Lisa järjekorda uue hüpikaknaga
Alusta taasesitust siit
Alusta siit olles taustal
Alusta siit uue hüpikaknaga
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 14f68ece0e4..b45e75de916 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -26,7 +26,7 @@
Erakutsi \'hurrengo\' eta \'antzeko\' bideoak
URLak ez du euskarririk
Edukiaren hizkuntz lehenetsia
- Bideoa eta Audioa
+ Bideoa eta audioa
Bideoaren aurreikuspen argazkitxoa
Erreproduzitu bideoa, iraupena:
Igotzailearen abatarraren iruditxoa
@@ -39,7 +39,8 @@
Erabili kanpo bideo-erreproduzigailua
Erabili kanpo audio-erreproduzigailua
Atzeko planoan erreproduzitzen
- Sakatu \"Bilatu\" hasteko
+ \"Bilatu\" sakatu hasteko
+\n
Audioa deskargatzeko karpeta
Aukeratu audio fitxategiak deskargatzeko karpeta
Deskargatutako audio fitxategiak hemen gordetzen dira
@@ -69,8 +70,7 @@
Besteak
Laster-leiho moduan erreproduzitzen
Edukia
- Adinez mugatutako edukia
- Erakutsi adinez mugatutako bideoa. Ezarpenetan aldaketak egin daitezke gero.
+ Adinez mugatutako edukia erakutsi
Zuzenean
Deskargak
Deskargak
@@ -88,7 +88,7 @@
Errorea
Sare-errorea
Ezin izan dira iruditxo guztiak deskargatu
- Ezin izan da bideoaren URL sinadura deskodetu
+ Ezin izan da bideoaren URL sinadura deskodetu
Ezin izan da webgunea analizatu
Ezin izan da webgunea guztiz analizatu
Edukia ez dago eskuragarri
@@ -99,11 +99,11 @@
Aplikazioa/interfazea kraskatu da
Hori ez litzateke gertatu behar.
Eman errore honen berri e-posta bidez
- Erroreak gertatu dira.
+ Barkatu, zerbait gaizki atera da.
Salatu
Informazioa:
Zer gertatu da:
- Zer:\\nEskaria:\\nEdukiaren hizkuntza:\\nZerbitzua:\\nGMT Ordua:\\nPaketea:\\nBertsioa:\\nSE bertsioa:
+ Zer:\\nEskaria:\\nEdukiaren hizkuntza:\\nEdukiaren herrialdea:\\nAplikazioaren hizkuntza:\\nZerbitzua:\\nGMT Ordua:\\nPaketea:\\nBertsioa:\\nSE bertsioa:
Zure iruzkina (Ingelesez):
Xehetasunak:
Salatu errorea
@@ -178,7 +178,7 @@
NewPipe jakinarazpena
Erreproduzigailua
Portaera
- Historia eta cachea
+ Historia eta cache-a
Erreprodukzio-zerrenda
Desegin
Atzeko planoko eta laster-leihoko NewPipe erreproduzigailuen jakinarazpenak
@@ -245,11 +245,9 @@
Xehetasunak
Audio ezarpenak
Mantendu ilaran jartzeko
- Jarri ilaran bigarren planoan
- Jarri ilaran laster-leihoan
Hasi hemen erreproduzitzen
Hasi erreproduzitzen bigarren planoan
- Hasi erreproduzitzen laster-leihoan
+ Laster-leihoan erreproduzitzen hasi
Ireki tiradera
Itxi tiradera
Ez da jarioen erreproduzigailurik aurkitu (VLC instalatu dezakezu).
@@ -423,7 +421,7 @@
Sareta
Automatikoa
Aldatu ikuspegia
- NewPipe eguneraketa eskuragarri!
+ NewPipe-ren eguneraketa eskuragarri dago!
Sakatu deskargatzeko
Amaituta
Zain
@@ -593,5 +591,55 @@
Abestiak
Bideo hau adinez mugatua dago.
\n
-\nIkusi nahi baduzu, gaitu ezazu \"Adinez mugatutako edukia\" ezarpenetan.
+\nIkusi nahi baduzu, piztu ezazu \"%1$s\" ezarpenetan.
+ Egilea: %s
+ Erreprodukzio zerrendaren orria
+ %s-k sortua
+ Kanalaren avatar-earen miniatura
+ Erakutsi agrupatuta ez dauden harpidetzak bakarrik
+ Bai, partzialki ikusitako bideoak ere bai
+ Jada ikusi eta gero erreprodukzio zerrendara gehitu diren bideoak ezabatuak izango dira.
+\nJarraitu nahi duzu\? Ekintza hau ezin da desegin!
+ Ikusitako bideoak ezabatu\?
+ Ikusitako bideoak ezabatu
+ Inoiz ez
+ Bakarrik WiFi-arekin
+ Erreprodukzioa automatikoki hasi — %s
+ Erakutsi memoria galerak
+ Ilara erreproduzitu
+ Oraindik ez dago erreprodukzio-zerrenda laster-markarik
+ Playlist bat aukeratu
+ Mesedez, egiaztatu jada zure arazoarekin diskusiorik sortuta badagoen. Sarrera duplikatuak daudenean, arazoa ebazteko erabili dezakegun denbora galtzen ari gara.
+ Formatodun erreportea kopiatu
+ GitHub-en erreportatu
+ reCAPTCHA bat egiten duzunean NewPipe-k gordetzen dituen kookiak ezabatu
+ reCAPTCHA kookiak garbitu dira
+ Ezabatu reCAPTCHA-ren kookiak
+ Adinez mugatuta dagoen eta haurrentzako desegokia izan daitezkeen edukia erakutsi (+18 adibidez).
+ YouTube-ren \"Modu Murriztua\" helduentzako edukia izan daitekeen edukia ezkutatzen du.
+ Piztu YouTube-ren \"Modu Murriztua\"
+ Jakinarazpena
+ Ezin izan da URL-a ezagutu. Beste aplikazio batekin ireki\?
+ Auto-ilara
+ Erreprodukzio ilara aktiboa ordezkatuko da
+ Erreproduzitzaile batetik beste batera aldatzeak ilara ordezkatu dezake
+ Konfirmazioa eskatu ilaratik ezabatu baino lehenago
+ Ezer ez
+ Buffering
+ Aleatorio
+ Gehienez hiru ekintza aukera ditzakezu jakinarazpenean erakusteko!
+ Errepikatu
+ Bostgarren ekintzaren botoia
+ Laugarren ekintzaren botoia
+ Hirugarren ekintzaren botoia
+ Bigarren ekintzaren botoia
+ Lehenego ekintzaren botoia
+ Eskalatu jakinarazpenetan erakusten den bideo miniaturaren formatu-ratioa 16:9tik 1:1era (distortsioak sor ditzake)
+ Miniatura 1:1 formatu-ratiora eskalatu
+ %s bilaketaren erantzunak erakusten
+ Ilaran jarri da
+ Jarri ilaran
+ Zerbitzuen jatorrizko testuak transmisioko elementuetan ikusgai egongo dira
+ Erakutsi «orain dela» jatorrizko denbora elementuetan
+ Editatu beheko jakinarazpen ekintza bakoitza gainean sakatuz. Hautatu horietako hiru gehienez jakinarazpen trinkoan erakusteko eskuineko kontrol laukiak erabiliz.
\ No newline at end of file
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index eb6107c5244..4e4cc7a1d26 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -45,7 +45,6 @@
در حال پخش در پسزمینه
محتوا
محتوای محدود شده بر اساس سن
- نمایش ویدیوهای دارای محدودیت سنی. تغییرات آتی از طریق تنظیمات ممکن است.
زنده
بارگیریها
بارگیریها
@@ -53,7 +52,7 @@
خطا
خطای شبکه
نمیتوان تمام بندانگشتیها را بار کرد
- نمیتوان امضای نشانی اینترنتی ویدیو را رمزگشایی کرد
+ نمیتوان امضای نشانی اینترنتی ویدیو را رمزگشایی کرد
نمیتوان پایگاه وب را تجزیه کرد
نمیتوان پایگاه وب را به صورت کامل تجزیه کرد
محتوا در دسترس نیست
@@ -368,8 +367,6 @@
قرار دادن در صف پخش به صورت تصویر در تصویر
خطای عدم احیای پخشکننده رخ داد
در حال احیا از خطای پخشکننده
- در صف پخش پسزمینه قرار بده
- در صف پخش تصویر در تصویر قرار بده
شروع پخش در اینجا
شروع پخش در پسزمینه
شروع پخش در حالت تصویر در تصویر
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 656a8749475..e5fb71e5ff2 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -1,6 +1,7 @@
- Napauta hakua aloittaaksesi
+ Napauta hakua aloittaaksesi
+\n
%1$s näyttökertaa
Julkaistu %1$s
Ei löytynyt suoratoistosoitinta. Asennetaanko VLC\?
@@ -12,7 +13,7 @@
Lataus
Haku
Asetukset
- Tarkoititko \"%1$s\"\?
+ Tarkoititko ”%1$s”\?
Jaa
Valitse selain
kierto
@@ -44,7 +45,7 @@
Vain jotkin laitteet voivat toistaa 2K/4K-videota
Toista Kodissa
Asennetaanko puuttuva Kore-sovellus\?
- Näytä \"Toista Kodissa\"-vaihtoehto
+ Näytä ”Toista Kodissa”-vaihtoehto
Näyttää vaihtoehdon videon toistamiseen Kodi-mediasoittimessa
Ääni
Oletusääniformaatti
@@ -78,8 +79,7 @@
Toistaa taustalla
Toistetaan ponnahdusikkunatilassa
Sisältö
- Ikärajoitettu sisältö
- Ikärajoitettu video. Muuttaminen on mahdollista asetuksissa.
+ Näytä ikärajoitettu sisältö
Suora
Lataukset
Lataukset
@@ -101,7 +101,7 @@
Virhe
Verkkovirhe
Kaikkia esikatselukuvia ei voitu ladata
- Videon URL-allekirjoituksen salausta ei voitu purkaa
+ Videon URL-allekirjoituksen salausta ei voitu purkaa
Verkkosivua ei voitu jäsentää
Verkkosivua ei voitu täysin jäsentää
Sisältö ei ole saatavilla
@@ -234,8 +234,6 @@
Pidä pohjassa lisätäksesi jonoon
Näytä vihje soittolistaan lisäämiseksi
[Tuntematon]
- Lisää taustatoistojonoon
- Lisää ponnahdusikkunajonoon
Aloita toistaminen tässä
Aloita toisto taustalla
Aloita toisto ponnahdusikkunassa
@@ -362,11 +360,14 @@
Edellinen vienti
Tilauksia ei voitu tuoda
Tilauksia ei voitu viedä
- Tuo youtube-tilaukset lataamalla ensin tilauslistatiedostosi:
+ Tuo YouTube-tilaukset Google Takeoutista:
\n
\n1. Mene osoitteeseen: %1$s
-\n2. Kirjaudu sisään kun niin vaaditaan
-\n3. Latauksen pitäisi alkaa (se on se tiedosto)
+\n2. Kirjaudu sisään pyydettäessä
+\n3. Klikkaa \"Kaikki Youtube-data valittuna\", sitten \"Poista kaikki valinnat\", sitten ainoastaan \"tilaukset\" ja klikkaa \"OK\"
+\n4. Klikkaa \"Seuraava vaihe\" ja \"Luo vienti\"
+\n5. Klikkaa \"Lataa\" tämän ilmestyessä
+\n6. Ladatusta takeoutin zip-tiedostosta pura json-tiedosto (yleensä sijainnissa \"Youtube ja Youtube Musiikki/tilaukset/tilaukset.json\" ja tuo se tänne
Tuo SoundCloud-profiili kirjoittamalla joko osoite tai ID:si:
\n
\n1. Laita päälle työpöytämoodi selaimessasi (tai käytä tietokonetta, tämä sivu ei toimi mobiilisivuna)
@@ -409,7 +410,7 @@
Valinta
Mitkä välilehdet näytetään pääsivulla
Valmis
- Paina \"Valmis\", kun ratkaistu
+ Paina ”Valmis”, kun ratkaistu
∞ videota
100+ videota
@@ -442,8 +443,8 @@
Videot
Tämä video on ikärajoitettu.
\n
-\nSalli ikärajoitettu sisältö asetuksissa katsoaksesi.
- YouTuben rajoitettu tila
+\nSalli ”%1$s” asetuksissa katsoaksesi.
+ Ota käyttöön YouTuben ”Rajoitettu tila”
Päivitykset
Instanssi on jo olemassa
Vain HTTPS-URL:t ovat tuettuja
@@ -489,9 +490,9 @@
\n• Koko tilatun kanavan lataaminen, mikä on hidasta, mutta lataa syötteen kokonaisuudessaan.
\n• Erityisen palvelu-endpointin käyttö, mikä on nopeaa, mutta yleensä ei lataa syötettä kokonaisuudessaan.
\n
-\nNäiden kahden välinen ero on, että nopean lataamista tiedoista yleensä puuttuu esim. sisällön kesto tai tyyppi (ei voi erotella livevideoita ja tavallisia) tai se ei lataa kaikkea sisältöä.
+\nNäiden kahden välinen ero on, että nopean tavan lataamista tiedoista yleensä puuttuu esim. sisällön kesto tai tyyppi (ei voi erotella livevideoita ja tavallisia) tai se ei lataa kaikkea sisältöä.
\n
-\nYouTuve on esimerkki palvelusta, joka tarjoaa nopean tavan RSS-syötteen avulla.
+\nYouTube on esimerkki palvelusta, joka tarjoaa nopean tavan RSS-syötteen avulla.
\n
\nValinta riippuu siitä, mitä halutaan: nopeutta vai tarkkoja tietoja.
Oletuskioski
@@ -636,4 +637,14 @@
Ensimmäinen toimintopainike
Skaalaa ilmoituksessa näytettävä videon esikatselukuva kuvasuhteesta 16:9 kuvasuhteeseen 1:1 (saattaa aiheuttaa vääristymiä)
Skaalaa esikatselukuva 1:1-kuvasuhteeseen
+ Näytä muistivuodot
+ Lisätty jonoon
+ Lisää jonoon
+ Poista evästeet, jotka NewPipe tallentaa, kun ratkaiset reCAPTCHA:n
+ reCAPTCHA-evästeet on poistettu
+ Poista reCAPTCHA-evästeet
+ YouTube tarjoaa ”Rajoitetun tilan”, joka piilottaa aikuisviihdesisällön.
+ Näytä mahdollisesti lapsille sopimaton sisältö, jolla on ikäraja (esim. 18+).
+ Anna Androidin muokata ilmoituksen väriä esikatselukuvan päävärin mukaan (tämä ei ole mahdollista kaikilla laitteilla)
+ Käytä värejä ilmoituksessa
\ No newline at end of file
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 0b81689afee..70498ab9059 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -55,10 +55,10 @@
Contenu indisponible
Désolé, quelque chose s\'est mal passé.
Contenu
- Contenu avec limite d’âge
+ Afficher le contenu avec limite d’âge
En direct
Impossible de charger toutes les miniatures
- Impossible de déchiffrer la signature URL de la vidéo
+ Impossible de déchiffrer la signature URL de la vidéo
Impossible d’analyser complètement le site web
Les flux en direct ne sont pas encore pris en charge
Désolé, une erreur est survenue.
@@ -73,9 +73,9 @@
Audio
Réessayer
Veuillez d’abord accorder l’accès au stockage
- Appuyer sur \"Rechercher\" pour commencer
+ Appuyez sur la loupe pour commencer
+\n
Lecture automatique
- Affiche les vidéos soumises à une limite d’âge. Modifier cette option est possible depuis les paramètres.
Rapport utilisateur
Signaler
Impossible de configurer le menu de téléchargement
@@ -161,7 +161,7 @@
Lettres et chiffres
À propos de NewPipe
© %1$s par %2$s sous %3$s
- Que ce soit pour des idées de traductions, de changements de design, de nettoyage de code ou de gros changements de code, une aide est toujours la bienvenue. Plus on en fera, meilleur il deviendra !
+ Que ce soit pour des idées de traductions, de changements de design, de nettoyage de code ou de gros changements de code, une aide est toujours la bienvenue. Plus on en fera meilleur il sera !
Impossible de modifier l’abonnement
Impossible d’actualiser l’abonnement
Continuer la lecture après les interruptions (ex. : appels téléphoniques)
@@ -233,8 +233,6 @@
Sélectionner un kiosque
Kiosque
Maintenir pour mettre en liste de lecture
- Mettre en liste du lecteur en arrière-plan
- Mettre en liste d’une fenêtre flottante
Démarrer la lecture ici
Démarrer la lecture en arrière-plan
Démarrer la lecture dans une fenêtre flottante
@@ -317,7 +315,7 @@
Une erreur est survenue : %1$s
Supprimer un seul média
Quelque chose va bientôt apparaître ici ;D
- Télécharger le fichier de flux
+ Télécharger le flux
Ajouter automatiquement le flux suivant à la liste de lecture
Continue la liste de lecture (non répétitive) en ajoutant un flux lié
Débogage
@@ -336,11 +334,14 @@
Exportation précédente
Impossible d’importer les abonnements
Impossible d’exporter les abonnements
- Veuillez importer vos abonnements YouTube en téléchargeant le fichier d’exportation.
-\n
-\n1. Suivez ce lien : %1$s.
-\n2. Connectez-vous à votre compte.
-\n3. Un téléchargement va démarrer (celui du fichier d’exportation).
+ Importez vos abonnements YouTube depuis Google Takeout :
+\n
+\n1. Suivez ce lien : %1$s
+\n2. Connectez-vous à votre compte
+\n3. Cliquez sur \"Toutes les données Youtube sont incluses\", puis sur \"Tout désélectionner\", puis sélectionnez uniquement \"abonnements\" et cliquez sur \"OK\"
+\n4. Cliquez sur \"Étape suivante\" et ensuite sur \"Créer une exportation\"
+\n5. Cliquez sur le bouton \"Télécharger\" après qu\'il apparaisse et
+\n6. À partir du fichier zip téléchargé, extrayez le fichier .json (généralement sous \"YouTube et YouTube Music/subscriptions/subscriptions.json\") et importez-le ici.
Veuillez importer un profil SoundCloud en saisissant l’URL de votre profil ou votre identifiant.
\n
\n1. Activez le « mode bureau » dans votre navigateur Web (le site n’est pas disponible pour les appareils mobiles).
@@ -591,9 +592,9 @@
100+ vidéos
Artistes
Chansons
- Cette vidéo est bloquée à cause de la limite d\'âge.
+ Cette vidéo dispose d\'une limite d\'âge.
\n
-\nActivez « Contenu avec limite d\'âge » dans les paramètres, rubrique « Contenu » si vous voulez la voir.
+\nActivez « %1$s » dans les paramètres si vous voulez la voir.
Supprimer les vidéos vues
Oui, et des vidéos partiellement regardées
Les vidéos qui ont été regardées avant et après avoir été ajoutées à la liste de lecture seront supprimées.
@@ -604,7 +605,7 @@
Créé par %s
Les textes originaux des services vont être visibles dans les items
Afficher la date originelle sur les items
- Mode restreint de YouTube
+ Activer le « Mode restreint » de YouTube
Afficher les abonnements sans groupes uniquement
Page des listes de lecture
Aucune liste de lecture encore enregistrée
@@ -636,4 +637,14 @@
Premier bouton d\'action
Mettre à l\'échelle la miniature de la vidéo affichée dans la notification du format 16:9 au format 1:1 (peut provoquer des déformations)
Dimensionner la miniature au format 1:1
+ Afficher les fuites de mémoire
+ Ajouté à la file d\'attente
+ Ajouter à la file d\'attente
+ Effacer les cookies que NewPipe garde lorsque vous résolvez un reCAPTCHA
+ Les cookies reCAPTCHA ont été effacés
+ Effacer les cookies reCAPTCHA
+ YouTube dispose d\'un « Mode restreint » qui cache le contenu potentiellement inapproprié.
+ Le contenu de cette émission n\'est peut-être pas approprié pour les enfants à cause d\'une limite d\'âge (18 +).
+ Notification colorée
+ Demander à Android de personnaliser la couleur de la notification en fonction de la couleur principale de la miniature (noter que cela n’est pas disponible sur tous les appareils)
\ No newline at end of file
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 4f2f54c6720..56c3c51651c 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -101,7 +101,6 @@
Na cola do reprodutor popup
Contido
Contido restrinxido para certa idade
- Mostrar vídeo restrinxido por idade. Os cambios futuros son posibles na configuración.
En directo
Descargas
Descargas
@@ -148,7 +147,7 @@
Erro
Erro de rede
Non foi posíbel carregar todas as miniaturas
- Non foi posíbel descifrar a asinatura do vídeo
+ Non foi posíbel descifrar a asinatura do vídeo
Non foi posíbel procesar o sitio web
Non foi posíbel procesar o sitio web por completo
Contido non dispoñíbel
@@ -312,8 +311,6 @@
Detalles
Opcións de audio
Manteña para colocalo na cola
- Colocar na cola en segundo plano
- Executa nunha xanela emerxente
Comezar a reprodución aquí
Comezar a reproducir en segundo plano
Comezar reproducindo nunha xanela emerxente
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index 07a32bbaa60..2e51f4bd9e5 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -1,6 +1,7 @@
- יש ללחוץ על „חיפוש” כדי להתחיל
+ יש לגעת ב־„חיפוש” כדי להתחיל
+\n
%1$s צפיות
פורסם ב־%1$s
לא נמצאו נגני צפייה ישירה, להתקין את VLC\?
@@ -62,8 +63,7 @@
מתנגן ברקע
מתנגן בחלון צף
תוכן
- תוכן עם הגבלת גיל
- הצגת סרטונים עם הגבלת גיל. ניתן לשנות את זה בעתיד דרך ההגדרות.
+ הצגת תוכן עם הגבלת גיל
חי
הורדות
הורדות
@@ -80,7 +80,7 @@
שגיאה
שגיאת רשת
אין אפשרות לטעון את כל התמונות הממוזערות
- לא ניתן לפענח את חתימת כתובת הסרטון
+ לא ניתן לפענח את חתימת כתובת הסרטון
ניתוח האתר לא התאפשר
לא הייתה אפשרות לנתח את האתר לחלוטין
תוכן אינו זמין
@@ -245,8 +245,6 @@
פרטים
אפשרויות שמע
להחזיק כדי להוסיף לרשימת נגינה
- להוסיף לרשימת הנגינה ברקע
- הוספה לתור בנגן צף
להתחיל לנגן מכאן
להתחיל לנגן ברקע
להתחיל לנגן בנגן צף
@@ -321,10 +319,13 @@
לא ניתן לייבא את המינויים
לא ניתן לייצא את המינויים
כדי לייבא את רשימת המינויים שלך מ־YouTube עליך להוריד את קובץ הייצוא:
-\n
+\n
\n1. לעבור לכתובת הזו: %1$s
\n2. להיכנס אם נתבקשת
-\n3. ההורדה אמורה להתחיל (זה קובץ הייצוא)
+\n3. ללחוץ על „All data included”, ואז על „Deselect all”, לאחר מכן לבחור רק את „subscriptions” וללחוץ על „OK”
+\n4. ללחוץ על „Next step” ואז על „Create export”
+\n5. ללחוץ על כפתור ה־„Download” כשהוא מופיע ואז
+\n6. לחלץ את קובץ ה־.json מתוך ה־zip (בדרך כלל תחת „YouTube and YouTube Music/subscriptions/subscriptions.json”) ולייבא אותו כאן.
קצב
שימוש בחיפוש מהיר ולא מדויק
חיפוש גס מאפשר לנגן לחפש נקודת זמן מהר יותר, ברמת דיוק נמוכה יותר. חיפוש של 5, 15 או 25 שניות לא עובד עם ההגדרה הזאת.
@@ -613,7 +614,7 @@
שירים
סרטון זה מוגבל לצפייה מגיל מסוים.
\n
-\nיש להפעיל את „תוכן עם הגבלת גיל” בהגדרות כדי לצפות בו.
+\nיש להפעיל את „%1$s” בהגדרות כדי לצפות בו.
כן, לרבות סרטונים שהפסקתי באמצע
סרטונים שלאחר שצפית בהם מופיע לרשימת הנגינה יוסרו.
\nלהמשיך\? זאת פעולה בלתי הפיכה!
@@ -621,7 +622,7 @@
להסיר סרטונים שנצפו\?
הטקסט המקורי משירותים יופיע בפריטי התזרים
הצגת לפני כמה זמן מקורי על פריטים
- מצב מוגבל של YouTube
+ הפעלת „מצב מוגבל” של YouTube
מאת %s
נוצר ע״י %s
תמונה ממוזערת של הערוץ
@@ -656,4 +657,14 @@
כפתור פעולה שני
לשנות את יחס התצוגה הממוזערת שמופיעה בהתראות מיחס תצוגה של 16:9 ל־1:1 (עשוי לעוות את התמונה)
שינוי גודל התצוגה הממוזערת ליחס תצוגה 1:1
+ הצגת דליפות זיכרון
+ נוסף לתור
+ הוספה לתור
+ לנקות עוגיות שנשמרות על ידי NewPipe בעת פתרון reCAPTCHA
+ העוגיות של ה־reCAPTCHA נמחקו
+ פינוי עוגיות reCAPTCHA
+ פלטפורמת YouTube מספקת „מצב מוגבל” שמסתיר תוכן שעשוי להתאים למבוגרים בלבד.
+ הצגת תוכן שעלול להיות בלתי הולם לילדים עקב מגבלת גיל (כגון 18+).
+ לאפשר ל־Android להתאים את צבע ההתראה בהתאם לצבע העיקרי של התמונה הממוזערת (לא זמין בכל המכשירים)
+ צביעת ההתראה
\ No newline at end of file
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index c6d83e63d3d..86a111bcfd2 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -51,7 +51,8 @@
Item हटा दिया गया है
फ़िलहाल चर्चा में है
ऑडियो सेटिंग
- शुरू करने के लिए खोज चिह्न दबाएं
+ शुरू करने के लिए \"खोज\" चिह्न दबाएं
+\n
रद्द करें
क्या आप का मतलब %1$s है?
शेयर करें
@@ -107,7 +108,6 @@
पॉपअप प्लेयर की कतार पर
विषयवस्तु
उम्र प्रतिबंधित विषय वस्तु
- उम्र प्रतिबंदित विडियो है .इस प्रकार की विषयवस्तु को अनुमति देने के लिए सेटिंग से संभव है |
लाइव
डाउनलोड
डाउनलोड
@@ -131,7 +131,7 @@
त्रुटी
नेटवर्क में त्रुटी
सारे thumbnail(फोटो जो फ़ोन की मेमोरी में है ) भरे नहीं जा सकते
- विडियो के URL signature को decrypt नहीं कर सकते
+ विडियो के URL signature को decrypt नहीं कर सकते
इस website का निरंक्षण नहीं कर सकते
website का पूरी तरह से निरंक्षण नहीं हो सकता
विषय वस्तु उपलब्ध नहीं है
@@ -233,8 +233,6 @@
निकाले
विवरण
जोड़ने के लिए पकड़ें रहे
- पृष्टभूमि की कतार में लगाए
- नए पॉपअप कि कतार में लगाए
यंहा से चलाना शुरू करे
पृष्टभूमि में चलाना शुरू करे
पॉपअप में चलाना शुरू करे
@@ -503,4 +501,25 @@
- %s श्रोता
ऐप के पुनः आरंभ होने के बाद भाषा बदल जाएगी।
+ तेज मोड सक्षम करें
+ तेज मोड अक्षम करें
+ क्या आपको लगता है कि फीड लोडिंग बहुत धीमी है\? यदि ऐसा है, तो तेज़ लोडिंग को सक्षम करने का प्रयास करें (आप इसे सेटिंग्स में या नीचे दिए गए बटन को दबाकर बदल सकते हैं)।
+\n
+\nNewPipe दो फीड लोडिंग रणनीति प्रदान करता है:
+\n• संपूर्ण सदस्यता चैनल प्राप्त करना, जो धीमा है लेकिन पूरा होता है।
+\n• एक समर्पित सेवा के समापन बिंदु का उपयोग करना, जो तेज़ है लेकिन आमतौर पर पूरा नहीं होता है।
+\n
+\nदोनों के बीच अंतर यह है कि तेज वाली रणनीति में आमतौर पर कुछ जानकारी का अभाव होता है, जैसे कि आइटम की अवधि या प्रकार (लाइव वीडियो और सामान्य वीडियो के बीच अंतर पता नहीं लगा सकते हैं) और ऐसा भी हो सकता है कि ये कम आइटम दिखाए।
+\n
+\nYouTube उस सेवा का एक उदाहरण है जो RSS फ़ीड के साथ तेज़ विधि प्रदान करता है।
+\n
+\nतो आखिर में चुनाव आपकी पसंद पर है: गति या फिर सटीक जानकारी।
+ यह सामग्री फिलहाल NewPipe सपोर्ट नहीं करता है।
+\n
+\nइसे आशा से भविष्य के संस्करणों में सपोर्ट किया जायेगा।
+ चैनल का avatar थंबनेल
+ %s के द्वारा
+ %s के द्वारा बनाया गया
+ प्लेलिस्ट पृष्ठ
+ परिणाम दिखा रहे हैं : %s
\ No newline at end of file
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 6621d379af0..7ee165fafef 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -1,9 +1,10 @@
- Dodirnite pretragu za početak
+ Dodirnite pretragu za početak
+\n
%1$s pregleda
Objavljeno %1$s
- Reproduktor za stream nije pronađen. Želite li instalirati VLC?
+ Reproduktor za stream nije pronađen. Instalirati VLC\?
Instaliraj
Poništi
Otvori u pregledniku
@@ -12,7 +13,7 @@
Preuzimanje
Pretraživanje
Postavke
- Jeste li mislili: %1$s\?
+ Jeste li mislili „%1$s”\?
Podijeli putem
Izaberi pretraživač
rotacija
@@ -52,32 +53,31 @@
Tema
Svijetla
Tamna
- Crno
+ Crna
Zapamti veličinu i poziciju skočnog prozora
Zapamti posljednju veličinu i poziciju skočnog prozora
Kontroliranje reproduktora gestama
Koristi geste za kontrolu svjetline i glasnoće reproduktora
- Sugestije pri traženju
+ Prijedlozi pri traženju
Prikaži prijedloge pri traženju
Povijest pretraživanja
Svaku pretragu spremi lokalno
Prati povijest
- Pratite pogledane videozapise
+ Spremaj povijest gledanja
Nastavi reprodukciju
Nastavi reproducirati nakon prekidanja (npr. telefonski pozivi)
Preuzmi
Prikaži \'Sljedeće\' i \'Slične\' videozapise
URL nije podržan
Zadani jezik sadržaja
- Video i zvuk
+ Video i audio
Skočni prozor
Izgled
Drugo
Reprodukcija u pozadini
- Reproduciram u skočnom prozoru
+ Reprodukcija u skočnom prozoru
Sadržaj
- Prikaži eksplicitni sadržaj
- Videozapis je dobno ograničen. Dopuštanje takvog sadržaja moguće je u postavkama.
+ Prikaži dobno ograničeni sadržaj
Uživo
Preuzimanja
Preuzimanja
@@ -95,7 +95,7 @@
Greška
Greška u mreži
Nije moguće učitati sve ikone
- Nije moguće dešifrirati URL potpis videozapisa
+ Nije moguće dešifrirati URL potpis videozapisa
Nije moguće dohvatiti stranicu
Nije moguće u potpunosti dohvatiti stranicu
Sadržaj nije dostupan
@@ -106,11 +106,11 @@
Aplikacija/UI se srušio
Oprostite, ovo se nije trebalo dogoditi.
Prijavi pogrešku putem e-maila
- Oprostite, neke greške su se dogodile.
+ Žao nam je, došlo je do neke greške.
Prijavi
Informacije:
Što se dogodilo:
- Što:\\nRequest:\\nContent Jezik:\\nService:\\nGMT Vrijeme:\\nPackage:\\nVersion:\\nOS version:
+ Što:\\nZahtijev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik programa:\\nUsluga:\\nGMT vrijeme:\\nPaket:\\nVerzija:\\nVerzija OS-a:
Vaš komentar (na engleskom):
Detalji:
Sličica pregleda videozapisa
@@ -123,11 +123,11 @@
Prijavi grešku
Korisničke prijave
Nije moguće napraviti direktorij za preuzimanje \'%1$s\'
- Napravljen direktorij za preuzimanje \'%1$s\'
+ Stvorena je mapa za preuzimanje „%1$s”
Videozapis
Zvuk
- Ponovno pokušaj
- Omogućite pristup pohrani prvo
+ Pokušaj ponovo
+ Najprije odobri pristup spremištu
tis.
mil
mlrd.
@@ -169,7 +169,7 @@
O
Doprinositelji
Licence
- Besplatna i lagana YouTube aplikacija za Android.
+ Besplatna i mala YouTube aplikacija za Android.
Pogledaj na GitHubu
Licenca za NewPipe
Ako imate ideja za prijevod, promjene u dizajnu, čišćenje koda ili neke veće promjene u kodu, pomoć je uvijek dobro došla. Što više radimo, to bolji postajemo!
@@ -186,8 +186,8 @@
Obavijesti za NewPipe pozadinske i skočne reproduktore
Reproduktor
Ponašanje
- Povijest & predmemorija
- Popis naslova
+ Povijest i predmemorija
+ Playlista
Poništi
Nema rezultata
Ovdje nema ništa osim cvrčaka
@@ -205,19 +205,19 @@
Nema videozapisa
- - %s video
- - %s videa
- - %s videa
+ - %s videozapis
+ - %s videozapisa
+ - %s videozapisa
Stavka je izbrisana
- U redu čekanja za reprod. u pozadini
+ Stavljeno u popis izvođenja playera u pozadini
Reproduciraj sve
Nije moguće reproducirati ovaj stream
Dogodila se neoporavljiva pogreška reproduktora
Oporavljanje od pogreške reproduktora
Prikaži savjet za držanje
Prikažite savjet kada je pritisnut gumb za pozadinsku ili skočnu reprodukciju na stranici detalja videozapisa
- U redu čekanja za skočnu reprodukciju
+ Stavljeno u popis izvođenja playera u skočnom prozoru
Želite li izbrisati ovu stavku iz povijesti pretraživanja?
Sadržaj
Prazna stranica
@@ -235,15 +235,13 @@
Ukloni
Detalji
Postavke zvuka
- Zadržite za dodavanje u red čekanja
+ Drži pritisnuto za dodavanje u popis izvođenja
[Nepoznato]
Doniraj
Web stranica
Ovdje započni reprodukciju
Započni reprodukciju u pozadini
- Dodaj na red čekanja u pozadini
- Dodaj na red u novom skočnom prozoru
- Započni reprodukciju u skočnom prozoru
+ Reproduciraj u skočnom prozoru
Otvori ladicu
Zatvori ladicu
Nešto će se uskoro pojaviti :D
@@ -253,32 +251,32 @@
Uvjek pitaj
Dohvaćam informacije…
Odabrani sadržaj se učitava
- Nova reprodukcijska lista
+ Nova playlista
Izbriši
Preimenuj
Ime
- Dodaj na reprodukcijsku listu
- Postavi kao sliku na listu
- Markirajte reprodukcijsku listu
- Odmarkirajte
- Želite li izbrisati listu?
- Reprodukcijska lista je kreirana
- Dodano na listu
- Slika liste se promjenila.
- Greška prilikom brisanja liste.
+ Dodaj u playlistu
+ Postavi kao minijaturu playliste
+ Zabilježi playlistu
+ Ukloni zabilješku
+ Izbrisati ovu playlistu\?
+ Playlista je stvorena
+ Dodano kao playlistu
+ Minijatura playliste se promijenila.
+ Greška prilikom brisanja playliste.
Bez naslova
Podesno
Ispuniti
Povećaj
Auto generirano
Monitoring curenja memorije može uzrokovati greške u radu aplikacije prilikom odlaganje gomile
- Izvijestite o pogreškama izvan životnog ciklusa
+ Izvijesti o krajevima životnog ciklusa
Prikaži informacije
- Označene Liste za reprodukciju
+ Zabilježene playliste
Dodaj u
Učitaj slike
Slikovna predmemorija obrisana
- Obriši predmemorijsku metupodataka
+ Izbriši metapodatke iz predmemorije
Usluga
Kanali
Playliste
@@ -293,7 +291,7 @@
Uvoz baze podataka
Izvoz baze podataka
Poništava vašu trenutnu povijest i pretplate
- Izvoz povijesti, pretplata i playlisti
+ Izvezi povijest, pretplate i playliste
Očisti povijest gledanja
Briše povijest reproduciranih streamova i pozicije reprodukcije
Obriši cijelu povijest gledanja\?
@@ -356,9 +354,9 @@
Ograniči rezoluciju tijekom korištenja mobilnih podataka
Nijedan
Reproduktor za stream nije pronađen (možete instalirati VLC za reprodukciju).
- Preuzmite datoteku za stream
+ Preuzmi datoteku streama
Koristi brzo netočno premotavanje
- Netočno premotavanje omogućava reproduktoru da premota na mjesto brže uz manju preciznost. Premotavanje od 5, 15 ili 25 sekundi s ovime nije moguće.
+ Netočno premotavanje omogućava reproduktoru da premota brže uz manju točnost. Premotavanje od 5, 15 ili 25 sekundi s ovime nije moguće.
Otkaži pretplatu
Nova kartica
Odaberi karticu
@@ -370,21 +368,21 @@
Vanjska pohrana nije dostupna
Ažuriranja
Prikažite obavijest kada je dostupna nova verzija aplikacije
- Lista
- Rešetka
+ Popis
+ Popločeno
Promijeni prikaz
- NewPipe dostupno ažuriranje!
+ Dostupna je nova verzija za NewPipe!
Dodirnite za preuzimanje
Preuzimanje nije uspjelo
- Preuzimanje gotovo
+ Preuzimanje je gotovo
Prikaži pogrešku
- Isključite kako biste spriječili učitavanje sličica, spremanje podataka i korištenja memorije. Promjene čiste predmemoriju i predmemoriju slika.
- Uklonite sve podatke iz privremenih web-stranica
+ Isključi, kako bi se spriječilo učitavanje sličica, spremanje podataka i korištenje memorije. Promjene prazne radnu i trajnu predmemoriju slika.
+ Izbriši sve podatke web-stranica iz predmemorije
Metapodaci su izbrisani
- Automatski dodaj u red sljedeće strujanje
- Automatsko dodavanje povezanog videozapisa tijekom reprodukcije posljednjeg videozapisa u neponavljajućem redu
+ Automatski dodaj sljedeći stream u popisa izvođenja
+ Nastavi završavati (ne ponavljajući) popis izvođenja dodavanjem povezanog streama
Kontrola glasnoće pomoću gesti
- Koristi gesture za kontrolu glasnoće
+ Koristi geste za kontrolu glasnoće
Kontrola svjetline pomoću gesti
Koristi gesture za kontrolu svjetline
Zadana zemlja sadržaja
@@ -394,11 +392,11 @@
Preuzimanje na vanjsku SD karticu nije moguće. Ponovo postaviti lokaciju mape za preuzimanje\?
Vanjski playeri ne podržavaju ove vrste veza
Nije pronađen nijedan videozapis
- Nije pronađen nijedan zvuk
+ Nije pronađen nijedan audio zapis
Nema takve datoteke/izvora sadržaja
Datoteka ne postoji ili joj nedostaje dopuštenje za čitanje ili pisanje
- Nema dostupnih videozapisa za preuzimanje
- Pomoću zadanih kartica pojavljuje se pogreška prilikom čitanja spremljenih kartica
+ Nema dostupnih zapisa za preuzimanje
+ Neuspjelo čitanje spremljenih kartica, stoga se koriste zadane
Vratiti zadane
Želite li vratiti zadane postavke\?
Broj pretplatnika nije dostupan
@@ -419,26 +417,26 @@
\n4. Kopirajte URL profila na koji ste preusmjereni.
brzina
Visina tona
- Prekini vezu (može uzrokovati izobličenje)
- Minimiziraj prilikom mjenjanje aplikacija
- Radnja prilikom prebacivanja na drugu aplikaciju iz glavnog videoplayer-a — %s
- Minimiziraj na pozadinski player
- Minimiziraj na skočni player
+ Odspoji (može prouzročiti izobličenje)
+ Smanji prilikom mijenjanje aplikacije
+ Radnja prilikom prebacivanja na drugu aplikaciju iz glavnog videoplayera – %s
+ Smanji na pozadinski player
+ Smanji na skočni player
Način prikaza popisa
Automatski
Gotovo
Na čekanju
pauzirano
- Na redu za čekanje
+ stavljeno u popis izvođenja
naknadna obrada
- Red
+ Popis izvođenja
Sustav je odbio radnju
%s preuzimanja dovršeno
Generirajte jedinstveni naziv
- Piši preko
+ Prepiši
Datoteka s tim nazivom već postoji
Preuzeta datoteka s tim nazivom već postoji
- U tijeku je preuzimanje s ovim nazivom
+ Datoteka s ovim nazivom se već preuzima
Kod
Odredišnu mapu nije moguće stvoriti
Datoteku nije moguće stvoriti
@@ -454,9 +452,9 @@
Maksimalnih ponovnih pokušaja
Maksimalni broj pokušaja prije poništavanja preuzimanja
Prekini na mrežama s ograničenim prometom
- Preuzimanja koja se ne mogu zaustaviti ponovno će se pokrenuti
+ Korisno pri prelasku na mobilne podatke, iako se neka preuzimanja ne mogu obustaviti
Prikaži komentare
- Onemogućite da biste prestali prikazivati komentare
+ Isključi, kako bi se komentari sakrili
Automatska reprodukcija
Nema komentara
Komentare nije moguće učitati
@@ -464,7 +462,8 @@
NewPipe je copyleft libre software: možete ga koristiti, proučavati i poboljšavati po volji. Konkretno, možete ga redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila Free Software Foundation, bilo verzije 3 Licence, ili (po vašem izboru) bilo koje kasnije verzije.
Projekt NewPipe ozbiljno shvaća vašu privatnost. Stoga aplikacija ne prikuplja nikakve podatke bez vašeg pristanka.
\nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i pohranjuju kada šaljete izvješće o padu aplikacije.
- Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), upozoravamo vas na politiku privatnosti tvrtke NewPipe. Pažljivo ga pročitajte. Morate ga prihvatiti da nam pošaljete izvješća o pogreškama.
+ Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), upozoravamo vas na politiku privatnosti tvrtke NewPipe. Pažljivo ga pročitajte.
+\nZa slanje izvješća o pogreškama potrebno je prihvatiti politiku privatnosti.
Nastavi reprodukciju
Vrati zadnji položaj reprodukcije
Pozicije na popisima
@@ -472,7 +471,7 @@
Obriši podatke
Pozicije reprodukcije su izbrisane.
Datoteka je premještena ili izbrisana
- U tijeku je preuzimanje s ovim nazivom
+ Datoteka s ovim nazivom već čeka na preuzimanje
Vrijeme povezanosti je isteklo
Želite li očistiti povijest preuzimanja ili izbrisati sve preuzete datoteke\?
Započni preuzimanja
@@ -482,13 +481,13 @@
Obriši sve pozicije reprodukcije
Obriši sve pozicije reprodukcije\?
Nitko ne gleda
- NItko ne sluša
+ Nitko ne sluša
Jezik će se promjeniti nakon ponovnog pokretanja aplikacije.
Zadani Kiosk
Podržani su samo HTTP URL-ovi
Lokalno
Nedavno dodano
- Automatski generirano (nije pronađen nijedan autor)
+ Automatski generirana (nije pronađen nijedan autor)
Očisti povijest preuzimanja
Izbriši preuzete datoteke
Obrisano %1$d preuzimanja
@@ -515,4 +514,125 @@
Umjetnici
Albumi
Pjesme
+ Napravio %s
+ Obavijest
+ Nikada
+ Ograniči popis preuzimanja
+ Koristi SAF
+ Ukloni pregledano
+ Ukloni pogledane videozapise\?
+
+ - %d sekunda
+ - %d sekundi
+ - %d sekundi
+
+
+ - %d minutu
+ - %d minuta
+ - %d minuta
+
+
+ - %d dan
+ - %d dana
+ - %d dana
+
+
+ - %d sat
+ - %d sati
+ - %d sati
+
+ Nije učitano: %d
+ Nije odabrana nijedna pretplata
+ Odaberi pretplate
+ Gumb pete radnje
+ Gumb četvrte radnje
+ Gumb treće radnje
+ Gumb druge radnje
+ Gumb prve radnje
+ Promijenite mape za preuzimanje kako bi stupile na snagu
+ Prikazuju se rezultati za: %s
+ Nije moguće prepoznati URL. Želite li otvoriti u drugoj aplikaciji\?
+ Promijeni omjer minijature na 1:1
+ Učitavanje u predmemoriju
+ Istovremeno se pokreće jedno preuzimanje
+ Dodano u popis izvođenja
+ Dodaj u popis izvođenja
+ Popis izvođenja
+ Automatski popis izvođenja
+ Popis izvođenja aktivnog playera će se zamijeniti
+ Prebacivanje s jednog playera na drugi može zamijeniti popisa izvođenja
+ Pitaj prije pražnjenja popisa izvođenja
+
+ - %s slušatelj
+ - %s slušatelja
+ - %s slušatelja
+
+ nije moguće prepisati datoteku
+ Promijeni omjer prikazane minijature videa u obavijesti iz 16:9 na 1:1 (može prouzročiti izobličenja)
+ U kompaktnom prikazu obavijesti mogu se odabrati najviše 3 radnje!
+ Od %s
+ Minijatura avatara kanala
+ Dohvati iz određenog feeda kad je dostupno
+ Vrijeme nakon zadnjeg aktualiziranja prije nego što se pretplata smatra zastarjelom – %s
+ Prag aktualiziranja feedova
+ Feed
+ Prikaži samo negrupirane pretplate
+ Prazno ime grupe
+
+ - %d odabrani
+ - %d odabrana
+ - %d odabranih
+
+ Obrada feeda …
+ Zadnje aktualiziranje feeda: %s
+ Grupe kanala
+ Da, i djelomično pogledane videozapise
+ Odaberi primjerak
+ Program će te pitati kamo spremati preuzimanja.
+\nOdaberi SAF, ako želiš preuzeti na vanjsku SD karticu
+ Program će te pitati kamo spremati preuzimanja
+ Nije moguće obnoviti ovo preuzimanje
+ Napredak je izgubljen, jer je datoteka izbrisana
+ NewPipe se zatvorio tijekom rada s datotekom
+ Stranica playliste
+ Videzapisi koji su gledani prije i nakon dodavanja u playlistu će se ukloniti.
+\nStvarno ih želiš ukloniti\? Ovo je nepovratna radnja!
+ Još nema zabilježenih playlista
+ Odaberi playlistu
+ obnavljanje
+ Samo na Wi-Fi mreži
+ Pokreni automatski – %s
+ Prikaži curenje memorije
+
+ - %s gledatelj
+ - %s gledatelja
+ - %s gledatelja
+
+ Uklj/Isklj uslugu, trenutačno odabrana:
+ Kopiraj formatirani izveštaj
+ Izbriši riješene reCAPTCHA kolačiće koje NewPipe sprema
+ reCAPTCHA kolačići su izbrisani
+ Izbriši reCAPTCHA kolačiće
+ Ovaj video je dobno ograničen.
+\n
+\nZa prikaz sadržaja uključi „%1$s” u postavkama.
+ YouTube nudi postavku „Ograničeni način rada”, čime se skriva sadržaj za odrasle.
+ Uključi YouTube postavku „Ograničeni način rada”
+ Prikaži sadržaj koji nije prikladan za određenu dob (kategorija 18).
+ Primjerak već postoji
+ Neuspjela provjera primjerka
+ Upiši URL primjerka
+ Dodaj primjerak
+ Pronađi omiljene primjerke na %s
+ Odaberi tvoje omiljene PeerTube primjerke
+ PeerTube primjerci
+ Vrijeme premotavanja prema naprijed ili natrag
+ Ništa
+ Promiješaj
+ Ponovi
+ Provjeri je li tvoj problem već postoji. Dupla pojava problema krade nam vrijeme koje bismo mogli utrošiti na ispravljanje same greške.
+ Za uređivanje obavijesti radnji, dodirni ih. Označi do tri radnje za kompaktni prikaz obavijesti.
+ Zbog ograničenja ExoPlayera, trajanje traženja postavljeno je na %d s
+ Neka Android prilagodi boju obavijesti prema glavnoj boji minijature (ovo nije dostupno na svim uređajima)
+ Oboji obavijest
\ No newline at end of file
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index cb1c4873e12..ee11cd5c20d 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -57,7 +57,6 @@
Ez egy élő közvetítés, amely még nem támogatott.
Automatikus lejátszás
Videók automatikus lejátszása, ha a NewPipe egy másik alkalmazásból lett indítva
- Korhatáros videó mutatása. Ennek a tartalomnak az engedélyezése a \"Beállítások\"-ban lehetséges.
ÉLŐ
JELENTÉS
Információ:
@@ -69,7 +68,7 @@
Hibajelentés e-mailben
A stream nem elérhető
Nem sikerült a letöltés menü beállítása
- Nem sikerült a videó URL aláírás azonosítása
+ Nem sikerült a videó URL aláírás azonosítása
Háttértárhoz való hozzáférés megtagadva
Újra
Hibajelentés
@@ -459,4 +458,5 @@
Összes lejátszási pozíció törlése
Lejátszási pozíciók törlése
Találatok a következőre: %s
+ Bélyegkép méretezése 1:1 arányra
\ No newline at end of file
diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml
index 421f1f74df3..f53cfccc101 100644
--- a/app/src/main/res/values-hy/strings.xml
+++ b/app/src/main/res/values-hy/strings.xml
@@ -54,4 +54,44 @@
Օգտագործել արտաքին աուդիո նվագարկիչ
Օգտագործել արտաքին դերակատար
Լողացող ռեժիմ NewPipe
+ Թարմացումներ
+ Միշտ թարմացնել
+
+ - %d նշված
+ - %d նշված
+
+ Նոր
+ Կայք
+ Մասին
+ Մասին
+ Ալիքներ
+ Ալիք
+ Ամենը
+ Ծանուցում
+ Տեսք
+ Թարմացումներ
+ Այլ
+ Դիտման պատմություն
+ Ֆայլը ջնջվեց
+ Ֆայլ
+ Երգեր
+ Այո
+ Որոնման պատմություն
+ Փակել
+
+ - %d օր
+ - %d օր
+
+
+ - %d ժամ
+ - %d ժամ
+
+
+ - %d վրկ
+ - %d վրկ
+
+
+ - %d րոպե
+ - %d րոպե
+
\ No newline at end of file
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 338f9e04401..f27c3520417 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -1,6 +1,7 @@
- Ketuk \"Cari\" untuk memulai
+ Ketuk \"Cari\" untuk memulai
+\n
%1$s ditonton
Dipublikasikan tanggal %1$s
Pasang
@@ -40,8 +41,7 @@
Lainnya
Memutar di latar belakang
Konten
- Konten yang dibatasi usia
- Tampilkan video yang dibatasi usia. Bisa diubah nanti dari pengaturan.
+ Tampilkan konten yang dibatasi usia
Galat jaringan
Tidak bisa memuat semua thumbnail
Apakah maksud anda \"%1$s\"\?
@@ -97,7 +97,7 @@
Disalin ke papan klip
Silakan pilih folder unduhan di pengaturan
Pemutar stream tidak ditemukan. Pasang VLC\?
- Tidak bisa dekripsi tanda tangan URL video
+ Tidak bisa dekripsi tanda tangan URL video
App/UI rusak
Tidak bisa mendapatkan stream apapun
Apa:\\nPermintaan:\\nBahasa Konten:\\nNegara Konten:\\nBahasa Apl:\\nLayanan:\\nWaktu GMT:\\nPaket:\\nVersi:\\nVersi OS:
@@ -107,7 +107,7 @@
Meminta kode reCAPTCHA
Hitam
Semua
- Channel
+ Kanal
r
J
T
@@ -160,8 +160,8 @@
Terlepas apakah anda memiliki ide untuk; terjemahan, perubahan desain, pembersihan kode, atau perubahan kode yang signifikan, segala bantuan akan selalu diterima. Semakin banyak akan semakin baik jadinya!
Baca lisensi
Kontribusi
- Subscribe
- Disubscribe
+ Melanggan
+ Berlanggan
Apa Yang Baru
Lanjutkan pemutaran
Melanjutkan pemutaran setelah interupsi (mis. panggilan telepon)
@@ -192,7 +192,7 @@
Debug
Diantrekan di pemutar latar belakang
Diantrekan di pemutar popup
- Koleksi
+ Daftar Putar
Urungkan
Putar Semua
Selalu
@@ -206,8 +206,8 @@
Alihkan ke Utama
Impor basis data
Ekspor basis data
- Timpa riwayat dan subscription anda saat ini
- Ekspor riwayat, subscription dan playlist
+ Timpa riwayat dan langganan anda saat ini
+ Ekspor riwayat, langganan dan daftar putar
Tidak bisa memutar stream ini
Telah terjadi galat pemutar yang tidak bisa dipulihkan
Memulihkan dari galat pemutar
@@ -223,9 +223,9 @@
Tidak ada hasil
Tidak ada apapun disini selain jangkrik
Geser untuk ubah urutan
- Tidak ada subscriber
+ Tidak ada pelanggan
- - %s subscribers
+ - %s pelanggan
Belum ditonton
@@ -250,14 +250,14 @@
Apakah Anda yakin ingin menghapus semua item dari riwayat\?
Terakhir Diputar
Sering Diputar
- Konten laman utama
- Laman Kosong
- Laman Kiosk
- Laman Subscription
+ Konten halaman utama
+ Halaman Kosong
+ Halaman Kiosk
+ Halaman Langganan
Laman Umpan
- Laman Channel
- Pilih channel
- Belum ada subscription channel
+ Halaman Kanal
+ Pilih kanal
+ Belum ada langganan kanal
Pilih kiosk
Diekspor
Diimpor
@@ -272,8 +272,6 @@
Detail
Pengaturan Audio
Tahan untuk mengantre
- Antre di latar belakang
- Antrekan di popup
Mulai putar di sini
Mulai putar di latar belakang
Mulai putar di popup
@@ -286,19 +284,19 @@
Selalu bertanya
Mendapatkan info…
Memuat konten yang diminta
- Playlist Baru
+ Daftar Putar Baru
Hapus
Ubah Nama
Nama
- Tambahkan Ke Playlist
- Atur sebagai Thumbnail Playlist
- Markah Playlist
+ Tambahkan Ke Daftar Putar
+ Atur sebagai Thumbnail Daftar Putar
+ Markah Daftar Putar
Hapus Markah
- Hapus playlist ini\?
- Playlist dibuat
- Diplaylist
- Thumbnail playlist diubah.
- Tidak bisa menghapus playlist.
+ Hapus daftar putar ini\?
+ Daftar putar dibuat
+ Terdaftar putar
+ Thumbnail daftar putar diubah.
+ Tidak bisa menghapus daftar putar.
Tanpa Teks
Pas
Isi
@@ -306,7 +304,7 @@
Otomatis dibuat
Pemutar stream tidak ditemukan (anda bisa memasang VLC untuk memutarnya).
Unduh berkas stream
- Tidak bisa merubah subscription
+ Tidak bisa mengubah langganan
Tampilkan info
Tambahkan Ke
Hapus riwayat tontonan
@@ -321,11 +319,11 @@
1 item dihapus.
Tidak ada aplikasi terpasang untuk memutar berkas ini
Ditonton
- Koleksi Playlist Anda
+ Daftar Putar
Putar otomatis streaming berikutnya
- Channel diunsubsrcribe
- Tidak bisa memperbarui subscription
- Subscription
+ Berhenti berlanggan kanal
+ Tidak bisa memperbarui langganan
+ Langganan
Gunakan tinjau cepat tak pasti
Memungkinkan pengguna memilih posisi waktu video dengan cepat tetapi dengan tingkat presisi yang rendah. Mencari 5, 15 atau 25 detik tidak berhasil dengan ini.
NewPipe adalah perangkat lunak libre copyleft: Anda bisa menggunakannya, mempelajarinya, berbagi, dan meningkatkannya. Secara khusus anda bisa mendistribusikan ulang dan/atau memodifikasinya dibawah syarat Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan anda) versi yang lebih baru.
@@ -345,13 +343,16 @@
Mengekspor…
Impor berkas
Ekspor sebelumnya
- Tidak bisa mengimpor subscription
- Tidak bisa mengekspor subscription
- Impor subscription YouTube dengan mengunduh berkas yang diekspor:
-\n
-\n1. Kunjungi URL ini: %1$s
-\n2. Masuk ketika ditanya
-\n3. Unduhan akan dimulai (itulah berkas ekspornya)
+ Tidak bisa mengimpor langganan
+ Tidak bisa mengekspor langganan
+ Impor langganan YouTube dari Google takeout:
+\n
+\n1. Buka URL ini: %1$s
+\n2. Masuk ketika ditanya
+\n3. Klik \"Semua data termasuk\", lalu pada \"Batal pilih semua\", lalu pilih hanya \"langganan\" dan klik \"OK\"
+\n4. Klik \"Langkah berikutnya\" dan kemudian pada \"Buat ekspor\"
+\n5. Klik tombol \"Unduh\" setelah muncul dan
+\n6. Dari download takeout zip ekstrak file .json (biasanya di bawah \"YouTube dan YouTube Music / subscriptions /subscriptions.json\") dan impor di sini.
Impor profil SoundCloud dengan mengetik URL atau ID anda:
\n
\n1. Aktifkan \"mode desktop\" di peramban web (situs tidak tersedia untuk perangkat seluler)
@@ -366,8 +367,8 @@
Tempo
Nada
Batalkan tautan (dapat menyebabkan distorsi)
- Channel
- Koleksi
+ Kanal
+ Daftar Putar
Trek
Pengguna
Kebijakan Privasi NewPipe
@@ -382,13 +383,13 @@
Setuju
Tolak
Tanpa batas
- Batasi resolusi saat menggunakan data seluler
+ Resolusi saat menggunakan data seluler
Minimalkan saat beralih apl
Tindakan ketika beralih ke apl lain dari pemutar video utama — %s
Nihil
Minimalkan ke pemutar latar belakang
Minimalkan ke pemutar popup
- Berhenti Subscribe
+ Berhenti Berlanggan
Tab Baru
Pilih Tab
Tema
@@ -406,7 +407,7 @@
Tidak bisa membaca tab yang disimpan, beralih menggunakan tab bawaan
Kembali ke awal
Apakah anda ingin mengembalikan ke bawaan\?
- Jumlah subscriber tidak tersedia
+ Jumlah pelanggan tidak tersedia
Tab apa yang ditampilkan di halaman utama
Pilihan
Konferensi
@@ -508,7 +509,7 @@
Hanya mendukung URL HTTPS
Situs sudah ada
Lokal
- Baru-baru ini ditambahkan
+ Baru ditambahkan
Disukai terbanyak
Dibuat otomatis (pengunggah tidak ditemukan)
memulihkan
@@ -539,13 +540,13 @@
- %d hari
- Grup channel
+ Grup kanal
Feed terakhir diperbarui: %s
Tidak dimuat: %d
Memuat feed…
Memproses feed…
- Pilih subscription
- Tidak ada subscription yang dipilih
+ Pilih langganan
+ Tidak ada langganan yang dipilih
- %d dipilih
@@ -553,9 +554,9 @@
Apakah anda ingin menghapus grup ini\?
Baru
Feed
- Threshold pembaruan feed
- Waktu setelah pembaruan terakhir sebelum subscription dianggap kedaluwarsa — %s
- Selalu diperbarui
+ Rentang pembaruan feed
+ Waktu setelah pembaruan terakhir sebelum langganan dianggap kedaluwarsa — %s
+ Selalu perbarui
Tersedia pada beberapa layanan, biasanya lebih cepat tetapi memperbarui lebih sedikit item dan sering kali dengan informasi yang tidak lengkap (mis. tanpa durasi, tanpa tipe item, tanpa status live).
Aktifkan mode cepat
Nonaktifkan mode cepat
@@ -569,7 +570,7 @@
Buang ditonton
Video ini dibatasi usia.
\n
-\nAktifkan \"Konten yang dibatasi usia\" di dalam pengaturan jika anda ingin melihatnya.
+\nAktifkan \"%1$s\" di dalam pengaturan jika anda ingin melihatnya.
Konten ini belum didukung oleh NewPipe.
\n
\nSemoga akan didukung pada versi berikutnya.
@@ -591,10 +592,10 @@
\nJadi pilihlah yang sesuai yang kamu inginkan: kecepatan atau kelengkapan informasi.
Teks asli dari layanan akan tampil pada item stream
Tampilkan waktu yang lalu sebenarnya pada item
- Mode terbatas Youtube
+ Tampilkan \"Mode Terbatas\" Youtube
Oleh %s
Dibuat oleh %s
- Thumbnail avatar channel
+ Thumbnail avatar kanal
Harap periksa apakah masalah yang sama sudah ada atau belum. Ketika laporan anda ternyata sudah ada, anda membuat kami menghabiskan waktu yang seharusnya bisa kami gunakan untuk meningkatkan aplikasi menjadi lebih baik.
Laporkan di GitHub
Salin laporan dengan format
@@ -626,4 +627,14 @@
Tombol tindakan pertama
Ubah ukuran thumbnail yang ditampilkan di notifikasi dari rasio aspek 16:9 ke 1:1 (mungkin terdistorsi)
Ubah ukuran thumbnail ke rasio aspek 1:1
+ Tampilkan kebocoran memori
+ Ditambahkan
+ Tambahkan
+ Hapus kuki yang disimpan oleh NewPipe saat anda memecahkan reCAPTCHA
+ Kuki reCAPTCHA telah dihapus
+ Hapus kuki reCAPTCHA
+ YouTube menyediakan \"Mode Terbatas\" yang menyembunyikan video konten dewasa.
+ Menampilkan konten yang mungkin tidak cocok untuk anak-anak karena memiliki batasan umur (seperti 18+).
+ Minta Android menyesuaikan warna notifikasi sesuai dengan warna utama di thumbnail (perhatikan bahwa ini tidak tersedia di semua perangkat)
+ Warnai notifikasi
\ No newline at end of file
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index d81a8837de7..8a4f0134efd 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -10,22 +10,22 @@
Scarica
Cerca
Impostazioni
- Forse cercavi \"%1$s\"\?
+ Forse cercavi «%1$s»\?
Condividi con
- Scegli Browser
+ Scegli browser
rotazione
- Cartella Video Scaricati
+ Cartella video scaricati
I video scaricati saranno salvati qui
Scegli la cartella per i video scaricati
- Risoluzione Predefinita
+ Risoluzione predefinita
Riproduci con Kodi
Installare l\'app Kore\?
- Mostra \"Riproduci con Kodi\"
+ Mostra «Riproduci con Kodi»
Mostra l\'opzione per riprodurre video tramite Kodi
Audio
Formato Audio Predefinito
Scarica
- Mostra video \"Prossimo\" e \"Simili\"
+ Mostra video «Prossimo» e «Simili»
URL non supportato
Lingua Predefinita per Contenuti
Video e Audio
@@ -36,9 +36,9 @@
Mi piace
Impossibile creare la cartella di download \'%1$s\'
Creata la cartella per i download \'%1$s\'
- Usa Lettore Video Esterno
- Usa Lettore Audio Esterno
- Cartella Audio Scaricati
+ Usa lettore video esterno
+ Usa lettore audio esterno
+ Cartella audio scaricati
Gli audio scaricati saranno salvati qui
Scegli la cartella per gli audio scaricati
Tema
@@ -50,7 +50,7 @@
Errore
Errore di connessione
Impossibile caricare tutte le copertine
- Impossibile decriptare la firma dell\'URL del video
+ Impossibile decriptare la firma dell\'URL del video
Contenuto non disponibile
Usa Tor
(Sperimentale) Forza il download tramite Tor per una maggiore riservatezza (lo streaming dei video non è ancora supportato).
@@ -58,10 +58,10 @@
Impossibile impostare il menu di download
I contenuti in diretta non sono ancora supportati
Contenuti
- Contenuti con Restrizioni di Età
- Mostra video con restrizioni di età. È possibile modificare questa opzione nelle Impostazioni.
- Tocca \"Cerca\" per iniziare
- Riproduzione Automatica
+ Mostra Contenuti con Restrizioni di Età
+ Tocca «Cerca» per iniziare
+\n
+ Riproduzione automatica
Riproduci i video quando NewPipe viene aperto da un\'altra app
Diretta
Impossibile analizzare completamente il sito web
@@ -115,14 +115,14 @@
Sì
Più tardi
Apri in modalità Popup
- Modalità Popup
+ Modalità popup
Riproduzione in modalità Popup
Disattivato
L\'audio potrebbe non essere disponibile per alcune risoluzioni
- In Sottofondo
+ In sottofondo
Popup
- Risoluzione Predefinita Popup
- Mostra Altre Risoluzioni
+ Risoluzione predefinita popup
+ Mostra altre risoluzioni
Solo alcuni dispositivi possono riprodurre video 2K/4K
Formato Video Predefinito
Ricorda Poprietà Popup
@@ -221,8 +221,8 @@
Tendenze
Top 50
Nuovi e Popolari
- Mostra suggerimento \"Tieni premuto per accodare\"
- Nei \"Dettagli\" dei video, mostra suggerimento alla pressione dei pulsanti per la riproduzione Popup o in Sottofondo
+ Mostra suggerimento «Tieni premuto per accodare»
+ Nei «Dettagli» dei video, mostra suggerimento alla pressione dei pulsanti per la riproduzione Popup o in Sottofondo
Accoda in Sottofondo
Accodato in Popup
Riproduci Tutto
@@ -234,8 +234,6 @@
Impostazioni Audio
Tenere premuto per accodare
[Sconosciuto]
- Accoda in Sottofondo
- Accoda in Popup
Inizia la riproduzione qui
Avvia in Sottofondo
Avvia in Popup
@@ -274,8 +272,8 @@
Attenzione: Impossibile importare tutti i file.
Questa operazione sostituirà le tue impostazioni attuali.
Scarica il video
- Mostra Informazioni
- Playlist Salvate
+ Mostra informazioni
+ Playlist salvate
Aggiungi a
Trascina per riordinare
Crea
@@ -308,8 +306,8 @@
A breve qualcosa apparirà qui ;D
Debug
Generato automaticamente
- Il monitoraggio delle perdite di memoria potrebbe causare la mancata risposta dell\'applicazione durante il dumping dell\'heap
- Segnala Errori \"Out-of-lifecycle\"
+ Il monitoraggio di memory leak potrebbe causare la mancata risposta dell\'applicazione durante il dumping dell\'heap
+ Segnala errori «fuori del ciclo di vita»
Forza la segnalazione di eccezioni Rx non consegnabili al di fuori del ciclo di vita dell\'attività dopo la chiusura
Usa Ricerca Rapida (Imprecisa)
Consente al lettore multimediale di spostarsi più velocemente, ma con precisione ridotta. Spostamenti di 5, 15 o 25 secondi non funzionano con questo.
@@ -331,16 +329,19 @@
Esportazione precedente
Impossibile importare le iscrizioni
Impossibile esportare le iscrizioni
- Importa le iscrizioni di YouTube scaricando il file d\'esportazione:
-\n
-\n1. Vai a questo URL: %1$s
-\n2. Accedi quando richiesto
-\n3. Il download del file d\'esportazione dovrebbe partire in automatico
- Importa un profilo SoundCloud inserendo l\'URL o il tuo ID:
-\n
-\n1. Abilitare la \"modalità desktop\" del browser (il sito non è disponibile per i dispositivi mobili)
-\n2. Aprire questo URL: %1$s
-\n3. Accedere quando richiesto
+ Importa le iscrizioni di YouTube scaricando il file d\'esportazione:
+\n
+\n1. Vai a questo URL: %1$s
+\n2. Accedi quando richiesto
+\n3. Premi \"Tutti i dati inclusi\", \"Deseleziona tutto\", seleziona solo \"iscrizioni\" e premi \"OK\"
+\n4. Premi \"Passaggio successivo\" e poi \"Crea esportazione\"
+\n5. Premi il pulsante \"Scarica\" quando compare
+\n6. Dall\'archivio ZIP scaricato, estrai il file JSON (solitamente in \"YouTube and YouTube Music/subscriptions/subscriptions.json\") e importalo qui.
+ Importa un profilo SoundCloud inserendo l\'URL o il tuo ID:
+\n
+\n1. Abilitare la «modalità desktop» del browser (il sito non è disponibile per i dispositivi mobili)
+\n2. Aprire questo URL: %1$s
+\n3. Accedere quando richiesto
\n4. Copiare l\'URL del profilo a cui si viene indirizzati.
iltuoID, soundcloud.com/iltuoid
Tieni presente che questa operazione può consumare una grande quantità di traffico dati.
@@ -486,7 +487,7 @@
Limita Coda Download
Ogni volta verrà chiesta la destinazione dei file.
\nScegli SAF se vuoi scaricare su una scheda SD esterna
- \"Storage Access Framework\" consente di salvare file su una memoria esterna.
+ Lo Storage Access Framework consente di salvare file su una memoria esterna.
\nAlcuni dispositivi non sono compatibili
Elimina posizioni di riproduzione
Elimina tutte le posizioni di riproduzione
@@ -527,7 +528,7 @@
Consentire la visualizzazione sopra altre applicazioni
Lingua Applicazione
Predefinita di Sistema
- Premere \"Fatto\" quando risolto
+ Premere «Fatto» quando risolto
Fatto
Video
@@ -593,13 +594,13 @@
Canzoni
Questo video ha restrizioni di età.
\n
-\nAttivare \"Contenuti con Restrizioni di Età\" nelle Impostazioni per poterlo vedere.
+\nAttivare «%1$s» nelle Impostazioni per poterlo vedere.
Sì, anche quelli visaualizzati parzialmente
Saranno rimossi gli elementi della playlist già visualizzati, sia precedenti che successivi.
\nSei sicuro\? L\'azione è irreversibile!
Rimuovere i gli elementi già visti\?
Rimuovi Elementi Visti
- Modalità con Restrizioni (YouTube)
+ Attiva la «Modalità con restrizioni» di YouTube
I testi originali dei servizi saranno visibili negli elementi video
Mostra i tempi originali degli elementi
Immagine del Canale
@@ -627,13 +628,23 @@
Azione Pulsante 4
Azione Pulsante 3
Azione Pulsante 2
- Azione Pulsante 1
+ Azione primo pulsante
Buffering
Nella notifica compatta è possibile visualizzare al massimo 3 azioni!
Casuale
Notifica
Niente
Ripeti
- Ridimensiona Copertina alla Proporzione 1:1
+ Ridimensiona copertina alla proporzione 1:1
Modifica la proporzione della copertina del video mostrata nella notifica da 16:9 a 1:1 (può introdurre distorsioni)
+ Mostra Memory Leak
+ Aggiunto alla coda
+ Accoda
+ Cancella i cookie che NewPipe memorizza quando si risolve un reCAPTCHA
+ Cookie reCAPTCHA puliti
+ Pulisci Cookie reCAPTCHA
+ Consente di usufruire della «Modalità con restrizioni» di YouTube, che esclude contenuti potenzialmente inappropriati per i minori.
+ Mostra contenuti che hanno un limite di età (es. 18+). Potrebbero essere inadatti ai bambini.
+ Lascia che Android modifichi il colore della notifica, secondo il colore principale della copertina (funzione non disponibile per tutti i dispositivi)
+ Colora Notifica
\ No newline at end of file
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 9449d614115..1375253bec7 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -2,33 +2,33 @@
%1$s に公開
動画プレイヤーが見つかりません。VLC をインストールしますか?
- 入手
+ インストール
キャンセル
ブラウザで開く
共有
- 保存
+ ダウンロード
検索
設定
- もしかして \"%1$s\" ですか?
+ もしかして: \"%1$s\"
共有
ブラウザを選択
回転
- 動画を保存する場所
+ 動画を保存するフォルダー
ダウンロードした動画をここに保存します
動画ファイルをダウンロードするフォルダーを選択して下さい
デフォルトの解像度
Kodi で再生
Kore をインストールしますか?
- \"Kodi で再生\" オプションを表示
+ 「Kodi で再生」オプションを表示
Kodi メディアセンター経由で動画を再生するための設定を表示します
音声
デフォルトの音声形式
- 保存
+ ダウンロード
「次の動画」と「関連動画」を表示
- URLは使用できません
- 優先言語
+ 対応していないURLです
+ デフォルトの言語
動画と音声
- %1$s ビュー
+ %1$s 再生
動画 プレビュー サムネイル
ビデオ再生、時間:
投稿者アイコンのサムネイル
@@ -45,21 +45,20 @@
外観
その他
ネットワークエラー
- 音声を保存する場所
+ 音声を保存するフォルダー
ダウンロードした音楽ファイルをここに保存します
音楽ファイルをダウンロードするフォルダーを選択して下さい
保存場所 \'%1$s\' を作成できません
保存場所 \'%1$s\' を作成しました
エラー
- 全てのサムネイルを読み込むことができません
- 動画のURLを復号できませんでした
- Webサイトを解析できませんでした
+ 全てのサムネイルを読み込めませんでした
+ 動画のURLを復号できませんでした
+ ウェブサイトを解析できませんでした
コンテンツが利用できません
保存メニューを設定できませんでした
生放送にはまだ対応していません
コンテンツ
- 年齢制限のあるコンテンツを表示する
- 年齢制限された動画を表示しています。設定から許可することができます。
+ 年齢制限のあるコンテンツを表示
ウェブサイトを完全には解析できませんでした
動画を取得できませんでした
申し訳ありません。発生すべきでものではありませんでした。
@@ -73,13 +72,14 @@
動画
音声
再試行
- 初めにストレージへのアクセスを許可する
+ ストレージへのアクセスを許可してください
自動再生
NewPipe が他のアプリから呼び出された時、動画を再生します。
不具合を報告
利用者レポートを送る
生放送
- 開始するには \"検索\" をタップ
+ 開始するには \"検索\" をタップ
+\n
開始
一時停止
再生
@@ -122,8 +122,8 @@
無効
デフォルトの動画形式
デフォルトのポップアップ解像度
- 高い解像度で表示
- 2K/4K ビデオの再生は一部のデバイスのみ再生できます
+ より高い解像度を表示
+ 一部のデバイスのみ2K/4K動画を再生できます
バックグラウンド
ポップアップ
フィルター
@@ -149,34 +149,34 @@
このアプリについて
貢献者
ライセンス
- Android 向けの自由で軽量なストリーミング。
+ Android 向けのフリーで軽量なストリーミング。
GitHub で表示
NewPipe のライセンス
翻訳、デザインの変更、コードの整理、動作の重いコードの変更など、アイデアをお持ちではありませんか?ヘルプはいつでも歓迎します。より良いものを一緒に作り上げましょう!
ライセンスを読む
貢献する
チャンネル登録
- チャンネル登録しました
+ 登録済み
チャンネル登録を解除しました
チャンネル登録を変更できません
チャンネル登録を更新できません
メイン
- 登録リスト
+ 登録チャンネル
新着
検索履歴
- 検索した履歴を記憶します
+ 検索履歴を記憶します
視聴履歴
再生した履歴を記憶します
再生の再開
電話などによる中断の後、再生を再開します
プレイヤー
- 動画の詳細ページで、\"バックグラウンド\" または \"ポップアップ\" ボタンが押されたときにヒントを表示する
+ 動画の詳細ページで、「バックグラウンド」または「ポップアップ」ボタンが押されたときにヒントを表示する
動作
履歴とキャッシュ
プレイリスト
元に戻す
すべて再生
- 通知
+ NewPipeの通知
[不明]
動画の再生ができませんでした
回復不能な再生エラーが発生しました
@@ -190,7 +190,7 @@
文字と数字
文字と数字と、多くの特殊文字
寄付
- NewPipe は、あなたに最高の体験を味わってもらうために、ボランティアが自分たちの時間を使って開発しています。開発者たちがコーヒーを飲みながら NewPipe を継続的に改良できるよう、あなたのご支援をお願いします。
+ NewPipe は、あなたに最高の体験を提供するために、ボランティアが自分たちの時間を使って開発しています。開発者たちがコーヒーを飲みながら NewPipe を継続的に改良できるよう、ご支援をお願いします。
Webサイト
NewPipe の詳しい情報や最新情報については、ウェブサイトをご覧ください。
履歴
@@ -198,14 +198,14 @@
再生履歴
履歴は無効になっています
履歴
- 履歴に何もありません
+ 履歴なし
履歴を削除しました
アイテムを削除しました
このアイテムを検索履歴から削除しますか?
メインページのコンテンツ
空白ページ
Kioskページ
- チャンネル登録ページ
+ 登録チャンネルページ
フィードページ
チャンネルページ
チャンネルを選択
@@ -249,13 +249,13 @@
コンテンツを読み込んでいます
動画ファイルをダウンロード
情報を表示
- プレイリスト
+ ブックマークしたプレイリスト
サムネイルを読み込む
画像キャッシュを消去しました
キャッシュを消去
- アプリ内のキャッシュをデータすべて削除します
+ アプリ内のキャッシュデータをすべて削除します
キャッシュが消去されました
- 関連動画を自動でキューに追加する
+ 次のを自動でキューに追加する
デバッグ
ファイル
動画が見つかりません
@@ -300,10 +300,10 @@
登録リストがエクスポートできませんでした
速度
音程
- バックグラウンド再生の順番待ちに追加
- ポップアップ再生の順番待ちに追加
+ バックグラウンド再生のキューに追加
+ ポップアップ再生のキューに追加
再生履歴を消去
- 再生したストリームの履歴と再生位置を削除します
+ 再生した動画の履歴と再生位置を削除します
再生履歴を削除しました。
検索履歴を消去
検索キーワードの履歴を削除します
@@ -318,17 +318,17 @@
プライバシーポリシーを確認
おおまかなシーク
おおまかなシークを使用することで精度が下がる代わりに高速にシークができます。5 秒、15 秒または 25 秒間隔のシークはできません。
- すべてのサムネイルの読み込みと保存を無効化します、このオプションを切り替えるとメモリおよびディスク上の画像キャッシュがクリアされます。
- キューに関連動画を追加し続けて、再生を続ける(リピートしない場合)
+ すべてのサムネイルの読み込みと保存を無効化します。このオプションを切り替えるとメモリおよびディスク上の画像キャッシュがクリアされます。
+ キューに関連動画を追加して再生を続ける
すべての再生履歴を削除しますか?
すべての検索履歴を削除しますか?
このファイル/コンテンツはありません
- - %s が登録しています
+ - %s人が登録しています
- 視聴なし
+ 再生なし
- - 視聴回数 %s 回
+ - 再生回数 %s再生
1 つのアイテムが削除されました。
支援する
@@ -336,19 +336,17 @@
\nNewPipe のプライバシー・ポリシーでは、クラッシュリポート送信時にどのような種類のデータが送信・記録されるかを詳細に説明しています。
NewPipe はコピーレフトなソフトウェアです。あなたは自由にそれを使用し、研究し、そして改善することができます。あなたは、GNU フリーソフトウェア財団が公開する GNU General Public ライセンス バージョン3以降の下に、自由に再配布・修正を行うことができます。
最終再生日時
- 最も再生した動画
+ 最も再生された動画
ズーム
プレイリスト
- 「長押しして追加」のヒントを表示する
+ 「長押しして追加」のヒントを表示
トラック
- NewPipe バックグラウンドおよびポップアップのプレイヤーの通知
+ NewPipeのバックグラウンドおよびポップアッププレイヤーの通知
新着と人気
長押ししてキューに追加
- バックグラウンドのキューに追加
- ポップアップのキューに追加
ポップアップで連続再生を開始
すぐにここに表示されます;D
- お好みの \'開く\' アクション
+ お好みの「開く」アクション
コンテンツを開くときのデフォルト動作 — %s
フィット
全画面
@@ -391,7 +389,7 @@
新しいタブ
タブを選択
アプリの更新
- 催し物
+ イベント
新しい NewPipe バージョンの通知
外部記憶装置は利用できません
既定値に戻す
@@ -418,7 +416,7 @@
操作がシステムによって拒否されました
ダウンロードに失敗しました
ダウンロードが完了しました
- %s 件のダウンロード終了
+ %s件のダウンロード終了
一意の名前を生成します
上書き
この名前のファイルは既に存在します
@@ -452,9 +450,9 @@
従量制課金ネットワークの割り込み
モバイルデータ通信に切り替える場合に便利ですが、一部のダウンロードは一時停止できません
コメントを表示
- 無効にするとコメントの表示を停止します
+ 無効にするとコメントを非表示にします
自動再生
- コメントはありません
+ コメントなし
コメントを読み込めませんでした
閉じる
接続タイムアウト
@@ -462,7 +460,7 @@
最後に再生した位置を復元します
リスト内の位置
リストに再生位置インジケーターを表示します
- データをクリア
+ データを削除
再生位置を削除しました。
ファイルが移動または削除されました
ファイルを上書きできません
@@ -488,14 +486,14 @@
ダウンロードフォルダーを変更して有効にします
サービスの切り替え、現在の選択:
- - %s つの動画
+ - %s本の動画
- デフォルトのキオスク
+ デフォルトのKiosk
誰も見ていません
- - %s 視聴中
+ - %s人が視聴中
- 誰も聞いていません
+ 誰も聴いていません
- %s リスナー
@@ -503,11 +501,11 @@
高速早送り/巻き戻し時間
PeerTube インスタンス
PeerTube インスタンスを選択する
- あなたに最適なインスタンスを探せます: %s
+ あなたに最適なインスタンスを探す: %s
インスタンスを追加
インスタンスの URL を入力
インスタンスを検証することができませんでした
- HTTPS な URL のみがサポートされています
+ HTTPS の URL のみに対応しています
インスタンスはすでに存在しています
ローカル
最近追加された
@@ -558,8 +556,8 @@
フィードの更新間隔
最後の更新後、登録チャンネルを更新すべきとするまでの時間 ― %s
常に更新する
- 利用可能な場合は専用フィードから取得
- いくつかのサービスで利用可能、通常よりも高速ですが制限された情報が取得され、たいていの場合不完全です (例: 再生時間、種類、ライブ ステータスなどがない)。
+ 可能ならば専用フィードから取得
+ いくつかのサービスで利用可能。通常よりも高速ですが制限された情報が取得され、たいていの場合不完全です (例: 再生時間、種類、ライブ ステータスなどがない)。
高速モードを有効化
高速モードを無効化
フィードの読み込みが遅すぎると思いますか? その場合、高速読み込みを有効化してみてください (設定、もしくは下のボタンを押して変更することができます)。
@@ -583,7 +581,7 @@
アルバム
この動画には年齢制限があります。
\n
-\n閲覧したい場合、設定から \"年齢制限のあるコンテンツを表示する\" を有効化してください。
+\n閲覧したい場合、設定から \"%1$s\" を有効化してください。
プレイリストに追加される前も追加された後も視聴した動画はプレイリストから削除されます。
\nよろしいですか?この操作は元に戻せません!
はい、部分的に視聴した動画も削除します
@@ -591,7 +589,7 @@
視聴済みを削除
サービスのオリジナルのテキストが生放送に表示されます
アイテムに元の時間を表示
- YouTube 制限付きモード
+ YouTube 制限付きモードを有効化
%s による
%s により作成
チャンネルのサムネイル
@@ -621,9 +619,17 @@
3 番目のアクションボタン
2 番目のアクションボタン
1 番目のアクションボタン
- 何もない
+ なし
リピート
シャッフル
バッファリング
通知
+ YouTube は、成人向けの可能性があるコンテンツを除外する「制限付きモード」を提供しています。
+ 年齢制限のあるコンテンツを表示します。
+ キューに追加
+ キューに追加しました
+ reCAPTCHA を解いたときに NewPipe が保存した Cookie を消去します
+ reCAPTCHA の Cookie を消去
+ reCAPTCHA の Cookie が消去されました
+ メモリリークを表示
\ No newline at end of file
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 8d81f182a9b..e0fa9beccd2 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -55,11 +55,10 @@
NewPipe가 다른 앱에서 호출되었을 때 동영상을 재생합니다
컨텐츠
연령 제한 컨텐츠
- 연령 제한 비디오입니다. 설정 메뉴에서 시청 허용 여부를 변경하실 수 있습니다.
라이브
오류
모든 썸네일을 불러올 수 없습니다
- 비디오 URL 서명을 복호화할 수 없습니다
+ 비디오 URL 서명을 복호화할 수 없습니다
웹사이트를 가져올 수 없습니다
웹사이트를 완전히 가져올 수 없습니다
컨텐츠를 사용할 수 없습니다
@@ -88,7 +87,7 @@
체크섬
팝업 모드로 열기
일부 해상도에서 소리가 나지 않을 수 있습니다
- NewPipe 팝업 모드
+ 팝업 모드
구독
구독중
구독 취소됨
@@ -232,8 +231,6 @@
상세 정보
오디오 설정
눌러서 대기열에 추가
- 백그라운드 대기열에 추가
- 새 팝업으로 대기열에 추가
여기서부터 재생
백그라운드에서 재생
새 팝업에서 재생
@@ -547,4 +544,10 @@
아티스트
앨범
비디오
+ 첫번째 버튼
+ 알림에 표시되는 비디오 썸네일을 16:9에서 1:1 비율로 바꿉니다. (왜곡이 생길 수도 있습니다.)
+ 썸네일을 1:1 비율로 하기
+ %s에 대한 검색 결과
+ 셔플
+ 연속 재생
\ No newline at end of file
diff --git a/app/src/main/res/values-ks/strings.xml b/app/src/main/res/values-ks/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/app/src/main/res/values-ks/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml
index eee6f6bfed6..27219649bbd 100644
--- a/app/src/main/res/values-ku/strings.xml
+++ b/app/src/main/res/values-ku/strings.xml
@@ -6,22 +6,21 @@
هیچ كارپێكهرێكی ڤیدیۆیی نهدۆزرایهوه. دهتهوێت VLC دابمەزرێنیت؟
هیچ کارپێکەرێکی ڤیدیۆیی نەدۆزرایەوە (دەتوانی کارپێکەری VLC دامەزرێنی) .
دامەزراندن
- پاشگهزبوونهوه
+ پاشگهز
كردنهوه له وێبگهر
- كردنهوه له پهنجهرهی بچووک
- هاوبهشیکردن
- داگرتن
- داگرتنی پەڕگەی پەخش
+ كردنهوه له دۆخی پهنجهره
+ هاوبهشی
+ دابەزاندن
+ دابەزاندنی فایلی پەخش
گهڕان
ڕێكخستنهكان
- مەبەستت ئەمەیە:
-\n%1$s\?
- هاوبهشكردن لهگهڵ
+ مەبەستت \"%1$s\"؟
+ هاوبهشی لە
وێبگەرێک هەڵبژێرە
لاربوونەوە
- بهكارهێنانی كارپێكهری ڤیدیۆی دهرهكی
- دەنگ نامێنێت لەهەنێ قەبارەدا
- بهكارهێنانی كارپێكهری دهنگی دهرهكی
+ بهكارهێنانی لێدەری ڤیدیۆی دهرهكی
+ دەنگ لادەدات لەهەنێ قەبارەدا
+ بهكارهێنانی لێدەری دهنگی دهرهكی
دۆخی پهنجهره
بهشداربوون
بهشداربوویت
@@ -31,29 +30,29 @@
پیشاندانی زانیاری
سهرهكی
بهشدارییهكان
- لیستی تراکە نیشانەکراوەکان
+ لیستەتراکە نیشانەکراوەکان
چی نوێ ههیه
پاشبنەما
پهنجهره
زیادکردن بۆ
- فۆڵدەری داگرتنی ڤیدیۆ
- پەڕگەی ڤیدیۆ داگیراوەکان لێرەدا هەڵدەگیرێن
- فۆڵدەری داگرتن بۆ پەڕگەی ڤیدیۆکان هەڵبژێرە
- فۆڵدەری داگرتنی دهنگ
- پەڕگەی دەنگە داگیراوەکان لێرەدا هەڵدەگیرێن
- فۆڵدەری داگرتنی پەڕگە دەنگییەکان هەڵبژێرە
+ فۆڵدەری دابەزاندنی ڤیدیۆ
+ پەڕگەی ڤیدیۆ دابەزێنراوەکان لێرەدا هەڵدەگیرێن
+ فۆڵدەری دابەزاندن بۆ فایلە ڤیدیۆکان هەڵبژێرە
+ فۆڵدەری دابەزاندنی دهنگ
+ فایلی دەنگە دابەزێنراوەکان لێرەدا هەڵدەگیرێن
+ فۆڵدەری دابەزاندنی فایلە دەنگییەکان هەڵبژێرە
لێدانی خۆکار
- وردی بنەڕەتی
- ووردی بنەڕەتی پهنجهره
- پیشاندانی ووردی بهرزتر
+ قەبارەی بنەڕەت
+ قەبارەی بنەڕەتی پهنجهره
+ پیشاندانی قەبارەی بهرزتر
تەنها چەند مۆبایلێک پشتگیری کارپێکردنی ڤیدیۆی 2K/4K دەکەن
- كارپێكردن به Kodi
+ لێدان لە Kodi
ئەپەکە نهدۆزرایهوه. دابمهزرێت؟
- بژاردەی ”کارپێکردن بە Kodi“ پیشانبدرێت
+ بژاردەی ”لێدان بە Kodi“ پیشانبدرێت
پیشاندانی بژاردهی كارپێكردنی ڤیدیۆ به Kodi
دهنگ
- چەشنی بنەڕەتی دهنگ
- چەشنی بنەڕەتی ڤیدیۆ
+ جۆری بنەڕەتی دهنگ
+ جۆری بنەڕەتی ڤیدیۆ
ڕووكار
ڕۆشن
تاریک
@@ -64,8 +63,8 @@
ناچالاكی بكه بۆ ڕاگرتنی وێنۆچكهكان له باركردن و پاشهكهوتبوون لهسهر بیرگهی ئامێرهكهت.
\nگۆڕینی ئهمه دهبێته هۆی سڕینهوهیان لهسهر بیرگهی مۆبایلهكهت.
پاشماوهی وێنۆچكهكان سڕایهوه
- ڤیدیۆیەک کارپێئەکرێ کاتێ نیوپایپ لە ئەپێکیتر کرایەوە
- بەکارهێنانی بردنەپێشی ناوردی خێرا
+ ڤیدیۆیەک کارپێدەکات کاتێ نیوپایپ لە ئەپێکیتر کرایەوە
+ بەکارهێنانی گەڕانی ناوردی خێرا
خاوێنکردنەوەی پاشماوەی داتا
سڕینەوەی پاشماوەی هەموو داتاکان
پاشماوەی داتاکان سڕانەوە
@@ -78,16 +77,16 @@
مێژووی تەماشاکردن
هێشتنەوەی تراکی ڤیدیۆ کارپێکراوەکان
بەردەوام بوونی ڤیدیۆ لەدوای هەبوونی هەر بڕینێک (وەک پەیوەندی تەلەفۆنی)
- داگرتن
+ دابەزاندن
پیشاندانی ’دواتر’ و ڤیدیۆ ’هاوشێوەکان’
بەستەرەکە پشتگیری نەکراوە
- وڵاتی بنەڕەتی
+ ناوەڕۆکی وڵاتی بنەڕەتی
خزمەتگوزاری
کارپێکەر
- ڤیدیۆ & دەنگ
- مێژوو & پاشماوە
+ ڤیدیۆ و دەنگ
+ مێژوو و پاشماوە
پەنجەرە
- ڕووکار
+ دیمەن
هیتر
ڕاستکردنەوە
کارپێکردن لە پاشبنەما
@@ -96,26 +95,26 @@
ڕیزکرا لە کارپێکردن لە پەنجەرە
ناوەڕۆک
سنوردانانی تەمەن
- زیندوو
- داگرتنەکان
- داگرتنەکان
+ ڕاستەوخۆ
+ دابەزاندنەکان
+ دابەزاندنەکان
ناتوانرێ سکاڵابکرێ
گشتی
کەناڵ
- لیستی تراک
+ لیستی لێدان
بەڵێ
دواتر
- ناچالاککراوە
+ ناکارایە
پاڵاوتن
تازەکردنەوە
پاککردنەوە
قەبارە دانانەوە
- باشترین ووردی
+ باشترین قەبارە
گەڕانەوە
- لێدانی هەمووی
+ لێدانی گشتی
هەمیشە
تەنها ئێستا
- پەڕگە
+ فایل
ئاگانامەکانی ئەپ
ئاگانامەکانی ئەپ بۆ پاشبنەما و کارپێکردنەکانی پەنجەرە
(نەزانراو)
@@ -124,16 +123,16 @@
گۆڕین بۆ پەنجەرە
گۆڕین بۆ سەرەکی
هێنانەوەی بنکەی زانیاریەکان
- دەرکردنی بنکەی زانیارییەکان
+ پاشەکەوتکردنی بنکەی زانیارییەکان
لەسەر مێژوو و بەشداربووەکانی ئێستات جێگیردەبێت
- خەزنکردنی مێژوو و بەشداربوون و لیستەکان
+ پاشەکەوتکردنی مێژوو و بەشداربوون و لیستەکان
هەڵە
کێشە لە هێڵەکەتدا هەیە
ناتوانرێ هەموو وێنۆچکەکان باربکرێن
ناتوانرێ ماڵپەڕ شیبکرێتەوە
ناتوانرێ ماڵپەڕ بەتەواوی شیبکرێتەوە
ناوەڕۆک بەردەست نییە
- ناتوانرێ لیستی داگرتن دابنرێ
+ ناتوانرێ لیستی دابەزاندن دابنرێ
پەخشی ڕاستەوخۆ پشتگیری ناکرێ لەئێستادا
هیچ پەخشێ نەدۆزرایەوە
ناتوانرێ وێنە باربکرێ
@@ -143,18 +142,18 @@
بەستەر هەڵەیە
هیچ پەخشێکی ڤیدیۆیی نەدۆزرایەوە
پەخشی هیچ دەنگێک نەدۆزرایەوە
- ئەو پەڕگەیە بوونی نییە یان دەسەڵاتی خوێندنەوە و نوسینی لاوازە
- ناوی پەڕگە ناکرێ بەتاڵ بێت
+ ئەو فایلە بوونی نییە یان دەسەڵاتی خوێندنەوە و نوسینی لاوازە
+ ناوی فایل ناکرێ بەتاڵ بێت
هەڵەیەک ڕوویدا : %1$s
ببوورە، ناتوانرێ ئەوە ڕووبدات.
سکاڵا لەسەر کێشە لەڕێگای ئیمێڵ
- ببورە، هەندێ کێشە ڕوویدا.
+ ببورە، کێشەیەک ڕوویدا.
سکاڵا
زانیاری:
چی ڕوویدا:
لێدوانەکەت (بە ئینگلیزی):
وردەکارییەکان:
- وێنۆچکەی پیشاندانی ڤیدیۆ
+ پێشبینین ی وێنۆچکەی ڤیدیۆ
کارپێکردنی ڤیدیۆ، ماوەی:
وێنۆچکەی کەسی بەرزکەرەوە
بەدڵبوون
@@ -165,8 +164,8 @@
هیچ ئەنجامێک نییە
هیچ شتێک لێرەدا نییە
ڕاکێشان بۆ دووبارە داواکردنەوە
- ناتوانرێ شوێنی داگرتن دروستبکرێ \'%1$s\'
- شوێنی داگرتن دانرا \'%1$s\'
+ ناتوانرێ شوێنی دابەزاندن دروستبکرێ \'%1$s\'
+ شوێنی دابەزاندن دانرا \'%1$s\'
ڤیدیۆ
دەنگ
هەوڵدانەوە
@@ -190,41 +189,41 @@
- %s ڤیدیۆکان
دەستپێکردن
- ڕاگرتن
+ وەستان
کارپێکردن
دروستکردن
سڕینەوە
- سڕینەوەی یەک دانە
+ سڕینەوەی دانەیەک
سڕینەوەی گشتی
تاقیکردنەوەی هێڵێک
- ڕێپێنەدان
- دانانەوەی ناو
+ فەرامۆشی
+ ناو لێنانەوە
ئەرکی نوێ
باشە
- ناوی پەڕگە
+ ناوی فایل
دابەشکراوەکان
کێشە ڕوویدا
سێرڤەر پشتگیرینەکراوە
- پەڕگە بوونی هەیە
- داگرتنەکانی ئەپ
+ فایل بوونی هەیە
+ دابەزاندنەکانی ئەپ
گرتەبکە بۆ وردەکاری
تکایە چاوەڕێبکە…
لەبەرگیرایەوە
- تکایە فۆڵدەرێک بۆ شوێنی داگرتن دیاریبکە لە ڕێکخستنەکان
+ تکایە فۆڵدەرێک بۆ شوێنی دابەزاندن دیاریبکە لە ڕێکخستنەکان
ئەم دەسەڵاتە پێویستە بۆ
-\nکردنەوەی پەنجەرەی بچووک
+\nکردنەوەی دۆخی پەنجەرە
reCAPTCHA داواکاری
reCAPTCHA داواکراوە
- داگرتن
+ دابەزاندن
پیت و ژمارەکان
هێما تایبەتییەکان
- دەربارەی ئەپ
+ لەبارەی ئەپ
ڕێکخستنەکان
- دەربارە
+ سەبارەت
© %1$s لەلایەن %2$s لەژێر %3$s
ناتوانرێ مۆڵەت باربکرێ
کردنەوەی ماڵپەڕ
- دەربارە
+ سەبارەت
هاوبەشەکان
مۆڵەتەکان
هاوبەشبوون
@@ -239,7 +238,7 @@
مێژوو
گەڕا
تەماشاکراوە
- مێژوو ناچالاکە
+ مێژوو ناکارا کراوە
مێژوو
مێژوو بەتاڵە
مێژوو سڕایەوە
@@ -248,24 +247,24 @@
ئایا دەتەوێ ئەم بابەتە لە مێژووی تەماشاکردن بسڕدرێتەوە؟
ئایا دڵنیای لە سڕینەوەی هەموو بابەتەکان لە مێژوودا؟
دواین کارپێکراو
- زۆرترین کارپێکردن
+ زۆرترین کارپێکراو
ناوەڕۆکی پەڕەی سەرەکی
لادان
وردەکارییەکان
ڕێکخستنەکانی دەنگ
دەستپێکردنی لێدان لێرەوە
دەستپێکردنی لێدان لە پاشبنەماوە
- دەستپێکردنی لێدان لە پەنجەرەی بچووکەوە
+ دەستپێکردنی لێدان لە پەنجەرەوە
بەمزووانە شتێک لێرەدا دەردەکەوێ :D
کارپێکەری ڤیدیۆیی
کارپێکەری پاشبنەما
- کارپێکەری پەنجەرەی بچووک
+ کارپێکەری پەنجەرە
هەمیشە بپرسە
دەستکەوتنی زانیاری…
بارکردنی ناوەڕۆکی داواکراو
خشتەی کارپێکردنی نوێ
سڕینەوە
- ناوںْوسینەوە
+ ناولێنانەوە
ناو
زیادکردن بۆ خشتەی کارپێکردن
دانان لەسەر وێنۆچکەی خشتەی کارپێکردن
@@ -277,22 +276,22 @@
وێنۆچکەی خشتەی کارپێکردن گۆڕدرا.
ناتوانی ئەم خشتەی کارپێکردنە بسڕیتەوە.
هیچ ژێرنووسێک نییە
- گونجاو بە ڕونما
- پڕ بە ڕونما
+ فیت
+ پڕ
هێنانەپێش
دانانی خۆکاری
سکاڵا لەسەر کێشەکان
سکاڵاکردن لەسەر نەگەیاندنی Rx ی پەسەندنەکرا لە دەرەوەی پارچە یان چالاکی لەدوای پوختەکردن
- هێنانەوە/خەزنکردن
+ هێنانەوە/پاشەکەوت
هێنانەوە
هێنانەوە لە
- خەزنکردن بۆ
+ پاشەکەوت بۆ
دەهێنرێتەوە…
- خەزندەکرێ…
- هێنانەوەی پەڕگە
- خەزنی پێشووتر
+ پاشەکەوت دەکرێ…
+ هێنانەوەی فایل
+ پاشەکەوتی پێشووتر
ناتوانرێ بەشدارییەکان بهێنرێتەوە
- ناتوانرێ بەشدارییەکان خەزن بکرێن
+ ناتوانرێ بەشدارییەکان پاشەکەوت بکرێن
بۆ هێنانەوەی بەشداربوونەکانی یوتوب پێویستە پەڕگەی خەزن بوو بگەڕێنیتەوە:
\n
\n1. ئەم بەستەرە بکەوە: s%1$s
@@ -312,13 +311,13 @@
خێراییەکان
شەپۆلی دەنگ
سڕینەوەی بەستەر (ڕەنگە ببێتە هۆی تێکدان)
- هیچ پەخشێک نییە بۆ داگرتن
+ هیچ پەخشێک نییە بۆ دابەزاندن
ژێرنووسەکان
بەهۆی گۆڕانکاری لە شێوەی ژێرنووسکردنەکە. پێویستە ئەپەکە دابخەیت و دیسانەوە بیکەیتەوە.
- هیچ ئەپێک دانەمەزراوە بۆ کارپێکردنی ئەم پەڕگەیە
+ هیچ ئەپێک دانەمەزراوە بۆ کارپێکردنی ئەم فایلە
سڕینەوەی مێژووی تەماشاکردن
مێژوو دەسڕێتەوە لەگەڵ ڤیدیۆ کارپێکراوەکان و شوێنی لیستە ڤیدیۆییەکان
- سڕینەوەی تەواوی مێژووی تەماشاکردن؟
+ تەواوی مێژووی تەماشاکردن بسڕدرێتەوە؟
سڕینەوەی مێژووی گەڕان
مێژووی گەڕانەکانت دەسڕێتەوە
تەواوی گەڕانەکانت بسڕدرێنەوە؟
@@ -331,7 +330,7 @@
\nسیاسەتی تایبەتی ئەپ بەوردەکاری ڕوونکردنەوەت دەداتێ لەسەر ئەو داتایانەی وەریاندەگرێ و بەکاریاندەبات.
خوێندنەوەی سیاسەتی تایبەتی
کەناڵەکان
- لیستی تراکەکان
+ لیستی لێدانەکان
تراکەکان
بەکاربەرەکان
بەشدارنەبوون
@@ -343,20 +342,20 @@
جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما
زمانی بنەڕەتی ئەپ
نوێکارییەکان
- پەڕگە سڕایەوە
+ فایل سڕایەوە
ئاگانامەی نوێکاری ئەپ
ئاگانامەکانی وەشانی نوێی ئەپ
بیرگەی دەرەکی بەردەست نییە
- داگرتن لە بیرگەی دەرەکی ناکرێت.
+ دابەزاندن لە بیرگەی دەرەکی ناکرێت.
\nشوێنی فۆڵدەری داگرتنەکان دابنرێتەوە؟
- گێڕانەوە بۆ بنەڕەتی
+ گێڕانەوە بۆ بنەڕەت
ئایا دەتەوێ بگەڕێنرێتەوە بۆ شێوازی بنەڕەتی؟
ژمارەی بەشداربووان نادیارە
- داگرتنێکیترت هەیە بەهەمان ناو
+ دابەزاندنێکیتر هەیە بەهەمان ناو
پیشاندانی کێشە
هێما
فۆڵدەری مەبەست ناتوانرێ دروست بکرێ
- پەڕگە ناتوانرێ دروستبکرێ
+ فایل ناتوانرێ دروستبکرێ
ڕێگەپێدان ڕەتکرایەوە لەلایەن سیستەمەوە
پەیوەستبوونی پارێزراو شکستی هێنا
ناتوانرێ ڕاژە بدۆزرێتەوە
@@ -374,12 +373,12 @@
سڕینەوەی داتا
مێژووی تەماشاکردن سڕایەوە.
شوێنی کارپێکراوەکان سڕانەوە.
- شوێنی پەڕگە گۆڕدراوە یان سڕاوەتەوە
- داگرتنێکیتر هەیە بەهەمان ناو
+ شوێنی فایلەکە گۆڕدراوە یان سڕاوەتەوە
+ دابەزاندنێکیتر هەیە بەهەمان ناو
سڕینەوەی شوێنی کارپێکراوەکان
شوێنی هەموو کارپێکراوەکان دەسڕێتەوە
شوێنی هەموو کارپێکراوەکان بسڕدرێتەوە؟
- فۆڵدەری داگرتن بگۆڕە بۆ ئەنجامدانی کاریگەری
+ فۆڵدەری دابەزاندن بگۆڕە بۆ ئەنجامدانی کاریگەری
خزمەتگوزاری چەسپاو، ئێستا هەڵبژێردراو:
هیچ کەسێک تەماشای ناکات
@@ -397,21 +396,20 @@
دەسپێکردنەوەی کارپێکراو
پیشاندانی ڕێنمایی ”داگرتن تا پاشکۆ”
پیشاندانی ڕێنمایی کاتێ لە پاشبنەما یاخوود پەنجەرەدا گرتە دەکرێ لەسەر وردەکاری ڤیدیۆیەک
- ڕەفتار
- پیشاندانی ئەو ڤیدیۆیانەی سنوری تەمەنیان بۆ دانراوە. لە ڕێکخستنەکانەوە ڕێگەی پێدەدرێت.
- ناتوانرێ واژووی بەستەری ڤیدیۆ بخوێنرێتەوە
+ پەرەسەندوو
+ ناتوانرێ واژووی بەستەری ڤیدیۆ بخوێنرێتەوە
نەگێڕانەوەی کارپێکەر بۆ پێش کێشە ڕوویدا
گێڕانەوەی کارپێکەر بۆکاتی پێش کێشە
هەمان فۆڵدەر بوونی نییە
- هەمان پەڕگە/بابەت بوونی نییە
+ هەمان فایل/بابەت بوونی نییە
چی:\\nداواکراو:\\nناوەڕۆک:\\nلانگ:\\nخزمەتگوزاری:\\nGMT:\\nکات:\\nپاکێج:\\nوەشان:\\nوەشانی سیستەم:
|(تاقیکاری) داگرتنی خێرا بەبەکارهێنانی Tor بۆ زیادکردنی تایبەتێتی (پشتگیری پەخشە ڕاستەوخۆکان ناکات) .
بەستەر هەڵەیە یاخوود بەئینتەرنێتەوە پەیوەست نەبوویت
- هێما ڕێگەپێدراوەکان لە پەڕگەیەکی ناویدا
+ هێما ڕێگەپێدراوەکان لە فایلێکی ناویدا
هێما نادروستەکان بەم بەهایە جێگۆڕکێ دەکرێن
هێمای جێگۆڕین
مۆڵەتنامەی ئەپ
- ئەپێکی خۆڕایی و کێشی کەم بۆ پەخشی ڕاستەوخۆ لەسەر ئەندرۆید.
+ ئەپێکی خۆڕایی و کێشی کەم تایبەت بە یوتوب لەسەر ئەندرۆید.
مۆڵەتنامەی ئەپ
پەڕەی بەتاڵ
پەڕەی کیۆسک
@@ -421,18 +419,16 @@
هەڵبژاردنی کەناڵ
هیچ کەناڵێکی بەشداری نییە
هەڵبژاردنی کیۆسک
- خەزنکرا
+ پاشەکەوتکرا
هێنرایەوە
- پەڕگەی ZIP دروست نییە
- ئاگاداربە: ناتوانرێ هەموو پەڕگەکان بهێنرێنەوە.
+ فایلی ZIP دروست نییە
+ ئاگاداربە: ناتوانرێ هەموو فایلەکان بهێنرێنەوە.
ئەمە لەسەر ڕێکخستنەکانی ئێستات جێگیردەبێت.
کیۆسک
پڕبینەرەکان
باشترین 50
- نوێ & چالاک
+ نوێ و چالاک
پەنجەت داگرە بۆ ڕیزنەبوون
- ڕیزنەبوون لە پاشبنەما
- ڕیزنەبوون لە پەنجەرەی بچووک
کردنەوەی پلیکانە
داخستنی پلیکانە
چاودێری دزەکردنی بیرگە ڕەنگە ببێتە هۆی وەڵامنەدانەوەی لەکاتی گەرمبوون
@@ -441,7 +437,7 @@
ئایا دەتەوێت ڕێکخستنەکانیش بهێنرێنەوە؟
بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی ئەپەکەمان. تکایە بەئاگادارییەوە بیخوێنەوە.
\nپێویستە قبوڵی بکەیت بۆ ناردنی سکاڵاکانت.
- قبوڵکردن
+ پەسەند
ڕەتکردنەوە
بێ سنوور
سنووری قەبارە لەکاتی بەکارهێنانی داتای مۆبایل
@@ -449,7 +445,7 @@
کرداری کاتی گۆڕین بۆ ئەپێکیتر لە کارپێکەری ڤیدیۆییەوە — %s
هیچیان
بچوککردنەوە بۆ کارپێکەری پاشبنەما
- بچووککردنەوە بۆ پەنجەرەی بچووک
+ بچووککردنەوە بۆ پەنجەرە
بردنەپێشەوەی خێرا لەکاتی بێدەنگکردن
هەنگاو
ڕێکخستنەوە
@@ -459,32 +455,32 @@
نوێکارییەکان
پیشاندانی ئاگانامەیەک بۆ ئامادەبوونی ئەپ لەکاتی بەردەست بوونی وەشانی نوێ
شێوازی پیشاندانی خشتە
- خشتەیی
- چوار خانەیی
+ خشتە
+ چوارخانە
خۆکاری
گۆڕینی پیشاندان
وەشانی نوێی ئەپ بەردەستە!
- گرتەبکە بۆ داگرتن
+ گرتەبکە بۆ دابەزاندن
تەواوبوو
- لە چاوەڕوانیدایە
- ڕاگیراوە
+ لە نۆرەیە
+ وەستاوە
لەڕیزدایە
چارەسەردەکرێت
لە ڕیز
کردار ڕەتکرایەوە لەلایەن سیستەمەوە
- داگرتن شکستی هێنا
- داگرتن تەواوبوو
- %s داگرتن تەواوبوون
+ دابەزاندن کەوت
+ دابەزاندن تەواوبوو
+ %s دابەزاندن تەواوبوون
دانانی ناوی نوێ
جێگیرکردن
کۆنفرانسەکان
ناتوانرێ لێدوانەکان باربکرێ
پیشاندانی نیشانەکەری شوێنی کارپێکراو لە لیستەکان
- پەڕگەیەک بەهەمان ناو هەیە
- پەڕگەیەکی داگیراو بەم ناوەوە هەیە
- ناتوانرێ لەسەر ئەو پەڕگەیە جێگیربکرێ
+ فایلێک بەهەمان ناو هەیە
+ فایلێکی دابەزێنراو بەم ناوەوە هەیە
+ ناتوانرێ لەسەر ئەو فایلە جێگیربکرێ
زمان دەگۆڕدرێ لەدوای داخستن و پاشان کردنەوەی ئەپ.
- کیۆسکی بنەڕەتی
+ پەڕەی بنەڕەتی
ماوەی خێرا بردنە پێشەوە\\ گێڕانەوە بۆ دواوە
دۆخی پێرتووبی
دۆخە دڵخوازەکانی پێرتووبی دیاریبکە
@@ -539,8 +535,8 @@
- %d چرکە
بەهۆی ExoPlayer ەوە ماوەی بردنەپێش و بردنەپاش لە %d چرکەدا دیاریکرا
- بێدەنگکردن
- بێدەنگ نەکردن
+ کپ
+ کپ نەکردن
یارمەتی
- %d خولەک
@@ -586,7 +582,7 @@
\nهیوادارین بتوانین لە وەشانەکانی داهاتوودا پشتگیری بکەین.
تەمەنت بۆ تەماشاکردنی ئەم ڤیدیۆیە ڕێپێنەدراوە.
\n
-\nگەر دەتەوێت بیبینیت ئەوا ناوەڕۆکە ڕێپێنەدراوەکانی تەمەن لە ڕێکخستنەکان چالاک بکە.
+\n ناوەڕۆکە ڕێپێنەدراوەکانی تەمەن لە ڕێکخستنەکان چالاک بکە گەر دەتەوێت بیبینیت.
∞ ڤیدیۆ
+١٠٠ ڤیدیۆ
هونەرمەندەکان
@@ -603,10 +599,31 @@
لەلایەن %s
دروستکراو لەلایەن %s
وێنۆچکەی کەناڵ
- لیستی تراک دیاربکە
- هەڵە لە سکاڵا لەسەر GitHub
+ لیستی لێدان دیاربکە
+ سکاڵا لەسەر GitHub
لەبەرگرتنەوەی سکاڵا
پیشاندانی ئەنجامەکان بۆ: %s
- دوای گۆڕینی لێدەری یەک بۆ دانەیەکیتر ڕەنگە ڕیزەکانت تێکەڵ بن
+ گۆڕینی لێدەری یەکەم بۆ دانەیەکیتر ڕەنگە ڕیزەکانت تێکەڵ بن
پرس بکرێ بۆ دڵنیابوونەوە پێش سڕینەوەی ڕیزێک
+ پەڕەی خشتەی کارپێکردن
+ تەنها بەشدارییە کۆمەڵە نەکراوەکان پیشاندرێ
+ هەرگیز
+ تەنها لەسەر وایفای
+ دەسپێکردنی کارپێکەر بەخۆکاری — %s
+ لێدانی ڕیز
+ هیچ لیستێکی لێدان نیشانە نەکراوە
+ ئاگانامە
+ بەستەرەکە نەناسرایەوە. لە ئەپێکیتردا بکرێتەوە؟
+ ڕیزبوونی خۆکار
+ ڕیزی لێدەری چالاک جێیدەگیرێتەوە
+ هیچ شتێک
+ تێکەڵکردن
+ دووبارەکردنەوە
+ پێنجەم کردەی دوگمە
+ چوارەم کردەی دوگمە
+ سێیەم کردەی دوگمە
+ دووەم کردەی دوگمە
+ یەکەم کردەی دوگمە
+ وێنۆچکەی ئەو ڤیدیۆیەی کە لە ئاگانامەوە دەردەکەوێ ، دەیگۆڕی لەڕەهەندی 16:9 ەوە بۆ 1:1
+ گونجاندنی وێنۆچکە بۆ ڕەهەندی 1:1
\ No newline at end of file
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index a729c372b4e..74dfa50f3e7 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -1,6 +1,7 @@
- Palieskite „Ieškoti“, kad pradėtumėte
+ Palieskite „Ieškoti“, kad pradėtumėte
+\n
%1$s peržiūrų
Publikuota %1$s
Nerastas srauto grotuvas. Įdiegti VLC\?
@@ -17,17 +18,17 @@
Pasirinkti naršyklę
sukimas
Naudoti išorinį vaizdo grotuvą
- Kai kurios raiškos nepalaiko audio, kai ši parinktis įgalinta
+ Kai kurios raiškos nepalaiko garso, kai ši parinktis įgalinta
Naudoti išorinį audio grotuvą
iššokančio lango rėžimas
Fonas
Išokantis langelis
Vaizdo įrašų parsisiuntimo aplankas
Vieta parsisiųstų vaizdo įrašų laikymui
- Įvesti parsiuntimo kelią vaizdo įrašams
- Garso įrašų parsiuntimo kelias
+ Pasirinkite parsiuntimo aplankalą vaizdo įrašams
+ Garso įrašų parsiuntimo aplankalas
Vieta laikyti parsisiųstus garso įrašus
- Įveskite atsisiuntimų kelią garso įrašams
+ Pasirinkite atsisiuntimų aplankalą garso įrašams
Automatinis paleidimas
Groti vaizdo įrašą, kai NewPipe iškvečiama per kitą programėlę
Numatytoji raiška
@@ -35,7 +36,7 @@
Rodyti aukštesnes raiškas
Tik kai kurie įrenginiai palaiko 2K/4K vaizdo įrašų peržiūrą
Groti su Kodi
- Kore programėlė nerasta. Įdiegti Kore?
+ Įdiegti nereastą Kore programėlę\?
Rodyti \"Peržiūra su Kodi\" pasirinkimą
Rodyti pasirinkimą peržiūrėti vaizdo įrašus per Kodi mediacentrą
Garso įrašas
@@ -52,7 +53,7 @@
Paieškos nuspėjimai
Rodyti nuspėjimus, kai ieškoma
Atsisiųsti
- Rodyti kitus panašius vaizdo įrašus
+ Rodyti „kitus” ir „panašius” vaizdo įrašus
URL nepalaikoma
Numatytoji tūrinio kalba
Vaizdas ir garsas
@@ -62,7 +63,7 @@
Groja fone
Grojama iššokančiojo lango rėžime
Turinys
- Rodyti amžiaus cenzo apribotą turinį
+ Rodyti amžiumi apribotą turinį
Gyvai
Atsisiuntimai
Atsisiuntimai
@@ -80,19 +81,19 @@
Klaida
Tinklo klaida
Negalima įkelti visų miniatiūrų
- Negalima iššifruoti vaizdo įrašo skaitmeninio parašo
+ Negalima iššifruoti vaizdo įrašo skaitmeninio parašo
Negalima apdoroti tinklapio
Negalima visiškai apdoroti tinklapio
Turinys neprieinamas
Negalima sutvarkyti atsisiuntimų meniu
- Tai gyvas srautas. Tokie kol kas nepalaikomi.
+ Tiesioginės translecijos yra nepalaikomos
Negalima gauti jokio srauto
Negalima įkelti jokio paveikslėlio
Programėlė/ vartotojo sąsaja nulūžo
Atsiprašome, taip neturėjo įvykti.
- Raportuoti apie klaidą el. paštu
+ Pranešti apie šią klaidą el. paštu
Atsiprašome, ištiko keletas klaidų.
- ATASKAITA
+ Ataskaita
Informacija:
Kas nutiko:
Kas:\\nUžklausa:\\nTurinio Kalba:\\nTurinio Šalis:\\nProgramėlės Kalba:\\nPaslauga:\\nGMT Laikas:\\nPaketas:\\nVersija:\\nOS versija:
@@ -142,7 +143,7 @@
Šis leidimas reikalingas
\natidarymui iššokančio lango rėžime
reCAPTCHA iššūkis
- reCAPTCHA prašomas iššūkis
+ prašomas reCAPTCHA iššūkis
Prenumeruoti
Užprenumeruota
Kanalas Nebeprenumeruojamas
@@ -155,16 +156,15 @@
Saugoti paieškos užklausas vietinėje atmintyje
Žiūrėjimo istorija
Sekite peržiūrėtus vaizdo įrašus
- Atkurti kai dėmesio centre
+ Paleisti
Tęsti grojimą po pertraukčių (pvz. skambučių)
- Rodyti laikyti, kad įtraukti patarimą
+ Rodyti “laikyti kad pakeisti„ patarimą
Rodyti patarimą, kai foninis arba langelio rėžimo mygtukas paspaudžiamas vaizdo įrašų detalių puslapyje
Grotuvas
Elgsena
- Istorija
+ Istorija ir laikmena
Foninio grotuvo eilėje
Įtraukta į langelio rėžimo grojimo eilę
- Apriboto amžiaus vaizdo įrašas. Kad leisti tokius vaizdo įrašus eikite į nustatymus.
Grojaraštis
Atgal
Groti viską
@@ -176,7 +176,7 @@
Atstatoma po grotuvo klaidos
Nėra rezultatų
Čia nieko nėra išskyrus svirplius
- Saugyklos prieiga uždrausta
+ Pirma duokite prieiga prie saugyklos
Tūkst.
Mln.
Mlrd.
@@ -242,15 +242,13 @@
Detalės
Garso nustatymai
Laikykite kad įtraukti į eilę
- Įtrauktį į foninio grotuvo eilę
- Įtraukti į langelio rėžimo grotuvo eilę
Pradėti groti čia
- Pradėti groti čia foniniame rėžime
- Pradėti groti čia langelio grotuvo rėžime
+ Pradėti groti foniniame rėžime
+ Pradėti groti langelio grotuve
Nerastas srauto grotuvas (galite įdiegti VLC kad grotumėte).
Parsisiųsti srauto failą
Rodyti informaciją
- Adresynas
+ Pažymėti grojaraščiai
Pridėti į
Numatyta tūrinio šalis
Paslauga
@@ -293,18 +291,18 @@
Visada klausti
Gauname informaciją…
Įkeliamas pasirinktas turinys
- Sukurti naują grojaraštį
- Ištrinti grojaraštį
- Pervadinti grajaraštį
+ Naujas grojaraštį
+ Ištrinti
+ Pervadinti
Pavadinimas
Pridėti į grojaraštį
Nustatyti kaip grojaraščio paveikslėlį
Pridėti grojaraštį į žymes
Pašalinti žymes
- Ar norite ištrinti šį grojaraštį?
- Grojaraštis sėkmingai sukurtas
+ Ištrinti šį grojaraštį\?
+ Grojaraštis sukurtas
Pridėta į grojaraštį
- Grojaraščio paveikslėlis pakeistas
+ Grojaraščio paveikslėlis pakeistas.
Nepavyko ištrinti grojaraščio
Nėra antraštės
Pritaikyti
@@ -314,7 +312,7 @@
Atminties nutekėjimo stebėjimas gali padaryti programėlę nestabilią
Pranešti apie Out-of-Lifecycle klaidas
Priverstinai pranešti apie \"undeliverable Rx exceptions occurring outside of fragment or activity lifecycle after dispose\"
- Išjungti, kad paslėptų komentarai
+ Išjungti, kad paslėpti komentarus
Rodyti komentarus
Pasirinkti skirtuką
Naujas skirtukas
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index f29bd8df07a..a450b9503a0 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -102,7 +102,6 @@
Ставено на листа, за пуштање во прозорче
Содржина
Покажи видеа со граница на возрастта
- Видео за возрасни. Можете да дозволите вакви видеа преку Поставки.
во живо
Превземања
Превземања
@@ -137,7 +136,7 @@
Грешка
Мрежна грешка
Не можеа да се прочитаат сите сликички
- Невозможно децифрирање на URL потписот
+ Невозможно децифрирање на URL потписот
Не може да се прочита страната
Не може целосно да се прочита страната
Содржината е недостапна
@@ -292,8 +291,6 @@
Детали
Звучни поставки
Задржи за ставање во листа
- Додај во листата за заднинско пуштање
- Додај во листата за пуштање во прозорче
Пушти тука
Пушти тука во позадина
Пушти тука во прозорче
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index 85e2c62921f..84f4f5ff8b3 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -72,8 +72,6 @@
ഒരു പുതിയ പോപ്പ്അപ്പിൽ പ്ലേ ചെയ്യാൻ ആരംഭിക്കുക
പശ്ചാത്തലത്തിൽ പ്ലേ ആരംഭിക്കുക
ഇവിടെ പ്ലേ ആരംഭിക്കുക
- ഒരു പുതിയ പോപ്പ്അപ്പിൽ എൻക്യൂ ചെയ്യുക
- പശ്ചാത്തലത്തിൽ എൻക്യൂ ചെയ്യുക
എൻക്യൂ ചെയ്യാൻ പിടിക്കുക
ഓഡിയോ ക്രമീകരണങ്ങൾ
വിശദാംശങ്ങൾ
@@ -267,7 +265,7 @@
കന്റെന്റ് ലഭ്യമല്ല
വെബ്സൈറ്റ് പൂർണമായി വ്യാപരിക്കാനായില്ല
വെബ്സൈറ്റ് വ്യാപരിക്കാനായില്ല
- വീഡിയോ URL സിഗ്നേച്ചർ ഡീക്രിപ്റ്റ് ചെയ്യാൻ സാധിച്ചില്ല
+ വീഡിയോ URL സിഗ്നേച്ചർ ഡീക്രിപ്റ്റ് ചെയ്യാൻ സാധിച്ചില്ല
ലഘുചിത്രങ്ങൾ ലോഡ് ചെയ്യാനായില്ല
നെറ്റ്വർക്ക് പിശക്
എസ്ഡി കാർഡിലേക്ക് ഡൗൺലോഡ് അസാധ്യം. ഡൗൺലോഡ് ഫോൾഡർ മാറ്റട്ടെ\?
@@ -335,7 +333,6 @@
ഈ വീഡിയോ പ്രായപരിമിതി ഉള്ളതാണ്.
\n
\nഇത് കാണണമെങ്കിൽ പ്രായനിയന്ത്രണ ക്രമീകരണങ്ങളിൽ മാറ്റം വരുത്തുക.
- പ്രായപരിമിതിയുള്ള വീഡിയോ കാണിക്കുന്നു. ഭാവിയിൽ മാറ്റങ്ങൾ വരുത്താനാകും.
പ്രായപരിമിതപ്പെടുത്തിയ കന്റെന്റ്
കന്റെന്റ്
പോപ്പപ്പ് പ്ലേയറിൽ ക്യൂ ചെയ്തിരിക്കുന്നു
diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml
index fd59e3e149f..3457fda5613 100644
--- a/app/src/main/res/values-ms/strings.xml
+++ b/app/src/main/res/values-ms/strings.xml
@@ -110,7 +110,6 @@
Beratur pada pemain popup
Kandungan
Kandungan terhad umur
- Tunjukkan video terhad umur. Membenarkan bahan tersebut boleh dilakukan dari Tetapan.
LANGSUNG
Muat turun
Muat turun
@@ -163,7 +162,7 @@
Tidak mampu Memuat turun ke kad SD luar. Tetapkan semula lokasi folder muat turun\?
Ralat rangkaian
Tidak dapat memuat semua thumbnail
- Tidak dapat menyahsulit tanda tangan URL video
+ Tidak dapat menyahsulit tanda tangan URL video
Tidak dapat menghuraikan laman web
Tidak dapat menghuraikan laman web sepenuhnya
Kandungan tidak tersedia
@@ -330,8 +329,6 @@
Butiran
Tetapan Audio
Pegang untuk beratur
- Beratur apabila di latar belakang
- Beratur pada popup baru
Mula bermain di sini
Mula di sini apabila di latar belakang
Mula di sini pada popup baru
diff --git a/app/src/main/res/values-nap/strings.xml b/app/src/main/res/values-nap/strings.xml
new file mode 100644
index 00000000000..06d601271b9
--- /dev/null
+++ b/app/src/main/res/values-nap/strings.xml
@@ -0,0 +1,11 @@
+
+
+ %1$s visualizzazioni
+ Sciglie \'o browser
+ Truova
+ Arape comme fenesta popup
+ Arape ncopp\'\'o browser
+ Chiure
+ Installa
+ Pubblicato \'o %1$s
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index dffb0cccec6..d4b3ff509b0 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -50,15 +50,15 @@
(Eksperimentelt) Tving nedlasting av trafikk gjennom Tor for forbedret personvern (strømming av videoer støttes ikke enda).
Kan ikke opprette nedlastingsmappe \'%1$s\'
Opprettet nedlastingsmappen \'%1$s\'
- Trykk «Søk» for å komme i gang
+ Trykk «Søk» for å begynne
+\n
Automatisk avspilling
Spiller en video når NewPipe blir forespurt av et annet program
Innhold
Aldersbegrenset innhold
- Vis aldersbegrenset video. Å tillate slikt materiale kan gjøres fra innstillingene.
Feil
Kunne ikke laste inn alle miniatyrbilder
- Kunne ikke dekryptere signaturen til videoens nettadresse
+ Kunne ikke dekryptere signaturen til videoens nettadresse
Kunne ikke tolke nettside
Kunne ikke tolke nettside fullstendig
Innholdet er utilgjengelig
@@ -234,8 +234,6 @@
Strømside
Abonnerer ikke på noen kanaler enda
På vei opp
- Legg i kø i bakgrunnen
- Legg i kø i et oppsprett
Start avspilling her
Start avspilling i bakgrunnen
Start avspilling i et oppsprett
@@ -569,9 +567,7 @@
Strøm sist oppdatert: %s
Denne videoen er aldersbegrenset.
\n
-\nSkru på «Aldersbegrenset innhold» i innstillingene hvis du vil se den.
-\n
-\nHvis du ønsker å se den, skru på \"Aldersbegrenset innhold\" i innstillingene.
+\nSkru på «%1$s» i innstillingene hvis du vil se den.
∞ videoer
100+ videoer
Artister
@@ -638,4 +634,14 @@
Første handlingstast
Skaler miniatyrbilde til 1:1-aspekt
Ingenting
+ Vis minnelekkasjer
+ Satt i kø
+ Sett i kø
+ Tøm reCAPTCHA-kaker
+ reCAPTCHA-kaker har blitt slettet
+ Tøm kaker som NewPipe lagrer når du løser en reCAPTCHA
+ YouTube tilbyr et «Begrenset modus» som skjuler mulig innhold kun for voksne.
+ Vis innhold som muligens er upassende for barn, siden det har aldersgrense (som 18+).
+ Få Android til å tilpasse merknadens farge i henhold til hovedfargen på miniatyrbildet (merk at dette ikke støttes på alle enheter)
+ Fargelegg merknad
\ No newline at end of file
diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml
index 5eb558d3bac..8b399ff87de 100644
--- a/app/src/main/res/values-ne/strings.xml
+++ b/app/src/main/res/values-ne/strings.xml
@@ -112,7 +112,6 @@
पपअप प्लेयरमा लामबद्ध
सामग्री
उमेर प्रतिबन्धित सामग्री
- उमेर प्रतिबन्धित भिडियोहरु देखाऊ। भविष्यमा यो सेटिङ परिवर्तन सम्भव छ।
प्रत्यक्ष
डाउनलोडहरु
डाउनलोडहरु
@@ -168,7 +167,7 @@
बाह्य एस डी कार्ड (SD card) छैन। डाउनलोड फोल्डर स्थान रिसेट गर्ने\?
नेटवर्क त्रुटि
सबै थम्बनेल लोड गर्न सकेन
- भिडियो URL हस्ताक्षर डिक्रिप्टगर्न सकेन
+ भिडियो URL हस्ताक्षर डिक्रिप्टगर्न सकेन
वेबसाइट पार्स गर्न सकिँएन
वेबसाइट पूर्ण तरिकाले पार्स गर्न सकिँएन
सामग्री अनउपलब्ध
@@ -336,8 +335,6 @@
विवरण
अडियो सेटिङहरू
लामबद्ध गर्न पकड
- पृष्ठभूमिमा लामबद्ध
- नयाँ पपअपमा लामबद्ध
यहाँ प्ले सुरु
पृष्ठभूमिमा बजाउन सुरु गर्नुहोस
पपअपमा बजाउन सुरु गर्नुहोस
diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml
index 4cb27c46ce9..59fb83b9ed4 100644
--- a/app/src/main/res/values-nl-rBE/strings.xml
+++ b/app/src/main/res/values-nl-rBE/strings.xml
@@ -1,27 +1,28 @@
- Tik op zoeken voor te beginnen
+ Tik op \"Zoeken\" om te beginnen
+\n
%1$s keer bekeken
Gepubliceerd op %1$s
- Er is geen videospeler met streamondersteuning gevonden. Wilt u VLC installeren\?
- Geen speler met streamondersteuning gevonden (je kan VLC installeren om af te spelen).
+ Er is geen stream videospeler gevonden. Wilt u VLC installeren\?
+ Geen speler met stream ondersteuning gevonden (je kan VLC installeren om af te spelen).
Installeren
Annuleren
In browser openen
- Openen in pop-upmodus
+ Openen in pop-up modus
Delen
Downloaden
- Streambestand downloaden
+ Stream bestand downloaden
Zoeken
Instellingen
- Bedoelde je: %1$s\?
+ Bedoelde je \"%1$s\"\?
Delen met
Kies browser
rotatie
Externe videospeler gebruiken
Verwijdert het geluid bij sommige resoluties
Externe audiospeler gebruiken
- Pop-up-modus
+ Pop-up modus
Abonneer
Geabonneerd
Abonnement opgezegd
@@ -35,25 +36,25 @@
Achtergrond
Pop-up
Toevoegen aan
- Downloadlocatie voor video’s
- Gedownloade videobestanden worden hier opgeslaan
+ Download locatie voor video’s
+ Gedownloade videobestanden worden hier opgeslagen
Kies de downloadlocatie voor videobestanden
- Downloadmap voor audio
- Gedownloade audiobestanden worden hier opgeslaan
+ Audio download map
+ Gedownloade audiobestanden worden hier opgeslagen
Kies de downloadlocatie voor audiobestanden
Automatisch afspelen
- Speelt video’s af wanneer dat NewPipe vanuit een anderen app word geopend
- Standaardresolutie
- Standaardresolutie voor pop-up
+ Speelt video’s af wanneer NewPipe vanuit een andere app wordt geopend
+ Standaard resolutie
+ Standaard resolutie voor pop-up
Hogere resoluties weergeven
Slechts enkele toestellen kunnen 2K- en 4K-video\'s afspelen
Afspelen met Kodi
Wilt u de missende Kore-app installeren\?
Toon “Afspelen met Kodi”-optie
- Toont een optie voor ne video op een Kodi media center af te spelen
+ Toont een optie om video af te spelen op een Kodi media center
Audio
- Standaardaudioformaat
- Standaardvideoformaat
+ Standaard audio formaat
+ Standaard video formaat
Thema
Licht
Donker
@@ -61,7 +62,7 @@
Onthoud grootte en positie van pop-up
Onthoud laatste grootte en positie van pop-up
Snel, minder exact spoelen gebruiken
- Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie
+ Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie. 5, 15 en 25 seconden werken niet.
Miniatuurvoorbeelden laden
Schakel dit uit voor het laden van miniatuurvoorbeelden te verhinderen; dit bespaart mobiele gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache.
Afbeeldingscache gewist
@@ -69,29 +70,29 @@
Alle gecachete webpagina-gegevens wissen
Metagegevens-cache gewist
Volgende stream automatisch in wachtrij plaatsen
- Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende wachtlijst
+ Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst
Veegbesturing
- Gebruikt vegen voor de helderheid en het volume van de speler aan te passen
+ Gebruik gebaren om de helderheid en het volume van de speler aan te passen
Zoeksuggesties
Toon suggesties bij zoeken
Zoekgeschiedenis
Sla zoekopdrachten lokaal op
- Geschiedenis & cache
- Kijkgeschiedenis bijhouden
- Hervat bij focus
- Ga verder met afspelen na onderbrekingen (zoals telefoongesprekken)
+ Geschiedenis bekijken
+ Geschiedenis bekeken video\'s bijhouden
+ Hervat afspelen
+ Ga verder met afspelen na onderbrekingen (b.v. telefoongesprekken)
Downloaden
Toont ‘Volgende’ en ‘Vergelijkbare’ video’s
- Toont tip ‘Ingedrukt houden voor toe te voegen’
- Toont tip wanneer dat den achtergrond- of pop-upknop wordt ingedrukt op de videogegevenspagina
+ Toon tip ‘Ingedrukt houden om toe te voegen’
+ Toon tip als de achtergrond- of pop-up knop wordt ingedrukt in de video \"Details:\"
URL wordt niet ondersteund
- Standaardinhoudsland
+ Standaard land
Dienst
- Standaardtaal voor inhoud
+ Standaard taal voor inhoud
Speler
Gedrag
- Video & audio
- Geschiedenis & cache
+ Video en audio
+ Geschiedenis en cache
Pop-up
Uiterlijk
Overige
@@ -101,9 +102,8 @@
Toegevoegd aan wachtrij voor achtergrondspeler
Toegevoegd aan wachtrij voor pop-upspeler
Inhoud
- Inhoud met leeftijdsbeperking
- Toont video met leeftijdsbeperking. Toelaten van deze soort video’s kan ingeschakeld worden in de Instellingen.
- LIVE
+ Toon inhoud met leeftijdsbeperking
+ Live
Downloads
Downloads
Foutrapport
@@ -137,7 +137,7 @@
Fout
Netwerkfout
Kon niet alle miniaturen laden
- Kon video-URL-ondertekening niet ontsleutelen
+ Kon video-URL-ondertekening niet ontsleutelen
Kon website niet verwerken
Kon de website niet volledig inlezen
Inhoud niet beschikbaar
@@ -146,7 +146,7 @@
Kon geen streams vinden
Kon afbeelding niet laden
App/UI gecrasht
- Kon deze stream nie afspelen
+ Kon deze stream niet afspelen
Onherstelbare spelerfout opgetreden
Bezig met herstellen van spelerfout
Externe spelers ondersteunen deze soorten koppelingen niet
@@ -155,21 +155,21 @@
Geen audiostreams gevonden
Deze map bestaat niet
Bestand/inhoudsbron bestaat niet
- Het bestand bestaat niet of ge zijt onvoldoende gemachtigd voor het te lezen/dernaar te schrijven
- Den bestandsnaam mag niet blanco zijn
- Der is een fout opgetreden: %1$s
+ Het bestand bestaat niet of u bent onvoldoende gemachtigd om het te lezen of ernaar te schrijven
+ De bestandsnaam mag niet blanco zijn
+ Er is een fout opgetreden: %1$s
Geen streams beschikbaar voor downloaden
Sorry, dit zou niet mogen gebeuren.
- Fout melden via e-mail
- Sorry, der traden enkele fouten op.
- MELDEN
+ Meld deze fout via e-mail
+ Sorry, er is iets fout gegaan.
+ Melden
Info:
- Wat is der gebeurd:
- Wat:\\nVerzoek:\\nTaal van inhoud:\\nDienst:\\nTijd in GMT:\\nPakket:\\nVersie:\\nVersie van besturingssysteem:
+ Wat er is gebeurd:
+ Wat:\\nVerzoek:\\nTaal van inhoud:\\nLand:\\nTaal van applicatie:\\nDienst:\\nGMT tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem:
Uw opmerking (in het Engels):
Details:
Videovoorbeeldminiatuur
- Videovoorbeeldminiatuur
+ Speel video, tijd:
Avatarminiatuur van uploader
Duimen
Duimen omlaag
@@ -178,17 +178,17 @@
Meld een probleem
Gebruikersrapport
Geen resultaten
- Niks te zien
- Versleep voor de volgorde te wijzigen
- Kan downloadmap ‘%1$s’ niet aanmaken
- Downloadmap ‘%1$s’ aangemaakt
+ Helemaal niets hier te zien
+ Versleep om de volgorde te wijzigen
+ Kan download map ‘%1$s’ niet aanmaken
+ Download map ‘%1$s’ aangemaakt
Video
Geluid
Opnieuw proberen
- Toegang tot opslag geweigerd
- K
+ Geef eerst toegang tot opslag
+ k
M
- B
+ mld.
Geen abonnees
- %s abonnee
@@ -221,13 +221,14 @@
Fout
Server wordt niet ondersteund
Bestand bestaat al
- Verkeerden URL of internet niet beschikbaar
+ Verkeerde URL of internet niet beschikbaar
NewPipe is aan het downloaden
Tik voor meer informatie
- Efkens geduld…
+ Even geduld…
Gekopieerd naar klembord
- Kies een beschikbare downloadmap
- Deze toestemming is vereist voor te openen in pop-upmodus
+ Kies een beschikbare download map
+ Deze toestemming is vereist om
+\nte openen in pop-up modus
reCAPTCHA-uitdaging
reCAPTCHA-uitdaging gevraagd
Download
@@ -236,7 +237,7 @@
Vervangend teken
Letters en cijfers
Meeste speciale tekens
- Genen app gevonden voor dit bestand mee af te spelen
+ Er is geen app geïnstalleerd die dit bestand kan afspelen
Over NewPipe
Instellingen
Over
@@ -249,13 +250,13 @@
Licenties
Vrij en licht streamen voor Android.
Bijdragen
- Hulp is altijd welkom, of ge nu nieuwe ideeën hebt, vertalingen kunt bijdragen, wijzigingen hebt voor het ontwerp, de code kunt opkuisen of der zelfs grote wijzigingen in wilt maken. Hoe meer hulp, hoe beter dat het wordt!
+ Hulp is altijd welkom, of u nu nieuwe ideeën hebt, vertalingen kunt bijdragen, wijzigingen hebt voor het ontwerp, de code kunt opkuisen of er zelfs grote wijzigingen in wilt maken. Hoe meer hulp, hoe beter dat het wordt!
Bekijken op GitHub
Doneren
- NewPipe word door vrijwilligers in hunne vrijen tijd ontwikkeld voor u de beste ervaring te brengen. Geefd iets terug zodat onze ontwikkelaars NewPipe nóg beter kunnen maken terwijl da’ ze van hun taske koffie genieten.
+ NewPipe wordt door vrijwilligers in hun vrije tijd ontwikkeld om jou de beste ervaring te brengen. Geef wat terug zodat onze ontwikkelaars NewPipe nóg beter kunnen maken terwijl ze van hun kopje koffie genieten.
Teruggeven
Website
- Bezoekt de website van NewPipe voor meer informatie en ’t laatste nieuws.
+ Bezoek de website van NewPipe voor meer informatie en het laatste nieuws.
Licentie van NewPipe
Licentie lezen
Geschiedenis
@@ -266,12 +267,12 @@
De geschiedenis is leeg
Geschiedenis gewist
Item verwijderd
- Wilt ge dit item uit uw zoekgeschiedenis verwijderen?
- Wilt ge dit item uit uw kijkgeschiedenis verwijderen?
- Wilt ge alle items uit uw geschiedenis verwijderen?
+ Wilt u dit item verwijderen uit uw zoekgeschiedenis\?
+ Wil je dit item uit afspeel geschiedenis verwijderen\?
+ Wilt u alle items uit uw geschiedenis verwijderen\?
Laatst afgespeeld
Meest afgespeeld
- Content van hoofdpagina
+ Inhoud van hoofdpagina
Blanco pagina
Kioskpagina
Abonnementenpagina
@@ -279,7 +280,7 @@
Kanaalpagina
Selecteer een kanaal
Nog niet geabonneerd op een kanaal
- Selecteer ne kiosk
+ Selecteer een kiosk
Geëxporteerd
Geïmporteerd
Geen geldig ZIP-bestand
@@ -292,24 +293,22 @@
Verwijderen
Details
Audio-instellingen
- Houdt ingedrukt voor toe te voegen aan wachtrij
- Toevoegen aan wachtrij in de achtergrond
- Toevoegen aan wachtrij in nieuwe pop-up
+ Houd ingedrukt om toe te voegen aan wachtrij
Begint hier met afspelen
Begint met afspelen in de achtergrond
- Begint met afspelen in nieuwe pop-up
+ Afspelen in pop-up
Menu openen
Menu sluiten
- Hier zal der binnenkort iets verschijnen ;D
+ Hier zal binnenkort iets verschijnen ;D
Voorkeursactie voor openen
- Standaardactie bij openen van inhoud — %s
+ Standaard actie bij openen van inhoud — %s
Videospeler
Achtergrondspeler
Pop-upspeler
Altijd vragen
Info ophalen…
- Bezig me laden van gevraagden inhoud
- Nieuwen afspeellijst
+ Bezig met laden van gevraagde inhoud
+ Nieuwe afspeellijst
Verwijderen
Hernoemen
Naam
@@ -317,21 +316,21 @@
Instellen als miniatuur voor afspeellijst
Afspeellijst toevoegen aan bladwijzers
Bladwijzer verwijderen
- Dezen afspeellijst verwijderen\?
+ Deze afspeellijst verwijderen\?
Afspeellijst aangemaakt
Toegevoegd aan afspeellijst
Miniatuur voor afspeellijst gewijzigd.
- Den afspeellijst kon niet verwijderd worden.
+ De afspeellijst kon niet verwijderd worden.
Geen bijschriften
- Passen
+ Passend
Opvullen
Inzoomen
Automatisch gegenereerd
Bijschriften
- Bijschriftgrootte en achtergrondstijlen wijzigen. Vereist nen herstart van den app.
- Het monitoren van geheugenlekken kan dervoor zorgen da’ den app nie’ goe meer reageerd
+ Bijschrift grootte en achtergrond stijlen wijzigen. Vereist herstart van de app.
+ Het monitoren van geheugenlekken kan ervoor zorgen dat de app niet goed meer reageert
Out-of-lifecycle-fouten melden
- Forceerd het melden van nie-bezorgbare Rx-uitzonderingen die gebeuren buiten fragments- of activiteitscyclus
+ Forceer het melden van niet-bezorgbare Rx-uitzonderingen buiten fragment of activiteitscyclus
Importeren/exporteren
Importeren
Importeren uit
@@ -340,56 +339,59 @@
Bezig met exporteren…
Bestand importeren
Vorige exportering
- Kon abonnementen nie importeren
- Kon abonnementen nie exporteren
- Importeerd uw YouTube-abonnementen door het exportbestand te downloaden:
+ Kon abonnementen niet importeren
+ Kon abonnementen niet exporteren
+ Importeer je YouTube-abonnementen vanaf Google Takeout:
\n
\n1. Ga naar dit adres: %1$s
-\n2. Logd in op uwen account
-\n3. Den download me het exportbestand zou nu moeten starten
- Importeerd een SoundButt-profiel door den URL of ID dervan in te voeren:
+\n2. Log in op je account
+\n3. Klik op \"Alle YouTube-gegevens inbegrepen\", dan op \"Selectie van alle items ongedaan maken\", dan selecteer alleen \"abonnementen\" en klik op \"OK\"
+\n4. Klik op \"Volgende stap\", dan op \"Export maken\"
+\n5. Klik op de knop \"Downloaden\" nadat deze verschijnt
+\n6. Uit de Takeout zipfile, pak de .json uit (gebruikelijk in de folder \"YouTube en YouTube Music/abonnementen/abonnementen.json\") en importeer deze hier.
+ Importeer een SoundCloud-profiel door de URL of het ID ervan in te voeren:
\n
-\n1. Kiesd ne webbrowser en schakeld bureaubladmodus in (de website is nie beschikbaar voor mobiele apparaten)
+\n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten)
\n2. Ga naar dit adres: %1$s
-\n3. Logd in op uwen account
-\n4. Kopieerd de koppeling van de pagina waarop da’ ge terechtkomd (da’s uwe profiel-URL).
- uwenID, soundbutt.com/uwenid
- Let op: deze actie kan veel MB’s van uw netwerk gebruiken.
-\n
-\nWild ge doorgaan?
+\n3. Log in op uw account
+\n4. Kopieer de koppeling van de pagina waar u op terechtkomt (dat is uw profiel-URL).
+ uwID, soundbutt.com/uwid
+ Let op: deze actie kan veel MB’s van uw netwerk gebruiken.
+\n
+\nWilt u doorgaan\?
Afspeelsnelheidsbesturing
Tempo
Toon
Ontkoppelen (kan ruis veroorzaken)
- Kijkgeschiedenis wissen
- Verwijdert de geschiedenis van afgespeelde streams
- De ganse kijkgeschiedenis verwijderen\?
- Kijkgeschiedenis verwijderd.
+ Wissen afspeel geschiedenis
+ Verwijdert de geschiedenis van bekeken video\'s en afspeelposities
+ Alle afspeel geschiedenis verwijderen\?
+ Afspeel geschiedenis verwijderd.
Zoekgeschiedenis wissen
Verwijdert de gebruikte zoektermen
- De ganse zoekgeschiedenis verwijderen\?
+ De hele zoekgeschiedenis verwijderen\?
Zoekgeschiedenis verwijderd.
1 item verwijderd.
- NewPipe is vrije software: ge kunt het gebruiken, bestuderen, delen en verbeteren zoveel als dat ge maar wilt. Ge kunt het terug uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) eender welke latere versie.
- Wild ge d’instellingen ook importeren?
+ NewPipe is vrije software: u kan het gebruiken, bestuderen, delen en verbeteren zoveel u maar wil. U kan het opnieuw uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) om het even welke latere versie.
+ Wilt u ook de instellingen importeren\?
Privacybeleid van NewPipe
- ’t NewPipe-project neemt uw privacy ter harte. Daarom verzameld den app geen gegevens zonder uw toestemming.
-\n’t Privacybeleid van NewPipe legd in detail uit welke gegevens da’ der worden verzonden en opgeslagen wanneer da’ g’een crashrappor indiend.
+ Het NewPipe-project neemt privacy serieus. Daarom verzamelt de app geen gegevens zonder uw toestemming.
+\nNewPipe\'s privacybeleid legt gedetailleerd uit welke gegevens verstuurd en opgeslagen worden als u een crashrapport verstuurt.
Privacybeleid lezen
- Voor d’Europese privacywet (ook wel GDPR genoemd) na te leven, wijzen w’u op ’t nieuw privacybeleid van NewPipe. Leesd ’t aandachtig.
-\nGe moet ’t aanvaarden voor ons ’t bugrapport te sturen.
+ Om de Europese Algemene Verordening Gegevensbescherming (ook wel: AVG of GDPR) na te leven, wijzen we u op het nieuwe privacybeleid van NewPipe. Lees dit zorgvuldig.
+\nU moet het beleid aanvaarden om ons het foutrapport te kunnen opsturen.
Aanvaarden
Weigeren
Onbeperkt
Resolutie beperken bij gebruik van mobiele gegevens
- Minimaliseren bij overschakelen naar anderen app
- Actie bij overschakelen van videospeler naar anderen app — %s
+ Minimaliseren bij overschakelen naar andere app
+ Actie bij overschakelen van videospeler naar andere app — %s
Geen
Afspelen in achtergrond
Afspelen in pop-up
Doorspoelen tijdens stilte
Stap
- Standaardwaarden herstellen
+ Resetten
Kanalen
Afspeellijsten
Nummers
@@ -398,32 +400,32 @@
Nieuw tabblad
Kiest een tabblad
Veegbesturing voor volume
- Gebruikt vegen voor het volume van de speler aan te passen
+ Gebruik gebaren om het volume van de speler aan te passen
Veegbesturing voor helderheid
- Gebruikt vegen voor de helderheid van de speler aan te passen
+ Gebruik gebaren om de helderheid van de speler aan te passen
Updates
Gebeurtenissen
Bestand verwijderd
Appupdatemelding
Meldingen voor nieuwe versies van NewPipe
Externe opslag niet beschikbaar
- Downloaden naar externe SD-kaart is nog niet mogelijk. Downloadmap terug instellen\?
- Standaardtabbladen worden gebruikt, fout bij het lezen van de opgeslagen tabbladen
- Standaardinstellingen herstellen
- Wilt ge de standaardinstellingen herstellen\?
+ Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen\?
+ Fout bij het lezen van de opgeslagen tabbladen, waardoor standaard tabbladen worden gebruikt
+ Standaard instellingen herstellen
+ Wil je de standaard instellingen herstellen\?
Aantal abonnees niet beschikbaar
Welke tabbladen er worden weergegeven op de hoofdpagina
Selectie
Conferenties
Updates
- Toont een melding voor den app bij te werken wanneer dat er een nieuwe versie beschikbaar is
- Lijstweergavemodus
+ Toon een melding om de app bij te werken indien er een nieuwe versie beschikbaar is
+ Lijstweergave modus
Lijst
Raster
Auto
Weergave wisselen
- NewPipe-update beschikbaar!
- Tikt voor te downloaden
+ NewPipe update is beschikbaar!
+ Tik om te downloaden
Voltooid
gepauzeerd
toegevoegd aan wachtrij
@@ -435,31 +437,214 @@
%s downloads voltooid
Unieke naam genereren
Overschrijven
- Der bestaat al een gedownload bestand met deze naam
- Der is al een download met deze naam bezig
+ Er bestaat al een gedownload bestand met deze naam
+ Er is al een download met deze naam bezig
Foutmelding weergeven
Code
Het bestand kan niet aangemaakt worden
De doelmap kan niet aangemaakt worden
Toelating geweigerd door het systeem
- Beveiligde verbinding is mislukt
+ Kon geen beveiligde verbinding opzetten
Kon de server niet vinden
Kan geen verbinding maken met de server
De server verzendt geen gegevens
- De server aanvaardt geen meerdradige downloads, probeert het opnieuw met @string/msg_threads = 1
+ De server aanvaardt geen multi-threaded downloads, probeer het opnieuw met @string/msg_threads = 1
Niet gevonden
Nabewerking mislukt
Stoppen
Maximaal aantal pogingen
Maximaal aantal pogingen vooraleer dat de download wordt geannuleerd
- Pauzeren bij overschakelen naar mobiele gegevens
+ Pauzeren bij mobiele data verbinding
Nuttig bij het gebruik van mobiele data, hoewel sommige downloads niet uitgesteld kunnen worden
Commentaren weergeven
- Schakelt dit uit voor reacties niet meer weer te geven
+ Schakel dit uit om reacties te verbergen
Automatisch afspelen
Geen commentaren
Kan commentaren niet laden
Sluiten
Vooruitgang verloren, omdat het bestand gedeletet werd
Resultaten aan het tonen voor: %s
+ Afspeellijst pagina
+ Door %s
+ Gemaakt door %s
+ Kanaal avatar afbeelding
+ Deze inhoud wordt nog niet ondersteund door NewPipe.
+\n
+\nHopelijk zal dit bij een toekomstige versie ondersteund worden.
+ Denk je dat het laden van de feed te sloom is\? Zo ja, probeer snel laden in te schakelen (in de instellingen of door op onderstaande knop te drukken).
+\n
+\nNewPipe biedt twee strategieën aan voor het laden van de feed:
+\n• Het hele abonnementskanaal ophalen, wat sloom maar compleet is.
+\n• Een speciale feed ophalen, wat snel maar meestal incompleet is.
+\n
+\nHet verschil tussen de twee is dat de snelle meestal wat informatie mist, zoals de duur of type (live of een normale video) van het item en dat er mogelijk minder items zijn.
+\n
+\nYouTube is een voorbeeld van een service die deze snelle methode aanbiedt door zijn RSS-feed.
+\n
+\nDe keuze komt dus neer op wat je liever hebt: snelheid of precieze informatie.
+ Snelle modus uitschakelen
+ Snelle modus inschakelen
+ Beschikbaar in sommige services, het is meestal veel sneller, maar kan een beperkte hoeveelheid items en vaak onvolledige informatie (bijv. geen duur, item type, of live status) bevatten.
+ Uit speciale feed ophalen indien beschikbaar
+ Altijd updaten
+ Tijd na de laatste update voordat een abonnement als verouderd wordt beschouwd — %s
+ Drempel voor feed update
+ Feed
+ Toon enkel niet gegroepeerde abonnementen
+ Nieuw
+ Wilt u deze groep verwijderen\?
+ Lege groepsnaam
+
+ - %d geselecteerd
+ - %d geselecteerd
+
+ Geen abonnement geselecteerd
+ Selecteer abonnementen
+ Feed aan het verwerken…
+ Feed aan het laden…
+ Niet geladen: %d
+ Laatste update nieuwsfeed: %s
+ Kanaalgroepen
+
+ - %d dag
+ - %d dagen
+
+
+ - %d uur
+ - %d uren
+
+
+ - %d minuut
+ - %d minuten
+
+
+ - %d seconde
+ - %d seconden
+
+ Door beperkingen van ExoPlayer is de zoekduur ingesteld op %d seconden
+ Ja, en deels bekeken video\'s
+ Video\'s die zijn bekeken voor, en na, ze werden toegevoegd aan de afspeellijst worden verwijderd.
+\nBent u zeker\? Dit kan niet ongedaan gemaakt worden!
+ Verwijder bekeken video\'s\?
+ Verwijder bekeken
+ Systeem standaard
+ App taal
+ Kies een instantie
+ Het \'Storage Access Framework\' laat downloads naar een externe SD kaart toe.
+\nNiet alle toestellen zijn compatibel
+ Gebruik SAF
+ Je zal gevraagd worden waar elke download op te slaan.
+\nKies SAF als je wilt downloaden naar een externe SD-kaart
+ Vraag waar te downloaden
+ U wordt gevraagd waar elk bestand wordt opgeslagen
+ Pauzeer downloads
+ Downloads starten
+ Maximaal 1 bestand tegelijk zal worden gedownload
+ Limiteer de download wachtrij
+ %1$d downloads verwijderd
+ Verwijder gedownloade bestanden
+ Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen\?
+ Download geschiedenis verwijderen
+ Kan deze download niet herstellen
+ Verbinding time-out
+ Geen vrije ruimte meer op het apparaat
+ NewPipe werd gesloten terwijl het bezig was met het bestand
+ Er staat al een download met deze naam in wacht
+ Kan bestand niet overschrijven
+ Er bestaat al een bestand met deze naam
+ aan het herstellen
+ In afwachting
+ Nooit
+ Enkel via Wi-Fi
+ Automatisch afspelen — %s
+ Originele teksten van services zijn zichtbaar in stream items
+ Toon memory leaks
+ Automatisch gegenereerd (geen uploader gevonden)
+ Geluid aanzetten
+ Dempen
+ In wachtrij geplaatst
+ In wachtrij plaatsen
+ Speel wachtrij af
+ Meest leuk gevonden
+ Recent toegevoegd
+ Lokaal
+ De taal zal veranderen zodra de app opnieuw is opgestart.
+ Geen afspeellijst bladwijzers
+ Selecteer een afspeellijst
+ Standaard kiosk
+ Klaar
+ Tik op \"Klaar\" zodra opgelost
+ ∞ video\'s
+ 100+ video\'s
+
+ - %s luisteraar
+ - %s luisteraars
+
+ Niemand is aan het luisteren
+
+ - %s kijker
+ - %s kijkers
+
+ Niemand is aan het kijken
+ Toggle service, momenteel geselecteerd:
+ Controleer aub of er al een probleem bestaat dat uw crash beschrijft. Wanneer u dubbele tickets aanmaakt, neemt dit tijd van ons in beslag die we beter kunnen besteden aan het oplossen van het daadwerkelijke probleem.
+ In GitHub rapporteren
+ Kopieer opgemaakt rapport
+ Geef toestemming voor weergave over andere apps
+ Stream bestand downloaden
+ Hulp
+ Afspeelposities verwijderd.
+ Alle afspeelposities verwijderen\?
+ Verwijdert alle geschiedenis van afspeelposities
+ Verwijder geschiedenis afspeelposities
+ Verwijder cookies die NewPipe opslaat wanneer u een reCAPTCHA oplost
+ reCAPTCHA cookies zijn verwijderd
+ Verwijder reCAPTCHA cookies
+ Artiesten
+ Albums
+ Nummers
+ Video\'s
+ Deze video heeft een leeftijdsbeperking.
+\n
+\nSchakel \"%1$s\" in bij de instellingen als u die wilt zien.
+ YouTube biedt een \"beperkte modes\" aan, dit verbergt mogelijk materiaal voor volwassenen.
+ YouTube \"beperkte modus\" aanzetten
+ Toon inhoud die mogelijk niet geschikt is voor kinderen omwille van een leeftijdslimiet (zoals 18+).
+ Melding
+ Kanaal bestaat al
+ Alleen HTTPS URL\'s worden ondersteund
+ Kon kanaal niet valideren
+ Kanaal URL invoeren
+ Kanaal toevoegen
+ Vind het kanaal dat u leuk vindt op %s
+ Selecteer je favoriete PeerTube kanaal
+ PeerTube kanaal
+ Kon de URL niet herkennen. In een andere app openen\?
+ Wis data
+ Laat afspeeltijd in afspeellijst zien
+ Posities in lijst
+ Verder afspelen vanaf laatste positie
+ Afspelen hervatten
+ Volgende stream automatisch in wachtrij plaatsen
+ De actieve wachtrij wordt vervangen
+ Veranderen van één speler naar een andere kan jouw wachtrij vervangen
+ Vraag bevestiging om wachtrij te wissen
+ Duur voor-/achteruit spoelen
+ Niets
+ Aan het bufferen
+ Shuffle
+ Herhaal
+ Je kan maximaal drie acties selecteren om te tonen in de compacte notificatie!
+ Pas elke notificatie actie hieronder aan door er op te tikken. Selecteer tot drie acties die getoond worden in de compacte notificatie door gebruik te maken van de selectie vakjes aan de rechterkant.
+ Vijfde actie knop
+ Vierde actie knop
+ Derde actie knop
+ Tweede actie knop
+ Eerste actie knop
+ Schaal de miniatuurafbeelding van de video die getoond wordt in de notificatie van 16:9 naar 1:1 verhouding (kan vervorming creëren)
+ Schaal miniatuurafbeelding naar verhouding 1:1
+ Wijzig de download mappen
+ Toon oorspronkelijke tijd geleden op items
+ Laat Android de kleur van de notificatie aanpassen, op basis van de meest voorkomende kleur in de thumbnail (let op: niet beschikbaar op elk apparaat)
+ Notificatie kleur aanpassen
\ No newline at end of file
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 4476936085e..1cae0732690 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -30,7 +30,7 @@
Standaardtaal voor inhoud
Externe videospeler gebruiken
Externe audiospeler gebruiken
- Audio en video
+ Video en audio
Videovoorbeeldminiatuur
Speel video, tijd:
Gebruikersafbeelding van uploader
@@ -45,12 +45,11 @@
Overig
Speelt af op achtergrond
Inhoud
- Inhoud met leeftijdsbeperking
- Toon video met leeftijdsbeperking. Toestaan van dit soort video’s kan worden ingeschakeld in de Instellingen.
+ Toon inhoud met leeftijdsbeperking
Fout
Netwerkfout
Kan niet alle miniatuurvoorbeelden laden
- Kan video-URL-ondertekening niet ontsleutelen
+ Kan video-URL-ondertekening niet ontsleutelen
Kan website niet verwerken
Inhoud niet beschikbaar
Kan downloadmenu niet instellen
@@ -73,7 +72,8 @@
Video
Geluid
Opnieuw proberen
- Druk op \"zoeken\" om te beginnen
+ Druk op \"zoeken\" om te beginnen
+\n
Automatisch afspelen
Speelt video’s af als NewPipe vanuit een andere app wordt geopend
Live
@@ -85,7 +85,7 @@
Wat:\\nVerzoek:\\nTaal van inhoud:\\nTaal van land:\\nTaal van Applicatie:\\nDienst:\\nTijd in GMT:\\nPakket:\\nVersie:\\nVersie van besturingssysteem:
Meld een probleem
Gebruikersrapport
- Geef eerst toegang tot de opslag
+ Geef eerst toegang tot opslag
Begin
Pauzeren
Afspelen
@@ -103,7 +103,7 @@
Druk voor meer informatie
Even geduld…
Gekopieerd naar klembord
- Selecteer een downloadmap in de Instellingen
+ Selecteer een download map in de Instellingen
Zwart
reCAPTCHA-uitdaging
reCAPTCHA-uitdaging gevraagd
@@ -232,10 +232,8 @@
Verwijderen
Details
Audio-instellingen
- Houd ingedrukt om toe te voegen aan de wachtrij
+ Houd ingedrukt om toe te voegen aan wachtrij
[Onbekend]
- Toevoegen aan wachtrij in de achtergrond
- Toevoegen aan wachtrij in pop-up
Begin hier met afspelen
Begin hier met afspelen in de achtergrond
Begin met afspelen in pop-up
@@ -331,11 +329,14 @@
Vorige exportering
De abonnementen kunnen niet worden geïmporteerd
De abonnementen kunnen niet worden geëxporteerd
- Importeer je YouTube-abonnementen door het exportbestand te downloaden:
-\n
+ Importeer je YouTube-abonnementen vanaf Google Takeout:
+\n
\n1. Ga naar dit adres: %1$s
\n2. Log in op je account
-\n3. De download met het exportbestand zou nu moeten starten
+\n3. Klik op \"Alle YouTube-gegevens inbegrepen\", dan op \"Selectie van alle items ongedaan maken\", dan selecteer alleen \"abonnementen\" en klik op \"OK\"
+\n4. Klik op \"Volgende stap\", dan op \"Export maken\"
+\n5. Klik op de knop \"Downloaden\" nadat deze verschijnt
+\n6. Uit de Takeout zipfile, pak de .json uit (gebruikelijk in de folder \"YouTube en YouTube Music/abonnementen/abonnementen.json\") en importeer deze hier.
Importeer een SoundCloud-profiel door de URL of het ID ervan in te voeren:
\n
\n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten)
@@ -363,7 +364,7 @@
Bijschriftgrootte en -achtergrondstijlen wijzigen. Vereist een herstart van de app.
Er is geen app geïnstalleerd die dit bestand kan afspelen
Kijkgeschiedenis wissen
- Verwijdert de geschiedenis van afgespeelde streams en afspeelposities
+ Verwijdert de geschiedenis van bekeken video\'s en afspeelposities
De gehele kijkgeschiedenis wissen\?
Kijkgeschiedenis gewist.
Zoekgeschiedenis wissen
@@ -407,7 +408,7 @@
Appupdatemelding
Meldingen voor nieuwe versies van NewPipe
Externe opslag niet beschikbaar
- Downloaden naar externe SD-kaart is niet mogelijk. Downloadmap opnieuw instellen\?
+ Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen\?
Fout bij het lezen van de opgeslagen tabbladen, waardoor standaardtabbladen worden gebruikt
Standaardinstellingen herstellen
Wil je de standaardinstellingen herstellen\?
@@ -452,7 +453,7 @@
Stop
Maximum aantal keer proberen
Maximum aantal pogingen voordat de download wordt geannuleerd
- Pauzeren bij overschakelen naar mobiele data
+ Pauzeren bij mobiele data verbinding
Handig voor wanneer u naar mobiel internet overschakelt, hoewel sommige downloads niet gepauzeerd kunnen worden
Gebeurtenissen
Conferenties
@@ -468,28 +469,28 @@
Wis data
Verander de downloadmappen om effect te bekomen
Afspelen hervatten
- Herstel vorige afspeelpositie
- Posities in afspeellijsten
+ Verder afspelen vanaf laatste positie
+ Posities in lijst
Laat afspeeltijd in afspeellijst zien
Afspeelposities verwijderd.
Bestand verplaatst of verwijderd
Een bestand met dezelfde naam bestaat al
Kan bestand niet overschrijven
Er is al een download met deze naam bezig
- Geen ruimte meer op het apparaat
+ Geen vrije ruimte meer op het apparaat
Voortgang verloren, omdat bestand was verwijderd
Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen\?
Limiteer de download wachtrij
Er zal maximaal 1 bestand tegelijk worden gedownload
- Download starten
+ Downloads starten
Downloads pauzeren
- Vraag waar bestanden geplaatst moeten worden
- U zal worden gevraagd waar u bestanden wilt opslaan
+ Vraag waar bestanden gedownload worden
+ U wordt gevraagd waar het bestand wordt opgeslagen
Je zal gevraagd worden waar elke download op te slaan.
\nKies SAF als je wilt downloaden naar een externe SD-kaart
Gebruik SAF
Verwijder afspeelposities
- Verwijder alle afspeelposities
+ Verwijdert alle afspeelposities
Alle afspeelposities verwijderen\?
Niemand is aan het kijken
@@ -502,11 +503,11 @@
- %s luisteraars
De taal zal veranderen zodra de app opnieuw is opgestart.
- Standaardkiosk
- Duur van snel voor-/achteruit zoeken
- PeerTube instanties
- Favoriete PeerTube instanties instellen
- Vind het kanaal dat je leuk vind op %s
+ Standaard kiosk
+ Duur voor-/achteruit spoelen
+ PeerTube kanaal
+ Selecteer je favorite PeerTube kanaal
+ Vind het kanaal dat je leuk vindt op %s
Kanaal toevoegen
Kanaal URL invoeren
Kon kanaal niet valideren
@@ -522,7 +523,7 @@
Verwijder gedownloade bestanden
%1$d downloads verwijderd
Geef toestemming voor weergave over andere apps
- Applicatie taal
+ App taal
Systeem taal gebruiken
Druk op \"Klaar\" zodra opgelost
Klaar
@@ -548,7 +549,7 @@
- %d dagen
Kanaalgroepen
- Nieuwsfeed laatste update: %s
+ Laatste update nieuwsfeed: %s
Niet geladen: %d
Feed aan het laden…
Feed aan het verwerken…
@@ -590,21 +591,21 @@
\n
\nHopelijk zal dit bij een toekomstige versie ondersteund worden.
Ja, en deels bekeken video\'s
- Video\'s die zijn bekeken voor, en na, dat ze werden toegevoegd aan de playlist worden verwijderd.
-\nWeet u het zeker\? Dit kan niet ongedaan gemaakt worden!
+ Video\'s die zijn bekeken voor, en na, ze werden toegevoegd aan de afspeellijst worden verwijderd.
+\nBent u zeker\? Dit kan niet ongedaan gemaakt worden!
Verwijder bekeken video\'s\?
∞ video\'s
100+ video\'s
Deze video heeft een leeftijdsbeperking.
\n
-\nSchakel \"leeftijdsbeperkende inhoud\" in bij de instellingen als u die wilt zien.
+\nSchakel \"%1$s\" in bij de instellingen als u die wilt zien.
Verwijder bekeken
Originele teksten van services zijn zichtbaar in stream-items
- YouTube beperkte modus
- Laat orginele tijd geleden zien
- De avatar-miniatuur van het kanaal
+ YouTube \"beperkte modus\" aanzetten
+ Laat originele tijd geleden zien
+ Kanaal avatar afbeelding
Door %s
- Gecreëerd door %s
+ Gemaakt door %s
Afspeellijst pagina
Toon enkel ongegroepeerde abonnementen
Geen afspeellijst bookmarks
@@ -636,4 +637,14 @@
Schaal de miniatuurafbeelding van de video die getoond wordt in de notificatie van verhouding 16:9 naar 1:1 (dit kan vervorming creëren)
Schaal de miniatuurafbeelding tot verhouding 1:1
Auto-wachtrij
+ Toon memory leaks
+ In de wachtrij geplaatst
+ In de wachtrij plaatsen
+ Verwijder cookies die NewPipe opslaat wanneer u een reCAPTCHA oplost
+ reCAPTCHA cookies zijn verwijderd
+ Verwijder reCAPTCHA cookies
+ YouTube biedt een \"beperkte modes\" aan, dit verbergt mogelijk materiaal voor volwassenen.
+ Toon inhoud die mogelijk niet geschikt is voor kinderen omwille van een leeftijdslimiet (zoals 18+).
+ Laat Android de kleur van de notificatie aanpassen, op basis van de meest voorkomende kleur in de thumbnail (let op: niet beschikbaar op elk apparaat)
+ Notificatie kleur aanpassen
\ No newline at end of file
diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/app/src/main/res/values-or/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
index 25d3342d55f..9f1d5637408 100644
--- a/app/src/main/res/values-pa/strings.xml
+++ b/app/src/main/res/values-pa/strings.xml
@@ -101,7 +101,6 @@
ਪੌਪ-ਅਪ ਪਲੇਯਰ ਵਿੱਚ ਕਤਾਰਬੱਧ
Content
ਉਮਰ ਪ੍ਰਤੀਬੰਧਿਤ Content
- ਉਮਰ ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਦਿਖਾਓ ਸੈਟਿੰਗਸ ਤੋਂ ਅਜਿਹੀ ਸਮੱਗਰੀ ਦੀ ਆਗਿਆ ਦੇਣੀ ਸੰਭਵ ਹੈ.
ਲਾਈਵ
ਡਾਊਨਲੋਡਸ
ਡਾਊਨਲੋਡਸ
@@ -143,7 +142,7 @@
ERROR
ਨੈੱਟਵਰਕ ERROR
ਸਾਰੇ ਥੰਬਨੇਲ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੇ
- ਵੀਡੀਓ URL ਦਸਤਖਤ ਡੀਕ੍ਰਿਪਟ ਨਹੀਂ ਹੋ ਸਕਿਆ
+ ਵੀਡੀਓ URL ਦਸਤਖਤ ਡੀਕ੍ਰਿਪਟ ਨਹੀਂ ਹੋ ਸਕਿਆ
ਵੈਬਸਾਈਟ parse ਨਹੀਂ ਹੋ ਸਕੀ
ਵੈਬਸਾਈਟ ਪੂਰੀ ਤਰਾਂ Parse ਨਹੀਂ ਹੋ ਸਕੀ
Content ਉਪਲਬਧ ਨਹੀਂ ਹੈ
@@ -301,8 +300,6 @@
ਵੇਰਵੇ
ਆਡੀਓ ਸੈਟਿੰਗਾਂ
ਕਤਾਰਬੱਧ ਕਰਨ ਵਾਸਤੇ ਦਬਾ ਕੇ ਰੱਖੋ
- ਬੈਕਗ੍ਰਆਊਂਡ ਵਿੱਚ ਕਤਾਰਬੱਧ ਕਰੋ
- ਨਵੇਂ ਪੌਪ-ਅਪ ਵਿੱਚ ਕਤਾਰਬੱਧ ਕਰੋ
ਇਥੇ ਚਲਾਉ
ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚਲਾਉ
ਨਵੇਂ ਪੌਪ-ਅਪ ਵਿੱਚ ਚਲਾਓ
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 53e6faf4533..b94a7e0e8de 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -1,6 +1,7 @@
- Naciśnij „Szukaj”, aby zacząć
+ Naciśnij „Szukaj”, aby zacząć
+\n
Zainstaluj
Anuluj
Otwórz w przeglądarce
@@ -44,8 +45,7 @@
Inne
Odtwarzanie w tle
Zawartość
- Treści z ograniczeniem wiekowym
- Pokaż wideo z ograniczeniami wiekowymi. Przyszłe zmiany są możliwe z poziomu ustawień.
+ Pokaż treści z ograniczeniem wiekowym
Na żywo
Pobrane
Pobrane
@@ -53,7 +53,7 @@
Błąd
Błąd sieci
Nie można załadować wszystkich miniatur
- Nie można odszyfrować sygnatury URL filmu
+ Nie można odszyfrować sygnatury URL filmu
Nie można przetworzyć strony
Nie można przetworzyć całości strony
Zawartość niedostępna
@@ -242,8 +242,6 @@
Szczegóły
Ustawienia dźwięku
Przytrzymaj, aby zakolejkować
- Kolejkuj w tle
- Kolejkuj w wyskakującym okienku
Zacznij odtwarzać tutaj
Zacznij odtwarzać w tle
Zacznij odtwarzać w wyskakującym okienku
@@ -340,11 +338,14 @@
Poprzedni eksport
Import subskrypcji nie powiódł się
Eksport subskrypcji nie powiódł się
- Aby zaimportować subskrypcje YouTube, potrzebny jest plik eksportu subskrypcji. Możesz go wygenerować w następujący sposób:
+ Importowanie subskrypcji YouTube z Google Takeout:
\n
-\n1. Odwiedź stronę: %1$s
-\n2. Zaloguj się na swoje konto
-\n3. Powinno rozpocząć się pobieranie (to jest twój plik eksportu)
+\n1. Przejdź do tego adresu URL: %1$s
+\n2. Zaloguj się, gdy zostaniesz o to poproszony
+\n3. Kliknij na \"Wybrałeś wszystkie dane z Youtube\", a następnie na \"Odznacz wszystkie\", potem wybierz tylko \"subskrypcje\" i kliknij \"OK\"
+\n4. Kliknij na \"Następny krok\", a następnie na \"Utwórz eksport\"
+\n5. Kliknij przycisk \"Pobierz\", gdy się pojawi i
+\n6. Z pobranego archiwum zip wyodrębnij plik .json (zazwyczaj pod ścieżką \"YouTube i YouTube Music/subskrypcje/subskrypcje.json\") i zaimportuj go tutaj.
Ta operacja może wygenerować duże użycie danych.
\n
\nCzy chcesz kontynuować?
@@ -603,7 +604,7 @@
Piosenki
Ten film ma ograniczenia wiekowe.
\n
-\nWłącz „Treści z ograniczeniami wiekowymi” w ustawieniach, jeśli chcesz je zobaczyć.
+\nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć.
Tak, i częściowo oglądane filmy
Filmy, które zostały obejrzane przed i po dodaniu do playlisty, zostaną usunięte.
\nJesteś pewien\? Tego nie da się cofnąć!
@@ -611,7 +612,7 @@
Usuń oglądane
Oryginalne teksty z usług będą widoczne w elementach strumienia
Pokaż oryginalny czas
- Tryb ograniczony YouTube
+ Włącz tryb ograniczonego dostępu YouTube\'a
Przez %s
Utworzone przez %s
Miniatura awatara kanału
@@ -646,4 +647,14 @@
Przycisk pierwszej akcji
Skaluj miniaturę wideo wyświetlaną w powiadomieniu z proporcji 16: 9 do 1: 1 (może powodować zniekształcenia)
Skaluj miniatury do proporcji 1:1
+ Dodane do kolejki
+ Dodaj do kolejki
+ Pokaż wycieki pamięci
+ Wyczyść ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA
+ Ciasteczka reCAPTCHA zostały wyczyszczone
+ Wyczyść ciasteczka reCAPTCHA
+ YouTube udostępnia \"Tryb ograniczonego dostępu\", który ukrywa treści potencjalnie dla dorosłych.
+ Pokaż treści nieodpowiednie dla dzieci, ponieważ mają ograniczenia wiekowe (np. 18+).
+ Niech Android dostosuje kolor powiadomienia zgodnie z głównym kolorem na miniaturze (nie jest to dostępne na wszystkich urządzeniach)
+ Pokolorowanie powiadomienia
\ No newline at end of file
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index b292b6a00c9..9c2b28904e0 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -1,13 +1,12 @@
Áudio
- Não foi possível descriptografar assinatura do URL do vídeo
+ Não foi possível descriptografar assinatura do URL do vídeo
Seu comentário (em inglês):
O que ocorreu:
Informação:
%1$s visualizações
Reproduzir
- Mostrar vídeo com restrição de idade. É possível alterar esta opção no menu de configurações.
Vídeo
Reproduz um vídeo se NewPipe for chamado por outro app
Autoreprodução
@@ -61,7 +60,7 @@
Vídeo e áudio
Compartilhar
Compartilhar com
- Conteúdo com restrição de idade
+ Mostrar conteúdo com restrição de idade
Mostrar \'Próximo\' e \'Similares\'
Desculpe, isto não devia ter ocorrido.
Iniciar
@@ -89,7 +88,8 @@
O site não pôde ser analisado totalmente
Capa de visualização do vídeo
Transmissões ao vivo ainda não são suportadas
- Toque em \"Buscar\" para iniciar
+ Toque em \"Buscar\" para iniciar
+\n
Arquivo já existe
Threads
Link inválido ou internet indisponível
@@ -234,8 +234,6 @@
Configurações de áudio
Segure para pôr na fila
[Desconhecido]
- Pôr na fila em segundo plano
- Pôr na fila em um popup
Reproduzir daqui
Reproduzir em segundo plano
Reproduzir em um popup
@@ -328,11 +326,14 @@
Exportação anterior
Não foi possível importar inscrições
Não foi possível exportar inscrições
- Importe inscrições do YouTube baixando o arquivo de exportação:
+ Importe inscrições do YouTubedo pelo Google takeout:
\n
\n1. Acesse este link: %1$s
\n2. Logue quando solicitado
-\n3. O download do arquivo de exportação iniciará
+\n3. Clique em \"Todos os dados incluídos\", em seguida, em \"Desmarque todos\", em seguida, selecione apenas \"assinaturas\" e clique em \"OK\"
+\n4. Clique em \"Próximo passo\" e, em seguida, em \"Criar exportação\"
+\n5. Clique no botão \"Baixar\" depois de aparecer e
+\n6. A partir do arquivo zip baixado, retire o arquivo .json (geralmente em \"YouTube e YouTube Music/assinaturas/assinaturas.json\") e importe aqui.
Importe um perfil do SoundCloud digitando o URL ou seu ID:
\n
\n1. Ative o \"modo desktop\" no navegador (o site está indisponível em celulares)
@@ -458,7 +459,7 @@
Pendente
Mostrar comentários
Desative para ocultar comentários
- Autorreprodução
+ Reprodução Automática
Sem comentários
Não foi possível carregar os comentários
Fechar
@@ -591,9 +592,9 @@
Artistas
Álbuns
Músicas
- Este vídeo tem restrisão de idade.
+ Este vídeo tem restrição de idade.
\n
-\nAtive o \"Conteúdo com restrição de idade\" nas configurações se quiser vê-lo.
+\nAtive \"%1$s\" nas configurações se quiser vê-lo.
Sim, e vídeos parcialmente vistos
Vídeos vistos antes e depois de adicionar à lista de reprodução serão removidos.
\nTem certeza\? Isto não pode ser desfeito!
@@ -601,7 +602,7 @@
Remover vistos
Textos originais dos serviços serão visíveis nos itens de transmissão
Mostrar tempo original nos itens
- Modo restrito do YouTube
+ Ativar o \"Modo Restrito\" do YouTube
Por %s
Criado por %s
Capa do avatar do canal
@@ -636,4 +637,14 @@
Primeiro botão de ação
Dimensione a miniatura do vídeo mostrada na notificação de proporção 16:9 para 1:1 (pode apresentar distorções)
Dimensione a miniatura para a proporção de 1:1
+ Mostrar vazamentos de memória
+ Na fila
+ Pôr na fila
+ Apaga os cookies que o NewPipe armazena quando você resolve um reCAPTCHA
+ Apagar cookies de reCAPTCHA
+ Os cookies de reCAPTCHA foram apagados
+ O YouTube oferece um \"Modo Restrito\" que oculta conteúdo potencialmente adulto.
+ Mostrar conteúdo possivelmente inadequado para crianças porque tem um limite de idade (como +18).
+ Permite o Android personalizar a cor da notificação de acordo com a cor principal da miniatura (note que isso não está disponível em todos os dispositivos)
+ Colorir notificação
\ No newline at end of file
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index e3be61ed7c8..590642311f1 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -1,68 +1,69 @@
- Quiosque
+ Kiosk
Recusar
Item eliminado
Iniciar reprodução em segundo plano
- Tenha em atenção que esta operação pode sobrecarregar a sua rede.
-\n
+ Tenha em atenção de que esta operação pode sobrecarregar a sua rede.
+\n
\nDeseja continuar\?
- Toque em \"Pesquisar\" para iniciar
+ Toque em \"Pesquisar\" para iniciar
+\n
Continuar reprodução
Processos
Os carateres inválidos são substituídos por este valor
- Transferir
+ Descarregar
Remove o áudio em algumas resoluções
- %s transferências concluídas
+ %s descargas concluídas
Predefinição do sistema
Minimizar ao trocar de aplicação
Ativar som
Iniciar reprodução num popup
Código
suaID, soundcloud.com/suaID
- Resolução da janela popup predefinida
+ Resolução padrão para janela popup
Aviso: não foi possível importar todos os ficheiros.
- Já existe uma transferência em progresso com este nome
+ Já existe uma descarga em curso com este nome
Ver no GitHub
Conteúdo da página principal
- Progresso perdido, porque o ficheiro foi eliminado
+ Progresso perdido, o ficheiro foi eliminado
Canal não subscrito
Nome do ficheiro
Mostrar indicadores de posição de reprodução em listas
- Notificações para o NewPipe e para os reprodutores \"popup\"
- Desligar (pode causar distorção)
+ Notificações para NewPipe e para os reprodutores popup
+ Desvincular (pode causar distorção)
Mostrar sugestões ao pesquisar
Ficheiro ZIP inválido
Sem visualizações
Claro
Não foi possível alterar a subscrição
- Já existe um ficheiro transferido com este nome
- Criado diretorio de transferência \'%1$s\'
- Permissão negada pelo sistema
+ Já existe um ficheiro descarregado com este nome
+ Pasta \'%1$s\' criada com sucesso
+ Permissão recusada pelo sistema
Pesquisado
Legendas
- Restaurar predefinições
+ Repor predefinições
Ocorreu um erro: %1$s
Popup
- Não foi possível processar totalmente o site da Web
- Transferência do NewPipe
- Devido às restrições do ExoPlayer, a duração da procura foi definida para %d segundos
+ Não foi possível processar totalmente o site
+ Descarga NewPipe
+ Devido às restrições de ExoPlayer, a duração da pesquisa foi definida para %d segundos
Sobrescrever
- Silenciar
+ Sem som
Ver histórico
- %s visualização
- %s visualizações
- Quer limpar o seu histórico de transferências ou apagar todos os ficheiros transferidos\?
+ Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\?
Histórico e cache
Continuar reprodução após interrupções (ex. chamadas)
- Transferir ficheiro de vídeo
+ Descarregar ficheiro de vídeo
+100 vídeos
Seleção
Ajustar
Atualizar sempre
- Reproduzir todos
+ Reproduzir tudo
Eliminar esta lista de reprodução\?
O histórico está vazio
Informação:
@@ -74,62 +75,60 @@
\n
\nEsperamos que seja suportado numa versão futura.
Nenhuma
- Escolha a pasta de transferencias para ficheiros de vídeo
- Quer apagar este grupo\?
+ Escolha a pasta para colocar os ficheiros de vídeo
+ Deseja apagar este grupo\?
Filtrar
Não foi possível encontrar o servidor
Não foi possível importar as subscrições
- Transferências
- A processar feed…
- Gestos para controlar de volume
- Este vídeo é de idade restrita.
+ Descargas
+ A processar…
+ Gestos para controlo de volume
+ Este vídeo é de restrita à idade.
\n
-\nAtive \"Conteúdo restrito à idade\" nas configurações se quiser vê-lo.
- Ler licença
+\nPara o poder ver, tem que ativar \"%1$s\" nas definições.
+ Ver licença
Ajuda
- Somente URLs HTTPS são suportada
+ Apenas pode usar URL no formato HTTPS
Falha ao validar a instância
- Eliminar todos
- Limpar histórico de transferências
- Colocar em fila em segundo plano
- Eliminar todas as posições de reprodução\?
- Mudar visualização
- Limitar a fila de transferências
- Conteúdo com restrição de idade
- O projeto NewPipe leva a sua privacidade muito a sério. Sendo assim, o aplicativo não coleta nenhum dado sem seu consentimento.
-\nA polícia de privacidade do NewPipe explica em detalhes qual dado é enviado e salvo quando você envia um relatório de erros.
+ Eliminar tudo
+ Limpar histórico de descargas
+ Remover todas as posições de reprodução\?
+ Trocar de vista
+ Limitar fila de descargas
+ Mostrar conteúdo com restrição de idade
+ O projeto NewPipe leva a sua privacidade muito a sério. Sendo assim, não recolhe quaisquer dados sem o seu consentimento.
+\nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro.
Ficheiro
Principal
Adicionar a
- Elimina todas as posições de reprodução
+ Remove todas as posições de reprodução
Criar
- Mostrar vídeo com restrição de idade. Alterações serão possíveis nas definições.
Alternar orientação
Subscrever
Artistas
- Não é possível ligar ao servidor
- Exibir uma opção para reproduzir o vídeo via Kodi media center
- Modo de exibição de lista
- A busca inexata permite que a busca seja mais rápida diminuindo a precisão. Procurar por 5, 15 ou 25 segundos não funciona com isto.
- Permitir sobreposição da janela sobre outras aplicações
+ Não foi possível ligar ao servidor
+ Mostrar uma opção para reproduzir o vídeo no Kodi
+ Modo de vista em lista
+ A pesquisa inexata permite que esta seja mais rápida mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente.
+ Permitir sobreposição a outras aplicações
Reprodução automática
Exportar para
Acerca de NewPipe
Página vazia
- Conceder primeiro acesso ao armazenamento
+ Deve conceder acesso ao armazenamento
Geração automática (não foi encontrado nenhum enviador)
- Resolução predefinida
+ Resolução padrão
Reportar no GitHub
- Gostos
+ Gosto
O histórico está desativado
- Pasta para transferir o vídeo
- Pressionar \"Aceitar\" quando terminar
- A carregar feed…
+ Pasta para os vídeos
+ Prima \"Feito\" ao resolver
+ A carregar…
Áudio
- Mostrar tempo original que passou em itens
+ Mostrar antiguidade nos itens
Ficheiro já existe
- Quiosque Predefinição
- Criada a ista de reprodução
+ \'Kiosk\' padrão
+ Lista de reprodução criada
Criado por %s
- %d segundo
@@ -140,47 +139,47 @@
- %d selecionadas
Partilhar
- Ler a política de privacidade
- Ocorreu um erro irrecuperável do reprodutor
- Modo restrito do YouTube
- A pasta não existe
+ Ver política de privacidade
+ Ocorreu um erro compulsivo do reprodutor
+ Ligar o \"Modo Restringido\" do YouTube
+ Pasta inexistente
Tudo
- Desculpe, isso não deveria ter acontecido.
+ Bolas, isto não deveria ter acontecido.
Anular
Não existem canais subscritos
Comportamento
- Por favor, defina mais tarde uma pasta de transferências nas definições
+ Tem que definir, nas definições, uma pasta para as descargas
Posições nas listas
- Uma transferências será executada ao mesmo tempo
+ Uma descarga será executada ao mesmo tempo
Não encontrado
Reprodução em segundo plano
Mostrar resoluções mais altas
Sem subscritores
Utilizar reprodutor de áudio externo
- Desative para parar o carregamento das miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagem do disco e da memória.
- Quis dizer \"%1$s\"\?
+ Desative para parar o carregamento de miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagens do disco e da memória.
+ Será que queria dizer \"%1$s\"\?
Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão
Fila
Ninguém está a ver
- Apagar ficheiros transferidos
+ Remover ficheiros descarregados
Idioma da aplicação
Utilizadores
- Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos.
-\nTem certeza\? Isto não pode ser desfeito!
+ Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos.
+\nTem a certeza\? Esta ação não pode ser revertida!
- %s a ver
- %s a ver
- Por favor, aguarde…
+ Por favor aguarde…
Redimensionar
- Toque para transferir
+ Toque para descarregar
Limpar
Cancelar subscrição
- Deseja eliminar este item do histórico de visualizações\?
+ Deseja remover este item do histórico de visualizações\?
Conteúdo
- Textos originais dos serviços serão visíveis nos itens de fluxo
+ Os textos originais dos serviços serão visíveis nos itens de fluxo
Publicado em %1$s
- Transferência concluída
+ Descarga concluída
Avanço rápido durante silêncio
Não foram encontradas emissões de áudio
NewPipe foi fechado enquanto trabalhava no ficheiro
@@ -190,24 +189,27 @@
Ninguém está a ouvir
Miniatura da lista de reprodução alterada.
Não foi possível carregar os comentários
- País predefinido dos conteúdos
+ País padrão para conteúdo
Aplicação livre de reprodução de emissões para Android.
- Idioma do conteúdo predefinido
- Importe as subscrições do YouTube transferindo o ficheiro de exportação:
-\n
-\n1. Aceda a este URL: %1$s
-\n2. Inicie a sessão
-\n3. A transferência deveria iniciar (esse é o ficheiro de exportação)
- Ativar o reprodutor em segundo plano
+ Idioma padrão para conteúdo
+ Importar subscrições do YouTube do Google Takeout:
+\n
+\n1. Vá para este URL: %1$s
+\n2. Faça o login quando solicitado
+\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\".
+\n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\".
+\n5. Clique no botão \"Descarregar\" após aparecer e
+\n6. A partir do zip do takeout descarregado extraia o ficheiro .json (normalmente em \"YouTube e YouTube Music/subscriptions/subscriptions.json\") e importe-o aqui.
+ Ativar reprodutor em segundo plano
Mais tarde
Desafio reCAPTCHA solicitado
Reprodução automática
- A instância já existe
- NewPipe é desenvolvido por voluntários que utilizam o tempo livre deles para proporcionar-lhe a melhor experiência. Retribua para ajudar os programadores a tornarem o NewPipe ainda melhor enquanto desfruta de um café.
+ Instância já existe
+ NewPipe é desenvolvido por voluntários que utilizam o seu tempo livre para nos proporcionar a melhor experiência. Retribua para ajudar os programadores a tornarem NewPipe ainda melhor.
URL inválido ou Internet não disponível
- Continuar terminando (sem repetição) a fila de reprodução anexando um vídeo relacionado
+ Continuar (sem repetição) a fila de reprodução anexando um vídeo relacionado
Sempre
- Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), nós chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção.
+ Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção.
\nTem que aceitar esta política para nos poder enviar o seu relatório.
Grupos de canais
Instalar
@@ -217,12 +219,12 @@
Não foi possível carregar a imagem
Passo
Top 50
- Não gostar
+ Não gosto
Importar ficheiro
- Notificação do NewPipe
- Desculpa, algo correu mal.
+ Notificação NewPipe
+ Desculpe mas algo correu mal.
Tema
- A pasta de destino não pode ser criada
+ Não foi possível criar a pasta de destino
Licenças de terceiros
Gerar nome único
Ação a executar ao trocar para outra aplicação a partir do menu principal - %s
@@ -239,111 +241,111 @@
Mostrar vídeos \'Seguintes\' e \'Semelhantes\'
na fila
Abrir no navegador
- Novo e tendências
- Elimina o histórico das palavras-chave de pesquisa
- Notificação de atualização
- Não foi possível desencriptar a assinatura do URL do vídeo
+ Novos e tendências
+ Remove o histórico de pesquisas
+ Notificação de nova versão
+ Não foi possível decifrar a assinatura do URL
Serviço
Controlo de reprodução por gestos
Selecione uma lista de reprodução
- Última atualização do feed: %s
+ Última atualização: %s
Importar base de dados
Relatório de erro
- Não há espaço disponível no aparelho
- Número máximo de tentativas antes de cancelar a transferência
+ Não há espaço livre no dispositivo
+ Número máximo de tentativas antes de cancelar a descarga
A recuperar de um erro do reprodutor
Outros
Em direto
- Limite de atualização do feed
+ Limite de atualização da fonte
OK
Não foi possível obter a emissão
Não foi possível atualizar a subscrição
Não existe uma aplicação para reproduzir este ficheiro
- Sim, e também os vídeos parcialmente vistos
+ Sim e também os vídeos parcialmente vistos
M
- Ainda não há marcadores de listas de reprodução
- Em fila no reprodutor de janela popup
+ Ainda não há listas de reprodução favoritas
+ Na fila do reprodutor popup
- %s ouvinte
- %s ouvintes
- Eliminar todo o histórico de pesquisa\?
+ Remover todo o histórico de pesquisas\?
Reportar erro por e-mail
Escolher separador
Utilizar gestos para controlar o volume do reprodutor
Grelha
- Exportados
- Escolha a pasta de transferência para ficheiros de áudio
- Atualização do NewPipe disponível!
+ Exportado
+ Escolha a pasta para colocar os ficheiros de áudio
+ Atualização NewPipe disponível!
Eventos
Nova missão
Política de privacidade do NewPipe
Não foi possível carregar todas as miniaturas
Áudio
Cancelar
- Falha no pós-processamento
- Eliminar todo o histórico de visualizações\?
- A obter a informação…
+ Falha pós-processamento
+ Remover todo o histórico de visualizações\?
+ A obter informação…
Sugestões de pesquisa
- Definir como Miniatura da Lista de Reprodução
+ Definir como miniatura da lista de reprodução
Não foi possível eliminar a lista de reprodução.
- Gestos para controlar o brilho
+ Gestos para controlo de brilho
Abrir menu
- %s subscritor
- %s subscritores
- Deseja restaurar as predefinições\?
+ Deseja repor as predefinições\?
Os reprodutores externos não suportam este tipo de hiperligações
- Renomear
+ Mudar nome
O \'Storage Access Framework\' permite transferências para um cartão SD externo.
\nAlguns aparelhos não são compatíveis
- Duração da busca de avanço/retrocesso rápido
+ Duração da pesquisa de avanço/recuo rápido
Canal
Ficheiro movido ou eliminado
Última reprodução
- Visite o website do NewPipe para obter mais informação e novidades.
- Importe o seu perfil do SoundCloud digitando o URL ou a sua Id.:
-\n
-\n1. Ative o modo de PC no navegador da Web (o site não está disponível para aparelhos móveis)
-\n2. Aceda a este URL: %1$s
-\n3. Inicie a sessão
-\n4. Copie o URL do perfil em que foi redirecionado.
- Limpar os metadados em cache
- Não foi possível analisar o site da Web
+ Visite o site NewPipe para obter mais informação e novidades.
+ Importe o seu perfil SoundCloud digitando o URL ou a ID.:
+\n
+\n1. Ative o modo desktop do seu navegador web (o site não está disponível para aparelhos móveis)
+\n2. Aceda a este URL: %1$s
+\n3. Inicie a sessão
+\n4. Copie o URL do seu perfil.
+ Limpar meta-dados em cache
+ Não foi possível processar o site
Sem comentários
Iniciar reprodução aqui
pós-processamento
não é possível sobrescrever o ficheiro
- Esse ficheiro/fonte de conteúdo não existe
+ Fonte de conteúdo/ficheiro inexistente
Notificações para uma nova versão do NewPipe
Utilizar gestos para controlar o brilho e o volume do reprodutor
Histórico
Lista
- Remover vídeos vistos\?
+ Remover vídeos visualizados\?
- %d minuto
- %d minutos
Terminada
Histórico de vídeos apagado.
- Nenhum reprodutor de vídeo encontrado. Instalar o VLC\?
- Desativar para ocultar comentários
- Limitar resolução se estiver a usar dados móveis
+ Não tem um reprodutor de vídeo. Instalar VLC\?
+ Desative para ocultar comentários
+ Limitar resolução se em dados móveis
Histórico limpo
- Quais os separadores que são mostrados na página principal
+ Separadores mostrados na página principal
Definições de áudio
Eliminar
Ritmo
- Instâncias do PeerTube
+ Instâncias PeerTube
Reprodutor
Depuração
Digite o URL da instância
- Ação de \'abrir\' preferida
+ Ação de \'Abrir\' preferida
Vídeo e áudio
Letras e dígitos
- Irá aparecer aqui qualquer coisa brevemente ;D
- Atualizar
+ Brevemente deve aparecer aqui qualquer coisa ;D
+ Recarregar
A monitorização de memória pode tornar a aplicação instável
Copiar relatório formatado
rotação
@@ -351,51 +353,50 @@
O nome do ficheiro não pode estar vazio
Lista de reprodução
Por %s
- Maioria dos carateres especiais
- Pasta de transferências de áudio
+ Mais caracteres especiais
+ Pasta para ficheiros de áudio
Detalhes:
- Transferir
- Feed
+ Descarregar
+ Fonte
Página da lista de reprodução
Definições
Mais reproduzido
- Pôr na fila num popup
Mostrando resultados para: %s
Mudar para segundo plano
Álbuns
Exportação anterior
- Um ficheiro com este nome já existe
- O servidor não aceita transferências de vários processos, tente novamente com @string/msg_threads = 1
+ Já existe um ficheiro com este nome
+ O servidor não aceita descargas multi-processo, tente novamente com @string/msg_threads = 1
Arraste para reordenar
- recuperando
+ a recuperar
Rejeitar
Controlos para velocidade de reprodução
Não foi possível exportar as subscrições
- Forçar reportagem de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após o eliminação
- Recentemente adicionado
+ Forçar reporte de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após eliminação
+ Recentes
- %s vídeo
- %s vídeos
Importar
- Elimina o histórico dos vídeos reproduzidos e as posições de reprodução
+ Remove o histórico dos vídeos reproduzidos e as posições de reprodução
- %d dia
- %d dias
- Pausar transferências
+ Pausa nas descargas
Desafio reCAPTCHA
Importar de
- 1 elemento eliminado.
+ 1 item eliminado.
Não foram encontradas emissões de vídeo
- Página de Quiosque
+ Página \'kiosk\'
- %d hora
- %d horas
As emissões em direto ainda não são suportadas
Colocar vídeo seguinte na fila
- Defina as suas instâncias favoritas de PeerTube
+ Defina as suas instâncias favoritas PeerTube
Importar/exportar
Exportar histórico, subscrições e listas de reprodução
Melhor resolução
@@ -403,20 +404,20 @@
Escolher navegador
Parar
Aqui não há nada para ver
- Não foi possível configurar o menu de transferências
- Ilimitado
+ Não foi possível configurar o menu de descargas
+ Sem limite
Erro
- Eliminar as posições de reprodução
+ Remover posições de reprodução
A importar…
Novidades
Local
- Aplicação/IU terminou em erro
- Deseja eliminar este item do histórico de pesquisas\?
- Continuar a reprodução
- NewPipe é um software livre \"copyleft\": pode utilizar, estudar, partilhar e melhorar a aplicação. Especificamente, pode redistribuir e/ou modificar a aplicação nos termos da Licença Pública Geral GNU, conforme publicada pela Fundação de Software Livre, tanto a versão 3 da licença ou (por sua opção) qualquer versão superior.
+ Aplicação terminou em erro
+ Deseja remover este item do histórico de pesquisas\?
+ Continuar reprodução
+ NewPipe é um software livre \"copyleft\": pode utilizar, estudar, partilhar e melhorar a aplicação. Especificamente, pode redistribuir e/ou modificar a aplicação nos termos da GNU General Public License, conforme publicada pela Free Software Foundation, tanto a versão 3 da licença ou (por opção) qualquer versão posterior.
∞ vídeos
A exportar…
- Os mais apreciados
+ Mais apreciados
Visualizado
Usar SAF
Detalhes
@@ -426,13 +427,13 @@
Remover
Comentários (em inglês):
Reprodutor de vídeo
- Subscrições
+ Página de subscrições
Não foi possível estabelecer uma ligação segura
Listas de reprodução
Iniciar
- Existe uma transferência pendente com este nome
+ Existe uma descarga pendente com este nome
Aceitar
- Reproduzir vídeo se o NewPipe for invocado por outra aplicação
+ Reproduzir vídeo se NewPipe for invocado por outra aplicação
O que ocorreu:
Participar
Segundo plano
@@ -444,146 +445,146 @@
Histórico
Velocidade
Sim
- Não é possível recuperar esta transferência
- Renomear
+ Não é possível recuperar esta descarga
+ Mudar nome
Nenhuma subscrição selecionada
Manter histórico dos vídeos vistos
- Histórico de pesquisa eliminado.
- Limpar o histórico de pesquisas
+ Histórico de pesquisa removido.
+ Limpar histórico de pesquisas
Erro
Lembrar propriedades de popup
Os ficheiros de vídeo transferidos são armazenados aqui
Mudar para principal
- Esta permissão é necessária
-\npara o modo de janela popup
+ Esta permissão é necessária
+\npara o modo popup
Sem vídeos
Miniatura do avatar do canal
O servidor não envia dados
Reportar erros \'out-of-lifecycle\'
- Instalar a app Kore\?
+ Instalar Kore\?
Relatório
Nome
Copiado para a área de transferência
- Carateres permitidos nos nomes de ficheiros
+ Carateres permitidos no nome dos ficheiros
Gerado automaticamente
Listas de reprodução favoritas
Pendente
- Importados
+ Importado
Automático
Substitui o histórico e as subscrições atuais
Popup
k
- Não é possível criar a diretoria \'%1$s\'
- B
+ Não foi possível criar a pasta \'%1$s\'
+ MM
Remover marcador
- Útil quando mudar para dados móveis, embora algumas transferências não podem ser suspensas
- Toque longo para enfileirar
- Transferências
- O ficheiro não pode ser criado
+ Útil ao trocar para dados móveis, mas algumas descargas não podem ser suspensas
+ Toque longo para colocar na fila
+ Descargas
+ Não foi possível criar o ficheiro
Conferências
Não foi possível ler as guias gravadas, portanto usando as guias predefinidas
Fechar
Sem legendas
- Website
+ Site oficial
Subscrições
- Abrir website
- Retribuir
- Página de \"Feed\"
- Formato de áudio predefinido
- O ficheiro não existe ou as permissões para ler ou escrever faltam
+ Abrir site
+ Contribuir
+ Página de fontes
+ Formato padrão de áudio
+ O ficheiro não existe ou não tem permissões para ler e/ou escrever
O nome do grupo está vazio
Carregar miniaturas
Partilhar com
- Tempo após a última atualização antes de uma subscrição ser considerada desatualizada - %s
+ Tempo após a última atualização antes de a subscrição ser considerada desatualizada - %s
Pesquisar
Atualizações
- Miniatura de pré-visualização de vídeo
+ Miniatura do vídeo
Atualizações
- Iniciar transferências
+ Iniciar descarga
Guardar termos de pesquisa localmente
URL não suportado
Colaboradores
- Transferir
+ Descarregar
Licença do NewPipe
Ficheiro eliminado
- Ativar o modo rápido
+ Ativar modo rápido
Miniatura do avatar do canal
%1$s visualizações
Reprodutor \'popup\'
Disponível em alguns serviços, é geralmente muito mais rápido, mas pode devolver uma quantidade limitada de itens e muitas vezes informações incompletas (por exemplo, sem duração, tipo de item, sem estado ativo).
- Posições de reprodução eliminadas.
- Perguntar para onde transferir
+ Posições de reprodução removidas.
+ Perguntar localização
Reportar um erro
Mostrar informação
Limpar histórico de visualizações
- Não é possível transferir para o cartão SD. Repor a localização da pasta de transferências\?
+ Não é possível guardar no cartão SD. Repor pasta de descargas\?
Modo popup
Servidor não suportado
Checksum
- Restaurar a última posição de reprodução
- Ativar o reprodutor \'popup\'
- Buscar do feed dedicado quando disponível
+ Restaurar última posição de reprodução
+ Ativar reprodutor \'popup\'
+ Se possível, obter de uma fonte dedicada
Selecionar subscrições
- Colocado na lista de reprodução
+ Adicionado à lista de reprodução
Eliminar um
- Formato de vídeo predefinido
+ Formato padrão de vídeo
Mostrar dica \"Toque longo para pôr na fila\"
Escolha uma instância
- Remover todos os dados da página da Web em cache
+ Remover todos os dados da página web
Fechar menu
Utilizar gestos para controlar o brilho do reprodutor
- Remover vistos
+ Remover visualizados
Não foi possível carregar a licença
- Caráter de substituição
+ Carácter de substituição
Vídeo
- Sem vídeos disponíveis para transferir
- Ficheiros de áudio transferidos são armazenados aqui
+ Não existem vídeos para descarregar
+ Os ficheiros de áudio descarregados serão armazenados aqui
Vídeos
- Metadados em cache eliminados
- Mostrar sugestão quando o botão popup ou ambiente de trabalho é pressionado na página de detalhes do vídeo
- Não foi encontrado nenhum reprodutor (pode instalar o VLC para reproduzir).
- Será-lhe solicitado para onde guardar cada transferência
- Será-lhe solicitado para onde guardar cada transferência.
-\nEscolha SAF se pretender transferir para um cartão SD externo
+ Meta-dados em cache limpos
+ Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup
+ Não foi encontrado um reprodutor (pode instalar VLC para reproduzir).
+ Sempre que descarregar um ficheiro, terá que indicar o local para o guardar
+ Sempre que descarregar um ficheiro, terá que indicar o local.
+\nEscolha SAF se quiser descarregar para o cartão SD externo
Mostrar opção \"Reproduzir no Kodi\"
Eliminar
Sem resultados
Desativado
Tendências
Perguntar sempre
- Tempo limite de conexão
- Apenas alguns aparelhos suportam a reprodução de vídeos em 2K/4K
+ Ligação expirada
+ Apenas alguns dispositivos conseguem reproduzir vídeos em 2K/4K
Aparência
Doar
- Por favor, verifique se já existe um assunto a discutir o seu acidente. Criar bilhetes duplicados tirará-nos tempo que poderíamos gastar com a reparação do bug real.
+ Verifique se o seu erro já foi reportado. A criação de erros em duplicado tira-nos tempo que pode ser utilizado para corrigir os erros.
Conteúdo indisponível
Subscrito
Cache de imagens limpa
URL inválido
- Tem a certeza que deseja eliminar todos os itens do histórico\?
- Sobre
+ Tem a certeza de que deseja remover todos os itens do histórico\?
+ Acerca
Contagem de subscrições indisponível
- Ação predefinida ao abrir o conteúdo — %s
+ Ação padrão ao abrir o conteúdo — %s
Repor
Utilizar pesquisa rápida
Está prestes a substituir a configuração atual.
- Mudar para \'popup\'
- %1$d transferências apagadas
+ Mudar para popup
+ %1$d descargas removidas
Adicionar à lista de reprodução
- Reproduzir no modo de janela poppup
- Acha que o carregamento do feed é muito lento\? Se sim, tente ativar o carregamento rápido (pode alterá-lo nas configurações ou pressionando no botão abaixo).
-\n
-\nNewPipe oferece duas estratégias de carregamento de alimentação:
-\n- Obter todo o canal de subscrição, que é lento, mas completo.
-\n- Usando um \'endpoint\' de serviço dedicado, que é rápido, mas normalmente não completo.
-\n
-\nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostar menos itens.
-\n
-\nO YouTube é um exemplo de um serviço que oferece este método rápido com o seu feed RSS.
-\n
+ Reproduzir no modo poppup
+ Acha que a fonte demora muito tempo a carregar\? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo).
+\n
+\nNewPipe oferece duas estratégias de carregamento:
+\n- Obter todo o canal de subscrição - lento, mas completo.
+\n- Usar um \'endpoint\' dedicado - mais rápido, mas não completo.
+\n
+\nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostrar menos itens.
+\n
+\nO YouTube é um exemplo de um serviço que oferece este método rápido com a sua fonte RSS.
+\n
\nAssim, a escolha resume-se ao que prefere: velocidade ou informação precisa.
- (Experimental) Forçar o tráfego de transferência via Tor para aumentar a privacidade (ainda não é suportada a emissão de vídeos).
- Alterar as pastas de transferência para que tenham efeito
+ (Experimental) Forçar tráfego via Tor para aumentar a privacidade (ainda não é suportada a emissão de vídeos).
+ Altere as pastas utilizadas para aplicar
Abrir em modo popup
Pausa
A carregar o conteúdo solicitado
@@ -591,21 +592,21 @@
Exportar base de dados
Usar Tor
Mostrar apenas assinaturas não agrupadas
- Incapaz de reproduzir este vídeo
+ Não foi possível reproduzir este vídeo
Reprodutor em segundo plano
Reproduzir
Mostrar erro
- Modificar escala das legendas e o estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações.
+ Modificar escala de legendas e estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações.
Ação recusada pelo sistema
Músicas
- Sobre
- Em lista de espera no reprodutor em segundo plano
- O idioma mudará quando a app for reiniciada.
+ Acerca
+ Na fila do reprodutor em segundo plano
+ O idioma será alterado assim que reiniciar a aplicação.
Adicionar instância
Faixas
Reproduzir no Kodi
Armazenamento externo indisponível
- Transferência falhou
+ Falha ao descarregar
Relatório
Toque para detalhes
em pausa
@@ -613,27 +614,37 @@
Aceitar
Desativar modo rápido
Nunca
- Apenas no Wi-Fi
+ Apenas em Wi-Fi
Iniciar reprodução automaticamente — %s
- Reproduzir a fila
+ Reproduzir fila
Notificação
- Não foi possível reconhecer o URL. Abrir com outra app\?
- Pôr na fila automaticamente
+ URL não reconhecido. Abrir com outra aplicação\?
+ Colocar na fila automaticamente
A fila do reprodutor ativo será substituída
Mudar de um reprodutor para outro pode substituir a sua fila
Solicitar confirmação antes de limpar uma fila
Lembrar do último tamanho e posição do popup
Nada
- A pôr no buffer
+ Processamento...
Baralhar
Repetir
- Pode selecionar no máximo três ações para mostrar na notificação compacta!
- Edite cada ação de notificação abaixo tocando nela. Selecione até três deles para serem mostrados na notificação compacta usando as caixas de seleção à direita.
+ Pode selecionar, no máximo, três ações para mostrar na notificação compacta!
+ Edite cada ação de notificação abaixo tocando nela. Selecione até três delas para serem mostrados na notificação compacta usando as caixas de seleção à direita.
Quinto botão de ação
Quarto botão de ação
Terceiro botão de ação
Segundo botão de ação
Primeiro botão de ação
- Dimensionar a miniatura de vídeo mostrada na notificação de proporção de 16:9 a 1:1 (pode introduzir distorções)
- Dimensionar a miniatura à proporção de 1:1
+ Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 (pode introduzir distorções)
+ Ajustar miniatura à proporção de 1:1
+ Mostrar vazamentos de memória
+ Enfileirado
+ Pôr na fila
+ Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA
+ Os cookies reCAPTCHA foram limpos
+ Limpar cookies reCAPTCHA
+ O YouTube fornece um \"Modo Restrito\" que oculta conteúdo potencialmente para adultos.
+ Mostrar conteúdo possivelmente impróprio para crianças porque tem um limite de idade (como 18+).
+ Fazer com que o Android personalize a cor da notificação de acordo com a cor principal na miniatura (note que esta não está disponível em todos os aparelhos)
+ Colorir a notificação
\ No newline at end of file
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 08032ea0737..860dc20b58e 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -2,40 +2,40 @@
%1$s visualizações
Publicado em %1$s
- Nenhum reprodutor de vídeo encontrado. Instalar o VLC\?
+ Não tem um reprodutor de vídeo. Instalar VLC\?
Instalar
Cancelar
Abrir no navegador
Partilhar
- Transferir
+ Descarregar
Pesquisar
Definições
- Quis dizer \"%1$s\"\?
+ Será que queria dizer \"%1$s\"\?
Partilhar com
Escolher navegador
rotação
Usar reprodutor de vídeo externo
Utilizar reprodutor de áudio externo
- Pasta para transferir o vídeo
- Os ficheiros de vídeo transferidos são armazenados aqui
- Escolha a pasta de transferencias para ficheiros de vídeo
- Resolução predefinida
+ Pasta para os vídeos
+ Os ficheiros de vídeo descarregados serão armazenados aqui
+ Escolha a pasta para colocar os ficheiros de vídeo
+ Resolução padrão
Reproduzir no Kodi
- Instalar a app Kore\?
+ Instalar Kore\?
Mostrar opção \"Reproduzir no Kodi\"
- Exibir uma opção para reproduzir o vídeo via Kodi media center
+ Mostrar uma opção para reproduzir o vídeo no Kodi
Áudio
- Formato de áudio predefinido
- Transferir
+ Formato padrão de áudio
+ Descarregar
Mostrar vídeos \'Seguintes\' e \'Semelhantes\'
URL não suportado
- Idioma do conteúdo predefinido
+ Idioma padrão para conteúdo
Vídeo e áudio
- Miniatura de pré-visualização de vídeo
+ Miniatura do vídeo
Reproduzir vídeo, duração:
Miniatura do avatar do canal
- Não gostar
- Gostos
+ Não gosto
+ Gosto
Tema
Escuro
Claro
@@ -44,27 +44,26 @@
Reprodução em segundo plano
Erro de rede
Usar Tor
- (Experimental) Forçar o tráfego de transferência via Tor para aumentar a privacidade (ainda não é suportada a emissão de vídeos).
- Pasta de transferências de áudio
- Ficheiros de áudio transferidos são armazenados aqui
- Escolha a pasta de transferência para ficheiros de áudio
- Não é possível criar a diretoria \'%1$s\'
- Criado diretorio de transferência \'%1$s\'
+ (Experimental) Forçar tráfego via Tor para aumentar a privacidade (ainda não é suportada a emissão de vídeos).
+ Pasta para ficheiros de áudio
+ Os ficheiros de áudio descarregados serão armazenados aqui
+ Escolha a pasta para colocar os ficheiros de áudio
+ Não foi possível criar a pasta \'%1$s\'
+ Pasta \'%1$s\' criada com sucesso
Erro
Não foi possível carregar todas as miniaturas
- Não foi possível desencriptar a assinatura do URL do vídeo
- Não foi possível analisar o site da Web
+ Não foi possível decifrar a assinatura do URL
+ Não foi possível processar o site
Conteúdo indisponível
Conteúdo
- Conteúdo com restrição de idade
- Mostrar vídeo com restrição de idade. Alterações serão possíveis nas definições.
- Não foi possível processar totalmente o site da Web
- Não foi possível configurar o menu de transferências
+ Mostrar conteúdo com restrição de idade
+ Não foi possível processar totalmente o site
+ Não foi possível configurar o menu de descargas
As emissões em direto ainda não são suportadas
Não foi possível obter a emissão
- Desculpe, isso não deveria ter acontecido.
+ Bolas, isto não deveria ter acontecido.
Reportar erro por e-mail
- Desculpa, algo correu mal.
+ Desculpe mas algo correu mal.
Relatório
Informação:
O que ocorreu:
@@ -73,15 +72,16 @@
Vídeo
Áudio
Tentar novamente
- Conceder primeiro acesso ao armazenamento
- Toque em \"Pesquisar\" para iniciar
+ Deve conceder acesso ao armazenamento
+ Toque \"Pesquisar\" para iniciar
+\n
Reprodução automática
- Reproduzir vídeo se o NewPipe for invocado por outra aplicação
+ Reproduzir vídeo se NewPipe for invocado por outra aplicação
Em direto
Reportar um erro
Relatório
- Transferências
- Transferências
+ Descargas
+ Descargas
Relatório de erro
Iniciar
Pausa
@@ -95,14 +95,14 @@
Ficheiro já existe
URL inválido ou Internet não disponível
Toque para detalhes
- Por favor, aguarde…
+ Por favor aguarde…
Copiado para a área de transferência
- Por favor, defina mais tarde uma pasta de transferências nas definições
+ Tem que definir, nas definições, uma pasta para as descargas
OK
Processos
- Transferência do NewPipe
+ Descarga NewPipe
Não foi possível carregar a imagem
- Aplicação/IU terminou em erro
+ Aplicação terminou em erro
O quê:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo\\nIdioma da app\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO:
Abrir em modo popup
Preto
@@ -112,23 +112,23 @@
Mais tarde
k
M
- B
- Esta permissão é necessária
-\npara o modo de janela popup
+ MM
+ Esta permissão é necessária
+\npara o modo popup
Desafio reCAPTCHA
Desafio reCAPTCHA solicitado
Modo popup
- Reproduzir no modo de janela poppup
- Formato de vídeo predefinido
+ Reproduzir no modo poppup
+ Formato padrão de vídeo
Desativado
- Resolução da janela popup predefinida
+ Resolução padrão para janela popup
Mostrar resoluções mais altas
- Apenas alguns aparelhos suportam a reprodução de vídeos em 2K/4K
+ Apenas alguns dispositivos conseguem reproduzir vídeos em 2K/4K
Popup
Lembrar propriedades de popup
Popup
Filtrar
- Atualizar
+ Recarregar
Limpar
Segundo plano
Remove o áudio em algumas resoluções
@@ -141,19 +141,19 @@
Melhor resolução
Acerca de NewPipe
Definições
- Sobre
+ Acerca
Licenças de terceiros
© %1$s de %2$s nos termos da %3$s
Não foi possível carregar a licença
- Abrir website
- Sobre
+ Abrir site
+ Acerca
Colaboradores
Licenças
Aplicação livre de reprodução de emissões para Android.
Ver no GitHub
Licença do NewPipe
Se tem ideias para: tradução, alterações de desenho, limpeza de código, ou alterações significativas no código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará!
- Ler licença
+ Ver licença
Participar
Subscrever
Subscrito
@@ -167,15 +167,15 @@
Guardar termos de pesquisa localmente
Ver histórico
Manter histórico dos vídeos vistos
- Continuar a reprodução
+ Continuar reprodução
Continuar reprodução após interrupções (ex. chamadas)
Reprodutor
Comportamento
Histórico e cache
Lista de reprodução
Anular
- Notificação do NewPipe
- Notificações para o NewPipe e para os reprodutores \"popup\"
+ Notificação NewPipe
+ Notificações para NewPipe e para os reprodutores popup
Sem resultados
Aqui não há nada para ver
Sem subscritores
@@ -193,12 +193,12 @@
- %s vídeo
- %s vídeos
- Transferir
- Carateres permitidos nos nomes de ficheiros
+ Descarregar
+ Carateres permitidos no nome dos ficheiros
Os carateres inválidos são substituídos por este valor
- Caráter de substituição
+ Carácter de substituição
Letras e dígitos
- Maioria dos carateres especiais
+ Mais caracteres especiais
Histórico
Pesquisado
Visualizado
@@ -207,22 +207,22 @@
O histórico está vazio
Histórico limpo
Item eliminado
- Deseja eliminar este item do histórico de pesquisas\?
- Reproduzir todos
+ Deseja remover este item do histórico de pesquisas\?
+ Reproduzir tudo
[Desconhecido]
- Ocorreu um erro irrecuperável do reprodutor
+ Ocorreu um erro compulsivo do reprodutor
A recuperar de um erro do reprodutor
Conteúdo da página principal
Página vazia
- Subscrições
+ Página de subscrições
Página do canal
Selecione um canal
Não existem canais subscritos
Selecione um \"kiosk\"
- Quiosque
+ Kiosk
Tendências
Top 50
- Novo e tendências
+ Novos e tendências
Remover
Detalhes
Definições de áudio
@@ -239,75 +239,75 @@
Exportar base de dados
Substitui o histórico e as subscrições atuais
Exportar histórico, subscrições e listas de reprodução
- Em lista de espera no reprodutor em segundo plano
- Em fila no reprodutor de janela popup
+ Na fila do reprodutor em segundo plano
+ Na fila do reprodutor popup
Mudar para segundo plano
- Mudar para \'popup\'
+ Mudar para popup
Mudar para principal
- Incapaz de reproduzir este vídeo
+ Não foi possível reproduzir este vídeo
Os reprodutores externos não suportam este tipo de hiperligações
URL inválido
Arraste para reordenar
Criar
Eliminar um
- Eliminar todos
- Renomear
+ Eliminar tudo
+ Mudar nome
Doar
- Não foi encontrado nenhum reprodutor (pode instalar o VLC para reproduzir).
- Transferir ficheiro de vídeo
+ Não foi encontrado um reprodutor (pode instalar VLC para reproduzir).
+ Descarregar ficheiro de vídeo
Adicionar a
Utilizar pesquisa rápida
- A busca inexata permite que a busca seja mais rápida diminuindo a precisão. Procurar por 5, 15 ou 25 segundos não funciona com isto.
+ A pesquisa inexata permite que esta seja mais rápida mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente.
Carregar miniaturas
- Desative para parar o carregamento das miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagem do disco e da memória.
+ Desative para parar o carregamento de miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagens do disco e da memória.
Cache de imagens limpa
- País predefinido dos conteúdos
+ País padrão para conteúdo
Depuração
Não foram encontradas emissões de vídeo
Não foram encontradas emissões de áudio
- A pasta não existe
- Esse ficheiro/fonte de conteúdo não existe
- O ficheiro não existe ou as permissões para ler ou escrever faltam
+ Pasta inexistente
+ Fonte de conteúdo/ficheiro inexistente
+ O ficheiro não existe ou não tem permissões para ler e/ou escrever
O nome do ficheiro não pode estar vazio
Ocorreu um erro: %1$s
- Sem vídeos disponíveis para transferir
+ Não existem vídeos para descarregar
Rejeitar
- Website
- Visite o website do NewPipe para obter mais informação e novidades.
- Página de Quiosque
- Página de \"Feed\"
- Exportados
- Importados
+ Site oficial
+ Visite o site NewPipe para obter mais informação e novidades.
+ Página \'kiosk\'
+ Página de fontes
+ Exportado
+ Importado
Ficheiro ZIP inválido
Aviso: não foi possível importar todos os ficheiros.
Está prestes a substituir a configuração atual.
Abrir menu
Fechar menu
Nome
- Limpar os metadados em cache
- Remover todos os dados da página da Web em cache
- Metadados em cache eliminados
+ Limpar meta-dados em cache
+ Remover todos os dados da página web
+ Meta-dados em cache limpos
Ficheiro
- Deseja eliminar este item do histórico de visualizações\?
- Tem a certeza que deseja eliminar todos os itens do histórico\?
+ Deseja remover este item do histórico de visualizações\?
+ Tem a certeza de que deseja remover todos os itens do histórico\?
Última reprodução
Mais reproduzido
- Irá aparecer aqui qualquer coisa brevemente ;D
+ Brevemente deve aparecer aqui qualquer coisa ;D
Reprodutor de vídeo
Reprodutor em segundo plano
Reprodutor \'popup\'
Perguntar sempre
- A obter a informação…
+ A obter informação…
A carregar o conteúdo solicitado
Nova lista de reprodução
Eliminar
- Renomear
+ Mudar nome
Adicionar à lista de reprodução
Guardar lista de reprodução como favorita
Remover marcador
Eliminar esta lista de reprodução\?
- Criada a ista de reprodução
- Colocado na lista de reprodução
+ Lista de reprodução criada
+ Adicionado à lista de reprodução
Miniatura da lista de reprodução alterada.
Sem legendas
Ampliar
@@ -323,177 +323,178 @@
Exportação anterior
Não foi possível importar as subscrições
Não foi possível exportar as subscrições
- Importe as subscrições do YouTube transferindo o ficheiro de exportação:
-\n
-\n1. Aceda a este URL: %1$s
-\n2. Inicie a sessão
-\n3. A transferência deveria iniciar (esse é o ficheiro de exportação)
- Importe o seu perfil do SoundCloud digitando o URL ou a sua Id.:
-\n
-\n1. Ative o modo de PC no navegador da Web (o site não está disponível para aparelhos móveis)
-\n2. Aceda a este URL: %1$s
-\n3. Inicie a sessão
-\n4. Copie o URL do perfil em que foi redirecionado.
+ Importar subscrições do YouTube do Google Takeout:
+\n
+\n1. Vá para este URL: %1$s
+\n2. Faça o login quando solicitado
+\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\".
+\n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\".
+\n5. Clique no botão \"Descarregar\" após aparecer e
+\n6. A partir do zip do takeout descarregado extraia o ficheiro .json (normalmente em \"YouTube e YouTube Music/subscriptions/subscriptions.json\") e importe-o aqui.
+ Importe o seu perfil SoundCloud digitando o URL ou a ID.:
+\n
+\n1. Ative o modo desktop do seu navegador web (o site não está disponível para aparelhos móveis)
+\n2. Aceda a este URL: %1$s
+\n3. Inicie a sessão
+\n4. Copie o URL do seu perfil.
suaID, soundcloud.com/suaID
Controlos para velocidade de reprodução
Ritmo
Limpar histórico de visualizações
- Continuar terminando (sem repetição) a fila de reprodução anexando um vídeo relacionado
+ Continuar (sem repetição) a fila de reprodução anexando um vídeo relacionado
Mostrar dica \"Toque longo para pôr na fila\"
- Mostrar sugestão quando o botão popup ou ambiente de trabalho é pressionado na página de detalhes do vídeo
+ Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup
Canais
Listas de reprodução
Faixas
Utilizadores
- Elimina o histórico dos vídeos reproduzidos e as posições de reprodução
- Eliminar todo o histórico de visualizações\?
+ Remove o histórico dos vídeos reproduzidos e as posições de reprodução
+ Remover todo o histórico de visualizações\?
Histórico de vídeos apagado.
- Limpar o histórico de pesquisas
- Elimina o histórico das palavras-chave de pesquisa
- Eliminar todo o histórico de pesquisa\?
- Histórico de pesquisa eliminado.
- 1 elemento eliminado.
+ Limpar histórico de pesquisas
+ Remove o histórico de pesquisas
+ Remover todo o histórico de pesquisas\?
+ Histórico de pesquisa removido.
+ 1 item eliminado.
Não existe uma aplicação para reproduzir este ficheiro
- NewPipe é desenvolvido por voluntários que utilizam o tempo livre deles para proporcionar-lhe a melhor experiência. Retribua para ajudar os programadores a tornarem o NewPipe ainda melhor enquanto desfruta de um café.
- Retribuir
+ NewPipe é desenvolvido por voluntários que utilizam o seu tempo livre para nos proporcionar a melhor experiência. Retribua para ajudar os programadores a tornarem NewPipe ainda melhor.
+ Contribuir
Política de privacidade do NewPipe
- O projeto NewPipe leva a sua privacidade muito a sério. Sendo assim, o aplicativo não coleta nenhum dado sem seu consentimento.
-\nA polícia de privacidade do NewPipe explica em detalhes qual dado é enviado e salvo quando você envia um relatório de erros.
- Ler a política de privacidade
+ O projeto NewPipe leva a sua privacidade muito a sério. Sendo assim, não recolhe quaisquer dados sem o seu consentimento.
+\nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro.
+ Ver política de privacidade
Colocar vídeo seguinte na fila
- NewPipe é um software livre \"copyleft\": pode utilizar, estudar, partilhar e melhorar a aplicação. Especificamente, pode redistribuir e/ou modificar a aplicação nos termos da Licença Pública Geral GNU, conforme publicada pela Fundação de Software Livre, tanto a versão 3 da licença ou (por sua opção) qualquer versão superior.
+ NewPipe é um software livre \"copyleft\": pode utilizar, estudar, partilhar e melhorar a aplicação. Especificamente, pode redistribuir e/ou modificar a aplicação nos termos da GNU General Public License, conforme publicada pela Free Software Foundation, tanto a versão 3 da licença ou (por opção) qualquer versão posterior.
Também deseja importar as definições\?
- Toque longo para enfileirar
- Colocar em fila em segundo plano
- Pôr na fila num popup
- Ação de \'abrir\' preferida
- Ação predefinida ao abrir o conteúdo — %s
- Definir como Miniatura da Lista de Reprodução
+ Toque longo para colocar na fila
+ Ação de \'Abrir\' preferida
+ Ação padrão ao abrir o conteúdo — %s
+ Definir como miniatura da lista de reprodução
Não foi possível eliminar a lista de reprodução.
Ajustar
Preencher
- Modificar escala das legendas e o estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações.
+ Modificar escala de legendas e estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações.
A monitorização de memória pode tornar a aplicação instável
Reportar erros \'out-of-lifecycle\'
- Forçar reportagem de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após o eliminação
- Tenha em atenção que esta operação pode sobrecarregar a sua rede.
-\n
+ Forçar reporte de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após eliminação
+ Tenha em atenção de que esta operação pode sobrecarregar a sua rede.
+\n
\nDeseja continuar\?
Velocidade
- Desligar (pode causar distorção)
+ Desvincular (pode causar distorção)
Avanço rápido durante silêncio
Passo
Repor
- Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), nós chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção.
+ Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção.
\nTem que aceitar esta política para nos poder enviar o seu relatório.
Aceitar
Recusar
- Ilimitado
- Limitar resolução se estiver a usar dados móveis
+ Sem limite
+ Limitar resolução se em dados móveis
Minimizar ao trocar de aplicação
Ação a executar ao trocar para outra aplicação a partir do menu principal - %s
Nenhuma
- Ativar o reprodutor em segundo plano
- Ativar o reprodutor \'popup\'
+ Ativar reprodutor em segundo plano
+ Ativar reprodutor \'popup\'
Cancelar subscrição
Novo separador
Escolher separador
- Gestos para controlar de volume
+ Gestos para controlo de volume
Utilizar gestos para controlar o volume do reprodutor
- Gestos para controlar o brilho
+ Gestos para controlo de brilho
Utilizar gestos para controlar o brilho do reprodutor
Atualizações
Ficheiro eliminado
- Notificação de atualização
+ Notificação de nova versão
Notificações para uma nova versão do NewPipe
Armazenamento externo indisponível
- Não é possível transferir para o cartão SD. Repor a localização da pasta de transferências\?
+ Não é possível guardar no cartão SD. Repor pasta de descargas\?
Não foi possível ler as guias gravadas, portanto usando as guias predefinidas
- Restaurar predefinições
- Deseja restaurar as predefinições\?
+ Repor predefinições
+ Deseja repor as predefinições\?
Contagem de subscrições indisponível
- Quais os separadores que são mostrados na página principal
+ Separadores mostrados na página principal
Seleção
Atualizações
Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão
- Modo de exibição de lista
+ Modo de vista em lista
Lista
Grelha
Automático
- Mudar visualização
- Atualização do NewPipe disponível!
- Toque para transferir
+ Trocar de vista
+ Atualização NewPipe disponível!
+ Toque para descarregar
Terminada
em pausa
na fila
pós-processamento
Fila
Ação recusada pelo sistema
- Transferência falhou
- Transferência concluída
- %s transferências concluídas
+ Falha ao descarregar
+ Descarga concluída
+ %s descargas concluídas
Gerar nome único
Sobrescrever
- Já existe um ficheiro transferido com este nome
- Já existe uma transferência em progresso com este nome
+ Já existe um ficheiro descarregado com este nome
+ Já existe uma descarga em curso com este nome
Mostrar erro
Código
- O ficheiro não pode ser criado
- A pasta de destino não pode ser criada
- Permissão negada pelo sistema
+ Não foi possível criar o ficheiro
+ Não foi possível criar a pasta de destino
+ Permissão recusada pelo sistema
Não foi possível estabelecer uma ligação segura
Não foi possível encontrar o servidor
- Não é possível ligar ao servidor
+ Não foi possível ligar ao servidor
O servidor não envia dados
- O servidor não aceita transferências de vários processos, tente novamente com @string/msg_threads = 1
+ O servidor não aceita descargas multi-processo, tente novamente com @string/msg_threads = 1
Não encontrado
- Falha no pós-processamento
+ Falha pós-processamento
Parar
Tentativas máximas
- Número máximo de tentativas antes de cancelar a transferência
+ Número máximo de tentativas antes de cancelar a descarga
Interromper em redes limitadas
- Útil quando mudar para dados móveis, embora algumas transferências não podem ser suspensas
+ Útil ao trocar para dados móveis, mas algumas descargas não podem ser suspensas
Eventos
Conferências
Pendente
Mostrar comentários
- Desativar para ocultar comentários
+ Desative para ocultar comentários
Reprodução automática
Sem comentários
Não foi possível carregar os comentários
Fechar
Continuar reprodução
- Restaurar a última posição de reprodução
+ Restaurar última posição de reprodução
Posições nas listas
Mostrar indicadores de posição de reprodução em listas
Limpar dados
- Posições de reprodução eliminadas.
+ Posições de reprodução removidas.
Ficheiro movido ou eliminado
- Um ficheiro com este nome já existe
+ Já existe um ficheiro com este nome
não é possível sobrescrever o ficheiro
- Existe uma transferência pendente com este nome
+ Existe uma descarga pendente com este nome
NewPipe foi fechado enquanto trabalhava no ficheiro
- Não há espaço disponível no aparelho
- Progresso perdido, porque o ficheiro foi eliminado
- Tempo limite de conexão
- Quer limpar o seu histórico de transferências ou apagar todos os ficheiros transferidos\?
- Limitar a fila de transferências
- Uma transferências será executada ao mesmo tempo
- Iniciar transferências
- Pausar transferências
- Perguntar para onde transferir
- Será-lhe solicitado para onde guardar cada transferência
- Será-lhe solicitado para onde guardar cada transferência.
-\nEscolha SAF se pretender transferir para um cartão SD externo
+ Não há espaço livre no dispositivo
+ Progresso perdido, o ficheiro foi eliminado
+ Ligação expirada
+ Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\?
+ Limitar fila de descargas
+ Uma descarga será executada ao mesmo tempo
+ Iniciar descarga
+ Pausa nas descargas
+ Perguntar localização
+ Sempre que descarregar um ficheiro, terá que indicar o local para o guardar
+ Sempre que descarregar um ficheiro, terá que indicar o local.
+\nEscolha SAF se quiser descarregar para o cartão SD externo
Usar SAF
O \'Storage Access Framework\' permite transferências para um cartão SD externo.
\nAlguns aparelhos não são compatíveis
- Eliminar as posições de reprodução
- Elimina todas as posições de reprodução
- Eliminar todas as posições de reprodução\?
- Alterar as pastas de transferência para que tenham efeito
+ Remover posições de reprodução
+ Remove todas as posições de reprodução
+ Remover todas as posições de reprodução\?
+ Altere as pastas utilizadas para aplicar
Alternar serviço, agora selecionado:
- Quiosque Predefinição
+ \'Kiosk\' padrão
Ninguém está a ver
- %s a ver
@@ -504,52 +505,52 @@
- %s ouvinte
- %s ouvintes
- O idioma mudará quando a app for reiniciada.
- Duração da busca de avanço/retrocesso rápido
- Instâncias do PeerTube
- Defina as suas instâncias favoritas de PeerTube
+ O idioma será alterado assim que reiniciar a aplicação.
+ Duração da pesquisa de avanço/recuo rápido
+ Instâncias PeerTube
+ Defina as suas instâncias favoritas PeerTube
Encontre as instâncias que gosta em %s
Adicionar instância
Digite o URL da instância
Falha ao validar a instância
- Somente URLs HTTPS são suportada
- A instância já existe
+ Apenas pode usar URL no formato HTTPS
+ Instância já existe
Local
- Recentemente adicionado
- Os mais apreciados
+ Recentes
+ Mais apreciados
Geração automática (não foi encontrado nenhum enviador)
- recuperando
- Não é possível recuperar esta transferência
+ a recuperar
+ Não é possível recuperar esta descarga
Escolha uma instância
- Limpar histórico de transferências
- Apagar ficheiros transferidos
- %1$d transferências apagadas
- Permitir sobreposição da janela sobre outras aplicações
+ Limpar histórico de descargas
+ Remover ficheiros descarregados
+ %1$d descargas removidas
+ Permitir sobreposição a outras aplicações
Idioma da aplicação
Predefinição do sistema
- Pressionar \"Aceitar\" quando terminar
+ Prima \"Feito\" ao resolver
Aceitar
- Acha que o carregamento do feed é muito lento\? Se sim, tente ativar o carregamento rápido (pode alterá-lo nas configurações ou pressionando no botão abaixo).
-\n
-\nNewPipe oferece duas estratégias de carregamento de alimentação:
-\n- Obter todo o canal de subscrição, que é lento, mas completo.
-\n- Usando um \'endpoint\' de serviço dedicado, que é rápido, mas normalmente não completo.
-\n
-\nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostar menos itens.
-\n
-\nO YouTube é um exemplo de um serviço que oferece este método rápido com o seu feed RSS.
-\n
+ Acha que a fonte demora muito tempo a carregar\? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo).
+\n
+\nNewPipe oferece duas estratégias de carregamento:
+\n- Obter todo o canal de subscrição - lento, mas completo.
+\n- Usar um \'endpoint\' dedicado - mais rápido, mas não completo.
+\n
+\nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostrar menos itens.
+\n
+\nO YouTube é um exemplo de um serviço que oferece este método rápido com a sua fonte RSS.
+\n
\nAssim, a escolha resume-se ao que prefere: velocidade ou informação precisa.
Desativar modo rápido
- Ativar o modo rápido
+ Ativar modo rápido
Disponível em alguns serviços, é geralmente muito mais rápido, mas pode devolver uma quantidade limitada de itens e muitas vezes informações incompletas (por exemplo, sem duração, tipo de item, sem estado ativo).
- Buscar do feed dedicado quando disponível
+ Se possível, obter de uma fonte dedicada
Atualizar sempre
- Tempo após a última atualização antes de uma subscrição ser considerada desatualizada - %s
- Limite de atualização do feed
- Feed
+ Tempo após a última atualização antes de a subscrição ser considerada desatualizada - %s
+ Limite de atualização da fonte
+ Fonte
Novo
- Quer apagar este grupo\?
+ Deseja apagar este grupo\?
O nome do grupo está vazio
- %d selecionada
@@ -557,10 +558,10 @@
Nenhuma subscrição selecionada
Selecionar subscrições
- A processar feed…
- A carregar feed…
+ A processar…
+ A carregar…
Não carregado: %d
- Última atualização do feed: %s
+ Última atualização: %s
Grupos de canais
- %d dia
@@ -578,9 +579,9 @@
- %d segundo
- %d segundos
- Devido às restrições do ExoPlayer, a duração da procura foi definida para %d segundos
+ Devido às restrições de ExoPlayer, a duração da pesquisa foi definida para %d segundos
Ativar som
- Silenciar
+ Sem som
Ajuda
Vídeos
Este conteúdo ainda não é suportado pelo NewPipe.
@@ -591,49 +592,59 @@
Artistas
Álbuns
Músicas
- Este vídeo é de idade restrita.
+ Este vídeo é de restrita à idade.
\n
-\nAtive \"Conteúdo restrito à idade\" nas configurações se quiser vê-lo.
+\nPara o poder ver, tem que ativar \"%1$s\" nas definições.
Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos.
-\nTem certeza\? Isto não pode ser desfeito!
- Sim, e também os vídeos parcialmente vistos
- Remover vídeos vistos\?
- Remover vistos
- Textos originais dos serviços serão visíveis nos itens de fluxo
- Mostrar tempo original que passou em itens
- Modo restrito do YouTube
+\nTem a certeza\? Esta ação não pode ser revertida!
+ Sim e também os vídeos parcialmente vistos
+ Remover vídeos visualizados\?
+ Remover visualizados
+ Os textos originais dos serviços serão visíveis nos itens de fluxo
+ Mostrar antiguidade nos itens
+ Ligar o \"Modo Restringido\" do YouTube
Por %s
Criado por %s
Miniatura do avatar do canal
Mostrar apenas assinaturas não agrupadas
Página da lista de reprodução
- Ainda não há marcadores de listas de reprodução
+ Ainda não há listas de reprodução favoritas
Selecione uma lista de reprodução
- Por favor, verifique se já existe um assunto a discutir o seu acidente. Criar bilhetes duplicados tirará-nos tempo que poderíamos gastar com a reparação do bug real.
+ Verifique se o seu erro já foi reportado. A criação de erros em duplicado tira-nos tempo que pode ser utilizado para corrigir os erros.
Reportar no GitHub
Copiar relatório formatado
- Mostrando resultados para: %s
+ A mostrar resultados para: %s
Quarto botão de ação
Terceiro botão de ação
Segundo botão de ação
Primeiro botão de ação
- Dimensionar a miniatura de vídeo mostrada na notificação de proporção de 16:9 a 1:1 (pode introduzir distorções)
- Dimensionar a miniatura à proporção de 1:1
+ Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 (pode introduzir distorções)
+ Ajustar miniatura à proporção de 1:1
Iniciar reprodução automaticamente — %s
- Reproduzir a fila
+ Reproduzir fila
Nunca
- A pôr no buffer
+ Processamento...
A fila do reprodutor ativo será substituída
- Não foi possível reconhecer o URL. Abrir com outra app\?
- Pôr na fila automaticamente
+ URL não reconhecido. Abrir com outra aplicação\?
+ Colocar na fila automaticamente
Baralhar
Notificação
- Apenas no Wi-Fi
+ Apenas em Wi-Fi
Nada
Mudar de um reprodutor para outro pode substituir a sua fila
- Solicitar confirmação antes de limpar uma fila
- Edite cada ação de notificação abaixo tocando nela. Selecione até três deles para serem mostrados na notificação compacta usando as caixas de seleção à direita.
- Pode selecionar no máximo três ações para mostrar na notificação compacta!
+ Pedir confirmação antes de limpar uma fila
+ Edite cada ação de notificação abaixo tocando nela. Selecione até três delas para serem mostrados na notificação compacta usando as caixas de seleção à direita.
+ Pode selecionar, no máximo, três ações para mostrar na notificação compacta!
Repetir
Quinto botão de ação
+ Mostrar vazamentos de memória
+ Enfileirado
+ Pôr na fila
+ Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA
+ Os cookies reCAPTCHA foram limpos
+ Limpar cookies reCAPTCHA
+ O YouTube fornece um \"Modo Restrito\" que oculta conteúdo potencialmente para adultos.
+ Mostrar conteúdo possivelmente impróprio para crianças porque tem um limite de idade (como 18+).
+ Fazer com que o Android personalize a cor da notificação de acordo com a cor principal na miniatura (note que esta não está disponível em todos os aparelhos)
+ Colorir a notificação
\ No newline at end of file
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 4e30faa6e3d..fe201910c94 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -43,11 +43,10 @@
Redare în fundal
Conținut
Conținut restricționat în funcție de vârstă
- Afișează videoclipuri restricționate în funcție de vârstă. Permiterea vizionării este posibilă din Setări.
Eroare
Eroare de rețea
Nu s-au putut încărca toate thumbnail-urile
- Nu s-a putut decripta semnătura URL a videoclipului
+ Nu s-a putut decripta semnătura URL a videoclipului
Nu s-a putut analiza website-ul
Conținut indisponibil
Imposibil de inițializat meniul pentru descărcări
@@ -288,8 +287,6 @@ pentru a deschide în mod pop-up
Detalii
Setări Audio
Apăsaţi pentru a adăuga în lista de redare
- Adăugaţi în fundal
- Adăugaţi în Popup
Începeţi să redaţi de aici
Începe redarea în fundal
Începe redarea în popup
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 68fcd914f68..5c3ef988d93 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -47,7 +47,8 @@
Папка для скачанного аудио
Папка для скачанного аудио
Введите путь к папке для скачивания аудио
- Нажмите \"Поиск\", чтобы начать
+ Нажмите \"Поиск\", чтобы начать
+\n
Подождите…
Файл уже существует
Потоки
@@ -64,14 +65,13 @@
Подробнее
Скопировано в буфер обмена
Выберите папку для загрузки позже в настройках
- Контент 18+
+ Показать контент с возрастным ограничением
Ошибка
Ваш комментарий (English):
Не удалось создать папку для загрузки \"%1$s\"
Автовоспроизведение
Воспроизводить видео при вызове NewPipe из другого приложения
Контент
- Видео с возрастными ограничениями. Разрешить подобный контент можно в \"Настройках\"
Трансляция
Загрузки
Загрузки
@@ -99,7 +99,7 @@
Повторить попытку
Нет доступа к накопителю
Не удалось загрузить все миниатюры
- Не удалось расшифровать подпись URL у видео
+ Не удалось расшифровать подпись URL у видео
Не удалось найти ни одного потока
Воспроизвести
В фоне
@@ -241,8 +241,6 @@
[Неизвестно]
Восстановление после ошибки плеера
Зажмите, чтобы добавить в очередь
- В очередь в фоне
- В очередь в окне
Играть отсюда в плеере
Играть отсюда в фоне
Играть отсюда в окне
@@ -595,7 +593,7 @@
Период актуальности подписок после обновления — %s
Это видео имеет возрастное ограничение.
\n
-\nВключите \"Контент с возрастным ограничением\" в настройках, если хотите его видеть.
+\nВключите \"%1$s\" в настройках, если хотите его видеть.
NewPipe не поддерживает этот контент.
\n
\nВозможно, поддержка появится в следующих версиях.
@@ -612,7 +610,7 @@
Удалить просмотренные видео\?
Отображать сообщённое сервисом время с момента публикации
Исходное время публикации
- Безопасный режим YouTube
+ Включить \"Безопасный режим\" YouTube
От %s
Создано %s
Миниатюра значка канала
@@ -647,4 +645,12 @@
Кнопка первого действия
Масштабировать эскиз видео, отображаемый в уведомлении, с соотношением сторон 16:9 до 1:1 (может привести к искажениям)
Масштабировать эскиз до соотношения сторон 1: 1
+ Показать утечки памяти
+ Файлы cookie reCAPTCHA были удалены
+ Очистить файлы cookie reCAPTCHA
+ Показывать контент, который, возможно, не подходит для детей, потому что он имеет возрастное ограничение (например, 18+).
+ YouTube предоставляет \"Ограниченный режим\", который скрывает потенциально взрослый контент.
+ Добавлено в очередь
+ Добавить в очередь
+ Очистить cookie, которые NewPipe сохраняет при решении reCAPTCHA
\ No newline at end of file
diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml
new file mode 100644
index 00000000000..4de23298805
--- /dev/null
+++ b/app/src/main/res/values-sat/strings.xml
@@ -0,0 +1,38 @@
+
+
+ ᱟᱹᱪᱩᱨ
+ ᱵᱨᱟᱣᱡᱚᱨ ᱪᱚᱭᱚᱱ ᱢᱮ
+ ᱥᱟᱞᱟᱜ ᱦᱟᱹᱴᱤᱧ ᱢᱮ
+ ᱥᱟᱡᱟᱣᱠᱚ
+ ᱥᱮᱸᱫᱽᱨᱟ
+ ᱰᱟᱩᱱᱞᱚᱰ
+ ᱦᱟᱹᱴᱤᱧ
+ ᱵᱨᱟᱣᱡᱟᱚᱨ ᱨᱮ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ
+ ᱵᱟᱹᱰᱨᱟᱹ
+ ᱵᱚᱦᱟᱞ
+ %1$s ᱧᱮᱞᱠᱚ
+ ᱮᱦᱲᱵ ᱞᱟᱹᱜᱤᱫ \"ᱥᱮᱸᱫᱽᱨᱟ\" ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ
+\n
+ ᱵᱟᱦᱨᱮ ᱣᱤᱰᱤᱭᱚ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱮᱵᱷᱟᱨ ᱢᱮᱸ
+ ᱛᱮᱞᱟ ᱫᱮᱠᱷᱟᱣᱜᱽ ᱠᱟᱱᱟᱺ%s
+ ᱟᱢᱟᱜ ᱚᱨᱛᱷᱚ \"%1$s\" ᱥᱮ\?
+ ᱥᱴᱨᱤᱢ ᱨᱮᱫ ᱰᱟᱩᱱᱞᱳᱰ ᱢᱮᱸ
+ ᱯᱚᱯᱚᱯ ᱢᱳᱰ ᱨᱮ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮᱸ
+ ᱚᱠᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ (ᱟᱢ VLC ᱯᱞᱮᱭᱟᱹᱨ ᱵᱚᱦᱟᱞ ᱠᱟᱛᱮ ᱚᱱᱟ ᱨᱮ ᱯᱞᱮ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ)᱾
+ ᱚᱠᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ ᱾ VLC ᱵᱚᱦᱟᱞ ᱟᱢ ᱥᱮ\?
+ %1$s ᱨᱮ ᱩᱪᱷᱟᱹᱱ ᱮᱱᱟ
+ ᱥᱟᱹᱵᱥᱠᱨᱟᱭᱤᱵᱽ
+ ᱟᱹᱱᱥᱟᱹᱵᱥᱠᱨᱟᱭᱤᱵᱽ
+ ᱥᱟᱹᱵᱥᱠᱨᱭᱤᱵᱽ ᱮᱱᱟ
+ ᱥᱟᱹᱵᱥᱠᱨᱭᱤᱯᱥᱚᱱ ᱵᱚᱫᱚᱞ ᱵᱟᱭ ᱜᱟᱱᱟᱜᱽ ᱠᱟᱱᱟ
+ ᱪᱟᱱᱱᱮᱹᱞ ᱟᱹᱱᱥᱟᱹᱵᱥᱠᱨᱟᱭᱤᱵᱽ ᱮᱱᱟ
+ ᱯᱚᱯᱟᱹᱯ ᱢᱳᱰ
+ ᱵᱟᱦᱨᱮ ᱟᱹᱰᱤᱭᱚ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱮᱵᱽᱦᱟᱨ ᱢᱮᱸ
+ ᱱᱟᱶᱟ ᱴᱮᱵ
+ ᱵᱩᱻᱠᱢᱟᱨᱠ ᱯᱞᱮᱞᱤᱥᱴ ᱠᱚ
+ ᱥᱟᱹᱵᱥᱠᱨᱤᱯᱥᱚᱱ ᱠᱚ
+ ᱢᱩᱞ
+ ᱤᱱᱯᱷᱚ ᱫᱮᱠᱷᱟᱣ ᱢᱮᱸ
+ ᱥᱟᱹᱵᱥᱠᱨᱤᱯᱥᱚᱱ ᱵᱟᱝ ᱟᱹᱯᱰᱮᱴ ᱜᱟᱱᱚᱜᱽ ᱱᱟᱠᱟ
+ ᱥᱟᱲᱮ ᱠᱚ ᱛᱤᱱᱟᱹᱝ ᱜᱟᱱ ᱨᱤᱡᱚᱞᱭᱩᱥᱚᱱ ᱠᱚ ᱴᱷᱮᱱ ᱚᱪᱚᱜᱽ ᱟᱭ
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml
index 5e61d122bd9..f7c357f7fdd 100644
--- a/app/src/main/res/values-sc/strings.xml
+++ b/app/src/main/res/values-sc/strings.xml
@@ -1,10 +1,13 @@
- Importa sas iscritziones iscarrighende su documentu de esportatzione:
+ Importa sas iscritziones dae Google takeout:
\n
\n 1. Bae a custu URL: %1$s
\n 2. Intra cando ti l\'ant a pedire
-\n 3. Diat dèpere incumintzare un\'iscarrigamentu (cussu est su documentu de esportatzione)
+\n 3. Incarca in \"Totu sos datos incluidos\", a pustis in \"Boga sa seletzione a totus\" e a pustis galu ischerta petzi \"iscritziones\" e incarca \"AB\"
+\n4. Incarca in \"Passu imbeniente\" e a pustis in \"Crea un\'esportatzione\"
+\n5. Cando aparit, incarca in su butone \"Iscarrigamentu\" e
+\n6. Dae s\'archìviu zip iscarrigadu estrai su documentu .json (de sòlitu tenet su nùmene\"\"YouTube and YouTube Music/subscriptions/subscriptions.json\") e importa·lu inoghe.
Esportatzione de s\'iscritzione fallida
Importatzione de s\'iscritzione fallida
Esportatzione anteposta
@@ -56,8 +59,6 @@
Incumintza a riproduire in una ventanedda
Incumintza a riproduire in s\'isfundu
Incumintza a riproduire inoghe
- Pone in s\'elencu in una ventanedda
- Pone in s\'elencu in s\'isfundu
Mantene incarcadu pro pònnere in s\'elencu
Impostatziones àudio
Detàllios
@@ -189,14 +190,14 @@
Peruna visualizatzione
Contadore de sos iscritos non disponìbile
- - %s iscritos
- - %s iscritu
+ - %s iscritu
+ - %s iscritos
Perunu iscritu
Allughe/istuda su servìtziu. Ischertadu como:
Mrd
Mlln
- mil
+ mìg
In antis fruni s\'atzessu a sa memòria
Torra a proare
Àudio
@@ -271,7 +272,7 @@
Cronologia de chirca iscantzellada.
Custu vìdeu tenet unu lìmite de edade.
\n
-\nAllughe \"Cuntenutos limitados pro edade\" in sas impostatziones si lu cheres pompiare.
+\nAllughe \"%1$s\" in sas impostatziones si lu cheres pompiare.
Perunu riproduidore de flussos agatadu (pro lu riproduire podes installare VLC).
Pàgina de s\'iscalita
Ammustra petzi sas iscritziones no agrupadas
@@ -424,7 +425,7 @@
Cuntenutu no a disponimentu
No est istadu possìbile analizare de su totu su situ web
Anàlisi de su situ web fallida
- Detziframentu de sa firma URL de su vìdeu fallida
+ Detziframentu de sa firma URL de su vìdeu fallida
No est istadu possìbile carrigare totu sas miniaduras
Errore de retza
Impossìbile iscarrigare in s\'ischeda SD esterna. Cheres resetare sa positzione de sa cartella de iscarrigamentu\?
@@ -485,9 +486,8 @@
Iscarrigamentos
Iscarrigamentos
In direta
- Modalidade limitada de YouTube
- Ammustra su vìdeu limitadu pro edade. Podes mudare custa optzione dae sas impostatziones.
- Cuntenutu limitadu pro edade
+ Allughe sa modalidade cun restritziones de YouTube
+ Ammustra sos cuntenutos limitados pro edade
Cuntenutos
Postu in lista in su riproduidore a ventanedda
Pone in lista in s\'isfundu
@@ -611,7 +611,8 @@
Perunu riproduidore de flussos agatadu. Cheres installare VLC\?
Publicadu su %1$s
%1$s visualizatziones
- Toca \"Chirca\" pro incumintzare
+ Toca \"Chirca\" pro incumintzare
+\n
Mai
Cun su Wi-Fi ebbia
Incumintza cun sa riprodutzione automaticamente — %s
@@ -635,5 +636,15 @@
Su de duos butones de atzione
Su de unu butone de atzione
Pone in iscala sa miniadura in formadu 1:1
+ Ammustra sas pèrdidas de memòria
+ Annànghidu a sa lista
+ Pone in lista
+ Iscantzella sos testimòngios chi NewPipe sarvat cando risolves unu reCAPTCHA
+ As isboidadu sos testimòngios reCAPTCHA
+ Isbòida sos testimòngios reCAPTCHA
+ YouTube frunit una \"Modalidade cun restritziones\" chi cuat sos cuntenudos chi diant pòdere èssere pro adultos.
+ Ammustra sos cuntenutos chi diant pòdere no èssere adatos pro sos pitzinnos ca tenent unu lìmite de edade (che a 18+).
+ Pedi a Android de personalizare su colore de sa notìfica sighende su colore printzipale de sa miniadura (ammenta·ti chi custu no est a disponimentu pro totu sos dispositivos)
+ Colora sas notìficas
Ammenta s\'ùrtima mannària e sa positzione in sa ventanedda
\ No newline at end of file
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 8ac12ea0fb9..9d70413d19e 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -43,7 +43,7 @@
Chyba
Chyba siete
Nemožno zobraziť všetky náhľady
- Nepodarilo sa dekódovať URL videa
+ Nepodarilo sa dekódovať URL videa
Nemožno analyzovať webovú stránku
Obsah nie je dostupný
Náhľad videa
@@ -55,12 +55,12 @@
(Experimentálne) Vyžadovať preberanie cez Tor pre väčšie súkromie (streamovanie videa momentálne nie je podporované).
Nemožno vytvoriť adresár na preberanie \'%1$s\'
Adresár na preberanie bol vytvorený \'%1$s\'
- Ťuknite na \"Vyhľadávanie\" pre začatie
+ Ťuknite na \"Vyhľadávanie\"
+\n
Automatické prehrávanie
Prehrá video pri zavolaní NewPipe inou aplikáciou
Obsah
- Vekovo obmedzený obsah
- Zobrazit video s vekovým obmezením. Zmenit túto voľbu môžete v nastaveniach.
+ Zobraziť vekovo obmedzený obsah
Naživo
Nemožno kompletne zanalyzovať web
Nemožno nastaviť menu preberania
@@ -278,8 +278,6 @@
Podrobnosti
Nastavenie zvuku
Podržaním pridať do zoznamu
- Zaradiť do zoznamu na pozadí
- Zaradiť do zoznamu pre mini okno
Prehrať odtiaľto
Prehrať (zvuk) odtiaľto na pozadí
Začať prehrávanie v mini okne
@@ -346,11 +344,14 @@
Predchádzajúci export
Nemožno importovať odbery
Nemožno exportovať odbery
- Import odberov služby YouTube pomocou exportovaného zoznamu
-\n
-\n1. Prejdite na túto adresu URL: %1$s
-\n2. Po výzve sa prihláste do svojho účtu
-\n3. Sťahovanie by malo začať (to je exportovaný zoznam)
+ Import odberov služby YouTube pomocou Google takeout:
+\n
+\n1. Prejdite na túto adresu URL: %1$s
+\n2. Po výzve sa prihláste do svojho účtu
+\n3. Kliknite na \"Zahrnuté sú všetky údaj služby YouTube\", tam kliknite na \"Zrušiť výber\", zaškrtnite \"odbery\" a potom kliknite na OK
+\n4. Kliknite na \"Ďaľší krok\" a potom na \"Vytvoriť export\"
+\n5. Po chvíli sa objaví tlačidlo s nápisom \"Stiahnuť\"
+\n6. Stiahnutý súbor otvorte a extraktujte .json súbor (nachádza sa v \"/Takeout/YouTube a YouTube Music/odbery/\"). Tento súbor importujte do NewPipe.
Importovať SoundCloud profil zadaním URL adresy alebo vášho ID:
\n
\n1. Prepnite režim na \"desktop\" (web nie je dostupný pre mobilné zariadenia)
@@ -610,8 +611,8 @@
Albumy
Vekovo obmedzené video.
\n
-\nPre zobrazenie videa povoľte \"Vekovo obmedzený obsah\" v nastaveniach.
- YouTube v obmedzenom režime
+\nPre zobrazenie videa povoľte \"%1$s\" v nastaveniach.
+ Zapnúť \"Obmedzený režim YouTube\"
%s
Vytvoril %s
Minuatúrny avatar kanála
@@ -646,4 +647,14 @@
Akčné tlačidlo jedna
Zmeniť pomer strán videa zobrazovaného v miniatúre z 16:9 na 1:1 (čo môže spôsobovať skreslenie)
Zmenšiť pomer strán miniatúry na 1: 1
+ Zobraziť memory leaks
+ Zaradené do poradia
+ Zaradiť do poradia
+ Vymazať cookies, ktoré NewPipe ukladá, keď vyriešite reCAPTCHA
+ reCAPTCHA cookies boli vymazané
+ Vymazať cookies reCAPTCHA
+ YouTube poskytuje \"Obmedzený režim\", ktorý skrýva potenciálny obsah pre dospelých.
+ Zobraziť obsah, ktorý je možno nevhodný pre deti, pretože má vekovú hranicu (napríklad 18+).
+ Nechajte Android, aby prispôsobil farbu upozornenia podľa hlavnej farby v miniatúre (nemusí to fungovať na všetkých zariadeniach)
+ Farby upozornení
\ No newline at end of file
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index 54f57a42f98..83aa56fa202 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -52,14 +52,13 @@
Ustvarjena je mapa za prejem \'%1$s\'
Napaka
Vseh sličic videov ni mogoče naložiti
- Ni mogoče odšifrirati podpisa naslova URL videa
+ Ni mogoče odšifrirati podpisa naslova URL videa
Ni mogoče razčleniti spletišča.
Vsebina ni na voljo.
Ni mogoče nastaviti menija za prejem datotek.
Posnetek je pretok v živo. Ta vrsta prenosa še ni podprta.
Vsebina
Pokaži starostno omejeno vsebino
- Starostna omejitev ogleda. Pred ogledom tovrstnih posnetkov, je treba ustrezno nastaviti omejitve.
Ni mogoče dokončno razčleniti spletišča.
Ni mogoče pridobiti pretoka.
Do te napake naj ne bi prišlo.
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
index 52af5dd3692..1d3daea9526 100644
--- a/app/src/main/res/values-sq/strings.xml
+++ b/app/src/main/res/values-sq/strings.xml
@@ -217,8 +217,6 @@
Nis luajtjen në një popup të ri
Nis luajtjen në sfond
Nis luajtjen këtu
- Shtoje në radhën e një popup të ri
- Shtoje në radhën në sfond
Mbaj shtypur për të shtuar në radhë
Aranzhimet Audio
Detaje
@@ -467,7 +465,7 @@
Përmbajtja e padisponueshme
Nuk u arrit të analizohej plotësisht faqja
Nuk u arrit të analizohej faqja
- Nuk u arrit të dekriptohej firma e URL së videos
+ Nuk u arrit të dekriptohej firma e URL së videos
Nuk u mundën të ngarkoheshin të gjitha pamjet statike
Problem rrjeti
Shkarkimi në kartën SD të jashtme nuk ishte i mundur. Doni të rivendosni vendndodhjen e dosjes së shkarkimeve\?
@@ -523,7 +521,6 @@
Kjo video ka kufizime moshe.
\n
\nAktivizoni \"Përmbajtje me moshë të kufizuar\" tek aranzhimet nëse doni ta shihni.
- Shfaq videot me moshë të kufizuar. Ndryshime të tjera janë të mundura nga aranzhimet.
Përmbajtje me moshë të kufizuar
U radhit në luajtësin popup
U radhit në luajtësin në sfond
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 30673791854..1bec9b82233 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -52,12 +52,11 @@
Не могу да направим директоријум за преузимање„ %1$s“
Грешка
Не могох да учитам све сличице
- Не могу да дешифрујем потпис видео урл-а
+ Не могу да дешифрујем потпис видео урл-а
Не могу да рашчланим веб-сајт
Садржај није доступан
Садржај
Прикажи старосно-ограничени садржај
- Старосно-ограничени видео. Премошћавање је доступно у поставкама.
Не могу да поставим мени преузимања
Ово је ТОК УЖИВО, ово још није подржано.
Не могу да рашчланим веб-сајт у целости
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 0376bbda27d..b4620a3f836 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -61,7 +61,6 @@
Spelar upp i popup-läge
Innehåll
Åldersbegränsat innehåll
- Videon är åldersbegränsad. Du kan aktivera åldersbegränsade videor i inställningar.
Live
Nedladdningar
Nedladdningar
@@ -126,7 +125,7 @@
NewPipe Avisering
Aviseringar för NewPipe bakgrunds och popup-spelare
[Okänd]
- Kunde inte dekryptera video URL signatur
+ Kunde inte dekryptera video URL signatur
Kunde inte hitta någon ström
Misslyckades med att spela denna ström
Allvarligt spelarfel inträffade
@@ -146,9 +145,9 @@
Ljud
Försök igen
Bevilja åtkomst till lagringsutrymme först
- K
+ T.
mn
- B
+ Mrd.
Inga prenumeranter
- %s prenumerant
@@ -234,8 +233,6 @@
Detaljer
Ljudinställningar
Håll för att placera i kön
- Placera i bakgrunds-kön
- Bifoga i en popup
Börja spela här
Börja spela i bakgrunden
Börja spela i en popup
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index ba48e0a2ae1..f889ea2bf85 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -124,7 +124,6 @@
வயது வரம்புக்கு உட்பட்டது
அடுத்த தாரையில் தானாக சேர்
பின்னணி இயக்கியின் வரிசையில் சேர்க்கப்பட்டது
- அமைப்புகள் மூலம் வயது வரையறுக்கப்பட்ட வீடியோக்கலை காணலாம்.
பிழை அறிக்கை
சேனல்
சேனல்கள்
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index c24949ebbf4..fb92d915048 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -1,6 +1,7 @@
- แตะที่ปุ่มค้นหาเพื่อเริ่มต้น
+ แตะที่ปุ่ม \"ค้นหา\" เพื่อเริ่มต้น
+\n
%1$s ครั้ง
เผยแพร่เมื่อ %1$s
ไม่พบแอปที่สามารถสตรีมสื่อวีดีโอได้ คุณต้องการติดตั้ง VLC หรือไม่\?
@@ -14,13 +15,13 @@
ดาวน์โหลดไฟล์สตรีม
ค้นหา
ตั้งค่า
- หรือคุณหมายถึง: %1$s\?
+ หรือคุณหมายถึง \"%1$s\"\?
แชร์ด้วย
เลือกบราวเซอร์
หมุน
Use external video player
ใช้แอปเล่นเสียงภายนอก
- NewPipe โหมดป๊อปอัพ
+ โหมดป๊อปอัพ
ติดตาม
ติดตามแล้ว
ยกเลิกการติดตาม
@@ -109,7 +110,6 @@
จัดคิวลงในการเล่นโหมดป๊อปอัพแล้ว
เนื้อหา
เนื้อหาที่จำกัดอายุ
- แสดงวิดีโอที่จำกัดอายุ การอนุญาตดังกล่าวเป็นไปได้จากการตั้งค่า
สด
ดาวน์โหลด
ดาวน์โหลด
@@ -161,7 +161,7 @@
การดาวน์โหลดไปยังการ์ดความจำภายนอกยังไม่สามารถทำได้ รีเซ็ตตำแหน่งโฟลเดอร์ดาวน์โหลดหรือไม่\?
ข้อผิดพลาดของเครือข่าย
ไม่สามารถโหลดรูปขนาดย่อทั้งหมด
- ไม่สามารถถอดรหัสลายเซ็น URL ของวิดีโอ
+ ไม่สามารถถอดรหัสลายเซ็น URL ของวิดีโอ
ไม่สามารถแยกวิเคราะห์เว็บไซต์
ไม่สามารถแยกวิเคราะห์เว็บไซต์ได้อย่างสมบูรณ์
เนื้อหาไม่พร้อมใช้งาน
@@ -305,7 +305,7 @@
สิ่งนี้จะแทนที่การตั้งค่าปัจจุบันของคุณ
คุณยังต้องการนำเข้าการตั้งค่าด้วยหรือไม่\?
ไม่สามารถโหลดความคิดเห็นได้
- ได้รับความนิยม
+ มาแรง
50 อันดับแรก
ใหม่และมาแรง
การประชุม
@@ -313,8 +313,6 @@
รายละเอียด
การตั้งค่าเสียง
กดค้างไว้เพื่อเพิ่มลงในคิว
- เพิ่มคิวในโหมดพื้นหลัง
- เพิ่มคิวในโหมดป๊อปอัพ
เริ่มเล่นจากตรงนี้
เล่นจากจุดนี้ในโหมดพื้นหลัง
เล่นจากจุดนี้ในโหมดป๊อปอัพ
@@ -436,4 +434,5 @@
ตำแหน่งวีดิโอในรายการ
แสดงตำแหน่งวีดิโอที่เล่นในรายการ
ล้างข้อมูล
+ กำลังแสดงผลลัพธ์สำหรับ: %s
\ No newline at end of file
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index df00b8044ad..5a1fc3b28dd 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -1,6 +1,7 @@
- Başlamak için \"Arama\"ya dokunun
+ Başlamak için \"Ara\" bölümüne dokunun
+\n
%1$s görüntüleme
Yayınlanma: %1$s
Akış oynatıcısı bulunamadı. VLC yüklensin mi\?
@@ -25,27 +26,26 @@
Ses dosyaları için indirme dizinini seçin
Kendiliğinden oynat
NewPipe başka uygulamadan çağrıldığında video oynatır
- Öntanımlı çözünürlük
+ Varsayılan çözünürlük
Kodi ile oynat
Eksik Kore uygulaması yüklensin mi\?
\"Kodi ile oynat\" seçeneğini göster
Kodi ortam merkezi üzerinden video oynatmak için bir seçenek göster
- Öntanımlı ses biçimi
+ Varsayılan ses biçimi
Tema
Koyu
Açık
İndir
\'Sonraki\' ve \'Benzer\' videoları göster
Desteklenmeyen URL
- Öntanımlı içerik dili
+ Varsayılan içerik dili
Ses
Video ve ses
Görünüm
Diğer
Arka planda oynatılıyor
İçerik
- Yaş kısıtlamalı içerik
- Yaş kısıtlamalı videoyu göster. Daha sonra ayarlardan değiştirilebilir.
+ Yaş kısıtlı içeriği göster
Canlı
İndirilenler
İndirilenler
@@ -53,7 +53,7 @@
Hata
Ağ hatası
Küçük resimlerin tamamı yüklenemedi
- Video URL imzasının şifresi çözülemedi
+ Video URL imzasının şifresi çözülemedi
Web sitesi ayrıştırılamadı
Web sitesi tamamen ayrıştırılamadı
İçerik kullanılamıyor
@@ -86,7 +86,7 @@
Duraklat
Oynat
Sil
- Sağlama
+ Doğrulama
Yeni görev
Tamam
Dosya adı
@@ -101,14 +101,14 @@
Panoya kopyalandı
Lütfen daha sonra ayarlardan uygun bir indirme dizini belirleyin
İndirme menüsü ayarlanamadı
- Açılır pencere kipinde aç
+ Açılır pencere modunda aç
Açılır pencere modu
- Öntanımlı açılır pencere çözünürlüğü
+ Varsayılan açılır pencere çözünürlüğü
Yüksek çözünürlükleri göster
Yalnızca bazı aygıtlar 2K/4K videoları oynatabilir
- Öntanımlı video biçimi
+ Varsayılan video biçimi
Siyah
- Açılır pencere kipinde oynatılıyor
+ Açılır pencere modunda oynatılıyor
Tümü
Kanal
Evet
@@ -120,7 +120,7 @@
b
M
B
- Bu izin, açılır pencere kipinde
+ Bu izin, açılır pencere modunda
\naçmak için gereklidir
reCAPTCHA formu
reCAPTCHA formu istendi
@@ -134,8 +134,8 @@
Açılır pencere
Yeniden boyutlandırılıyor
Bazı çözünürlüklerde sesi kaldırır
- Oynatıcının parlaklığını ve sesini kontrol etmek için hareketleri kullanın
- Hareketli oynatıcı kontrolü
+ Oynatıcının parlaklığını ve sesini denetlemek için hareketleri kullan
+ Hareketli oynatıcı denetimi
Arama önerileri
Arama yaparken önerileri göster
En iyi çözünürlük
@@ -176,7 +176,7 @@
Oynatmaya devam et
Kesintilerden sonra (örneğin telefon çağrısı) oynatmaya devam et
Oynatıcı
- Davranış
+ Tercihler
Geçmiş ve önbellek
Oynatma Listesi
Geri al
@@ -230,8 +230,6 @@
Ayrıntılar
Ses Ayarları
Kuyruğa eklemek için basılı tutun
- Arka planda kuyruğa ekle
- Açılır pencerede kuyruğa ekle
Burada oynatmaya başla
Arka planda oynatmayı başlat
Açılır pencerede oynatmayı başlat
@@ -240,7 +238,7 @@
Bağışta bulunun
Web sitesi
Daha çok bilgi ve haber için NewPipe web sitesini ziyaret edin.
- Öntanımlı içerik ülkesi
+ Varsayılan içerik ülkesi
Hizmet
Yönlendirmeyi Değiştir
Arka Plana Geç
@@ -288,7 +286,7 @@
Sil
Yeniden adlandır
Ad
- Oynatma Listesine Ekle
+ Oynatma listesine ekle
Oynatma listesi küçük resmi olarak ayarla
Oynatma listesini yer imlerine ekle
Yer imini kaldır
@@ -297,7 +295,7 @@
Oynatma listesine eklendi
Oynatma listesinin küçük resmi değiştirildi.
Oynatma listesi silinemedi.
- Altyazı yok
+ Alt yazı yok
Sığdır
Doldur
Yakınlaştır
@@ -332,11 +330,11 @@
\n1. Şu adrese gidin: %1$s
\n2. Sorulduğunda hesabınıza giriş yapın
\n3. İndirme başlamalı (bu, dışa aktarma dosyasıdır)
- URL\'yi veya ID\'nizi yazarak SoundCloud profilini içe aktarın:
-\n
-\n1. Web tarayıcısında \"masaüstü kipi\" etkinleştirin (site, mobil aygıtlar için uygun değildir)
-\n2. Şu adrese gidin: %1$s
-\n3. Sorulduğunda giriş yapın
+ URL\'yi veya ID\'nizi yazarak SoundCloud profilini içe aktarın:
+\n
+\n1. Web tarayıcısında \"masaüstü modu\" etkinleştirin (site, mobil aygıtlar için uygun değildir)
+\n2. Şu adrese gidin: %1$s
+\n3. Sorulduğunda giriş yapın
\n4. Yönlendirildiğiniz profil URL\'sini kopyalayın.
kimliginiz, soundcloud.com/kimliginiz
Bu sürecin ağa yük olabileceğini unutmayın.
@@ -353,10 +351,10 @@
Ses yüksekliği
Ayır (bozulmaya neden olabilir)
İndirilebilecek akış yok
- Yeğlenen \'aç\' eylemi
- İçerik açılırken öntanımlı eylem — %s
- Altyazılar
- Oynatıcı altyazı metin ölçeğini ve arka plan biçimini değiştirin. Etkili olması için uygulamayı yeniden başlatma gerektirir.
+ Tercih edilen \'aç\' eylemi
+ İçerik açılırken varsayılan eylem — %s
+ Alt yazılar
+ Oynatıcı alt yazı metin ölçeğini ve arka plan biçimini değiştirin. Etkili olması için uygulamayı yeniden başlatma gerektirir.
Bu dosyayı oynatmak için herhangi bir uygulama yüklü değil
İzleme geçmişini temizle
Oynatılan akışların geçmişini ve kalınan oynatım konumlarını siler
@@ -383,7 +381,7 @@
Ana video oynatıcıdan diğer uygulamaya geçiş yaparken eylem — %s
Yok
Arka plan oynatıcısını küçült
- Açılır pencere oynatıcına küçült
+ Açılır pencere oynatıcısına küçült
Sessizlik sırasında hızlı ileri
Adım
Sıfırla
@@ -394,25 +392,25 @@
Abonelikten çık
Yeni Sekme
Sekmeyi Seçin
- Hareketli ses kontrolü
- Oynatıcının sesini kontrol etmek için hareketleri kullanın
- Hareketli parlaklık kontrolü
- Oynatıcının parlaklığını kontrol etmek için hareketleri kullanın
+ Hareketli ses denetimi
+ Oynatıcının sesini denetlemek için hareketleri kullan
+ Hareketli parlaklık denetimi
+ Oynatıcının parlaklığını denetlemek için hareketleri kullan
Güncellemeler
Dosya silindi
Uygulama Güncelleme Bildirimi
Yeni NewPipe sürümü için bildirimler
Harici depolama kullanılamıyor
Harici SD karta indirmek mümkün değil. İndirme dizini konumu sıfırlansın mı\?
- Kayıtlı sekmeler okunamadı, bu nedenle öntanımlılar kullanılıyor
- Öntanımlıları geri yükle
- Öntanımlıları geri yüklemek istiyor musunuz\?
+ Kayıtlı sekmeler okunamadı, bu nedenle varsayılanlar kullanılıyor
+ Varsayılanları geri yükle
+ Varsayılanları geri yüklemek istiyor musunuz\?
Abone sayısı mevcut değil
Ana sayfada hangi sekmeler gösterilir
Seçim
Güncellemeler
Yeni bir sürüm mevcut olduğunda uygulama güncellemesi için bir bildirim göster
- Liste görünümü kipi
+ Liste görünümü modu
Liste
Izgara
Otomatik
@@ -493,7 +491,7 @@
- %s video
- %s video
- Öntanımlı Kiosk
+ Varsayılan Kiosk
Kimse izlemiyor
- %s izliyor
@@ -526,7 +524,7 @@
%1$d indirme silindi
Diğer uygulamaların üzerinde görüntüleme izni ver
Uygulama dili
- Sistem öntanımlısı
+ Sistem varsayılanı
Çözüldüğünde \"Bitti\" düğmesine basın
Bitti
Videolar
@@ -535,8 +533,8 @@
- %d saniye
ExoPlayer kısıtlamaları gereği konumlama süresi %d saniyeye belirlenmiştir
- Sessiz
- Sesli
+ Sessize al
+ Sesi aç
Yardım
- %d dakika
@@ -550,37 +548,37 @@
- %d gün
- %d gün
- Kanal kümeleri
- Besleme en son güncellendi: %s
+ Kanal grupları
+ Akış en son güncellendi: %s
Yüklenmedi: %d
- Besleme yükleniyor…
- Besleme işleniyor…
+ Akış yükleniyor…
+ Akış işleniyor…
Abonelikleri seç
Abonelik seçilmedi
- %d seçildi
- %d seçildi
- Boş küme adı
- Bu kümeyi silmek istiyor musunuz\?
+ Boş grup adı
+ Bu grubu silmek istiyor musunuz\?
Yeni
- Besleme
- Besleme güncelleme eşiği
+ Akış
+ Akış güncelleme eşiği
Bir aboneliğin eski sayılmadan önce son güncellemeden sonra geçen zaman — %s
Her zaman güncelle
- Uygunken adanmış beslemeden edin
+ Uygunken özel akıştan edinin
Bazı servislerde kullanılabilir, genellikle daha hızlıdır ancak kısıtlı sayıda öge ve eksik bilgi (örn. süre, öge türü, canlı durumu olmaksızın) getirilebilir.
- Hızlı kipi etkinleştir
- Hızlı kipi devre dışı bırak
- Beslemenin çok yavaş yüklendiğini mi düşünüyorsunuz\? Öyleyse, hızlı yüklemeyi etkinleştirin (ayarlardan değiştirebilir veya aşağıdaki düğmeye dokunabilirsiniz).
+ Hızlı modu etkinleştir
+ Hızlı modu devre dışı bırak
+ Akışın çok yavaş yüklendiğini mi düşünüyorsunuz\? Öyleyse, hızlı yüklemeyi etkinleştirin (ayarlardan değiştirebilir veya aşağıdaki düğmeye dokunabilirsiniz).
\n
-\nNewPipe iki besleme yükleme yordamı sunar:
+\nNewPipe iki akış yükleme yordamı sunar:
\n• Tüm abonelik kanalını edinme, bu yavaş ancak tamdır.
\n• Adanmış hizmet son noktası kullanır, bu hızlıdır ancak genellikle tam değildir.
\n
\nİkisinin arasındaki fark, hızlı olanın genellikle ögenin süresi veya türü (canlı ve sıradan videoları ayrımsayamaz) gibi bazı bilgilerden yoksunluğu ve daha az öge getirmesidir.
\n
-\nYouTube, RSS beslemesiyle bu hızlı yöntemi sunan servislerden biridir.
+\nYouTube, RSS akışıyla bu hızlı yöntemi sunan servislerden biridir.
\n
\nSeçim, sizin neyi yeğlediğinize kalmış: hız veya kusursuz bilgi.
Bu içerik henüz NewPipe tarafından desteklenmiyor.
@@ -591,9 +589,9 @@
Sanatçılar
Albümler
Şarkılar
- Bu video yaş kısıtlamalı.
+ Bu video yaş kısıtlıdır.
\n
-\nGörmek istiyorsanız ayarlarda \"Yaş kısıtlamalı içerik\" seçeneğini açın.
+\nGörmek istiyorsanız ayarlarda \"%1$s\" seçeneğini açın.
Oynatma listesine eklendikten önce ve sonra izlenen videolar kaldırılacak.
\nEmin misiniz\? Bu geri döndürülemez!
Evet ve kısmen izlenmiş videolar
@@ -601,17 +599,17 @@
İzleneni kaldır
Akış ögelerinde hizmetlerden alınan özgün metinler görünecektir
Ögelerde özgün \'… önce\'yi göster
- YouTube kısıtlı kip
+ YouTube\'un \"Kısıtlı Mod\"unu aç
%s tarafından
%s tarafından oluşturuldu
Kanalın avatar küçük resmi
- Yalnızca kümelenmemiş abonelikleri göster
+ Yalnızca gruplanmamış abonelikleri göster
Oynatma listesi sayfası
Oynatma listesi seç
GitHub\'da bildir
Biçimlendirilmiş raporu kopyala
Sonuçlar gösteriliyor: %s
- Lütfen yaşadığınız hatayı tartışan bildirimin daha önce oluşturulup oluşturulmadığını gözden geçirin. Yineleyen hata bildirimi oluşturarak, gerçek hatayı gidermekte harcadığımız zamanı uzatırsınız.
+ Lütfen hatanızı tartışan sorunun var olup olmadığını kontrol edin. Yinelenen istekler oluştururken, bizden asıl hatayı düzeltmek için harcayabileceğimiz zamanı alırsınız.
Henüz oynatma listesi yer imleri yok
Asla
Yalnızca Wi-Fi\'de
@@ -627,8 +625,8 @@
Ara belleğe alınıyor
Karıştır
Tekrarla
- Sıkı bildirimde gösterilecek en fazla üç eylem seçebilirsiniz!
- Aşağıdaki her bildirim eylemini üzerine dokunarak düzenleyin. Sağdaki onay kutularını kullanarak sıkı bildirimde gösterilmek üzere en fazla üç tanesini seçin.
+ Bildirim sekmesinde gösterilecek en fazla üç eylem seçebilirsiniz!
+ Aşağıdaki her bildirim eylemini üzerine dokunarak düzenleyin. Sağdaki onay kutularını kullanarak bildirim sekmesinde gösterilmek üzere en fazla üç tanesini seçin.
Beşinci eylem düğmesi
Dördüncü eylem düğmesi
Üçüncü eylem düğmesi
@@ -636,4 +634,12 @@
Birinci eylem düğmesi
Bildirimde gösterilen video küçük resmini 16:9\'dan 1:1 en/boy oranına ölçeklendir (bozulmalara neden olabilir)
Küçük resmi 1:1 en/boy oranına ölçeklendir
+ Bellek sızıntılarını göster
+ Sıraya eklendi
+ Kuyruğa ekle
+ reCAPTCHA çözdüğünüzde NewPipe\'ın sakladığı çerezleri temizle
+ reCAPTCHA çerezleri temizlendi
+ reCAPTCHA çerezlerini temizle
+ YouTube, olası yetişkin içeriği gizleyen \"Kısıtlı Mod\" sağlamaktadır.
+ Yaş kısıtı (18+ gibi) nedeniyle çocuklara uygun olmayabilecek içeriği göster.
\ No newline at end of file
diff --git a/app/src/main/res/values-tzm/strings.xml b/app/src/main/res/values-tzm/strings.xml
new file mode 100644
index 00000000000..df3fae42098
--- /dev/null
+++ b/app/src/main/res/values-tzm/strings.xml
@@ -0,0 +1,172 @@
+
+
+ Rnu ɣer
+ Sty aseksel
+ Aseksel amaynu
+ Asenubeg
+ Smal ineɣmisen
+ Bḍu aked
+ Tisɣal
+ Rzu
+ Agem
+ Bḍu
+ Ser
+ %1$s n tannayin
+ Smal iɣfawalen
+ Aberkan
+ Adeɣmum
+ Anafaw
+ Asgum
+ Imesli
+ Walu
+ Γeṛ s Kodi
+ Asmal n tyufa i: %s
+ ittufser g %1$s
+ Walu ixfawalen
+ Tineɣmisin n NewPipe
+ Asedaw n ividyuten yugem
+ Kkes ifuyla yugmen
+ Semres SAF
+ Asdaw n wagam n imesli
+ Sfeḍ amzruy n wagam
+ %1$d n wagamen ittwakksen
+ Seqsa mani ɣa tagemd
+ Sfeḍ amzruy n wannay
+ Amzruy d uffiren
+ Amzruy n wannay
+ Rzu amzruy
+
+ - ittannay %s
+ - ttanayen %s
+
+
+ - %d wass
+ - %d wussan
+
+ Kkes ividyuten ittwannayen\?
+ 100+ ividyuten
+ walu ividyuten
+ Sɣur %s
+ ∞ ividyuten
+ Axefawal-nnek (s tneglizt):
+
+ - %d Tsraget
+ - %d Tsragin
+
+
+ - %d tusdidet
+ - %d tusdidin
+
+
+ - %d tsinet
+ - %d tsinin
+
+ Tutlayt n tsensi
+ Senti agamen
+ Rgel
+ %s wagamen isalan
+ Γas s uwifi
+ Semɣeṛ
+ Ameɣri n uvidyu
+ Tiɣal n imesli
+ Sitey
+ Akiyusk
+ Sty yan n ukiyusk
+ Sty yat n tbadut
+ Tasna n Tbadut
+ Tasna n ukiyusk
+ Is nit txsed ad tkksed iferdisen maṛṛa seg umezruy\?
+ Is nit txsed ad tkksed aferdis-a seg umezruy n wannay\?
+ Is nit txsed ad tkksed aferdis-a seg umezruy n urezzu\?
+ Ẓeṛ g GitHub
+ Kkes maṛṛa
+ Kkes yan
+
+ - %s uvidyu
+ - %s ividyuten
+
+
+ - %s Tannayt
+ - %s Tannayin
+
+ Semres Tor
+ Γer avidyu, azemz:
+ Mel
+ Mel g GitHub
+ Ittwakkes umzruy n wannay.
+ Ittwakkes umezruy n urezzu.
+ Kkes amzruy n urezzu maṛṛa\?
+ Sfeḍ amzruy n urezzu
+ Kkes amzruy n wannay maṛṛa\?
+ Tineɣmisin i tleqqimt tamaynut n NewPipe
+ Γer maṛṛa
+ Ittwakkes ufaylu
+ Akettur
+ Avidyu d imesli
+ Sfeḍ isefka
+ Zmern ad ɣren kra n wallalen ividyuten 2K/4K
+ Amaynu
+ Sbedd
+ Tangalet
+ Aẓeṭṭa
+ Talgamet
+ Walu
+ Tisdɣiwin
+ Agey
+ Deggi
+ Ẓẓiẓen
+ Isem
+ Kkes
+ Adɣran
+ Asit wib
+ Γef
+ Γef
+ Tisɣal
+ Agam
+ Isem n ufaylu
+ WAXXA
+ Kkes
+ Senulfu
+ Γer
+ Senti
+ ifḍ
+ Als-arem
+ Imesli
+ Avidyu
+ Umelan:
+ Tazgelt
+ Tiwisi
+ Afaylu
+ Ku dwal
+ Sfeḍ
+ Zzuzwu
+ Sty
+ Yah
+ Inaẓuṛen
+ Tiɣennijin
+ Imezza
+ Inessemras
+ Ividyuten
+ Tibuda
+ Tabadut
+ Maṛṛa
+ Tagamin
+ Tagamin
+ Usrid
+ Tineɣmisin
+ Tisdɣiwin
+ Yaḍen
+ Ameɣri
+ Tanafut
+ Agem
+ Lteɣ
+ Add \"Rzu\" i usenti
+\n
+ Ssemal tadɣert \"Γer s Kodi\"
+ Dɣer asedaw n wagam n ifuyla n ividyuten
+ Ssemres ameɣri n imsli abeṛṛani
+ La-ittekkes imsli d kra n tɣariwin
+ Asenṭeḍ ameɣri n uvidyu abeṛṛani
+ abeṛṛem
+ Txsed ad tarad \"%1$s\"\?
+
\ No newline at end of file
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 361ce8560a8..996be73473f 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -10,7 +10,7 @@
Завантажити
Шукати
Налаштування
- Чи ви мали на увазі: %1$s\?
+ Чи ви мали на увазі: \"%1$s\"\?
Поширити через
Оберіть переглядач
обертання
@@ -45,12 +45,11 @@
Немає доступу до накопичувача
Контент
Контент з віковими обмеженнями
- Показувати відео з віковими обмеженнями. Надалі дозволити програвання таких відео можна у налаштуваннях.
Наживо
Помилка
Помилка мережі
Не вдалося завантажити всі ескізи
- Не вдалося розшифрувати URL-підпис відео
+ Не вдалося розшифрувати URL-підпис відео
Не вдалося проаналізувати веб-сайт
Не вдалося повністю проаналізувати веб-сайт
Контент недоступний
@@ -63,7 +62,8 @@
Звіт
Інформація:
Що сталося:
- Натисніть на «пошук» щоб почати
+ Натисніть на «пошук», аби почати
+\n
Чорна
Завантаження
Завантаження
@@ -289,8 +289,6 @@
Набуває популярності
Видалити
Утримуйте, щоб додати в чергу
- Додати до фону
- Додати до вікна
Розпочати програвання звідси
Розпочати програвання на фоні
Розпочати програванні у вікні
@@ -623,4 +621,14 @@
Вибрати плейліст
Жоден плейліст ще не додано
Сторінка плейлісту
+ Нічого
+ Буферизація
+ Перемішати
+ Повтор
+ Кнопка п\'ятої дії
+ Кнопка четвертої дії
+ Кнопка третьої дії
+ Кнопка другої дії
+ Кнопка першої дії
+ Збільшити мініатюру до масштабу 1:1
\ No newline at end of file
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
index 9aac3609c68..cd6866e2edd 100644
--- a/app/src/main/res/values-ur/strings.xml
+++ b/app/src/main/res/values-ur/strings.xml
@@ -101,7 +101,6 @@
پاپ اپ پلیئر میں شامل ہوئی
مشمول
نازیبا مشمولات
- نازیبا ویڈیو دکھائی دے گی۔ ترتیبات سے اس طرح کی مشمولات کی اجازت ممکن ہے۔
براہ راست
ڈاؤن لوڈز
ڈاؤن لوڈز
@@ -136,7 +135,7 @@
خرابی
نیٹ ورک کی خرابی
تمام نظرِ انگشتی لوڈ نہیں کر سکے
- ویڈیو یو آر ایل کے دستخط ڈکرپٹ نہیں ہو سکے
+ ویڈیو یو آر ایل کے دستخط ڈکرپٹ نہیں ہو سکے
ویب سائٹ کو تجزیہ نہیں کیا جاسکا
ویب سائٹ کو مکمل طور پر تجزیہ نہیں کرسکے
مواد دستیاب نہیں ہے
@@ -290,8 +289,6 @@
تفصیلات
آڈیو کی ترتیبات
انقطار کو پکڑو
- پس منظر میں قطار
- ایک نئی پوپ اپ میں انقطار
یہاں چلانا شروع کریں
پس منظر میں چلانا شروع کریں
نئے پاپ اپ میں چلانا شروع کریں
diff --git a/app/src/main/res/values-v21/styles_services.xml b/app/src/main/res/values-v21/styles_services.xml
index d40065059af..e5b675ef8bd 100644
--- a/app/src/main/res/values-v21/styles_services.xml
+++ b/app/src/main/res/values-v21/styles_services.xml
@@ -69,4 +69,4 @@
- @color/dark_media_ccc_accent_color
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml
index f888ae53902..3817d9c4fc9 100644
--- a/app/src/main/res/values-v27/styles.xml
+++ b/app/src/main/res/values-v27/styles.xml
@@ -5,10 +5,12 @@
- @color/dark_background_color
- false
+
+
diff --git a/app/src/main/res/values-v29/themes.xml b/app/src/main/res/values-v29/themes.xml
index 63494d0ae54..9c9f6083b32 100644
--- a/app/src/main/res/values-v29/themes.xml
+++ b/app/src/main/res/values-v29/themes.xml
@@ -1,20 +1,24 @@
+
+
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 293364fbe31..286a37dc635 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -12,7 +12,7 @@
Tải về
Tìm kiếm
Cài đặt
- Ý của bạn là: %1$s\?
+ Ý bạn là \"%1$s\"\?
Chia sẻ với
Chọn trình duyệt
Sử dụng trình phát video bên ngoài
@@ -59,7 +59,6 @@
Phát ở chế độ popup
Nội dung
Cho phép nội dung có giới hạn độ tuổi
- Hiện video có giới hạn độ tuổi. Có thể thay đổi trong phần Cài đặt.
Trực tiếp
Tải xuống
Tải xuống
@@ -77,7 +76,7 @@
Lỗi
Lỗi kết nối mạng
Không thể tải tất cả hình thu nhỏ
- Không thể giải mã chữ ký URL video
+ Không thể giải mã chữ ký URL video
Không thể phân tích cú pháp trang web
Không thể phân tích cú pháp hoàn toàn trang web
Nội dung không khả dụng
@@ -88,11 +87,11 @@
Ứng dụng / Giao diện người dùng bị lỗi
Xin lỗi, điều đó không nên xảy ra.
Báo lỗi qua email
- Xin lỗi, một số lỗi đã xảy ra.
+ Xin lỗi, có gì đó đã xảy ra.
Báo cáo
Thông tin:
Chuyện gì đã xảy ra:
- Gì: \\nRequest:\\nContent Lang:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version:
+ Cái gì:\\nYêu cầu:\\nNgôn ngữ của nội dung:\\nVùng miền (quốc gia) của nội dung:\\nNgôn ngữ của ứng dụng:\\nDịch vụ:\\nThời gian GMT:\\nTên gói:\\nPhiên bản:\\nPhiên bản hệ điều hành:
Nhận xét của bạn (bằng tiếng Anh):
Chi tiết:
Hình thu nhỏ xem trước video
@@ -153,10 +152,10 @@
Đóng góp
xoay màn hình
Ngôn ngữ nội dung ưu tiên
- Video & âm thanh
+ Video và âm thanh
Trình phát nổi
Lịch sử xem
- Lịch sử & bộ nhớ cache
+ Lịch sử và bộ nhớ cache
Playlist
Không tìm thấy
Đăng ký
@@ -180,7 +179,7 @@
Xóa siêu dữ liệu đã lưu vào bộ nhớ cache
Xóa tất cả dữ liệu trang web được lưu trong bộ nhớ cache
Đã xóa bộ nhớ cache siêu dữ liệu
- Tự động phát tiếp theo theo hàng
+ Tự động phát tiếp theo hàng
Tiếp tục hàng đợi (không lặp lại) bằng cách thêm một luồng phát liên quan
Lịch sử tìm kiếm
Lưu trữ truy vấn tìm kiếm cục bộ
@@ -304,16 +303,14 @@
Bạn cũng muốn nhập cài đặt?
Trang chủ
Xu hướng
- Mới & hot
+ Mới và hot
Tẩy xoá
Chi tiết
Cài đặt âm thanh
Giữ để nối tiếp
- Thêm vào trình phát nền
- Thêm vào trình phát popup mới
Bắt đầu phát ở đây
Bắt đầu phát từ đây trong nền
- Bắt đầu phát từ đây trên trình phát popup mới
+ Bắt đầu phát trên trình phát popup
Mở ngăn kéo
Đóng ngăn
Một cái gì đó sẽ xuất hiện ở đây sớm ;D
@@ -542,9 +539,9 @@
Album
Bài hát
Video
- Video này giới hạn độ tuổi.
+ Video này bị giới hạn độ tuổi.
\n
-\nNếu bạn muốn xem, bật \"Nội dung giới hạn độ tuổi\" trong cài đặt.
+\nBật \"Nội dung giới hạn độ tuổi\" trong cài đặt nếu bạn muốn xem video này.
Chế độ giới hạn YouTube
Chỉ URL HTTPS được hỗ trợ
Chọn thực thể PeerTube ưa thích
@@ -595,4 +592,35 @@
Tự tạo (không tìm thấy người upload)
Cục bộ
Trang chính mặc định
+ Trang danh sách phát
+ Chỉ hiện các kênh chưa được nhóm
+ Không bao giờ
+ Chỉ trên Wi-Fi
+ Hành vi tự động phát — %s
+ Hàng đợi phát
+ Không có danh sách nào ở đây
+ Chọn danh sách
+ Vui lòng kiểm tra xem vấn đề bạn đang gặp đã có báo cáo trước đó chưa. Nếu bạn tạo nhiều báo cáo trùng lặp, bạn sẽ làm tốn thời gian để chúng tôi đọc thay vì thực sự sửa lỗi.
+ Báo cáo trên GitHub
+ Sao chép bản báo cáo đã được định dạng
+ Thông báo
+ Không thể đọc URL này. Mở với app khác\?
+ Tự động thêm vào hàng đợi
+ Hàng đợi của trình phát hiện tại sẽ bị thay thế
+ Chuyển từ trình phát này sang trình phát khác có thể sẽ thay thế hàng đợi
+ Hỏi trước khi xóa hết hàng đợi
+ Để trống
+ Đang tải
+ Ngẫu nhiên
+ Lặp lại
+ Bạn chỉ có thể chọn tối đa 3 nút trong thông báo thu gọn!
+ Thay đổi các nút trong thông báo bằng cách nhấn mở nút đó. Chọn tối đa 3 nút để hiện trong thông báo thu gọn bằng cách tick vào các ô bên phải.
+ Nút thứ năm
+ Nút thứ tư
+ Nút thứ ba
+ Nút thứ hai
+ Nút đầu tiên
+ Thu nhỏ ảnh thumbnail trong thông báo từ tỉ lệ 16:9 xuống 1:1 (có thể gây méo ảnh)
+ Thu nhỏ ảnh thumbnail theo tỉ lệ 1:1
+ Hiện kết quả cho: %s
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 885b5ae57e3..a2bccae5a08 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -167,14 +167,13 @@
在后台播放
内容
受年龄限制的内容
- 显示受年龄限制的视频。可从设置允许此类内容。
直播
下载
下载
错误报告
错误
无法加载所有缩略图
- 无法解密视频的 URL 签名
+ 无法解密视频的 URL 签名
无法解析网址
无法完全解析网址
内容不可用
@@ -276,8 +275,6 @@
音频设置
长按队列
[未知]
- 添加到后台部分队列
- 添加至新悬浮窗列表
开始在此处开始播放
开始后台播放
开始在新悬浮窗中播放
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index b4da50e066a..de10f58b99b 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -42,7 +42,7 @@
使用 Tor
(測試中)為加強私隱,要求通過 Tor 傳送下載流量(暫時不支援串流影片)。
觀看次數:%1$s
- 找不到任何串流播放器,您要安裝 VLC 嗎?
+ 找不到任何串流播放器,要安裝 VLC 嗎?
使用瀏覽器開啟
分享影片
聲音下載路徑
@@ -50,16 +50,16 @@
選擇聲音檔案的下載路徑
未能建立下載路徑「%1$s」
已建立下載路徑「%1$s」
- 點擊 \"搜索\" 以開始使用
+ 點擊 \"搜索\" 以開始使用
+\n
自動撥放
當 NewPipe 被其他程式調用時播放視頻
內容
顯示已設年齡限制的影片
- 此影片設有年齡限制。若要觀看,請先在設定中解除年齡限制。
直播
問題
無法載入全部縮圖
- 無法為影片地址的簽署解碼。
+ 無法為影片地址的簽署解碼。
無法讀取網站。
無法完全讀取網站。
無法設定下載清單
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index a712710ca68..37fbbf74983 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -50,7 +50,8 @@
選擇音訊檔的下載資料夾
無法建立下載目錄「%1$s」
已建立下載目錄「%1$s」
- 輕觸「搜尋」按鈕開始使用
+ 輕觸「搜尋」按鈕開始使用
+\n
以懸浮視窗開啟
移除某些解析度的音訊
懸浮視窗模式
@@ -71,8 +72,7 @@
懸浮視窗
以懸浮視窗播放中
內容
- 年齡限制內容
- 顯示有年齡限制的影片。未來仍可從設定中變更。
+ 顯示年齡限制內容
下載
下載
錯誤回報
@@ -88,7 +88,7 @@
調整大小
錯誤
無法載入所有縮圖
- 無法解析影片 URL 簽章
+ 無法解析影片 URL 簽章
無法解析網站
無法完全解析網站
內容無法使用
@@ -253,8 +253,6 @@
移除
詳細資訊
音訊設定
- 在背景加入佇列
- 在彈出式視窗中加入佇列
從這裡開始播放
在背景開始播放
在彈出式視窗中開始播放
@@ -325,11 +323,14 @@
無法匯出訂閱
之前的匯出
檔案不存在或讀取或寫入權限不足
- 透過下載匯出檔來匯入您的 YouTube 訂閱:
-\n
-\n1. 移至此網址:%1$s
+ 從 Google Takeout 匯入您的 YouTube 訂閱:
+\n
+\n1. 移至此網址:%1$s
\n2. 當被提示時登入帳號
-\n3. 應該會開始下載(這就是匯出檔 )
+\n3. 點擊「包含所有資料」,然後「取消選取全部」,然後僅選取「訂閱」並點擊「確定」
+\n4. 點擊「下一步」然後「建立匯出」
+\n5. 在「下載」按鈕出現後點擊它,然後
+\n6. 從已下載的 takeout zip 解壓縮 .json 檔(通常會在「YouTube 與 YouTube Music/subscriptions/subscriptions.json」)然後匯入它。
yourID, soundcloud.com/yourid
請記住,此操作可造成昂貴網路花費。
\n
@@ -583,7 +584,7 @@
歌曲
此影片有年鈴限制。
\n
-\n如果您想要觀看,請在設定中開啟「年齡限制的內容」。
+\n如果您想要觀看,請在設定中開啟「%1$s」。
是的,以及部份觀看的影片
在新增到播放清單前後的影片將被移除。
\n您確定嗎?此動作無法復原!
@@ -591,7 +592,7 @@
移除已觀看
來自服務的原始文字將在串流項目中可見
在項目上顯示原始時間
- YouTube 受限模式
+ 開啟 YouTube 的「受限模式」
由 %s
由 %s 建立
頻道大頭貼縮圖
@@ -626,4 +627,14 @@
第一動作按鈕
將通知中顯示的影片縮圖從 16:9 縮放到 1:1(可能會導致失真)
把縮圖縮放到 1:1 的長寬比
+ 顯示記憶體洩漏
+ 已加入佇列
+ 加入佇列
+ 清除 NewPipe 在您解決 reCAPTCHA 時儲存的 cookie
+ reCAPTCHA cookies 已被清除
+ 清除 reCAPTCHA cookies
+ YouTube 提供了「受限模式」,可以隱藏潛在的成人內容。
+ 顯示可能不適於兒童的內容(因為其有年齡限制,如18歲以上等)。
+ 讓 Android 根據縮圖中的主要色彩來自訂通知的顏色(請注意,此功能不是在所有裝置上都能正常運作)
+ 彩色通知
\ No newline at end of file
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index cbf538fb50e..ab415508f79 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -1,103 +1,103 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
\ No newline at end of file
+
+
+
+
diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml
new file mode 100644
index 00000000000..2ccacb24ccc
--- /dev/null
+++ b/app/src/main/res/values/bools.xml
@@ -0,0 +1,4 @@
+
+
+ false
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 3c418261883..5ace41aaa5a 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -71,7 +71,7 @@
13sp
13sp
15sp
- 12sp
+ 12sp
12sp
32dp
diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml
index 8d2dd7dcb27..65ad6a1dabf 100644
--- a/app/src/main/res/values/settings_keys.xml
+++ b/app/src/main/res/values/settings_keys.xml
@@ -21,7 +21,6 @@
use_external_video_player
use_external_audio_player
- autoplay_through_intent
use_oldplayer
volume_gesture_control
@@ -37,8 +36,8 @@
seek_duration
10000
-
+
- 5 seconds
- 10 seconds
- 15 seconds
@@ -132,6 +131,8 @@
notification_slot_compact_1_key
notification_slot_compact_2_key
+ notification_colorize_key
+
video_mp4
video_webm
video_3gp
@@ -166,6 +167,7 @@
debug_pref_screen_key
allow_heap_dumping_key
+ show_memory_leaks_key
allow_disposed_exceptions_key
show_original_time_ago_text_key
@@ -245,6 +247,8 @@
import_data
export_data
+ clear_cookie
+
download_thumbnail_key
cache_wipe_key
@@ -1044,7 +1048,6 @@
- lt
- mk
- ms
- - nap
- nb-no
- ne
- nl
@@ -1057,6 +1060,7 @@
- pt-pt
- ro
- ru
+ - sat
- sc
- sk
- sl
@@ -1069,6 +1073,7 @@
- tr
- uk
- ur
+ - uz
- vi
- zh-cn
- zh-hk
@@ -1119,7 +1124,6 @@
- Lietuvių kalba
- македонски јазик
- Bahasa Melayu
- - napulitano
- Norsk bokmål
- Nनेपाली
- Nederlands (NL)
@@ -1132,6 +1136,7 @@
- Português (PT)
- Română
- русский язык
+ - ᱥᱟᱱᱛᱟᱲᱤ
- sardu
- Slovenčina
- Slovenščina
@@ -1144,6 +1149,7 @@
- Türkçe
- українська мова
- اردو
+ - O‘zbek
- Tiếng Việt
- 简体中文
- 繁體中文(廣東話)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5b95d110c36..b2476707611 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,6 +1,7 @@
- Tap \"Search\" to get started
+ Tap \"Search\" to get started
+\n
%1$s views
Published on %1$s
No stream player found. Install VLC?
@@ -71,6 +72,8 @@
Shuffle
Buffering
Nothing
+ Colorize notification
+ Have Android customize the notification\'s color according to the main color in the thumbnail (note that this is not available on all devices)
Audio
Default audio format
Default video format
@@ -151,10 +154,11 @@
Queued on popup player
https://www.c3s.cc/
Content
- Age restricted content
- Show age restricted video. Future changes are possible from the settings.
- YouTube restricted mode
- This video is age restricted.\n\nTurn on \"Age restricted content\" in the settings if you want to see it.
+ Show age restricted content
+ Show content possibly unsuitable for children because it has an age limit (like 18+).
+ Turn on YouTube\'s \"Restricted Mode\"
+ YouTube provides a \"Restricted Mode\" which hides potentially mature content.
+ This video is age restricted.\n\nTurn on \"%1$s\" in the settings if you want to see it.
Live
Downloads
Downloads
@@ -198,8 +202,11 @@
Switch to Main
Import database
Export database
+ Clear reCAPTCHA cookies
+ reCAPTCHA cookies have been cleared
Overrides your current history and subscriptions
Export history, subscriptions and playlists
+ Clear cookies that NewPipe stores when you solve a reCAPTCHA
Clear watch history
Deletes the history of played streams and the playback positions
Delete entire watch history?
@@ -219,7 +226,7 @@
Downloading to external SD card not possible. Reset download folder location?
Network error
Could not load all thumbnails
- Could not decrypt video URL signature
+ Could not deobfuscate video URL signature
Could not parse website
Could not parse website completely
Content unavailable
@@ -445,8 +452,8 @@
Details
Audio Settings
Hold to enqueue
- Enqueue in the background
- Enqueue in a popup
+ Enqueue
+ Enqueued
Start playing here
Start playing in the background
Start playing in a popup
@@ -495,6 +502,7 @@
LeakCanary
Memory leak monitoring may cause the app to become unresponsive when heap dumping
+ Show memory leaks
Report out-of-lifecycle errors
Force reporting of undeliverable Rx exceptions outside of fragment or activity lifecycle after disposal
Show original time ago on items
@@ -510,7 +518,7 @@
Previous export
Could not import subscriptions
Could not export subscriptions
- Import YouTube subscriptions by downloading the export file:\n\n1. Go to this URL: %1$s\n2. Log in when asked\n3. A download should start (that\'s the export file)
+ Import YouTube subscriptions from Google takeout:\n\n1. Go to this URL: %1$s\n2. Log in when asked\n3. Click on \"All data included\", then on \"Deselect all\", then select only \"subscriptions\" and click \"OK\"\n4. Click on \"Next step\" and then on \"Create export\"\n5. Click on the \"Download\" button after it appears and \n6. From the downloaded takeout zip extract the .json file (usually under \"YouTube and YouTube Music/subscriptions/subscriptions.json\") and import it here.
Import a SoundCloud profile by typing either the URL or your ID:\n\n1. Enable \"desktop mode\" in a web-browser (the site is not available for mobile devices)\n2. Go to this URL: %1$s\n3. Log in when asked\n4. Copy the profile URL you were redirected to.
yourID, soundcloud.com/yourid
Keep in mind this operation can be network expensive.\n\nDo you want to continue?
@@ -675,4 +683,4 @@
Created by %s
By %s
Playlist page
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 1d6c313261d..5c402b75111 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -10,6 +10,7 @@
+
+
+
-
-
+
+
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values/styles_services.xml b/app/src/main/res/values/styles_services.xml
index 013690b44fa..45622f6272e 100644
--- a/app/src/main/res/values/styles_services.xml
+++ b/app/src/main/res/values/styles_services.xml
@@ -1,35 +1,35 @@
-
+
-
+
-
+
@@ -70,4 +70,4 @@
- @color/dark_media_ccc_accent_color
-
\ No newline at end of file
+
diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml
index b91073ed1b9..c885366ec61 100644
--- a/app/src/main/res/xml/content_settings.xml
+++ b/app/src/main/res/xml/content_settings.xml
@@ -1,120 +1,128 @@
-
+ android:title="@string/app_language_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/content_language_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/default_content_country_title"
+ app:iconSpaceReserved="false" />
+ android:summary="@string/main_page_content_summary"
+ android:title="@string/main_page_content"
+ app:iconSpaceReserved="false" />
+ app:iconSpaceReserved="false" />
+ android:summary="@string/show_age_restricted_content_summary"
+ android:title="@string/show_age_restricted_content_title"
+ app:iconSpaceReserved="false" />
+ android:summary="@string/youtube_restricted_mode_enabled_summary"
+ android:title="@string/youtube_restricted_mode_enabled_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/show_search_suggestions_title"
+ app:iconSpaceReserved="false" />
+ app:iconSpaceReserved="false" />
+ android:title="@string/show_next_and_similar_title"
+ app:iconSpaceReserved="false" />
+ app:iconSpaceReserved="false" />
+ android:summary="@string/import_data_summary"
+ android:title="@string/import_data_title"
+ app:iconSpaceReserved="false" />
+ android:summary="@string/export_data_summary"
+ android:title="@string/export_data_title"
+ app:iconSpaceReserved="false" />
+
+
+ android:title="@string/settings_category_feed_title"
+ app:iconSpaceReserved="false">
+ app:iconSpaceReserved="false" />
+ app:iconSpaceReserved="false" />
diff --git a/app/src/main/res/xml/debug_settings.xml b/app/src/main/res/xml/debug_settings.xml
index 3cc2db9a3b5..8396f675cab 100644
--- a/app/src/main/res/xml/debug_settings.xml
+++ b/app/src/main/res/xml/debug_settings.xml
@@ -1,28 +1,32 @@
-
+ app:iconSpaceReserved="false" />
+
+
+ app:iconSpaceReserved="false" />
+ app:iconSpaceReserved="false" />
diff --git a/app/src/main/res/xml/download_settings.xml b/app/src/main/res/xml/download_settings.xml
index be96d2f6d2a..1bc0e84047e 100644
--- a/app/src/main/res/xml/download_settings.xml
+++ b/app/src/main/res/xml/download_settings.xml
@@ -1,75 +1,74 @@
-
+ android:title="@string/downloads_storage_ask_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/downloads_storage_use_saf_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/download_path_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/download_path_audio_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/settings_file_charset_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/settings_file_replacement_character_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/max_retry_msg"
+ app:iconSpaceReserved="false" />
+ android:title="@string/pause_downloads_on_mobile"
+ app:iconSpaceReserved="false" />
+ android:title="@string/enable_queue_limit"
+ app:iconSpaceReserved="false" />
diff --git a/app/src/main/res/xml/history_settings.xml b/app/src/main/res/xml/history_settings.xml
index 83413ea0573..4468478a790 100644
--- a/app/src/main/res/xml/history_settings.xml
+++ b/app/src/main/res/xml/history_settings.xml
@@ -64,4 +64,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/xml/notification_settings.xml b/app/src/main/res/xml/notification_settings.xml
new file mode 100644
index 00000000000..65d4af48a30
--- /dev/null
+++ b/app/src/main/res/xml/notification_settings.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml
index 598a1b1c7a4..a7cd061b86d 100644
--- a/app/src/main/res/xml/provider_paths.xml
+++ b/app/src/main/res/xml/provider_paths.xml
@@ -1,5 +1,9 @@
-
-
-
\ No newline at end of file
+
+
+
diff --git a/app/src/main/res/xml/update_settings.xml b/app/src/main/res/xml/update_settings.xml
index b2634f69c72..8b6d6d8c607 100644
--- a/app/src/main/res/xml/update_settings.xml
+++ b/app/src/main/res/xml/update_settings.xml
@@ -1,15 +1,14 @@
-
+ app:iconSpaceReserved="false" />
diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml
index d26f2d38894..35f3359da8f 100644
--- a/app/src/main/res/xml/video_audio_settings.xml
+++ b/app/src/main/res/xml/video_audio_settings.xml
@@ -1,176 +1,176 @@
-
+ android:title="@string/default_resolution_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/default_popup_resolution_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/limit_mobile_data_usage_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/show_higher_resolutions_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/default_video_format_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/default_audio_format_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/settings_category_player_title"
+ app:iconSpaceReserved="false">
+ android:title="@string/use_external_video_player_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/use_external_audio_player_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/show_play_with_kodi_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/settings_category_player_behavior_title"
+ app:iconSpaceReserved="false">
+ android:title="@string/preferred_open_action_settings_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/minimize_on_exit_title"
+ app:iconSpaceReserved="false" />
+ android:defaultValue="@string/autoplay_value"
+ android:entries="@array/autoplay_type_description"
+ android:entryValues="@array/autoplay_type_key"
+ android:key="@string/autoplay_key"
+ android:summary="@string/autoplay_summary"
+ android:title="@string/autoplay_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/auto_queue_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/resume_on_audio_focus_gain_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/volume_gesture_control_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/brightness_gesture_control_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/popup_remember_size_pos_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/use_inexact_seek_title"
+ app:iconSpaceReserved="false" />
+ android:defaultValue="@string/seek_duration_default_value"
+ android:entries="@array/seek_duration_description"
+ android:entryValues="@array/seek_duration_value"
+ android:key="@string/seek_duration_key"
+ android:summary="%s"
+ android:title="@string/seek_duration_title"
+ app:iconSpaceReserved="false" />
+ android:title="@string/clear_queue_confirmation_title"
+ app:iconSpaceReserved="false" />
diff --git a/app/src/release/res/xml/main_settings.xml b/app/src/release/res/xml/main_settings.xml
new file mode 100644
index 00000000000..abb94f4efaa
--- /dev/null
+++ b/app/src/release/res/xml/main_settings.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build.gradle b/build.gradle
index f15900bc6ba..de869174949 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,7 @@ buildscript {
google()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.6.3'
+ classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
diff --git a/checkstyle-suppressions.xml b/checkstyle-suppressions.xml
index 9728c6b8c59..73bdbf4cadc 100644
--- a/checkstyle-suppressions.xml
+++ b/checkstyle-suppressions.xml
@@ -5,7 +5,7 @@
+ lines="221,293"/>
+ lines="281,313"/>