diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 18963343d8f..18449a97523 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -24,13 +24,8 @@ val gitWorkingBranch = providers.exec { commandLine("git", "rev-parse", "--abbrev-ref", "HEAD") }.standardOutput.asText.map { it.trim() } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} - kotlin { + jvmToolchain(21) compilerOptions { // TODO: Drop annotation default target when it is stable freeCompilerArgs.addAll( @@ -142,13 +137,6 @@ ksp { // Custom dependency configuration for ktlint val ktlint by configurations.creating -// https://checkstyle.org/#JRE_and_JDK -tasks.withType().configureEach { - javaLauncher = javaToolchains.launcherFor { - languageVersion = JavaLanguageVersion.of(21) - } -} - checkstyle { configDirectory = rootProject.file("checkstyle") isIgnoreFailures = false @@ -220,7 +208,6 @@ aboutLibraries { // note: offline mode prevents the plugin from fetching licenses at build time, which would be // harmful for reproducible builds offlineMode = true - duplicationMode = DuplicateMode.MERGE } dependencies { diff --git a/app/check-dependencies.gradle b/app/check-dependencies.gradle deleted file mode 100644 index 7646bc584bf..00000000000 --- a/app/check-dependencies.gradle +++ /dev/null @@ -1,48 +0,0 @@ -tasks.register('checkDependenciesOrder') { - group = 'verification' - description = 'Checks that each section in libs.versions.toml is sorted alphabetically' - - def tomlFile = file('../gradle/libs.versions.toml') - - doLast { - if (!tomlFile.exists()) { - throw new GradleException('TOML file not found') - } - - def lines = tomlFile.readLines() - def nonSortedBlocks = [] - def currentBlock = [] - def prevLine = '' - def prevIndex = 0 - - lines.eachWithIndex { line, lineIndex -> - if (line.trim() && !line.startsWith('#')) { - if (line.startsWith('[')) { - prevLine = '' - } else { - def currIndex = lineIndex + 1 - if (prevLine > line) { - if (currentBlock && currentBlock[-1] == "${prevIndex}: ${prevLine}") { - currentBlock.add("${currIndex}: ${line}") - } else { - if (!currentBlock.isEmpty()) { - nonSortedBlocks.add(currentBlock) - currentBlock = [] - } - currentBlock.add("${prevIndex}: ${prevLine}") - currentBlock.add("${currIndex}: ${line}") - } - } - prevLine = line - prevIndex = lineIndex + 1 - } - } - } - - if (!currentBlock.isEmpty()) { - nonSortedBlocks.add(currentBlock) - throw new GradleException("The following lines were not sorted:\n" + - nonSortedBlocks.collect { it.join("\n") }.join("\n\n")) - } - } -} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 2e7e4983cd3..47c98b99d5d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -16,11 +16,6 @@ -dontwarn javax.script.** -keep class jdk.dynalink.** { *; } -dontwarn jdk.dynalink.** -# Rules for jsoup -# Ignore intended-to-be-optional re2j classes - only needed if using re2j for jsoup regex -# jsoup safely falls back to JDK regex if re2j not on classpath, but has concrete re2j refs -# See https://github.com/jhy/jsoup/issues/2459 - may be resolved in future, then this may be removed --dontwarn com.google.re2j.** ## Rules for ExoPlayer -keep class com.google.android.exoplayer2.** { *; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 6823e13d38b..d3427f8dba2 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.fragments.list.kiosk; import android.os.Bundle; @@ -33,30 +38,6 @@ import io.reactivex.rxjava3.core.Single; -/** - * Created by Christian Schabesberger on 23.09.17. - *

- * Copyright (C) Christian Schabesberger 2017 - * KioskFragment.java is part of NewPipe. - *

- *

- * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- *

- * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- *

- * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - *

- */ - public class KioskFragment extends BaseListInfoFragment { @State String kioskId = ""; diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 25aed782c9b..214d046ce98 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -1761,6 +1761,13 @@ public void play() { } } + if (isStopped()) { + // Some phones suspend a paused player after 10 minutes. This causes the player to + // enter STATE_IDLE, causing playback to fail. So we try to recover from that here. + setRecovery(); + reloadPlayQueueManager(); + } + simpleExoPlayer.play(); saveStreamProgressState(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java index 2e19672e56d..b647e801dc2 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2016-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.player.playqueue; import android.content.Context; @@ -22,30 +27,6 @@ import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; -/** - * Created by Christian Schabesberger on 01.08.16. - *

- * Copyright (C) Christian Schabesberger 2016 - * InfoListAdapter.java is part of NewPipe. - *

- *

- * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- *

- * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- *

- * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - *

- */ - public class PlayQueueAdapter extends RecyclerView.Adapter { private static final String TAG = PlayQueueAdapter.class.toString(); diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemHolder.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemHolder.java index 1f2537baa50..23fc4bf1872 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemHolder.java @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2016-2021 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.player.playqueue; import android.view.View; @@ -8,30 +13,6 @@ import org.schabi.newpipe.R; -/** - * Created by Christian Schabesberger on 01.08.16. - *

- * Copyright (C) Christian Schabesberger 2016 - * StreamInfoItemHolder.java is part of NewPipe. - *

- *

- * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- *

- * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- *

- * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - *

- */ - public class PlayQueueItemHolder extends RecyclerView.ViewHolder { public final TextView itemVideoTitleView; public final TextView itemDurationView; diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java index ee2b39fb9b2..53878e9d92f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.settings; import android.content.DialogInterface; @@ -33,27 +38,6 @@ import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; -/** - * Created by Christian Schabesberger on 26.09.17. - * SelectChannelFragment.java is part of NewPipe. - *

- * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- *

- * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- *

- * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - *

- */ - public class SelectChannelFragment extends DialogFragment { private OnSelectedListener onSelectedListener = null; diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java index c106f599809..79838bb3cbe 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.settings; import android.content.DialogInterface; @@ -30,27 +35,6 @@ import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; -/** - * Created by Christian Schabesberger on 26.09.17. - * SelectChannelFragment.java is part of NewPipe. - *

- * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- *

- * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- *

- * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - *

- */ - public class SelectFeedGroupFragment extends DialogFragment { private OnSelectedListener onSelectedListener = null; diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java index 38339050665..d7e72821f06 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2017-2022 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.settings; import android.os.Bundle; @@ -25,27 +30,6 @@ import java.util.List; import java.util.Vector; -/** - * Created by Christian Schabesberger on 09.10.17. - * SelectKioskFragment.java is part of NewPipe. - *

- * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- *

- * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- *

- * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - *

- */ - public class SelectKioskFragment extends DialogFragment { private SelectKioskAdapter selectKioskAdapter = null; diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/about/Library.kt b/app/src/main/java/org/schabi/newpipe/ui/components/about/Library.kt index a5277dca0ae..cb51c3190ee 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/about/Library.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/about/Library.kt @@ -29,9 +29,7 @@ import com.mikepenz.aboutlibraries.entity.Library import com.mikepenz.aboutlibraries.entity.License import com.mikepenz.aboutlibraries.entity.Organization import com.mikepenz.aboutlibraries.entity.Scm -import com.mikepenz.aboutlibraries.ui.compose.m3.util.author -import kotlinx.collections.immutable.toImmutableList -import kotlinx.collections.immutable.toImmutableSet +import com.mikepenz.aboutlibraries.ui.compose.util.author import org.schabi.newpipe.ui.theme.AppTheme import org.schabi.newpipe.util.external_communication.ShareUtils @@ -140,7 +138,7 @@ private class LibraryProvider : CollectionPreviewParameterProvider( name = "NewPipeExtractor", description = "NewPipe Extractor is a library for extracting things from streaming sites. It is a core component of NewPipe, but could be used independently.", website = "https://newpipe.net", - developers = listOf(Developer("TeamNewPipe", "https://newpipe.net")).toImmutableList(), + developers = listOf(Developer("TeamNewPipe", "https://newpipe.net")), organization = Organization("TeamNewPipe", "https://newpipe.net"), scm = Scm(null, null, "https://github.com/TeamNewPipe/NewPipeExtractor"), licenses = setOf( @@ -160,7 +158,7 @@ private class LibraryProvider : CollectionPreviewParameterProvider( licenseContent = LoremIpsum().values.first(), hash = "4321" ) - ).toImmutableSet() + ) ), Library( uniqueId = "org.schabi.newpipe.extractor", @@ -168,7 +166,7 @@ private class LibraryProvider : CollectionPreviewParameterProvider( name = "NewPipeExtractor", description = "NewPipe Extractor is a library for extracting things from streaming sites. It is a core component of NewPipe, but could be used independently.", website = null, - developers = listOf().toImmutableList(), + developers = listOf(), organization = null, scm = null, licenses = setOf( @@ -180,7 +178,7 @@ private class LibraryProvider : CollectionPreviewParameterProvider( licenseContent = LoremIpsum().values.first(), hash = "1234" ) - ).toImmutableSet() + ) ) ) ) diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/about/LibraryDefinitions.kt b/app/src/main/java/org/schabi/newpipe/ui/components/about/LibraryDefinitions.kt index 9a6bfb7a055..32eff2fbe11 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/about/LibraryDefinitions.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/about/LibraryDefinitions.kt @@ -10,9 +10,6 @@ import com.mikepenz.aboutlibraries.entity.Developer import com.mikepenz.aboutlibraries.entity.Library import com.mikepenz.aboutlibraries.entity.License import com.mikepenz.aboutlibraries.entity.Scm -import kotlinx.collections.immutable.ImmutableSet -import kotlinx.collections.immutable.toImmutableList -import kotlinx.collections.immutable.toImmutableSet import org.schabi.newpipe.BuildConfig import org.schabi.newpipe.R @@ -38,7 +35,7 @@ fun getFirstPartyLibraries( licenseContent = null, hash = "GPL-3.0-or-later" ) - ).toImmutableSet() + ) val npeId = "com.github.TeamNewPipe:NewPipeExtractor" val npe = teamNewPipeLibraries.firstOrNull { it.uniqueId == npeId } @@ -55,7 +52,7 @@ fun getFirstPartyLibraries( name = context.getString(R.string.team_newpipe), organisationUrl = context.getString(R.string.website_url) ) - ).toImmutableList(), + ), organization = null, scm = Scm(null, null, context.getString(R.string.github_url)), licenses = gpl3 @@ -71,7 +68,7 @@ fun getFirstPartyLibraries( name = context.getString(R.string.team_newpipe), organisationUrl = context.getString(R.string.website_url) ) - ).toImmutableList(), + ), organization = null, scm = Scm(null, null, context.getString(R.string.newpipe_extractor_github_url)), licenses = gpl3 @@ -82,7 +79,7 @@ fun getFirstPartyLibraries( fun getAdditionalThirdPartyLibraries( context: Context, teamNewPipeLibraries: List, - licenses: ImmutableSet + licenses: Set ): List { val apache2 = licenses.firstOrNull { it.spdxId == "Apache-2.0" } val mit = licenses.firstOrNull { it.spdxId == "MIT" } @@ -109,10 +106,10 @@ fun getAdditionalThirdPartyLibraries( name = context.getString(R.string.team_newpipe), organisationUrl = context.getString(R.string.website_url) ) - ).toImmutableList(), + ), organization = null, scm = Scm(null, null, "https://github.com/TeamNewPipe/NoNonsense-FilePicker"), - licenses = listOfNotNull(mpl2).toImmutableSet() + licenses = setOfNotNull(mpl2) ), Library( uniqueId = nanojsonId, @@ -129,10 +126,10 @@ fun getAdditionalThirdPartyLibraries( name = context.getString(R.string.team_newpipe), organisationUrl = context.getString(R.string.website_url) ) - ).toImmutableList(), + ), organization = null, scm = Scm(null, null, "https://github.com/TeamNewPipe/nanojson"), - licenses = listOfNotNull(mit, apache2).toImmutableSet() + licenses = setOfNotNull(mit, apache2) ) ) } diff --git a/app/src/main/java/org/schabi/newpipe/util/ZipHelper.java b/app/src/main/java/org/schabi/newpipe/util/ZipHelper.java index bccfc7f3874..fefd50e3c5c 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ZipHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ZipHelper.java @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2018-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.util; import org.schabi.newpipe.streams.io.SharpInputStream; @@ -16,26 +21,6 @@ import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; -/** - * Created by Christian Schabesberger on 28.01.18. - * Copyright 2018 Christian Schabesberger - * ZipHelper.java is part of NewPipe - *

- * License: GPL-3.0+ - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - public final class ZipHelper { @FunctionalInterface public interface InputStreamConsumer { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 39389d99462..6747faa54c5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ # [versions] -about-libraries = "11.2.3" +about-libraries = "14.0.1" acra = "5.13.1" agp = "8.13.2" appcompat = "1.7.1" @@ -13,11 +13,11 @@ autoservice-google = "1.1.1" autoservice-zacsweers = "1.2.0" bridge = "v2.0.2" cardview = "1.0.0" -checkstyle = "13.3.0" +checkstyle = "13.4.0" coil = "3.4.0" -compose-bom = "2024.10.01" +compose-bom = "2026.03.01" constraintlayout = "2.2.1" -core = "1.17.0" # Newer versions require minSdk >= 23 +core = "1.18.0" desugar = "2.1.5" documentfile = "1.1.0" exoplayer = "2.19.1" @@ -25,29 +25,29 @@ fragment-compose = "1.8.9" groupie = "2.10.1" hilt = "2.58" # Newer version requires AGP 9 hilt-navigation-compose = "1.3.0" -jsoup = "1.21.2" +jsoup = "1.22.2" junit = "4.13.2" junit-ext = "1.3.0" kotlin = "2.3.20" kotlinx-coroutines-rx3 = "1.10.2" -kotlinx-serialization-json = "1.10.0" +kotlinx-serialization-json = "1.11.0" ksp = "2.3.6" ktlint = "1.8.0" lazy-column-scrollbar = "2.2.0" leakcanary = "2.14" -lifecycle = "2.9.4" # Newer versions require minSdk >= 23 +lifecycle = "2.10.0" markwon = "4.6.2" material = "1.11.0" # TODO: update to newer version after bug is fixed. See https://github.com/TeamNewPipe/NewPipe/pull/13018 media = "1.7.1" mockitoCore = "5.23.0" -nav3Core = "1.0.1" +nav3Core = "1.1.0" okhttp = "5.3.2" -paging-compose = "3.3.2" +paging-compose = "3.4.2" phoenix = "3.0.0" preference = "1.2.1" prettytime = "5.0.8.Final" recyclerview = "1.4.0" -room = "2.7.2" # Newer versions require minSdk >= 23 +room = "2.8.4" runner = "1.7.0" rxandroid = "3.0.2" rxbinding = "4.0.0" @@ -66,9 +66,9 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "v0.26.1" -webkit = "1.14.0" # Newer versions require minSdk >= 23 -work = "2.10.5" # Newer versions require minSdk >= 23 +teamnewpipe-newpipe-extractor = "1512cf3222b0c5d87a249e6ac231b98090c42623" +webkit = "1.15.0" +work = "2.11.2" [libraries] about-libraries-compose-m3 = { group = "com.mikepenz", name = "aboutlibraries-compose-m3", version.ref = "about-libraries" }