diff --git a/.editorconfig b/.editorconfig index 6d57ee2b2ed..b34abfa1159 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,40 +6,13 @@ root = true [*.{kt,kts}] +ktlint_code_style = android_studio +# https://pinterest.github.io/ktlint/latest/rules/standard/#function-naming ktlint_function_naming_ignore_when_annotated_with = Composable -ktlint_standard_annotation = disabled -ktlint_standard_argument-list-wrapping = disabled -ktlint_standard_backing-property-naming = disabled -ktlint_standard_blank-line-before-declaration = disabled -ktlint_standard_blank-line-between-when-conditions = disabled -ktlint_standard_chain-method-continuation = disabled + ktlint_standard_class-signature = disabled -ktlint_standard_comment-wrapping = disabled -ktlint_standard_enum-wrapping = disabled ktlint_standard_function-expression-body = disabled -ktlint_standard_function-literal = disabled -ktlint_standard_function-signature = disabled -ktlint_standard_indent = disabled -ktlint_standard_kdoc = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled -ktlint_standard_multiline-expression-wrapping = disabled -ktlint_standard_multiline-if-else = disabled -ktlint_standard_no-blank-line-in-list = disabled -ktlint_standard_no-consecutive-comments = disabled -ktlint_standard_no-empty-first-line-in-class-body = disabled -ktlint_standard_no-empty-first-line-in-method-block = disabled -ktlint_standard_no-line-break-after-else = disabled -ktlint_standard_no-semi = disabled -ktlint_standard_no-single-line-block-comment = disabled ktlint_standard_package-name = disabled -ktlint_standard_parameter-list-wrapping = disabled ktlint_standard_property-naming = disabled -ktlint_standard_spacing-between-declarations-with-annotations = disabled -ktlint_standard_spacing-between-declarations-with-comments = disabled -ktlint_standard_statement-wrapping = disabled -ktlint_standard_string-template-indent = disabled -ktlint_standard_trailing-comma-on-call-site = disabled -ktlint_standard_trailing-comma-on-declaration-site = disabled -ktlint_standard_try-catch-finally-spacing = disabled -ktlint_standard_when-entry-bracing = disabled diff --git a/.github/workflows/backport-pr.yml b/.github/workflows/backport-pr.yml index c7bcb117e91..de46ca7c730 100644 --- a/.github/workflows/backport-pr.yml +++ b/.github/workflows/backport-pr.yml @@ -25,9 +25,11 @@ jobs: - uses: actions/checkout@v4 - name: Get backport metadata # the target branch is the first argument after `/backport` + env: + COMMENT_BODY: ${{ github.event.comment.body }} run: | set -euo pipefail - body="${{ github.event.comment.body }}" + body="$COMMENT_BODY" line=${body%%$'\n'*} # Get the first line if [[ $line =~ ^/backport[[:space:]]+([^[:space:]]+) ]]; then diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 517fb9ce532..017a8b5b2ea 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -47,9 +47,9 @@ android { minSdk = 23 targetSdk = 35 - versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1005 + versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1006 - versionName = "0.28.0" + versionName = "0.28.1" System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" @@ -140,6 +140,13 @@ 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 diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 54470bdd34e..999ab9a3ff7 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -16,6 +16,11 @@ -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/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index 4327271f410..fd551b7b852 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -176,28 +176,32 @@ class DatabaseMigrationTest { databaseInV7.run { insert( - "search_history", SQLiteDatabase.CONFLICT_FAIL, + "search_history", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", serviceId) put("search", defaultSearch1) } ) insert( - "search_history", SQLiteDatabase.CONFLICT_FAIL, + "search_history", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", serviceId) put("search", defaultSearch2) } ) insert( - "search_history", SQLiteDatabase.CONFLICT_FAIL, + "search_history", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", otherServiceId) put("search", defaultSearch1) } ) insert( - "search_history", SQLiteDatabase.CONFLICT_FAIL, + "search_history", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", otherServiceId) put("search", defaultSearch2) @@ -207,13 +211,17 @@ class DatabaseMigrationTest { } testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, Migrations.DB_VER_8, - true, Migrations.MIGRATION_7_8 + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_8, + true, + Migrations.MIGRATION_7_8 ) testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, Migrations.DB_VER_9, - true, Migrations.MIGRATION_8_9 + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_9, + true, + Migrations.MIGRATION_8_9 ) val migratedDatabaseV8 = getMigratedDatabase() @@ -235,7 +243,8 @@ class DatabaseMigrationTest { val remoteUid2: Long databaseInV8.run { localUid1 = insert( - "playlists", SQLiteDatabase.CONFLICT_FAIL, + "playlists", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("name", DEFAULT_NAME + "1") put("is_thumbnail_permanent", false) @@ -243,7 +252,8 @@ class DatabaseMigrationTest { } ) localUid2 = insert( - "playlists", SQLiteDatabase.CONFLICT_FAIL, + "playlists", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("name", DEFAULT_NAME + "2") put("is_thumbnail_permanent", false) @@ -251,25 +261,29 @@ class DatabaseMigrationTest { } ) delete( - "playlists", "uid = ?", + "playlists", + "uid = ?", Array(1) { localUid1 } ) remoteUid1 = insert( - "remote_playlists", SQLiteDatabase.CONFLICT_FAIL, + "remote_playlists", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", DEFAULT_SERVICE_ID) put("url", DEFAULT_URL) } ) remoteUid2 = insert( - "remote_playlists", SQLiteDatabase.CONFLICT_FAIL, + "remote_playlists", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", DEFAULT_SECOND_SERVICE_ID) put("url", DEFAULT_SECOND_URL) } ) delete( - "remote_playlists", "uid = ?", + "remote_playlists", + "uid = ?", Array(1) { remoteUid2 } ) close() diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt index 893ae82b7f9..a61caad0676 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt @@ -4,6 +4,8 @@ import android.content.Context import androidx.room.Room import androidx.test.core.app.ApplicationProvider import io.reactivex.rxjava3.core.Single +import java.io.IOException +import java.time.OffsetDateTime import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull @@ -20,9 +22,6 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.extractor.ServiceList import org.schabi.newpipe.extractor.channel.ChannelInfo import org.schabi.newpipe.extractor.stream.StreamType -import java.io.IOException -import java.time.OffsetDateTime -import kotlin.streams.toList class FeedDAOTest { private lateinit var db: AppDatabase @@ -41,14 +40,21 @@ class FeedDAOTest { private val stream7 = StreamEntity(7, serviceId, "https://youtube.com/watch?v=7", "stream 7", StreamType.VIDEO_STREAM, 1000, "channel-4", "https://youtube.com/channel/4", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-08-10", OffsetDateTime.parse("2023-08-10T00:00:00Z")) private val allStreams = listOf( - stream1, stream2, stream3, stream4, stream5, stream6, stream7 + stream1, + stream2, + stream3, + stream4, + stream5, + stream6, + stream7 ) @Before fun createDb() { val context = ApplicationProvider.getApplicationContext() db = Room.inMemoryDatabaseBuilder( - context, AppDatabase::class.java + context, + AppDatabase::class.java ).build() feedDAO = db.feedDAO() streamDAO = db.streamDAO() @@ -65,7 +71,10 @@ class FeedDAOTest { fun testUnlinkStreamsOlderThan_KeepOne() { setupUnlinkDelete("2023-08-15T00:00:00Z") val streams = feedDAO.getStreams( - FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null + FeedGroupEntity.GROUP_ALL_ID, + includePlayed = true, + includePartiallyPlayed = true, + null ) .blockingGet() val allowedStreams = listOf(stream3, stream5, stream6, stream7) @@ -76,7 +85,10 @@ class FeedDAOTest { fun testUnlinkStreamsOlderThan_KeepMultiple() { setupUnlinkDelete("2023-08-01T00:00:00Z") val streams = feedDAO.getStreams( - FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null + FeedGroupEntity.GROUP_ALL_ID, + includePlayed = true, + includePartiallyPlayed = true, + null ) .blockingGet() val allowedStreams = listOf(stream3, stream4, stream5, stream6, stream7) @@ -112,7 +124,7 @@ class FeedDAOTest { SubscriptionEntity.from(ChannelInfo(serviceId, "1", "https://youtube.com/channel/1", "https://youtube.com/channel/1", "channel-1")), SubscriptionEntity.from(ChannelInfo(serviceId, "2", "https://youtube.com/channel/2", "https://youtube.com/channel/2", "channel-2")), SubscriptionEntity.from(ChannelInfo(serviceId, "3", "https://youtube.com/channel/3", "https://youtube.com/channel/3", "channel-3")), - SubscriptionEntity.from(ChannelInfo(serviceId, "4", "https://youtube.com/channel/4", "https://youtube.com/channel/4", "channel-4")), + SubscriptionEntity.from(ChannelInfo(serviceId, "4", "https://youtube.com/channel/4", "https://youtube.com/channel/4", "channel-4")) ) ) feedDAO.insertAll( @@ -123,7 +135,7 @@ class FeedDAOTest { FeedEntity(4, 2), FeedEntity(5, 2), FeedEntity(6, 3), - FeedEntity(7, 4), + FeedEntity(7, 4) ) ) } diff --git a/app/src/androidTest/java/org/schabi/newpipe/error/ErrorInfoTest.kt b/app/src/androidTest/java/org/schabi/newpipe/error/ErrorInfoTest.kt index 2dee463ef76..85f866885b3 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/error/ErrorInfoTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/error/ErrorInfoTest.kt @@ -6,6 +6,8 @@ import android.os.Parcelable import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest +import java.io.IOException +import java.net.SocketTimeoutException import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNull @@ -16,8 +18,6 @@ import org.schabi.newpipe.R import org.schabi.newpipe.extractor.ServiceList import org.schabi.newpipe.extractor.exceptions.ParsingException import org.schabi.newpipe.extractor.exceptions.ReCaptchaException -import java.io.IOException -import java.net.SocketTimeoutException /** * Instrumented tests for {@link ErrorInfo}. diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt index 0de9dd268f0..32fb08db009 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt @@ -1,6 +1,9 @@ package org.schabi.newpipe.local.history import androidx.test.core.app.ApplicationProvider +import java.time.LocalDateTime +import java.time.OffsetDateTime +import java.time.ZoneOffset import org.assertj.core.api.Assertions.assertThat import org.junit.After import org.junit.Assert.assertEquals @@ -11,9 +14,6 @@ import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.history.model.SearchHistoryEntry import org.schabi.newpipe.testUtil.TestDatabase import org.schabi.newpipe.testUtil.TrampolineSchedulerRule -import java.time.LocalDateTime -import java.time.OffsetDateTime -import java.time.ZoneOffset class HistoryRecordManagerTest { @@ -54,7 +54,7 @@ class HistoryRecordManagerTest { SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 0, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 1, search = "B"), - SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 0, search = "B"), + SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 0, search = "B") ) // make sure all 4 were inserted @@ -85,7 +85,7 @@ class HistoryRecordManagerTest { val entries = listOf( SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = "B"), - SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 0, search = "C"), + SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 0, search = "C") ) // make sure all 3 were inserted @@ -98,7 +98,6 @@ class HistoryRecordManagerTest { } private fun insertShuffledRelatedSearches(relatedSearches: Collection) { - // shuffle to make sure the order of items returned by queries depends only on // SearchHistoryEntry.creationDate, not on the actual insertion time, so that we can // verify that the `ORDER BY` clause does its job @@ -121,7 +120,7 @@ class HistoryRecordManagerTest { RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places) RELATED_SEARCHES_ENTRIES[4].search, // B RELATED_SEARCHES_ENTRIES[5].search, // AA - RELATED_SEARCHES_ENTRIES[2].search, // BA + RELATED_SEARCHES_ENTRIES[2].search // BA ) } @@ -136,7 +135,7 @@ class HistoryRecordManagerTest { SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 3, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = "A"), - SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 2, search = "AA"), + SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 2, search = "AA") ) insertShuffledRelatedSearches(relatedSearches) @@ -153,7 +152,7 @@ class HistoryRecordManagerTest { assertThat(searches).containsExactly( RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places) RELATED_SEARCHES_ENTRIES[5].search, // AA - RELATED_SEARCHES_ENTRIES[1].search, // BA + RELATED_SEARCHES_ENTRIES[1].search // BA ) // also make sure that the string comparison is case insensitive @@ -171,7 +170,7 @@ class HistoryRecordManagerTest { SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = "B"), SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 2, search = "AA"), - SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A") ) } } diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt index ce3aeb84ac0..ac9e84228fb 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt @@ -33,8 +33,12 @@ class LocalPlaylistManagerTest { fun createPlaylist() { val NEWPIPE_URL = "https://newpipe.net/" val stream = StreamEntity( - serviceId = 1, url = NEWPIPE_URL, title = "title", - streamType = StreamType.VIDEO_STREAM, duration = 1, uploader = "uploader", + serviceId = 1, + url = NEWPIPE_URL, + title = "title", + streamType = StreamType.VIDEO_STREAM, + duration = 1, + uploader = "uploader", uploaderUrl = NEWPIPE_URL ) @@ -58,14 +62,22 @@ class LocalPlaylistManagerTest { @Test() fun createPlaylist_nonExistentStreamsAreUpserted() { val stream = StreamEntity( - serviceId = 1, url = "https://newpipe.net/", title = "title", - streamType = StreamType.VIDEO_STREAM, duration = 1, uploader = "uploader", + serviceId = 1, + url = "https://newpipe.net/", + title = "title", + streamType = StreamType.VIDEO_STREAM, + duration = 1, + uploader = "uploader", uploaderUrl = "https://newpipe.net/" ) database.streamDAO().insert(stream) val upserted = StreamEntity( - serviceId = 1, url = "https://newpipe.net/2", title = "title2", - streamType = StreamType.VIDEO_STREAM, duration = 1, uploader = "uploader", + serviceId = 1, + url = "https://newpipe.net/2", + title = "title2", + streamType = StreamType.VIDEO_STREAM, + duration = 1, + uploader = "uploader", uploaderUrl = "https://newpipe.net/" ) diff --git a/app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt b/app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt index 75f5c619553..8b9f6b7524c 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt @@ -17,21 +17,20 @@ class TrampolineSchedulerRule : TestRule { private val scheduler = Schedulers.trampoline() - override fun apply(base: Statement, description: Description): Statement = - object : Statement() { - override fun evaluate() { - try { - RxJavaPlugins.setComputationSchedulerHandler { scheduler } - RxJavaPlugins.setIoSchedulerHandler { scheduler } - RxJavaPlugins.setNewThreadSchedulerHandler { scheduler } - RxJavaPlugins.setSingleSchedulerHandler { scheduler } - RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler } + override fun apply(base: Statement, description: Description): Statement = object : Statement() { + override fun evaluate() { + try { + RxJavaPlugins.setComputationSchedulerHandler { scheduler } + RxJavaPlugins.setIoSchedulerHandler { scheduler } + RxJavaPlugins.setNewThreadSchedulerHandler { scheduler } + RxJavaPlugins.setSingleSchedulerHandler { scheduler } + RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler } - base.evaluate() - } finally { - RxJavaPlugins.reset() - RxAndroidPlugins.reset() - } + base.evaluate() + } finally { + RxJavaPlugins.reset() + RxAndroidPlugins.reset() } } + } } diff --git a/app/src/androidTest/java/org/schabi/newpipe/ui/components/common/ErrorPanelTest.kt b/app/src/androidTest/java/org/schabi/newpipe/ui/components/common/ErrorPanelTest.kt index a6627ee6647..8c96b3cdc1d 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/ui/components/common/ErrorPanelTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/ui/components/common/ErrorPanelTest.kt @@ -7,6 +7,7 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.ext.junit.runners.AndroidJUnit4 +import java.net.UnknownHostException import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -16,7 +17,6 @@ import org.schabi.newpipe.error.UserAction import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException import org.schabi.newpipe.extractor.exceptions.ReCaptchaException import org.schabi.newpipe.ui.theme.AppTheme -import java.net.UnknownHostException @RunWith(AndroidJUnit4::class) class ErrorPanelTest { diff --git a/app/src/androidTest/java/org/schabi/newpipe/ui/components/video/comment/CommentSectionInstrumentedTest.kt b/app/src/androidTest/java/org/schabi/newpipe/ui/components/video/comment/CommentSectionInstrumentedTest.kt index eed80ead485..78088f4a217 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/ui/components/video/comment/CommentSectionInstrumentedTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/ui/components/video/comment/CommentSectionInstrumentedTest.kt @@ -34,6 +34,7 @@ import androidx.paging.LoadState import androidx.paging.LoadStates import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems +import java.net.UnknownHostException import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -54,7 +55,6 @@ import org.schabi.newpipe.ui.emptystate.EmptyStateComposable import org.schabi.newpipe.ui.emptystate.EmptyStateSpec import org.schabi.newpipe.ui.theme.AppTheme import org.schabi.newpipe.viewmodels.util.Resource -import java.net.UnknownHostException class CommentSectionInstrumentedTest { @@ -277,6 +277,7 @@ private fun TestCommentSection( is Resource.Loading -> item { LoadingIndicator(modifier = Modifier.padding(top = 8.dp)) } + is Resource.Success -> { val commentInfo = (uiState as Resource.Success).data val count = commentInfo.commentCount @@ -290,6 +291,7 @@ private fun TestCommentSection( .heightIn(min = 128.dp) ) } + count == 0 -> item { EmptyStateComposable( spec = EmptyStateSpec.NoComments, @@ -298,6 +300,7 @@ private fun TestCommentSection( .heightIn(min = 128.dp) ) } + else -> { if (count >= 0) { item { @@ -314,6 +317,7 @@ private fun TestCommentSection( is LoadState.Loading -> item { LoadingIndicator(modifier = Modifier.padding(top = 8.dp)) } + is LoadState.Error -> item { Box( modifier = Modifier.fillMaxWidth() @@ -329,6 +333,7 @@ private fun TestCommentSection( ) } } + else -> items(comments.itemCount) { index -> Comment(comment = comments[index]!!) {} } @@ -336,6 +341,7 @@ private fun TestCommentSection( } } } + is Resource.Error -> item { Box( modifier = Modifier.fillMaxSize(), diff --git a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt index 9b8ee211e3a..22c7887f9e4 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt @@ -156,41 +156,51 @@ class StreamItemAdapterTest { helper.assertInvalidResponse(getResponse(mapOf(Pair("content-length", "mp3"))), 0) helper.assertInvalidResponse( - getResponse(mapOf(Pair("Content-Disposition", "filename=\"train.png\""))), 1 + getResponse(mapOf(Pair("Content-Disposition", "filename=\"train.png\""))), + 1 ) helper.assertInvalidResponse( - getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"data.csv\""))), 2 + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"data.csv\""))), + 2 ) helper.assertInvalidResponse( - getResponse(mapOf(Pair("Content-Disposition", "form-data; filename=\"data.csv\""))), 3 + getResponse(mapOf(Pair("Content-Disposition", "form-data; filename=\"data.csv\""))), + 3 ) helper.assertInvalidResponse( - getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"fieldName\"; filename*=\"filename.jpg\""))), 4 + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"fieldName\"; filename*=\"filename.jpg\""))), + 4 ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "filename=\"train.ogg\""))), - 5, MediaFormat.OGG + 5, + MediaFormat.OGG ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "some-form-data; filename=\"audio.flac\""))), - 6, MediaFormat.FLAC + 6, + MediaFormat.FLAC ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"audio.aiff\"; filename=\"audio.aiff\""))), - 7, MediaFormat.AIFF + 7, + MediaFormat.AIFF ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"alien?\"; filename*=UTF-8''%CE%B1%CE%BB%CE%B9%CF%B5%CE%BD.m4a"))), - 8, MediaFormat.M4A + 8, + MediaFormat.M4A ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"audio.mp3\"; filename=\"audio.opus\"; filename*=UTF-8''alien.opus"))), - 9, MediaFormat.OPUS + 9, + MediaFormat.OPUS ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"audio.mp3\"; filename=\"audio.opus\"; filename*=\"UTF-8''alien.opus\""))), - 10, MediaFormat.OPUS + 10, + MediaFormat.OPUS ) } @@ -213,16 +223,24 @@ class StreamItemAdapterTest { helper.assertInvalidResponse(getResponse(mapOf()), 7) helper.assertValidResponse( - getResponse(mapOf(Pair("Content-Type", "audio/flac"))), 8, MediaFormat.FLAC + getResponse(mapOf(Pair("Content-Type", "audio/flac"))), + 8, + MediaFormat.FLAC ) helper.assertValidResponse( - getResponse(mapOf(Pair("Content-Type", "audio/wav"))), 9, MediaFormat.WAV + getResponse(mapOf(Pair("Content-Type", "audio/wav"))), + 9, + MediaFormat.WAV ) helper.assertValidResponse( - getResponse(mapOf(Pair("Content-Type", "audio/opus"))), 10, MediaFormat.OPUS + getResponse(mapOf(Pair("Content-Type", "audio/opus"))), + 10, + MediaFormat.OPUS ) helper.assertValidResponse( - getResponse(mapOf(Pair("Content-Type", "audio/aiff"))), 11, MediaFormat.AIFF + getResponse(mapOf(Pair("Content-Type", "audio/aiff"))), + 11, + MediaFormat.AIFF ) } @@ -230,39 +248,37 @@ class StreamItemAdapterTest { * @return a list of video streams, in which their video only property mirrors the provided * [videoOnly] vararg. */ - private fun getVideoStreams(vararg videoOnly: Boolean) = - StreamItemAdapter.StreamInfoWrapper( - videoOnly.map { - VideoStream.Builder() - .setId(Stream.ID_UNKNOWN) - .setContent("https://example.com", true) - .setMediaFormat(MediaFormat.MPEG_4) - .setResolution("720p") - .setIsVideoOnly(it) - .build() - }, - context - ) + private fun getVideoStreams(vararg videoOnly: Boolean) = StreamInfoWrapper( + videoOnly.map { + VideoStream.Builder() + .setId(Stream.ID_UNKNOWN) + .setContent("https://example.com", true) + .setMediaFormat(MediaFormat.MPEG_4) + .setResolution("720p") + .setIsVideoOnly(it) + .build() + }, + context + ) /** * @return a list of audio streams, containing valid and null elements mirroring the provided * [shouldBeValid] vararg. */ - private fun getAudioStreams(vararg shouldBeValid: Boolean) = - getSecondaryStreamsFromList( - shouldBeValid.map { - if (it) { - AudioStream.Builder() - .setId(Stream.ID_UNKNOWN) - .setContent("https://example.com", true) - .setMediaFormat(MediaFormat.OPUS) - .setAverageBitrate(192) - .build() - } else { - null - } + private fun getAudioStreams(vararg shouldBeValid: Boolean) = getSecondaryStreamsFromList( + shouldBeValid.map { + if (it) { + AudioStream.Builder() + .setId(Stream.ID_UNKNOWN) + .setContent("https://example.com", true) + .setMediaFormat(MediaFormat.OPUS) + .setAverageBitrate(192) + .build() + } else { + null } - ) + } + ) private fun getIncompleteAudioStreams(size: Int): List { val list = ArrayList(size) @@ -292,7 +308,7 @@ class StreamItemAdapterTest { Assert.assertEquals( "normal visibility (pos=[$position]) is not correct", findViewById(R.id.wo_sound_icon).visibility, - normalVisibility, + normalVisibility ) } spinner.adapter.getDropDownView(position, null, spinner).run { @@ -307,18 +323,17 @@ class StreamItemAdapterTest { /** * Helper function that builds a secondary stream list. */ - private fun getSecondaryStreamsFromList(streams: List) = - SparseArrayCompat?>(streams.size).apply { - streams.forEachIndexed { index, stream -> - val secondaryStreamHelper: SecondaryStreamHelper? = stream?.let { - SecondaryStreamHelper( - StreamItemAdapter.StreamInfoWrapper(streams, context), - it - ) - } - put(index, secondaryStreamHelper) + private fun getSecondaryStreamsFromList(streams: List) = SparseArrayCompat?>(streams.size).apply { + streams.forEachIndexed { index, stream -> + val secondaryStreamHelper: SecondaryStreamHelper? = stream?.let { + SecondaryStreamHelper( + StreamItemAdapter.StreamInfoWrapper(streams, context), + it + ) } + put(index, secondaryStreamHelper) } + } private fun getResponse(headers: Map): Response { val listHeaders = HashMap>() @@ -345,7 +360,8 @@ class StreamItemAdapterTest { index: Int ) { assertFalse( - "invalid header returns valid value", retrieveMediaFormat(streams[index], response) + "invalid header returns valid value", + retrieveMediaFormat(streams[index], response) ) assertNull("Media format extracted although stated otherwise", wrapper.getFormat(index)) } @@ -359,7 +375,8 @@ class StreamItemAdapterTest { format: MediaFormat ) { assertTrue( - "header was not recognized", retrieveMediaFormat(streams[index], response) + "header was not recognized", + retrieveMediaFormat(streams[index], response) ) assertEquals("Wrong media format extracted", format, wrapper.getFormat(index)) } diff --git a/app/src/main/java/org/schabi/newpipe/App.kt b/app/src/main/java/org/schabi/newpipe/App.kt index 0505f272fbb..703f3e213bc 100644 --- a/app/src/main/java/org/schabi/newpipe/App.kt +++ b/app/src/main/java/org/schabi/newpipe/App.kt @@ -22,6 +22,9 @@ import io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException import io.reactivex.rxjava3.exceptions.UndeliverableException import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.plugins.RxJavaPlugins +import java.io.IOException +import java.io.InterruptedIOException +import java.net.SocketException import org.acra.ACRA.init import org.acra.ACRA.isACRASenderServiceProcess import org.acra.config.CoreConfigurationBuilder @@ -38,9 +41,6 @@ import org.schabi.newpipe.util.StateSaver import org.schabi.newpipe.util.image.ImageStrategy import org.schabi.newpipe.util.image.PreferredImageQuality import org.schabi.newpipe.util.potoken.PoTokenProviderImpl -import java.io.IOException -import java.io.InterruptedIOException -import java.net.SocketException /* * Copyright (C) Hans-Christoph Steiner 2016 @@ -101,7 +101,7 @@ open class App : NewPipe.init( getDownloader(), Localization.getPreferredLocalization(this), - Localization.getPreferredContentCountry(this), + Localization.getPreferredContentCountry(this) ) Localization.initPrettyTime(Localization.resolvePrettyTime()) @@ -118,9 +118,9 @@ open class App : this, prefs.getString( getString(R.string.image_quality_key), - getString(R.string.image_quality_default), - ), - ), + getString(R.string.image_quality_default) + ) + ) ) configureRxJavaErrorHandler() @@ -128,15 +128,14 @@ open class App : YoutubeStreamExtractor.setPoTokenProvider(PoTokenProviderImpl) } - override fun newImageLoader(context: Context): ImageLoader = - ImageLoader - .Builder(this) - .logger(if (BuildConfig.DEBUG) DebugLogger() else null) - .allowRgb565(getSystemService()!!.isLowRamDevice) - .crossfade(true) - .components { - add(OkHttpNetworkFetcherFactory(callFactory = DownloaderImpl.getInstance().client)) - }.build() + override fun newImageLoader(context: Context): ImageLoader = ImageLoader + .Builder(this) + .logger(if (BuildConfig.DEBUG) DebugLogger() else null) + .allowRgb565(getSystemService()!!.isLowRamDevice) + .crossfade(true) + .components { + add(OkHttpNetworkFetcherFactory(callFactory = DownloaderImpl.getInstance().client)) + }.build() protected open fun getDownloader(): Downloader { val downloader = DownloaderImpl.init(null) @@ -190,7 +189,7 @@ open class App : IOException::class.java, SocketException::class.java, // blocking code disposed InterruptedException::class.java, - InterruptedIOException::class.java, + InterruptedIOException::class.java ) } @@ -204,7 +203,7 @@ open class App : OnErrorNotImplementedException::class.java, MissingBackpressureException::class.java, // bug in operator - IllegalStateException::class.java, + IllegalStateException::class.java ) } @@ -215,7 +214,7 @@ open class App : .uncaughtExceptionHandler .uncaughtException(Thread.currentThread(), throwable) } - }, + } ) } @@ -241,7 +240,7 @@ open class App : NotificationChannelCompat .Builder( getString(R.string.notification_channel_id), - NotificationManagerCompat.IMPORTANCE_LOW, + NotificationManagerCompat.IMPORTANCE_LOW ).setName(getString(R.string.notification_channel_name)) .setDescription(getString(R.string.notification_channel_description)) .build() @@ -249,7 +248,7 @@ open class App : NotificationChannelCompat .Builder( getString(R.string.app_update_notification_channel_id), - NotificationManagerCompat.IMPORTANCE_LOW, + NotificationManagerCompat.IMPORTANCE_LOW ).setName(getString(R.string.app_update_notification_channel_name)) .setDescription(getString(R.string.app_update_notification_channel_description)) .build() @@ -257,7 +256,7 @@ open class App : NotificationChannelCompat .Builder( getString(R.string.hash_channel_id), - NotificationManagerCompat.IMPORTANCE_HIGH, + NotificationManagerCompat.IMPORTANCE_HIGH ).setName(getString(R.string.hash_channel_name)) .setDescription(getString(R.string.hash_channel_description)) .build() @@ -265,7 +264,7 @@ open class App : NotificationChannelCompat .Builder( getString(R.string.error_report_channel_id), - NotificationManagerCompat.IMPORTANCE_LOW, + NotificationManagerCompat.IMPORTANCE_LOW ).setName(getString(R.string.error_report_channel_name)) .setDescription(getString(R.string.error_report_channel_description)) .build() @@ -273,7 +272,7 @@ open class App : NotificationChannelCompat .Builder( getString(R.string.streams_notification_channel_id), - NotificationManagerCompat.IMPORTANCE_DEFAULT, + NotificationManagerCompat.IMPORTANCE_DEFAULT ).setName(getString(R.string.streams_notification_channel_name)) .setDescription(getString(R.string.streams_notification_channel_description)) .build() diff --git a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java index 41f81f13690..74a2cab5176 100644 --- a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java +++ b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java @@ -166,9 +166,7 @@ public Response execute(@NonNull final Request request) String responseBodyToReturn = null; try (ResponseBody body = response.body()) { - if (body != null) { - responseBodyToReturn = body.string(); - } + responseBodyToReturn = body.string(); } final String latestUrl = response.request().url().toString(); diff --git a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt index c3ce515240b..6527bd2ae88 100644 --- a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt +++ b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt @@ -8,6 +8,7 @@ package org.schabi.newpipe import android.content.Context import androidx.room.Room.databaseBuilder +import kotlin.concurrent.Volatile import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.Migrations.MIGRATION_1_2 import org.schabi.newpipe.database.Migrations.MIGRATION_2_3 @@ -17,7 +18,6 @@ import org.schabi.newpipe.database.Migrations.MIGRATION_5_6 import org.schabi.newpipe.database.Migrations.MIGRATION_6_7 import org.schabi.newpipe.database.Migrations.MIGRATION_7_8 import org.schabi.newpipe.database.Migrations.MIGRATION_8_9 -import kotlin.concurrent.Volatile object NewPipeDatabase { diff --git a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt index 000b83953ec..fb48d3f7055 100644 --- a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt @@ -18,10 +18,10 @@ import androidx.work.WorkerParameters import androidx.work.workDataOf import com.grack.nanojson.JsonParser import com.grack.nanojson.JsonParserException +import java.io.IOException import org.schabi.newpipe.extractor.downloader.Response import org.schabi.newpipe.extractor.exceptions.ReCaptchaException import org.schabi.newpipe.util.ReleaseVersionUtil -import java.io.IOException class NewVersionWorker( context: Context, @@ -46,7 +46,8 @@ class NewVersionWorker( // Show toast stating that the app is up-to-date if the update check was manual. ContextCompat.getMainExecutor(applicationContext).execute { Toast.makeText( - applicationContext, R.string.app_update_unavailable_toast, + applicationContext, + R.string.app_update_unavailable_toast, Toast.LENGTH_SHORT ).show() } @@ -58,7 +59,11 @@ class NewVersionWorker( val intent = Intent(Intent.ACTION_VIEW, apkLocationUrl?.toUri()) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) val pendingIntent = PendingIntentCompat.getActivity( - applicationContext, 0, intent, 0, false + applicationContext, + 0, + intent, + 0, + false ) val channelId = applicationContext.getString(R.string.app_update_notification_channel_id) val notificationBuilder = NotificationCompat.Builder(applicationContext, channelId) @@ -71,7 +76,8 @@ class NewVersionWorker( ) .setContentText( applicationContext.getString( - R.string.app_update_available_notification_text, versionName + R.string.app_update_available_notification_text, + versionName ) ) diff --git a/app/src/main/java/org/schabi/newpipe/database/Converters.kt b/app/src/main/java/org/schabi/newpipe/database/Converters.kt index ec097cc1bf3..f9cbb1de265 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Converters.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Converters.kt @@ -1,11 +1,11 @@ package org.schabi.newpipe.database import androidx.room.TypeConverter -import org.schabi.newpipe.extractor.stream.StreamType -import org.schabi.newpipe.local.subscription.FeedGroupIcon import java.time.Instant import java.time.OffsetDateTime import java.time.ZoneOffset +import org.schabi.newpipe.extractor.stream.StreamType +import org.schabi.newpipe.local.subscription.FeedGroupIcon class Converters { /** diff --git a/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt b/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt index 50529610b88..944b247bff8 100644 --- a/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt +++ b/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt @@ -14,6 +14,6 @@ interface LocalItem { PLAYLIST_REMOTE_ITEM, PLAYLIST_STREAM_ITEM, - STATISTIC_STREAM_ITEM, + STATISTIC_STREAM_ITEM } } diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt index 6566f7e6a26..414f7489390 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt @@ -8,7 +8,6 @@ package org.schabi.newpipe.database import android.util.Log import androidx.room.migration.Migration -import androidx.sqlite.db.SupportSQLiteDatabase import org.schabi.newpipe.MainActivity object Migrations { 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 d756df8b1f7..5861fa767f1 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 @@ -8,6 +8,7 @@ import androidx.room.Transaction import androidx.room.Update import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe +import java.time.OffsetDateTime import org.schabi.newpipe.database.feed.model.FeedEntity import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity @@ -15,7 +16,6 @@ import org.schabi.newpipe.database.stream.StreamWithState import org.schabi.newpipe.database.stream.model.StreamStateEntity import org.schabi.newpipe.database.subscription.NotificationMode import org.schabi.newpipe.database.subscription.SubscriptionEntity -import java.time.OffsetDateTime @Dao abstract class FeedDAO { diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt index beeedc62bc8..86568bc908d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt @@ -19,13 +19,17 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity entity = StreamEntity::class, parentColumns = [StreamEntity.STREAM_ID], childColumns = [STREAM_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ), ForeignKey( entity = SubscriptionEntity::class, parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID], childColumns = [SUBSCRIPTION_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ) ] ) diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt index b114a734c5c..6dac3c89cb8 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt @@ -18,14 +18,18 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity entity = FeedGroupEntity::class, parentColumns = [FeedGroupEntity.ID], childColumns = [GROUP_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ), ForeignKey( entity = SubscriptionEntity::class, parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID], childColumns = [SUBSCRIPTION_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ) ] ) 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 a19af9c456e..fc0ee6742f3 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,10 +4,10 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.PrimaryKey +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 -import java.time.OffsetDateTime @Entity( tableName = FEED_LAST_UPDATED_TABLE, @@ -16,7 +16,9 @@ import java.time.OffsetDateTime entity = SubscriptionEntity::class, parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID], childColumns = [SUBSCRIPTION_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ) ] ) diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt index e6006a0694d..eee213453ed 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt @@ -29,7 +29,7 @@ data class SearchHistoryEntry @JvmOverloads constructor( @ColumnInfo(name = ID) @PrimaryKey(autoGenerate = true) - val id: Long = 0, + val id: Long = 0 ) { @Ignore diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt index db41e141c5d..deba7dd3af9 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt @@ -11,12 +11,12 @@ import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.ForeignKey.Companion.CASCADE import androidx.room.Index +import java.time.OffsetDateTime import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.JOIN_STREAM_ID import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.STREAM_ACCESS_DATE import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.STREAM_HISTORY_TABLE import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID -import java.time.OffsetDateTime /** * @param streamUid the stream id this history item will refer to 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 27fc429f1b9..816b25c2a2d 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,10 +2,10 @@ package org.schabi.newpipe.database.history.model import androidx.room.ColumnInfo import androidx.room.Embedded +import java.time.OffsetDateTime import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.util.image.ImageStrategy -import java.time.OffsetDateTime data class StreamHistoryEntry( @Embedded @@ -30,16 +30,15 @@ data class StreamHistoryEntry( accessDate.isEqual(other.accessDate) } - fun toStreamInfoItem(): StreamInfoItem = - StreamInfoItem( - streamEntity.serviceId, - streamEntity.url, - streamEntity.title, - streamEntity.streamType, - ).apply { - duration = streamEntity.duration - uploaderName = streamEntity.uploader - uploaderUrl = streamEntity.uploaderUrl - thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) - } + fun toStreamInfoItem(): StreamInfoItem = StreamInfoItem( + streamEntity.serviceId, + streamEntity.url, + streamEntity.title, + streamEntity.streamType + ).apply { + duration = streamEntity.duration + uploaderName = streamEntity.uploader + uploaderUrl = streamEntity.uploaderUrl + thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) + } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt index 8bf26d754fa..c6b6e37a400 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt @@ -68,6 +68,11 @@ interface PlaylistStreamDAO : BasicDAO { ) fun getOrderedStreamsOf(playlistId: Long): Flowable> + // If a playlist has no streams, there won’t be any rows in the **playlist_stream_join** table + // that have a foreign key to that playlist. Thus, the **playlist_id** will not have a + // corresponding value in any rows of the join table. So, if you group by the **playlist_id**, + // only playlists that contain videos are grouped and displayed. Look at #9642 #13055 + @Transaction @Query( """ @@ -103,6 +108,11 @@ interface PlaylistStreamDAO : BasicDAO { ) fun getStreamsWithoutDuplicates(playlistId: Long): Flowable> + // If a playlist has no streams, there won’t be any rows in the **playlist_stream_join** table + // that have a foreign key to that playlist. Thus, the **playlist_id** will not have a + // corresponding value in any rows of the join table. So, if you group by the **playlist_id**, + // only playlists that contain videos are grouped and displayed. Look at #9642 #13055 + @Transaction @Query( """ @@ -118,7 +128,7 @@ interface PlaylistStreamDAO : BasicDAO { LEFT JOIN streams ON streams.uid = stream_id AND :streamUrl = :streamUrl - GROUP BY playlist_id + GROUP BY playlists.uid ORDER BY display_index, name """ ) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt index 4ea4eb3a78b..1f1862f4fd8 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt @@ -37,7 +37,7 @@ data class PlaylistEntity @JvmOverloads constructor( name = item.orderingName, isThumbnailPermanent = item.isThumbnailPermanent!!, thumbnailStreamId = item.thumbnailStreamId!!, - displayIndex = item.displayIndex!!, + displayIndex = item.displayIndex!! ) companion object { 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 3fa281e457a..ce74678ca77 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 @@ -9,13 +9,13 @@ package org.schabi.newpipe.database.stream import androidx.room.ColumnInfo import androidx.room.Embedded import androidx.room.Ignore +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.database.stream.model.StreamStateEntity.Companion.STREAM_PROGRESS_MILLIS import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.util.image.ImageStrategy -import java.time.OffsetDateTime data class StreamStatisticsEntry( @Embedded 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 0015c8e0aaa..efc51e1a434 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 @@ -9,12 +9,12 @@ import androidx.room.Transaction import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe +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 import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.util.StreamTypeUtil -import java.time.OffsetDateTime @Dao abstract class StreamDAO : BasicDAO { @@ -92,7 +92,6 @@ abstract class StreamDAO : BasicDAO { newerStream.uid = existentMinimalStream.uid if (!StreamTypeUtil.isLiveStream(newerStream.streamType)) { - // Use the existent upload date if the newer stream does not have a better precision // (i.e. is an approximation). This is done to prevent unnecessary changes. val hasBetterPrecision = 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 d9c160b89bc..067f666b634 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 @@ -5,6 +5,8 @@ import androidx.room.Entity import androidx.room.Ignore import androidx.room.Index import androidx.room.PrimaryKey +import java.io.Serializable +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 @@ -14,8 +16,6 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.player.playqueue.PlayQueueItem import org.schabi.newpipe.util.image.ImageStrategy -import java.io.Serializable -import java.time.OffsetDateTime @Entity( tableName = STREAM_TABLE, @@ -86,8 +86,12 @@ data class StreamEntity( @Ignore constructor(item: PlayQueueItem) : this( - serviceId = item.serviceId, url = item.url, title = item.title, - streamType = item.streamType, duration = item.duration, uploader = item.uploader, + serviceId = item.serviceId, + url = item.url, + title = item.title, + streamType = item.streamType, + duration = item.duration, + uploader = item.uploader, uploaderUrl = item.uploaderUrl, thumbnailUrl = ImageStrategy.imageListToDbUrl(item.thumbnails) ) diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index 45ab8daa03d..e86539fa434 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -6,6 +6,7 @@ import androidx.annotation.StringRes import com.google.android.exoplayer2.ExoPlaybackException import com.google.android.exoplayer2.upstream.HttpDataSource import com.google.android.exoplayer2.upstream.Loader +import java.net.UnknownHostException import kotlinx.parcelize.Parcelize import org.schabi.newpipe.R import org.schabi.newpipe.extractor.Info @@ -28,7 +29,6 @@ import org.schabi.newpipe.ktx.isNetworkRelated import org.schabi.newpipe.player.mediasource.FailedMediaSource import org.schabi.newpipe.player.resolver.PlaybackResolver import org.schabi.newpipe.util.Localization -import java.net.UnknownHostException /** * An error has occurred in the app. This class contains plain old parcelable data that can be used @@ -59,7 +59,7 @@ class ErrorInfo private constructor( * If present, this resource can alternatively be opened in browser (useful if NewPipe is * badly broken). */ - val openInBrowserUrl: String?, + val openInBrowserUrl: String? ) : Parcelable { @JvmOverloads @@ -68,7 +68,7 @@ class ErrorInfo private constructor( userAction: UserAction, request: String, serviceId: Int? = null, - openInBrowserUrl: String? = null, + openInBrowserUrl: String? = null ) : this( throwableToStringList(throwable), userAction, @@ -78,7 +78,7 @@ class ErrorInfo private constructor( isReportable(throwable), isRetryable(throwable), (throwable as? ReCaptchaException)?.url, - openInBrowserUrl, + openInBrowserUrl ) @JvmOverloads @@ -87,7 +87,7 @@ class ErrorInfo private constructor( userAction: UserAction, request: String, serviceId: Int? = null, - openInBrowserUrl: String? = null, + openInBrowserUrl: String? = null ) : this( throwableListToStringList(throwables), userAction, @@ -97,7 +97,7 @@ class ErrorInfo private constructor( throwables.any(::isReportable), throwables.isEmpty() || throwables.any(::isRetryable), throwables.firstNotNullOfOrNull { it as? ReCaptchaException }?.url, - openInBrowserUrl, + openInBrowserUrl ) // constructor to manually build ErrorInfo when no throwable is available @@ -118,7 +118,7 @@ class ErrorInfo private constructor( throwable: Throwable, userAction: UserAction, request: String, - info: Info?, + info: Info? ) : this(throwable, userAction, request, info?.serviceId, info?.url) @@ -127,7 +127,7 @@ class ErrorInfo private constructor( throwables: List, userAction: UserAction, request: String, - info: Info?, + info: Info? ) : this(throwables, userAction, request, info?.serviceId, info?.url) @@ -144,7 +144,7 @@ class ErrorInfo private constructor( class ErrorMessage( @StringRes private val stringRes: Int, - private vararg val formatArgs: String, + private vararg val formatArgs: String ) : Parcelable { fun getString(context: Context): String { // use Localization.compatGetString() just in case context is not AppCompatActivity @@ -158,21 +158,19 @@ class ErrorInfo private constructor( const val SERVICE_NONE = "" - private fun getServiceName(serviceId: Int?) = - // not using getNameOfServiceById since we want to accept a nullable serviceId and we + private fun getServiceName(serviceId: Int?) = // not using getNameOfServiceById since we want to accept a nullable serviceId and we // want to default to SERVICE_NONE ServiceList.all()?.firstOrNull { it.serviceId == serviceId }?.serviceInfo?.name ?: SERVICE_NONE fun throwableToStringList(throwable: Throwable) = arrayOf(throwable.stackTraceToString()) - fun throwableListToStringList(throwableList: List) = - throwableList.map { it.stackTraceToString() }.toTypedArray() + fun throwableListToStringList(throwableList: List) = throwableList.map { it.stackTraceToString() }.toTypedArray() fun getMessage( throwable: Throwable?, action: UserAction?, - serviceId: Int?, + serviceId: Int? ): ErrorMessage { return when { // player exceptions @@ -191,18 +189,24 @@ class ErrorInfo private constructor( ErrorMessage(R.string.player_http_invalid_status, cause.responseCode.toString()) } } + cause is Loader.UnexpectedLoaderException && cause.cause is ExtractionException -> getMessage(throwable, action, serviceId) + throwable.type == ExoPlaybackException.TYPE_SOURCE -> ErrorMessage(R.string.player_stream_failure) + throwable.type == ExoPlaybackException.TYPE_UNEXPECTED -> ErrorMessage(R.string.player_recoverable_failure) + else -> ErrorMessage(R.string.player_unrecoverable_failure) } } + throwable is FailedMediaSource.FailedMediaSourceException -> getMessage(throwable.cause, action, serviceId) + throwable is PlaybackResolver.ResolverException -> ErrorMessage(R.string.player_stream_failure) @@ -218,34 +222,46 @@ class ErrorInfo private constructor( ) } ?: ErrorMessage(R.string.account_terminated) + throwable is AgeRestrictedContentException -> ErrorMessage(R.string.restricted_video_no_stream) + throwable is GeographicRestrictionException -> ErrorMessage(R.string.georestricted_content) + throwable is PaidContentException -> ErrorMessage(R.string.paid_content) + throwable is PrivateContentException -> ErrorMessage(R.string.private_content) + throwable is SoundCloudGoPlusContentException -> ErrorMessage(R.string.soundcloud_go_plus_content) + throwable is UnsupportedContentInCountryException -> ErrorMessage(R.string.unsupported_content_in_country) + throwable is YoutubeMusicPremiumContentException -> ErrorMessage(R.string.youtube_music_premium_content) + throwable is SignInConfirmNotBotException -> ErrorMessage(R.string.sign_in_confirm_not_bot_error, getServiceName(serviceId)) + throwable is ContentNotAvailableException -> ErrorMessage(R.string.content_not_available) // other extractor exceptions throwable is ContentNotSupportedException -> ErrorMessage(R.string.content_not_supported) + // ReCaptchas will be handled in a special way anyway throwable is ReCaptchaException -> ErrorMessage(R.string.recaptcha_request_toast) + // test this at the end as many exceptions could be a subclass of IOException throwable != null && throwable.isNetworkRelated -> ErrorMessage(R.string.network_error) + // an extraction exception unrelated to the network // is likely an issue with parsing the website throwable is ExtractionException -> @@ -254,16 +270,22 @@ class ErrorInfo private constructor( // user actions (in case the exception is null or unrecognizable) action == UserAction.UI_ERROR -> ErrorMessage(R.string.app_ui_crash) + action == UserAction.REQUESTED_COMMENTS -> ErrorMessage(R.string.error_unable_to_load_comments) + action == UserAction.SUBSCRIPTION_CHANGE -> ErrorMessage(R.string.subscription_change_failed) + action == UserAction.SUBSCRIPTION_UPDATE -> ErrorMessage(R.string.subscription_update_failed) + action == UserAction.LOAD_IMAGE -> ErrorMessage(R.string.could_not_load_thumbnails) + action == UserAction.DOWNLOAD_OPEN_DIALOG -> ErrorMessage(R.string.could_not_setup_download_menu) + else -> ErrorMessage(R.string.error_snackbar_message) } @@ -274,18 +296,23 @@ class ErrorInfo private constructor( // we don't have an exception, so this is a manually built error, which likely // indicates that it's important and is thus reportable null -> true + // a recaptcha was detected, and the user needs to solve it, there is no use in // letting users report it is ReCaptchaException -> false + // the service explicitly said that content is not available (e.g. age restrictions, // video deleted, etc.), there is no use in letting users report it is ContentNotAvailableException -> false + // we know the content is not supported, no need to let the user report it is ContentNotSupportedException -> false + // happens often when there is no internet connection; we don't use // `throwable.isNetworkRelated` since any `IOException` would make that function // return true, but not all `IOException`s are network related is UnknownHostException -> false + // by default, this is an unexpected exception, which the user could report else -> true } @@ -295,8 +322,10 @@ class ErrorInfo private constructor( return when (throwable) { // we know the content is not available, retrying won't help is ContentNotAvailableException -> false + // we know the content is not supported, retrying won't help is ContentNotSupportedException -> false + // by default (including if throwable is null), enable retrying (though the retry // button will be shown only if a way to perform the retry is implemented) else -> true diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt index 4ec5f58c35c..023d13e9d8d 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt @@ -11,16 +11,16 @@ import androidx.fragment.app.Fragment import com.jakewharton.rxbinding4.view.clicks import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.Disposable +import java.util.concurrent.TimeUnit import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.ktx.animate import org.schabi.newpipe.util.external_communication.ShareUtils -import java.util.concurrent.TimeUnit class ErrorPanelHelper( private val fragment: Fragment, rootView: View, - onRetry: Runnable?, + onRetry: Runnable? ) { private val context: Context = rootView.context!! diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt index b358a5fd273..7facb5d8566 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt @@ -46,7 +46,7 @@ class ErrorUtil { @JvmStatic fun openActivity(context: Context, errorInfo: ErrorInfo) { if (PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(MainActivity.KEY_IS_IN_BACKGROUND, true) + .getBoolean(MainActivity.KEY_IS_IN_BACKGROUND, true) ) { createNotification(context, errorInfo) } else { diff --git a/app/src/main/java/org/schabi/newpipe/error/UserAction.kt b/app/src/main/java/org/schabi/newpipe/error/UserAction.kt index 2d2358310d7..b3f14e2da03 100644 --- a/app/src/main/java/org/schabi/newpipe/error/UserAction.kt +++ b/app/src/main/java/org/schabi/newpipe/error/UserAction.kt @@ -40,5 +40,5 @@ enum class UserAction(val message: String) { OPEN_INFO_ITEM_DIALOG("open info item dialog"), GETTING_MAIN_SCREEN_TAB("getting main screen tab"), PLAY_ON_POPUP("play on popup"), - SUBSCRIPTIONS("loading subscriptions"); + SUBSCRIPTIONS("loading subscriptions") } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.kt b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.kt index d1514fbe5bc..e4556f51297 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.kt @@ -56,6 +56,11 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.schedulers.Schedulers +import java.util.LinkedList +import java.util.concurrent.TimeUnit +import kotlin.math.abs +import kotlin.math.max +import kotlin.math.min import org.schabi.newpipe.App import org.schabi.newpipe.R import org.schabi.newpipe.database.stream.model.StreamEntity @@ -115,11 +120,6 @@ import org.schabi.newpipe.util.ThemeHelper import org.schabi.newpipe.util.external_communication.KoreUtils import org.schabi.newpipe.util.external_communication.ShareUtils import org.schabi.newpipe.util.image.CoilHelper -import java.util.LinkedList -import java.util.concurrent.TimeUnit -import kotlin.math.abs -import kotlin.math.max -import kotlin.math.min class VideoDetailFragment : BaseStateFragment(), @@ -128,15 +128,29 @@ class VideoDetailFragment : OnKeyDownListener { // stream info - @JvmField @State var serviceId: Int = NO_SERVICE_ID - @JvmField @State var title: String = "" - @JvmField @State var url: String? = null + @JvmField + @State + var serviceId: Int = NO_SERVICE_ID + + @JvmField + @State + var title: String = "" + + @JvmField + @State + var url: String? = null private var currentInfo: StreamInfo? = null // player objects private var playQueue: PlayQueue? = null - @JvmField @State var autoPlayEnabled: Boolean = true - @JvmField @State var originalOrientation: Int = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + + @JvmField + @State + var autoPlayEnabled: Boolean = true + + @JvmField + @State + var originalOrientation: Int = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED private var playerService: PlayerService? = null private var player: Player? = null @@ -152,7 +166,9 @@ class VideoDetailFragment : private var showRelatedItems = false private var showDescription = false private lateinit var selectedTabTag: String + @AttrRes val tabIcons = ArrayList() + @StringRes val tabContentDescriptions = ArrayList() private var tabSettingsChanged = false private var lastAppBarVerticalOffset = Int.Companion.MAX_VALUE // prevents useless updates @@ -172,8 +188,13 @@ class VideoDetailFragment : } // bottom sheet - @JvmField @State var bottomSheetState: Int = BottomSheetBehavior.STATE_EXPANDED - @JvmField @State var lastStableBottomSheetState: Int = BottomSheetBehavior.STATE_EXPANDED + @JvmField + @State + var bottomSheetState: Int = BottomSheetBehavior.STATE_EXPANDED + + @JvmField + @State + var lastStableBottomSheetState: Int = BottomSheetBehavior.STATE_EXPANDED private lateinit var bottomSheetBehavior: BottomSheetBehavior private lateinit var bottomSheetCallback: BottomSheetCallback private lateinit var broadcastReceiver: BroadcastReceiver @@ -244,7 +265,8 @@ class VideoDetailFragment : showRelatedItems = prefs.getBoolean(getString(R.string.show_next_video_key), true) showDescription = prefs.getBoolean(getString(R.string.show_description_key), true) selectedTabTag = prefs.getString( - getString(R.string.stream_info_selected_tab_key), COMMENTS_TAB_TAG + getString(R.string.stream_info_selected_tab_key), + COMMENTS_TAB_TAG )!! prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener) @@ -258,7 +280,8 @@ class VideoDetailFragment : } } activity.contentResolver.registerContentObserver( - Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION), false, + Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION), + false, settingsContentObserver!! ) } @@ -357,7 +380,13 @@ class VideoDetailFragment : if (requestCode == ReCaptchaActivity.RECAPTCHA_REQUEST) { if (resultCode == Activity.RESULT_OK) { NavigationHelper.openVideoDetailFragment( - requireContext(), getFM(), serviceId, url, title, null, false + requireContext(), + getFM(), + serviceId, + url, + title, + null, + false ) } else { Log.e(TAG, "ReCaptcha failed") @@ -562,7 +591,7 @@ class VideoDetailFragment : KoreUtils.shouldShowPlayWithKodi(requireContext(), serviceId) binding.detailControlsCrashThePlayer.isVisible = DEBUG && PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(getString(R.string.show_crash_the_player_key), false) + .getBoolean(getString(R.string.show_crash_the_player_key), false) accommodateForTvAndDesktopMode() } @@ -845,7 +874,9 @@ class VideoDetailFragment : private fun updateTabs(info: StreamInfo) { if (showRelatedItems) { when (val relatedItemsLayout = binding.relatedItemsLayout) { - null -> pageAdapter.updateItem(RELATED_TAB_TAG, getInstance(info)) // phone + null -> pageAdapter.updateItem(RELATED_TAB_TAG, getInstance(info)) + + // phone else -> { // tablet + TV getChildFragmentManager().beginTransaction() .replace(R.id.relatedItemsLayout, getInstance(info)) @@ -896,7 +927,9 @@ class VideoDetailFragment : val viewPagerVisibleHeight = height - pagerHitRect.top // see TabLayout.DEFAULT_HEIGHT, which is equal to 48dp val tabLayoutHeight = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, 48f, resources.displayMetrics + TypedValue.COMPLEX_UNIT_DIP, + 48f, + resources.displayMetrics ) if (viewPagerVisibleHeight > tabLayoutHeight * 2) { @@ -997,7 +1030,7 @@ class VideoDetailFragment : } if (PreferenceManager.getDefaultSharedPreferences(activity) - .getBoolean(this.getString(R.string.use_external_video_player_key), false) + .getBoolean(this.getString(R.string.use_external_video_player_key), false) ) { showExternalVideoPlaybackDialog() } else { @@ -1046,7 +1079,10 @@ class VideoDetailFragment : tryAddVideoPlayerView() val playerIntent = NavigationHelper.getPlayerIntent( - requireContext(), PlayerService::class.java, queue, PlayerIntentType.AllOthers + requireContext(), + PlayerService::class.java, + queue, + PlayerIntentType.AllOthers ) .putExtra(Player.PLAY_WHEN_READY, autoPlayEnabled) .putExtra(Player.RESUME_PLAYBACK, true) @@ -1102,7 +1138,10 @@ class VideoDetailFragment : selectedStream: Stream ) { NavigationHelper.playOnExternalPlayer( - context, info.name, info.subChannelName, selectedStream + context, + info.name, + info.subChannelName, + selectedStream ) val recordManager = HistoryRecordManager(requireContext()) @@ -1173,10 +1212,11 @@ class VideoDetailFragment : private val preDrawListener: OnPreDrawListener = OnPreDrawListener { view?.let { view -> - val decorView = if (DeviceUtils.isInMultiWindow(activity)) + val decorView = if (DeviceUtils.isInMultiWindow(activity)) { view - else + } else { activity.window.decorView + } setHeightThumbnail(decorView.height, resources.displayMetrics) view.getViewTreeObserver().removeOnPreDrawListener(preDrawListener) } @@ -1196,10 +1236,11 @@ class VideoDetailFragment : if (this.isFullscreen) { val height = ( - if (DeviceUtils.isInMultiWindow(activity)) + if (DeviceUtils.isInMultiWindow(activity)) { requireView() - else + } else { activity.window.decorView + } ).height // Height is zero when the view is not yet displayed like after orientation change if (height != 0) { @@ -1210,10 +1251,11 @@ class VideoDetailFragment : } else { val isPortrait = metrics.heightPixels > metrics.widthPixels val height = ( - if (isPortrait) + if (isPortrait) { metrics.widthPixels / (16.0f / 9.0f) - else + } else { metrics.heightPixels / 2.0f + } ).toInt() setHeightThumbnail(height, metrics) } @@ -1288,7 +1330,9 @@ class VideoDetailFragment : override fun onReceive(context: Context?, intent: Intent) { when (intent.action) { ACTION_SHOW_MAIN_PLAYER -> bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED) + ACTION_HIDE_MAIN_PLAYER -> bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN) + ACTION_PLAYER_STARTED -> { // If the state is not hidden we don't need to show the mini player if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) { @@ -1446,8 +1490,10 @@ class VideoDetailFragment : checkUpdateProgressInfo(info) CoilHelper.loadDetailsThumbnail(binding.detailThumbnailImageView, info.thumbnails) ExtractorHelper.showMetaInfoInTextView( - info.metaInfo, binding.detailMetaInfoTextView, - binding.detailMetaInfoSeparator, disposables + info.metaInfo, + binding.detailMetaInfoTextView, + binding.detailMetaInfoSeparator, + disposables ) if (playerIsStopped) { @@ -1561,7 +1607,9 @@ class VideoDetailFragment : .observeOn(AndroidSchedulers.mainThread()) .subscribe( { state -> updatePlaybackProgress(state.progressMillis, info.duration * 1000) }, - { throwable -> /* impossible due to the onErrorComplete() */ }, + { throwable -> + /* impossible due to the onErrorComplete() */ + }, { /* onComplete */ binding.positionView.visibility = View.GONE @@ -1607,7 +1655,7 @@ class VideoDetailFragment : Log.d( TAG, "onQueueUpdate() called with: serviceId = [$serviceId], url = [${ - url}], name = [$title], playQueue = [$playQueue]" + url}], name = [$title], playQueue = [$playQueue]" ) } @@ -1787,7 +1835,8 @@ class VideoDetailFragment : activity.window.decorView.systemUiVisibility = 0 activity.window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) activity.window.statusBarColor = ThemeHelper.resolveColorFromAttr( - requireContext(), android.R.attr.colorPrimary + requireContext(), + android.R.attr.colorPrimary ) } @@ -2013,7 +2062,8 @@ class VideoDetailFragment : if (audioTracks.isEmpty()) { Toast.makeText( - activity, R.string.no_audio_streams_available_for_external_players, + activity, + R.string.no_audio_streams_available_for_external_players, Toast.LENGTH_SHORT ).show() } else if (audioTracks.size == 1) { @@ -2053,6 +2103,7 @@ class VideoDetailFragment : /*////////////////////////////////////////////////////////////////////////// // Bottom mini player ////////////////////////////////////////////////////////////////////////// */ + /** * That's for Android TV support. Move focus from main fragment to the player or back * based on what is currently selected @@ -2311,6 +2362,7 @@ class VideoDetailFragment : /*////////////////////////////////////////////////////////////////////////// // OwnStack ////////////////////////////////////////////////////////////////////////// */ + /** * Stack that contains the "navigation history".

* The peek is the current video. diff --git a/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt index 703191bb96d..899223afae1 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt +++ b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt @@ -13,14 +13,17 @@ enum class ItemViewMode { * Default mode. */ AUTO, + /** * Full width list item with thumb on the left and two line title & uploader in right. */ LIST, + /** * Grid mode places two cards per row. */ GRID, + /** * A full width card in phone - portrait. */ diff --git a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt index 869bf6f48a2..9b6005f65fa 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt +++ b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt @@ -2,8 +2,8 @@ package org.schabi.newpipe.info_list import android.util.Log import com.xwray.groupie.GroupieAdapter -import org.schabi.newpipe.extractor.stream.StreamInfo import kotlin.math.max +import org.schabi.newpipe.extractor.stream.StreamInfo /** * Custom RecyclerView.Adapter/GroupieAdapter for [StreamSegmentItem] for handling selection state. diff --git a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt index 83e0c408289..7276051e86b 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt +++ b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt @@ -37,7 +37,10 @@ class StreamSegmentItem( viewBinding.textViewStartSeconds.text = Localization.getDurationString(item.startTimeSeconds.toLong()) viewBinding.root.setOnClickListener { onClick.onItemClick(this, item.startTimeSeconds) } - viewBinding.root.setOnLongClickListener { onClick.onItemLongClick(this, item.startTimeSeconds); true } + viewBinding.root.setOnLongClickListener { + onClick.onItemLongClick(this, item.startTimeSeconds) + true + } viewBinding.root.isSelected = isSelected } diff --git a/app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt b/app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt index 4a3c3e071d4..140351b0d6c 100644 --- a/app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt +++ b/app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt @@ -9,5 +9,5 @@ inline fun Bitmap.scale( width: Int, height: Int, srcRect: Rect? = null, - scaleInLinearSpace: Boolean = true, + scaleInLinearSpace: Boolean = true ) = BitmapCompat.createScaledBitmap(this, width, height, srcRect, scaleInLinearSpace) diff --git a/app/src/main/java/org/schabi/newpipe/ktx/View.kt b/app/src/main/java/org/schabi/newpipe/ktx/View.kt index b781335e15e..432b974cb28 100644 --- a/app/src/main/java/org/schabi/newpipe/ktx/View.kt +++ b/app/src/main/java/org/schabi/newpipe/ktx/View.kt @@ -41,14 +41,16 @@ fun View.animate( execOnEnd: Runnable? = null ) { if (DEBUG) { - val id = try { - resources.getResourceEntryName(id) - } catch (e: Exception) { - id.toString() - } + val id = runCatching { resources.getResourceEntryName(id) }.getOrDefault(id.toString()) val msg = String.format( - "%8s → [%s:%s] [%s %s:%s] execOnEnd=%s", enterOrExit, - javaClass.simpleName, id, animationType, duration, delay, execOnEnd + "%8s → [%s:%s] [%s %s:%s] execOnEnd=%s", + enterOrExit, + javaClass.simpleName, + id, + animationType, + duration, + delay, + execOnEnd ) Log.d(TAG, "animate(): $msg") } @@ -291,5 +293,9 @@ private class HideAndExecOnEndListener(private val view: View, execOnEnd: Runnab } enum class AnimationType { - ALPHA, SCALE_AND_ALPHA, LIGHT_SCALE_AND_ALPHA, SLIDE_AND_ALPHA, LIGHT_SLIDE_AND_ALPHA + ALPHA, + SCALE_AND_ALPHA, + LIGHT_SCALE_AND_ALPHA, + SLIDE_AND_ALPHA, + LIGHT_SLIDE_AND_ALPHA } diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index dcd19ebf9e2..3b1d0c573db 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.local.bookmark; import static org.schabi.newpipe.local.bookmark.MergedPlaylistManager.getMergedOrderedPlaylists; +import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout; import android.content.DialogInterface; import android.os.Bundle; @@ -422,10 +423,11 @@ public void saveImmediate() { } private ItemTouchHelper.SimpleCallback getItemTouchCallback() { - // if adding grid layout, also include ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT - // with an `if (shouldUseGridLayout()) ...` - return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, - ItemTouchHelper.ACTION_STATE_IDLE) { + int directions = ItemTouchHelper.UP | ItemTouchHelper.DOWN; + if (shouldUseGridLayout(requireContext())) { + directions |= ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; + } + return new ItemTouchHelper.SimpleCallback(directions, ItemTouchHelper.ACTION_STATE_IDLE) { @Override public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView, final int viewSize, 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 aacc6757ec1..3e3a47f57e4 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,6 +7,9 @@ import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.schedulers.Schedulers +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 @@ -18,9 +21,6 @@ import org.schabi.newpipe.database.subscription.NotificationMode import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.local.subscription.FeedGroupIcon -import java.time.LocalDate -import java.time.OffsetDateTime -import java.time.ZoneOffset class FeedDatabaseManager(context: Context) { private val database = NewPipeDatabase.getInstance(context) @@ -85,14 +85,13 @@ class FeedDatabaseManager(context: Context) { items: List, oldestAllowedDate: OffsetDateTime = FEED_OLDEST_ALLOWED_DATE ) { - val itemsToInsert = ArrayList() - loop@ for (streamItem in items) { - val uploadDate = streamItem.uploadDate - - itemsToInsert += when { - uploadDate == null && streamItem.streamType == StreamType.LIVE_STREAM -> streamItem - uploadDate != null && uploadDate.offsetDateTime() >= oldestAllowedDate -> streamItem - else -> continue@loop + val itemsToInsert = items.mapNotNull { stream -> + val uploadDate = stream.uploadDate + + when { + uploadDate == null && stream.streamType == StreamType.LIVE_STREAM -> stream + uploadDate != null && uploadDate.offsetDateTime() >= oldestAllowedDate -> stream + else -> null } } 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 795084da551..5608502947e 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 @@ -53,6 +53,8 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.OffsetDateTime +import java.util.function.Consumer import org.schabi.newpipe.NewPipeDatabase import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity @@ -82,8 +84,6 @@ import org.schabi.newpipe.util.ThemeHelper.getGridSpanCountStreams import org.schabi.newpipe.util.ThemeHelper.getItemViewMode import org.schabi.newpipe.util.ThemeHelper.resolveDrawable import org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout -import java.time.OffsetDateTime -import java.util.function.Consumer class FeedFragment : BaseStateFragment() { private var _feedBinding: FragmentFeedBinding? = null @@ -92,7 +92,10 @@ class FeedFragment : BaseStateFragment() { private val disposables = CompositeDisposable() private lateinit var viewModel: FeedViewModel - @State @JvmField var listState: Parcelable? = null + + @State + @JvmField + var listState: Parcelable? = null private var groupId = FeedGroupEntity.GROUP_ALL_ID private var groupName = "" @@ -151,7 +154,6 @@ class FeedFragment : BaseStateFragment() { if (newState == RecyclerView.SCROLL_STATE_IDLE && !recyclerView.canScrollVertically(-1) ) { - if (tryGetNewItemsLoadedButton()?.isVisible == true) { hideNewItemsLoaded(true) } @@ -392,8 +394,13 @@ class FeedFragment : BaseStateFragment() { if (item is StreamItem && !isRefreshing) { val stream = item.streamWithState.stream NavigationHelper.openVideoDetailFragment( - requireContext(), fm, - stream.serviceId, stream.url, stream.title, null, false + requireContext(), + fm, + stream.serviceId, + stream.url, + stream.title, + null, + false ) } } @@ -505,7 +512,8 @@ class FeedFragment : BaseStateFragment() { ) { val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) val isFastFeedModeEnabled = sharedPreferences.getBoolean( - getString(R.string.feed_use_dedicated_fetch_method_key), false + getString(R.string.feed_use_dedicated_fetch_method_key), + false ) val builder = AlertDialog.Builder(requireContext()) @@ -540,7 +548,8 @@ class FeedFragment : BaseStateFragment() { private fun updateRelativeTimeViews() { updateRefreshViewState() groupAdapter.notifyItemRangeChanged( - 0, groupAdapter.itemCount, + 0, + groupAdapter.itemCount, StreamItem.UPDATE_RELATIVE_TIME ) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt index 665ebbe4396..6d6bc9007cb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt @@ -1,8 +1,8 @@ package org.schabi.newpipe.local.feed import androidx.annotation.StringRes -import org.schabi.newpipe.local.feed.item.StreamItem import java.time.OffsetDateTime +import org.schabi.newpipe.local.feed.item.StreamItem sealed class FeedState { data class ProgressState( 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 869f0b9a955..26e265f827e 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 @@ -14,6 +14,8 @@ import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.functions.Function6 import io.reactivex.rxjava3.processors.BehaviorProcessor import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.OffsetDateTime +import java.util.concurrent.TimeUnit import org.schabi.newpipe.App import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity @@ -25,8 +27,6 @@ import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ProgressEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.SuccessResultEvent import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT -import java.time.OffsetDateTime -import java.util.concurrent.TimeUnit class FeedViewModel( private val application: Application, @@ -64,8 +64,14 @@ class FeedViewModel( feedDatabaseManager.notLoadedCount(groupId), feedDatabaseManager.oldestSubscriptionUpdate(groupId), - Function6 { t1: FeedEventManager.Event, t2: Boolean, t3: Boolean, t4: Boolean, - t5: Long, t6: List -> + Function6 { + t1: FeedEventManager.Event, + t2: Boolean, + t3: Boolean, + t4: Boolean, + t5: Long, + t6: List + -> return@Function6 CombineResultEventHolder(t1, t2, t3, t4, t5, t6.firstOrNull()) } ) @@ -73,12 +79,13 @@ class FeedViewModel( .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .map { (event, showPlayedItems, showPartiallyPlayedItems, showFutureItems, notLoadedCount, oldestUpdate) -> - val streamItems = if (event is SuccessResultEvent || event is IdleEvent) + val streamItems = if (event is SuccessResultEvent || event is IdleEvent) { feedDatabaseManager .getStreams(groupId, showPlayedItems, showPartiallyPlayedItems, showFutureItems) .blockingGet(arrayListOf()) - else + } else { arrayListOf() + } CombineResultDataHolder(event, streamItems, notLoadedCount, oldestUpdate) } @@ -150,17 +157,14 @@ class FeedViewModel( fun getShowFutureItemsFromPreferences() = getShowFutureItemsFromPreferences(application) companion object { - private fun getShowPlayedItemsFromPreferences(context: Context) = - PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.feed_show_watched_items_key), true) + private fun getShowPlayedItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_watched_items_key), true) - private fun getShowPartiallyPlayedItemsFromPreferences(context: Context) = - PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.feed_show_partially_watched_items_key), true) + private fun getShowPartiallyPlayedItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_partially_watched_items_key), true) - private fun getShowFutureItemsFromPreferences(context: Context) = - PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.feed_show_future_items_key), true) + private fun getShowFutureItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_future_items_key), true) fun getFactory(context: Context, groupId: Long) = viewModelFactory { initializer { diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt index 030bb7a7668..258a67a4cc6 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt @@ -6,6 +6,8 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager import com.xwray.groupie.viewbinding.BindableItem +import java.util.concurrent.TimeUnit +import java.util.function.Consumer import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.database.stream.StreamWithState @@ -20,8 +22,6 @@ import org.schabi.newpipe.extractor.stream.StreamType.VIDEO_STREAM import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.StreamTypeUtil import org.schabi.newpipe.util.image.CoilHelper -import java.util.concurrent.TimeUnit -import java.util.function.Consumer data class StreamItem( val streamWithState: StreamWithState, @@ -132,6 +132,7 @@ data class StreamItem( viewsAndDate.isEmpty() -> uploadDate!! else -> Localization.concatenateStrings(viewsAndDate, uploadDate) } + else -> viewsAndDate } } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt index 4f70cee50e2..123ca8f11ad 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt @@ -14,6 +14,7 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.app.PendingIntentCompat import androidx.core.content.ContextCompat import androidx.core.content.getSystemService +import androidx.core.net.toUri import androidx.preference.PreferenceManager import org.schabi.newpipe.R import org.schabi.newpipe.extractor.stream.StreamInfoItem @@ -37,7 +38,9 @@ class NotificationHelper(val context: Context) { fun displayNewStreamsNotifications(data: FeedUpdateInfo) { val newStreams = data.newStreams val summary = context.resources.getQuantityString( - R.plurals.new_streams, newStreams.size, newStreams.size + R.plurals.new_streams, + newStreams.size, + newStreams.size ) val summaryBuilder = NotificationCompat.Builder( context, @@ -146,8 +149,7 @@ class NotificationHelper(val context: Context) { val manager = context.getSystemService()!! val enabled = manager.areNotificationsEnabled() val channel = manager.getNotificationChannel(channelId) - val importance = channel?.importance - enabled && channel != null && importance != NotificationManager.IMPORTANCE_NONE + enabled && channel?.importance != NotificationManager.IMPORTANCE_NONE } else { NotificationManagerCompat.from(context).areNotificationsEnabled() } @@ -177,7 +179,7 @@ class NotificationHelper(val context: Context) { context.startActivity(intent) } else { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intent.data = Uri.parse("package:" + context.packageName) + intent.data = "package:${context.packageName}".toUri() context.startActivity(intent) } } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt index 6fe311fb053..d1fd29945bf 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt @@ -16,6 +16,7 @@ import androidx.work.WorkerParameters import androidx.work.rxjava3.RxWorker import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single +import java.util.concurrent.TimeUnit import org.schabi.newpipe.App import org.schabi.newpipe.R import org.schabi.newpipe.error.ErrorInfo @@ -23,7 +24,6 @@ import org.schabi.newpipe.error.ErrorUtil import org.schabi.newpipe.error.UserAction import org.schabi.newpipe.local.feed.service.FeedLoadManager import org.schabi.newpipe.local.feed.service.FeedLoadService -import java.util.concurrent.TimeUnit /* * Worker which checks for new streams of subscribed channels @@ -31,7 +31,7 @@ import java.util.concurrent.TimeUnit */ class NotificationWorker( appContext: Context, - workerParams: WorkerParameters, + workerParams: WorkerParameters ) : RxWorker(appContext, workerParams) { private val notificationHelper by lazy { @@ -95,9 +95,8 @@ class NotificationWorker( private val TAG = NotificationWorker::class.java.simpleName private const val WORK_TAG = App.PACKAGE_NAME + "_streams_notifications" - private fun areNotificationsEnabled(context: Context) = - NotificationHelper.areNewStreamsNotificationsEnabled(context) && - NotificationHelper.areNotificationsEnabledOnDevice(context) + private fun areNotificationsEnabled(context: Context) = NotificationHelper.areNewStreamsNotificationsEnabled(context) && + NotificationHelper.areNotificationsEnabledOnDevice(context) /** * Schedules a task for the [NotificationWorker] diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt index 37e8fc39ee0..6d5f12b2b4f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt @@ -2,8 +2,9 @@ package org.schabi.newpipe.local.feed.notifications import android.content.Context import androidx.preference.PreferenceManager -import org.schabi.newpipe.R import java.util.concurrent.TimeUnit +import org.schabi.newpipe.R +import org.schabi.newpipe.ktx.getStringSafe /** * Information for the Scheduler which checks for new streams. @@ -20,11 +21,9 @@ data class ScheduleOptions( val preferences = PreferenceManager.getDefaultSharedPreferences(context) return ScheduleOptions( interval = TimeUnit.SECONDS.toMillis( - preferences.getString( + preferences.getStringSafe( context.getString(R.string.streams_notifications_interval_key), - null - )?.toLongOrNull() ?: context.getString( - R.string.streams_notifications_interval_default + context.getString(R.string.streams_notifications_interval_default) ).toLong() ), isRequireNonMeteredNetwork = preferences.getString( diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt index 1c2826e7a67..952a59b9a5b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt @@ -3,8 +3,8 @@ package org.schabi.newpipe.local.feed.service import androidx.annotation.StringRes import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.processors.BehaviorProcessor -import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent import java.util.concurrent.atomic.AtomicBoolean +import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent object FeedEventManager { private var processor: BehaviorProcessor = BehaviorProcessor.create() diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index 9b0f177d568..3090a92d4c2 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -11,6 +11,10 @@ import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.processors.PublishProcessor import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.OffsetDateTime +import java.time.ZoneOffset +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicInteger import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.subscription.NotificationMode @@ -27,10 +31,6 @@ import org.schabi.newpipe.util.ChannelTabHelper import org.schabi.newpipe.util.ExtractorHelper.getChannelInfo import org.schabi.newpipe.util.ExtractorHelper.getChannelTab import org.schabi.newpipe.util.ExtractorHelper.getMoreChannelTabItems -import java.time.OffsetDateTime -import java.time.ZoneOffset -import java.util.concurrent.atomic.AtomicBoolean -import java.util.concurrent.atomic.AtomicInteger class FeedLoadManager(private val context: Context) { @@ -60,7 +60,7 @@ class FeedLoadManager(private val context: Context) { */ fun startLoading( groupId: Long = FeedGroupEntity.GROUP_ALL_ID, - ignoreOutdatedThreshold: Boolean = false, + ignoreOutdatedThreshold: Boolean = false ): Single>> { val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) val useFeedExtractor = defaultSharedPreferences.getBoolean( @@ -85,9 +85,12 @@ class FeedLoadManager(private val context: Context) { FeedGroupEntity.GROUP_ALL_ID -> feedDatabaseManager.outdatedSubscriptions( outdatedThreshold ) + GROUP_NOTIFICATION_ENABLED -> feedDatabaseManager.outdatedSubscriptionsWithNotificationMode( - outdatedThreshold, NotificationMode.ENABLED + outdatedThreshold, + NotificationMode.ENABLED ) + else -> feedDatabaseManager.outdatedSubscriptionsForGroup(groupId, outdatedThreshold) } @@ -186,7 +189,8 @@ class FeedLoadManager(private val context: Context) { val channelInfo = getChannelInfo( subscriptionEntity.serviceId, - subscriptionEntity.url, true + subscriptionEntity.url, + true ) .onErrorReturn(storeOriginalErrorAndRethrow) .blockingGet() @@ -216,7 +220,8 @@ class FeedLoadManager(private val context: Context) { ) { val infoItemsPage = getMoreChannelTabItems( subscriptionEntity.serviceId, - linkHandler, channelTabInfo.nextPage + linkHandler, + channelTabInfo.nextPage ) .blockingGet() @@ -234,7 +239,7 @@ class FeedLoadManager(private val context: Context) { subscriptionEntity, originalInfo!!, streams!!, - errors, + errors ) ) } catch (e: Throwable) { @@ -305,6 +310,7 @@ class FeedLoadManager(private val context: Context) { feedDatabaseManager.markAsOutdated(info.uid) } } + notification.isOnError -> { val error = notification.error feedResultsHolder.addError(error!!) 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 4aa825ca85d..48ad5df94c9 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 @@ -36,13 +36,13 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.functions.Function +import java.util.concurrent.TimeUnit import org.schabi.newpipe.App import org.schabi.newpipe.MainActivity.DEBUG import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ErrorResultEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.postEvent -import java.util.concurrent.TimeUnit class FeedLoadService : Service() { companion object { @@ -94,7 +94,8 @@ class FeedLoadService : Service() { .doOnSubscribe { startForeground(NOTIFICATION_ID, notificationBuilder.build()) } - .subscribe { _, error: Throwable? -> // explicitly mark error as nullable + .subscribe { _, error: Throwable? -> + // explicitly mark error as nullable if (error != null) { Log.e(TAG, "Error while storing result", error) handleError(error) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt index 703f593adee..2aedf092591 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt @@ -3,5 +3,5 @@ package org.schabi.newpipe.local.feed.service data class FeedLoadState( val updateDescription: String, val maxProgress: Int, - val currentProgress: Int, + val currentProgress: Int ) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt index b44eec35333..fb4a27913d6 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt @@ -25,13 +25,13 @@ data class FeedUpdateInfo( val description: String?, val subscriberCount: Long?, val streams: List, - val errors: List, + val errors: List ) { constructor( subscription: SubscriptionEntity, info: Info, streams: List, - errors: List, + errors: List ) : this( uid = subscription.uid, notificationMode = subscription.notificationMode, @@ -46,7 +46,7 @@ data class FeedUpdateInfo( description = (info as? ChannelInfo)?.description, subscriberCount = (info as? ChannelInfo)?.subscriberCount, streams = streams, - errors = errors, + errors = errors ) /** diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt index 8eb3ab3ae7a..a6c3561ece1 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt @@ -44,7 +44,6 @@ private fun exportJustUrls(playlist: List): String { } private fun exportAsYoutubeTempPlaylist(playlist: List): String { - val videoIDs = playlist.asReversed().asSequence() .mapNotNull { getYouTubeId(it.streamEntity.url) } .take(50) // YouTube limitation: temp playlists can't have more than 50 items @@ -64,6 +63,5 @@ private val linkHandler: YoutubeStreamLinkHandlerFactory = YoutubeStreamLinkHand * @return the video id */ private fun getYouTubeId(url: String): String? { - - return try { linkHandler.getId(url) } catch (e: ParsingException) { null } + return runCatching { linkHandler.getId(url) }.getOrNull() } 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 1efc0a84ce4..d841b44b4b6 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 @@ -768,11 +768,17 @@ public boolean onMove(@NonNull final RecyclerView recyclerView, final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex); if (isSwapped) { debounceSaver.setHasChangesToSave(); - saveImmediate(); } return isSwapped; } + @Override + public void clearView(@NonNull final RecyclerView recyclerView, + @NonNull final RecyclerView.ViewHolder viewHolder) { + super.clearView(recyclerView, viewHolder); + saveImmediate(); + } + @Override public boolean isLongPressDragEnabled() { return false; diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index 8c5d05394d1..0451488443b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -26,6 +26,9 @@ import com.xwray.groupie.GroupAdapter import com.xwray.groupie.Section import com.xwray.groupie.viewbinding.GroupieViewHolder import io.reactivex.rxjava3.disposables.CompositeDisposable +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity.Companion.GROUP_ALL_ID import org.schabi.newpipe.databinding.DialogTitleBinding @@ -59,9 +62,6 @@ import org.schabi.newpipe.util.OnClickGesture import org.schabi.newpipe.util.ServiceHelper import org.schabi.newpipe.util.ThemeHelper.getGridSpanCountChannels import org.schabi.newpipe.util.external_communication.ShareUtils -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale class SubscriptionFragment : BaseStateFragment() { private var _binding: FragmentSubscriptionBinding? = null @@ -231,7 +231,8 @@ class SubscriptionFragment : BaseStateFragment() { val data = result.data?.dataString if (data != null && result.resultCode == Activity.RESULT_OK) { ImportConfirmationDialog.show( - this, SubscriptionImportInput.PreviousExportMode(data) + this, + SubscriptionImportInput.PreviousExportMode(data) ) } } @@ -272,10 +273,13 @@ class SubscriptionFragment : BaseStateFragment() { when (item) { is FeedGroupCardItem -> NavigationHelper.openFeedFragment(fm, item.groupId, item.name) + is FeedGroupCardGridItem -> NavigationHelper.openFeedFragment(fm, item.groupId, item.name) + is FeedGroupAddNewItem -> FeedGroupDialog.newInstance().show(fm, null) + is FeedGroupAddNewGridItem -> FeedGroupDialog.newInstance().show(fm, null) } @@ -290,6 +294,7 @@ class SubscriptionFragment : BaseStateFragment() { when (item) { is FeedGroupCardItem -> FeedGroupDialog.newInstance(item.groupId).show(fm, null) + is FeedGroupCardGridItem -> FeedGroupDialog.newInstance(item.groupId).show(fm, null) } @@ -305,7 +310,7 @@ class SubscriptionFragment : BaseStateFragment() { title = getString(R.string.feed_groups_header_title), onSortClicked = ::openReorderDialog, onToggleListViewModeClicked = ::toggleListViewMode, - listViewMode = viewModel.getListViewMode(), + listViewMode = viewModel.getListViewMode() ) add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel))) @@ -338,9 +343,14 @@ class SubscriptionFragment : BaseStateFragment() { val actions = DialogInterface.OnClickListener { _, i -> when (i) { 0 -> ShareUtils.shareText( - requireContext(), selectedItem.name, selectedItem.url, selectedItem.thumbnails + requireContext(), + selectedItem.name, + selectedItem.url, + selectedItem.thumbnails ) + 1 -> ShareUtils.openUrlInBrowser(requireContext(), selectedItem.url) + 2 -> deleteChannel(selectedItem) } } @@ -370,7 +380,9 @@ class SubscriptionFragment : BaseStateFragment() { private val listenerChannelItem = object : OnClickGesture { override fun selected(selectedItem: ChannelInfoItem) = NavigationHelper.openChannelFragment( fm, - selectedItem.serviceId, selectedItem.url, selectedItem.name + selectedItem.serviceId, + selectedItem.url, + selectedItem.name ) override fun held(selectedItem: ChannelInfoItem) = showLongTapDialog(selectedItem) @@ -400,6 +412,7 @@ class SubscriptionFragment : BaseStateFragment() { itemsListState = null } } + is SubscriptionState.ErrorState -> { result.error?.let { showError(ErrorInfo(result.error, UserAction.SOMETHING_ELSE, "Subscriptions")) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index aa3df925181..5cf378cc39f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -36,13 +36,16 @@ class SubscriptionManager(context: Context) { filterQuery.isNotEmpty() -> { return if (showOnlyUngrouped) { subscriptionTable.getSubscriptionsOnlyUngroupedFiltered( - currentGroupId, filterQuery + currentGroupId, + filterQuery ) } else { subscriptionTable.getSubscriptionsFiltered(filterQuery) } } + showOnlyUngrouped -> subscriptionTable.getSubscriptionsOnlyUngrouped(currentGroupId) + else -> subscriptionTable.getAll() } } @@ -59,19 +62,18 @@ class SubscriptionManager(context: Context) { } } - fun updateChannelInfo(info: ChannelInfo): Completable = - subscriptionTable.getSubscription(info.serviceId, info.url) - .flatMapCompletable { - Completable.fromRunnable { - it.apply { - name = info.name - avatarUrl = ImageStrategy.imageListToDbUrl(info.avatars) - description = info.description - subscriberCount = info.subscriberCount - } - subscriptionTable.update(it) + fun updateChannelInfo(info: ChannelInfo): Completable = subscriptionTable.getSubscription(info.serviceId, info.url) + .flatMapCompletable { + Completable.fromRunnable { + it.apply { + name = info.name + avatarUrl = ImageStrategy.imageListToDbUrl(info.avatars) + description = info.description + subscriberCount = info.subscriberCount } + subscriptionTable.update(it) } + } fun updateNotificationMode(serviceId: Int, url: String, @NotificationMode mode: Int): Completable { return subscriptionTable().getSubscription(serviceId, url) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt index dfad60c3f48..fc28f8e597b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt @@ -9,6 +9,7 @@ import com.xwray.groupie.Group import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.processors.BehaviorProcessor import io.reactivex.rxjava3.schedulers.Schedulers +import java.util.concurrent.TimeUnit import org.schabi.newpipe.info_list.ItemViewMode import org.schabi.newpipe.local.feed.FeedDatabaseManager import org.schabi.newpipe.local.subscription.item.ChannelItem @@ -16,7 +17,6 @@ import org.schabi.newpipe.local.subscription.item.FeedGroupCardGridItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT import org.schabi.newpipe.util.ThemeHelper.getItemViewMode -import java.util.concurrent.TimeUnit class SubscriptionViewModel(application: Application) : AndroidViewModel(application) { private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(application) 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 0d71beefd02..97189b42bd9 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 @@ -23,6 +23,7 @@ import com.livefront.bridge.Bridge import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.OnItemClickListener import com.xwray.groupie.Section +import java.io.Serializable import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.databinding.DialogFeedGroupCreateBinding @@ -40,7 +41,6 @@ import org.schabi.newpipe.local.subscription.item.PickerIconItem import org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem import org.schabi.newpipe.util.DeviceUtils import org.schabi.newpipe.util.ThemeHelper -import java.io.Serializable class FeedGroupDialog : DialogFragment(), BackPressable { private var _feedGroupCreateBinding: DialogFeedGroupCreateBinding? = null @@ -61,16 +61,41 @@ class FeedGroupDialog : DialogFragment(), BackPressable { data object DeleteScreen : ScreenState() } - @State @JvmField var selectedIcon: FeedGroupIcon? = null - @State @JvmField var selectedSubscriptions: HashSet = HashSet() - @State @JvmField var wasSubscriptionSelectionChanged: Boolean = false - @State @JvmField var currentScreen: ScreenState = InitialScreen + @State + @JvmField + var selectedIcon: FeedGroupIcon? = null + + @State + @JvmField + var selectedSubscriptions: HashSet = HashSet() + + @State + @JvmField + var wasSubscriptionSelectionChanged: Boolean = false + + @State + @JvmField + var currentScreen: ScreenState = InitialScreen + + @State + @JvmField + var subscriptionsListState: Parcelable? = null - @State @JvmField var subscriptionsListState: Parcelable? = null - @State @JvmField var iconsListState: Parcelable? = null - @State @JvmField var wasSearchSubscriptionsVisible = false - @State @JvmField var subscriptionsCurrentSearchQuery = "" - @State @JvmField var subscriptionsShowOnlyUngrouped = false + @State + @JvmField + var iconsListState: Parcelable? = null + + @State + @JvmField + var wasSearchSubscriptionsVisible = false + + @State + @JvmField + var subscriptionsCurrentSearchQuery = "" + + @State + @JvmField + var subscriptionsShowOnlyUngrouped = false private val subscriptionMainSection = Section() private val subscriptionEmptyFooter = Section() @@ -154,8 +179,10 @@ class FeedGroupDialog : DialogFragment(), BackPressable { itemAnimator = null adapter = subscriptionGroupAdapter layoutManager = GridLayoutManager( - requireContext(), subscriptionGroupAdapter.spanCount, - RecyclerView.VERTICAL, false + requireContext(), + subscriptionGroupAdapter.spanCount, + RecyclerView.VERTICAL, + false ).apply { spanSizeLookup = subscriptionGroupAdapter.spanSizeLookup } @@ -363,7 +390,8 @@ class FeedGroupDialog : DialogFragment(), BackPressable { val selectedCount = this.selectedSubscriptions.size val selectedCountText = resources.getQuantityString( R.plurals.feed_group_dialog_selection_count, - selectedCount, selectedCount + selectedCount, + selectedCount ) feedGroupCreateBinding.selectedSubscriptionCountView.text = selectedCountText feedGroupCreateBinding.subscriptionsHeaderInfo.text = selectedCountText 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 292bda394cc..d8eac249253 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 @@ -55,7 +55,8 @@ class FeedGroupDialogViewModel( private var subscriptionsDisposable = Flowable .combineLatest( - subscriptionsFlowable, feedDatabaseManager.subscriptionIdsForGroup(groupId) + subscriptionsFlowable, + feedDatabaseManager.subscriptionIdsForGroup(groupId) ) { t1: List, t2: List -> t1 to t2.toSet() } .subscribeOn(Schedulers.io()) .subscribe(mutableSubscriptionsLiveData::postValue) @@ -125,7 +126,10 @@ class FeedGroupDialogViewModel( ) = viewModelFactory { initializer { FeedGroupDialogViewModel( - context.applicationContext, groupId, initialQuery, initialShowOnlyUngrouped + context.applicationContext, + groupId, + initialQuery, + initialShowOnlyUngrouped ) } } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt index c087da46441..11f034ba066 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt @@ -15,6 +15,7 @@ import com.evernote.android.state.State import com.livefront.bridge.Bridge import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.TouchCallback +import java.util.Collections import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.databinding.DialogFeedGroupReorderBinding @@ -22,7 +23,6 @@ import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewMo import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewModel.DialogEvent.SuccessEvent import org.schabi.newpipe.local.subscription.item.FeedGroupReorderItem import org.schabi.newpipe.util.ThemeHelper -import java.util.Collections class FeedGroupReorderDialog : DialogFragment() { private var _binding: DialogFeedGroupReorderBinding? = null diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt index ca626e704f1..7687a7d6de8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt @@ -43,7 +43,10 @@ class ChannelItem( gesturesListener?.run { viewHolder.root.setOnClickListener { selected(infoItem) } - viewHolder.root.setOnLongClickListener { held(infoItem); true } + viewHolder.root.setOnLongClickListener { + held(infoItem) + true + } } } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardGridItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardGridItem.kt index 5a9d6887b9d..c78801c036e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardGridItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardGridItem.kt @@ -10,7 +10,7 @@ import org.schabi.newpipe.local.subscription.FeedGroupIcon data class FeedGroupCardGridItem( val groupId: Long = FeedGroupEntity.GROUP_ALL_ID, val name: String, - val icon: FeedGroupIcon, + val icon: FeedGroupIcon ) : BindableItem() { constructor (feedGroupEntity: FeedGroupEntity) : this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/workers/ImportExportJsonHelper.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/workers/ImportExportJsonHelper.kt index d71f5fa8976..b95bcd50857 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/workers/ImportExportJsonHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/workers/ImportExportJsonHelper.kt @@ -19,13 +19,13 @@ package org.schabi.newpipe.local.subscription.workers +import java.io.InputStream +import java.io.OutputStream import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream import kotlinx.serialization.json.encodeToStream import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor.InvalidSourceException -import java.io.InputStream -import java.io.OutputStream /** * A JSON implementation capable of importing and exporting subscriptions, it has the advantage @@ -65,7 +65,7 @@ object ImportExportJsonHelper { @JvmStatic fun writeTo( items: List, - out: OutputStream, + out: OutputStream ) { json.encodeToStream(SubscriptionData(items), out) } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionExportWorker.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionExportWorker.kt index aa8000aa241..09e99aa6f55 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionExportWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionExportWorker.kt @@ -25,7 +25,7 @@ import org.schabi.newpipe.R class SubscriptionExportWorker( appContext: Context, - params: WorkerParameters, + params: WorkerParameters ) : CoroutineWorker(appContext, params) { // This is needed for API levels < 31 (Android S). override suspend fun getForegroundInfo(): ForegroundInfo { @@ -102,7 +102,7 @@ class SubscriptionExportWorker( fun schedule( context: Context, - uri: Uri, + uri: Uri ) { val data = workDataOf(EXPORT_PATH to uri.toString()) val workRequest = diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionImportWorker.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionImportWorker.kt index 86b9c739a9e..cc8cf6f2411 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionImportWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionImportWorker.kt @@ -31,7 +31,7 @@ import org.schabi.newpipe.util.ExtractorHelper class SubscriptionImportWorker( appContext: Context, - params: WorkerParameters, + params: WorkerParameters ) : CoroutineWorker(appContext, params) { // This is needed for API levels < 31 (Android S). override suspend fun getForegroundInfo(): ForegroundInfo { @@ -139,7 +139,7 @@ class SubscriptionImportWorker( title: String, text: String?, currentProgress: Int, - maxProgress: Int, + maxProgress: Int ): ForegroundInfo { val notification = NotificationCompat @@ -154,7 +154,7 @@ class SubscriptionImportWorker( .addAction( R.drawable.ic_close, applicationContext.getString(R.string.cancel), - WorkManager.getInstance(applicationContext).createCancelPendingIntent(id), + WorkManager.getInstance(applicationContext).createCancelPendingIntent(id) ).apply { if (currentProgress > 0 && maxProgress > 0) { val progressText = "$currentProgress/$maxProgress" @@ -187,8 +187,10 @@ class SubscriptionImportWorker( sealed class SubscriptionImportInput : Parcelable { @Parcelize data class ChannelUrlMode(val serviceId: Int, val url: String) : SubscriptionImportInput() + @Parcelize data class InputStreamMode(val serviceId: Int, val url: String) : SubscriptionImportInput() + @Parcelize data class PreviousExportMode(val url: String) : SubscriptionImportInput() @@ -218,6 +220,7 @@ sealed class SubscriptionImportInput : Parcelable { val url = data.getString("url")!! return ChannelUrlMode(serviceId, url) } + INPUT_STREAM_MODE -> { val serviceId = data.getInt("service_id", -1) if (serviceId == -1) { @@ -226,10 +229,12 @@ sealed class SubscriptionImportInput : Parcelable { val url = data.getString("url")!! return InputStreamMode(serviceId, url) } + PREVIOUS_EXPORT_MODE -> { val url = data.getString("url")!! return PreviousExportMode(url) } + else -> throw IllegalArgumentException("Unknown mode: $mode") } } diff --git a/app/src/main/java/org/schabi/newpipe/paging/CommentRepliesSource.kt b/app/src/main/java/org/schabi/newpipe/paging/CommentRepliesSource.kt index efa189db9fa..37eddceb175 100644 --- a/app/src/main/java/org/schabi/newpipe/paging/CommentRepliesSource.kt +++ b/app/src/main/java/org/schabi/newpipe/paging/CommentRepliesSource.kt @@ -10,7 +10,7 @@ import org.schabi.newpipe.extractor.comments.CommentsInfo import org.schabi.newpipe.extractor.comments.CommentsInfoItem class CommentRepliesSource( - private val commentInfo: CommentsInfoItem, + private val commentInfo: CommentsInfoItem ) : PagingSource() { private val service = NewPipe.getService(commentInfo.serviceId) diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayerService.kt b/app/src/main/java/org/schabi/newpipe/player/PlayerService.kt index abcc50b7ab4..1b9f2f57b52 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayerService.kt +++ b/app/src/main/java/org/schabi/newpipe/player/PlayerService.kt @@ -29,6 +29,8 @@ import android.util.Log import androidx.core.app.ServiceCompat import androidx.media.MediaBrowserServiceCompat import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector +import java.lang.ref.WeakReference +import java.util.function.Consumer import org.schabi.newpipe.ktx.toDebugString import org.schabi.newpipe.player.mediabrowser.MediaBrowserImpl import org.schabi.newpipe.player.mediabrowser.MediaBrowserPlaybackPreparer @@ -36,8 +38,6 @@ import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi import org.schabi.newpipe.player.notification.NotificationPlayerUi import org.schabi.newpipe.player.notification.NotificationUtil import org.schabi.newpipe.util.ThemeHelper -import java.lang.ref.WeakReference -import java.util.function.Consumer /** * One service for all players. @@ -110,7 +110,7 @@ class PlayerService : MediaBrowserServiceCompat() { Log.d( TAG, "onStartCommand() called with: intent = [$intent], extras = [${ - intent.extras.toDebugString()}], flags = [$flags], startId = [$startId]" + intent.extras.toDebugString()}], flags = [$flags], startId = [$startId]" ) } @@ -251,7 +251,7 @@ class PlayerService : MediaBrowserServiceCompat() { Log.d( TAG, "onBind() called with: intent = [$intent], extras = [${ - intent.extras.toDebugString()}]" + intent.extras.toDebugString()}]" ) } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt index 0453f297a4f..8682adc4369 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt @@ -18,7 +18,7 @@ import org.schabi.newpipe.player.ui.VideoPlayerUi * and provides some abstract methods to make it easier separating the logic from the UI. */ abstract class BasePlayerGestureListener( - private val playerUi: VideoPlayerUi, + private val playerUi: VideoPlayerUi ) : GestureDetector.SimpleOnGestureListener(), View.OnTouchListener { protected val player: Player = playerUi.player @@ -86,8 +86,9 @@ abstract class BasePlayerGestureListener( // /////////////////////////////////////////////////////////////////// override fun onDown(e: MotionEvent): Boolean { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onDown called with e = [$e]") + } if (isDoubleTapping && isDoubleTapEnabled) { doubleTapControls?.onDoubleTapProgressDown(getDisplayPortion(e)) @@ -108,8 +109,9 @@ abstract class BasePlayerGestureListener( } override fun onDoubleTap(e: MotionEvent): Boolean { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onDoubleTap called with e = [$e]") + } onDoubleTap(e, getDisplayPortion(e)) return true @@ -136,8 +138,9 @@ abstract class BasePlayerGestureListener( private fun startMultiDoubleTap(e: MotionEvent) { if (!isDoubleTapping) { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "startMultiDoubleTap called with e = [$e]") + } keepInDoubleTapMode() doubleTapControls?.onDoubleTapStarted(getDisplayPortion(e)) @@ -145,8 +148,9 @@ abstract class BasePlayerGestureListener( } fun keepInDoubleTapMode() { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "keepInDoubleTapMode called") + } isDoubleTapping = true doubleTapHandler.removeCallbacksAndMessages(DOUBLE_TAP) @@ -161,8 +165,9 @@ abstract class BasePlayerGestureListener( } fun endMultiDoubleTap() { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "endMultiDoubleTap called") + } isDoubleTapping = false doubleTapHandler.removeCallbacksAndMessages(DOUBLE_TAP) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/DisplayPortion.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/DisplayPortion.kt index 684f6d326f3..c5d483628bf 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/DisplayPortion.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/DisplayPortion.kt @@ -1,5 +1,9 @@ package org.schabi.newpipe.player.gesture enum class DisplayPortion { - LEFT, MIDDLE, RIGHT, LEFT_HALF, RIGHT_HALF + LEFT, + MIDDLE, + RIGHT, + LEFT_HALF, + RIGHT_HALF } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index ff0bb269d0a..7cc9ba2241a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -8,6 +8,7 @@ import android.widget.ProgressBar import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.core.view.isVisible +import kotlin.math.abs import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.ktx.AnimationType @@ -17,7 +18,6 @@ import org.schabi.newpipe.player.helper.AudioReactor import org.schabi.newpipe.player.helper.PlayerHelper import org.schabi.newpipe.player.ui.MainPlayerUi import org.schabi.newpipe.util.ThemeHelper.getAndroidDimenPx -import kotlin.math.abs /** * GestureListener for the player @@ -42,24 +42,29 @@ class MainPlayerGestureListener( v.parent?.requestDisallowInterceptTouchEvent(playerUi.isFullscreen) true } + MotionEvent.ACTION_UP -> { v.parent?.requestDisallowInterceptTouchEvent(false) false } + else -> true } } override fun onSingleTapConfirmed(e: MotionEvent): Boolean { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onSingleTapConfirmed() called with: e = [$e]") + } - if (isDoubleTapping) + if (isDoubleTapping) { return true + } super.onSingleTapConfirmed(e) - if (player.currentState != Player.STATE_BLOCKED) + if (player.currentState != Player.STATE_BLOCKED) { onSingleTap() + } return true } @@ -195,6 +200,7 @@ class MainPlayerGestureListener( when (PlayerHelper.getActionForRightGestureSide(player.context)) { player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) + player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } @@ -202,6 +208,7 @@ class MainPlayerGestureListener( when (PlayerHelper.getActionForLeftGestureSide(player.context)) { player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) + player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt index 0b94bf364e0..60752652ea9 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt @@ -5,17 +5,17 @@ import android.view.MotionEvent import android.view.View import android.view.ViewConfiguration import androidx.core.view.isVisible -import org.schabi.newpipe.MainActivity -import org.schabi.newpipe.ktx.AnimationType -import org.schabi.newpipe.ktx.animate -import org.schabi.newpipe.player.ui.PopupPlayerUi import kotlin.math.abs import kotlin.math.hypot import kotlin.math.max import kotlin.math.min +import org.schabi.newpipe.MainActivity +import org.schabi.newpipe.ktx.AnimationType +import org.schabi.newpipe.ktx.animate +import org.schabi.newpipe.player.ui.PopupPlayerUi class PopupPlayerGestureListener( - private val playerUi: PopupPlayerUi, + private val playerUi: PopupPlayerUi ) : BasePlayerGestureListener(playerUi) { private var isMoving = false @@ -205,13 +205,16 @@ class PopupPlayerGestureListener( } override fun onSingleTapConfirmed(e: MotionEvent): Boolean { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onSingleTapConfirmed() called with: e = [$e]") + } - if (isDoubleTapping) + if (isDoubleTapping) { return true - if (player.exoPlayerIsNull()) + } + if (player.exoPlayerIsNull()) { return false + } onSingleTap() return true diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.kt b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.kt index 67086c263e1..433214b80f6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.kt +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.kt @@ -43,13 +43,13 @@ object PlayerHolder { private val playQueue: PlayQueue? get() = this.player?.playQueue + /** + * Returns the current [PlayerType] of the [PlayerService] service, + * otherwise `null` if no service is running. + * + * @return Current PlayerType + */ val type: PlayerType? - /** - * Returns the current [PlayerType] of the [PlayerService] service, - * otherwise `null` if no service is running. - * - * @return Current PlayerType - */ get() = this.player?.playerType val isPlaying: Boolean @@ -58,12 +58,12 @@ object PlayerHolder { val isPlayerOpen: Boolean get() = this.player != null + /** + * Use this method to only allow the user to manipulate the play queue (e.g. by enqueueing via + * the stream long press menu) when there actually is a play queue to manipulate. + * @return true only if the player is open and its play queue is ready (i.e. it is not null) + */ val isPlayQueueReady: Boolean - /** - * Use this method to only allow the user to manipulate the play queue (e.g. by enqueueing via - * the stream long press menu) when there actually is a play queue to manipulate. - * @return true only if the player is open and its play queue is ready (i.e. it is not null) - */ get() = this.playQueue != null val queueSize: Int diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt index 1aa12018c19..4bf071c4d37 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt @@ -47,7 +47,7 @@ import org.schabi.newpipe.util.image.ImageStrategy */ class MediaBrowserImpl( private val context: Context, - notifyChildrenChanged: (parentId: String) -> Unit, + notifyChildrenChanged: (parentId: String) -> Unit ) { private val packageValidator = PackageValidator(context) private val database = NewPipeDatabase.getInstance(context) @@ -87,7 +87,8 @@ class MediaBrowserImpl( val extras = Bundle() extras.putBoolean( - MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, true + MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, + true ) return MediaBrowserServiceCompat.BrowserRoot(ID_ROOT, extras) } @@ -135,7 +136,7 @@ class MediaBrowserImpl( ) } - when (/*val uriType = */path.removeAt(0)) { + when (path.removeAt(0)) { ID_BOOKMARKS -> { if (path.isEmpty()) { return populateBookmarks() @@ -206,7 +207,7 @@ class MediaBrowserImpl( return MediaBrowserCompat.MediaItem( builder.build(), - MediaBrowserCompat.MediaItem.FLAG_BROWSABLE, + MediaBrowserCompat.MediaItem.FLAG_BROWSABLE ) } @@ -260,7 +261,7 @@ class MediaBrowserImpl( private fun createLocalPlaylistStreamMediaItem( playlistId: Long, item: PlaylistStreamEntry, - index: Int, + index: Int ): MediaBrowserCompat.MediaItem { val builder = MediaDescriptionCompat.Builder() .setMediaId(createMediaIdForPlaylistIndex(false, playlistId, index)) @@ -277,7 +278,7 @@ class MediaBrowserImpl( private fun createRemotePlaylistStreamMediaItem( playlistId: Long, item: StreamInfoItem, - index: Int, + index: Int ): MediaBrowserCompat.MediaItem { val builder = MediaDescriptionCompat.Builder() builder.setMediaId(createMediaIdForPlaylistIndex(true, playlistId, index)) @@ -294,7 +295,7 @@ class MediaBrowserImpl( private fun createMediaIdForPlaylistIndex( isRemote: Boolean, playlistId: Long, - index: Int, + index: Int ): String { return buildLocalPlaylistItemMediaId(isRemote, playlistId) .appendPath(index.toString()) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt index 63e5feeca44..5a852cd5b7b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt @@ -13,6 +13,8 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.schedulers.Schedulers +import java.util.function.BiConsumer +import java.util.function.Consumer import org.schabi.newpipe.MainActivity import org.schabi.newpipe.NewPipeDatabase import org.schabi.newpipe.R @@ -30,8 +32,6 @@ import org.schabi.newpipe.util.ChannelTabHelper import org.schabi.newpipe.util.ExtractorHelper import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.NavigationHelper -import java.util.function.BiConsumer -import java.util.function.Consumer /** * This class is used to cleanly separate the Service implementation (in @@ -51,7 +51,7 @@ class MediaBrowserPlaybackPreparer( private val context: Context, private val setMediaSessionError: BiConsumer, // error string, error code private val clearMediaSessionError: Runnable, - private val onPrepare: Consumer, + private val onPrepare: Consumer ) : PlaybackPreparer { private val database = NewPipeDatabase.getInstance(context) private var disposable: Disposable? = null @@ -146,7 +146,7 @@ class MediaBrowserPlaybackPreparer( throw parseError(mediaId) } - return when (/*val uriType = */path.removeAt(0)) { + return when (path.removeAt(0)) { ID_BOOKMARKS -> extractPlayQueueFromPlaylistMediaId( mediaId, path, @@ -172,7 +172,7 @@ class MediaBrowserPlaybackPreparer( private fun extractPlayQueueFromPlaylistMediaId( mediaId: String, path: MutableList, - url: String?, + url: String? ): Single { if (path.isEmpty()) { throw parseError(mediaId) @@ -185,10 +185,11 @@ class MediaBrowserPlaybackPreparer( } val playlistId = path[0].toLong() val index = path[1].toInt() - return if (playlistType == ID_LOCAL) + return if (playlistType == ID_LOCAL) { extractLocalPlayQueue(playlistId, index) - else + } else { extractRemotePlayQueue(playlistId, index) + } } ID_URL -> { @@ -208,7 +209,7 @@ class MediaBrowserPlaybackPreparer( @Throws(ContentNotAvailableException::class) private fun extractPlayQueueFromHistoryMediaId( mediaId: String, - path: List, + path: List ): Single { if (path.size != 1) { throw parseError(mediaId) @@ -229,14 +230,14 @@ class MediaBrowserPlaybackPreparer( private fun extractPlayQueueFromInfoItemMediaId( mediaId: String, path: List, - url: String, + url: String ): Single { if (path.size != 2) { throw parseError(mediaId) } val serviceId = path[1].toInt() - return when (/*val infoItemType = */infoItemTypeFromString(path[0])) { + return when (infoItemTypeFromString(path[0])) { InfoType.STREAM -> ExtractorHelper.getStreamInfo(serviceId, url, false) .map { SinglePlayQueue(it) } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt index 05719b6d4e1..05c94e990b5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt @@ -30,9 +30,9 @@ import android.support.v4.media.session.MediaSessionCompat import android.util.Log import androidx.core.app.NotificationManagerCompat import androidx.media.MediaBrowserServiceCompat -import org.schabi.newpipe.BuildConfig import java.security.MessageDigest import java.security.NoSuchAlgorithmException +import org.schabi.newpipe.BuildConfig /** * Validates that the calling package is authorized to browse a [MediaBrowserServiceCompat]. @@ -94,18 +94,22 @@ internal class PackageValidator(context: Context) { val isCallerKnown = when { // If it's our own app making the call, allow it. callingUid == Process.myUid() -> true + // If the system is making the call, allow it. callingUid == Process.SYSTEM_UID -> true + // If the app was signed by the same certificate as the platform itself, also allow it. callerSignature == platformSignature -> true - /** + + /* * [MEDIA_CONTENT_CONTROL] permission is only available to system applications, and * while it isn't required to allow these apps to connect to a * [MediaBrowserServiceCompat], allowing this ensures optimal compatability with apps * such as Android TV and the Google Assistant. */ callerPackageInfo.permissions.contains(MEDIA_CONTENT_CONTROL) -> true - /** + + /* * If the calling app has a notification listener it is able to retrieve notifications * and can connect to an active [MediaSessionCompat]. * @@ -169,11 +173,10 @@ internal class PackageValidator(context: Context) { */ @Suppress("deprecation") @SuppressLint("PackageManagerGetSignatures") - private fun getPackageInfo(callingPackage: String): PackageInfo? = - packageManager.getPackageInfo( - callingPackage, - PackageManager.GET_SIGNATURES or PackageManager.GET_PERMISSIONS - ) + private fun getPackageInfo(callingPackage: String): PackageInfo? = packageManager.getPackageInfo( + callingPackage, + PackageManager.GET_SIGNATURES or PackageManager.GET_PERMISSIONS + ) /** * Gets the signature of a given package's [PackageInfo]. @@ -185,23 +188,21 @@ internal class PackageValidator(context: Context) { * returns `null` as the signature. */ @Suppress("deprecation") - 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 { - val certificate = packageInfo.signatures!![0].toByteArray() - getSignatureSha256(certificate) - } + 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 { + val certificate = packageInfo.signatures!![0].toByteArray() + getSignatureSha256(certificate) + } /** * Finds the Android platform signing key signature. This key is never null. */ - private fun getSystemSignature(): String = - getPackageInfo(ANDROID_PLATFORM)?.let { platformInfo -> - getSignature(platformInfo) - } ?: throw IllegalStateException("Platform signature not found") + private fun getSystemSignature(): String = getPackageInfo(ANDROID_PLATFORM)?.let { platformInfo -> + getSignature(platformInfo) + } ?: throw IllegalStateException("Platform signature not found") /** * Creates a SHA-256 signature given a certificate byte array. diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.kt b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.kt index e4f4ef1b24a..22b7e0022c5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.kt +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.kt @@ -3,7 +3,10 @@ package org.schabi.newpipe.player.playqueue import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.subjects.BehaviorSubject +import io.reactivex.rxjava3.subjects.PublishSubject +import java.io.Serializable +import java.util.Collections +import java.util.concurrent.atomic.AtomicInteger import org.schabi.newpipe.player.playqueue.PlayQueueEvent.AppendEvent import org.schabi.newpipe.player.playqueue.PlayQueueEvent.ErrorEvent import org.schabi.newpipe.player.playqueue.PlayQueueEvent.InitEvent @@ -12,9 +15,6 @@ import org.schabi.newpipe.player.playqueue.PlayQueueEvent.RecoveryEvent import org.schabi.newpipe.player.playqueue.PlayQueueEvent.RemoveEvent import org.schabi.newpipe.player.playqueue.PlayQueueEvent.ReorderEvent import org.schabi.newpipe.player.playqueue.PlayQueueEvent.SelectEvent -import java.io.Serializable -import java.util.Collections -import java.util.concurrent.atomic.AtomicInteger /** * PlayQueue is responsible for keeping track of a list of streams and the index of @@ -28,7 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger */ abstract class PlayQueue internal constructor( index: Int, - startWith: List, + startWith: List ) : Serializable { private val queueIndex = AtomicInteger(index) private val history = mutableListOf() @@ -36,7 +36,7 @@ abstract class PlayQueue internal constructor( private var streams = startWith.toMutableList() @Transient - private var eventBroadcast: BehaviorSubject? = null + private var eventBroadcast: PublishSubject? = null /** * Returns the play queue's update broadcast. @@ -68,7 +68,7 @@ abstract class PlayQueue internal constructor( * Also starts a self reporter for logging if debug mode is enabled. */ fun init() { - eventBroadcast = BehaviorSubject.create() + eventBroadcast = PublishSubject.create() broadcastReceiver = eventBroadcast!! @@ -105,22 +105,20 @@ abstract class PlayQueue internal constructor( /*////////////////////////////////////////////////////////////////////////// // Readonly ops ////////////////////////////////////////////////////////////////////////// */ + + /** + * Changes the current playing index to a new index. + * + * This method is guarded using in a circular manner for index exceeding the play queue size. + * + * Will emit a [SelectEvent] if the index is not the current playing index. + * + * @param index the index to be set + * @return the current index that should be played + */ @set:Synchronized var index: Int = 0 - /** - * @return the current index that should be played - */ get() = queueIndex.get() - - /** - * Changes the current playing index to a new index. - * - * This method is guarded using in a circular manner for index exceeding the play queue size. - * - * Will emit a [SelectEvent] if the index is not the current playing index. - * - * @param index the index to be set - */ set(index) { val oldIndex = field @@ -340,7 +338,7 @@ abstract class PlayQueue internal constructor( @Synchronized fun move( source: Int, - target: Int, + target: Int ) { if (source < 0 || target < 0) { return @@ -375,7 +373,7 @@ abstract class PlayQueue internal constructor( @Synchronized fun setRecovery( index: Int, - position: Long, + position: Long ) { streams.getOrNull(index)?.let { it.recoveryPosition = position diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.kt b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.kt index d6b4b040251..8ff91d4d9ab 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.kt +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.kt @@ -2,13 +2,13 @@ package org.schabi.newpipe.player.playqueue import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers +import java.io.Serializable +import java.util.Objects import org.schabi.newpipe.extractor.Image import org.schabi.newpipe.extractor.stream.StreamInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.util.ExtractorHelper -import java.io.Serializable -import java.util.Objects class PlayQueueItem private constructor( val title: String, @@ -18,7 +18,7 @@ class PlayQueueItem private constructor( val thumbnails: List, val uploader: String, val uploaderUrl: String?, - val streamType: StreamType, + val streamType: StreamType ) : Serializable { // // ////////////////////////////////////////////////////////////////////// */ @@ -40,7 +40,7 @@ class PlayQueueItem private constructor( info.thumbnails, info.uploaderName.orEmpty(), info.uploaderUrl, - info.streamType, + info.streamType ) { if (info.startPosition > 0) { this.recoveryPosition = info.startPosition * 1000 @@ -55,7 +55,7 @@ class PlayQueueItem private constructor( item.thumbnails, item.uploaderName.orEmpty(), item.uploaderUrl, - item.streamType, + item.streamType ) val stream: Single diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.kt b/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.kt index 5419027a5e6..9db5a24f693 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.kt +++ b/app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.kt @@ -1,8 +1,8 @@ package org.schabi.newpipe.player.ui -import org.schabi.newpipe.util.GuardedByMutex import kotlin.reflect.KClass import kotlin.reflect.safeCast +import org.schabi.newpipe.util.GuardedByMutex /** * Creates a [PlayerUiList] starting with the provided player uis. The provided player uis @@ -78,22 +78,20 @@ class PlayerUiList(vararg initialPlayerUis: PlayerUi) { * @param T the class type parameter * @return the first player UI of the required type found in the list, or null
*/ - fun get(playerUiType: KClass): T? = - playerUis.runWithLockSync { - for (ui in lockData) { - if (playerUiType.isInstance(ui)) { - // try all UIs before returning null - playerUiType.safeCast(ui)?.let { return@runWithLockSync it } - } + fun get(playerUiType: KClass): T? = playerUis.runWithLockSync { + for (ui in lockData) { + if (playerUiType.isInstance(ui)) { + // try all UIs before returning null + playerUiType.safeCast(ui)?.let { return@runWithLockSync it } } - return@runWithLockSync null } + return@runWithLockSync null + } /** * See [get] above */ - fun get(playerUiType: Class): T? = - get(playerUiType.kotlin) + fun get(playerUiType: Class): T? = get(playerUiType.kotlin) /** * Calls the provided consumer on all player UIs in the list, in order of addition. diff --git a/app/src/main/java/org/schabi/newpipe/settings/DebugScreen.kt b/app/src/main/java/org/schabi/newpipe/settings/DebugScreen.kt index ac08dd36bc8..45d85866e7a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DebugScreen.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/DebugScreen.kt @@ -13,7 +13,6 @@ import org.schabi.newpipe.ui.theme.SizeTokens @Composable fun DebugScreen(viewModel: SettingsViewModel, modifier: Modifier = Modifier) { - val settingsLayoutRedesign by viewModel.settingsLayoutRedesign.collectAsState() Column(modifier = modifier) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt b/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt index 38227e10e0b..97a7e642f1a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt @@ -10,6 +10,7 @@ import kotlin.io.path.div class BackupFileLocator(context: Context) { companion object { const val FILE_NAME_DB = "newpipe.db" + @Deprecated( "Serializing preferences with Java's ObjectOutputStream is vulnerable to injections", replaceWith = ReplaceWith("FILE_NAME_JSON_PREFS") diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt index cbf860d2c48..b5ab72f517c 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt @@ -5,15 +5,15 @@ import com.grack.nanojson.JsonArray import com.grack.nanojson.JsonParser import com.grack.nanojson.JsonParserException import com.grack.nanojson.JsonWriter -import org.schabi.newpipe.streams.io.SharpOutputStream -import org.schabi.newpipe.streams.io.StoredFileHelper -import org.schabi.newpipe.util.ZipHelper import java.io.FileNotFoundException import java.io.IOException import java.io.ObjectOutputStream import java.util.zip.ZipOutputStream import kotlin.io.path.createParentDirectories import kotlin.io.path.deleteIfExists +import org.schabi.newpipe.streams.io.SharpOutputStream +import org.schabi.newpipe.streams.io.StoredFileHelper +import org.schabi.newpipe.util.ZipHelper class ImportExportManager(private val fileLocator: BackupFileLocator) { companion object { @@ -117,10 +117,15 @@ class ImportExportManager(private val fileLocator: BackupFileLocator) { for ((key, value) in entries) { when (value) { is Boolean -> editor.putBoolean(key, value) + is Float -> editor.putFloat(key, value) + is Int -> editor.putInt(key, value) + is Long -> editor.putLong(key, value) + is String -> editor.putString(key, value) + is Set<*> -> { // There are currently only Sets with type String possible @Suppress("UNCHECKED_CAST") @@ -154,10 +159,15 @@ class ImportExportManager(private val fileLocator: BackupFileLocator) { for ((key, value) in jsonObject) { when (value) { is Boolean -> editor.putBoolean(key, value) + is Float -> editor.putFloat(key, value) + is Int -> editor.putInt(key, value) + is Long -> editor.putLong(key, value) + is String -> editor.putString(key, value) + is JsonArray -> { editor.putStringSet(key, value.mapNotNull { e -> e as? String }.toSet()) } diff --git a/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt b/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt index 2df3e33b669..45f9b06bea5 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt @@ -45,7 +45,7 @@ class NotificationModeConfigFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View { _binding = FragmentChannelsNotificationsBinding.inflate(inflater, container, false) return binding.root @@ -90,6 +90,7 @@ class NotificationModeConfigFragment : Fragment() { toggleAll() true } + else -> super.onOptionsItemSelected(item) } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/schabi/newpipe/settings/viewmodel/SettingsViewModel.kt index 1e48fef5e0c..7453096d6a3 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/viewmodel/SettingsViewModel.kt @@ -6,11 +6,11 @@ import android.content.SharedPreferences import androidx.lifecycle.AndroidViewModel import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import org.schabi.newpipe.R import org.schabi.newpipe.util.Localization -import javax.inject.Inject @HiltViewModel class SettingsViewModel @Inject constructor( @@ -18,7 +18,7 @@ class SettingsViewModel @Inject constructor( private val preferenceManager: SharedPreferences ) : AndroidViewModel(context.applicationContext as Application) { - private var _settingsLayoutRedesignPref: Boolean + private var settingsLayoutRedesignPref: Boolean get() = preferenceManager.getBoolean( Localization.compatGetString(getApplication(), R.string.settings_layout_redesign_key), false @@ -30,11 +30,11 @@ class SettingsViewModel @Inject constructor( ).apply() } private val _settingsLayoutRedesign: MutableStateFlow = - MutableStateFlow(_settingsLayoutRedesignPref) + MutableStateFlow(settingsLayoutRedesignPref) val settingsLayoutRedesign = _settingsLayoutRedesign.asStateFlow() fun toggleSettingsLayoutRedesign(newState: Boolean) { _settingsLayoutRedesign.value = newState - _settingsLayoutRedesignPref = newState + settingsLayoutRedesignPref = newState } } diff --git a/app/src/main/java/org/schabi/newpipe/ui/SwitchPreference.kt b/app/src/main/java/org/schabi/newpipe/ui/SwitchPreference.kt index d479343f566..37e46e34ff2 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/SwitchPreference.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/SwitchPreference.kt @@ -36,14 +36,14 @@ fun SwitchPreference( text = stringResource(id = title), modifier = Modifier.padding(SizeTokens.SpacingExtraSmall), style = MaterialTheme.typography.titleSmall, - textAlign = TextAlign.Start, + textAlign = TextAlign.Start ) summary?.let { Text( text = stringResource(id = summary), modifier = Modifier.padding(SizeTokens.SpacingExtraSmall), style = MaterialTheme.typography.bodySmall, - textAlign = TextAlign.Start, + textAlign = TextAlign.Start ) } } diff --git a/app/src/main/java/org/schabi/newpipe/ui/TextPreference.kt b/app/src/main/java/org/schabi/newpipe/ui/TextPreference.kt index f58f2f305cc..2fad42d4d9a 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/TextPreference.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/TextPreference.kt @@ -28,7 +28,7 @@ fun TextPreference( @StringRes title: Int, @DrawableRes icon: Int? = null, @StringRes summary: Int? = null, - onClick: () -> Unit, + onClick: () -> Unit ) { Row( verticalAlignment = Alignment.CenterVertically, @@ -51,14 +51,14 @@ fun TextPreference( text = stringResource(id = title), modifier = Modifier.padding(SizeTokens.SpacingExtraSmall), style = MaterialTheme.typography.titleSmall, - textAlign = TextAlign.Start, + textAlign = TextAlign.Start ) summary?.let { Text( text = stringResource(id = summary), modifier = Modifier.padding(SizeTokens.SpacingExtraSmall), style = MaterialTheme.typography.bodySmall, - textAlign = TextAlign.Start, + textAlign = TextAlign.Start ) } } diff --git a/app/src/main/java/org/schabi/newpipe/ui/Toolbar.kt b/app/src/main/java/org/schabi/newpipe/ui/Toolbar.kt index de0c9754035..d3a20bb02be 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/Toolbar.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/Toolbar.kt @@ -37,7 +37,8 @@ fun TextAction(text: String, modifier: Modifier = Modifier) { @Composable fun NavigationIcon() { Icon( - imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back", + imageVector = Icons.AutoMirrored.Filled.ArrowBack, + contentDescription = "Back", modifier = Modifier.padding(horizontal = SizeTokens.SpacingExtraSmall) ) } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/about/AboutTab.kt b/app/src/main/java/org/schabi/newpipe/ui/components/about/AboutTab.kt index dbb10b9a894..c9c62cdff7b 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/about/AboutTab.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/about/AboutTab.kt @@ -37,20 +37,28 @@ import org.schabi.newpipe.util.image.NewPipeSquircleIcon private val ABOUT_ITEMS = listOf( AboutData(R.string.faq_title, R.string.faq_description, R.string.faq, R.string.faq_url), AboutData( - R.string.contribution_title, R.string.contribution_encouragement, - R.string.view_on_github, R.string.github_url + R.string.contribution_title, + R.string.contribution_encouragement, + R.string.view_on_github, + R.string.github_url ), AboutData( - R.string.donation_title, R.string.donation_encouragement, R.string.give_back, + R.string.donation_title, + R.string.donation_encouragement, + R.string.give_back, R.string.donation_url ), AboutData( - R.string.website_title, R.string.website_encouragement, R.string.open_in_browser, + R.string.website_title, + R.string.website_encouragement, + R.string.open_in_browser, R.string.website_url ), AboutData( - R.string.privacy_policy_title, R.string.privacy_policy_encouragement, - R.string.read_privacy_policy, R.string.privacy_policy_url + R.string.privacy_policy_title, + R.string.privacy_policy_encouragement, + R.string.read_privacy_policy, + R.string.privacy_policy_url ) ) @@ -86,23 +94,23 @@ fun AboutTab() { Image( imageVector = NewPipeSquircleIcon, contentDescription = stringResource(R.string.app_name), - modifier = Modifier.size(64.dp), + modifier = Modifier.size(64.dp) ) Spacer(Modifier.height(4.dp)) Text( text = stringResource(R.string.app_name), style = MaterialTheme.typography.titleLarge, - textAlign = TextAlign.Center, + textAlign = TextAlign.Center ) Text( text = BuildConfig.VERSION_NAME, style = MaterialTheme.typography.titleMedium, - textAlign = TextAlign.Center, + textAlign = TextAlign.Center ) Text( modifier = Modifier.fillMaxWidth(), text = stringResource(R.string.app_description), - textAlign = TextAlign.Center, + textAlign = TextAlign.Center ) } @@ -120,7 +128,7 @@ fun AboutTab() { @NonRestartableComposable private fun AboutItem( @PreviewParameter(AboutDataProvider::class) aboutData: AboutData, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { Column(modifier = modifier) { Text( 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 97a2be9493c..a5277dca0ae 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 @@ -39,7 +39,7 @@ import org.schabi.newpipe.util.external_communication.ShareUtils fun Library( @PreviewParameter(LibraryProvider::class) library: Library, showLicenseDialog: (licenseFilename: String) -> Unit, - descriptionMaxLines: Int, + descriptionMaxLines: Int ) { val spdxLicense = library.licenses.firstOrNull()?.spdxId?.takeIf { it.isNotBlank() } val licenseAssetPath = spdxLicense?.let { SPDX_ID_TO_ASSET_PATH[it] } @@ -63,14 +63,14 @@ fun Library( ) { Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, + horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = library.name, modifier = Modifier.weight(0.75f), style = MaterialTheme.typography.titleMedium, maxLines = 1, - overflow = TextOverflow.Ellipsis, + overflow = TextOverflow.Ellipsis ) val version = library.artifactVersion if (!version.isNullOrBlank()) { @@ -85,7 +85,7 @@ fun Library( }.padding(start = 8.dp), style = MaterialTheme.typography.labelMedium, maxLines = 1, - overflow = TextOverflow.Ellipsis, + overflow = TextOverflow.Ellipsis ) } } @@ -95,7 +95,7 @@ fun Library( text = author, style = MaterialTheme.typography.bodyMedium, maxLines = 1, - overflow = TextOverflow.Ellipsis, + overflow = TextOverflow.Ellipsis ) } val description = library.description @@ -105,14 +105,14 @@ fun Library( text = description, style = MaterialTheme.typography.bodySmall, maxLines = descriptionMaxLines, - overflow = TextOverflow.Ellipsis, + overflow = TextOverflow.Ellipsis ) } if (library.licenses.isNotEmpty()) { FlowRow( modifier = Modifier.padding(top = 6.dp, bottom = 4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp), - verticalArrangement = Arrangement.spacedBy(4.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) ) { library.licenses.forEach { Badge { 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 6ab103c9938..9a6bfb7a055 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 @@ -1,4 +1,4 @@ -/** +/* * The library definitions for most libraries are autogenerated by the AboutLibraries plugin. * This file is only for TeamNewPipe-related libraries. */ @@ -22,12 +22,12 @@ val SPDX_ID_TO_ASSET_PATH = mapOf( "GPL-3.0-only" to "gpl_3.html", "GPL-3.0-or-later" to "gpl_3.html", "MIT" to "mit.html", - "MPL-2.0" to "mpl2.html", + "MPL-2.0" to "mpl2.html" ) fun getFirstPartyLibraries( context: Context, - teamNewPipeLibraries: List, + teamNewPipeLibraries: List ): List { val gpl3 = setOf( License( @@ -36,7 +36,7 @@ fun getFirstPartyLibraries( year = null, spdxId = "GPL-3.0-or-later", licenseContent = null, - hash = "GPL-3.0-or-later", + hash = "GPL-3.0-or-later" ) ).toImmutableSet() @@ -58,7 +58,7 @@ fun getFirstPartyLibraries( ).toImmutableList(), organization = null, scm = Scm(null, null, context.getString(R.string.github_url)), - licenses = gpl3, + licenses = gpl3 ), Library( uniqueId = npeId, @@ -74,15 +74,15 @@ fun getFirstPartyLibraries( ).toImmutableList(), organization = null, scm = Scm(null, null, context.getString(R.string.newpipe_extractor_github_url)), - licenses = gpl3, - ), + licenses = gpl3 + ) ) } fun getAdditionalThirdPartyLibraries( context: Context, teamNewPipeLibraries: List, - licenses: ImmutableSet, + licenses: ImmutableSet ): List { val apache2 = licenses.firstOrNull { it.spdxId == "Apache-2.0" } val mit = licenses.firstOrNull { it.spdxId == "MIT" } @@ -103,7 +103,7 @@ fun getAdditionalThirdPartyLibraries( developers = listOf( Developer( name = "Jonas Kalderstam", - organisationUrl = "https://github.com/spacecowboy/NoNonsense-FilePicker", + organisationUrl = "https://github.com/spacecowboy/NoNonsense-FilePicker" ), Developer( name = context.getString(R.string.team_newpipe), @@ -112,7 +112,7 @@ fun getAdditionalThirdPartyLibraries( ).toImmutableList(), organization = null, scm = Scm(null, null, "https://github.com/TeamNewPipe/NoNonsense-FilePicker"), - licenses = listOfNotNull(mpl2).toImmutableSet(), + licenses = listOfNotNull(mpl2).toImmutableSet() ), Library( uniqueId = nanojsonId, @@ -123,16 +123,16 @@ fun getAdditionalThirdPartyLibraries( developers = listOf( Developer( name = "mmastrac", - organisationUrl = "https://github.com/mmastrac/nanojson", + organisationUrl = "https://github.com/mmastrac/nanojson" ), Developer( 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() - ), + ) ) } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseDialog.kt b/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseDialog.kt index 24421a93a75..bc736e5cd9a 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseDialog.kt @@ -40,7 +40,7 @@ fun LicenseDialog(licenseHtml: AnnotatedString, onDismissRequest: () -> Unit) { } else { Text( text = licenseHtml, - modifier = Modifier.padding(horizontal = 12.dp), + modifier = Modifier.padding(horizontal = 12.dp) ) } } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseTab.kt b/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseTab.kt index 46e71ba569a..39b668cea5a 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseTab.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseTab.kt @@ -32,7 +32,7 @@ fun LicenseTab(viewModel: LicenseTabViewModel = viewModel()) { LazyColumnThemedScrollbar(state = lazyListState) { LazyColumn( - state = lazyListState, + state = lazyListState ) { item { Text( @@ -43,7 +43,7 @@ fun LicenseTab(viewModel: LicenseTabViewModel = viewModel()) { top = 16.dp, end = 16.dp, bottom = 8.dp - ), + ) ) } item { @@ -54,7 +54,7 @@ fun LicenseTab(viewModel: LicenseTabViewModel = viewModel()) { start = 16.dp, end = 16.dp, bottom = 8.dp - ), + ) ) } if (state.firstPartyLibraries == null) { @@ -67,7 +67,7 @@ fun LicenseTab(viewModel: LicenseTabViewModel = viewModel()) { Library( library = library, showLicenseDialog = viewModel::showLicenseDialog, - descriptionMaxLines = Int.MAX_VALUE, + descriptionMaxLines = Int.MAX_VALUE ) } } @@ -82,7 +82,7 @@ fun LicenseTab(viewModel: LicenseTabViewModel = viewModel()) { top = 16.dp, end = 16.dp, bottom = 8.dp - ), + ) ) } if (state.thirdPartyLibraries == null) { @@ -95,7 +95,7 @@ fun LicenseTab(viewModel: LicenseTabViewModel = viewModel()) { Library( library = library, showLicenseDialog = viewModel::showLicenseDialog, - descriptionMaxLines = 2, + descriptionMaxLines = 2 ) } } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseTabViewModel.kt b/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseTabViewModel.kt index eeb87816c51..8b149a6fb19 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseTabViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/about/LicenseTabViewModel.kt @@ -45,7 +45,7 @@ class LicenseTabViewModel : ViewModel() { _state.update { it.copy( firstPartyLibraries = firstParty, - thirdPartyLibraries = allThirdParty, + thirdPartyLibraries = allThirdParty ) } } @@ -77,6 +77,6 @@ class LicenseTabViewModel : ViewModel() { val firstPartyLibraries: List?, val thirdPartyLibraries: List?, // null if dialog closed, empty if loading, otherwise license HTML content - val licenseDialogHtml: AnnotatedString?, + val licenseDialogHtml: AnnotatedString? ) } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/common/ErrorPanel.kt b/app/src/main/java/org/schabi/newpipe/ui/components/common/ErrorPanel.kt index 666d1759dc7..4cb08a899cc 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/common/ErrorPanel.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/common/ErrorPanel.kt @@ -29,7 +29,7 @@ import org.schabi.newpipe.util.external_communication.ShareUtils fun ErrorPanel( errorInfo: ErrorInfo, modifier: Modifier = Modifier, - onRetry: (() -> Unit)? = null, + onRetry: (() -> Unit)? = null ) { val context = LocalContext.current val isPreview = LocalInspectionMode.current @@ -42,7 +42,7 @@ fun ErrorPanel( Column( verticalArrangement = Arrangement.spacedBy(12.dp), horizontalAlignment = Alignment.CenterHorizontally, - modifier = modifier, + modifier = modifier ) { Text( text = messageText, @@ -97,9 +97,9 @@ private fun ErrorPanelPreview() { throwable = ReCaptchaException("An error", "https://example.com"), userAction = UserAction.REQUESTED_STREAM, request = "Preview request", - openInBrowserUrl = "https://example.com", + openInBrowserUrl = "https://example.com" ), - onRetry = {}, + onRetry = {} ) } } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/common/ScaffoldWithToolbar.kt b/app/src/main/java/org/schabi/newpipe/ui/components/common/ScaffoldWithToolbar.kt index 18139c7a68f..4780e78a346 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/common/ScaffoldWithToolbar.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/common/ScaffoldWithToolbar.kt @@ -34,7 +34,7 @@ fun ScaffoldWithToolbar( scrolledContainerColor = MaterialTheme.colorScheme.primaryContainer, navigationIconContentColor = MaterialTheme.colorScheme.onPrimaryContainer, titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer, - actionIconContentColor = MaterialTheme.colorScheme.onPrimaryContainer, + actionIconContentColor = MaterialTheme.colorScheme.onPrimaryContainer ), navigationIcon = { IconButton(onClick = onBackClick) { diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/common/Scrollbar.kt b/app/src/main/java/org/schabi/newpipe/ui/components/common/Scrollbar.kt index 1e619f32a12..d4607fd7148 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/common/Scrollbar.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/common/Scrollbar.kt @@ -10,7 +10,7 @@ import my.nanihadesuka.compose.ScrollbarSettings @Composable fun defaultThemedScrollbarSettings(): ScrollbarSettings = ScrollbarSettings.Default.copy( thumbUnselectedColor = MaterialTheme.colorScheme.primary, - thumbSelectedColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.75f), + thumbSelectedColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.75f) ) @Composable @@ -26,6 +26,6 @@ fun LazyColumnThemedScrollbar( modifier = modifier, settings = settings, indicatorContent = indicatorContent, - content = content, + content = content ) } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/common/ServiceColoredButton.kt b/app/src/main/java/org/schabi/newpipe/ui/components/common/ServiceColoredButton.kt index 59a37066cea..cdec32fc422 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/common/ServiceColoredButton.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/common/ServiceColoredButton.kt @@ -21,7 +21,7 @@ import org.schabi.newpipe.ui.theme.SizeTokens.SpacingSmall fun ServiceColoredButton( onClick: () -> Unit, modifier: Modifier = Modifier, - content: @Composable() RowScope.() -> Unit, + content: @Composable RowScope.() -> Unit ) { Button( onClick = onClick, @@ -33,9 +33,9 @@ fun ServiceColoredButton( contentPadding = PaddingValues(horizontal = SpacingMedium, vertical = SpacingSmall), shape = RectangleShape, elevation = ButtonDefaults.buttonElevation( - defaultElevation = 8.dp, + defaultElevation = 8.dp - ), + ) ) { content() } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/items/ItemList.kt b/app/src/main/java/org/schabi/newpipe/ui/components/items/ItemList.kt index 4562e17aff7..ba45c503dd3 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/items/ItemList.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/items/ItemList.kt @@ -40,11 +40,20 @@ fun ItemList( val fragmentManager = context.findFragmentActivity().supportFragmentManager if (item is StreamInfoItem) { NavigationHelper.openVideoDetailFragment( - context, fragmentManager, item.serviceId, item.url, item.name, null, false + context, + fragmentManager, + item.serviceId, + item.url, + item.name, + null, + false ) } else if (item is PlaylistInfoItem) { NavigationHelper.openPlaylistFragment( - fragmentManager, item.serviceId, item.url, item.name + fragmentManager, + item.serviceId, + item.url, + item.name ) } } @@ -82,7 +91,12 @@ fun ItemList( if (item is StreamInfoItem) { val isSelected = selectedStream == item StreamListItem( - item, showProgress, isSelected, onClick, onLongClick, onDismissPopup + item, + showProgress, + isSelected, + onClick, + onLongClick, + onDismissPopup ) } else if (item is PlaylistInfoItem) { PlaylistListItem(item, onClick) @@ -109,6 +123,7 @@ private fun determineItemViewMode(): ItemViewMode { ItemViewMode.LIST } } + else -> viewMode } } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/items/playlist/PlaylistListItem.kt b/app/src/main/java/org/schabi/newpipe/ui/components/items/playlist/PlaylistListItem.kt index 65388693573..c8a9b2d0e1b 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/items/playlist/PlaylistListItem.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/items/playlist/PlaylistListItem.kt @@ -25,7 +25,7 @@ import org.schabi.newpipe.util.NO_SERVICE_ID @Composable fun PlaylistListItem( playlist: PlaylistInfoItem, - onClick: (InfoItem) -> Unit = {}, + onClick: (InfoItem) -> Unit = {} ) { Row( modifier = Modifier diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamMenu.kt b/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamMenu.kt index 7619515e71d..099a9300508 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamMenu.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamMenu.kt @@ -77,7 +77,9 @@ fun StreamMenu( onClick = { onDismissRequest() SparseItemUtil.fetchStreamInfoAndSaveToDatabase( - context, stream.serviceId, stream.url + context, + stream.serviceId, + stream.url ) { info -> // TODO: Use an AlertDialog composable instead. val downloadDialog = DownloadDialog(context, info) @@ -126,7 +128,10 @@ fun StreamMenu( onClick = { onDismissRequest() SparseItemUtil.fetchUploaderUrlIfSparse( - context, stream.serviceId, stream.url, stream.uploaderUrl + context, + stream.serviceId, + stream.url, + stream.uploaderUrl ) { url -> val activity = context.findFragmentActivity() NavigationHelper.openChannelFragment(activity, stream, url) diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamThumbnail.kt b/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamThumbnail.kt index f5515a24a3c..9ee5e0d3ff7 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamThumbnail.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamThumbnail.kt @@ -23,14 +23,14 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import coil3.compose.AsyncImage +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.seconds import org.schabi.newpipe.R import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.StreamTypeUtil import org.schabi.newpipe.util.image.ImageStrategy import org.schabi.newpipe.viewmodels.StreamViewModel -import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.Duration.Companion.seconds @Composable fun StreamThumbnail( diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamUtils.kt b/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamUtils.kt index 628862332f9..d744b700d96 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamUtils.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/items/stream/StreamUtils.kt @@ -4,12 +4,12 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import java.util.concurrent.TimeUnit import org.schabi.newpipe.extractor.Image import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.NO_SERVICE_ID -import java.util.concurrent.TimeUnit @Suppress("ktlint:standard:function-naming") fun StreamInfoItem( @@ -64,6 +64,6 @@ internal class StreamItemPreviewProvider : PreviewParameterProvider Unit) { .animateContentSize() .combinedClickable( onLongClick = copyToClipboardCallback { parsedDescription }, - onClick = { isExpanded = !isExpanded }, + onClick = { isExpanded = !isExpanded } ) .padding(start = 8.dp, top = 10.dp, end = 8.dp, bottom = 4.dp), horizontalArrangement = Arrangement.spacedBy(8.dp) @@ -102,7 +102,9 @@ fun Comment(comment: CommentsInfoItem, onCommentAuthorOpened: () -> Unit) { Localization.concatenateStrings( Localization.localizeUserName(comment.uploaderName), Localization.relativeTimeOrTextual( - context, comment.uploadDate, comment.textualUploadDate + context, + comment.uploadDate, + comment.textualUploadDate ) ) } @@ -110,7 +112,7 @@ fun Comment(comment: CommentsInfoItem, onCommentAuthorOpened: () -> Unit) { text = nameAndDate, style = MaterialTheme.typography.titleSmall, maxLines = 1, - overflow = TextOverflow.Ellipsis, + overflow = TextOverflow.Ellipsis ) } @@ -127,7 +129,7 @@ fun Comment(comment: CommentsInfoItem, onCommentAuthorOpened: () -> Unit) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, + verticalAlignment = Alignment.CenterVertically ) { Row( verticalAlignment = Alignment.CenterVertically, @@ -140,7 +142,7 @@ fun Comment(comment: CommentsInfoItem, onCommentAuthorOpened: () -> Unit) { contentDescription = stringResource(R.string.detail_likes_img_view_description), modifier = Modifier .padding(end = 4.dp) - .size(20.dp), + .size(20.dp) ) Text( text = Localization.likeCount(context, comment.likeCount), @@ -155,7 +157,7 @@ fun Comment(comment: CommentsInfoItem, onCommentAuthorOpened: () -> Unit) { imageVector = Icons.Default.Favorite, contentDescription = stringResource(R.string.detail_heart_img_view_description), tint = MaterialTheme.colorScheme.primary, - modifier = Modifier.size(20.dp), + modifier = Modifier.size(20.dp) ) } } @@ -169,7 +171,9 @@ fun Comment(comment: CommentsInfoItem, onCommentAuthorOpened: () -> Unit) { modifier = Modifier.padding(end = 2.dp) ) { val text = pluralStringResource( - R.plurals.replies, comment.replyCount, comment.replyCount.toString() + R.plurals.replies, + comment.replyCount, + comment.replyCount.toString() ) Text(text = text) } @@ -183,7 +187,7 @@ fun Comment(comment: CommentsInfoItem, onCommentAuthorOpened: () -> Unit) { CommentRepliesDialog( parentComment = comment, onDismissRequest = { showReplies = false }, - onCommentAuthorOpened = onCommentAuthorOpened, + onCommentAuthorOpened = onCommentAuthorOpened ) } } @@ -200,7 +204,7 @@ fun CommentsInfoItem( isHeartedByUploader: Boolean = false, isPinned: Boolean = false, replies: Page? = null, - replyCount: Int = 0, + replyCount: Int = 0 ) = CommentsInfoItem(serviceId, url, name).apply { this.commentText = commentText this.uploaderName = uploaderName @@ -249,7 +253,7 @@ private class CommentPreviewProvider : CollectionPreviewParameterProvider Unit, - onCommentAuthorOpened: () -> Unit, + onCommentAuthorOpened: () -> Unit ) { val coroutineScope = rememberCoroutineScope() val commentsFlow = remember { @@ -65,7 +65,7 @@ private fun CommentRepliesDialog( parentComment: CommentsInfoItem, commentsFlow: Flow>, onDismissRequest: () -> Unit, - onCommentAuthorOpened: () -> Unit, + onCommentAuthorOpened: () -> Unit ) { val comments = commentsFlow.collectAsLazyPagingItems() val nestedScrollInterop = rememberNestedScrollInteropConnection() @@ -83,7 +83,7 @@ private fun CommentRepliesDialog( ModalBottomSheet( sheetState = sheetState, - onDismissRequest = onDismissRequest, + onDismissRequest = onDismissRequest ) { LazyColumnThemedScrollbar(state = listState) { LazyColumn( @@ -93,7 +93,7 @@ private fun CommentRepliesDialog( item { CommentRepliesHeader( comment = parentComment, - onCommentAuthorOpened = nestedOnCommentAuthorOpened, + onCommentAuthorOpened = nestedOnCommentAuthorOpened ) HorizontalDivider( thickness = 1.dp, @@ -111,7 +111,7 @@ private fun CommentRepliesDialog( text = pluralStringResource( R.plurals.replies, parentComment.replyCount, - parentComment.replyCount, + parentComment.replyCount ), maxLines = 1, style = MaterialTheme.typography.titleMedium @@ -125,6 +125,7 @@ private fun CommentRepliesDialog( is LoadState.Loading -> { LoadingIndicator(modifier = Modifier.padding(top = 8.dp)) } + else -> { // TODO use error panel instead EmptyStateComposable( @@ -144,7 +145,7 @@ private fun CommentRepliesDialog( items(comments.itemCount) { Comment( comment = comments[it]!!, - onCommentAuthorOpened = nestedOnCommentAuthorOpened, + onCommentAuthorOpened = nestedOnCommentAuthorOpened ) } } @@ -168,7 +169,7 @@ private fun CommentRepliesDialogPreview() { CommentsInfoItem( commentText = Description( "Reply $i: ${LoremIpsum(i * i).values.first()}", - Description.PLAIN_TEXT, + Description.PLAIN_TEXT ), uploaderName = LoremIpsum(11 - i).values.first() ) diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/video/comment/CommentRepliesHeader.kt b/app/src/main/java/org/schabi/newpipe/ui/components/video/comment/CommentRepliesHeader.kt index f9c44b80c3e..4530ebca6c0 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/video/comment/CommentRepliesHeader.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/video/comment/CommentRepliesHeader.kt @@ -44,7 +44,7 @@ fun CommentRepliesHeader(comment: CommentsInfoItem, onCommentAuthorOpened: () -> Column( modifier = Modifier.padding(16.dp), - verticalArrangement = Arrangement.spacedBy(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) ) { Row( modifier = Modifier.fillMaxWidth(), @@ -61,7 +61,7 @@ fun CommentRepliesHeader(comment: CommentsInfoItem, onCommentAuthorOpened: () -> } .weight(1.0f, true), horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalAlignment = Alignment.CenterVertically, + verticalAlignment = Alignment.CenterVertically ) { AsyncImage( model = ImageStrategy.choosePreferredImage(comment.uploaderAvatars), @@ -78,11 +78,13 @@ fun CommentRepliesHeader(comment: CommentsInfoItem, onCommentAuthorOpened: () -> text = comment.uploaderName, maxLines = 1, overflow = TextOverflow.Ellipsis, - style = MaterialTheme.typography.titleSmall, + style = MaterialTheme.typography.titleSmall ) Localization.relativeTimeOrTextual( - context, comment.uploadDate, comment.textualUploadDate + context, + comment.uploadDate, + comment.textualUploadDate )?.let { Text(text = it, style = MaterialTheme.typography.bodySmall) } @@ -97,11 +99,11 @@ fun CommentRepliesHeader(comment: CommentsInfoItem, onCommentAuthorOpened: () -> if (comment.likeCount >= 0) { Icon( imageVector = Icons.Default.ThumbUp, - contentDescription = stringResource(R.string.detail_likes_img_view_description), + contentDescription = stringResource(R.string.detail_likes_img_view_description) ) Text( text = Localization.likeCount(context, comment.likeCount), - maxLines = 1, + maxLines = 1 ) } @@ -109,14 +111,14 @@ fun CommentRepliesHeader(comment: CommentsInfoItem, onCommentAuthorOpened: () -> Icon( imageVector = Icons.Default.Favorite, contentDescription = stringResource(R.string.detail_heart_img_view_description), - tint = MaterialTheme.colorScheme.primary, + tint = MaterialTheme.colorScheme.primary ) } if (comment.isPinned) { Icon( imageVector = Icons.Default.PushPin, - contentDescription = stringResource(R.string.detail_pinned_comment_view_description), + contentDescription = stringResource(R.string.detail_pinned_comment_view_description) ) } } @@ -124,7 +126,7 @@ fun CommentRepliesHeader(comment: CommentsInfoItem, onCommentAuthorOpened: () -> DescriptionText( description = comment.commentText, - style = MaterialTheme.typography.bodyMedium, + style = MaterialTheme.typography.bodyMedium ) } } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/video/comment/CommentSection.kt b/app/src/main/java/org/schabi/newpipe/ui/components/video/comment/CommentSection.kt index f0a29378470..b2e7b5813bc 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/video/comment/CommentSection.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/video/comment/CommentSection.kt @@ -111,6 +111,7 @@ private fun CommentSection( LoadingIndicator(modifier = Modifier.padding(top = 8.dp)) } } + is LoadState.Error -> { val errorInfo = ErrorInfo( throwable = refresh.error, @@ -131,6 +132,7 @@ private fun CommentSection( } } } + else -> { items(comments.itemCount) { Comment(comment = comments[it]!!) {} @@ -139,6 +141,7 @@ private fun CommentSection( } } } + is Resource.Error -> { val errorInfo = ErrorInfo( throwable = uiState.throwable, @@ -201,8 +204,12 @@ private fun CommentSectionSuccessPreview() { CommentSection( uiState = Resource.Success( CommentInfo( - serviceId = 1, url = "", comments = comments, nextPage = null, - commentCount = 10, isCommentsDisabled = false + serviceId = 1, + url = "", + comments = comments, + nextPage = null, + commentCount = 10, + isCommentsDisabled = false ) ), commentsFlow = flowOf(PagingData.from(comments)) diff --git a/app/src/main/java/org/schabi/newpipe/ui/emptystate/EmptyStateComposable.kt b/app/src/main/java/org/schabi/newpipe/ui/emptystate/EmptyStateComposable.kt index 77fa0208211..0b6c09be272 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/emptystate/EmptyStateComposable.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/emptystate/EmptyStateComposable.kt @@ -22,17 +22,17 @@ import org.schabi.newpipe.ui.theme.AppTheme @Composable fun EmptyStateComposable( spec: EmptyStateSpec, - modifier: Modifier = Modifier, + modifier: Modifier = Modifier ) { Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, + verticalArrangement = Arrangement.Center ) { Text( text = spec.emojiText, style = MaterialTheme.typography.titleLarge, - textAlign = TextAlign.Center, + textAlign = TextAlign.Center ) Text( @@ -41,7 +41,7 @@ fun EmptyStateComposable( .padding(horizontal = 16.dp), text = stringResource(spec.descriptionText), style = MaterialTheme.typography.bodyMedium, - textAlign = TextAlign.Center, + textAlign = TextAlign.Center ) } } @@ -74,46 +74,46 @@ fun EmptyStateComposableNoCommentPreview() { enum class EmptyStateSpec( val emojiText: String, - @field:StringRes val descriptionText: Int, + @field:StringRes val descriptionText: Int ) { GenericError( emojiText = "¯\\_(ツ)_/¯", - descriptionText = R.string.empty_list_subtitle, + descriptionText = R.string.empty_list_subtitle ), NoVideos( emojiText = "(╯°-°)╯", - descriptionText = R.string.no_videos, + descriptionText = R.string.no_videos ), NoComments( emojiText = "¯\\_(╹x╹)_/¯", - descriptionText = R.string.no_comments, + descriptionText = R.string.no_comments ), DisabledComments( emojiText = "¯\\_(╹x╹)_/¯", - descriptionText = R.string.comments_are_disabled, + descriptionText = R.string.comments_are_disabled ), ErrorLoadingComments( emojiText = "¯\\_(╹x╹)_/¯", - descriptionText = R.string.error_unable_to_load_comments, + descriptionText = R.string.error_unable_to_load_comments ), NoSearchResult( emojiText = "╰(°●°╰)", - descriptionText = R.string.search_no_results, + descriptionText = R.string.search_no_results ), ContentNotSupported( emojiText = "(︶︹︺)", - descriptionText = R.string.content_not_supported, + descriptionText = R.string.content_not_supported ), NoBookmarkedPlaylist( emojiText = "(╥﹏╥)", - descriptionText = R.string.no_playlist_bookmarked_yet, + descriptionText = R.string.no_playlist_bookmarked_yet ), NoSubscriptionsHint( emojiText = "(꩜ᯅ꩜)", - descriptionText = R.string.import_subscriptions_hint, + descriptionText = R.string.import_subscriptions_hint ), NoSubscriptions( emojiText = "(꩜ᯅ꩜)", - descriptionText = R.string.no_channel_subscribed_yet, - ), + descriptionText = R.string.no_channel_subscribed_yet + ) } diff --git a/app/src/main/java/org/schabi/newpipe/ui/emptystate/EmptyStateUtil.kt b/app/src/main/java/org/schabi/newpipe/ui/emptystate/EmptyStateUtil.kt index 3e030407c92..75e013ad1ea 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/emptystate/EmptyStateUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/emptystate/EmptyStateUtil.kt @@ -17,7 +17,7 @@ import org.schabi.newpipe.ui.theme.AppTheme @JvmOverloads fun ComposeView.setEmptyStateComposable( spec: EmptyStateSpec = EmptyStateSpec.GenericError, - strategy: ViewCompositionStrategy = ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed, + strategy: ViewCompositionStrategy = ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed ) = apply { setViewCompositionStrategy(strategy) setContent { diff --git a/app/src/main/java/org/schabi/newpipe/ui/theme/Theme.kt b/app/src/main/java/org/schabi/newpipe/ui/theme/Theme.kt index d436b35a2e6..208dbc89506 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/theme/Theme.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/theme/Theme.kt @@ -44,7 +44,7 @@ private val lightScheme = lightColorScheme( surfaceContainerLow = surfaceContainerLowLight, surfaceContainer = surfaceContainerLight, surfaceContainerHigh = surfaceContainerHighLight, - surfaceContainerHighest = surfaceContainerHighestLight, + surfaceContainerHighest = surfaceContainerHighestLight ) private val darkScheme = darkColorScheme( @@ -82,7 +82,7 @@ private val darkScheme = darkColorScheme( surfaceContainerLow = surfaceContainerLowDark, surfaceContainer = surfaceContainerDark, surfaceContainerHigh = surfaceContainerHighDark, - surfaceContainerHighest = surfaceContainerHighestDark, + surfaceContainerHighest = surfaceContainerHighestDark ) private val blackScheme = darkScheme.copy(surface = Color.Black) diff --git a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt index bfa50beef35..1237a984b0d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt +++ b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt @@ -7,9 +7,9 @@ package org.schabi.newpipe.util import android.content.Context import androidx.preference.PreferenceManager +import java.util.regex.Matcher import org.schabi.newpipe.R import org.schabi.newpipe.ktx.getStringSafe -import java.util.regex.Matcher object FilenameUtils { private const val CHARSET_MOST_SPECIAL = "[\\n\\r|?*<\":\\\\>/']+" @@ -31,10 +31,12 @@ object FilenameUtils { val defaultCharset = context.getString(R.string.default_file_charset_value) val replacementChar = sharedPreferences.getStringSafe( - context.getString(R.string.settings_file_replacement_character_key), "_" + context.getString(R.string.settings_file_replacement_character_key), + "_" ) val selectedCharset = sharedPreferences.getStringSafe( - context.getString(R.string.settings_file_charset_key), "" + context.getString(R.string.settings_file_charset_key), + "" ).ifEmpty { defaultCharset } val charset = when (selectedCharset) { diff --git a/app/src/main/java/org/schabi/newpipe/util/GuardedByMutex.kt b/app/src/main/java/org/schabi/newpipe/util/GuardedByMutex.kt index b3bd077f813..a191f2f01c6 100644 --- a/app/src/main/java/org/schabi/newpipe/util/GuardedByMutex.kt +++ b/app/src/main/java/org/schabi/newpipe/util/GuardedByMutex.kt @@ -10,7 +10,7 @@ import kotlinx.coroutines.sync.withLock * */ class GuardedByMutex( private var data: T, - private val lock: Mutex = Mutex(locked = false), + private val lock: Mutex = Mutex(locked = false) ) { /** Lock the mutex and access the data, blocking the current thread. @@ -18,20 +18,18 @@ class GuardedByMutex( * */ fun runWithLockSync( action: MutexData.() -> Y - ) = - runBlocking { - lock.withLock { - MutexData(data, { d -> data = d }).action() - } + ) = runBlocking { + lock.withLock { + MutexData(data, { d -> data = d }).action() } + } /** Lock the mutex and access the data, suspending the coroutine. * @param action to run with locked mutex * */ - suspend fun runWithLock(action: MutexData.() -> Y) = - lock.withLock { - MutexData(data, { d -> data = d }).action() - } + suspend fun runWithLock(action: MutexData.() -> Y) = lock.withLock { + MutexData(data, { d -> data = d }).action() + } } /** The data inside a [GuardedByMutex], which can be accessed via [lockData]. 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 ea41f3e81a2..409fcb30cbd 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -806,7 +806,7 @@ private static Comparator getAudioTrackComparator( final Locale preferredLanguage = Localization.getPreferredLocale(context); final boolean preferOriginalAudio = preferences.getBoolean(context.getString(R.string.prefer_original_audio_key), - false); + true); final boolean preferDescriptiveAudio = preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), false); diff --git a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt index 080f5bace3d..31d42d751dd 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt @@ -2,13 +2,13 @@ package org.schabi.newpipe.util import android.content.pm.PackageManager import androidx.core.content.pm.PackageInfoCompat +import java.time.Instant +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter import org.schabi.newpipe.App import org.schabi.newpipe.error.ErrorInfo import org.schabi.newpipe.error.ErrorUtil.Companion.createNotification import org.schabi.newpipe.error.UserAction -import java.time.Instant -import java.time.ZonedDateTime -import java.time.format.DateTimeFormatter object ReleaseVersionUtil { // Public key of the certificate that is used in NewPipe release versions @@ -26,7 +26,8 @@ object ReleaseVersionUtil { PackageInfoCompat.hasSignatures(app.packageManager, app.packageName, certificates, false) } catch (e: PackageManager.NameNotFoundException) { createNotification( - app, ErrorInfo(e, UserAction.CHECK_FOR_NEW_APP_VERSION, "Could not find package info") + app, + ErrorInfo(e, UserAction.CHECK_FOR_NEW_APP_VERSION, "Could not find package info") ) false } diff --git a/app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt b/app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt index 5b393658cbd..bd1c57f98b1 100644 --- a/app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt @@ -17,11 +17,11 @@ import coil3.size.Size import coil3.target.Target import coil3.toBitmap import coil3.transform.Transformation +import kotlin.math.min import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.extractor.Image import org.schabi.newpipe.ktx.scale -import kotlin.math.min object CoilHelper { private val TAG = CoilHelper::class.java.simpleName @@ -30,37 +30,36 @@ object CoilHelper { fun loadBitmapBlocking( context: Context, url: String?, - @DrawableRes placeholderResId: Int = 0, - ): Bitmap? = - context.imageLoader - .executeBlocking(getImageRequest(context, url, placeholderResId).build()) - .image - ?.toBitmap() + @DrawableRes placeholderResId: Int = 0 + ): Bitmap? = context.imageLoader + .executeBlocking(getImageRequest(context, url, placeholderResId).build()) + .image + ?.toBitmap() fun loadAvatar( target: ImageView, - images: List, + images: List ) { loadImageDefault(target, images, R.drawable.placeholder_person) } fun loadAvatar( target: ImageView, - url: String?, + url: String? ) { loadImageDefault(target, url, R.drawable.placeholder_person) } fun loadThumbnail( target: ImageView, - images: List, + images: List ) { loadImageDefault(target, images, R.drawable.placeholder_thumbnail_video) } fun loadThumbnail( target: ImageView, - url: String?, + url: String? ) { loadImageDefault(target, url, R.drawable.placeholder_thumbnail_video) } @@ -68,7 +67,7 @@ object CoilHelper { fun loadScaledDownThumbnail( context: Context, images: List, - target: Target, + target: Target ): Disposable { val url = ImageStrategy.choosePreferredImage(images) val request = @@ -80,7 +79,7 @@ object CoilHelper { override suspend fun transform( input: Bitmap, - size: Size, + size: Size ): Bitmap { if (MainActivity.DEBUG) { Log.d(TAG, "Thumbnail - transform() called") @@ -89,7 +88,7 @@ object CoilHelper { val notificationThumbnailWidth = min( context.resources.getDimension(R.dimen.player_notification_thumbnail_width), - input.width.toFloat(), + input.width.toFloat() ).toInt() var newHeight = input.height / (input.width / notificationThumbnailWidth) @@ -104,7 +103,7 @@ object CoilHelper { result } } - }, + } ).build() return context.imageLoader.enqueue(request) @@ -112,7 +111,7 @@ object CoilHelper { fun loadDetailsThumbnail( target: ImageView, - images: List, + images: List ) { val url = ImageStrategy.choosePreferredImage(images) loadImageDefault(target, url, R.drawable.placeholder_thumbnail_video, false) @@ -120,21 +119,21 @@ object CoilHelper { fun loadBanner( target: ImageView, - images: List, + images: List ) { loadImageDefault(target, images, R.drawable.placeholder_channel_banner) } fun loadPlaylistThumbnail( target: ImageView, - images: List, + images: List ) { loadImageDefault(target, images, R.drawable.placeholder_thumbnail_playlist) } fun loadPlaylistThumbnail( target: ImageView, - url: String?, + url: String? ) { loadImageDefault(target, url, R.drawable.placeholder_thumbnail_playlist) } @@ -142,7 +141,7 @@ object CoilHelper { private fun loadImageDefault( target: ImageView, images: List, - @DrawableRes placeholderResId: Int, + @DrawableRes placeholderResId: Int ) { loadImageDefault(target, ImageStrategy.choosePreferredImage(images), placeholderResId) } @@ -151,7 +150,7 @@ object CoilHelper { target: ImageView, url: String?, @DrawableRes placeholderResId: Int, - showPlaceholder: Boolean = true, + showPlaceholder: Boolean = true ) { val request = getImageRequest(target.context, url, placeholderResId, showPlaceholder) @@ -164,7 +163,7 @@ object CoilHelper { context: Context, url: String?, @DrawableRes placeholderResId: Int, - showPlaceholderWhileLoading: Boolean = true, + showPlaceholderWhileLoading: Boolean = true ): ImageRequest.Builder { // if the URL was chosen with `choosePreferredImage` it will be null, but check again // `shouldLoadImages` in case the URL was chosen with `imageListToDbUrl` (which is the case diff --git a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt index aa59b4d0add..c7e94c7f89d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt +++ b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt @@ -5,9 +5,9 @@ package org.schabi.newpipe.util.image +import kotlin.math.abs import org.schabi.newpipe.extractor.Image import org.schabi.newpipe.extractor.Image.ResolutionLevel -import kotlin.math.abs object ImageStrategy { // when preferredImageQuality is LOW or MEDIUM, images are sorted by how close their preferred @@ -68,7 +68,7 @@ object ImageStrategy { val initialComparator = Comparator // the first step splits the images into groups of resolution levels .comparingInt { i: Image -> - return@comparingInt when (i.estimatedResolutionLevel) { + return@comparingInt when (i.estimatedResolutionLevel) { // avoid unknowns as much as possible ResolutionLevel.UNKNOWN -> 3 @@ -92,6 +92,7 @@ object ImageStrategy { // the same number for those. val finalComparator = when (nonNoneQuality) { PreferredImageQuality.NONE -> initialComparator + PreferredImageQuality.LOW -> initialComparator.thenComparingDouble { image -> val pixelCount = estimatePixelCount(image, widthOverHeight) abs(pixelCount - BEST_LOW_H * BEST_LOW_H * widthOverHeight) diff --git a/app/src/main/java/org/schabi/newpipe/util/image/NewPipeSquircleIcon.kt b/app/src/main/java/org/schabi/newpipe/util/image/NewPipeSquircleIcon.kt index a4ff131a125..18c1a9f4786 100644 --- a/app/src/main/java/org/schabi/newpipe/util/image/NewPipeSquircleIcon.kt +++ b/app/src/main/java/org/schabi/newpipe/util/image/NewPipeSquircleIcon.kt @@ -23,11 +23,11 @@ val NewPipeSquircleIcon: ImageVector defaultWidth = 100.0.dp, defaultHeight = 100.0.dp, viewportWidth = 100.0f, - viewportHeight = 100.0f, + viewportHeight = 100.0f ).apply { // M0 50 C0 15 15 0 50 0 s50 15 50 50 -15 50 -50 50 S0 85 0 50 path( - fill = SolidColor(Color(0xFFCD201F)), + fill = SolidColor(Color(0xFFCD201F)) ) { // M 0 50 moveTo(x = 0.0f, y = 50.0f) @@ -38,33 +38,33 @@ val NewPipeSquircleIcon: ImageVector x2 = 15.0f, y2 = 0.0f, x3 = 50.0f, - y3 = 0.0f, + y3 = 0.0f ) // s 50 15 50 50 reflectiveCurveToRelative( dx1 = 50.0f, dy1 = 15.0f, dx2 = 50.0f, - dy2 = 50.0f, + dy2 = 50.0f ) // s -15 50 -50 50 reflectiveCurveToRelative( dx1 = -15.0f, dy1 = 50.0f, dx2 = -50.0f, - dy2 = 50.0f, + dy2 = 50.0f ) // S 0 85 0 50 reflectiveCurveTo( x1 = 0.0f, y1 = 85.0f, x2 = 0.0f, - y2 = 50.0f, + y2 = 50.0f ) } // M31.7 19.2 v61.7 l9.7 -5.73 V36 l23.8 14 -17.6 10.35 V71.5 L84 50 path( - fill = SolidColor(Color(0xFFFFFFFF)), + fill = SolidColor(Color(0xFFFFFFFF)) ) { // M 31.7 19.2 moveTo(x = 31.7f, y = 19.2f) @@ -91,7 +91,7 @@ val NewPipeSquircleIcon: ImageVector private fun IconPreview() { Image( imageVector = NewPipeSquircleIcon, - contentDescription = null, + contentDescription = null ) } diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenException.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenException.kt index 879f8f3e62e..683fd48b27b 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenException.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenException.kt @@ -6,8 +6,9 @@ class PoTokenException(message: String) : Exception(message) class BadWebViewException(message: String) : Exception(message) fun buildExceptionForJsError(error: String): Exception { - return if (error.contains("SyntaxError")) + return if (error.contains("SyntaxError")) { BadWebViewException(error) - else + } else { PoTokenException(error) + } } diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt index 44b7b79fb1a..53ae04a3c82 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt @@ -37,7 +37,9 @@ object PoTokenProviderImpl : PoTokenProvider { webViewBadImpl = true return null } + null -> throw e + else -> throw cause // includes PoTokenException } } @@ -58,7 +60,6 @@ object PoTokenProviderImpl : PoTokenProvider { webPoTokenGenerator!!.isExpired() if (shouldRecreate) { - val innertubeClientRequestInfo = InnertubeClientRequestInfo.ofWebClient() innertubeClientRequestInfo.clientInfo.clientVersion = YoutubeParsingHelper.getClientVersion() diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt index 9b4b500f09d..deeef613a83 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt @@ -16,14 +16,14 @@ import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.SingleEmitter import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.Instant import org.schabi.newpipe.BuildConfig import org.schabi.newpipe.DownloaderImpl -import java.time.Instant class PoTokenWebView private constructor( context: Context, // to be used exactly once only during initialization! - private val generatorEmitter: SingleEmitter, + private val generatorEmitter: SingleEmitter ) : PoTokenGenerator { private val webView = WebView(context) private val disposables = CompositeDisposable() // used only during initialization @@ -93,7 +93,7 @@ class PoTokenWebView private constructor( ), "text/html", "utf-8", - null, + null ) }, this::onInitializationErrorCloseAndCancel @@ -113,7 +113,7 @@ class PoTokenWebView private constructor( makeBotguardServiceRequest( "https://www.youtube.com/api/jnn/v1/Create", - "[ \"$REQUEST_KEY\" ]", + "[ \"$REQUEST_KEY\" ]" ) { responseBody -> val parsedChallengeData = parseChallengeData(responseBody) webView.evaluateJavascript( @@ -156,7 +156,7 @@ class PoTokenWebView private constructor( } makeBotguardServiceRequest( "https://www.youtube.com/api/jnn/v1/GenerateIT", - "[ \"$REQUEST_KEY\", \"$botguardResponse\" ]", + "[ \"$REQUEST_KEY\", \"$botguardResponse\" ]" ) { responseBody -> if (BuildConfig.DEBUG) { Log.d(TAG, "GenerateIT response: $responseBody") @@ -179,16 +179,15 @@ class PoTokenWebView private constructor( //endregion //region Obtaining poTokens - override fun generatePoToken(identifier: String): Single = - Single.create { emitter -> - if (BuildConfig.DEBUG) { - Log.d(TAG, "generatePoToken() called with identifier $identifier") - } - runOnMainThread(emitter) { - addPoTokenEmitter(identifier, emitter) - val u8Identifier = stringToU8(identifier) - webView.evaluateJavascript( - """try { + override fun generatePoToken(identifier: String): Single = Single.create { emitter -> + if (BuildConfig.DEBUG) { + Log.d(TAG, "generatePoToken() called with identifier $identifier") + } + runOnMainThread(emitter) { + addPoTokenEmitter(identifier, emitter) + val u8Identifier = stringToU8(identifier) + webView.evaluateJavascript( + """try { identifier = "$identifier" u8Identifier = $u8Identifier poTokenU8 = obtainPoToken(webPoSignalOutput, integrityToken, u8Identifier) @@ -200,10 +199,10 @@ class PoTokenWebView private constructor( $JS_INTERFACE.onObtainPoTokenResult(identifier, poTokenU8String) } catch (error) { $JS_INTERFACE.onObtainPoTokenError(identifier, error + "\n" + error.stack) - }""", - ) {} - } + }""" + ) {} } + } /** * Called by the JavaScript snippet from [generatePoToken] when an error occurs in calling the @@ -245,6 +244,7 @@ class PoTokenWebView private constructor( //endregion //region Handling multiple emitters + /** * Adds the ([identifier], [emitter]) pair to the [poTokenEmitters] list. This makes it so that * multiple poToken requests can be generated invparallel, and the results will be notified to @@ -283,6 +283,7 @@ class PoTokenWebView private constructor( //endregion //region Utils + /** * Makes a POST request to [url] with the given [data] by setting the correct headers. Calls * [onInitializationErrorCloseAndCancel] in case of any network errors and also if the response @@ -294,7 +295,7 @@ class PoTokenWebView private constructor( private fun makeBotguardServiceRequest( url: String, data: String, - handleResponseBody: (String) -> Unit, + handleResponseBody: (String) -> Unit ) { disposables.add( Single.fromCallable { @@ -306,7 +307,7 @@ class PoTokenWebView private constructor( "Accept" to listOf("application/json"), "Content-Type" to listOf("application/json+protobuf"), "x-goog-api-key" to listOf(GOOGLE_API_KEY), - "x-user-agent" to listOf("grpc-web-javascript/0.1"), + "x-user-agent" to listOf("grpc-web-javascript/0.1") ), data.toByteArray() ) @@ -363,6 +364,7 @@ class PoTokenWebView private constructor( companion object : PoTokenGenerator.Factory { private val TAG = PoTokenWebView::class.simpleName + // Public API key used by BotGuard, which has been got by looking at BotGuard requests private const val GOOGLE_API_KEY = "AIzaSyDyT5W0Jh49F30Pqqtyfdf7pDLFKLJoAnw" // NOSONAR private const val REQUEST_KEY = "O43z0dpjhgX20SCx4KAo" @@ -370,14 +372,13 @@ class PoTokenWebView private constructor( "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.3" private const val JS_INTERFACE = "PoTokenWebView" - override fun newPoTokenGenerator(context: Context): Single = - Single.create { emitter -> - runOnMainThread(emitter) { - val potWv = PoTokenWebView(context, emitter) - potWv.loadHtmlAndObtainBotguard(context) - emitter.setDisposable(potWv.disposables) - } + override fun newPoTokenGenerator(context: Context): Single = Single.create { emitter -> + runOnMainThread(emitter) { + val potWv = PoTokenWebView(context, emitter) + potWv.loadHtmlAndObtainBotguard(context) + emitter.setDisposable(potWv.disposables) } + } /** * Runs [runnable] on the main thread using `Handler(Looper.getMainLooper()).post()`, and @@ -385,7 +386,7 @@ class PoTokenWebView private constructor( */ private fun runOnMainThread( emitterIfPostFails: SingleEmitter, - runnable: Runnable, + runnable: Runnable ) { if (!Handler(Looper.getMainLooper()).post(runnable)) { emitterIfPostFails.onError(PoTokenException("Could not run on main thread")) diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt index a76c5c31aa6..c99e2f63970 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt +++ b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt @@ -53,8 +53,10 @@ class TimestampLongPressClickableSpan( when (relatedInfoService) { ServiceList.YouTube -> return relatedStreamUrl + "&t=" + timestampMatchDTO.seconds() + ServiceList.SoundCloud, ServiceList.MediaCCC -> return relatedStreamUrl + "#t=" + timestampMatchDTO.seconds() + ServiceList.PeerTube -> return relatedStreamUrl + "?start=" + timestampMatchDTO.seconds() } diff --git a/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java b/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java deleted file mode 100644 index 91b5ebd07d7..00000000000 --- a/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2018 Mauricio Colli - * CollapsibleView.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 . - */ - -package org.schabi.newpipe.views; - -import static org.schabi.newpipe.MainActivity.DEBUG; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.animation.ValueAnimator; -import android.content.Context; -import android.os.Parcelable; -import android.util.AttributeSet; -import android.util.Log; -import android.widget.LinearLayout; - -import androidx.annotation.IntDef; -import androidx.annotation.Nullable; - -import com.evernote.android.state.State; -import com.livefront.bridge.Bridge; - -import org.schabi.newpipe.ktx.ViewUtils; - -import java.lang.annotation.Retention; -import java.util.ArrayList; -import java.util.List; - -/** - * A view that can be fully collapsed and expanded. - */ -public class CollapsibleView extends LinearLayout { - private static final String TAG = CollapsibleView.class.getSimpleName(); - - private static final int ANIMATION_DURATION = 420; - - public static final int COLLAPSED = 0; - public static final int EXPANDED = 1; - - @State - @ViewMode - int currentState = COLLAPSED; - private boolean readyToChangeState; - - private int targetHeight = -1; - private ValueAnimator currentAnimator; - private final List listeners = new ArrayList<>(); - - public CollapsibleView(final Context context) { - super(context); - } - - public CollapsibleView(final Context context, @Nullable final AttributeSet attrs) { - super(context, attrs); - } - - public CollapsibleView(final Context context, @Nullable final AttributeSet attrs, - final int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public CollapsibleView(final Context context, final AttributeSet attrs, final int defStyleAttr, - final int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - /*////////////////////////////////////////////////////////////////////////// - // Collapse/expand logic - //////////////////////////////////////////////////////////////////////////*/ - - /** - * This method recalculates the height of this view so it must be called when - * some child changes (e.g. add new views, change text). - */ - public void ready() { - if (DEBUG) { - Log.d(TAG, getDebugLogString("ready() called")); - } - - measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), - MeasureSpec.UNSPECIFIED); - targetHeight = getMeasuredHeight(); - - getLayoutParams().height = currentState == COLLAPSED ? 0 : targetHeight; - requestLayout(); - broadcastState(); - - readyToChangeState = true; - - if (DEBUG) { - Log.d(TAG, getDebugLogString("ready() *after* measuring")); - } - } - - public void collapse() { - if (DEBUG) { - Log.d(TAG, getDebugLogString("collapse() called")); - } - - if (!readyToChangeState) { - return; - } - - final int height = getHeight(); - if (height == 0) { - setCurrentState(COLLAPSED); - return; - } - - if (currentAnimator != null && currentAnimator.isRunning()) { - currentAnimator.cancel(); - } - currentAnimator = ViewUtils.animateHeight(this, ANIMATION_DURATION, 0); - - setCurrentState(COLLAPSED); - } - - public void expand() { - if (DEBUG) { - Log.d(TAG, getDebugLogString("expand() called")); - } - - if (!readyToChangeState) { - return; - } - - final int height = getHeight(); - if (height == this.targetHeight) { - setCurrentState(EXPANDED); - return; - } - - if (currentAnimator != null && currentAnimator.isRunning()) { - currentAnimator.cancel(); - } - currentAnimator = ViewUtils.animateHeight(this, ANIMATION_DURATION, this.targetHeight); - setCurrentState(EXPANDED); - } - - public void switchState() { - if (!readyToChangeState) { - return; - } - - if (currentState == COLLAPSED) { - expand(); - } else { - collapse(); - } - } - - @ViewMode - public int getCurrentState() { - return currentState; - } - - public void setCurrentState(@ViewMode final int currentState) { - this.currentState = currentState; - broadcastState(); - } - - public void broadcastState() { - for (final StateListener listener : listeners) { - listener.onStateChanged(currentState); - } - } - - /** - * Add a listener which will be listening for changes in this view (i.e. collapsed or expanded). - * @param listener {@link StateListener} to be added - */ - public void addListener(final StateListener listener) { - if (listeners.contains(listener)) { - throw new IllegalStateException("Trying to add the same listener multiple times"); - } - - listeners.add(listener); - } - - /** - * Remove a listener so it doesn't receive more state changes. - * @param listener {@link StateListener} to be removed - */ - public void removeListener(final StateListener listener) { - listeners.remove(listener); - } - - /*////////////////////////////////////////////////////////////////////////// - // State Saving - //////////////////////////////////////////////////////////////////////////*/ - - @Nullable - @Override - public Parcelable onSaveInstanceState() { - return Bridge.saveInstanceState(this, super.onSaveInstanceState()); - } - - @Override - public void onRestoreInstanceState(final Parcelable state) { - super.onRestoreInstanceState(Bridge.restoreInstanceState(this, state)); - - ready(); - } - - /*////////////////////////////////////////////////////////////////////////// - // Internal - //////////////////////////////////////////////////////////////////////////*/ - - public String getDebugLogString(final String description) { - return String.format("%-100s → %s", - description, "readyToChangeState = [" + readyToChangeState + "], " - + "currentState = [" + currentState + "], " - + "targetHeight = [" + targetHeight + "], " - + "mW x mH = [" + getMeasuredWidth() + "x" + getMeasuredHeight() + "], " - + "W x H = [" + getWidth() + "x" + getHeight() + "]"); - } - - @Retention(SOURCE) - @IntDef({COLLAPSED, EXPANDED}) - public @interface ViewMode { } - - /** - * Simple interface used for listening state changes of the {@link CollapsibleView}. - */ - public interface StateListener { - /** - * Called when the state changes. - * - * @param newState the state that the {@link CollapsibleView} transitioned to,
- * it's an integer being either {@link #COLLAPSED} or {@link #EXPANDED} - */ - void onStateChanged(@ViewMode int newState); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt index 877070a916a..08b7df6af6a 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt @@ -52,8 +52,9 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : private var initTap: Boolean = false override fun onDoubleTapStarted(portion: DisplayPortion) { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onDoubleTapStarted called with portion = [$portion]") + } initTap = false @@ -64,7 +65,7 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : val shouldForward: Boolean = performListener?.getFastSeekDirection(portion)?.directionAsBoolean ?: return - if (DEBUG) + if (DEBUG) { Log.d( TAG, "onDoubleTapProgressDown called with " + @@ -72,6 +73,7 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : "wasForwarding = [$wasForwarding], " + "initTap = [$initTap], " ) + } /* * Check if a initial tap occurred or if direction was switched @@ -97,8 +99,9 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : } override fun onDoubleTapFinished() { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onDoubleTapFinished called with initTap = [$initTap]") + } if (initTap) performListener?.onDoubleTapEnd() initTap = false @@ -112,8 +115,10 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : clone(rootConstraintLayout) clear(secondsView.id, if (forward) START else END) connect( - secondsView.id, if (forward) END else START, - PARENT_ID, if (forward) END else START + secondsView.id, + if (forward) END else START, + PARENT_ID, + if (forward) END else START ) secondsView.startAnimation() applyTo(rootConstraintLayout) @@ -123,6 +128,7 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : interface PerformListener { fun onDoubleTap() fun onDoubleTapEnd() + /** * Determines if the playback should forward/rewind or do nothing. */ @@ -132,7 +138,7 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : enum class FastSeekDirection(val directionAsBoolean: Boolean?) { NONE(null), FORWARD(true), - BACKWARD(false); + BACKWARD(false) } } diff --git a/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt b/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt index 8472653fb97..5e4885129be 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt @@ -29,7 +29,9 @@ class SecondsView(context: Context, attrs: AttributeSet?) : LinearLayout(context var seconds: Int = 0 set(value) { binding.tvSeconds.text = context.resources.getQuantityString( - R.plurals.seconds, value, value + R.plurals.seconds, + value, + value ) field = value } diff --git a/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt b/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt index c2f9dc9b27a..c145b850640 100644 --- a/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt +++ b/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt @@ -1,13 +1,13 @@ package us.shandian.giga.get import android.os.Parcelable +import java.io.Serializable import kotlinx.parcelize.Parcelize import org.schabi.newpipe.extractor.MediaFormat import org.schabi.newpipe.extractor.stream.AudioStream import org.schabi.newpipe.extractor.stream.Stream import org.schabi.newpipe.extractor.stream.SubtitlesStream import org.schabi.newpipe.extractor.stream.VideoStream -import java.io.Serializable @Parcelize class MissionRecoveryInfo( @@ -25,16 +25,19 @@ class MissionRecoveryInfo( isDesired2 = false kind = 'a' } + is VideoStream -> { desired = stream.getResolution() isDesired2 = stream.isVideoOnly() kind = 'v' } + is SubtitlesStream -> { desired = stream.languageTag isDesired2 = stream.isAutoGenerated kind = 's' } + else -> throw RuntimeException("Unknown stream kind") } } @@ -48,14 +51,17 @@ class MissionRecoveryInfo( str.append("audio") info = "bitrate=$desiredBitrate" } + 'v' -> { str.append("video") info = "quality=$desired videoOnly=$isDesired2" } + 's' -> { str.append("subtitles") info = "language=$desired autoGenerated=$isDesired2" } + else -> { info = "" str.append("other") diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 803b8b33493..37768e16fb9 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -583,7 +583,7 @@ Serveri təsdiqləmək mümkün olmadı %s-də bəyəndiyiniz serverləri tapın Video \"Təfsilatlar\" səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər - Oynadıcı titr mətn miqyasını və arxa fon üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur + Oynadıcı titr mətn miqyasını və arxa plan üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur Xəta baş verdi: %1$s Fayl mövcud deyil, yaxud oxumaq və ya yazmaq icazəsi yoxdur Veb saytı təhlil etmək alınmadı diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 8732e45d975..ef7ef98c3d7 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -831,4 +831,5 @@ Трэнды – фільмы і перадачы Гэты кантэнт недаступны для цяперашняй краіны кантэнту.\n\nЯе можна змяніць праз «Налады > Кантэнт > Прадвызначаная краіна кантэнту». 21 ліпеня 2025 года YouTube спыніў падтрымку аб\'яднанай старонкі трэндаў. NewPipe замяніў старонку трэндаў на трэнды трансляцый.\n\nТаксама можна выбраць іншыя старонкі трэндаў праз «Налады > Кантэнт > Змесціва галоўнай старонкі». + Аб\'яднаныя трэнды YouTube выдалены diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index e6269b5b931..a79319ee35f 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -307,4 +307,8 @@ বিজ্ঞপ্তিতে প্রদর্শিত ভিডিও থাম্বনেল 16:9 থেকে 1:1 অনুপাতের করুন (বিকৃতি দেখা যেতে পারে) অদলবদল কিছু না + হ্যাঁ + না + সার্চ + খুঁজুন diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 46507e815df..81ad25358be 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -835,7 +835,7 @@ Beliebte Filme und Shows Beliebte Musik Beliebte Podcasts - YouTube hat den geteilten Feed entfernt + YouTube hat die kombinierten „beliebten Seiten“ entfernt YouTube hat die kombinierte Trending-Seite ab dem 21. Juli 2025 eingestellt. NewPipe hat die Standard-Trending-Seite durch die Trending-Livestreams ersetzt.\n\nDu kannst auch verschiedene Trendseiten unter „Einstellungen > Inhalt > Inhalt der Hauptseite“ auswählen. Um den Pop-up-Player zu verwenden, bitte in den folgenden Android-Einstellungen %1$s auswählen und %2$s aktivieren. „Über anderen Apps einblenden“ diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 71a2903d659..59e89fbe778 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -74,7 +74,7 @@ देखे गए वीडियोज़ की सूची रखें प्लेबैक फिर से शुरू करें रुकावटें (जैसे कि फ़ोन कॉल) खत्म होने के बाद वीडियो प्ले जारी रखें - \'अगले\' और \'सबंधित\' वीडियो दिखाएं + \'अगला\' और \'संबंधित\' वीडियो दिखाएं \"कतार में जोड़ने के लिए स्पर्श बनाये रखें\" दिखाएं जब बैकग्राउंड और पॉपअप बटन वीडियो के विवरण पन्ने में दबाई जाए तो सलाह दिखाएं असमर्थित URL @@ -93,7 +93,7 @@ बंद किया साफ करें उत्तम रिजॉल्युशन - वापिस + अन-डू करें सभी प्ले करें न्यूपाइप की नोटीफिकेशन न्यूपाइप के प्लेयर के लिए नोटीफिकेशन @@ -104,7 +104,7 @@ वैबसाइट parse नहीं हो सकी विषय वस्तु उपलब्ध नहीं है डाउनलोड मेनू स्थापित नहीं किया जा सका - APP/UI करैश हो गई + ऐप/UI करैश हो गई इस वीडियो को चलाने में असफल हुए अनचाही वीडियो प्लेयर त्रुटी आयी है वीडियो प्लेयर त्रुटी से ठीक हो रहा है @@ -391,7 +391,7 @@ प्लेबैक स्थानों को मिटाएं सारे प्लेबैक स्थानों को मिटाता है सारे प्लेबैक स्थानों को मिटाएं\? - निपटान के बाद खंड या गतिविधि जीवन चक्र के बाहर अविभाज्य आरएक्स अपवादों की रिपोर्टिंग को बलपूर्वक लागू करें + हैंडलिंग के बाद फ्रैगमेंट या एक्टिविटी लूप के बाहर अनहैंडल्ड Rx एक्सेप्शन की रिपोर्टिंग को बलपूर्वक लागू करें साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: \n \n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करें (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) @@ -406,7 +406,7 @@ ग्रिड ऑटो त्रुटि दिखाएं - सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, पुनः कोशिश करे @string/msg_threads = 1 के साथ + सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, @string/msg_threads = 1 के साथ पुनः कोशिश करें \'स्टोरेज एक्सेस फ्रेमवर्क\' आपको बाहरी एसडी कार्ड पर डाउनलोड करने देता है सेवा चुनें, वर्तमान चुनाव : डिफ़ॉल्ट कियोस्क @@ -502,7 +502,7 @@ अनगिनत विडीओज़ 100+ विडीओज़ विवरण - संबंधित स्ट्रीमस + संबंधित आइटम्स टिप्पणियाँ कृपया जांचें लें कि क्या आपके क्रैश पर चर्चा करने वाला मुद्दा पहले से मौजूद है। डुप्लिकेट टिकट बनाते समय, आप हमसे समय लेते हैं जो हम वास्तविक बग को ठीक करने के लिए खर्च कर सकते हैं। गिटहब पर रिपोर्ट करें @@ -826,4 +826,26 @@ चैनल समूह पेज पसंद यूट्यूब अस्थायी प्लेलिस्ट के रूप में साझा करें + एंटरी मिटा दी गई + फाईल डिलीट करें + एंटरी मिटाऐं + %sहज़ार + पॉपअप प्लेयर इस्तेमाल करने के लिए, कृपया नीचे दिए गए Android सेटिंग्स मेनू में %1$s चुनें और %2$s चालू करें। + “अन्य ऐप्स पर डिस्प्ले की अनुमति दें” + %sमिलीअन + %sअरब + अकाउंट बंद कर दिया गया\n\n%1$s यह कारण बताता है: %2$s + साउंडक्लाउड टॉप 50 पेज हटा दिया गया + साउंडक्लाउड ने ओरिजिनल टॉप 50 चार्ट बंद कर दिए हैं। इससे जुड़ा टैब आपके मेन पेज से हटा दिया गया है। + YouTube कंबाइंड ट्रेंडिंग हटा दी गई + YouTube ने 21 जुलाई 2025 से कंबाइंड ट्रेंडिंग पेज बंद कर दिया है। NewPipe ने डिफ़ॉल्ट ट्रेंडिंग पेज को ट्रेंडिंग लाइवस्ट्रीम से बदल दिया है।\n\nआप \"सेटिंग्स > कंटेंट > मेन पेज कंटेंट\" में अलग-अलग ट्रेंडिंग पेज भी चुन सकते हैं। + गेमिंग ट्रेंडस + ट्रेंडिंग पॉडकास्ट + ट्रेंडिंग फिल्में और शो + ट्रेंडिंग संगीत + पले करते समय सर्वर से HTTP error 403 मिला, शायद स्ट्रीमिंग URL एक्सपायर होने या IP बैन की वजह से हुआ + पले करते समय सर्वर से HTTP error %1$s मिला + पले करते समय सर्वर से HTTP error 403 मिला, जो शायद IP बैन या स्ट्रीमिंग URL डीओबफस्केशन की दिक्कतों की वजह से हुआ है + %1$s ने डेटा देने से मना कर दिया, और यह कन्फर्म करने के लिए लॉगिन मांगा कि रिक्वेस्ट करने वाला बोट नहीं है।\n\nहो सकता है कि %1$s ने आपके IP को कुछ समय के लिए बैन कर दिया हो, आप कुछ समय इंतज़ार कर सकते हैं या किसी दूसरे IP पर स्विच कर सकते हैं (जैसे VPN ऑन/ऑफ करके, या WiFi से मोबाइल डेटा पर स्विच करके)। + यह कंटेंट अभी चुने गए देश के कंटेंट के लिए उपलब्ध नहीं है।\n\n\"सेटिंग्स > कंटेंट > डिफ़ॉल्ट कंटेंट देश\" से अपना चुनाव बदलें। diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 19455df2daf..46e24d8124f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -816,7 +816,7 @@ Bejegyzés törölve Fiók megszüntetve\n\n%1$s az alábbi ok miatt: %2$s A lejátszás közben a kiszolgáló 403-as HTTP-hibát adott vissza, valószínűleg a közvetítési hivatkozás érvényessége lejárt vagy a IP-tiltás miatt - HTTP-hiba %1$s érkezett a kiszolgáltól a lejátszás közben + HTTP-hiba (%1$s) érkezett a kiszolgálótól a lejátszás során HTTP 403-as hiba érkezett a kiszolgálótól a lejátszás közben, valószínűleg IP-tiltás vagy a közvetítési hivatkozás feloldási problémák miatt %1$s visszautasította az adatok szolgáltatását, és bejelentkezést kér annak megerősítésére, hogy a kérés nem robot által érkezik.\n\nElőfordulhat, hogy az IP-címét ideiglenesen letiltotta %1$s, várhat egy keveset, vagy váltson egy másik IP-címre (például VPN be-/kikapcsolásával, vagy Wi-Fi-ről mobiladat-forgalomra váltva). Ez a tartalom a jelenleg kiválasztott tartalom országában nem elérhető.\n\nVáltoztassa meg a „Beállítások > Tartalom >Tartalom alapértelmezett országa” menüpontban. diff --git a/app/src/main/res/values-lmo/strings.xml b/app/src/main/res/values-lmo/strings.xml index 6f681ac0888..80f3dd9c61c 100644 --- a/app/src/main/res/values-lmo/strings.xml +++ b/app/src/main/res/values-lmo/strings.xml @@ -1,4 +1,5 @@ Pigia la lente per inziaa. + Canai diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 45973c900bf..052ef0e7892 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -29,7 +29,7 @@ ਨਵਾਂ ਕੀ ਹੈ ਬੈਕਗ੍ਰਾਊਂਡ ਪੌਪ-ਅਪ - ਵਿੱਚ ਸ਼ਾਮਿਲ ਕਰੋ + ਦੇ ਵਿੱਚ ਜੋੜ੍ਹੋ ਵੀਡੀਓ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੁਣੋ @@ -93,7 +93,7 @@ ਬੰਦ ਕੀਤਾ ਸਾਫ ਕਰੋ ਵਧੀਆ ਰੈਜ਼ੋਲਿਊਸ਼ਨ - ਵਾਪਿਸ + ਅਣ-ਕੀਤਾ ਕਰੋ ਸਾਰੇ ਚਲਾਓ ਹਮੇਸ਼ਾਂ ਸਿਰਫ਼ ਇਸ ਬਾਰ @@ -184,8 +184,7 @@ ਕ੍ਰਿਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ… ਕਲਿਪ-ਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਹੋ ਗਿਆ ਹੈ ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ - ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ -\nਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ + ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ\nਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ 1 ਆਈਟਮ ਮਿਟਾਈ ਗਈ। ReCaptcha ਚੁਣੌਤੀ ReCaptcha ਚੁਣੌਤੀ ਲਈ ਬੇਨਤੀ @@ -278,36 +277,19 @@ ਪਿੱਛਲਾ ਐਕਸਪੋਰਟ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਐਕਸਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ - ਗੂਗਲ ਟੇਕਅਊਟ ਤੋਂ ਯੂਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ: -\n -\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s -\n2. ਮੰਗਣ ਤੇ ਆਪਣੇ ਖਾਤੇ \'ਚ ਲਾਗ-ਇਨ ਕਰੋ -\n3. ਕਲਿੱਕ ਕਰੋ \" All data incuded\" ਤੇ, ਫੇਰ \"Deselect all\" ਤੇ ਫੇਰ ਸਿਰਫ \"subscriprion\" ਚੁਣੋ ਅਤੇ \"OK\" ਕਰੋ -\n4. \"Next step\" ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਫੇਰ \"create export\" ਤੇ -\n5. ਡਾਊਨਲੋਡ ਬਟਨ ਦਿਖਾਈ ਦੇਣ ਤੇ ਇਸ ਤੇ ਕਲਿੱਕ ਕਰੋ।ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ) -\n6. ਥੱਲੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀ .zip ਫਾਈਲ ਚੁਣੋ -\n7. [ਜੇ .zip ਤੋਂ ਐਕਸਪੋਰਟ ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ] ਤਾਂ .csv ਫਾਈਲ ਐਕਸਟਰੈਕਟ ਕਰੋ (ਆਮ ਤੌਰ ਤੇ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), ਥੱਲੇ ਦਿੱਤੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਐਕਸਟਰੈਕਟ ਕੀਤੀ csv ਫਾਈਲ ਚੁਣੋ - URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ: -\n -\n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \"ਡੈਸਕਟਾਪ ਮੋਡ\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) -\n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s -\n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ -\n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ. + ਗੂਗਲ ਟੇਕਆਊਟ ਤੋਂ ਯੂਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ:\n\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s\n2. ਮੰਗਣ ਤੇ ਆਪਣੇ ਖਾਤੇ \'ਚ ਲਾਗ-ਇਨ ਕਰੋ\n3. ਕਲਿੱਕ ਕਰੋ \" All data incuded\" ਤੇ, ਫੇਰ \"Deselect all\" ਤੇ ਫੇਰ ਸਿਰਫ \"subscriprion\" ਚੁਣੋ ਅਤੇ \"OK\" ਕਰੋ\n4. \"Next step\" ਤੇ ਕਲਿੱਕ ਕਰੋ ਅਤੇ ਫੇਰ \"create export\" ਤੇ\n5. ਡਾਊਨਲੋਡ ਬਟਨ ਦਿਖਾਈ ਦੇਣ ਤੇ ਇਸ ਤੇ ਕਲਿੱਕ ਕਰੋ। ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ)\n6. ਥੱਲੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀ .zip ਫਾਈਲ ਚੁਣੋ\n7. [ਜੇ .zip ਤੋਂ ਐਕਸਪੋਰਟ ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ] ਤਾਂ .csv ਫਾਈਲ ਐਕਸਟਰੈਕਟ ਕਰੋ (ਆਮ ਤੌਰ ਤੇ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), ਥੱਲੇ ਦਿੱਤੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਐਕਸਟਰੈਕਟ ਕੀਤੀ csv ਫਾਈਲ ਚੁਣੋ + URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ: \n \n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \"ਡੈਸਕਟਾਪ ਮੋਡ\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) \n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s \n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ \n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ। ਤੁਹਾਡੀ ਆਈਡੀ, soundcloud.com/ਤੁਹਾਡੀ ਆਈਡੀ - ਯਾਦ ਰੱਖੋ ਕਿ ਇਸ ਕਾਰਜ ਨਾਲ ਡਾਟਾ ਖਪਤ ਹੋ ਸਕਦਾ ਹੈ। -\n -\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਯਾਦ ਰੱਖੋ ਕਿ ਇਸ ਕਾਰਜ ਨਾਲ ਡਾਟਾ ਖਪਤ ਹੋ ਸਕਦਾ ਹੈ।\n\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਪਲੇਅਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਤਾਲ ਪਿੱਚ ਅਲਹਿਦਾ ਕਰੋ (ਵਿਗਾੜ ਪੈ ਸਕਦਾ ਹੈ) ਕੀ ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੀ ਇੰਪੋਰਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\? ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ - ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ। -\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। + ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ।\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਪੜ੍ਹੋ - ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ। -\nਸਾਨੂੰ ਨੁਕਸ ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ। + ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ।\nਸਾਨੂੰ ਨੁਕਸ ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ। ਸਵੀਕਾਰ ਕਰੋ ਅਸਵੀਕਾਰ ਕੋਈ ਸੀਮਾ ਨਹੀਂ @@ -512,8 +494,7 @@ %d ਸਕਿੰਟ ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ - ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ, ਪਹਿਲਾਂ ਚਾਹੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। -\nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਮੋੜਿਆ ਜਾ ਸਕਣਾ! + ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ ਪਹਿਲਾਂ ਤੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। \nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਣਾ! ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ\? ਵੇਖੇ ਹੋਏ ਨੂੰ ਹਟਾਓ ਸਿਸਟਮ ਡਿਫ਼ਾਲਟ @@ -554,7 +535,7 @@ ਕੋਈ ਸਰੋਤਾ ਨਹੀਂ ਸੁਣ ਰਿਹਾ ਕੋਈ ਦਰਸ਼ਕ ਨਹੀਂ ਵੇਖ ਰਿਹਾ ਵੇਰਵਾ - ਸਬੰਧਤ ਨਗ + ਸਬੰਧਤ ਆਈਟਮਾਂ ਟਿੱਪਣੀਆਂ ਗਿਟਹੱਬ \'ਤੇ ਜਾ ਕੇ ਇਤਲਾਹ ਦਿਓ ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਵਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ @@ -820,8 +801,8 @@ ਸੈਕੰਡਰੀ ਅਸਥਾਈ ਯੂਟਿਊਬ ਪਲੇਲਿਸਟ ਵਜੋਂ ਸਾਂਝਾ ਕਰੋ ਪਲੇਲਿਸਟਾਂ - %1$s ਦੀ ਖੋਜ ਕਰੋ - %1$s (%2$s) ٪1$s ਦੀ ਖੋਜ ਕਰੋ + %1$s ਖੋਜੋ + %1$s (%2$s) ਖੋਜੋ ਫੀਡ ਗਰੁੱਪ ਚੁਣੋ ਅਜੇ ਤੱਕ ਕੋਈ ਫੀਡ ਗਰੁੱਪ ਨਹੀਂ ਬਣਾਇਆ ਗਿਆ ਚੈਨਲ ਗਰੁੱਪ ਪੰਨਾ @@ -830,4 +811,22 @@ ਐਂਟਰੀ ਮਿਟਾਓ ਖ਼ਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ\n\n%1$s ਇਹ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ: %2$s ਐਂਟਰੀ ਮਿਟਾ ਦਿੱਤੀ ਗਈ + ਪੌਪਅੱਪ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਦਿੱਤੇ Android ਸੈਟਿੰਗ ਮੀਨੂ ਵਿੱਚ %1$s ਚੁਣੋ ਅਤੇ %2$s ਨੂੰ ਇਨੇਬਲ ਕਰੋ। + \"ਹੋਰ ਐਪਾਂ ਉੱਤੇ ਡਿਸਪਲੇ ਦੀ ਆਗਿਆ ਦਿਓ\" + %sਹਜ਼ਾਰ + %sਮਿਲੀਅਨ + %sਅਰਬ + SoundCloud ਟੌਪ 50 ਪੰਨਾ ਹਟਾ ਦਿੱਤਾ ਗਿਆ + SoundCloud ਨੇ ਮੂਲ ਟੌਪ 50 ਚਾਰਟਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। ਸੰਬੰਧਿਤ ਟੈਬ ਨੂੰ ਤੁਹਾਡੇ ਮੁੱਖ ਪੰਨੇ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ। + YouTube ਸੰਯੁਕਤ ਰੁਝਾਨ ਹਟਾਇਆ ਗਿਆ + YouTube ਨੇ 21 ਜੁਲਾਈ 2025 ਤੋਂ ਸੰਯੁਕਤ \"ਰੁਝਾਨ ਵਿੱਚ\" ਪੰਨੇ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। NewPipe ਨੇ ਡਿਫ਼ਾਲਟ \"ਰੁਝਾਨ ਵਿੱਚ\" ਪੰਨੇ ਨੂੰ ਟ੍ਰੈਂਡਿੰਗ ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਹੈ।\n\nਤੁਸੀਂ \"ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ\" ਵਿੱਚ ਵੱਖ-ਵੱਖ ਟ੍ਰੈਂਡਿੰਗ ਪੰਨਿਆਂ ਨੂੰ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ। + ਗੇਮਿੰਗ ਟ੍ਰੈਂਡਸ + ਟ੍ਰੈਂਡਿੰਗ ਪੌਡਕਾਸਟ + ਟਰੈਂਡਿੰਗ ਫ਼ਿਲਮਾਂ ਅਤੇ ਸ਼ੋਅ + ਟਰੈਂਡਿੰਗ ਸੰਗੀਤ + ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ ਸਟ੍ਰੀਮਿੰਗ URL ਦੀ ਮਿਆਦ ਪੁੱਗਣ ਜਾਂ IP ਦੀ ਪਾਬੰਦੀ ਕਾਰਨ ਹੋਈ ਹੈ + ਚਲਾਉਣ ਦੌਰਾਨ ਸਰਵਰ ਤੋਂ HTTP error %1$s ਪ੍ਰਾਪਤ ਹੋਇਆ + ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ IP ਬੈਨ ਜਾਂ ਸਟ੍ਰੀਮਿੰਗ URL ਡੀਔਬਫਸਕੇਸ਼ਨ ਸਮੱਸਿਆਵਾਂ ਕਾਰਨ ਹੋਈ ਹੈ + %1$s ਨੇ ਡੇਟਾ ਪ੍ਰਦਾਨ ਕਰਨ ਤੋਂ ਇਨਕਾਰ ਕਰ ਦਿੱਤਾ, ਅਤੇ ਇਹ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਲੌਗਇਨ ਕਰਨ ਲਈ ਕਿਹਾ ਕਿ ਬੇਨਤੀਕਰਤਾ ਬੋਟ ਨਹੀਂ ਹੈ।\n\nਹੋ ਸਕਦਾ ਹੈ ਕਿ %1$s ਨੇ ਤੁਹਾਡੇ IP ਨੂੰ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਈ ਹੋਵੇ, ਤੁਸੀਂ ਕੁਝ ਸਮਾਂ ਉਡੀਕ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਕਿਸੇ ਵੱਖਰੇ IP \'ਤੇ ਸਵਿੱਚ ਕਰ ਸਕਦੇ ਹੋ (ਉਦਾਹਰਣ ਵਜੋਂ VPN ਨੂੰ ਚਾਲੂ/ਬੰਦ ਕਰਕੇ, ਜਾਂ WiFi ਤੋਂ ਮੋਬਾਈਲ ਡੇਟਾ \'ਤੇ ਸਵਿੱਚ ਕਰਕੇ)। + ਇਹ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਚੁਣੇ ਗਏ ਦੇਸ਼ ਦੀ ਸਮੱਗਰੀ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।\n\n\"ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਡਿਫ਼ਾਲਟ ਸਮੱਗਰੀ ਦੇਸ਼\" ਤੋਂ ਆਪਣੀ ਚੋਣ ਬਦਲੋ। diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6b1a0acdda7..e3e08229b8e 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -45,7 +45,7 @@ Náhľad avataru uploadera Lajky Dislajky - Začnite klepnutím na lupu. + Začnite ťuknutím na lupu. Obsah Zobraziť vekovo obmedzený obsah Naživo @@ -74,7 +74,7 @@ Čakajte prosím… Skopírované do schránky Priečinok na sťahovanie zadefinujte prosím neskôr v nastaveniach - Sťahované súbory + Stiahnuté súbory Stiahnuté Hlásenie o chybe Aplikácia/UP zlyhalo @@ -208,7 +208,7 @@ Neplatný ZIP súbor Upozornenie: Nemožno importovať všetky súbory. Toto prepíše vaše aktuálne nastavenie. - Trendy + Populárne Top 50 Nové a horúce Odstrániť @@ -473,7 +473,7 @@ %d dní Skupiny kanálov - Zdroj naposledy aktualizovaný: %s + Zdroj aktualizovaný: %s Nenačítané: %d Načítavanie zdroja… Spracovávanie zdroja… @@ -843,10 +843,10 @@ SoundCloud prestal používať pôvodnú Top 50. Daná stránka bola odstránená z hlavnej stránky. Odstránené kombinované trendy na YouTube YouTube ukončil prevádzku kombinovanej stránky s trendmi k 21. júlu 2025. NewPipe nahradil predvolenú stránku s trendmi stránkou s trendovými živými prenosmi.\n\nV nastaveniach „Nastavenia > Obsah > Obsah hlavnej stránky“ môžete vybrať aj iné stránky s trendmi. - Ttendy v hrách - Trendové podcasty - Trendové filmy a seriály - Trendová hudba + Populárne hry + Populárne podcasty + Populárne filmy a seriály + Populárna hudba %stis. %smil. %smld. diff --git a/app/src/main/res/values-ti/strings.xml b/app/src/main/res/values-ti/strings.xml index 50a20f49462..ccce7352477 100644 --- a/app/src/main/res/values-ti/strings.xml +++ b/app/src/main/res/values-ti/strings.xml @@ -170,4 +170,19 @@ ሰሩዞ ስም ቀያር ስሕተት + መፍለዪ + ህዝባዊ + ብሕትነት + ፍቓድታት + ፍቓድ ኣንብብ + ምድብ + ፍቓድ + እዋናዊታት + ኣቫታራት + ባነራት + ዘይተዘርዘረ + ብሕታዊ + ውሽጣዊ + ተኸታተልቲ + መርበብ-ቦታ ክፈት diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index 727ce4df40a..6e8e2979b4b 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -62,7 +62,7 @@ app:useSimpleSummaryProvider="true" /> Unit) -> Unit, + runTest: (test: () -> Unit) -> Unit ) { val zipFile = File(classloader.getResource(filename)?.file!!) val zip = Mockito.mock(StoredFileHelper::class.java, Mockito.withSettings().stubOnly()) @@ -95,6 +95,7 @@ class ImportAllCombinationsTest { Mockito.verify(editor, Mockito.atLeastOnce()) .putInt(Mockito.anyString(), Mockito.anyInt()) } + Ser.VULNERABLE -> runTest { Assert.assertTrue(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip)) Assert.assertThrows(ClassNotFoundException::class.java) { @@ -104,6 +105,7 @@ class ImportAllCombinationsTest { Mockito.verify(editor, Mockito.never()).clear() Mockito.verify(editor, Mockito.never()).commit() } + Ser.NO -> runTest { Assert.assertFalse(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip)) Assert.assertThrows(IOException::class.java) { @@ -154,15 +156,18 @@ class ImportAllCombinationsTest { for (containsSer in Ser.entries) { for (containsJson in listOf(true, false)) { val filename = "settings/${if (containsDb) "db" else "nodb"}_${ - containsSer.id}_${if (containsJson) "json" else "nojson"}.zip" + containsSer.id}_${if (containsJson) "json" else "nojson"}.zip" testZipCombination(containsDb, containsSer, containsJson, filename) { test -> try { test() } catch (e: Throwable) { failedAssertions.add( FailData( - containsDb, containsSer, containsJson, - filename, e + containsDb, + containsSer, + containsJson, + filename, + e ) ) } @@ -175,7 +180,7 @@ class ImportAllCombinationsTest { for (a in failedAssertions) { println( "Assertion failed with containsDb=${a.containsDb}, containsSer=${ - a.containsSer}, containsJson=${a.containsJson}, filename=${a.filename}:" + a.containsSer}, containsJson=${a.containsJson}, filename=${a.filename}:" ) a.throwable.printStackTrace() println() diff --git a/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt index 6f6ba671edf..482b382375f 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt @@ -2,6 +2,17 @@ package org.schabi.newpipe.settings import android.content.SharedPreferences import com.grack.nanojson.JsonParser +import java.io.File +import java.io.ObjectInputStream +import java.nio.file.Paths +import java.util.zip.ZipFile +import kotlin.io.path.createTempDirectory +import kotlin.io.path.createTempFile +import kotlin.io.path.deleteIfExists +import kotlin.io.path.div +import kotlin.io.path.exists +import kotlin.io.path.fileSize +import kotlin.io.path.inputStream import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertThrows @@ -23,17 +34,6 @@ import org.schabi.newpipe.settings.export.BackupFileLocator import org.schabi.newpipe.settings.export.ImportExportManager import org.schabi.newpipe.streams.io.StoredFileHelper import us.shandian.giga.io.FileStream -import java.io.File -import java.io.ObjectInputStream -import java.nio.file.Paths -import java.util.zip.ZipFile -import kotlin.io.path.createTempDirectory -import kotlin.io.path.createTempFile -import kotlin.io.path.deleteIfExists -import kotlin.io.path.div -import kotlin.io.path.exists -import kotlin.io.path.fileSize -import kotlin.io.path.inputStream @RunWith(MockitoJUnitRunner::class) class ImportExportManagerTest { diff --git a/app/src/test/java/org/schabi/newpipe/util/LocalizationTest.kt b/app/src/test/java/org/schabi/newpipe/util/LocalizationTest.kt index ab639695160..081d1c545ef 100644 --- a/app/src/test/java/org/schabi/newpipe/util/LocalizationTest.kt +++ b/app/src/test/java/org/schabi/newpipe/util/LocalizationTest.kt @@ -1,12 +1,12 @@ package org.schabi.newpipe.util -import org.junit.Assert.assertEquals -import org.junit.Test -import org.ocpsoft.prettytime.PrettyTime import java.time.LocalDate import java.time.OffsetDateTime import java.time.ZoneOffset import java.util.Locale +import org.junit.Assert.assertEquals +import org.junit.Test +import org.ocpsoft.prettytime.PrettyTime class LocalizationTest { @Test(expected = NullPointerException::class) diff --git a/fastlane/metadata/android/bg/changelogs/63.txt b/fastlane/metadata/android/bg/changelogs/63.txt deleted file mode 100644 index be8865e6d33..00000000000 --- a/fastlane/metadata/android/bg/changelogs/63.txt +++ /dev/null @@ -1,8 +0,0 @@ -### Подобрения -- Импорт/ Експорт на настройки #1333 -- Редуциране на надхвърляне (подобрение на производителността) #1371 -- Малки подобрения в кода #1375 -- Добавяне на всичко за GDPR #1420 - -### Поправени -- Изтегляния: Поправен срив при зареждане на неприключени изтегляния от .giga файлове #1407 diff --git a/fastlane/metadata/android/cs/changelogs/1005.txt b/fastlane/metadata/android/cs/changelogs/1005.txt index 2059e43deea..e8efaffad69 100644 --- a/fastlane/metadata/android/cs/changelogs/1005.txt +++ b/fastlane/metadata/android/cs/changelogs/1005.txt @@ -1,17 +1,17 @@ -Novinky -• Přidána podpora pro Android Auto. -• Možnost nastavit skupiny kanálů jako záložky na hlavní obrazovce. -• [YouTube] Sdílení jako dočasný seznam skladeb. -• [SoundCloud] Záložka Oblíbené kanály +Nově +• Podpora pro Android Auto +• Možnost nastavit skupiny zdrojů jako záložky +• [YouTube] Sdílení jako dočasný playlist +• [SoundCloud] Záložka Oblíbené u kanálů Vylepšeno -• Lepší nápověda pro vyhledávací lištu -• Zobrazení data stažení v sekci Stažené soubory -• Použití jazyka Android 13 pro jednotlivé aplikace +• Lepší našeptávač vyhledávače +• Zobrazení data stažení ve Stažených +• Použití individuálního jazyka Opraveno • Oprava chybných barev textu v tmavém režimu -• [YouTube] Oprava seznamů skladeb, které nenačtou více než 100 položek +• [YouTube] Oprava nenačtení více než 100 položek v playlistech • [YouTube] Oprava chybějících doporučených videí -• Oprava pádů v zobrazení seznamu historie -• Oprava časových značek v odpovědích na komentáře +• Oprava pádů v Historii +• Oprava časů v odpovědích diff --git a/fastlane/metadata/android/cs/changelogs/1006.txt b/fastlane/metadata/android/cs/changelogs/1006.txt index 11a6f4ccafd..88c312e1430 100644 --- a/fastlane/metadata/android/cs/changelogs/1006.txt +++ b/fastlane/metadata/android/cs/changelogs/1006.txt @@ -4,13 +4,9 @@ Pokus o obnovení čekajících stahování, pokud to jde Možnost odstranění stahování bez smazání souboru Oprávnění Zobrazení přes ostatní aplikace: zobrazení vysvětlení pro Android > R Podpora odkazů on.soundcloud -Spousta malých vylepšení a optimalizací # Opravy Oprava formátování pro verze Androidu nižší než 7 Oprava falešných oznámení Opravy souborů titulků SRT Oprava spousty pádů - -# Vývoj -Interní modernizace kódu diff --git a/fastlane/metadata/android/de/changelogs/1006.txt b/fastlane/metadata/android/de/changelogs/1006.txt index 811138c0728..1a76b6f0efd 100644 --- a/fastlane/metadata/android/de/changelogs/1006.txt +++ b/fastlane/metadata/android/de/changelogs/1006.txt @@ -11,6 +11,3 @@ Kurzformatierung für Android-Versionen unter 7 Geisterbenachrichtigungen SRT-Untertiteldateien Zahlreiche Abstürze - -# Entwicklung -Modernisierung des internen Codes diff --git a/fastlane/metadata/android/de/changelogs/986.txt b/fastlane/metadata/android/de/changelogs/986.txt index 044365eb8bd..a1bc3217a94 100644 --- a/fastlane/metadata/android/de/changelogs/986.txt +++ b/fastlane/metadata/android/de/changelogs/986.txt @@ -1,16 +1,15 @@ -Neu: +Neu • Benachrichtigungen für neue Streams • Nahtloser Übergang zwischen Hintergrund- und Videoplayer -• Änderung der Tonhöhe um Halbtöne +• Ändern der Tonhöhe um Halbtöne • Warteschlange des Hauptplayers an Wiedergabeliste anfügen -Verbessert: -• Geschwindigkeit/Tonhöhenschrittgröße speichern +Verbessert +• Speichern der Geschwindigkeit/Tonhöhenschrittweite • Anfängliche lange Videoplayer-Pufferung verringert • Player-UI für Android TV -• Löschbestätigung für alle heruntergeladenen Dateien +• Löschbestätigung aller heruntergeladenen Dateien -Behoben: -• Medienschaltfläche blendet die Steuerelemente des Players nicht aus -• Rücksetzung der Wiedergabe bei Änderung des Playertyps -• Drehung des Wiedergabelisten-Dialogs +Behoben +• Medienschaltfläche blendet Player-Steuerelemente nicht aus +• … diff --git a/fastlane/metadata/android/de/changelogs/987.txt b/fastlane/metadata/android/de/changelogs/987.txt index f7bc9bd8040..a0304897389 100644 --- a/fastlane/metadata/android/de/changelogs/987.txt +++ b/fastlane/metadata/android/de/changelogs/987.txt @@ -1,12 +1,12 @@ -Neu: -• Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit der Wiedergabe, Korrekturen für PeerTube und SoundCloud, Wiedergabe von kürzlich beendeten YouTube-Livestreams -• Schaltfläche um entfernte Wiedergabeliste einer lokalen Wiedergabeliste hinzuzufügen -• Bildvorschau im Android 10+ Teilen-Dialog +Neu +• Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit bei Wiedergabe, Fehlerbehebungen für PeerTube/SoundCloud, Wiedergabe kürzlich beendeter YouTube-Livestreams +• Schaltfläche, um Remote-Wiedergabeliste einer Lokalen hinzuzufügen +• Bildvorschau im Teilen-Dialog von Android 10+ -Verbessert: +Verbessert • Wiedergabewerte-Dialog -• Import/Export-Schaltflächen für Abonnements in das Drei-Punkte-Menü verschoben +• Import/Export-Schaltflächen für Abos in Drei-Punkte-Menü verschoben -Behoben: -• Entfernung von vollständig angesehenen Videos aus der Wiedergabeliste -• Freigabemenü-Design und „Zur Wiedergabeliste hinzufügen“-Eintrag +Behoben +• Entfernen vollständig angesehener Videos aus Wiedergabeliste +• … diff --git a/fastlane/metadata/android/de/changelogs/997.txt b/fastlane/metadata/android/de/changelogs/997.txt index f55e72b053d..fbb5727d883 100644 --- a/fastlane/metadata/android/de/changelogs/997.txt +++ b/fastlane/metadata/android/de/changelogs/997.txt @@ -1,17 +1,16 @@ Neu • Antwort auf Kommentar • Wiedergabelisten umordnen -• Wiedergabelisten-Beschreibung und -Dauer +• Wiedergabelisten-Beschreibung/-Dauer • Rücksetzen der Einstellungen Verbessert -• [Android 13+] Wiederherstellen benutzerdef. Benachrichtigungsaktionen -• Zustimmung zur Update-Prüfung -• Während Pufferung Abspielen/Pause über Benachrichtigung -• Neuordnung einiger Einstellungen +• [Android 13+] Wiederherstellen benutzerd. Benachrichtigungsaktionen +• Zustimmung zur Updateprüfung +• Wiedergabe/Pause von Benachrichtigungen während Pufferung +• Neuanordnung einiger Einstellungen Behoben -• [YouTube] Kommentare wurden nicht geladen, weitere Korrekturen und Verbesserungen +• [YouTube] Kommentare wurden nicht geladen, weitere Fehlerbehebungen/Verbesserungen • Sicherheitslücke beim Einstellungsimport und Umstellung auf JSON -• Verschiedene Download-Korrekturen -• Suchtext gekürzt +• … diff --git a/fastlane/metadata/android/de/changelogs/999.txt b/fastlane/metadata/android/de/changelogs/999.txt index 51cf80d3eb2..059b4e0811e 100644 --- a/fastlane/metadata/android/de/changelogs/999.txt +++ b/fastlane/metadata/android/de/changelogs/999.txt @@ -4,9 +4,9 @@ Neu • [SoundCloud] Unterstützung für on.soundcloud.com-URLs hinzugefügt Verbessert -• [Bandcamp]Anzeige zusätzlicher Informationen im Radio-Kiosk +• [Bandcamp] Anzeige zusätzlicher Informationen im Radio-Kiosk Behoben -• [YouTube] Behebung gelegentlicher HTTP 403-Fehler am Anfang oder in der Mitte von Videos +• [YouTube] Behebung gelegentlicher HTTP-403-Fehler am Anfang oder in der Mitte von Videos • [YouTube] Extrahieren von Avataren und Banner aus mehr Kanal-Header-Typen • [Bandcamp] Verschiedene Fehler behoben und HTTPS wird stets verwendet diff --git a/fastlane/metadata/android/fr/changelogs/1000.txt b/fastlane/metadata/android/fr/changelogs/1000.txt index d4e706e2e0f..994b6061d41 100644 --- a/fastlane/metadata/android/fr/changelogs/1000.txt +++ b/fastlane/metadata/android/fr/changelogs/1000.txt @@ -1,13 +1,13 @@ -Amélioré -• Rendre la description de la playlist cliquable pour afficher plus / moins de contenu -• [PeerTube] Gérer automatiquement les liens d'instance `subscribeto.me` -• Ne commencer à lire qu'un seul élément dans l'écran d'historique +Améliorations +• La description de la playlist est désormais cliquable pour afficher plus ou moins de contenu. +• [PeerTube] Gestion automatique des liens d'instance `subscribeto.me` +• Lecture d'un seul élément à la fois depuis l'historique -Corrigé -• Correction de la visibilité du bouton RSS -• Correction des plantages de l'aperçu de la barre de recherche -• Correction de la mise en playlist d'un élément sans vignette -• Correction de la sortie de la boîte de dialogue de téléchargement avant qu'elle n'apparaisse -• Correction de la fenêtre contextuelle de mise en file d'attente de la liste des éléments associés -• Correction de l'ordre dans la boîte de dialogue d'ajout à la playlist -• Ajuster la disposition des éléments de signet de la playlist +Corrections +• Amélioration de la visibilité du bouton RSS +• Correction des plantages liés à l'aperçu de la barre de progression +• Correction de l'ajout d'un élément sans vignette à la playlist +• Correction de la fermeture prématurée de la boîte de dialogue de téléchargement +• Correction de la fenêtre contextuelle d'ajout à la file d'attente de la liste des éléments associés +• Amélioration de l'ordre d'affichage dans la boîte de dialogue « Ajouter à la playlist » +• Ajustement de la mise en page des signets de playlist diff --git a/fastlane/metadata/android/fr/changelogs/1003.txt b/fastlane/metadata/android/fr/changelogs/1003.txt index 161ee7fbb93..917714bae53 100644 --- a/fastlane/metadata/android/fr/changelogs/1003.txt +++ b/fastlane/metadata/android/fr/changelogs/1003.txt @@ -1,6 +1,6 @@ -Ceci est une version de correction qui résout les erreurs de YouTube : -• [YouTube] Correction du non-chargement des informations des vidéos, correction des erreurs HTTP 403 lors de la lecture des vidéos et restauration de la lecture de certaines vidéos à âge restreint -• Correction des tailles de sous-titres qui ne changent pas -• Correction du téléchargement des informations deux fois lors de l'ouverture d'un stream -• [Soundcloud] Suppression des streams protégés par DRM non lisibles -• Traductions mises à jour +Cette m.à.j corrective résout les problèmes suivants sur YouTube : +• [YouTube] Correction du problème de chargement des informations vidéo, des erreurs HTTP 403 lors de la lecture et restauration de la lecture de certaines vidéos à contenu restreint. +• Correction du problème d'affichage de la taille des sous-titres. +• Correction du double téléchargement des informations lors de l'ouverture d'un flux. +• [SoundCloud] Suppression des flux protégés par DRM et illisibles. +• Traductions mises à jour. diff --git a/fastlane/metadata/android/fr/changelogs/1005.txt b/fastlane/metadata/android/fr/changelogs/1005.txt index b7e5ff49f66..269ba210580 100644 --- a/fastlane/metadata/android/fr/changelogs/1005.txt +++ b/fastlane/metadata/android/fr/changelogs/1005.txt @@ -1,17 +1,17 @@ -Nouveau -• Prise en charge d'Android Auto +Nouveautés +• Ajout de la compatibilité avec Android Auto • Possibilité de définir des groupes de flux comme onglets de l'écran principal • [YouTube] Partager comme playlist temporaire -• [SoundCloud] Onglet « J'aime » +• [SoundCloud] Onglet « J'aime » sur les chaînes -Amélioration -• Amélioration des astuces de la barre de recherche +Améliorations +• Amélioration des suggestions de la barre de recherche • Affichage de la date de téléchargement dans Téléchargements • Utilisation de la langue par application d'Android 13 -Corrigé +Corrections • Correction des couleurs de texte défectueuses en mode sombre -• [YouTube] Correction des playlists ne chargeant pas plus de 100 éléments -• [YouTube] Correction des vidéos recommandées manquantes -• Correction des plantages dans la vue Historique +• [YouTube] Correction du chargement des playlists de plus de 100 éléments +• [YouTube] Correction de l'affichage des vidéos recommandées manquantes +• Correction des plantages dans l'historique • Correction des horodatages dans les réponses aux commentaires diff --git a/fastlane/metadata/android/fr/changelogs/1006.txt b/fastlane/metadata/android/fr/changelogs/1006.txt index a9ed2c642ed..65fbccfd537 100644 --- a/fastlane/metadata/android/fr/changelogs/1006.txt +++ b/fastlane/metadata/android/fr/changelogs/1006.txt @@ -1,17 +1,8 @@ -# Améliorations Conservation du lecteur en cours lors du clic sur les horodatages Tentative de récupération des téléchargements en attente Ajout d'une option pour supprimer un téléchargement sans supprimer le fichier Autorisation de superposition : affichage d'une boîte de dialogue explicative pour Android > R -Prise en charge de l'ouverture des liens .soundcloud -Nombreuses améliorations et optimisations mineures - -# Corrections Correction du formatage du nombre court pour les versions Android inférieures à 7 Correction des notifications fantômes Corrections pour les fichiers de sous-titres SRT -Correction de nombreux plantages - -# Développement -Modernisation du code interne diff --git a/fastlane/metadata/android/fr/changelogs/65.txt b/fastlane/metadata/android/fr/changelogs/65.txt index bb664a3cb18..9d06cac1711 100644 --- a/fastlane/metadata/android/fr/changelogs/65.txt +++ b/fastlane/metadata/android/fr/changelogs/65.txt @@ -1,26 +1,41 @@ ### Améliorations -- L'animation de l'icône du burgermenu a été désactivé #1486 -- Annulation de la suppression des téléchargements #1472 +- Désactivation de l'animation de l'icône du menu hamburger #1486 + +- Annulation de la suppression des téléchargements #1472 + - Option de téléchargement dans le menu de partage #1498 -- Ajout d'une option de partage dans le menu "long tap" #1454 -- Réduction du lecteur principal à la sortie #1354 -- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 -- Mise à jour de ExoPlayer 2.8.2 #1392 - - La boîte de dialogue de contrôle de la vitesse de lecture a été retravaillée pour prendre en charge différentes tailles de pas pour un changement de vitesse plus rapide. - - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). - - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. - - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. - - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. + +- Ajout de l'option de partage au menu contextuel (appui long) #1454 + +- Réduction du lecteur principal à la fermeture #1354 + +- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 + +- Mise à jour ExoPlayer 2.8.2 #1392 + +- Refonte de la boîte de dialogue de contrôle de la vitesse de lecture pour permettre des incréments différents et ainsi accélérer les changements de vitesse. + +- Ajout d'une option pour avancer rapidement pendant les silences dans le contrôle de la vitesse de lecture. Cette fonction devrait être utile pour les livres audio et certains genres musicaux, et peut offrir une expérience d'écoute parfaitement fluide (mais peut aussi perturber la lecture d'un morceau comportant de nombreux silences =\\). + +- Refonte de la résolution de la source multimédia pour permettre la transmission des métadonnées directement dans le lecteur, au lieu d'une saisie manuelle. Nous disposons désormais d'une source unique de métadonnées, directement disponible au démarrage de la lecture. - Correction du problème de mise à jour des métadonnées des listes de lecture distantes lors de la disponibilité de nouvelles métadonnées à l'ouverture d'un fragment de liste de lecture. + +- Diverses corrections d'interface utilisateur : #1383, les commandes de notification du lecteur en arrière-plan sont désormais toujours blanches, fermeture plus facile du lecteur contextuel par un mouvement brusque. + - Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. ### Corrections -- Correction #1440 Disposition des informations vidéo cassée #1491 -- Correction de l'historique des vues #1497 - - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. - - #1475, en enregistrant une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe sur le fragment de détail. -- Correction du timeout de la fenêtre en cas de mode popup. #1463 (Corrigé #640) -- Correction du lecteur vidéo principal #1509 - - Correction du mode répétition entraînant un NPE du lecteur lorsqu'une nouvelle intention est reçue alors que l'activité du lecteur est en arrière-plan. - - Correction de la réduction du lecteur en popup ne détruisant pas le lecteur lorsque la permission de popup n'est pas accordée. +- Correction du problème #1440 : affichage incorrect des informations vidéo. #1491 + +- Correction de l'historique de visionnage. #1497 + +- #1495 : mise à jour des métadonnées (miniature, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. + +- #1475 : enregistrement d'une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe dans le fragment de détails. + +- Correction du délai d'expiration de l'écran en mode contextuel. #1463 (Correction du problème #640) + +- Correction du lecteur vidéo principal. #1509 + +- [#1412] Correction du mode répétition provoquant une exception NullPointerException (NPE) du lecteur lors de la réception d'une nouvelle intention alors que l'activité du lecteur est en arrière-plan. - Correction d'un problème où la réduction du lecteur dans une fenêtre contextuelle ne détruisait pas le lecteur lorsque l'autorisation d'afficher la fenêtre contextuelle n'était pas accordée. diff --git a/fastlane/metadata/android/fr/changelogs/66.txt b/fastlane/metadata/android/fr/changelogs/66.txt index 33ba1fe2551..b6092f44f7a 100644 --- a/fastlane/metadata/android/fr/changelogs/66.txt +++ b/fastlane/metadata/android/fr/changelogs/66.txt @@ -1,28 +1,50 @@ +# Journal des modifications de la v0.13.7 + +### Corrigé +- Correction des problèmes de filtre de tri de la v0.13.6 + # Journal des modifications de la v0.13.6 ### Améliorations -- L'animation de l'icône du menu « hamburger » a été désactivée #1486 -- Annulation de la suppression des téléchargements #1472 +- Désactivation de l'animation de l'icône du menu hamburger #1486 + +- Annulation de la suppression des téléchargements #1472 + - Option de téléchargement dans le menu de partage #1498 -- Ajout d'une option de partage dans le menu "long tap" #1454 -- Réduction du lecteur principal à la sortie #1354 -- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 -- Mise à jour de ExoPlayer 2.8.2 #1392 - - La boîte de dialogue de contrôle de la vitesse de lecture a été retravaillée pour prendre en charge différentes tailles de pas pour un changement de vitesse plus rapide. - - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). - - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. - - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. - - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. + +- Ajout de l'option de partage au menu contextuel (appui long) #1454 + +- Réduction du lecteur principal à la fermeture #1354 + +- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 + +- Mise à jour ExoPlayer 2.8.2 #1392 + +- Refonte de la boîte de dialogue de contrôle de la vitesse de lecture pour permettre des incréments différents et ainsi accélérer les changements de vitesse. + +- Ajout d'une option pour avancer rapidement pendant les silences dans le contrôle de la vitesse de lecture. Ceci devrait être utile pour les livres audio et certains genres musicaux, et peut offrir une expérience d'écoute parfaitement fluide (mais peut aussi perturber une chanson avec de nombreux silences =\\). - Résolution de la source multimédia remaniée pour permettre la transmission interne des métadonnées au lecteur, au lieu d'une saisie manuelle. Les métadonnées proviennent désormais d'une source unique et sont directement disponibles au démarrage de la lecture. + +- Correction du problème de mise à jour des métadonnées des listes de lecture distantes lors de l'ouverture d'un fragment de liste de lecture, même lorsque de nouvelles métadonnées sont disponibles. + +- Diverses corrections d'interface : #1383, les commandes de notification du lecteur en arrière-plan sont désormais toujours blanches ; il est plus facile de fermer le lecteur contextuel en le faisant glisser. + - Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. ### Corrections -- Correction #1440 Disposition des informations vidéo cassée #1491 -- Correction de l'historique des vues #1497 - - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la playlist. - - #1475, en enregistrant une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe sur le fragment de détail. -- Correction du timeout de la fenêtre en cas de mode popup. #1463 (Corrigé #640) -- Correction du lecteur vidéo principal #1509 - - Correction du mode répétition entraînant un NPE du lecteur lorsqu'une nouvelle intention est reçue alors que l'activité du lecteur est en arrière-plan. - - Correction de la réduction du lecteur en popup ne détruisant pas le lecteur lorsque la permission de popup n'est pas accordée. +- Correction du problème #1440 : affichage incorrect des informations vidéo ; #1491 + +- Correction de l'historique de visionnage ; #1497 + +- #1495 : mise à jour des métadonnées (miniature, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. + +- #1475 : enregistrement d'une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe dans le fragment de détails. + +- Correction du délai d'expiration de l'écran en mode fenêtre contextuelle. #1463 (Correction de #640) + +- Correction du lecteur vidéo principal #1509 + +- [#1412] Correction du mode de répétition provoquant une exception de pointeur nul (NPE) du lecteur lors de la réception d'une nouvelle intention alors que l'activité du lecteur est en arrière-plan. + +- Correction du problème suivant : la réduction du lecteur dans une fenêtre contextuelle ne le détruisait pas lorsque l'autorisation d'ouvrir une fenêtre contextuelle n'était pas accordée. diff --git a/fastlane/metadata/android/fr/changelogs/68.txt b/fastlane/metadata/android/fr/changelogs/68.txt index b1735214aea..3c9c4446f48 100644 --- a/fastlane/metadata/android/fr/changelogs/68.txt +++ b/fastlane/metadata/android/fr/changelogs/68.txt @@ -1,31 +1,44 @@ -# Modifications v0.14.1 +# Modifications de la v0.14.1 -### Corrections -- Échec du décryptage de l'URL vidéo #1659 -- Lien de description, ne s'extrayait pas bien #1657 +### Corrigé +- Correction du problème de décryptage de l'URL vidéo (#1659) +- Correction du problème d'extraction du lien de description (#1657) -# Modifications v0.14.0 +# Modifications de la v0.14.0 -### Nouveautés -- Design du dossier #1461 -- Page d'accueil personnalisable #1461 +### Nouveau +- Nouveau design du tiroir (#1461) +- Nouvelle page d'accueil personnalisable (#1461) ### Améliorations -- Contrôles gestuels retravaillés #1604 -- Nouvelle façon de fermer le lecteur popup #1597 - -### Corrections -- Erreur lorsque le nombre d'abonnements n'est pas disponible. Ferme #1649. - - Affiche "le nombre d'abonnés non disponible" dans ces cas. -- NPE lorsqu'une playlist YouTube est vide. -- Kiosques dans SoundCloud -- Refactor et correction du bug #1623 -- Résultat de recherche cyclique #1562 -- Barre de recherche qui n'est pas mise en page de manière statique -- Vidéos YT Premium qui ne sont pas bloquées correctement -- Vidéos qui ne se chargent pas toujours (à cause du parsing DASH) -- Liens dans la description des vidéos -- Afficher un avertissement lorsque quelqu'un essaie de télécharger vers une carte SD externe -- Exception "rien indiqué" qui déclenche un rapport -- La vignette ne s'affiche pas dans le lecteur de fond pour Android 8.1 [voir ici](https://github.com/TeamNewPipe/NewPipe/issues/943) -- Enregistrement du récepteur de diffusion. Ferme le dossier #1641. +- Refonte des commandes gestuelles (#1604) +- Nouvelle méthode pour fermer le lecteur pop-up (#1597) + +### Corrigé +- Correction d'une erreur lorsque le nombre d'abonnements n'est pas disponible. Résout le problème n° 1649. + + - Afficher « Nombre d'abonnés indisponible » dans ces cas + +- Correction d'une exception NPE lorsqu'une playlist YouTube est vide + +- Correction rapide pour les bornes interactives sur SoundCloud + +- Refactorisation et correction du bug n° 1623 + +- Correction du résultat de recherche cyclique n° 1562 + +- Correction de la barre de progression (position statique) + +- Correction du blocage incorrect des vidéos YouTube Premium + +- Correction du chargement intempestif des vidéos (dû à l'analyse DASH) + +- Correction des liens dans la description des vidéos + +- Afficher un avertissement lors d'une tentative de téléchargement sur carte SD externe + +- Correction d'une exception déclenchant un rapport en cas d'absence d'affichage + +- Correction de l'affichage des miniatures dans le lecteur en arrière-plan sous Android 8.1 [voir ici](https://github.com/TeamNewPipe/NewPipe/issues/943) + +- Correction de l'enregistrement du récepteur de diffusion. Résout le problème n° 1641. diff --git a/fastlane/metadata/android/fr/changelogs/70.txt b/fastlane/metadata/android/fr/changelogs/70.txt index fccfccd2bfe..185f98f6957 100644 --- a/fastlane/metadata/android/fr/changelogs/70.txt +++ b/fastlane/metadata/android/fr/changelogs/70.txt @@ -1,4 +1,4 @@ -ATTENTION : Cette version est probablement un festival de bugs, tout comme la dernière. Cependant, en raison de la fermeture complète depuis la 17. une version cassée est mieux que pas de version. N'est-ce pas ? ¯\_(ツ)_/¯ +ATTENTION : Cette version est probablement un festival de bugs, tout comme la dernière. Cependant, en raison de la fermeture complète depuis la 17. une version cassée est mieux que pas de version. N'est-ce pas ? ¯\_(ツ)_/¯ ### Améliorations * Les fichiers téléchargés peuvent maintenant être ouverts en un seul clic. diff --git a/fastlane/metadata/android/fr/changelogs/750.txt b/fastlane/metadata/android/fr/changelogs/750.txt index 422529abf85..7273ae1f01a 100644 --- a/fastlane/metadata/android/fr/changelogs/750.txt +++ b/fastlane/metadata/android/fr/changelogs/750.txt @@ -1,22 +1,36 @@ -Nouveau -Reprise de lecture #2288 -• Reprise des flux où ils s'étaient arrêtés +Nouveautés + +Reprise de la lecture #2288 + +• Reprise des flux là où vous les avez interrompus Améliorations du téléchargeur #2149 -• Utilisation du Storage Access Framework pour stocker sur cartes SD + +• Utilisation de Storage Access Framework pour stocker les téléchargements sur des cartes SD externes + • Nouveau multiplexeur mp4 -• Peut changer le dossier de téléchargement -• Respect des réseaux tarifés +• Possibilité de modifier le répertoire de téléchargement avant de lancer un téléchargement + +• Respect des réseaux limités Améliorations + • Suppression des chaînes gema #2295 -• Gestion des changements de rotation #2444 -• Uniformisation des menus longue-pression #2368 + +• Gestion des changements de rotation (automatique) pendant le cycle de vie de l'activité #2444 + +• Harmonisation des menus accessibles par appui long #2368 Corrections -• Nom de la piste de sous-titres sélectionnée qui ne s'affiche pas #2394 -• Ne plante pas quand la vérification de la mise à jour de l'application échoue #2423 -• Téléchargements bloqués à 99,9 % #2440 -• Mise à jour des métadonnées de la file de lecture #2453 -• [SoundCloud] Ne plante pas lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Durée pas analysée TeamNewPipe/NewPipeExtractor#177 + +• Correction de l'affichage du nom de la piste de sous-titres sélectionnée #2394 + +• Correction du plantage en cas d'échec de la vérification des mises à jour de l'application (version GitHub) #2423 + +• Correction du blocage des téléchargements à 99,9 % #2440 + +• Mise à jour des métadonnées de la file d'attente de lecture #2453 + +• [SoundCloud] Correction du plantage lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 + +• [YouTube] Correction de l'impossibilité d'afficher la durée paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/hi/changelogs/1000.txt b/fastlane/metadata/android/hi/changelogs/1000.txt index 67a819e0f48..201a8a970a7 100644 --- a/fastlane/metadata/android/hi/changelogs/1000.txt +++ b/fastlane/metadata/android/hi/changelogs/1000.txt @@ -7,7 +7,3 @@ • RSS बटन दृश्यता को ठीक करें • सीकबार पूर्वावलोकन क्रैश को ठीक करें • थंबनेल-रहित आइटम को प्लेलिस्ट में डालना ठीक करें -• डाउनलोड डायलॉग के दिखाई देने से पहले बाहर निकलने को ठीक करें -• संबंधित आइटम सूची एनक्यू पॉपअप को ठीक करें -• प्लेलिस्ट में जोड़ें डायलॉग में क्रम को ठीक करें -• प्लेलिस्ट बुकमार्क आइटम लेआउट को समायोजित करें diff --git a/fastlane/metadata/android/hi/changelogs/1002.txt b/fastlane/metadata/android/hi/changelogs/1002.txt index d780f47a684..a0bc033fe3e 100644 --- a/fastlane/metadata/android/hi/changelogs/1002.txt +++ b/fastlane/metadata/android/hi/changelogs/1002.txt @@ -1,5 +1,4 @@ YouTube द्वारा कोई भी स्ट्रीम न चलाए जाने की समस्या को ठीक किया गया। यह रिलीज़ केवल सबसे ज़्यादा दबाव वाली त्रुटि को संबोधित करती है जो YouTube वीडियो विवरण को लोड होने से रोकती है। - हम जानते हैं कि अन्य समस्याएँ भी हैं, और हम जल्द ही उन्हें हल करने के लिए एक अलग रिलीज़ जारी करेंगे। diff --git a/fastlane/metadata/android/hi/changelogs/1004.txt b/fastlane/metadata/android/hi/changelogs/1004.txt index 071ab64e338..faf98d11649 100644 --- a/fastlane/metadata/android/hi/changelogs/1004.txt +++ b/fastlane/metadata/android/hi/changelogs/1004.txt @@ -1 +1,3 @@ -फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है +इस रिलीज़ में YouTube सिर्फ़ 360p स्ट्रीम दे रहा था, इसे ठीक किया गया है। + +ध्यान दें कि इस वर्शन में इस्तेमाल किया गया सॉल्यूशन शायद टेम्पररी है, और लंबे समय में SABR वीडियो प्रोटोकॉल को लागू करने की ज़रूरत है, लेकिन TeamNewPipe के सदस्य अभी बिज़ी हैं, इसलिए किसी भी मदद की बहुत तारीफ़ होगी! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/hi/changelogs/1005.txt b/fastlane/metadata/android/hi/changelogs/1005.txt index 495894e7641..4d72dc68f55 100644 --- a/fastlane/metadata/android/hi/changelogs/1005.txt +++ b/fastlane/metadata/android/hi/changelogs/1005.txt @@ -1,17 +1,15 @@ नया -+ • Android Auto के लिए समर्थन जोड़ें -+ • फ़ीड समूहों को मुख्य स्क्रीन टैब के रूप में सेट करने की अनुमति दें -+ • [YouTube] अस्थायी प्लेलिस्ट के रूप में साझा करें -+ • [SoundCloud] "पसंद" चैनल टैब जोङी गई +• Android Auto के लिए समर्थन जोड़ें +• फ़ीड समूहों को मुख्य स्क्रीन टैब के रूप में सेट करने की अनुमति दें +• [YouTube] अस्थायी प्लेलिस्ट के रूप में साझा करें +• [SoundCloud] "पसंद" चैनल टैब जोङी गई बेहतर किए -+ • खोज बार संकेत -+ • डाउनलोडस स्क्रीन में डाउनलोड की तारीख दिखाएं -+ • Android 13+ पर प्रति-ऐप भाषा का उपयोग करें +• खोज बार संकेत +• डाउनलोडस स्क्रीन में डाउनलोड की तारीख दिखाएं +• Android 13+ पर प्रति-ऐप भाषा का उपयोग करें फिक्स किए -+ • डार्क मोड में पाठ के रंग ठीक करें -+ • [YouTube] 100 से अधिक आइटम लोड नहीं करने वाली प्लेलिस्ट को ठीक करें -+ • [YouTube] अनुपलब्ध अनुशंसित वीडियो को ठीक करें -+ • इतिहास सूची दृश्य में क्रैश ठीक करें -+ • टिप्पणी के उत्तरों में टाइमस्टैम्प को ठीक करें +• डार्क मोड में पाठ के रंग ठीक करें +• [YouTube] 100 से अधिक आइटम लोड नहीं करने वाली प्लेलिस्ट को ठीक करें +• टिप्पणी के उत्तरों में टाइमस्टैम्प को ठीक करें diff --git a/fastlane/metadata/android/hi/changelogs/1006.txt b/fastlane/metadata/android/hi/changelogs/1006.txt new file mode 100644 index 00000000000..4545d60ed3d --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/1006.txt @@ -0,0 +1,10 @@ +# बेहतर किए +टाइमस्टैम्प पर क्लिक करते समय मौजूदा प्लेयर पर ही दिखाएं +जब हो सके तो पेंडिंग डाउनलोड मिशन को रिकवर करने की कोशिश करें +फ़ाइल डिलीट किए बिना डाउनलोड डिलीट करने का ऑप्शन जोड़ें +.soundcloud लिंक खोलने में सपोर्ट करें + +7 से कम Android वर्शन के लिए छोटे नंबर फ़ॉर्मेटिंग को ठीक किया गया +खाली नोटिफ़िकेशन को ठीक किया गया +SRT सबटाइटल फ़ाइलों के लिए ठीक किया गया +कई क्रैश ठीक किए गए diff --git a/fastlane/metadata/android/hi/changelogs/65.txt b/fastlane/metadata/android/hi/changelogs/65.txt index d2c2b8c71d7..d870f8d0317 100644 --- a/fastlane/metadata/android/hi/changelogs/65.txt +++ b/fastlane/metadata/android/hi/changelogs/65.txt @@ -1,26 +1,13 @@ ### सुधार -- बर्गरमेनू आइकन एनीमेशन को अक्षम करें #1486 -- डाउनलोड को पूर्ववत करें #1472 -- शेयर मेनू में डाउनलोड विकल्प #1498 -- लॉन्ग टैप मेनू में शेयर विकल्प जोड़ा गया #1454 -- बाहर निकलने पर मुख्य प्लेयर को छोटा करें #1354 -- लाइब्रेरी संस्करण अपडेट और डेटाबेस बैकअप फिक्स #1510 -- एक्सोप्लेयर 2.8.2 अपडेट #1392 -- तेज गति परिवर्तन के लिए विभिन्न चरण आकारों का समर्थन करने के लिए प्लेबैक गति नियंत्रण संवाद को फिर से तैयार किया गया। -- प्लेबैक गति नियंत्रण में मौन के दौरान तेजी से आगे बढ़ने के लिए एक टॉगल जोड़ा गया। यह ऑडियोबुक और कुछ संगीत शैलियों के लिए मददगार होना चाहिए, और एक सच्चा सहज अनुभव ला सकता है (और बहुत सारे मौन वाले गीत को तोड़ सकता है =\\)। -- मीडिया स्रोत रिज़ॉल्यूशन को फिर से तैयार किया गया ताकि प्लेयर में आंतरिक रूप से मीडिया के साथ मेटाडेटा को पास किया जा सके, बजाय मैन्युअल रूप से ऐसा करने के। अब हमारे पास मेटाडेटा का एक ही स्रोत है और प्लेबैक शुरू होने पर सीधे उपलब्ध है। -- जब प्लेलिस्ट का टुकड़ा खोला जाता है तो नया मेटाडेटा उपलब्ध होने पर रिमोट प्लेलिस्ट मेटाडेटा अपडेट नहीं होता है। -- विभिन्न UI फ़िक्सेस: #1383, बैकग्राउंड प्लेयर नोटिफिकेशन कंट्रोल अब हमेशा सफ़ेद रहता है, फ़्लिंगिंग के ज़रिए पॉपअप प्लेयर को बंद करना आसान है -- मल्टीसर्विस के लिए रीफ़ैक्टर्ड आर्किटेक्चर के साथ नए एक्सट्रैक्टर का उपयोग करें +- बर्गरमेनू आइकन एनिमेशन को डिसेबल करें #1486 +- डाउनलोड को अनडू करें #1472 +- शेयर मेनू में डाउनलोड ऑप्शन #1498 +- लॉन्ग टैप मेनू में शेयर ऑप्शन जोड़ा गया #1454 +- ExoPlayer 2.8.2 अपडेट #1392 +- कई UI फ़िक्स: #1383 -### फ़िक्सेस +### फ़िक्स -- फ़िक्स #1440 टूटी हुई वीडियो जानकारी लेआउट #1491 - व्यू हिस्ट्री फ़िक्स #1497 -- #1495, जैसे ही उपयोगकर्ता प्लेलिस्ट एक्सेस करता है मेटाडेटा (थंबनेल, शीर्षक और वीडियो काउंट) को अपडेट करके। -- #1475, जब उपयोगकर्ता डिटेल फ़्रैगमेंट पर बाहरी प्लेयर पर वीडियो शुरू करता है तो डेटाबेस में व्यू रजिस्टर करके। -- पॉपअप मोड के मामले में स्क्रीन टाइमआउट को ठीक करें। #1463 (फ़िक्स #640) -- मुख्य वीडियो प्लेयर फ़िक्स #1509 -- [#1412] प्लेयर गतिविधि के बैकग्राउंड में होने पर नया इंटेंट प्राप्त होने पर प्लेयर NPE का कारण बनने वाले रिपीट मोड को ठीक किया गया। -- पॉपअप के लिए प्लेयर को छोटा करने की सुविधा को ठीक किया गया, जब पॉपअप की अनुमति नहीं दी जाती है तो प्लेयर नष्ट नहीं होता है। +- #1495, जैसे ही यूज़र प्लेलिस्ट एक्सेस करता है, मेटाडेटा (थंबनेल, टाइटल और वीडियो काउंट) को अपडेट करके। diff --git a/fastlane/metadata/android/hi/changelogs/66.txt b/fastlane/metadata/android/hi/changelogs/66.txt index 30c20b0e8cb..e9ec1e3fa2a 100644 --- a/fastlane/metadata/android/hi/changelogs/66.txt +++ b/fastlane/metadata/android/hi/changelogs/66.txt @@ -1,33 +1,21 @@ -# Changelog of v0.13.7 +# v0.13.7 का चेंजलॉग -### Fixed -- Fix sort filter issues of v0.13.6 +### ठीक किया गया +- v0.13.6 के सॉर्ट फ़िल्टर की दिक्कतें ठीक की गईं -# Changelog of v0.13.6 +# v0.13.6 का चेंजलॉग -### Improvements +### सुधार -- Disable burgermenu icon animation #1486 -- undo delete of downloads #1472 -- Download option in share menu #1498 -- Added share option to long tap menu #1454 -- Minimize main player on exit #1354 -- Library version update and database backup fix #1510 -- ExoPlayer 2.8.2 Update #1392 - - Reworked the playback speed control dialog to support different step sizes for faster speed change. - - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). - - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. - - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. - - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging -- Use new extractor with refactored architecture for multiservice +- बर्गरमेनू आइकन एनिमेशन डिसेबल करें #1486 +- डाउनलोड को अनडू डिलीट करें #1472 +- शेयर मेनू में डाउनलोड ऑप्शन #1498 +- लॉन्ग टैप मेनू में शेयर ऑप्शन जोड़ा गया #1454 +- ExoPlayer 2.8.2 अपडेट #1392 +कई UI फ़िक्स: #1383 -### Fixes +### फ़िक्स -- Fix #1440 Broken Video Info Layout #1491 -- View history fix #1497 - - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. - - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. -- Fix creen timeout in case of popup mode. #1463 (Fixed #640) -- Main video player fix #1509 - - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. - - Fixed minimizing player to popup does not destroy player when popup permission is not granted. +- फ़िक्स #1440 टूटा हुआ वीडियो इन्फ़ो लेआउट #1491 +- व्यू हिस्ट्री फ़िक्स #1497 +- मेन वीडियो प्लेयर फिक्स #1509। diff --git a/fastlane/metadata/android/hi/changelogs/68.txt b/fastlane/metadata/android/hi/changelogs/68.txt index 238b1e0b18c..f0cc5bddb7f 100644 --- a/fastlane/metadata/android/hi/changelogs/68.txt +++ b/fastlane/metadata/android/hi/changelogs/68.txt @@ -1,31 +1,19 @@ -# changes of v0.14.1 +# v0.14.1 में बदलाव -### Fixed -- Fixed failed to decrypt video url #1659 -- Fixed description link not extract well #1657 +### ठीक किया गया +- वीडियो URL डिक्रिप्ट करने में फेल होना ठीक किया गया #1659 +- डिस्क्रिप्शन लिंक ठीक से एक्सट्रेक्ट नहीं हो रहा था, इसे ठीक किया गया #1657 -# changes of v0.14.0 +# v0.14.0 में बदलाव -### New -- New Drawer design #1461 -- New customizable front page #1461 +### नया +- नया ड्रॉअर डिज़ाइन #1461 +- नया कस्टमाइज़ेबल फ्रंट पेज #1461 -### Improvements -- Reworked Gesture controls #1604 -- New way to close the popup player #1597 +### सुधार +- पॉपअप प्लेयर बंद करने का नया तरीका #1597 -### Fixed -- Fix error when subscription count is not available. Closes #1649. - - Show "Subscriber count not available" in those cases -- Fix NPE when a YouTube playlist is empty -- Quick fix for the kiosks in SoundCloud -- Refactor and bugfix #1623 - - Fix Cyclic search result #1562 - - Fix Seek bar not statically lay outed - - Fix YT Premium video are not blocked correctly - - Fix Videos sometimes not loading (due to DASH parsing) - - Fix links in video description - - Show warning when someone tries to download to external sdcard - - fix nothing shown exception triggers report - - thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943) -- Fix registering of broadcast receiver. Closes #1641. +### ठीक किया गया +- जब YouTube प्लेलिस्ट खाली हो तो NPE को ठीक करें +- SoundCloud में कियोस्क के लिए क्विक फिक्स +- रीफैक्टर और बगफिक्स #1623। diff --git a/fastlane/metadata/android/hi/changelogs/69.txt b/fastlane/metadata/android/hi/changelogs/69.txt index c8262d1b0d7..8bdf96c8f99 100644 --- a/fastlane/metadata/android/hi/changelogs/69.txt +++ b/fastlane/metadata/android/hi/changelogs/69.txt @@ -1,19 +1,15 @@ -### New -- Long-tap delete and share in subscriptions #1516 -- Tablet UI and grid list layout #1617 +### नया +- सब्सक्रिप्शन में लंबे समय तक टैप करके डिलीट और शेयर करें #1516 +- टैबलेट UI और ग्रिड लिस्ट लेआउट #1617 -### Improvements -- store and reload the last used aspect ratio #1748 -- Enable linear layout in Downloads activity with full video names #1771 -- Delete and share subscriptions directly from within the subscriptions tab #1516 -- Enqueuing now triggers video playing if the play queue has already ended #1783 -- Separate settings for volume and brightness gestures #1644 -- Add support for Localization #1792 +### सुधार +- वॉल्यूम और ब्राइटनेस जेस्चर के लिए अलग सेटिंग्स #1644 +- लोकलाइज़ेशन के लिए सपोर्ट जोड़ें #1792 -### Fixes -- Fix time parsing for . format, so NewPipe can be used in Finland -- Fix subscription count -- Add foreground service permission for API 28+ devices #1830 +### सुधार +- . फ़ॉर्मेट के लिए टाइम पार्सिंग ठीक करें, ताकि फ़िनलैंड में NewPipe का इस्तेमाल किया जा सके +- सब्सक्रिप्शन काउंट ठीक करें +- API 28+ डिवाइस के लिए फ़ोरग्राउंड सर्विस परमिशन जोड़ें #1830 -### Known Bugs -- Playback state can not be saved on Android P +### जाने-पहचाने बग +- Android P पर प्लेबैक स्टेट सेव नहीं किया जा सकता diff --git a/fastlane/metadata/android/hi/changelogs/70.txt b/fastlane/metadata/android/hi/changelogs/70.txt index ad87a4409c5..cfa334bdba0 100644 --- a/fastlane/metadata/android/hi/changelogs/70.txt +++ b/fastlane/metadata/android/hi/changelogs/70.txt @@ -1,25 +1,11 @@ -ATTENTION: This version probably is a bugfest, just like the last one. However due to the full shutdown since the 17. a broken version is better then no version. Right? ¯\_(ツ)_/¯ +### सुधार +* डाउनलोड की गई फ़ाइलें अब एक क्लिक से खोली जा सकती हैं #1879 +* एंड्रॉयड 4.1 - 4.3 के लिए सपोर्ट हटा दिया गया #1884 +* पुराना प्लेयर हटाएँ #1884 +* मौजूदा प्ले क्यू से स्ट्रीम को दाईं ओर स्वाइप करके हटाएँ #1915 +* बहुत सारी डाउनलोड गड़बड़ियाँ ठीक करके सुधार किया गए -### Improvements -* downloaded files can now be opened with one click #1879 -* drop support for android 4.1 - 4.3 #1884 -* remove old player #1884 -* remove streams from current play queue by swiping them to the right #1915 -* remove auto queued stream when a new stream is enqueued manually #1878 -* Postprocessing for downloads and implement missing features #1759 by @kapodamy - * Post-processing infrastructure - * Proper error handling "infrastructure" (for downloader) - * Queue instead of multiple downloads - * Move serialized pending downloads (`.giga` files) to app data - * Implement max download retry - * Proper multi-thread download pausing - * Stop downloads when swicthing to mobile network (never works, see 2nd point) - * Save the thread count for next downloads - * A lot of incoherences fixed - -### Fixed -* Fix crash with default resolution set to best and limited mobile data resolution #1835 -* pop-up player crash fixed #1874 -* NPE when trying to open background player #1901 -* Fix for inserting new streams when auto queuing is enabled #1878 -* Fixed the decypering shuttown issue +### ठीक किया गया +* डिफ़ॉल्ट रिज़ॉल्यूशन को बेस्ट और लिमिटेड मोबाइल डेटा रिज़ॉल्यूशन पर सेट करने पर क्रैश को ठीक किया गया #1835 +* पॉप-अप प्लेयर क्रैश को ठीक किया गया #1874 +* बैकग्राउंड प्लेयर खोलने की कोशिश करते समय NPE #1901 diff --git a/fastlane/metadata/android/hi/changelogs/71.txt b/fastlane/metadata/android/hi/changelogs/71.txt index 5facfc05f3a..c9b9675b0f5 100644 --- a/fastlane/metadata/android/hi/changelogs/71.txt +++ b/fastlane/metadata/android/hi/changelogs/71.txt @@ -1,10 +1,7 @@ -### Improvements -* Add app update notification for GitHub build (#1608 by @krtkush) -* Various improvements to the downloader (#1944 by @kapodamy): - * add missing white icons and use hardcored way for change the icon colors - * check if the iterator is initialized (fixes #2031) - * allow retry downloads with "post-processing failed" error in the new muxer - * new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039) +### सुधार +* GitHub बिल्ड के लिए ऐप अपडेट नोटिफ़िकेशन जोड़ें (#1608 @krtkush द्वारा) +* डाउनलोडर में कई सुधार #1944 +* नया MPEG-4 म्यूक्सर नॉन-सिंक्रोनस वीडियो और ऑडियो स्ट्रीम को ठीक करता है (#2039) -### Fixed -* YouTube live streams stop playing after a short time (#1996 by @yausername) +### फिकसड +* YouTube लाइव स्ट्रीम थोड़े समय बाद चलना बंद हो जाती हैं (#1996 @yausername द्वारा) diff --git a/fastlane/metadata/android/hi/changelogs/740.txt b/fastlane/metadata/android/hi/changelogs/740.txt index c795978a894..9380af1b0c7 100644 --- a/fastlane/metadata/android/hi/changelogs/740.txt +++ b/fastlane/metadata/android/hi/changelogs/740.txt @@ -1,23 +1,12 @@ -

Improvements

+

सुधार

    -
  • make links in comments clickable, increase text size
  • -
  • seek on clicking timestamp links in comments
  • -
  • show preferred tab based on recently selected state
  • -
  • add playlist to queue when long clicking on 'Background' in playlist window
  • -
  • search for shared text when it is not an URL
  • -
  • add "share at current time" button to the main video player
  • -
  • add close button to main player when video queue is finished
  • -
  • add "Play directly in Background" to longpress menu for video list items
  • -
  • improve English translations for Play/Enqueue commands
  • -
  • small performance improvements
  • -
  • remove unused files
  • -
  • update ExoPlayer to 2.9.6
  • -
  • add support for Invidious links
  • -
-

Fixed

+
  • कमेंट्स में लिंक को क्लिक करने लायक बनाएं, टेक्स्ट का साइज़ बढ़ाएं
  • +
  • कमेंट्स में टाइमस्टैम्प लिंक पर क्लिक करने पर खोजें
  • +
  • जब शेयर किया गया टेक्स्ट URL न हो तो उसे खोजें
  • +
  • मेन वीडियो प्लेयर में "अभी के समय शेयर करें" बटन जोड़ें
  • +
  • ExoPlayer को 2.9.6 पर अपडेट करना
  • +

    फिकसड

    +
      -
    • fixed scroll w/ comments and related streams disabled
    • -
    • fixed CheckForNewAppVersionTask being executed when it shouldn't
    • -
    • fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title
    • -
    • fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading
    • +
    • गलत YouTube URL ठीक करें: सिग्नेचर टैग का नाम हमेशा "सिग्नेचर" नहीं होता, जिससे स्ट्रीम लोड नहीं हो पातीं
    diff --git a/fastlane/metadata/android/hi/changelogs/750.txt b/fastlane/metadata/android/hi/changelogs/750.txt index 39b77f7c346..13e9653113e 100644 --- a/fastlane/metadata/android/hi/changelogs/750.txt +++ b/fastlane/metadata/android/hi/changelogs/750.txt @@ -1,22 +1,13 @@ -New -Playback resume #2288 -• Resume streams where you stopped last time -Downloader Enhancements #2149 -• Use Storage Access Framework to store downloads on external SD-cards -• New mp4 muxer -• Optionally change the download directory before starting a download -• Respect metered networks +नया +प्लेबैक फिर से शुरू करें #2288 +• स्ट्रीम वहीं से फिर से शुरू करें जहाँ आपने पिछली बार रोका था +डाउनलोडर एन्हांसमेंट #2149 +• एक्सटर्नल SD-कार्ड पर डाउनलोड स्टोर करने के लिए स्टोरेज एक्सेस फ्रेमवर्क का इस्तेमाल करें +बेहतर +• एक्टिविटी लाइफसाइकल के दौरान (ऑटो) रोटेशन में बदलाव को हैंडल करें #2444 +• लॉन्ग-प्रेस मेनू को एक जैसा बनाएं #2368 -Improved -• Removed gema strings #2295 -• Handle (auto)rotation changes during activity lifecycle #2444 -• Make long-press menus consistent #2368 - -Fixed -• Fixed selected subtitle track name not being shown #2394 -• Do not crash when check for app update fails (GitHub version) #2423 -• Fixed downloads stuck at 99.9% #2440 -• Update play queue metadata #2453 -• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 +ठीक किया गया +• चुने हुए सबटाइटल ट्रैक का नाम नहीं दिखना ठीक किया गया #2394 +• 99.9% पर अटके डाउनलोड को ठीक किया गया #2440 diff --git a/fastlane/metadata/android/hi/changelogs/760.txt b/fastlane/metadata/android/hi/changelogs/760.txt index 6e000f6d9f0..c4b6d951ff7 100644 --- a/fastlane/metadata/android/hi/changelogs/760.txt +++ b/fastlane/metadata/android/hi/changelogs/760.txt @@ -1,43 +1,13 @@ -Changes in 0.17.1 +0.17.1 में बदलाव -New -• Thai localization +नया +• थाई लोकलाइज़ेशन +बेहतर +• प्लेलिस्ट के लिए लॉन्ग-प्रेस मेनू में फिर से 'यहाँ से प्ले करना शुरू करें' एक्शन जोड़ें #2518 +• SAF / लेगेसी फ़ाइल पिकर के लिए स्विच जोड़ें #2521 -Improved -• Add start playing here action in long-press menus for playlists again #2518 -• Add switch for SAF / legacy file picker #2521 - -Fixed -• Fix disappearing buttons in downloads view when switching apps #2487 -• Fix playback position is stored although watch history is disabled -• Fix reduced performance caused by playback position in list views #2517 -• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 -• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185 - - - -Changes in 0.17.0 - -New -Playback resume #2288 -• Resume streams where you stopped last time -Downloader Enhancements #2149 -• Use Storage Access Framework to store downloads on external SD-cards -• New mp4 muxer -• Optionally change the download directory before starting a download -• Respect metered networks - - -Improved -• Removed gema strings #2295 -• Handle (auto)rotation changes during activity lifecycle #2444 -• Make long-press menus consistent #2368 - -Fixed -• Fixed selected subtitle track name not being shown #2394 -• Do not crash when check for app update fails (GitHub version) #2423 -• Fixed downloads stuck at 99.9% #2440 -• Update play queue metadata #2453 -• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 +ठीक किया गया +• ऐप बदलते समय डाउनलोड व्यू में बटन गायब होने की समस्या ठीक करें #2487 +• लिस्ट व्यू में प्लेबैक पोज़िशन की वजह से परफॉर्मेंस में आई कमी को ठीक करें #2517 +• [एक्सट्रैक्टर] [YouTube] जब प्लेलिस्ट रिज़ल्ट में हों तो कैज़ुअल सर्च एरर को ठीक करें TeamNewPipe/NewPipeExtractor#185 diff --git a/fastlane/metadata/android/hi/changelogs/790.txt b/fastlane/metadata/android/hi/changelogs/790.txt index ec77b2acb0d..3b322f0afcd 100644 --- a/fastlane/metadata/android/hi/changelogs/790.txt +++ b/fastlane/metadata/android/hi/changelogs/790.txt @@ -1,14 +1,9 @@ -Improved -• Add more titles to improve accessibility for blind people #2655 -• Make language of download folder setting more consistent and less ambiguous #2637 +ठीक किया गया +• चेक करें कि ब्लॉक में आखिरी बाइट डाउनलोड हुआ है या नहीं #2646 +• वीडियो डिटेल फ़्रैगमेंट में स्क्रॉलिंग को ठीक किया गया #2672 +• [साउंडक्लाउड] client_id एक्सट्रैक्शन को ठीक करें #2745 -Fixed -• Check if last byte in the block is downloaded #2646 -• Fixed scrolling in video detail fragment #2672 -• Remove double search clear box animations to one #2695 -• [SoundCloud] Fix client_id extraction #2745 - -Development -• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535 -• Migrate to AndroidX #2685 -• Update to ExoPlayer 2.10.6 #2697, #2736 +डेवलपमेंट +• NewPipeExtractor से मिली गायब डिपेंडेंसी को NewPipe में जोड़ें #2535 +• AndroidX पर माइग्रेट करें #2685 +• ExoPlayer 2.10.6 पर अपडेट करें #2697, #2736 diff --git a/fastlane/metadata/android/hi/changelogs/800.txt b/fastlane/metadata/android/hi/changelogs/800.txt index 332b5c9946d..4df51808623 100644 --- a/fastlane/metadata/android/hi/changelogs/800.txt +++ b/fastlane/metadata/android/hi/changelogs/800.txt @@ -1,27 +1,10 @@ -New -• PeerTube support without P2P (#2201) [Beta]: - ◦ Watch and download videos from PeerTube instances - ◦ Add instances in the settings to access the complete PeerTube world - ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error. +नया +• P2P के बिना PeerTube सपोर्ट (#2201) [बीटा]: -• Downloader (#2679): - ◦ Calculate download ETA - ◦ Download opus (webm files) as ogg - ◦ Recover expired download links to resume downloads after a long pause +◦ लंबे समय तक रुकने के बाद डाउनलोड फिर से शुरू करने के लिए एक्सपायर हो चुके डाउनलोड लिंक रिकवर करें -Improved -• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742 -• Use new Localization and Downloader implementations from extractor #2713 -• Make "Default kiosk" string translatable -• Black navigation bar for black theme #2569 +बेहतर +• KioskFragment को पसंदीदा कंटेंट देश में होने वाले बदलावों के बारे में बताएं और सभी मेन टैब की परफॉर्मेंस को बेहतर बनाएं #2742 -Fixed -• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 -• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219 -• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances #2792 -• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217 -• [SoundCloud] Fix audio stream extraction - -Development -• Update ExoPlayer to 2.10.8 #2791, #2816 -• Update Gradle to 3.5.1 and add Kotlin support #2714 +फिक्स किया गया +• Android 4.4 डिवाइस (API 19/KitKat) पर TLS1.1/1.2 इनेबल करें diff --git a/fastlane/metadata/android/hi/changelogs/810.txt b/fastlane/metadata/android/hi/changelogs/810.txt index c75855fd18a..b3d4c7bd609 100644 --- a/fastlane/metadata/android/hi/changelogs/810.txt +++ b/fastlane/metadata/android/hi/changelogs/810.txt @@ -1,19 +1,11 @@ -New -• Show video thumbnail on the lock screen when playing in the background +नया +• बैकग्राउंड में चलने पर लॉक स्क्रीन पर वीडियो थंमनेल दिखाएं -Improved -• Add local playlist to queue when long pressing on background / popup button -• Make main page tabs scrollable and hide when there is only a single tab -• Limit amount of notification thumbnail updates in background player -• Add dummy thumbnail for empty local playlists -• Use *.opus file extension instead of *.webm and show "opus" in format label instead of "WebM Opus" in the download dropdown -• Add button to delete downloaded files or download history in "Downloads" -• [YouTube] Add support to /c/shortened_url channel links +बेहतर +• बैकग्राउंड / पॉपअप बटन पर देर तक दबाने पर लोकल प्लेलिस्ट को क्यू में जोड़ें +• [YouTube] /c/shortened_url चैनल लिंक के लिए सपोर्ट जोड़ें -Fixed -• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly -• Fixed player access out of its creation thread -• Fixed search result paging -• [YouTube] Fixed switching on null causing NPE -• [YouTube] Fixed viewing comments when opening an invidio.us url -• [SoundCloud] Updated client_id +फिकसड +• NewPipe पर वीडियो शेयर करते समय और सीधे उसकी स्ट्रीम डाउनलोड करते समय कई दिक्कतें ठीक की गईं +• सर्च रिज़ल्ट पेजिंग ठीक की गई +• [SoundCloud] client_id अपडेट किया गया diff --git a/fastlane/metadata/android/hi/changelogs/840.txt b/fastlane/metadata/android/hi/changelogs/840.txt index 95dc80844c8..5be8a866089 100644 --- a/fastlane/metadata/android/hi/changelogs/840.txt +++ b/fastlane/metadata/android/hi/changelogs/840.txt @@ -1,22 +1,10 @@ -New -• Added language selector to change the app language -• Added send to Kodi button to player collapsible menu -• Added ability to copy comments on long press +नया +• ऐप की भाषा बदलने के लिए भाशा सिलेक्टर जोड़ा गया +• प्लेयर कोलैप्सिबल मेनू में कोडी को भेजें बटन जोड़ा गया +• देर तक दबाने पर कमेंट्स कॉपी करने की सुविधा जोड़ी गई -Improved -• Fix ReCaptcha activity and correctly save obtained cookies -• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings -• Ask for display over other apps permission in settings correctly on Android 6 and later -• Rename local playlist by long-clicking in BookmarkFragment -• Various PeerTube improvements -• Improved several English source strings +बेहतर +• ReCaptcha एक्टिविटी को ठीक किया गया और मिली हुई कुकीज़ को सही ढंग से सेव किया गया -Fixed -• Fixed player starting again although it is paused when option "minimize on app switch" enabled and NewPipe is minimized -• Fix initial brightness value for gesture -• Fixed .srt subtitle downloads containing not all line breaks -• Fixed download to SD card failing because some Android 5 devices are not CTF compliant -• Fixed downloading on Android KitKat -• Fixed corrupt video .mp4 file being recognized as audio file -• Fixed multiple localization problems, including wrong Chinese language codes -• [YouTube] Timestamps in description are clickable again +ठीक किया गया +• Android KitKat पर डाउनलोडिंग ठीक की गई diff --git a/fastlane/metadata/android/hi/changelogs/930.txt b/fastlane/metadata/android/hi/changelogs/930.txt index b23b01ea8ce..457d1745be9 100644 --- a/fastlane/metadata/android/hi/changelogs/930.txt +++ b/fastlane/metadata/android/hi/changelogs/930.txt @@ -1,19 +1,13 @@ -New -• Search on YouTube Music -• Basic Android TV support +नया +• YouTube Music पर सर्च करें +• बेसिक Android TV सपोर्ट -Improved -• Added the ability to remove all watched videos from a local playlist -• Show message when content isn't supported yet instead of crashing -• Improved popup player resize with pinch gestures -• Enqueue streams on long press on background and popup buttons in channel -• Improved size handling of the drawer header title +बेहतर +• लोकल प्लेलिस्ट से सभी देखे गए वीडियो हटाने की सुविधा जोड़ी गई +• जब कंटेंट अभी सपोर्टेड न हो, तो क्रैश होने के बजाय मैसेज दिखाएं -Fixed -• Fixed age restricted content setting not working -• Fixed certain kinds of reCAPTCHAs -• Fixed crash when opening bookmarks while playlist is `null` -• Fixed detection of network related exceptions -• Fixed visibility of group sort button in the subscriptions fragment +फिकसड +• उम्र पर रोक वाली कंटेंट सेटिंग काम नहीं कर रही थी, इसे ठीक किया गया +• कुछ तरह के reCAPTCHA को ठीक किया गया -and more +और भी बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/940.txt b/fastlane/metadata/android/hi/changelogs/940.txt index f9530bc68c4..6f9253a2fc4 100644 --- a/fastlane/metadata/android/hi/changelogs/940.txt +++ b/fastlane/metadata/android/hi/changelogs/940.txt @@ -1,16 +1,14 @@ -New -• Add support for SoundCloud comments -• Add YouTube restricted mode setting -• Show PeerTube parent channel details +नया +• SoundCloud कमेंट्स के लिए सपोर्ट जोड़ें +• YouTube रेस्ट्रिक्टेड मोड सेटिंग जोड़ें +• PeerTube पेरेंट चैनल की डिटेल्स दिखाएँ -Improved -• Show Kore button only for supported services -• Block player gestures that begin at the NavigationBar or StatusBar -• Change retry & subscribe buttons background color based on service color +बेहतर +• सिर्फ़ सपोर्टेड सर्विसेज़ के लिए Kore बटन दिखाएँ -Fixed -• Fix download dialog freeze -• Open in browser button now really opens in browser -• Fix crash on opening videos and "Could not play this stream" +फिक्स किया गया +• डाउनलोड डायलॉग फ़्रीज़ होने की समस्या को ठीक करें +• ब्राउज़र में खोलें बटन अब सच में ब्राउज़र में खुलता है +• वीडियो खोलने पर क्रैश और "यह स्ट्रीम नहीं चला सका" -and more +और भी बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/951.txt b/fastlane/metadata/android/hi/changelogs/951.txt index e933e5cbd48..ffc1f8891e5 100644 --- a/fastlane/metadata/android/hi/changelogs/951.txt +++ b/fastlane/metadata/android/hi/changelogs/951.txt @@ -1,17 +1,13 @@ -New -• Add search for subscription picker in the feed group dialog -• Add filter to the feed group dialog to show only ungrouped subscriptions -• Add playlist tab to main page -• Fast forward/rewind in background/pop-up player queue -• Display search suggestion: did you mean & showing result for +नया +• फ़ीड ग्रुप डायलॉग में सब्सक्रिप्शन पिकर के लिए सर्च जोड़ें +• फ़ीड ग्रुप डायलॉग में फ़िल्टर जोड़ें ताकि सिर्फ़ अनग्रुप्ड सब्सक्रिप्शन दिखें +• मेन पेज पर प्लेलिस्ट टैब जोड़ें -Improved -• Drop writing application metadata in muxed files -• Do not remove failed streams from the queue -• Update status bar color to match toolbar color +बेहतर +• म्यूक्स की गई फ़ाइलों में एप्लीकेशन मेटाडेटा लिखना बंद करें +• फ़ेल स्ट्रीम को क्यू से न हटाएं -Fixed -• Fixed audio/video desync caused by floating point cumulative errors -• [PeerTube] Handle deleted comments +फिकसड +• फ़्लोटिंग पॉइंट क्यूमुलेटिव एरर के कारण होने वाले ऑडियो/वीडियो डीसिंक को ठीक किया गया -and more +और भी बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/995.txt b/fastlane/metadata/android/hi/changelogs/995.txt index 63ed335a4bf..7bd7341c23b 100644 --- a/fastlane/metadata/android/hi/changelogs/995.txt +++ b/fastlane/metadata/android/hi/changelogs/995.txt @@ -1,16 +1,14 @@ नया • चैनल टैब्स का समर्थन करें • छवि गुणवत्ता का चयन करें -• सभी छवियों के यूआरएल प्राप्त करें सुधार किए • प्लेयर इंटरफ़ेस की पहुंच • केवल-वीडियो डाउनलोड के लिए बेहतर ऑडियो चयन -• साझा प्लेलिस्ट सामग्री में प्लेलिस्ट और वीडियो नाम शामिल करने का विकल्प ठीक किए • [यूट्यूब] लाइक पाने की संख्या ठीक करें • पॉपअप और क्रैश पर प्रतिक्रिया नहीं देने वाले प्लेयर को ठीक करें • भाषा चयनकर्ता में गलत भाषाओं का चयन ठीक करें • प्लेयर ऑडियो फोकस म्यूट का सम्मान नहीं कर रहा था -• प्लेलिस्ट में आइटम जोड़ना कभी-कभी काम नहीं कर रहा था +• प्लेलिस्ट में आइटम ना जुड़ना ठीक किया diff --git a/fastlane/metadata/android/hi/changelogs/997.txt b/fastlane/metadata/android/hi/changelogs/997.txt index 652935884ef..b4781623196 100644 --- a/fastlane/metadata/android/hi/changelogs/997.txt +++ b/fastlane/metadata/android/hi/changelogs/997.txt @@ -6,12 +6,9 @@ सुधार • [एंड्रॉइड 13+] कस्टम अधिसूचना क्रियाएं पुनर्स्थापित करें -• अपडेटस की जांच के लिए सहमति का अनुरोध करें -• बफ़रिंग के दौरान नोटीफिकेशन से चलाने/रोकने की अनुमति दें • कुछ सेटिंग्स पुनः व्यवस्थित करें ठीक किए • [यूट्यूब] लोड न होने वाली टिप्पणियों को ठीक करें, साथ ही अन्य फिक्स और सुधार भी -• सेटिंग्स आयात में भेद्यता को हल करें और JSON पर स्विच करें • विभिन्न डाउनलोड सुधार • खोज पाठ को ट्रिम करें diff --git a/fastlane/metadata/android/hu/changelogs/1006.txt b/fastlane/metadata/android/hu/changelogs/1006.txt index 3d0cba88f4a..a5cbf76eb26 100644 --- a/fastlane/metadata/android/hu/changelogs/1006.txt +++ b/fastlane/metadata/android/hu/changelogs/1006.txt @@ -11,6 +11,3 @@ Számozás javítása Android 7 alatt Szellem értesítések javítása SRT felirat javítások Sok összeomlás javítva - -# Fejlesztés -Belső kód modernizálása diff --git a/fastlane/metadata/android/pa/changelogs/1000.txt b/fastlane/metadata/android/pa/changelogs/1000.txt index 90d70c151ca..ddc239f32f5 100644 --- a/fastlane/metadata/android/pa/changelogs/1000.txt +++ b/fastlane/metadata/android/pa/changelogs/1000.txt @@ -3,11 +3,9 @@ • [PeerTube] `subscribeto.me` ਇੰਸਟੈਂਸ ਲਿੰਕਾਂ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ ਹੈਂਡਲ ਕਰੋ • ਇਤਿਹਾਸ ਸਕਰੀਨ ਵਿੱਚ ਸਿਰਫ਼ ਸਿੰਗਲ ਆਈਟਮ ਨੂੰ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ -ਠੀਕ ਕਰਿਆ +ਫਿਕਸਡ • RSS ਬਟਨ ਦੀ ਦਿੱਖ ਨੂੰ ਠੀਕ ਕਰੋ • ਸੀਕਬਾਰ ਪੂਰਵਦਰਸ਼ਨ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਥੰਮਨੇਲ-ਰਹਿਤ ਆਈਟਮ ਦੀ ਪਲੇਲਿਸਟਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ -• ਡਾਉਨਲੋਡ ਡਾਇਲਾਗ ਦੇ ਦਿਸਣ ਤੋਂ ਪਹਿਲਾਂ ਇਸਨੂੰ ਬਾਹਰ ਕੱਢਣਾ ਠੀਕ ਕਰੋ -• ਸੰਬੰਧਿਤ ਆਈਟਮਾਂ ਦੀ ਸੂਚੀ ਐਨਕਿਊ ਪੌਪਅੱਪ ਨੂੰ ਠੀਕ ਕਰੋ -• ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਵਿੱਚ ਜੋੜਨ ਦਾ ਕ੍ਰਮ ਠੀਕ ਕਰੋ -• ਪਲੇਲਿਸਟ ਬੁੱਕਮਾਰਕ ਆਈਟਮ ਖਾਕਾ ਵਿਵਸਥਿਤ ਕਰੋ +• ਸੰਬੰਧਿਤ ਆਈਟਮਾਂ ਦੀ ਸੂਚੀ ਐਨਕਿਊ ਪੌਪ-ਅਪ ਨੂੰ ਠੀਕ ਕਰੋ +• ਅਤੇ ਹੋਰ ਪਲੇਲਿਸਟ ਤੇ ਡਾਊਨਲੋਡ ਸਬੰਧਤ ਫਿਕਸ diff --git a/fastlane/metadata/android/pa/changelogs/1004.txt b/fastlane/metadata/android/pa/changelogs/1004.txt index fe62a1330fe..6d3d23b2edc 100644 --- a/fastlane/metadata/android/pa/changelogs/1004.txt +++ b/fastlane/metadata/android/pa/changelogs/1004.txt @@ -1 +1,3 @@ -ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ +ਇਹ ਰੀਲੀਜ਼ ਸਿਰਫ਼ 360p ਸਟ੍ਰੀਮ ਪ੍ਰਦਾਨ ਕਰਨ ਵਾਲੇ YouTube ਨੂੰ ਠੀਕ ਕਰਦੀ ਹੈ। + +ਧਿਆਨ ਦਿਓ ਕਿ ਇਸ ਸੰਸਕਰਣ ਵਿੱਚ ਵਰਤਿਆ ਗਿਆ ਹੱਲ ਸੰਭਾਵਤ ਤੌਰ 'ਤੇ ਅਸਥਾਈ ਹੈ, ਅਤੇ ਲੰਬੇ ਸਮੇਂ ਵਿੱਚ SABR ਵੀਡੀਓ ਪ੍ਰੋਟੋਕੋਲ ਨੂੰ ਲਾਗੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ, ਪਰ TeamNewPipe ਮੈਂਬਰ ਇਸ ਸਮੇਂ ਰੁੱਝੇ ਹੋਏ ਹਨ ਇਸ ਲਈ ਕਿਸੇ ਵੀ ਮਦਦ ਦੀ ਬਹੁਤ ਪ੍ਰਸ਼ੰਸਾ ਕੀਤੀ ਜਾਵੇਗੀ! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/pa/changelogs/1005.txt b/fastlane/metadata/android/pa/changelogs/1005.txt index f1492a1acc9..982b092a4f7 100644 --- a/fastlane/metadata/android/pa/changelogs/1005.txt +++ b/fastlane/metadata/android/pa/changelogs/1005.txt @@ -1,17 +1,10 @@ ਨਵਾਂ -+ • Android Auto ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਿਲ ਕਰੋ -+ • ਫੀਡ ਗਰੁੱਪਾਂ ਨੂੰ ਮੁੱਖ ਸਕ੍ਰੀਨ ਟੈਬਾਂ ਵਜੋਂ ਸੈੱਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ -+ • [YouTube] ਅਸਥਾਈ ਪਲੇਲਿਸਟ ਦੇ ਵਜੋਂ ਸਾਂਝਾ ਕਰੋ -+ • [SoundCloud] "ਪਸੰਦ" ਚੈਨਲ ਟੈਬ ਜੋੜੀ ਗਈ - -ਬਿਹਤਰ ਕੀਤੇ -+ • ਖੋਜ ਬਾਰ ਸੰਕੇਤ -+ • ਡਾਊਨਲੋਡਸ ਸੂਚੀ ਵਿੱਚ ਡਾਊਨਲੋਡ ਤਾਰੀਖ ਦਿਖਾਓ -+ • ਐਂਡਰਾਇਡ 13+ 'ਤੇ ਪ੍ਰਤੀ ਐਪ ਭਾਸ਼ਾ ਦੀ ਵਰਤੋਂ ਕਰੋ +• Android Auto ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਿਲ ਕਰਨ ਸਮੇਤ YouTube ਲਈ ਅਸਥਾਈ ਪਲੇਲਿਸਟ ਵਜੋਂ ਸ਼ੇਅਰ ਫੰਕਸ਼ਨ ਤੇ SoundCloud ਲਈ ਲਾਈਕਸ ਚੈਨਲ ਟੈਬ ਨਵੀਂ ਐਡ ਕੀਤੀ +• ਫੀਡ ਗਰੁੱਪਾਂ ਨੂੰ ਮੁੱਖ ਸਕ੍ਰੀਨ ਟੈਬਾਂ ਵਜੋਂ ਸੈੱਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ ਦਰੁਸਤ ਕੀਤੇ -+ • ਡਾਰਕ ਥੀਮਾਂ 'ਤੇ ਟੈਕਸਟ ਰੰਗਾਂ ਨੂੰ ਠੀਕ ਕਰੋ -+ • [YouTube] ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਜੋ 100 ਤੋਂ ਵੱਧ ਆਈਟਮਾਂ ਲੋਡ ਨਹੀਂ ਕਰਦੀਆਂ -+ • [YouTube] ਸਿਫਾਰਸ਼ ਕੀਤੀਆਂ ਵੀਡੀਓਜ਼ ਦੀ ਅਣਉਪਲੱਬਧਤਾ ਨੂੰ ਠੀਕ ਕਰੋ -+ • ਇਤਿਹਾਸ ਸੂਚੀ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਕ੍ਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ -+ • ਟਿੱਪਣੀਆਂ ਦੇ ਜਵਾਬ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਡਾਰਕ ਥੀਮਾਂ 'ਤੇ ਟੈਕਸਟ ਰੰਗਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• [YouTube] ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਜੋ 100 ਤੋਂ ਵੱਧ ਆਈਟਮਾਂ ਲੋਡ ਨਹੀਂ ਕਰਦੀਆਂ +• [YouTube] ਸਿਫਾਰਸ਼ ਕੀਤੀਆਂ ਵੀਡੀਓਜ਼ ਦੀ ਅਣਉਪਲੱਬਧਤਾ ਨੂੰ ਠੀਕ ਕਰੋ +• ਟਿੱਪਣੀਆਂ ਦੇ ਜਵਾਬ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +ਪੂਰੇ ਬਦਲਾਵਾਂ ਵਾਸਤੇ ਗਿਟਹੱਬ ਤੇ dev ਸ਼ਾਖਾ ਟੈਗ ਅਨੁਸਾਰ ਬਦਲਾਅ ਵੇਖੋ diff --git a/fastlane/metadata/android/pa/changelogs/1006.txt b/fastlane/metadata/android/pa/changelogs/1006.txt new file mode 100644 index 00000000000..5046eaaa0cf --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/1006.txt @@ -0,0 +1,9 @@ +# ਸੁਧਾਰਿਆ ਗਿਆ +ਟਾਈਮਸਟੈਂਪਾਂ 'ਤੇ ਕਲਿੱਕ ਕਰਦੇ ਸਮੇਂ ਮੌਜੂਦਾ ਪਲੇਅਰ ਰੱਖੋ +ਜਦੋਂ ਸੰਭਵ ਹੋਵੇ ਤਾਂ ਬਕਾਇਆ ਡਾਊਨਲੋਡ ਮਿਸ਼ਨਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ +ਫਾਈਲ ਨੂੰ ਮਿਟਾਏ ਬਿਨਾਂ ਡਾਊਨਲੋਡ ਨੂੰ ਮਿਟਾਉਣ ਦਾ ਵਿਕਲਪ ਸ਼ਾਮਿਲ ਕਰੋ +on.soundcloud ਲਿੰਕ ਖੋਲ੍ਹਣ ਦਾ ਸਮਰਥਨ ਕਰੋ +7 ਤੋਂ ਘੱਟ ਐਂਡਰਾਇਡ ਸੰਸਕਰਣਾਂ ਲਈ ਛੋਟੀ ਗਿਣਤੀ ਫਾਰਮੈਟਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +ਖਾਲੀ ਨੋਟੀਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +SRT ਉਪਸਿਰਲੇਖ ਫਾਈਲਾਂ ਲਈ ਠੀਕ ਕੀਤਾ ਗਿਆ +ਬਹੁਤ ਸਾਰੇ ਕਰੈਸ਼ ਠੀਕ ਕੀਤੇ ਗਏ diff --git a/fastlane/metadata/android/pa/changelogs/65.txt b/fastlane/metadata/android/pa/changelogs/65.txt index 0fbf1147e25..0f7f8fe7d12 100644 --- a/fastlane/metadata/android/pa/changelogs/65.txt +++ b/fastlane/metadata/android/pa/changelogs/65.txt @@ -1 +1,13 @@ -### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। +### ਸੁਧਾਰ + +- ਬਰਗਰ ਮੀਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਅਯੋਗ ਕਰੋ #1486 +- ਡਾਊਨਲੋਡਸ ਨੂੰ ਅਨਡੂ ਕਰੋ #1472 +- ਸ਼ੇਅਰ ਮੀਨੂ ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ #1498 +- ਲੰਬੇ ਟੈਪ ਮੀਨੂ ਵਿੱਚ ਸਾਂਝਾ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #1454 +- ਐਕਸੋਪਲੇਅਰ 2.8.2 ਅਪਡੇਟ #1392 +- ਕਈ UI ਫਿਕਸ: #1383 + +### ਫਿਕਸ + +- ਵਿਊ ਹਿਸਟਰੀ ਫਿਕਸ #1497 +- #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। diff --git a/fastlane/metadata/android/pa/changelogs/66.txt b/fastlane/metadata/android/pa/changelogs/66.txt index aecf80cbcfb..f400eb13709 100644 --- a/fastlane/metadata/android/pa/changelogs/66.txt +++ b/fastlane/metadata/android/pa/changelogs/66.txt @@ -1 +1,21 @@ -# v0.13.7 ਦਾ ਚੇਂਜਲਾਗ ### ਸਥਿਰ - v0.13.6 ਦੇ ਕ੍ਰਮਬੱਧ ਫਿਲਟਰ ਮੁੱਦਿਆਂ ਨੂੰ ਠੀਕ ਕਰੋ # v0.13.6 ਦਾ ਚੇਂਜਲਾਗ ### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। +# v0.13.7 ਲਈ ਚੇਂਜਲੌਗ + +### ਫਿਕਸ +- v0.13.6 ਤੋਂ ਸੌਰਟ ਫਿਲਟਰ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਹੱਲ ਕੀਤੀਆਂ ਗਈਆਂ। + +# v0.13.6 ਲਈ ਚੇਂਜਲੌਗ + +### ਸੁਧਾਰ + +- ਬਰਗਰ ਮੀਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਯੋਗ ਕਰੋ +- ਡਾਊਨਲੋਡਸ ਨੂੰ ਮਿਟਾਓ ਨੂੰ ਅਣਡੂ ਕਰੋ #1472 +- ਸ਼ੇਅਰ ਮੀਨੂ ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ #1498 +- ਲੰਬੇ ਟੈਪ ਮੀਨੂ ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #1454 +- ਐਕਸੋਪਲੇਅਰ 2.8.2 ਅਪਡੇਟ #1392 +ਕਈ UI ਫਿਕਸ: #1383 + +### ਫਿਕਸ + +- ਫਿਕਸ ਕੀਤਾ ਗਿਆ #1440 ਟੁੱਟਿਆ ਹੋਇਆ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 +- ਇਤਿਹਾਸ ਦੇਖੋ ਫਿਕਸ #1497 +- ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509. diff --git a/fastlane/metadata/android/pa/changelogs/68.txt b/fastlane/metadata/android/pa/changelogs/68.txt index e8e54ea4f5e..7b98078dfe3 100644 --- a/fastlane/metadata/android/pa/changelogs/68.txt +++ b/fastlane/metadata/android/pa/changelogs/68.txt @@ -1 +1,19 @@ -v0.14.1 ਦੇ # ਬਦਲਾਅ ### ਸਥਿਰ - ਵੀਡੀਓ url #1659 ਨੂੰ ਡੀਕ੍ਰਿਪਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ - ਸਥਿਰ ਵਰਣਨ ਲਿੰਕ #1657 ਨੂੰ ਚੰਗੀ ਤਰ੍ਹਾਂ ਐਕਸਟਰੈਕਟ ਨਹੀਂ ਕਰਦਾ ਹੈ v0.14.0 ਦੀਆਂ # ਤਬਦੀਲੀਆਂ ### ਨਵਾਂ - ਨਵਾਂ ਦਰਾਜ਼ ਡਿਜ਼ਾਈਨ #1461 - ਨਵਾਂ ਅਨੁਕੂਲਿਤ ਫਰੰਟ ਪੇਜ #1461 ### ਸੁਧਾਰ - ਮੁੜ ਕੰਮ ਕੀਤਾ ਸੰਕੇਤ ਨਿਯੰਤਰਣ #1604 - ਪੌਪਅੱਪ ਪਲੇਅਰ #1597 ਨੂੰ ਬੰਦ ਕਰਨ ਦਾ ਨਵਾਂ ਤਰੀਕਾ ### ਸਥਿਰ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਉਪਲਬਧ ਨਾ ਹੋਣ 'ਤੇ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ। #1649 ਬੰਦ ਹੁੰਦਾ ਹੈ। - ਉਹਨਾਂ ਮਾਮਲਿਆਂ ਵਿੱਚ "ਗਾਹਕ ਗਿਣਤੀ ਉਪਲਬਧ ਨਹੀਂ" ਦਿਖਾਓ - YouTube ਪਲੇਲਿਸਟ ਖਾਲੀ ਹੋਣ 'ਤੇ NPE ਨੂੰ ਠੀਕ ਕਰੋ - SoundCloud ਵਿੱਚ ਕਿਓਸਕ ਲਈ ਤੁਰੰਤ ਫਿਕਸ - ਰਿਫੈਕਟਰ ਅਤੇ ਬੱਗਫਿਕਸ #1623 - ਚੱਕਰੀ ਖੋਜ ਨਤੀਜੇ #1562 ਨੂੰ ਠੀਕ ਕਰੋ - ਸੀਕ ਬਾਰ ਨੂੰ ਸਥਿਰ ਤੌਰ 'ਤੇ ਬਾਹਰ ਨਾ ਕੱਢੋ - ਫਿਕਸ YT ਪ੍ਰੀਮੀਅਮ ਵੀਡੀਓ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਬਲੌਕ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ - ਕਈ ਵਾਰ ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੇ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ (DASH ਪਾਰਸਿੰਗ ਦੇ ਕਾਰਨ) - ਵੀਡੀਓ ਵਰਣਨ ਵਿੱਚ ਲਿੰਕ ਫਿਕਸ ਕਰੋ - ਜਦੋਂ ਕੋਈ ਬਾਹਰੀ sdcard 'ਤੇ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦਾ ਹੈ ਤਾਂ ਚੇਤਾਵਨੀ ਦਿਖਾਓ - ਅਪਵਾਦ ਟਰਿੱਗਰ ਰਿਪੋਰਟ ਦਿਖਾਈ ਗਈ ਕੁਝ ਵੀ ਠੀਕ ਨਾ ਕਰੋ - ਐਂਡਰਾਇਡ 8.1 ਲਈ ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਨਹੀਂ ਦਿਖਾਇਆ ਗਿਆ [ਇੱਥੇ ਦੇਖੋ](https://github.com/TeamNewPipe/NewPipe/issues/943) - ਪ੍ਰਸਾਰਣ ਪ੍ਰਾਪਤ ਕਰਨ ਵਾਲੇ ਦੀ ਰਜਿਸਟਰੇਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ। #1641 ਬੰਦ ਹੁੰਦਾ ਹੈ। +# v0.14.1 ਵਿੱਚ ਬਦਲਾਅ + +### ਠੀਕ ਕੀਤਾ ਗਿਆ +- ਵੀਡੀਓ URL ਨੂੰ ਡੀਕ੍ਰਿਪਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲਤਾ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ #1659 +- ਵਰਣਨ ਲਿੰਕ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਐਕਸਟਰੈਕਟ ਨਾ ਕਰਨ ਦੀ ਸਮੱਸਿਆ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ #1657 + +# v0.14.0 ਵਿੱਚ ਬਦਲਾਅ + +### ਨਵਾਂ +- ਨਵਾਂ ਦਰਾਜ਼ ਡਿਜ਼ਾਈਨ #1461 +- ਨਵਾਂ ਅਨੁਕੂਲਿਤ ਫਰੰਟ ਪੇਜ #1461 + +### ਸੁਧਾਰ +- ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨ ਦਾ ਨਵਾਂ ਤਰੀਕਾ #1597 + +### ਠੀਕ ਕੀਤਾ ਗਿਆ +- YouTube ਪਲੇਲਿਸਟਾਂ ਖਾਲੀ ਹੋਣ 'ਤੇ NPE ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +- SoundCloud ਵਿੱਚ ਕਿਓਸਕ ਲਈ ਤੁਰੰਤ ਠੀਕ ਕੀਤਾ ਗਿਆ +- ਰੀਫੈਕਟਰ ਅਤੇ ਬੱਗਫਿਕਸ #1623. diff --git a/fastlane/metadata/android/pa/changelogs/69.txt b/fastlane/metadata/android/pa/changelogs/69.txt index b6358991b36..8956afb5472 100644 --- a/fastlane/metadata/android/pa/changelogs/69.txt +++ b/fastlane/metadata/android/pa/changelogs/69.txt @@ -1 +1,15 @@ -### ਨਵਾਂ - ਮਿਟਾਓ ਅਤੇ ਸਬਸਕ੍ਰਿਪਸ਼ਨ #1516 ਵਿੱਚ ਸਾਂਝਾ ਕਰੋ - ਟੈਬਲੇਟ UI ਅਤੇ ਗਰਿੱਡ ਸੂਚੀ ਖਾਕਾ #1617 ### ਸੁਧਾਰ - ਆਖਰੀ ਵਰਤੇ ਗਏ ਆਸਪੈਕਟ ਰੇਸ਼ੋ #1748 ਨੂੰ ਸਟੋਰ ਅਤੇ ਰੀਲੋਡ ਕਰੋ - ਪੂਰੇ ਵੀਡੀਓ ਨਾਮ #1771 ਦੇ ਨਾਲ ਡਾਊਨਲੋਡ ਗਤੀਵਿਧੀ ਵਿੱਚ ਲੀਨੀਅਰ ਲੇਆਉਟ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਟੈਬ #1516 ਦੇ ਅੰਦਰੋਂ ਸਿੱਧਾ ਗਾਹਕੀਆਂ ਨੂੰ ਮਿਟਾਓ ਅਤੇ ਸਾਂਝਾ ਕਰੋ - ਜੇਕਰ ਪਲੇ ਕਤਾਰ ਪਹਿਲਾਂ ਹੀ #1783 ਖਤਮ ਹੋ ਗਈ ਹੈ ਤਾਂ ਹੁਣ ਏਨਕਿਊ ਕਰਨਾ ਵੀਡੀਓ ਚਲਾਉਣ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ - ਵਾਲੀਅਮ ਅਤੇ ਚਮਕ ਸੰਕੇਤ #1644 ਲਈ ਵੱਖਰੀ ਸੈਟਿੰਗ - ਸਥਾਨਕਕਰਨ #1792 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ### ਫਿਕਸ - ਲਈ ਪਾਰਸਿੰਗ ਸਮਾਂ ਫਿਕਸ ਕਰੋ। ਫਾਰਮੈਟ, ਇਸ ਲਈ ਨਿਊ ਪਾਈਪ ਨੂੰ ਫਿਨਲੈਂਡ ਵਿੱਚ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ - API 28+ ਡਿਵਾਈਸਾਂ #1830 ਲਈ ਫੋਰਗਰਾਉਂਡ ਸੇਵਾ ਅਨੁਮਤੀ ਸ਼ਾਮਲ ਕਰੋ ### ਜਾਣੇ-ਪਛਾਣੇ ਬੱਗ - ਐਂਡ੍ਰਾਇਡ ਪੀ 'ਤੇ ਪਲੇਬੈਕ ਸਟੇਟ ਨੂੰ ਸੇਵ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ +### ਨਵਾਂ +- ਗਾਹਕੀਆਂ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਟੈਪ ਕਰਕੇ ਮਿਟਾਓ ਅਤੇ ਸਾਂਝਾ ਕਰੋ #1516 +- ਟੈਬਲੇਟ UI ਅਤੇ ਗਰਿੱਡ ਸੂਚੀ ਲੇਆਉਟ #1617 + +### ਸੁਧਾਰ +- ਵਾਲੀਅਮ ਅਤੇ ਚਮਕ ਸੰਕੇਤਾਂ ਲਈ ਵੱਖਰੀਆਂ ਸੈਟਿੰਗਾਂ #1644 +- ਸਥਾਨਕਕਰਨ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ #1792 + +### ਸੁਧਾਰ +- . ਫਾਰਮੈਟ ਲਈ ਸਮਾਂ ਪਾਰਸਿੰਗ ਠੀਕ ਕਰੋ ਤਾਂ ਜੋ ਫਿਨਲੈਂਡ ਵਿੱਚ ਨਿਊਪਾਈਪ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾ ਸਕੇ +- ਗਾਹਕੀ ਗਿਣਤੀ ਠੀਕ ਕਰੋ +- API 28+ ਡਿਵਾਈਸਾਂ ਲਈ ਫੋਰਗਰਾਉਂਡ ਸੇਵਾ ਅਨੁਮਤੀ ਸ਼ਾਮਲ ਕਰੋ #1830 + +### ਜਾਣੇ-ਪਛਾਣੇ ਬੱਗ +- ਪਲੇਬੈਕ ਸਥਿਤੀ ਨੂੰ ਐਂਡਰਾਇਡ ਪੀ 'ਤੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ diff --git a/fastlane/metadata/android/pa/changelogs/70.txt b/fastlane/metadata/android/pa/changelogs/70.txt index 97d781d4aac..bedc9149617 100644 --- a/fastlane/metadata/android/pa/changelogs/70.txt +++ b/fastlane/metadata/android/pa/changelogs/70.txt @@ -1 +1,10 @@ -ਧਿਆਨ ਦਿਓ: ਇਹ ਸੰਸਕਰਣ ਸ਼ਾਇਦ ਇੱਕ ਬੱਗਫੈਸਟ ਹੈ, ਬਿਲਕੁਲ ਪਿਛਲੇ ਇੱਕ ਵਾਂਗ। ਹਾਲਾਂਕਿ 17 ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਬੰਦ ਹੋਣ ਦੇ ਕਾਰਨ. ਇੱਕ ਟੁੱਟਿਆ ਹੋਇਆ ਸੰਸਕਰਣ ਕੋਈ ਸੰਸਕਰਣ ਨਾਲੋਂ ਬਿਹਤਰ ਹੈ. ਸਹੀ? ¯\_(ツ)_/¯ ### ਸੁਧਾਰ * ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਹੁਣ ਇੱਕ ਕਲਿੱਕ ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਸਕਦਾ ਹੈ #1879 * ਐਂਡਰਾਇਡ 4.1 - 4.3 #1884 ਲਈ ਸਹਾਇਤਾ ਛੱਡੋ * ਪੁਰਾਣੇ ਪਲੇਅਰ #1884 ਨੂੰ ਹਟਾਓ * ਮੌਜੂਦਾ ਪਲੇ ਕਤਾਰ ਤੋਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੱਜੇ #1915 'ਤੇ ਸਵਾਈਪ ਕਰਕੇ ਹਟਾਓ * ਆਟੋ ਕਤਾਰਬੱਧ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਓ ਜਦੋਂ ਇੱਕ ਨਵੀਂ ਸਟ੍ਰੀਮ ਹੱਥੀਂ ਕਤਾਰਬੱਧ ਹੁੰਦੀ ਹੈ #1878 * @kapodamy ਦੁਆਰਾ ਡਾਉਨਲੋਡ ਕਰਨ ਅਤੇ ਗੁੰਮ ਹੋਈਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ #1759 ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪੋਸਟ ਪ੍ਰੋਸੈਸਿੰਗ * ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਬੁਨਿਆਦੀ ਢਾਂਚਾ * "ਬੁਨਿਆਦੀ ਢਾਂਚੇ" ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਸਹੀ ਤਰੁੱਟੀ (ਡਾਊਨਲੋਡਰ ਲਈ) * ਮਲਟੀਪਲ ਡਾਉਨਲੋਡਸ ਦੀ ਬਜਾਏ ਕਤਾਰ * ਲੜੀਬੱਧ ਲੰਬਿਤ ਡਾਉਨਲੋਡਸ (`ਗੀਗਾ` ਫਾਈਲਾਂ) ਨੂੰ ਐਪ ਡੇਟਾ ਵਿੱਚ ਮੂਵ ਕਰੋ * ਅਧਿਕਤਮ ਡਾਊਨਲੋਡ ਦੀ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਨੂੰ ਲਾਗੂ ਕਰੋ * ਉਚਿਤ ਮਲਟੀ-ਥ੍ਰੈਡ ਡਾਊਨਲੋਡ ਵਿਰਾਮ * ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ 'ਤੇ ਜਾਣ ਵੇਲੇ ਡਾਊਨਲੋਡ ਬੰਦ ਕਰੋ (ਕਦੇ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ਦੂਜਾ ਪੁਆਇੰਟ ਦੇਖੋ) * ਅਗਲੇ ਡਾਉਨਲੋਡਸ ਲਈ ਥਰਿੱਡ ਗਿਣਤੀ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰੋ * ਬਹੁਤ ਸਾਰੀਆਂ ਅਸੰਗਤੀਆਂ ਹੱਲ ਕੀਤੀਆਂ ਗਈਆਂ ### ਸਥਿਰ * ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨਾਲ ਕਰੈਸ਼ ਨੂੰ ਬਿਹਤਰ ਅਤੇ ਸੀਮਤ ਮੋਬਾਈਲ ਡਾਟਾ ਰੈਜ਼ੋਲਿਊਸ਼ਨ #1835 'ਤੇ ਸੈੱਟ ਕਰੋ * ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਰੈਸ਼ ਫਿਕਸਡ #1874 * ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ #1901 ਨੂੰ ਖੋਲ੍ਹਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ NPE * ਜਦੋਂ ਆਟੋ ਕਤਾਰ ਯੋਗ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੰਮਿਲਿਤ ਕਰਨ ਲਈ ਠੀਕ ਕਰੋ #1878 * ਡੀਸਾਈਪਰਿੰਗ ਸ਼ੱਟਟਾਊਨ ਮੁੱਦੇ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ +ਸੁਧਾਰ +* ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਹੁਣ ਇੱਕ ਕਲਿੱਕ ਨਾਲ ਖੋਲ੍ਹੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ #1879 +* ਐਂਡਰਾਇਡ 4.1 - 4.3 ਲਈ ਡ੍ਰੌਪ ਸਪੋਰਟ #1884 +* ਪੁਰਾਣੇ ਪਲੇਅਰ ਨੂੰ ਹਟਾਓ #1884 +* ਮੌਜੂਦਾ ਪਲੇ ਕਤਾਰ ਤੋਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰਕੇ ਹਟਾਓ #1915 +* ਜਦੋਂ ਇੱਕ ਨਵੀਂ ਸਟ੍ਰੀਮ ਨੂੰ ਹੱਥੀਂ ਕਤਾਰਬੱਧ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਤਾਂ ਆਟੋ ਕਤਾਰਬੱਧ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਓ #1878 +* ਬਹੁਤ ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਅਸੰਗਤੀਆਂ ਠੀਕ ਕੀਤੀਆਂ ਗਈਆਂ + +ਫਿਕਸਡ +* ਬਹੁਤ ਸਾਰੀਆਂ ਅਸੰਗਤੀਆਂ ਠੀਕ ਕੀਤੀਆਂ ਗਈਆਂ diff --git a/fastlane/metadata/android/pa/changelogs/71.txt b/fastlane/metadata/android/pa/changelogs/71.txt index bafa26f8c3c..2f11dea8280 100644 --- a/fastlane/metadata/android/pa/changelogs/71.txt +++ b/fastlane/metadata/android/pa/changelogs/71.txt @@ -1 +1,8 @@ -### ਸੁਧਾਰ * GitHub ਬਿਲਡ ਲਈ ਐਪ ਅਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ (@krtkush ਦੁਆਰਾ #1608) * ਡਾਊਨਲੋਡਰ ਵਿੱਚ ਕਈ ਸੁਧਾਰ (@kapodamy ਦੁਆਰਾ #1944): * ਗੁੰਮ ਹੋਏ ਚਿੱਟੇ ਆਈਕਨ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਆਈਕਨ ਦੇ ਰੰਗਾਂ ਨੂੰ ਬਦਲਣ ਲਈ ਹਾਰਡਕੋਰਡ ਤਰੀਕੇ ਦੀ ਵਰਤੋਂ ਕਰੋ * ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਇਟਰੇਟਰ ਸ਼ੁਰੂ ਕੀਤਾ ਗਿਆ ਹੈ (ਫਿਕਸ #2031) * ਨਵੇਂ ਮੁਕਸਰ ਵਿੱਚ "ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਫੇਲ੍ਹ" ਗਲਤੀ ਦੇ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ * ਨਵਾਂ MPEG-4 ਮੁਕਸਰ ਫਿਕਸਿੰਗ ਗੈਰ-ਸਿੰਕਰੋਨਸ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮਜ਼ (#2039) ### ਸਥਿਰ * YouTube ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਥੋੜ੍ਹੇ ਸਮੇਂ ਬਾਅਦ ਚੱਲਣੀਆਂ ਬੰਦ ਹੋ ਜਾਂਦੀਆਂ ਹਨ (@yausername ਦੁਆਰਾ #1996) +ਸੁਧਾਰ +* GitHub ਬਿਲਡ ਲਈ ਐਪ ਅੱਪਡੇਟ ਸੂਚਨਾ ਸ਼ਾਮਲ ਕਰੋ (#1608 @krtkush ਦੁਆਰਾ) +* ਡਾਊਨਲੋਡਰ ਵਿੱਚ ਕਈ ਸੁਧਾਰ (#1944 @kapodamy ਦੁਆਰਾ) +* ਨਵੇਂ ਮਕਸਰ ਵਿੱਚ "ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਅਸਫਲ" ਗਲਤੀ ਨਾਲ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ +* ਨਵਾਂ MPEG-4 ਮਕਸਰ ਗੈਰ-ਸਮਕਾਲੀ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਠੀਕ ਕਰਦਾ ਹੈ (#2039) + +ਫਿਕਸਡ +* YouTube ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਥੋੜ੍ਹੇ ਸਮੇਂ ਬਾਅਦ ਚੱਲਣਾ ਬੰਦ ਕਰ ਦਿੰਦੀਆਂ ਹਨ (#1996 @yausername ਦੁਆਰਾ) diff --git a/fastlane/metadata/android/pa/changelogs/740.txt b/fastlane/metadata/android/pa/changelogs/740.txt index 6a2dbdc8601..62da0f9c3d9 100644 --- a/fastlane/metadata/android/pa/changelogs/740.txt +++ b/fastlane/metadata/android/pa/changelogs/740.txt @@ -1 +1,8 @@ -ਬਦਲਾਅ ਸੂਚੀ ਅਨੁਵਾਦ ਕਰਣਯੋਗ ਨਹੀਂ। ਬਿਲਕੁਲ ਬਕਵਾਸ +

    ਸੁਧਾਰ

    +
      +
    • ਟਿੱਪਣੀਆਂ ਵਿੱਚ ਲਿੰਕਾਂ ਨੂੰ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਬਣਾਓ, ਟੈਕਸਟ ਦਾ ਆਕਾਰ ਵਧਾਓ
    • +
    • ਟਿੱਪਣੀਆਂ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪ ਕੀਤੇ ਲਿੰਕਾਂ 'ਤੇ ਕਲਿੱਕ ਕੀਤੇ ਜਾਣ 'ਤੇ ਖੋਜ ਕਰੋ
    • +
    • ਜਦੋਂ ਸਾਂਝਾ ਕੀਤਾ ਟੈਕਸਟ URL ਨਾ ਹੋਵੇ ਤਾਂ ਖੋਜ ਕਰੋ
    • +
    • ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ "ਹੁਣੇ ਸਾਂਝਾ ਕਰੋ" ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ
    • +
    • ExoPlayer ਨੂੰ 2.9.6 'ਤੇ ਅੱਪਡੇਟ ਕਰਨਾ
    • +
    diff --git a/fastlane/metadata/android/pa/changelogs/750.txt b/fastlane/metadata/android/pa/changelogs/750.txt index 0b875b705e5..c24183ddb46 100644 --- a/fastlane/metadata/android/pa/changelogs/750.txt +++ b/fastlane/metadata/android/pa/changelogs/750.txt @@ -1 +1,9 @@ -ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 +ਨਵਾਂ +ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 +ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 +• ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ +• ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਊਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਬਦਲੋ +• ਮੀਟਰ ਕੀਤੇ ਨੈੱਟਵਰਕਾਂ ਦਾ ਸਤਿਕਾਰ ਕਰੋ + +ਸਥਿਰ +• [YouTube] ਸਥਿਰ ਮਿਆਦ ਨੂੰ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pa/changelogs/760.txt b/fastlane/metadata/android/pa/changelogs/760.txt index fd4b8f2a458..6279139d071 100644 --- a/fastlane/metadata/android/pa/changelogs/760.txt +++ b/fastlane/metadata/android/pa/changelogs/760.txt @@ -1 +1,10 @@ -0.17.1 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ • ਥਾਈ ਸਥਾਨਕਕਰਨ ਸੁਧਾਰ • ਦੁਬਾਰਾ #2518 ਪਲੇਲਿਸਟਾਂ ਲਈ ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਵਿੱਚ ਇੱਥੇ ਪਲੇ ਸ਼ੁਰੂ ਕਰੋ ਐਕਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ • SAF / ਪੁਰਾਤਨ ਫਾਈਲ ਪਿਕਰ #2521 ਲਈ ਸਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • ਐਪਸ #2487 ਨੂੰ ਬਦਲਦੇ ਸਮੇਂ ਡਾਊਨਲੋਡ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਬਟਨਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਫਿਕਸ ਪਲੇਬੈਕ ਸਥਿਤੀ ਸਟੋਰ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਹਾਲਾਂਕਿ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਅਯੋਗ ਹੈ • ਸੂਚੀ ਦ੍ਰਿਸ਼ #2517 ਵਿੱਚ ਪਲੇਬੈਕ ਸਥਿਤੀ ਦੇ ਕਾਰਨ ਘਟੇ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ • [ਐਕਸਟ੍ਰੈਕਟਰ] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 ਫਿਕਸ • [ਐਕਸਟ੍ਰੈਕਟਰ] [YouTube] ਜਦੋਂ ਪਲੇਲਿਸਟਾਂ ਨਤੀਜੇ ਵਿੱਚ ਹੋਣ ਤਾਂ ਆਮ ਖੋਜ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ TeamNewPipe/NewPipeExtractor#185 0.17.0 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 +0.17.1 ਵਿੱਚ ਬਦਲਾਅ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਪਲੇਲਿਸਟਾਂ ਲਈ ਦੁਬਾਰਾ ਲੰਬੇ-ਦਬਾਓ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਇੱਥੇ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ ਐਕਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ +• SAF / ਲੀਗੇਸੀ ਫਾਈਲ ਪਿਕਰ #2521 ਲਈ ਸਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ +ਫਿਕਸਡ +• ਐਪਸ ਨੂੰ ਸਵਿੱਚ ਕਰਦੇ ਸਮੇਂ ਡਾਊਨਲੋਡ ਵਿਊ ਵਿੱਚ ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਬਟਨਾਂ ਨੂੰ ਠੀਕ ਕਰੋ #2487 +• ਦੇਖਣ ਦੇ ਇਤਿਹਾਸ ਨੂੰ ਅਯੋਗ ਹੋਣ ਦੇ ਬਾਵਜੂਦ ਸਟੋਰ ਕੀਤੀ ਗਈ ਪਲੇਬੈਕ ਸਥਿਤੀ ਨੂੰ ਠੀਕ ਕਰੋ +• ਸੂਚੀ ਵਿਊ ਵਿੱਚ ਪਲੇਬੈਕ ਸਥਿਤੀ ਕਾਰਨ ਘਟੀ ਹੋਈ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ +• [ਐਕਸਟ੍ਰੈਕਟਰ] [YouTube] ਜਦੋਂ ਪਲੇਲਿਸਟਾਂ ਨਤੀਜਿਆਂ ਵਿੱਚ ਹੋਣ ਤਾਂ ਆਮ ਖੋਜ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/780.txt b/fastlane/metadata/android/pa/changelogs/780.txt index 999a244682b..923a0410ade 100644 --- a/fastlane/metadata/android/pa/changelogs/780.txt +++ b/fastlane/metadata/android/pa/changelogs/780.txt @@ -1 +1,11 @@ -0.17.3 ਵਿੱਚ ਬਦਲਾਅ ਸੁਧਾਰ • ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ #2550 ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਫਾਈਲ ਪਿਕਰ #2591 ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਡਾਇਰੈਕਟਰੀਆਂ ਦਿਖਾਓ • NewPipe #2488 ਨਾਲ ਖੋਲ੍ਹੇ ਜਾਣ ਵਾਲੇ `invidio.us` ਉਦਾਹਰਨਾਂ ਤੋਂ ਸਮਰਥਨ URL • `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • [YouTube] ਸਥਿਰ 'java.lang.IllegalArgumentException #192 • [YouTube] ਸਥਿਰ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀਆਂ TeamNewPipe/NewPipeExtractor#195 • ਇੱਕ ਸਟ੍ਰੀਮ #2592 ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਐਂਡਰੌਇਡ ਪਾਈ ਵਿੱਚ ਸਥਿਰ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆ +0.17.3 ਵਿੱਚ ਬਦਲਾਅ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #2550 +• ਫਾਈਲ ਚੋਣਕਾਰ #2591 ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਡਾਇਰੈਕਟਰੀਆਂ ਦਿਖਾਓ +• NewPipe #2488 ਨਾਲ ਖੋਲ੍ਹੇ ਜਾਣ ਵਾਲੇ `invidio.us` ਉਦਾਹਰਣਾਂ ਤੋਂ URL ਦਾ ਸਮਰਥਨ ਕਰੋ +• `music.youtube.com` URL ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ + +ਸਥਿਰ +• [YouTube] ਫਿਕਸਡ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀਆਂ +• ਸਟ੍ਰੀਮ ਡਾਊਨਲੋਡ ਕਰਦੇ ਸਮੇਂ ਐਂਡਰਾਇਡ ਪਾਈ ਵਿੱਚ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆ ਹੱਲ ਕੀਤੀ ਗਈ #2592 diff --git a/fastlane/metadata/android/pa/changelogs/790.txt b/fastlane/metadata/android/pa/changelogs/790.txt index f841801eb52..28627c7ec95 100644 --- a/fastlane/metadata/android/pa/changelogs/790.txt +++ b/fastlane/metadata/android/pa/changelogs/790.txt @@ -1 +1,11 @@ -ਸੁਧਾਰ • ਅੰਨ੍ਹੇ ਲੋਕਾਂ #2655 ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਹੋਰ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ • ਡਾਉਨਲੋਡ ਫੋਲਡਰ ਸੈਟਿੰਗ ਦੀ ਭਾਸ਼ਾ ਨੂੰ ਵਧੇਰੇ ਇਕਸਾਰ ਅਤੇ ਘੱਟ ਅਸਪਸ਼ਟ #2637 ਬਣਾਓ ਸਥਿਰ • ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਬਲਾਕ ਵਿੱਚ ਆਖਰੀ ਬਾਈਟ #2646 ਡਾਊਨਲੋਡ ਕੀਤੀ ਗਈ ਹੈ • ਵੀਡੀਓ ਡਿਟੇਲ ਫਰੈਗਮੈਂਟ #2672 ਵਿੱਚ ਸਥਿਰ ਸਕ੍ਰੋਲਿੰਗ • ਡਬਲ ਸਰਚ ਕਲੀਅਰ ਬਾਕਸ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਇੱਕ #2695 ਵਿੱਚ ਹਟਾਓ • [SoundCloud] ਕਲਾਇਟ_ਆਈਡੀ ਐਕਸਟਰੈਕਸ਼ਨ #2745 ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • NewPipeExtractor ਤੋਂ ਵਿਰਾਸਤ ਵਿੱਚ ਮਿਲੀ ਗੁੰਮ ਨਿਰਭਰਤਾ ਨੂੰ NewPipe #2535 ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ • AndroidX #2685 'ਤੇ ਮਾਈਗ੍ਰੇਟ ਕਰੋ • ExoPlayer 2.10.6 #2697, #2736 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ +ਸੁਧਾਰਿਆ ਗਿਆ +• ਹੋਰ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਬਲਾਕ ਵਿੱਚ ਆਖਰੀ ਬਾਈਟ ਡਾਊਨਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ #2646 +• ਵੀਡੀਓ ਵੇਰਵੇ ਵਾਲੇ ਟੁਕੜੇ #2672 ਵਿੱਚ ਸਕ੍ਰੌਲਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +• [SoundCloud] client_id ਐਕਸਟਰੈਕਸ਼ਨ #2745 ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ + +ਵਿਕਾਸ +• AndroidX 'ਤੇ ਮਾਈਗ੍ਰੇਟ ਕਰੋ +• ExoPlayer 2.10.6 'ਤੇ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/800.txt b/fastlane/metadata/android/pa/changelogs/800.txt index 53868c894bd..08940d09557 100644 --- a/fastlane/metadata/android/pa/changelogs/800.txt +++ b/fastlane/metadata/android/pa/changelogs/800.txt @@ -1 +1,10 @@ -ਨਵਾਂ • P2P (#2201) [ਬੀਟਾ] ਤੋਂ ਬਿਨਾਂ PeerTube ਸਮਰਥਨ: ◦ PeerTube ਉਦਾਹਰਨਾਂ ਤੋਂ ਵੀਡੀਓ ਦੇਖੋ ਅਤੇ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਪੂਰੀ PeerTube ਸੰਸਾਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਉਦਾਹਰਨਾਂ ਸ਼ਾਮਲ ਕਰੋ ◦ Android 4.4 ਅਤੇ 7.1 'ਤੇ SSL ਹੈਂਡਸ਼ੇਕ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ ਜਦੋਂ ਕੁਝ ਖਾਸ ਮੌਕਿਆਂ 'ਤੇ ਪਹੁੰਚ ਕਰਦੇ ਸਮੇਂ ਨੈੱਟਵਰਕ ਗੜਬੜ ਹੋ ਜਾਂਦੀ ਹੈ। • ਡਾਊਨਲੋਡਰ (#2679): ◦ ਡਾਊਨਲੋਡ ETA ਦੀ ਗਣਨਾ ਕਰੋ ◦ ਓਪਸ (ਵੈਬ ਫਾਈਲਾਂ) ਨੂੰ ogg ਵਜੋਂ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਲੰਬੇ ਵਿਰਾਮ ਤੋਂ ਬਾਅਦ ਡਾਊਨਲੋਡ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਿਆਦ ਪੁੱਗ ਚੁੱਕੇ ਡਾਊਨਲੋਡ ਲਿੰਕਾਂ ਨੂੰ ਮੁੜ-ਹਾਸਲ ਕਰੋ ਸੁਧਾਰ • ਕਿਓਸਕਫ੍ਰੈਗਮੈਂਟ ਨੂੰ ਤਰਜੀਹੀ ਸਮਗਰੀ ਵਾਲੇ ਦੇਸ਼ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਤੋਂ ਜਾਣੂ ਕਰਵਾਓ ਅਤੇ ਸਾਰੀਆਂ ਮੁੱਖ ਟੈਬਾਂ #2742 ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ। • ਐਕਸਟਰੈਕਟਰ #2713 ਤੋਂ ਨਵੇਂ ਸਥਾਨਕਕਰਨ ਅਤੇ ਡਾਉਨਲੋਡਰ ਲਾਗੂਕਰਨ ਦੀ ਵਰਤੋਂ ਕਰੋ • "ਡਿਫੌਲਟ ਕਿਓਸਕ" ਸਤਰ ਨੂੰ ਅਨੁਵਾਦਯੋਗ ਬਣਾਓ • ਬਲੈਕ ਥੀਮ #2569 ਲਈ ਬਲੈਕ ਨੈਵੀਗੇਸ਼ਨ ਪੱਟੀ ਸਥਿਰ • ਇੱਕ ਬੱਗ ਫਿਕਸ ਕੀਤਾ ਗਿਆ ਹੈ ਜੋ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਹਿਲਾ ਨਹੀਂ ਸਕਦਾ ਸੀ ਜੇਕਰ ਪੌਪਅੱਪ ਪਲੇਅਰ #2772 ਨੂੰ ਹਿਲਾਉਂਦੇ ਸਮੇਂ ਕੋਈ ਹੋਰ ਉਂਗਲ ਰੱਖੀ ਜਾਂਦੀ ਹੈ • ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਅਪਲੋਡਰ ਦੀ ਗੁੰਮਸ਼ੁਦਗੀ ਦੀ ਆਗਿਆ ਦਿਓ ਅਤੇ ਇਸ ਸਮੱਸਿਆ ਨਾਲ ਸਬੰਧਤ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ #2724, TeamNewPipe/NewPipeExtractor#219 • MediaCCC ਅਤੇ ਕੁਝ PeerTube ਉਦਾਹਰਨਾਂ #2792 ਨਾਲ TLS ਹੈਂਡਸ਼ੇਕ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ Android 4.4 ਡਿਵਾਈਸਾਂ (API 19/KitKat) 'ਤੇ TLS1.1/1.2 ਨੂੰ ਸਮਰੱਥ ਕਰਨਾ • [SoundCloud] ਫਿਕਸਡ ਕਲਾਈਂਟ_ਆਈਡੀ ਐਕਸਟ੍ਰੈਕਸ਼ਨ TeamNewPipe/NewPipeExtractor#217 • [SoundCloud] ਆਡੀਓ ਸਟ੍ਰੀਮ ਕੱਢਣ ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • ExoPlayer ਨੂੰ 2.10.8 #2791, #2816 'ਤੇ ਅੱਪਡੇਟ ਕਰੋ • Gradle ਨੂੰ 3.5.1 ਵਿੱਚ ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ Kotlin ਸਹਿਯੋਗ #2714 ਸ਼ਾਮਲ ਕਰੋ +ਨਵਾਂ +• P2P ਤੋਂ ਬਿਨਾਂ PeerTube ਸਹਾਇਤਾ (#2201) [ਬੀਟਾ]: + +◦ ਲੰਬੇ ਵਿਰਾਮ ਤੋਂ ਬਾਅਦ ਡਾਊਨਲੋਡ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਿਆਦ ਪੁੱਗ ਚੁੱਕੇ ਡਾਊਨਲੋਡ ਲਿੰਕਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰੋ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਪਸੰਦੀਦਾ ਸਮੱਗਰੀ ਦੇਸ਼ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਬਾਰੇ KioskFragment ਨੂੰ ਸੂਚਿਤ ਕਰੋ ਅਤੇ ਸਾਰੇ ਮੁੱਖ ਟੈਬਾਂ ਵਿੱਚ ਪ੍ਰਦਰਸ਼ਨ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ #2742 + +ਸਥਿਰ +• Android 4.4 ਡਿਵਾਈਸਾਂ (API 19/KitKat) 'ਤੇ TLS1.1/1.2 ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ diff --git a/fastlane/metadata/android/pa/changelogs/810.txt b/fastlane/metadata/android/pa/changelogs/810.txt index 96a2b9da5be..d10bc69137c 100644 --- a/fastlane/metadata/android/pa/changelogs/810.txt +++ b/fastlane/metadata/android/pa/changelogs/810.txt @@ -1 +1,11 @@ -ਨਵਾਂ • ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਲੌਕ ਸਕ੍ਰੀਨ 'ਤੇ ਵੀਡੀਓ ਥੰਬਨੇਲ ਦਿਖਾਓ ਸੁਧਾਰ • ਬੈਕਗ੍ਰਾਉਂਡ / ਪੌਪਅੱਪ ਬਟਨ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ 'ਤੇ ਕਤਾਰ ਵਿੱਚ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਸ਼ਾਮਲ ਕਰੋ • ਮੁੱਖ ਪੰਨਾ ਟੈਬਾਂ ਨੂੰ ਸਕ੍ਰੋਲ ਕਰਨ ਯੋਗ ਬਣਾਓ ਅਤੇ ਸਿਰਫ਼ ਇੱਕ ਟੈਬ ਹੋਣ 'ਤੇ ਲੁਕਾਓ • ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਸੂਚਨਾ ਥੰਬਨੇਲ ਅੱਪਡੇਟ ਦੀ ਸੀਮਾ ਮਾਤਰਾ • ਖਾਲੀ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਲਈ ਡਮੀ ਥੰਬਨੇਲ ਸ਼ਾਮਲ ਕਰੋ • *.webm ਦੀ ਬਜਾਏ *.opus ਫਾਈਲ ਐਕਸਟੈਂਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰੋ ਅਤੇ ਡਾਊਨਲੋਡ ਡ੍ਰੌਪਡਾਉਨ ਵਿੱਚ "WebM Opus" ਦੀ ਬਜਾਏ ਫਾਰਮੈਟ ਲੇਬਲ ਵਿੱਚ "opus" ਦਿਖਾਓ • "ਡਾਊਨਲੋਡ" ਵਿੱਚ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਜਾਂ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਨੂੰ ਮਿਟਾਉਣ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ • [YouTube] /c/shortened_url ਚੈਨਲ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • NewPipe ਨਾਲ ਵੀਡੀਓ ਸਾਂਝਾ ਕਰਨ ਅਤੇ ਇਸ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਿੱਧੇ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਕਈ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ • ਇਸ ਦੇ ਸਿਰਜਣ ਥ੍ਰੈਡ ਤੋਂ ਬਾਹਰ ਸਥਿਰ ਪਲੇਅਰ ਪਹੁੰਚ • ਸਥਿਰ ਖੋਜ ਨਤੀਜੇ ਪੇਜਿੰਗ • [YouTube] ਨਿਸ਼ਚਤ ਸਵਿਚਿੰਗ ਚਾਲੂ ਕਰਨ ਨਾਲ NPE ਹੁੰਦਾ ਹੈ • [YouTube] ਇੱਕ invidio.us url ਖੋਲ੍ਹਣ ਵੇਲੇ ਟਿੱਪਣੀਆਂ ਦੇਖਣ ਲਈ ਸਥਿਰ • [SoundCloud] ਅੱਪਡੇਟ ਕੀਤਾ client_id +ਨਵਾਂ +• ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਲਾਕ ਸਕ੍ਰੀਨ 'ਤੇ ਵੀਡੀਓ ਥੰਬਨੇਲ ਦਿਖਾਓ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਬੈਕਗ੍ਰਾਊਂਡ/ਪੌਪਅੱਪ ਬਟਨ ਨੂੰ ਦੇਰ ਤੱਕ ਦਬਾਉਣ 'ਤੇ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਕਤਾਰ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ +• [YouTube] /c/shortened_url ਚੈਨਲ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• NewPipe 'ਤੇ ਵੀਡੀਓ ਸਾਂਝੇ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਿੱਧਾ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਕਈ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ +• ਖੋਜ ਨਤੀਜਿਆਂ ਦੀ ਪੇਜਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +• [SoundCloud] client_id ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/840.txt b/fastlane/metadata/android/pa/changelogs/840.txt index 74509849684..d05907bd612 100644 --- a/fastlane/metadata/android/pa/changelogs/840.txt +++ b/fastlane/metadata/android/pa/changelogs/840.txt @@ -1 +1,10 @@ -ਨਵਾਂ • ਐਪ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਲਈ ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਪਲੇਅਰ ਸਮੇਟਣਯੋਗ ਮੀਨੂ ਵਿੱਚ ਕੋਡੀ ਬਟਨ 'ਤੇ ਭੇਜੋ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਲੰਬੀ ਪ੍ਰੈਸ 'ਤੇ ਟਿੱਪਣੀਆਂ ਨੂੰ ਕਾਪੀ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ ਸੁਧਾਰ • ਰੀਕੈਪਚਾ ਗਤੀਵਿਧੀ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਕੂਕੀਜ਼ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕਰੋ • ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਚਾਲੂ ਨਾ ਹੋਣ 'ਤੇ ਦਰਾਜ਼ ਦੇ ਹੱਕ ਵਿੱਚ ਡਾਟ-ਮੀਨੂ ਨੂੰ ਹਟਾਇਆ ਗਿਆ ਅਤੇ ਇਤਿਹਾਸ ਨੂੰ ਲੁਕਾਓ ਬਟਨ • Android 6 ਅਤੇ ਬਾਅਦ ਵਾਲੇ 'ਤੇ ਸਹੀ ਢੰਗ ਨਾਲ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਹੋਰ ਐਪਾਂ ਦੀ ਇਜਾਜ਼ਤ ਦੇ ਉੱਪਰ ਡਿਸਪਲੇ ਲਈ ਪੁੱਛੋ • BookmarkFragment ਵਿੱਚ ਲੰਮਾ-ਕਲਿੱਕ ਕਰਕੇ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਦਾ ਨਾਮ ਬਦਲੋ • ਕਈ PeerTube ਸੁਧਾਰ • ਕਈ ਅੰਗਰੇਜ਼ੀ ਸਰੋਤ ਸਤਰਾਂ ਨੂੰ ਸੁਧਾਰਿਆ ਗਿਆ ਹੈ ਸਥਿਰ • ਫਿਕਸਡ ਪਲੇਅਰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ ਹਾਲਾਂਕਿ ਇਹ ਉਦੋਂ ਰੋਕਿਆ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਵਿਕਲਪ "ਐਪ ਸਵਿੱਚ 'ਤੇ ਛੋਟਾ ਕਰੋ" ਯੋਗ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਨਿਊ ਪਾਈਪ ਨੂੰ ਛੋਟਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ • ਸੰਕੇਤ ਲਈ ਸ਼ੁਰੂਆਤੀ ਚਮਕ ਮੁੱਲ ਨੂੰ ਠੀਕ ਕਰੋ • ਸਥਿਰ .srt ਉਪਸਿਰਲੇਖ ਡਾਉਨਲੋਡ ਜਿਸ ਵਿੱਚ ਸਾਰੇ ਲਾਈਨ ਬ੍ਰੇਕ ਨਹੀਂ ਹਨ • SD ਕਾਰਡ 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡ ਅਸਫਲ ਹੋ ਰਿਹਾ ਹੈ ਕਿਉਂਕਿ ਕੁਝ Android 5 ਡਿਵਾਈਸਾਂ CTF ਅਨੁਕੂਲ ਨਹੀਂ ਹਨ • Android KitKat 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ • ਸਥਿਰ ਭ੍ਰਿਸ਼ਟ ਵੀਡੀਓ .mp4 ਫਾਈਲ ਨੂੰ ਆਡੀਓ ਫਾਈਲ ਵਜੋਂ ਮਾਨਤਾ ਦਿੱਤੀ ਜਾ ਰਹੀ ਹੈ • ਗਲਤ ਚੀਨੀ ਭਾਸ਼ਾ ਕੋਡ ਸਮੇਤ, ਮਲਟੀਪਲ ਸਥਾਨੀਕਰਨ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ • [YouTube] ਵਰਣਨ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਹਨ +ਨਵਾਂ +• ਐਪ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਲਈ ਇੱਕ ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਜੋੜਿਆ ਗਿਆ +• ਪਲੇਅਰ ਦੇ ਕੋਲੈਪਸੀਬਲ ਮੀਨੂ ਵਿੱਚ ਕੋਡੀ ਨੂੰ ਭੇਜੋ ਬਟਨ ਜੋੜਿਆ ਗਿਆ +• ਟਿੱਪਣੀਆਂ ਦੀ ਕਾਪੀ ਕਰਨ ਲਈ ਇੱਕ ਲੰਮਾ-ਦਬਾਓ ਵਿਸ਼ੇਸ਼ਤਾ ਜੋੜਿਆ ਗਿਆ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਰੀਕੈਪਚਾ ਗਤੀਵਿਧੀ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ ਅਤੇ ਪ੍ਰਾਪਤ ਕੂਕੀਜ਼ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਐਂਡਰਾਇਡ ਕਿਟਕੈਟ 'ਤੇ ਡਾਊਨਲੋਡਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/920.txt b/fastlane/metadata/android/pa/changelogs/920.txt index 04fc07937e8..94b1e74a0cd 100644 --- a/fastlane/metadata/android/pa/changelogs/920.txt +++ b/fastlane/metadata/android/pa/changelogs/920.txt @@ -1 +1,9 @@ -ਸੁਧਾਰ • ਸਟ੍ਰੀਮ ਗਰਿੱਡ ਆਈਟਮਾਂ 'ਤੇ ਅੱਪਲੋਡ ਦੀ ਮਿਤੀ ਅਤੇ ਦੇਖਣ ਦੀ ਗਿਣਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਦਰਾਜ਼ ਹੈਡਰ ਲੇਆਉਟ ਲਈ ਸੁਧਾਰ ਸਥਿਰ • ਏਪੀਆਈ 19 'ਤੇ ਕ੍ਰੈਸ਼ ਹੋਣ ਕਾਰਨ ਫਿਕਸਡ ਮਿਊਟ ਬਟਨ • ਲੰਬੇ 1080p 60fps ਵੀਡੀਓ ਦੀ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ +ਸੁਧਾਰਿਆ ਗਿਆ + +• ਸਟ੍ਰੀਮ ਗਰਿੱਡ ਆਈਟਮਾਂ 'ਤੇ ਅਪਲੋਡ ਮਿਤੀ ਅਤੇ ਵਿਯੂ ਗਿਣਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਦਰਾਜ਼ ਹੈਡਰ ਲੇਆਉਟ ਲਈ ਸੁਧਾਰ + +ਠੀਕ ਕੀਤਾ ਗਿਆ + +• API 19 'ਤੇ ਕਰੈਸ਼ ਹੋਣ ਵਾਲੇ ਮਿਊਟ ਬਟਨ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਲੰਬੇ 1080p 60fps ਵੀਡੀਓਜ਼ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨਾ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/930.txt b/fastlane/metadata/android/pa/changelogs/930.txt index a067bfb5868..96fc7d0b57a 100644 --- a/fastlane/metadata/android/pa/changelogs/930.txt +++ b/fastlane/metadata/android/pa/changelogs/930.txt @@ -1 +1,14 @@ -ਨਵਾਂ • YouTube ਸੰਗੀਤ 'ਤੇ ਖੋਜੋ • ਬੁਨਿਆਦੀ Android TV ਸਮਰਥਨ ਸੁਧਾਰ • ਇੱਕ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਤੋਂ ਸਾਰੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣ ਦੀ ਯੋਗਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ • ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਬਜਾਏ ਜਦੋਂ ਸਮੱਗਰੀ ਅਜੇ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਤਾਂ ਸੁਨੇਹਾ ਦਿਖਾਓ • ਚੁਟਕੀ ਇਸ਼ਾਰਿਆਂ ਨਾਲ ਪੌਪਅੱਪ ਪਲੇਅਰ ਦਾ ਆਕਾਰ ਬਦਲਿਆ ਗਿਆ ਹੈ • ਬੈਕਗ੍ਰਾਊਂਡ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਅਤੇ ਚੈਨਲ ਵਿੱਚ ਪੌਪਅੱਪ ਬਟਨਾਂ 'ਤੇ ਸਟ੍ਰੀਮ ਨੂੰ ਐਨਕਿਊ ਕਰੋ • ਦਰਾਜ਼ ਸਿਰਲੇਖ ਦੇ ਸਿਰਲੇਖ ਦੇ ਆਕਾਰ ਨੂੰ ਸੰਭਾਲਣ ਵਿੱਚ ਸੁਧਾਰ ਕੀਤਾ ਗਿਆ ਹੈ ਸਥਿਰ • ਨਿਸ਼ਚਿਤ ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ ਸਮੱਗਰੀ ਸੈਟਿੰਗ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀ • ਕੁਝ ਖਾਸ ਕਿਸਮ ਦੇ reCAPTCHA ਫਿਕਸ ਕੀਤੇ ਗਏ ਹਨ • ਪਲੇਲਿਸਟ `ਨੱਲ` ਹੋਣ 'ਤੇ ਬੁੱਕਮਾਰਕ ਖੋਲ੍ਹਣ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ • ਨੈੱਟਵਰਕ ਸੰਬੰਧੀ ਅਪਵਾਦਾਂ ਦੀ ਸਥਿਰ ਖੋਜ • ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫਰੈਗਮੈਂਟ ਵਿੱਚ ਗਰੁੱਪ ਸੌਰਟ ਬਟਨ ਦੀ ਸਥਿਰ ਦਿੱਖ ਅਤੇ ਹੋਰ +ਨਵਾਂ +• YouTube ਸੰਗੀਤ ਖੋਜੋ +• ਮੁੱਢਲਾ Android TV ਸਮਰਥਨ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਤੋਂ ਸਾਰੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਹਟਾਉਣ ਦੀ ਯੋਗਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਜਦੋਂ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਤਾਂ ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਬਜਾਏ ਇੱਕ ਸੁਨੇਹਾ ਦਿਖਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮੱਗਰੀ ਸੈਟਿੰਗਾਂ ਨਾਲ ਇੱਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ। + +ਕੁਝ reCAPTCHA ਗਲਤੀਆਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ। + +ਅਤੇ ਹੋਰ ਵੀ diff --git a/fastlane/metadata/android/pa/changelogs/940.txt b/fastlane/metadata/android/pa/changelogs/940.txt index b9d9b3fdf98..3ea03ad033d 100644 --- a/fastlane/metadata/android/pa/changelogs/940.txt +++ b/fastlane/metadata/android/pa/changelogs/940.txt @@ -1 +1,14 @@ -ਨਵਾਂ • SoundCloud ਟਿੱਪਣੀਆਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ • YouTube ਪ੍ਰਤਿਬੰਧਿਤ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕਰੋ • PeerTube ਮੂਲ ਚੈਨਲ ਦੇ ਵੇਰਵੇ ਦਿਖਾਓ ਸੁਧਾਰ • ਸਿਰਫ਼ ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ ਲਈ ਕੋਰ ਬਟਨ ਦਿਖਾਓ • ਨੈਵੀਗੇਸ਼ਨਬਾਰ ਜਾਂ ਸਟੇਟਸਬਾਰ ਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਪਲੇਅਰ ਸੰਕੇਤਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ • ਸੇਵਾ ਦੇ ਰੰਗ ਦੇ ਆਧਾਰ 'ਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਅਤੇ ਗਾਹਕ ਬਣੋ ਬਟਨਾਂ ਦਾ ਪਿਛੋਕੜ ਰੰਗ ਬਦਲੋ ਸਥਿਰ • ਡਾਉਨਲੋਡ ਡਾਇਲਾਗ ਫ੍ਰੀਜ਼ ਨੂੰ ਠੀਕ ਕਰੋ • ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ ਬਟਨ ਹੁਣ ਅਸਲ ਵਿੱਚ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ • ਵੀਡੀਓ ਖੋਲ੍ਹਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ "ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" ਅਤੇ ਹੋਰ +ਨਵਾਂ +• SoundCloud ਟਿੱਪਣੀਆਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ +• YouTube ਪ੍ਰਤਿਬੰਧਿਤ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕਰੋ +• PeerTube ਪੇਰੈਂਟ ਚੈਨਲ ਵੇਰਵੇ ਦਿਖਾਓ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਸਿਰਫ਼ ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ ਲਈ Kore ਬਟਨ ਦਿਖਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਇੱਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ ਜਿੱਥੇ ਡਾਊਨਲੋਡ ਡਾਇਲਾਗ ਫ੍ਰੀਜ਼ ਹੋ ਰਿਹਾ ਸੀ +• ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ ਬਟਨ ਹੁਣ ਅਸਲ ਵਿੱਚ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ +• ਵੀਡੀਓ ਖੋਲ੍ਹਣ ਵੇਲੇ ਕਰੈਸ਼ ਅਤੇ "ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" + +ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/951.txt b/fastlane/metadata/android/pa/changelogs/951.txt index 2b1cd7933f0..f4dd14071f5 100644 --- a/fastlane/metadata/android/pa/changelogs/951.txt +++ b/fastlane/metadata/android/pa/changelogs/951.txt @@ -1,13 +1,13 @@ -ਨਵਾਂ -• ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਗਾਹਕੀ ਚੋਣਕਾਰ ਲਈ ਖੋਜ ਸ਼ਾਮਲ ਕਰੋ -• ਸਿਰਫ਼ ਗੈਰ-ਗਰੁੱਪ ਕੀਤੀਆਂ ਗਾਹਕੀਆਂ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਫਿਲਟਰ ਸ਼ਾਮਲ ਕਰੋ -• ਪਲੇਲਿਸਟ ਟੈਬ ਨੂੰ ਮੁੱਖ ਪੰਨੇ 'ਤੇ ਸ਼ਾਮਲ ਕਰੋ -• ਬੈਕਗ੍ਰਾਊਂਡ/ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਤਾਰ ਵਿੱਚ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ/ਰਿਵਾਈਂਡ ਕਰੋ -• ਖੋਜ ਸੁਝਾਅ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ: ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਹੈ ਅਤੇ ਇਸ ਲਈ ਨਤੀਜਾ ਦਿਖਾ ਰਿਹਾ ਹੈ -ਸੁਧਾਰ -• ਮਿਕਸਡ ਫਾਈਲਾਂ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਮੈਟਾਡੇਟਾ ਲਿਖਣਾ ਛੱਡੋ • ਕਤਾਰ ਤੋਂ ਅਸਫਲ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਨਾ ਹਟਾਓ -• ਟੂਲਬਾਰ ਦੇ ਰੰਗ ਨਾਲ ਮੇਲ ਕਰਨ ਲਈ ਸਥਿਤੀ ਪੱਟੀ ਦਾ ਰੰਗ ਅੱਪਡੇਟ ਕਰੋ +ਨਵਾਂ +• ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੋਣਕਾਰ ਲਈ ਖੋਜ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਸਿਰਫ਼ ਅਣ-ਗਰੁੱਪ ਕੀਤੀਆਂ ਗਾਹਕੀਆਂ ਦਿਖਾਉਣ ਲਈ ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਇੱਕ ਫਿਲਟਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• ਮੁੱਖ ਪੰਨੇ 'ਤੇ ਇੱਕ ਪਲੇਲਿਸਟ ਟੈਬ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ -ਠੀਕ ਕੀਤਾ -• ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਸੰਚਤ ਤਰੁੱਟੀਆਂ ਦੇ ਕਾਰਨ ਫਿਕਸਡ ਆਡੀਓ/ਵੀਡੀਓ ਡੀਸਿੰਕ -• [PeerTube] ਮਿਟਾਈਆਂ ਗਈਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਸੰਭਾਲੋ ਅਤੇ ਹੋਰ +ਸੁਧਾਰਿਆ ਗਿਆ +• ਮਕਸਡ ਫਾਈਲਾਂ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਮੈਟਾਡੇਟਾ ਲਿਖਣਾ ਬੰਦ ਕੀਤਾ ਗਿਆ +• ਕਤਾਰ ਤੋਂ ਅਸਫਲ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਨਾ ਹਟਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਸੰਚਤ ਗਲਤੀਆਂ ਕਾਰਨ ਆਡੀਓ/ਵੀਡੀਓ ਡੀਸਿੰਕ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ + +ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/954.txt b/fastlane/metadata/android/pa/changelogs/954.txt index 3eb8dd68bf6..b5b0e78d887 100644 --- a/fastlane/metadata/android/pa/changelogs/954.txt +++ b/fastlane/metadata/android/pa/changelogs/954.txt @@ -1,8 +1,9 @@ -• ਨਵਾਂ ਐਪਲੀਕੇਸ਼ਨ ਵਰਕਫਲੋ: ਵੇਰਵੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਵੀਡੀਓ ਚਲਾਓ, ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ -• ਮੀਡੀਆ ਸਟਾਈਲ ਸੂਚਨਾਵਾਂ: ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਕਾਰਵਾਈਆਂ, ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ -• ਡੈਸਕਟੌਪ ਐਪ ਦੇ ਤੌਰ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਮੂਲ ਰੀਸਾਈਜ਼ ਕਰਨਾ +• ਨਵਾਂ ਐਪ ਵਰਕਫਲੋ: ਵੇਰਵੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਵੀਡੀਓ ਚਲਾਓ, ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ +• ਮੀਡੀਆਸਟਾਈਲ ਸੂਚਨਾਵਾਂ: ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਕਾਰਵਾਈਆਂ, ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ +• ਡੈਸਕਟੌਪ ਐਪ ਦੇ ਤੌਰ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਮੂਲ ਆਕਾਰ ਬਦਲਣਾ -• ਇੱਕ ਅਸਮਰਥਿਤ URL ਟੋਸਟ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਖੁੱਲੇ ਵਿਕਲਪਾਂ ਨਾਲ ਡਾਇਲਾਗ ਦਿਖਾਓ -• ਜਦੋਂ ਰਿਮੋਟ ਨੂੰ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਤਾਂ ਖੋਜ ਸੁਝਾਅ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ -• ਡਿਫ਼ਾਲਟ ਵੀਡੀਓ ਗੁਣਵੱਤਾ ਨੂੰ 720p60 (ਇਨ-ਐਪ ਪਲੇਅਰ) ਅਤੇ 480p (ਪੌਪ-ਅੱਪ ਪਲੇਅਰ) ਤੱਕ ਵਧਾ ਦਿੱਤਾ ਗਿਆ ਹੈ -• ਬਹੁਤ ਸਾਰੇ ਬੱਗ ਫਿਕਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ +• ਇੱਕ ਅਸਮਰਥਿਤ URL ਟੋਸਟ ਦੀ ਸਥਿਤੀ ਵਿੱਚ ਖੁੱਲ੍ਹੇ ਵਿਕਲਪਾਂ ਦੇ ਨਾਲ ਇੱਕ ਡਾਇਲਾਗ ਦਿਖਾਓ +• ਰਿਮੋਟ ਸੁਝਾਅ ਉਪਲਬਧ ਨਾ ਹੋਣ 'ਤੇ ਸੁਧਾਰਾਂ ਦਾ ਅਨੁਭਵ ਕਰੋ +• ਡਿਫੌਲਟ ਵੀਡੀਓ ਗੁਣਵੱਤਾ 720p60 (ਇਨ-ਐਪ ਪਲੇਅਰ) ਅਤੇ 480p (ਪੌਪ-ਅੱਪ ਪਲੇਅਰ) ਤੱਕ ਵਧਾ ਦਿੱਤੀ ਗਈ + +• ਬੱਗ ਫਿਕਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/changelogs/957.txt b/fastlane/metadata/android/pa/changelogs/957.txt index eb66dacbc97..2cf56525d56 100644 --- a/fastlane/metadata/android/pa/changelogs/957.txt +++ b/fastlane/metadata/android/pa/changelogs/957.txt @@ -1,10 +1,7 @@ -• ਖਾਸ ਐਨਕਿਊ ਕਿਰਿਆਵਾਂ ਨੂੰ ਇੱਕ ਵਿੱਚ ਜੋੜੋ -• ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਦੋ ਉਂਗਲਾਂ ਦੇ ਸੰਕੇਤ -• reCAPTCHA ਕੂਕੀਜ਼ ਨੂੰ ਕਲੀਅਰ ਕਰਨ ਦਿਓ -• ਨੋਟੀਫਿਕੇਸ਼ਨ ਨੂੰ ਰੰਗ ਨਾ ਕਰਨ ਦਾ ਵਿਕਲਪ -• ਅਨੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਵਿਡੀਓ ਵੇਰਵਿਆਂ ਨੂੰ ਕਿਵੇਂ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਇਸ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ, ਨਿਊਪਾਈਪ ਨਾਲ ਸਾਂਝਾ ਕਰਨ ਵੇਲੇ ਬੱਗੀ ਵਿਵਹਾਰ ਅਤੇ ਹੋਰ ਅਸੰਗਤਤਾਵਾਂ -• YouTube ਵੀਡੀਓਜ਼ ਦੀ ਗਤੀ ਵਧਾਓ ਅਤੇ ਉਮਰ ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ -• ਫਾਸਟ ਫਾਰਵਰਡ/ਰਿਵਾਇੰਡ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ -• ਥੰਬਨੇਲ ਖਿੱਚ ਕੇ ਸੂਚੀਆਂ ਨੂੰ ਮੁੜ ਵਿਵਸਥਿਤ ਨਾ ਕਰੋ -• ਪੌਪਅੱਪ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਹਮੇਸ਼ਾ ਯਾਦ ਰੱਖੋ -• ਸੰਤਾਲੀ ਭਾਸ਼ਾ ਸ਼ਾਮਲ ਕਰੋ +• ਖਾਸ NQE ਕਿਰਿਆਵਾਂ ਨੂੰ ਇੱਕ ਵਿੱਚ ਏਕੀਕ੍ਰਿਤ ਕਰਨਾ। +• ਦੋ-ਉਂਗਲਾਂ ਵਾਲੇ ਇਸ਼ਾਰੇ ਨਾਲ ਵੀਡੀਓ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ। +• reCOPTCHA ਕੂਕੀਜ਼ ਨੂੰ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦੇਣਾ। +• ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੰਗੀਨ ਨਾ ਕਰਨ ਦਾ ਵਿਕਲਪ। +• NewPipe 'ਤੇ ਸਾਂਝਾ ਕਰਦੇ ਸਮੇਂ ਅਨੰਤ ਬਫਰਿੰਗ, ਗਲਤੀਆਂ ਅਤੇ ਹੋਰ ਅਸੰਗਤੀਆਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ। +• YouTube ਵੀਡੀਓ ਨੂੰ ਤੇਜ਼ ਕੀਤਾ ਗਿਆ ਅਤੇ ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਗਿਆ। +• ਫਾਸਟ ਫਾਰਵਰਡ/ਰਿਵਾਈਂਡ 'ਤੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/964.txt b/fastlane/metadata/android/pa/changelogs/964.txt index 85dc2c15149..e945956732b 100644 --- a/fastlane/metadata/android/pa/changelogs/964.txt +++ b/fastlane/metadata/android/pa/changelogs/964.txt @@ -1 +1,6 @@ -• ਪਲੇਅਰ ਨਿਯੰਤਰਣ ਵਿੱਚ ਅਧਿਆਵਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ • [PeerTube] ਸੇਪੀਆ ਖੋਜ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਵੀਡੀਓ ਵੇਰਵੇ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸ਼ੇਅਰ ਬਟਨ ਨੂੰ ਮੁੜ-ਜੋੜਿਆ ਗਿਆ ਅਤੇ ਟੈਬ ਲੇਆਉਟ ਵਿੱਚ ਸਟ੍ਰੀਮ ਵਰਣਨ ਨੂੰ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ • ਜੇਕਰ ਚਮਕ ਦਾ ਸੰਕੇਤ ਅਸਮਰੱਥ ਹੈ ਤਾਂ ਚਮਕ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਬੰਦ ਕਰੋ • ਕੋਡੀ 'ਤੇ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਸੂਚੀ ਆਈਟਮ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਡਿਫੌਲਟ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟ ਨਾ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਦਾ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਸ਼ੇਅਰ ਡਾਇਲਾਗਸ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ • ਫੁੱਲਸਕ੍ਰੀਨ ਪਲੇਅਰ ਵਿੱਚ ਹਾਰਡਵੇਅਰ ਸਪੇਸ ਬਟਨ ਨਾਲ ਪਲੇ/ਪੌਜ਼ ਨੂੰ ਟੌਗਲ ਕਰੋ • [media.ccc.de] ਕਈ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ +• ਪਲੇਅਰ ਕੰਟਰੋਲਾਂ ਵਿੱਚ ਚੈਪਟਰਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ +• [PeerTube] ਸੇਪੀਆ ਖੋਜ ਜੋੜਿਆ ਗਿਆ +• ਵੀਡੀਓ ਵੇਰਵੇ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸ਼ੇਅਰ ਬਟਨ ਨੂੰ ਦੁਬਾਰਾ ਜੋੜਿਆ ਗਿਆ ਅਤੇ ਸਟ੍ਰੀਮ ਵਰਣਨ ਨੂੰ ਟੈਬ ਲੇਆਉਟ ਵਿੱਚ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ +• ਜੇਕਰ ਚਮਕ ਸੰਕੇਤ ਅਯੋਗ ਹੈ ਤਾਂ ਚਮਕ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਅਯੋਗ ਕਰੋ +• ਕੋਡੀ 'ਤੇ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਸੂਚੀ ਆਈਟਮ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਡਿਫੌਲਟ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟ ਨਾ ਹੋਣ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/975.txt b/fastlane/metadata/android/pa/changelogs/975.txt index c866df1e21e..fe23991c763 100644 --- a/fastlane/metadata/android/pa/changelogs/975.txt +++ b/fastlane/metadata/android/pa/changelogs/975.txt @@ -3,14 +3,11 @@ • ਅਯੋਗ ਟਿੱਪਣੀਆਂ ਦਾ ਪਤਾ ਲਗਾਓ • ਫੀਡ ਆਈਟਮ ਨੂੰ ਦੇਖੇ ਗਏ ਵਜੋਂ ਨਿਸ਼ਾਨਬੱਧ ਕਰਨ ਦਿਓ • ਟਿੱਪਣੀ ਦਿਲ ਦਿਖਾਓ - ਸੁਧਾਰ • ਮੈਟਾਡੇਟਾ ਅਤੇ ਟੈਗਸ ਲੇਆਉਟ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • UI ਭਾਗਾਂ 'ਤੇ ਸੇਵਾ ਰੰਗ ਲਾਗੂ ਕਰੋ ਠੀਕ ਕੀਤਾ • ਮਿੰਨੀ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਠੀਕ ਕਰੋ • ਡੁਪਲੀਕੇਟ ਕਤਾਰ ਆਈਟਮਾਂ 'ਤੇ ਬੇਅੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ -• ਕੁਝ ਪਲੇਅਰ ਫਿਕਸ ਜਿਵੇਂ ਰੋਟੇਸ਼ਨ ਅਤੇ ਤੇਜ਼ੀ ਨਾਲ ਬੰਦ ਹੋਣਾ -• ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਲੋਡ ਕੀਤੇ ਬਾਕੀ ਬਚੇ ReCAPTCHA ਨੂੰ ਠੀਕ ਕਰੋ -• ਫੀਡ ਨੂੰ ਤਾਜ਼ਾ ਕਰਨ ਵੇਲੇ ਕਲਿੱਕਾਂ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ +• ਕੁਝ ਪਲੇਅਰ ਫਿਕਸ • ਕੁਝ ਡਾਊਨਲੋਡਰ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/976.txt b/fastlane/metadata/android/pa/changelogs/976.txt index a1a1354ca2a..1f2a70887ea 100644 --- a/fastlane/metadata/android/pa/changelogs/976.txt +++ b/fastlane/metadata/android/pa/changelogs/976.txt @@ -1,10 +1 @@ -• ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਨੂੰ ਸਿੱਧਾ ਖੋਲ੍ਹਣ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ -• ਇਹ ਚੁਣਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ ਕਿ ਕਿਸ ਕਿਸਮ ਦੇ ਖੋਜ ਸੁਝਾਅ ਦਿਖਾਉਣੇ ਹਨ -• ਗੂੜ੍ਹਾ ਥੀਮ ਹੁਣ ਗਹਿਰਾ ਗੂੜ੍ਹਾ + ਗੂੜ੍ਹਾ ਸਪਲੈਸ਼ ਸਕ੍ਰੀਨ ਜੋੜਿਆ ਗਿਆ ਹੈ -• ਅਣਚਾਹੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਲੇਟੀ ਕਰਨ ਲਈ ਬਿਹਤਰ ਫ਼ਾਈਲ ਚੋਣਕਾਰ -• ਸਥਿਰ YouTube ਗਾਹਕੀ ਆਯਾਤ - -• ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਮੁੜ ਚਲਾਉਣ ਲਈ ਮੁੜ-ਪਲੇਅ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ -• ਸਥਿਰ ਸਮਾਪਤੀ ਆਡੀਓ ਸੈਸ਼ਨ -• [Android TV] DPad ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਸਥਿਰ ਲੰਬੀ ਸੀਕਬਾਰ ਜੰਪ -ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। +• ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਨੂੰ ਸਿੱਧਾ ਖੋਲ੍ਹਣ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਇਹ ਚੁਣਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ ਕਿ ਕਿਸ ਕਿਸਮ ਦੇ ਖੋਜ ਸੁਝਾਅ ਦਿਖਾਉਣੇ ਹਨ • ਗੂੜ੍ਹਾ ਥੀਮ ਹੁਣ ਗੂੜ੍ਹਾ + ਗੂੜ੍ਹਾ ਸਪਲੈਸ਼ ਸਕ੍ਰੀਨ ਜੋੜਿਆ ਗਿਆ ਹੈ • ਅਣਚਾਹੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਲੇਟੀ ਕਰਨ ਲਈ ਬਿਹਤਰ ਫ਼ਾਈਲ ਚੋਣਕਾਰ • ਸਥਿਰ YouTube ਗਾਹਕੀ ਆਯਾਤ • ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਮੁੜ ਚਲਾਉਣ ਲਈ ਮੁੜ-ਪਲੇਅ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ • ਸਥਿਰ ਸਮਾਪਤੀ ਆਡੀਓ ਸੈਸ਼ਨ • [Android TV] DPad ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਸਥਿਰ ਲੰਬੀ ਸੀਕਬਾਰ ਜੰਪ ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। diff --git a/fastlane/metadata/android/pa/changelogs/986.txt b/fastlane/metadata/android/pa/changelogs/986.txt index b072d6cb9b1..3766ca8d1db 100644 --- a/fastlane/metadata/android/pa/changelogs/986.txt +++ b/fastlane/metadata/android/pa/changelogs/986.txt @@ -1,15 +1,15 @@ ਨਵਾਂ -• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ -• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ -• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ -• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ +• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ +• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ +• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ +• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ ਸੁਧਾਰ -• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ -• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ • Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ +• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ +• Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ -ਠੀਕ ਕੀਤਾ -• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ +ਫਿਕਸਡ +• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ • ਪਲੇਅਰ ਦੀ ਕਿਸਮ ਬਦਲਣ 'ਤੇ ਪਲੇਬੈਕ ਰੀਸੈਟ ਨੂੰ ਠੀਕ ਕਰੋ -• ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਨੂੰ ਘੁੰਮਾਉਣ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/987.txt b/fastlane/metadata/android/pa/changelogs/987.txt index 93fc77a7753..52d0bb828d6 100644 --- a/fastlane/metadata/android/pa/changelogs/987.txt +++ b/fastlane/metadata/android/pa/changelogs/987.txt @@ -6,6 +6,4 @@ ਸੁਧਾਰ • ਪਲੇਬੈਕ ਪੈਰਾਮੀਟਰ ਡਾਇਲਾਗ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • ਗਾਹਕੀ ਆਯਾਤ/ਨਿਰਯਾਤ ਬਟਨਾਂ ਨੂੰ ਤਿੰਨ-ਬਿੰਦੀਆਂ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਲੈ ਜਾਓ - -ਠੀਕ ਕੀਤਾ -• ਪਲੇਲਿਸਟ ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣਾ ਠੀਕ ਕਰੋ • ਸ਼ੇਅਰ ਮੀਨੂ ਥੀਮ ਅਤੇ "ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" ਐਂਟਰੀ ਨੂੰ ਠੀਕ ਕਰੋ +ਠੀਕ ਕੀਤਾ diff --git a/fastlane/metadata/android/pa/changelogs/990.txt b/fastlane/metadata/android/pa/changelogs/990.txt index bd532ecb0da..90cd8b35c5c 100644 --- a/fastlane/metadata/android/pa/changelogs/990.txt +++ b/fastlane/metadata/android/pa/changelogs/990.txt @@ -1,13 +1,10 @@ -ਇਹ ਰੀਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! -ਨਵਾਂ -• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ -• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ -• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ -ਸੁਧਾਰ -• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੀ ਗਈ, ਘੱਟ ਬੱਗ -• ਥੰਮਨੇਲ ਦੇ ਸਕੇਲ ਮੋਡ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ -• ਚਿੱਤਰ ਪਲੇਸਹੋਲਡਰ ਨੂੰ ਵੈਕਟਰਾਈਜ਼ ਕਰੋ - -ਠੀਕ ਕੀਤਾ -• ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਾਲ ਵੱਖ-ਵੱਖ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰੋ: ਪੁਰਾਣੀ/ਗੁੰਮ ਮੀਡੀਆ ਜਾਣਕਾਰੀ, ਵਿਗੜਿਆ ਥੰਮਨੇਲ +ਇਹ ਰਿਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! +ਨਵਾਂ +• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ +• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ +• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ +ਸੁਧਾਰ +• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੇਗੀ, ਘੱਟ ਬੱਗ ਹੋਣਗੇ + +ਠੀਕ ਕੀਤਾ • ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੀ ਥਾਂ ਉਸਦੇ 1/4 ਹਿੱਸੇ ਦੀ ਵਰਤੋਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/995.txt b/fastlane/metadata/android/pa/changelogs/995.txt index 0da0a4261b1..dc9c576c969 100644 --- a/fastlane/metadata/android/pa/changelogs/995.txt +++ b/fastlane/metadata/android/pa/changelogs/995.txt @@ -5,12 +5,10 @@ ਸੁਧਾਰ • ਪਲੇਅਰ ਇੰਟਰਫੇਸ ਦੀ ਪਹੁੰਚਯੋਗਤਾ -• ਸਿਰਫ਼-ਵੀਡੀਓ ਡਾਊਨਲੋਡਾਂ ਲਈ ਬਿਹਤਰ ਆਡੀਓ ਚੋਣ -• ਸਾਂਝੀ ਕੀਤੀ ਪਲੇਲਿਸਟ ਸਮੱਗਰੀ ਵਿੱਚ ਪਲੇਲਿਸਟ ਅਤੇ ਵੀਡੀਓ ਨਾਮ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਵਿਕਲਪ +• ਪਲੇਲਿਸਟ ਸ਼ੇਅਰਿੰਗ ਸਮੱਗਰੀ ਵਿੱਚ ਪਲੇਲਿਸਟ ਨਾਮ ਅਤੇ ਵੀਡੀਓ ਨਾਮ ਜੋੜਨ ਲਈ ਵਿਕਲਪ +• ਅੰਦਰੂਨੀ ਸੁਧਾਰ ਅਤੇ ਨਿਰਭਰਤਾ ਅੱਪਡੇਟ ਠੀਕ ਕੀਤੇ -• [ਯੂਟਿਊਬ] ਲਾਈਕ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ -• ਪਲੇਅਰ ਰਿਸਪੌੰਡ ਨਹੀਂ ਕਰ ਰਿਹਾ ਦੇ ਸੁਨੇਹੇ ਦੇਣ ਵਾਲੇ ਪੌਪਅੱਪ ਅਤੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਵਿੱਚ ਗਲਤ ਭਾਸ਼ਾਵਾਂ ਦੀ ਚੋਣ • ਪਲੇਅਰ ਆਡੀਓ ਫੋਕਸ ਮਿਊਟ ਦਾ ਆਦਰ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ -• ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਆਈਟਮਾਂ ਨੂੰ ਜੋੜਨਾ ਕਦੇ-ਕਦਾਈਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ +• ਖਾਸ ਮਾਮਲਿਆਂ ਵਿੱਚ ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਆਈਟਮਾਂ ਨੂੰ ਜੋੜਨਾ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ diff --git a/fastlane/metadata/android/pa/changelogs/997.txt b/fastlane/metadata/android/pa/changelogs/997.txt index 8e0cb85f202..a33ff32afaa 100644 --- a/fastlane/metadata/android/pa/changelogs/997.txt +++ b/fastlane/metadata/android/pa/changelogs/997.txt @@ -12,6 +12,4 @@ ਠੀਕ ਕੀਤਾ • [ਯੂਟਿਊਬ] ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੀਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਠੀਕ ਕਰੋ, ਨਾਲ ਹੀ ਹੋਰ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ -• ਸੈਟਿੰਗਾਂ ਆਯਾਤ ਕਰਨ ਵਿੱਚ ਕਮਜ਼ੋਰੀ ਨੂੰ ਹੱਲ ਕਰੋ ਅਤੇ JSON 'ਤੇ ਸਵਿੱਚ ਕਰੋ • ਕਈ ਡਾਊਨਲੋਡ ਫਿਕਸ -• ਖੋਜ ਟੈਕਸਟ ਨੂੰ ਟਰਿੱਮ ਕਰੋ diff --git a/fastlane/metadata/android/sat/short_description.txt b/fastlane/metadata/android/sat/short_description.txt new file mode 100644 index 00000000000..9e7874738b7 --- /dev/null +++ b/fastlane/metadata/android/sat/short_description.txt @@ -0,0 +1 @@ +ᱮᱱᱰᱨᱳᱭᱮᱰ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱯᱷᱨᱤ ᱦᱟᱞᱠᱟ ᱚᱡᱚᱱ ᱭᱩᱴᱭᱩᱵᱽ ᱯᱷᱨᱚᱱᱴᱮᱱᱰ ᱾ diff --git a/fastlane/metadata/android/sk/changelogs/1005.txt b/fastlane/metadata/android/sk/changelogs/1005.txt index 8f2bfbfab18..2bfdfca0e0a 100644 --- a/fastlane/metadata/android/sk/changelogs/1005.txt +++ b/fastlane/metadata/android/sk/changelogs/1005.txt @@ -1,18 +1,17 @@ -Novinky -• Pridaná podpora pre Android Auto -• Možnosť nastaviť skupiny kanálov ako hlavné karty na obrazovke -• [YouTube] Zdieľanie ako dočasný playlist +New +• Add support for Android Auto +• Allow setting feed groups as main screen tabs +• [YouTube] Share as temporary playlist +• [SoundCloud] Likes channel tab -• [SoundCloud] Karta „Páči sa“ kanál. +Improved +• Better search bar hints +• Show download date in Downloads +• Use Android 13 per-app language -Vylepšenia -• Lepšia nápoveda v paneli vyhľadávania -• Zobrazenie dátumu stiahnutia v sekcii „Stiahnuté” -• Použitie jazyka Android 13 pre jednotlivé aplikácie - -Opravy -• Oprava chybných farieb textu v tmavom režime -• [YouTube] Oprava playlistov, ktoré nenačítavajú viac ako 100 položiek -• [YouTube] Oprava chýbajúcich odporúčaných videí -• Oprava pádov v zobrazení zoznamu histórie -• Oprava časových značiek v odpovediach na komentáre. +Fixed +• Fix broken text colors in dark mode +• [YouTube] Fix playlists not loading more than 100 items +• [YouTube] Fix missing recommended videos +• Fix crashes in History list view +• Fix timestamps in comment replies diff --git a/fastlane/metadata/android/sk/changelogs/1006.txt b/fastlane/metadata/android/sk/changelogs/1006.txt index 943b4ff5cb4..6bc6f9a2bb6 100644 --- a/fastlane/metadata/android/sk/changelogs/1006.txt +++ b/fastlane/metadata/android/sk/changelogs/1006.txt @@ -1,16 +1,16 @@ -# Vylepšené -Aktuálny prehrávač zostane zachovaný pri kliknutí na časové značky -Ak je to možné, pokúsi sa obnoviť čakajúce úlohy sťahovania -Pridaná možnosť odstrániť sťahovanie bez odstránenia súboru -Oprávnenie zobrazenia cez ostatné aplikácie: zobrazí vysvetlenie pre Android > R -Podpora otvárania odkazov on.soundcloud -Množstvo malých vylepšení a optimalizácií +# Improved +Keep current player when clicking on timestamps +Try to recover pending download missions when possible +Add option to delete a download without also deleting file +Overlay Permission: display explanatory dialog for Android > R +Support on.soundcloud link opening +A lot of small improvements and optimizations -# Opravené -Oprava formátovania krátkeho počítania pre verzie Androidu nižšie ako 7 -Oprava klamných oznámení -Oprava súborov titulkov SRT -Oprava množstva zlyhaní +# Fixed +Fix short count formatting for Android versions below 7 +Fix ghost notifications +Fixes for SRT subtitle files +Fixed tons of crashes -# Vývoj -Modernizácia interného kódu +# Development +Internal code modernization diff --git a/fastlane/metadata/android/sk/changelogs/65.txt b/fastlane/metadata/android/sk/changelogs/65.txt index c7cac262691..8570a056a10 100644 --- a/fastlane/metadata/android/sk/changelogs/65.txt +++ b/fastlane/metadata/android/sk/changelogs/65.txt @@ -1,26 +1,26 @@ -### Zlepšenia +### Improvements -- Zakázanie animácie ikony burgermenu #1486 -- Zrušenie odstránenia stiahnutých súborov #1472 -- Možnosť sťahovania v ponuke zdieľania #1498 -- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 -- Minimalizácia hlavného prehrávača pri ukončení #1354 -- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 -- Aktualizácia ExoPlayer 2.8.2 #1392 - - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. - - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). - - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. - - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. - - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia -- Použitie nového extraktora s preformulovanou architektúrou pre multiservis +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice -### Opravy +### Fixes -- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 -- Oprava histórie zobrazenia #1497 - - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. - - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. -- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) -- Oprava hlavného prehrávača videa č. 1509 - - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. - - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/sk/changelogs/66.txt b/fastlane/metadata/android/sk/changelogs/66.txt index ba9808cba6a..30c20b0e8cb 100644 --- a/fastlane/metadata/android/sk/changelogs/66.txt +++ b/fastlane/metadata/android/sk/changelogs/66.txt @@ -1,33 +1,33 @@ -# Zoznam zmien verzie v0.13.7 +# Changelog of v0.13.7 -### Opravené -- Oprava problémov s triediacim filtrom vo verzii v0.13.6 +### Fixed +- Fix sort filter issues of v0.13.6 -# Zoznam zmien verzie v0.13.6 +# Changelog of v0.13.6 -### Vylepšenia +### Improvements -- Zakázanie animácie ikony burgermenu #1486 -- Zrušenie odstránenia stiahnutých súborov #1472 -- Možnosť sťahovania v ponuke zdieľania #1498 -- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 -- Minimalizácia hlavného prehrávača pri ukončení #1354 -- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 -- Aktualizácia ExoPlayer 2.8.2 #1392 - - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. - - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). - - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. - - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. - - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia -- Použitie nového extraktora s preformulovanou architektúrou pre multiservis +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice -### Opravy +### Fixes -- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 -- Oprava histórie zobrazenia #1497 - - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. - - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. -- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) -- Oprava hlavného prehrávača videa č. 1509 - - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. - - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/sv/changelogs/1006.txt b/fastlane/metadata/android/sv/changelogs/1006.txt index 90825e8a8af..5fae37d2257 100644 --- a/fastlane/metadata/android/sv/changelogs/1006.txt +++ b/fastlane/metadata/android/sv/changelogs/1006.txt @@ -4,13 +4,6 @@ Försök att återställa väntande nedladdningsuppdrag när det är möjligt Lägg till alternativ för att ta bort en nedladdning utan att också ta bort filen Överläggsbehörighet: visa förklarande dialogruta för Android > R Stöd för att öppna on.soundcloud-länkar -Många små förbättringar och optimeringar - -# Åtgärdat Åtgärdade formatering av korta antal för Android-versioner under 7 Åtgärdade Ghost Notifications Åtgärdade för SRT-undertextfiler -Åtgärdade massor av krascher - -# Utveckling -Intern kodmodernisering diff --git a/fastlane/metadata/android/tr/changelogs/1005.txt b/fastlane/metadata/android/tr/changelogs/1005.txt index 82b3e2e9c47..46b3142f710 100644 --- a/fastlane/metadata/android/tr/changelogs/1005.txt +++ b/fastlane/metadata/android/tr/changelogs/1005.txt @@ -1,17 +1,17 @@ Yeni • Android Auto desteği eklendi -• Akış gruplarını ana ekran sekmeleri olarak ayarlama özelliği eklendi -• [YouTube] Geçici oynatma listesi olarak paylaşma özelliği eklendi -• [SoundCloud] Beğeniler kanalı sekmesi eklendi +• Akış gruplarının ana ekran sekmeleri olarak ayarlanmasına izin verme +• [YouTube] Geçici oynatma listesi olarak paylaşma +• [SoundCloud] Beğenilen kanal sekmesi Geliştirildi -• Arama çubuğu ipuçları iyileştirildi -• İndirilenler bölümünde indirme tarihi gösteriliyor -• Android 13 uygulama başına dil ayarı desteği eklendi +• Daha iyi arama çubuğu önerileri +• İndirilenler'de indirme tarihini gösterimi +• Android 13 uygulama başı dil kullanma Düzeltildi • Karanlık modda bozuk metin renkleri düzeltildi -• [YouTube] 100’den fazla öğe yüklenmeyen oynatma listeleri sorunu giderildi +• [YouTube] 100'den fazla öğeyi yüklemeyen oynatma listeleri düzeltildi • [YouTube] Eksik önerilen videolar düzeltildi -• Geçmiş liste görünümünde oluşan çökme sorunu giderildi +• Geçmiş listesi görünümündeki çökmeler düzeltildi • Yorum yanıtlarındaki zaman damgaları düzeltildi diff --git a/fastlane/metadata/android/uk/changelogs/1006.txt b/fastlane/metadata/android/uk/changelogs/1006.txt index 6534e91452c..fd79de93a6d 100644 --- a/fastlane/metadata/android/uk/changelogs/1006.txt +++ b/fastlane/metadata/android/uk/changelogs/1006.txt @@ -4,13 +4,9 @@ Додано опцію видалення завантаження без одночасного видалення файлу Дозвіл на накладання: відображення пояснювального діалогового вікна для Android > R Підтримка відкриття посилання на .soundcloud -Багато дрібних покращень та оптимізацій # Виправлено Виправлено форматування короткого лічильника для версій Android нижче 7 Виправлено сповіщення-примари Виправлення для файлів субтитрів SRT Виправлено безліч збоїв - -# Розробка -Модернізація внутрішнього коду diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index efa55488d1d..96cd79d5265 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ autoservice-google = "1.1.1" autoservice-zacsweers = "1.2.0" bridge = "v2.0.2" cardview = "1.0.0" -checkstyle = "12.2.0" +checkstyle = "13.0.0" coil = "3.0.4" compose-bom = "2024.10.01" constraintlayout = "2.2.1" @@ -30,7 +30,7 @@ junit-ext = "1.3.0" kotlin = "2.2.21" kotlinx-coroutines-rx3 = "1.8.1" kotlinx-serialization-json = "1.7.3" -ksp = "2.3.2" +ksp = "2.3.4" ktlint = "1.8.0" lazy-column-scrollbar = "2.2.0" leakcanary = "2.14" @@ -51,7 +51,7 @@ runner = "1.7.0" rxandroid = "3.0.2" rxbinding = "4.0.0" rxjava = "3.1.12" -sonarqube = "7.2.1.6560" +sonarqube = "7.2.2.6593" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" swiperefreshlayout = "1.2.0" @@ -65,8 +65,8 @@ 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 = "05e0e4ced7b6ff05f3d68d831efed8bdf588f9ac" -webkit = "1.14.0" +teamnewpipe-newpipe-extractor = "v0.25.0" +webkit = "1.14.0" # Newer versions require minSdk >= 23 work = "2.10.5" # Newer versions require minSdk >= 23 [libraries] diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f8e1ee3125f..61285a659d1 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8a848873f3a..44ae9537e91 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=72f44c9f8ebcb1af43838f45ee5c4aa9c5444898b3468ab3f4af7b6076c5bc3f -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionSha256Sum=0d585f69da091fc5b2beced877feab55a3064d43b8a1d46aeb07996b0915e0e0 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME