diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f6708fa83..a184dd83d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,8 +72,8 @@ jobs: - api-level: 21 target: default arch: x86 - - api-level: 33 - target: google_apis # emulator API 33 only exists with Google APIs + - api-level: 35 + target: default arch: x86_64 permissions: diff --git a/app/build.gradle b/app/build.gradle index 0841086ad..02146c5f8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,14 +17,14 @@ plugins { } android { - compileSdk 35 + compileSdk 36 namespace 'org.schabi.newpipe' defaultConfig { applicationId "org.schabi.newpipe" resValue "string", "app_name", "NewPipe" minSdk 21 - targetSdk 33 + targetSdk 35 if (System.properties.containsKey('versionCodeOverride')) { versionCode System.getProperty('versionCodeOverride') as Integer } else { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d8e491abc..0ac368898 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -104,7 +105,10 @@ android:name="androidx.work.impl.foreground.SystemForegroundService" android:foregroundServiceType="dataSync" tools:node="merge" /> - + + - + menuItemToFilterName = new SparseArrayCompat<>(); private StreamingService service; + @Nullable private Page nextPage; private boolean showLocalSuggestions = true; private boolean showRemoteSuggestions = true; @@ -1096,7 +1097,7 @@ public class SearchFragment extends BaseListFragment flag and REQUESTED_PERMISSION_GRANTED != 0 } - .mapTo(mutableSetOf()) { (permission, _) -> permission } + .filter { (permission, flag) -> flag and REQUESTED_PERMISSION_GRANTED != 0 } + .mapTo(mutableSetOf()) { (permission, flag) -> permission } - return CallerPackageInfo(appName, callingPackage, uid, signature, activePermissions) + return CallerPackageInfo(appName, callingPackage, uid, signature, activePermissions.toSet()) } /** @@ -186,16 +185,15 @@ internal class PackageValidator(context: Context) { * returns `null` as the signature. */ @Suppress("deprecation") - private fun getSignature(packageInfo: PackageInfo): String? { - val signatures = packageInfo.signatures - return if (signatures == null || signatures.size != 1) { + private fun getSignature(packageInfo: PackageInfo): String? = + if (packageInfo.signatures == null || packageInfo.signatures!!.size != 1) { // Security best practices dictate that an app should be signed with exactly one (1) // signature. Because of this, if there are multiple signatures, reject it. null } else { - getSignatureSha256(signatures[0].toByteArray()) + val certificate = packageInfo.signatures!![0].toByteArray() + getSignatureSha256(certificate) } - } /** * Finds the Android platform signing key signature. This key is never null. diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java index dbfac5cca..02bb6b5ba 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java @@ -3,6 +3,7 @@ package org.schabi.newpipe.player.playqueue; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; @@ -23,6 +24,7 @@ abstract class AbstractInfoPlayQueue> final int serviceId; final String baseUrl; + @Nullable Page nextPage; private transient Disposable fetchReactor; diff --git a/app/src/main/res/values-v35/styles.xml b/app/src/main/res/values-v35/styles.xml new file mode 100644 index 000000000..beb16bcdf --- /dev/null +++ b/app/src/main/res/values-v35/styles.xml @@ -0,0 +1,27 @@ + + + + + + + + +