From 8dce66d76f821f46875bf0e18a0308fd924284df Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 4 Aug 2022 10:49:33 +0200 Subject: [PATCH 01/63] Improve FeedGroupDialogViewModel factory --- .../subscription/dialog/FeedGroupDialog.kt | 8 +++--- .../dialog/FeedGroupDialogViewModel.kt | 27 ++++++++++--------- 2 files changed, 19 insertions(+), 16 deletions(-) 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 379b4c0d7..4b3c4ccc0 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 @@ -124,11 +124,13 @@ class FeedGroupDialog : DialogFragment(), BackPressable { viewModel = ViewModelProvider( this, - FeedGroupDialogViewModel.Factory( + FeedGroupDialogViewModel.getFactory( requireContext(), - groupId, subscriptionsCurrentSearchQuery, subscriptionsShowOnlyUngrouped + groupId, + subscriptionsCurrentSearchQuery, + subscriptionsShowOnlyUngrouped ) - ).get(FeedGroupDialogViewModel::class.java) + )[FeedGroupDialogViewModel::class.java] viewModel.groupLiveData.observe(viewLifecycleOwner, Observer(::handleGroup)) viewModel.subscriptionsLiveData.observe(viewLifecycleOwner) { 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 dfdb2b47a..eff1a4400 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 @@ -4,7 +4,8 @@ import android.content.Context import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewmodel.initializer +import androidx.lifecycle.viewmodel.viewModelFactory import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.disposables.Disposable @@ -115,18 +116,18 @@ class FeedGroupDialogViewModel( data class Filter(val query: String, val showOnlyUngrouped: Boolean) - class Factory( - private val context: Context, - private val groupId: Long = FeedGroupEntity.GROUP_ALL_ID, - private val initialQuery: String = "", - private val initialShowOnlyUngrouped: Boolean = false - ) : ViewModelProvider.Factory { - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return FeedGroupDialogViewModel( - context.applicationContext, - groupId, initialQuery, initialShowOnlyUngrouped - ) as T + companion object { + fun getFactory( + context: Context, + groupId: Long, + initialQuery: String, + initialShowOnlyUngrouped: Boolean + ) = viewModelFactory { + initializer { + FeedGroupDialogViewModel( + context.applicationContext, groupId, initialQuery, initialShowOnlyUngrouped + ) + } } } } From e136a6f91538bf3a7f4710ab1b9f206a55835b90 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Mon, 8 Aug 2022 07:10:16 +0530 Subject: [PATCH 02/63] Use range-limiting methods in more places. --- .../org/schabi/newpipe/local/feed/FeedFragment.kt | 3 ++- .../player/gesture/MainPlayerGestureListener.kt | 5 ++--- .../schabi/newpipe/player/ui/PopupPlayerUi.java | 2 +- .../org/schabi/newpipe/util/ReleaseVersionUtil.kt | 14 ++++++-------- 4 files changed, 11 insertions(+), 13 deletions(-) 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 899163050..c76e69e2a 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 @@ -40,6 +40,7 @@ import androidx.annotation.Nullable import androidx.appcompat.app.AlertDialog import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.edit +import androidx.core.math.MathUtils import androidx.core.os.bundleOf import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProvider @@ -584,7 +585,7 @@ class FeedFragment : BaseStateFragment() { // state until the user scrolls them out of the visible area which causes a update/bind-call groupAdapter.notifyItemRangeChanged( 0, - minOf(groupAdapter.itemCount, maxOf(highlightCount, lastNewItemsCount)) + MathUtils.clamp(highlightCount, lastNewItemsCount, groupAdapter.itemCount) ) if (highlightCount > 0) { 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 095b3ccdb..a6dba0dd5 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 @@ -7,6 +7,7 @@ import android.view.View.OnTouchListener import android.widget.ProgressBar import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources +import androidx.core.math.MathUtils import androidx.core.view.isVisible import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R @@ -18,8 +19,6 @@ 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 -import kotlin.math.max -import kotlin.math.min /** * GestureListener for the player @@ -114,7 +113,7 @@ class MainPlayerGestureListener( // Update progress bar val oldBrightness = layoutParams.screenBrightness - bar.progress = (bar.max * max(0f, min(1f, oldBrightness))).toInt() + bar.progress = (bar.max * MathUtils.clamp(oldBrightness, 0f, 1f)).toInt() bar.incrementProgressBy(distanceY.toInt()) // Update brightness diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java index aa36a6a5a..90c24c0c6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java @@ -291,7 +291,7 @@ public final class PopupPlayerUi extends VideoPlayerUi { } final float minimumWidth = context.getResources().getDimension(R.dimen.popup_minimum_width); - final int actualWidth = Math.min((int) Math.max(width, minimumWidth), screenWidth); + final int actualWidth = MathUtils.clamp(width, (int) minimumWidth, screenWidth); final int actualHeight = (int) getMinimumVideoHeight(width); if (DEBUG) { Log.d(TAG, "updatePopupSize() updated values:" 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 0c66cc6d4..5a54b29d2 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt @@ -100,13 +100,11 @@ object ReleaseVersionUtil { * @return Epoch second of expiry date time */ fun coerceUpdateCheckExpiry(expiryString: String?): Long { - val now = ZonedDateTime.now() - return expiryString?.let { - var expiry = - ZonedDateTime.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(expiryString)) - expiry = maxOf(expiry, now.plusHours(6)) - expiry = minOf(expiry, now.plusHours(72)) - expiry.toEpochSecond() - } ?: now.plusHours(6).toEpochSecond() + val nowPlus6Hours = ZonedDateTime.now().plusHours(6) + val expiry = expiryString?.let { + ZonedDateTime.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(it)) + .coerceIn(nowPlus6Hours, nowPlus6Hours.plusHours(66)) + } ?: nowPlus6Hours + return expiry.toEpochSecond() } } From 697b8411dfe8a8a0e62f7f0225e00944d5d01d14 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Fri, 12 Aug 2022 21:17:42 +0530 Subject: [PATCH 03/63] Use Okio's ByteString. --- .../giga/ui/adapter/MissionAdapter.java | 56 ++++++++----------- .../java/us/shandian/giga/util/Utility.java | 55 +++++------------- 2 files changed, 39 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index 343b13ef8..808928370 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -1,5 +1,25 @@ package us.shandian.giga.ui.adapter; +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; +import static android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; +import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; +import static us.shandian.giga.get.DownloadMission.ERROR_CONNECT_HOST; +import static us.shandian.giga.get.DownloadMission.ERROR_FILE_CREATION; +import static us.shandian.giga.get.DownloadMission.ERROR_HTTP_NO_CONTENT; +import static us.shandian.giga.get.DownloadMission.ERROR_INSUFFICIENT_STORAGE; +import static us.shandian.giga.get.DownloadMission.ERROR_NOTHING; +import static us.shandian.giga.get.DownloadMission.ERROR_PATH_CREATION; +import static us.shandian.giga.get.DownloadMission.ERROR_PERMISSION_DENIED; +import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING; +import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_HOLD; +import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_STOPPED; +import static us.shandian.giga.get.DownloadMission.ERROR_PROGRESS_LOST; +import static us.shandian.giga.get.DownloadMission.ERROR_RESOURCE_GONE; +import static us.shandian.giga.get.DownloadMission.ERROR_SSL_EXCEPTION; +import static us.shandian.giga.get.DownloadMission.ERROR_TIMEOUT; +import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_EXCEPTION; +import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_HOST; + import android.annotation.SuppressLint; import android.app.NotificationManager; import android.content.Context; @@ -10,7 +30,6 @@ import android.os.Build; import android.os.Handler; import android.os.Message; import android.util.Log; -import android.util.SparseArray; import android.view.HapticFeedbackConstants; import android.view.LayoutInflater; import android.view.Menu; @@ -38,10 +57,11 @@ import com.google.android.material.snackbar.Snackbar; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; -import org.schabi.newpipe.error.ErrorUtil; -import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.error.ErrorInfo; +import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.streams.io.StoredFileHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; @@ -60,47 +80,19 @@ import us.shandian.giga.get.DownloadMission; import us.shandian.giga.get.FinishedMission; import us.shandian.giga.get.Mission; import us.shandian.giga.get.MissionRecoveryInfo; -import org.schabi.newpipe.streams.io.StoredFileHelper; import us.shandian.giga.service.DownloadManager; import us.shandian.giga.service.DownloadManagerService; import us.shandian.giga.ui.common.Deleter; import us.shandian.giga.ui.common.ProgressDrawable; import us.shandian.giga.util.Utility; -import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; -import static android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; -import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; -import static us.shandian.giga.get.DownloadMission.ERROR_CONNECT_HOST; -import static us.shandian.giga.get.DownloadMission.ERROR_FILE_CREATION; -import static us.shandian.giga.get.DownloadMission.ERROR_HTTP_NO_CONTENT; -import static us.shandian.giga.get.DownloadMission.ERROR_INSUFFICIENT_STORAGE; -import static us.shandian.giga.get.DownloadMission.ERROR_NOTHING; -import static us.shandian.giga.get.DownloadMission.ERROR_PATH_CREATION; -import static us.shandian.giga.get.DownloadMission.ERROR_PERMISSION_DENIED; -import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING; -import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_HOLD; -import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_STOPPED; -import static us.shandian.giga.get.DownloadMission.ERROR_PROGRESS_LOST; -import static us.shandian.giga.get.DownloadMission.ERROR_RESOURCE_GONE; -import static us.shandian.giga.get.DownloadMission.ERROR_SSL_EXCEPTION; -import static us.shandian.giga.get.DownloadMission.ERROR_TIMEOUT; -import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_EXCEPTION; -import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_HOST; - public class MissionAdapter extends Adapter implements Handler.Callback { - private static final SparseArray ALGORITHMS = new SparseArray<>(); private static final String TAG = "MissionAdapter"; private static final String UNDEFINED_PROGRESS = "--.-%"; private static final String DEFAULT_MIME_TYPE = "*/*"; private static final String UNDEFINED_ETA = "--:--"; - private static final int HASH_NOTIFICATION_ID = 123790; - static { - ALGORITHMS.put(R.id.md5, "MD5"); - ALGORITHMS.put(R.id.sha1, "SHA1"); - } - private final Context mContext; private final LayoutInflater mInflater; private final DownloadManager mDownloadManager; @@ -697,7 +689,7 @@ public class MissionAdapter extends Adapter implements Handler.Callb .build()); final StoredFileHelper storage = h.item.mission.storage; compositeDisposable.add( - Observable.fromCallable(() -> Utility.checksum(storage, ALGORITHMS.get(id))) + Observable.fromCallable(() -> Utility.checksum(storage, id)) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> { diff --git a/app/src/main/java/us/shandian/giga/util/Utility.java b/app/src/main/java/us/shandian/giga/util/Utility.java index 9e6787d5d..4cd424ab9 100644 --- a/app/src/main/java/us/shandian/giga/util/Utility.java +++ b/app/src/main/java/us/shandian/giga/util/Utility.java @@ -13,8 +13,11 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; +import com.google.android.exoplayer2.util.Util; + import org.schabi.newpipe.R; -import org.schabi.newpipe.streams.io.SharpStream; +import org.schabi.newpipe.streams.io.SharpInputStream; +import org.schabi.newpipe.streams.io.StoredFileHelper; import java.io.BufferedOutputStream; import java.io.File; @@ -25,11 +28,9 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.HttpURLConnection; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.Locale; -import org.schabi.newpipe.streams.io.StoredFileHelper; +import okio.ByteString; public class Utility { @@ -203,44 +204,18 @@ public class Utility { Toast.makeText(context, R.string.msg_copied, Toast.LENGTH_SHORT).show(); } - public static String checksum(StoredFileHelper source, String algorithm) { - MessageDigest md; - - try { - md = MessageDigest.getInstance(algorithm); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); + public static String checksum(final StoredFileHelper source, final int algorithmId) + throws IOException { + ByteString byteString; + try (var inputStream = new SharpInputStream(source.getStream())) { + byteString = ByteString.of(Util.toByteArray(inputStream)); } - - SharpStream i; - - try { - i = source.getStream(); - } catch (Exception e) { - throw new RuntimeException(e); + if (algorithmId == R.id.md5) { + byteString = byteString.md5(); + } else if (algorithmId == R.id.sha1) { + byteString = byteString.sha1(); } - - byte[] buf = new byte[1024]; - int len; - - try { - while ((len = i.read(buf)) != -1) { - md.update(buf, 0, len); - } - } catch (IOException e) { - // nothing to do - } - - byte[] digest = md.digest(); - - // HEX - StringBuilder sb = new StringBuilder(); - for (byte b : digest) { - sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); - } - - return sb.toString(); - + return byteString.hex(); } @SuppressWarnings("ResultOfMethodCallIgnored") From f9443f74217350c44ca3e4b696108199ff2cf3a1 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Fri, 29 Jul 2022 06:40:55 +0530 Subject: [PATCH 04/63] Refactor removeWatchedStreams() in LocalPlaylistFragment. --- .../local/playlist/LocalPlaylistFragment.java | 56 +++++++------------ 1 file changed, 21 insertions(+), 35 deletions(-) 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 11d54f1ef..2938fe0b5 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 @@ -11,6 +11,7 @@ import android.os.Parcelable; import android.text.InputType; import android.text.TextUtils; import android.util.Log; +import android.util.Pair; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -34,7 +35,6 @@ import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.history.model.StreamHistoryEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; import org.schabi.newpipe.database.stream.model.StreamEntity; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.databinding.DialogEditTextBinding; import org.schabi.newpipe.databinding.LocalPlaylistHeaderBinding; import org.schabi.newpipe.databinding.PlaylistControlBinding; @@ -55,7 +55,6 @@ import org.schabi.newpipe.util.external_communication.ShareUtils; import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -63,7 +62,6 @@ import java.util.stream.Collectors; import icepick.State; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; -import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; @@ -309,7 +307,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment> getPlaylistObserver() { - return new Subscriber>() { + return new Subscriber<>() { @Override public void onSubscribe(final Subscription s) { showLoading(); @@ -395,31 +393,19 @@ public class LocalPlaylistFragment extends BaseLocalListFragment playlist) -> { - // Playlist data - final Iterator playlistIter = playlist.iterator(); - - // History data - final HistoryRecordManager recordManager = - new HistoryRecordManager(getContext()); - final Iterator historyIter = recordManager - .getStreamHistorySortedById().blockingFirst().iterator(); - + final var recordManager = new HistoryRecordManager(getContext()); + final var historyIdsFlowable = recordManager.getStreamHistorySortedById() + // already sorted by ^ getStreamHistorySortedById(), binary search can be used + .map(historyList -> historyList.stream().map(StreamHistoryEntry::getStreamId) + .collect(Collectors.toList())); + final var streamsFlowable = playlistManager.getPlaylistStreams(playlistId) + .zipWith(historyIdsFlowable, (playlist, historyStreamIds) -> { // Remove Watched, Functionality data final List notWatchedItems = new ArrayList<>(); boolean thumbnailVideoRemoved = false; - // already sorted by ^ getStreamHistorySortedById(), binary search can be used - final ArrayList historyStreamIds = new ArrayList<>(); - while (historyIter.hasNext()) { - historyStreamIds.add(historyIter.next().getStreamId()); - } - if (removePartiallyWatched) { - while (playlistIter.hasNext()) { - final PlaylistStreamEntry playlistItem = playlistIter.next(); + for (final var playlistItem : playlist) { final int indexInHistory = Collections.binarySearch(historyStreamIds, playlistItem.getStreamId()); @@ -432,14 +418,15 @@ public class LocalPlaylistFragment extends BaseLocalListFragment streamStatesIter = recordManager - .loadLocalStreamStateBatch(playlist).blockingGet().iterator(); + final var streamStates = recordManager.loadLocalStreamStateBatch(playlist) + .blockingGet(); + + for (int i = 0; i < playlist.size(); i++) { + final var playlistItem = playlist.get(i); + final var streamStateEntity = streamStates.get(i); - while (playlistIter.hasNext()) { - final PlaylistStreamEntry playlistItem = playlistIter.next(); final int indexInHistory = Collections.binarySearch(historyStreamIds, playlistItem.getStreamId()); - final StreamStateEntity streamStateEntity = streamStatesIter.next(); final long duration = playlistItem.toStreamInfoItem().getDuration(); if (indexInHistory < 0 || (streamStateEntity != null @@ -453,19 +440,18 @@ public class LocalPlaylistFragment extends BaseLocalListFragment(notWatchedItems, thumbnailVideoRemoved); + }); + disposables.add(streamsFlowable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(flow -> { - final List notWatchedItems = - (List) flow.blockingFirst(); - final boolean thumbnailVideoRemoved = (Boolean) flow.blockingLast(); + final List notWatchedItems = flow.first; + final boolean thumbnailVideoRemoved = flow.second; itemListAdapter.clearStreamItemList(); itemListAdapter.addItems(notWatchedItems); saveChanges(); - if (thumbnailVideoRemoved) { updateThumbnailUrl(); } From 6399e3950711e63d7fe4d5b299a8091d4327f4f4 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 7 Aug 2022 13:40:10 +0530 Subject: [PATCH 05/63] Remove from playlist only upon selecting the option and not afterwards. --- .../local/playlist/LocalPlaylistFragment.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) 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 2938fe0b5..9ace11a46 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 @@ -394,12 +394,14 @@ public class LocalPlaylistFragment extends BaseLocalListFragment historyList.stream().map(StreamHistoryEntry::getStreamId) .collect(Collectors.toList())); - final var streamsFlowable = playlistManager.getPlaylistStreams(playlistId) - .zipWith(historyIdsFlowable, (playlist, historyStreamIds) -> { + final var streamsMaybe = playlistManager.getPlaylistStreams(playlistId) + .firstElement() + .zipWith(historyIdsMaybe, (playlist, historyStreamIds) -> { // Remove Watched, Functionality data final List notWatchedItems = new ArrayList<>(); boolean thumbnailVideoRemoved = false; @@ -418,8 +420,8 @@ public class LocalPlaylistFragment extends BaseLocalListFragment(notWatchedItems, thumbnailVideoRemoved); }); - disposables.add(streamsFlowable.subscribeOn(Schedulers.io()) + + disposables.add(streamsMaybe.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(flow -> { final List notWatchedItems = flow.first; From 408a71cfdcdace8028070a2cd6f4476d38342366 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Wed, 3 Aug 2022 06:33:54 +0530 Subject: [PATCH 06/63] Calculate search score using streams. Co-authored-by: Stypox --- .../PreferenceFuzzySearchFunction.java | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceFuzzySearchFunction.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceFuzzySearchFunction.java index ea45c68d2..68b0010c4 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceFuzzySearchFunction.java +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceFuzzySearchFunction.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.settings.preferencesearch; import android.text.TextUtils; +import android.util.Pair; import org.apache.commons.text.similarity.FuzzyScore; @@ -8,6 +9,7 @@ import java.util.Comparator; import java.util.Locale; import java.util.Map; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; public class PreferenceFuzzySearchFunction @@ -72,39 +74,22 @@ public class PreferenceFuzzySearchFunction ); private final PreferenceSearchItem item; - private final float score; + private final double score; - FuzzySearchSpecificDTO( - final PreferenceSearchItem item, - final String keyword) { + FuzzySearchSpecificDTO(final PreferenceSearchItem item, final String keyword) { this.item = item; - - float attributeScoreSum = 0; - int countOfAttributesWithScore = 0; - for (final Map.Entry, Float> we - : WEIGHT_MAP.entrySet()) { - final String valueToProcess = we.getKey().apply(item); - if (valueToProcess.isEmpty()) { - continue; - } - - attributeScoreSum += - FUZZY_SCORE.fuzzyScore(valueToProcess, keyword) * we.getValue(); - countOfAttributesWithScore++; - } - - if (countOfAttributesWithScore != 0) { - this.score = attributeScoreSum / countOfAttributesWithScore; - } else { - this.score = 0; - } + this.score = WEIGHT_MAP.entrySet().stream() + .map(entry -> new Pair<>(entry.getKey().apply(item), entry.getValue())) + .filter(pair -> !pair.first.isEmpty()) + .collect(Collectors.averagingDouble(pair -> + FUZZY_SCORE.fuzzyScore(pair.first, keyword) * pair.second)); } public PreferenceSearchItem getItem() { return item; } - public float getScore() { + public double getScore() { return score; } } From 464a646671d08eef6b21ee5300053cccd0bb42c6 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Tue, 6 Sep 2022 09:20:52 +0530 Subject: [PATCH 07/63] Use LinkifyCompat. --- .../holder/CommentsMiniInfoItemHolder.java | 51 +++++++------------ 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java index b900750a8..fd03fcc3a 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java @@ -12,6 +12,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.text.util.LinkifyCompat; import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorUtil; @@ -27,7 +28,7 @@ import org.schabi.newpipe.util.PicassoHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; import org.schabi.newpipe.util.external_communication.TimestampExtractor; -import java.util.regex.Matcher; +import java.util.Objects; public class CommentsMiniInfoItemHolder extends InfoItemHolder { private static final String TAG = "CommentsMiniIIHolder"; @@ -39,7 +40,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { private final int commentVerticalPadding; private final RelativeLayout itemRoot; - public final ImageView itemThumbnailView; + private final ImageView itemThumbnailView; private final TextView itemContentView; private final TextView itemLikesCountView; private final TextView itemPublishedTime; @@ -47,27 +48,6 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { private String commentText; private String streamUrl; - private final Linkify.TransformFilter timestampLink = new Linkify.TransformFilter() { - @Override - public String transformUrl(final Matcher match, final String url) { - try { - final TimestampExtractor.TimestampMatchDTO timestampMatchDTO = - TimestampExtractor.getTimestampFromMatcher(match, commentText); - - if (timestampMatchDTO == null) { - return url; - } - - return streamUrl + url.replace( - match.group(0), - "#timestamp=" + timestampMatchDTO.seconds()); - } catch (final Exception ex) { - Log.e(TAG, "Unable to process url='" + url + "' as timestampLink", ex); - return url; - } - } - }; - CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId, final ViewGroup parent) { super(infoItemBuilder, layoutId, parent); @@ -243,14 +223,21 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { } private void linkify() { - Linkify.addLinks( - itemContentView, - Linkify.WEB_URLS); - Linkify.addLinks( - itemContentView, - TimestampExtractor.TIMESTAMPS_PATTERN, - null, - null, - timestampLink); + LinkifyCompat.addLinks(itemContentView, Linkify.WEB_URLS); + LinkifyCompat.addLinks(itemContentView, TimestampExtractor.TIMESTAMPS_PATTERN, null, null, + (match, url) -> { + try { + final var timestampMatch = TimestampExtractor + .getTimestampFromMatcher(match, commentText); + if (timestampMatch == null) { + return url; + } + return streamUrl + url.replace(Objects.requireNonNull(match.group(0)), + "#timestamp=" + timestampMatch.seconds()); + } catch (final Exception ex) { + Log.e(TAG, "Unable to process url='" + url + "' as timestampLink", ex); + return url; + } + }); } } From 9db0133a5bdc32b5ad9a1f5abfce1b04417d8184 Mon Sep 17 00:00:00 2001 From: HybridAU Date: Wed, 14 Sep 2022 21:00:44 +0800 Subject: [PATCH 08/63] Add play queue button to video details fragment * Add play queue button to video details fragment * Use existing ic_list icon * Still open play queue even when queue is empty * Change app:srcCompat to android:src --- .../newpipe/fragments/detail/VideoDetailFragment.java | 5 +++++ .../org/schabi/newpipe/player/PlayQueueActivity.java | 1 - .../java/org/schabi/newpipe/util/NavigationHelper.java | 5 +++++ .../res/layout-large-land/fragment_video_detail.xml | 10 ++++++++++ app/src/main/res/layout/fragment_video_detail.xml | 10 ++++++++++ 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 09e085791..bf84c7325 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -526,6 +526,9 @@ public final class VideoDetailFragment case R.id.overlay_buttons_layout: bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); break; + case R.id.overlay_play_queue_button: + NavigationHelper.openPlayQueue(getContext()); + break; case R.id.overlay_play_pause_button: if (playerIsNotStopped()) { player.playPause(); @@ -684,6 +687,7 @@ public final class VideoDetailFragment binding.overlayMetadataLayout.setOnClickListener(this); binding.overlayMetadataLayout.setOnLongClickListener(this); binding.overlayButtonsLayout.setOnClickListener(this); + binding.overlayPlayQueueButton.setOnClickListener(this); binding.overlayCloseButton.setOnClickListener(this); binding.overlayPlayPauseButton.setOnClickListener(this); @@ -2426,6 +2430,7 @@ public final class VideoDetailFragment binding.overlayMetadataLayout.setClickable(enable); binding.overlayMetadataLayout.setLongClickable(enable); binding.overlayButtonsLayout.setClickable(enable); + binding.overlayPlayQueueButton.setClickable(enable); binding.overlayPlayPauseButton.setClickable(enable); binding.overlayCloseButton.setClickable(enable); } diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index c18a7f487..94de7fef3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -212,7 +212,6 @@ public final class PlayQueueActivity extends AppCompatActivity if (player == null || player.getPlayQueue() == null || player.exoPlayerIsNull()) { unbind(); - finish(); } else { onQueueUpdate(player.getPlayQueue()); buildComponents(); diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 3b2c52691..13413e89d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -639,6 +639,11 @@ public final class NavigationHelper { return intent; } + public static void openPlayQueue(final Context context) { + final Intent intent = new Intent(context, PlayQueueActivity.class); + context.startActivity(intent); + } + /*////////////////////////////////////////////////////////////////////////// // Link handling //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index 5904724ad..a29fa8c78 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -698,6 +698,16 @@ android:paddingRight="@dimen/video_item_search_padding" tools:ignore="RtlHardcoded"> + + + + Date: Sat, 17 Sep 2022 17:18:15 +0300 Subject: [PATCH 09/63] Add monochrome icon --- app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index be438580f..6f379984a 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ + From fe227d5b942eebce51d771ef5ca095523ab584fe Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Fri, 23 Sep 2022 01:43:26 -0400 Subject: [PATCH 10/63] Utilize useSimpleSummaryProvider attribute --- app/src/main/res/xml/appearance_settings.xml | 12 ++++---- app/src/main/res/xml/content_settings.xml | 12 ++++---- app/src/main/res/xml/download_settings.xml | 4 +-- .../main/res/xml/notifications_settings.xml | 8 +++--- app/src/main/res/xml/video_audio_settings.xml | 28 +++++++++---------- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/xml/appearance_settings.xml b/app/src/main/res/xml/appearance_settings.xml index 2afd39800..d726e26b7 100644 --- a/app/src/main/res/xml/appearance_settings.xml +++ b/app/src/main/res/xml/appearance_settings.xml @@ -8,10 +8,10 @@ android:entries="@array/theme_description_list" android:entryValues="@array/theme_values_list" android:key="@string/theme_key" - android:summary="%s" android:title="@string/theme_title" app:singleLineTitle="false" - app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> @@ -211,10 +211,10 @@ android:entries="@array/seek_duration_description" android:entryValues="@array/seek_duration_value" android:key="@string/seek_duration_key" - android:summary="%s" android:title="@string/seek_duration_title" app:singleLineTitle="false" - app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" /> Date: Tue, 4 Oct 2022 17:31:35 +0800 Subject: [PATCH 11/63] Fix potential cast exception when casting to `Spannable` in `CommentTextOnTouchListener` --- .../newpipe/info_list/holder/CommentsMiniInfoItemHolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java index b900750a8..0fd0203d4 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java @@ -115,7 +115,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { itemContentView.setLines(COMMENT_DEFAULT_LINES); commentText = item.getCommentText(); - itemContentView.setText(commentText); + itemContentView.setText(commentText, TextView.BufferType.SPANNABLE); itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); if (itemContentView.getLineCount() == 0) { From ab99c14fd2d8fff0ba9cd949d18d9b64196ac2b3 Mon Sep 17 00:00:00 2001 From: devlearner Date: Thu, 6 Oct 2022 18:15:36 +0800 Subject: [PATCH 12/63] Fix crash on screen rotation --- .../java/org/schabi/newpipe/download/DownloadDialog.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 0e64e8b48..42b2c695c 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -145,6 +145,12 @@ public class DownloadDialog extends DialogFragment // Instance creation //////////////////////////////////////////////////////////////////////////*/ + public DownloadDialog() { + // Just an empty default no-arg ctor to keep Fragment.instantiate() happy + // otherwise InstantiationException will be thrown when fragment is recreated + // TODO: Maybe use a custom FragmentFactory instead? + } + /** * Create a new download dialog with the video, audio and subtitle streams from the provided * stream info. Video streams and video-only streams will be put into a single list menu, From dd07bd91a4993833d10c689b79fad8e03f46aea6 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 9 Oct 2022 19:48:38 +0200 Subject: [PATCH 13/63] Translated using Weblate (Korean) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Korean) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 67.6% (48 of 71 strings) Translated using Weblate (Portuguese) Currently translated at 67.6% (48 of 71 strings) Translated using Weblate (Bengali) Currently translated at 90.9% (584 of 642 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.8% (641 of 642 strings) Translated using Weblate (Danish) Currently translated at 91.4% (587 of 642 strings) Translated using Weblate (Galician) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 64.4% (414 of 642 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Portuguese) Currently translated at 99.8% (641 of 642 strings) Translated using Weblate (Korean) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Korean) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Korean) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (642 of 642 strings) Added translation using Weblate (Aymara (Southern)) Added translation using Weblate (Aymará) Translated using Weblate (Bengali) Currently translated at 88.9% (571 of 642 strings) Translated using Weblate (Portuguese) Currently translated at 99.6% (640 of 642 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (71 of 71 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 28.1% (20 of 71 strings) Translated using Weblate (Turkish) Currently translated at 32.3% (23 of 71 strings) Translated using Weblate (Galician) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Hindi) Currently translated at 70.2% (451 of 642 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Persian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Czech) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Basque) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Italian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Japanese) Currently translated at 99.6% (640 of 642 strings) Translated using Weblate (Russian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Russian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Dutch) Currently translated at 98.9% (635 of 642 strings) Translated using Weblate (French) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Japanese) Currently translated at 99.6% (640 of 642 strings) Translated using Weblate (Japanese) Currently translated at 99.6% (640 of 642 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Polish) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Czech) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Greek) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Italian) Currently translated at 100.0% (642 of 642 strings) Translated using Weblate (Japanese) Currently translated at 99.6% (640 of 642 strings) Translated using Weblate (Japanese) Currently translated at 99.6% (640 of 642 strings) Translated using Weblate (German) Currently translated at 100.0% (642 of 642 strings) Merge branch 'origin/dev' into Weblate. Translated using Weblate (Tamil) Currently translated at 52.6% (337 of 640 strings) Translated using Weblate (Vietnamese) Currently translated at 99.5% (637 of 640 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Portuguese) Currently translated at 60.5% (43 of 71 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Tamil) Currently translated at 52.5% (336 of 640 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Slovak) Currently translated at 8.4% (6 of 71 strings) Translated using Weblate (Kurdish (Central)) Currently translated at 98.1% (628 of 640 strings) Translated using Weblate (Galician) Currently translated at 99.6% (638 of 640 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (German) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Spanish) Currently translated at 88.7% (63 of 71 strings) Translated using Weblate (Hindi) Currently translated at 4.2% (3 of 71 strings) Translated using Weblate (Portuguese) Currently translated at 60.5% (43 of 71 strings) Translated using Weblate (Hindi) Currently translated at 68.7% (440 of 640 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Czech) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Italian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Russian) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Dutch) Currently translated at 99.3% (636 of 640 strings) Translated using Weblate (English) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (71 of 71 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 63.3% (45 of 71 strings) Translated using Weblate (Swedish) Currently translated at 47.8% (34 of 71 strings) Translated using Weblate (French) Currently translated at 90.1% (64 of 71 strings) Translated using Weblate (Spanish) Currently translated at 57.7% (41 of 71 strings) Translated using Weblate (Polish) Currently translated at 57.7% (41 of 71 strings) Translated using Weblate (Czech) Currently translated at 100.0% (71 of 71 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (71 of 71 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 15.4% (11 of 71 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Korean) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (640 of 640 strings) Translated using Weblate (French) Currently translated at 100.0% (640 of 640 strings) Co-authored-by: Agnieszka C Co-authored-by: AioiLight Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Allan Kimmer Jensen Co-authored-by: Andrew Boonin Co-authored-by: Danial Behzadi Co-authored-by: Denys Nykula Co-authored-by: Eduardo Malaspina Co-authored-by: Elias Quispe Chura Co-authored-by: Eric Co-authored-by: Error Specialist Co-authored-by: Fjuro Co-authored-by: Florin Voicu Co-authored-by: GnuPGを使うべきだ Co-authored-by: Gontzal Manuel Pujana Onaindia Co-authored-by: Hasan Co-authored-by: Hoseok Seo Co-authored-by: Hossain Rizbi Co-authored-by: Hosted Weblate Co-authored-by: Igor Nedoboy Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: JS Ahn Co-authored-by: JY3 Co-authored-by: Jeff Huang Co-authored-by: Leonardo Brauna Co-authored-by: Linerly Co-authored-by: Maday Co-authored-by: Marc Barten Co-authored-by: Marian Hanzel Co-authored-by: Max Xie Co-authored-by: MohammedSR Vevo Co-authored-by: NTFSynergy Co-authored-by: Nico Guo Co-authored-by: Oymate Co-authored-by: Oğuz Ersen Co-authored-by: Priit Jõerüüt Co-authored-by: Ray Co-authored-by: Rex_sa Co-authored-by: S3aBreeze Co-authored-by: SC Co-authored-by: SEENUVASAN T Co-authored-by: TXRdev Archive Co-authored-by: Terry Louwers Co-authored-by: TiA4f8R Co-authored-by: Tom Sawyer Co-authored-by: Translator Co-authored-by: Vas R Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: Yaron Shahrabani Co-authored-by: atilluF Co-authored-by: gallegonovato Co-authored-by: gonzalo Co-authored-by: komiratsu19273240ad76c354986 <2011945@naver.com> Co-authored-by: nautilusx Co-authored-by: pitachips Co-authored-by: pjammo Co-authored-by: ssantos Co-authored-by: variable virus Co-authored-by: weughgh Co-authored-by: zaioti Co-authored-by: zmni Co-authored-by: 이정희 Co-authored-by: 정주찬 Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/ Translation: NewPipe/Metadata --- app/src/main/res/values-ar/strings.xml | 4 +- app/src/main/res/values-ay/strings.xml | 2 + app/src/main/res/values-ayc/strings.xml | 2 + app/src/main/res/values-az/strings.xml | 4 +- app/src/main/res/values-bn-rBD/strings.xml | 2 +- app/src/main/res/values-bn/strings.xml | 24 +++- app/src/main/res/values-cs/strings.xml | 6 +- app/src/main/res/values-da/strings.xml | 4 +- app/src/main/res/values-de/strings.xml | 6 +- app/src/main/res/values-el/strings.xml | 10 +- app/src/main/res/values-es/strings.xml | 93 +++++++------ app/src/main/res/values-et/strings.xml | 20 +-- app/src/main/res/values-eu/strings.xml | 10 +- app/src/main/res/values-fa/strings.xml | 10 +- app/src/main/res/values-fr/strings.xml | 12 +- app/src/main/res/values-gl/strings.xml | 25 ++-- app/src/main/res/values-he/strings.xml | 4 +- app/src/main/res/values-hi/strings.xml | 126 +++++++++--------- app/src/main/res/values-in/strings.xml | 8 +- app/src/main/res/values-it/strings.xml | 17 ++- app/src/main/res/values-ja/strings.xml | 15 ++- app/src/main/res/values-ko/strings.xml | 64 ++++----- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 4 +- app/src/main/res/values-pt-rBR/strings.xml | 12 +- app/src/main/res/values-pt-rPT/strings.xml | 10 +- app/src/main/res/values-pt/strings.xml | 4 +- app/src/main/res/values-ro/strings.xml | 10 +- app/src/main/res/values-ru/strings.xml | 4 +- app/src/main/res/values-sc/strings.xml | 10 +- app/src/main/res/values-sk/strings.xml | 6 +- app/src/main/res/values-tr/strings.xml | 4 +- app/src/main/res/values-uk/strings.xml | 4 +- app/src/main/res/values-zh-rCN/strings.xml | 6 +- app/src/main/res/values-zh-rHK/strings.xml | 8 +- app/src/main/res/values-zh-rTW/strings.xml | 4 +- .../metadata/android/es/changelogs/65.txt | 21 ++- .../metadata/android/es/changelogs/68.txt | 31 ++++- .../metadata/android/es/changelogs/750.txt | 22 +++ .../metadata/android/es/changelogs/760.txt | 43 ++++++ .../metadata/android/es/changelogs/780.txt | 12 ++ .../metadata/android/es/changelogs/790.txt | 14 ++ .../metadata/android/es/changelogs/800.txt | 27 ++++ .../metadata/android/es/changelogs/963.txt | 1 + .../metadata/android/es/changelogs/983.txt | 9 ++ .../metadata/android/pt-BR/changelogs/963.txt | 1 + .../metadata/android/pt-BR/changelogs/978.txt | 1 + .../metadata/android/pt-BR/changelogs/982.txt | 1 + .../metadata/android/pt-BR/changelogs/985.txt | 1 + .../metadata/android/pt-BR/changelogs/989.txt | 3 + .../android/pt-BR/full_description.txt | 2 +- .../metadata/android/pt-PT/changelogs/65.txt | 26 ++++ .../metadata/android/pt-PT/changelogs/965.txt | 6 + .../metadata/android/pt-PT/changelogs/982.txt | 1 + .../metadata/android/pt-PT/changelogs/984.txt | 7 + .../metadata/android/pt-PT/changelogs/985.txt | 1 + .../metadata/android/pt-PT/changelogs/988.txt | 2 + .../metadata/android/pt-PT/changelogs/989.txt | 3 + .../metadata/android/pt/changelogs/982.txt | 1 + .../metadata/android/pt/changelogs/984.txt | 7 + .../metadata/android/pt/changelogs/985.txt | 1 + .../metadata/android/pt/changelogs/988.txt | 2 + .../metadata/android/pt/changelogs/989.txt | 3 + .../metadata/android/tr/changelogs/68.txt | 31 +++++ 64 files changed, 611 insertions(+), 225 deletions(-) create mode 100644 app/src/main/res/values-ay/strings.xml create mode 100644 app/src/main/res/values-ayc/strings.xml create mode 100644 fastlane/metadata/android/es/changelogs/750.txt create mode 100644 fastlane/metadata/android/es/changelogs/760.txt create mode 100644 fastlane/metadata/android/es/changelogs/780.txt create mode 100644 fastlane/metadata/android/es/changelogs/790.txt create mode 100644 fastlane/metadata/android/es/changelogs/800.txt create mode 100644 fastlane/metadata/android/es/changelogs/963.txt create mode 100644 fastlane/metadata/android/es/changelogs/983.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/963.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/978.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/982.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/985.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/989.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/65.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/965.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/982.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/984.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/985.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/988.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/989.txt create mode 100644 fastlane/metadata/android/pt/changelogs/982.txt create mode 100644 fastlane/metadata/android/pt/changelogs/984.txt create mode 100644 fastlane/metadata/android/pt/changelogs/985.txt create mode 100644 fastlane/metadata/android/pt/changelogs/988.txt create mode 100644 fastlane/metadata/android/pt/changelogs/989.txt create mode 100644 fastlane/metadata/android/tr/changelogs/68.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 83bae93b3..f68e2e748 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -769,5 +769,7 @@ تنسيق غير معروف جودة غير معروفة حجم الفاصل الزمني لتحميل التشغيل - عرض مقاطع الفيديو المستقبلية + عرض العناصر المستقبلية + إخفاء العناصر المستقبلية + إخفاء العناصر التي تمت مشاهدتها \ No newline at end of file diff --git a/app/src/main/res/values-ay/strings.xml b/app/src/main/res/values-ay/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-ay/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-ayc/strings.xml b/app/src/main/res/values-ayc/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-ayc/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 057be6d02..9b2bdde77 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -717,5 +717,7 @@ Naməlum format Naməlum keyfiyyət Oynatma yükləmə intervalı həcmi - Gələcək videoları göstərin + Gələcək elementləri göstərin + Baxılan elementləri gizlədin + Gələcək elementləri gizlədin \ No newline at end of file diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 1de4d3a50..730150552 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -1,6 +1,6 @@ - শুরু করতে আতস কাঁচটিতে টাচ করুন। + শুরু করতে আতস কাঁচটিতে টিপ দাও। %1$s তারিখে প্রকাশিত কোন স্ট্রিম প্লেয়ার নেই। VLC ইনস্টল করতে চান\? ইনস্টল diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 6a634a3a4..392ca8a07 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -220,7 +220,7 @@ ইতিহাস সার্চগুলো স্থানীয়ভাবে জমা করো খোজ ইতিহাস - সার্চের সময় পরামর্শ দেখাও + সার্চ করার সময় দেখানোর জন্য সাজেশন বেছে নিন সার্চ পরামর্শ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত @@ -624,4 +624,26 @@ অজ্ঞাত মান নতুন ধারার বিজ্ঞপ্তি নেটওয়ার্ক সংযোগ দরকার + সদস্যতার জন্য নতুন স্ট্রীম সম্পর্কে বিজ্ঞপ্তি + ত্রুটি রিপোর্ট করার জন্য বিজ্ঞপ্তি + NewPipe একটি ত্রুটির সম্মুখীন হয়েছে, রিপোর্ট করতে আলতো চাপুন + একটি ত্রুটি ঘটেছে, বিজ্ঞপ্তি দেখুন + আপনার ক্র্যাশ নিয়ে আলোচনা করা একটি সমস্যা ইতিমধ্যেই বিদ্যমান কিনা অনুগ্রহ করে পরীক্ষা করুন৷ ডুপ্লিকেট টিকিট তৈরি করে আপনি আমাদের কাছ থেকে সময় নেন তা আমরা প্রকৃত বাগ ঠিক করার জন্য ব্যয় করতে পারি। + ফাইলটি বিদ্যমান নেই বা এটি পড়ার বা লেখার অনুমতির অভাব রয়েছে + প্রক্রিয়ারত…এক মুহূর্ত লাগতে পারে + লিকক্যানারি নেই + ত্রুটি স্ন্যাকবার দেখাও + নতুন সংস্করণের জন্য নিজে দেখো + + %1$sটি ডাউনলোড মুছা হয়েছে + %1$sটি ডাউনলোড মুছা হয়েছে + + \"চালক বন্ধ করো\" দেখাও + দেখা ভুক্তি লুকাও + বিজ্ঞপ্তি নিষ্ক্রিয় + ভবিষ্যৎ ভুক্তি লুকাও + ত্রুটি বিজ্ঞপ্তি বানাও + ভুক্তি মুছতে ডানে-বামে সরাও + সম্প্রচার বিষয়ক তথ্য প্রক্রিয়ারত… + ভবিষ্যৎ ভুক্তি দেখাও \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 41bfafaac..665be1e55 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -699,7 +699,7 @@ Výchozí ExoPlayer Nastavit oznámení o právě přehrávaném streamu Oznámení o nových streamech - Oznámit o nových strýmech od vašich odběrů + Oznámit o nových streamech od vašich odběrů Frekvence kontroly Jakákoli síť Nutné síťové připojení @@ -727,8 +727,10 @@ U externích přehrávačů nejsou dostupné žádné zvukové streamy Neznámý formát Neznámá kvalita - Zobrazit nadcházející videa + Zobrazit nadcházející položky Streamy, které zatím nejsou podporovány systémem stahování, nebudou zobrazeny Vyberte kvalitu pro externí přehrávače U externích přehrávačů nejsou dostupné žádné video streamy + Skrýt zhlédnuté položky + Skrýt nadcházející položky \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index fc16fbd63..a336d21a3 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -555,7 +555,7 @@ Altid opdater Vælg abonnementer Vis sete elementer - Dette indhold er ikke tilgængeligt i dit land + Dette indhold er ikke tilgængeligt i dit land. Af %s Videoer på playlisten som allerede er blevet set fjernes. \nDette kan ikke fortrydes! @@ -653,4 +653,6 @@ Vis \"crash afspilleren\" Crash appen Vis et crash alternativ når afspilleren er i brug + Vis en fejl snackbar + Brug system mappevælger (SAF) \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e57c1874e..fa2c32e32 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -589,7 +589,7 @@ Deaktiviere diese Option, um Meta-Infofelder mit zusätzlichen Informationen zum Stream-Ersteller, zum Stream-Inhalt oder zu einer Suchanforderung auszublenden Kapitel Beschreibung - Verwandte Streams + Verwandte Elemente Kommentare Ausschalten, um Videobeschreibung und Zusatzinformationen auszublenden Beschreibung anzeigen @@ -717,5 +717,7 @@ Streams, die noch nicht vom Downloader unterstützt werden, werden nicht angezeigt Der ausgewählte Stream wird von externen Playern nicht unterstützt Größe des Ladeintervalls für die Wiedergabe - Zukünftige Videos anzeigen + Zukünftige Elemente anzeigen + Angesehene Elemente ausblenden + Zukünftige Elemente ausblenden \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b1b11e24d..c23e4ae25 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -676,15 +676,15 @@ Συνέβη ένα σφάλμα. Δείτε την ειδοποίηση Δημιουργία ειδοποίησης σφάλματος Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια. -\nΕγκαταστήστε έναν ή δοκιμάστε να απενεργοποιήσετε το \'%s\' στις ρυθμίσεις λήψεων. +\nΕγκαταστήστε έναν ή δοκιμάστε να απενεργοποιήσετε το \'%s\' στις ρυθμίσεις λήψεων Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια. -\nΕγκαταστήστε έναν συμβατό με το Πλαίσιο Πρόσβασης Αποθήκευσης. +\nΕγκαταστήστε έναν συμβατό με το Πλαίσιο Πρόσβασης Αποθήκευσης Το NewPipe παρουσίασε ένα σφάλμα. Πατήστε για αναφορά Εμφάνιση μιας snackbar σφάλματος Καρφιτσωμένο σχόλιο Το LeakCanary δεν είναι διαθέσιμο Εξ\' ορισμού ExoPlayer - Αλλάξτε το μέγεθος του διαστήματος φόρτωσης (επί του παρόντος είναι %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική φόρτωση βίντεο. Οι αλλαγές απαιτούν επανεκκίνηση της εφαρμογής. + Αλλάξτε το μέγεθος του διαστήματος φόρτωσης (επί του παρόντος είναι %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική φόρτωση βίντεο. Οι αλλαγές απαιτούν επανεκκίνηση της εφαρμογής Ειδοποιήσεις %s νέα ροή @@ -717,5 +717,7 @@ Άγνωστος τύπος αρχείου Άγνωστη ποιότητα Μέγεθος διαστήματος φόρτωσης αναπαραγωγής - Εμφάνιση μελλοντικών βίντεο + Εμφάνιση μελλοντικών αντικειμένων + Απόκρυψη θεαθέντων + Απόκρυψη μελλοντικών αντικειμένων \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7b7dfe99e..bfe835332 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -18,7 +18,7 @@ Reproducir con Kodi ¿Instalar la aplicación Kore que falta\? Mostrar opción «Reproducir con Kodi» - Mostrar opción para reproducir un vídeo a través de Kodi + Mostrar una opción para reproducir un vídeo a través de Kodi media center Audio Formato de audio predefinido Descargar @@ -79,7 +79,7 @@ Copiado al portapapeles Defina una carpeta de descargas más tarde en los ajustes La interfaz de la aplicación dejó de funcionar - Lo sucedido:\\nPetición:\\nIdioma del contenido:\\nPaís del contenido:\\nIdioma de la aplicación:\\nServicio:\\nHora GMT:\\nPaquete:\\nVersión:\\nVersión del SO: + Qué:\\nSolicitud:\\nIdioma del contenido:\\nPaís del contenido:\\nIdioma de la aplicación:\\nServicio:\\nHora GMT:\\nPaquete:\\nVersión:\\nVersión del sistema operativo: Negro Todo k @@ -144,20 +144,23 @@ Historial y caché Deshacer No hay resultados - Nada aquí, sino grillos + Nada aquí más que grillos Sin suscriptores %s suscriptor + %s suscriptores %s suscriptores Sin reproducciones - %s reproducción - %s reproducciones + %s vista + %s vistas + %s vistas Sin vídeos %s vídeo + %s vídeos %s vídeos ¿Quieres borrar este elemento del historial de búsquedas\? @@ -181,12 +184,12 @@ [Desconocido] Comenzar a reproducir en segundo plano Reproducir en modo emergente - Mostrar sugerencia de \"Mantener pulsado para añadir a la cola\" + Mostrar la sugerencia \"Mantener presionado para poner a la cola\" Nuevo y lo mejor Mantener pulsado para añadir a la cola Donar NewPipe es desarrollado por voluntarios que emplean su tiempo libre para brindarle la mejor experiencia. Haz una aportación para ayudarlos a crear un NewPipe mejor mientras disfrutan de una taza de café. - Dar de vuelta + Devolver Sitio web Visita el sitio web de NewPipe para más información y noticias. País predefinido del contenido @@ -217,7 +220,7 @@ Esto reemplazará tu configuración actual. Descargar archivo de retransmisión Mostrar información - Playlists en marcadores + Playlists de marcadores Añadir a Arrastrar para reordenar Crear @@ -244,7 +247,7 @@ Depuración Auto generados La monitorización de fugas de memoria puede causar que la aplicación no responda al realizar el volcado de memoria - Informar errores fuera del ciclo de duración + Informar errores fuera del ciclo de vida Forzar informe de excepciones no entregables de RX fuera del fragmento o del ciclo de actividad después del descarte Usar búsqueda rápida e inexacta La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión. Buscar de a 5, 15 o 25 segundos no funciona @@ -253,8 +256,8 @@ Archivo Archivo movido o borrado La carpeta no existe - No existe tal archivo/origen del contenido - El archivo no existe o carece de los permisos para leer o escribir en él + No el archivo/en el origen del contenido + El archivo no existe o falta permiso para poder leer o escribir en él El nombre del archivo no puede estar vacío Ocurrió un error: %1$s Importar @@ -292,7 +295,7 @@ Quitar todos los datos guardados de páginas web Se vació la caché de metadatos Controles de velocidad de reproducción - Tempo + Ritmo Tono Desvincular (puede causar distorsión) No hay streams disponibles para descargar @@ -378,8 +381,8 @@ Falló el posprocesamiento NewPipe se cerró mientras se trabajaba en el archivo No hay suficiente espacio disponible en el dispositivo - Se perdió el progreso porque el archivo fue borrado - Tiempo de espera excedido + Progreso perdido, porque el archivo fue borrado + El tiempo de conexión expiro No se puede recuperar esta descarga Preguntar dónde descargar Se le preguntará dónde guardar cada descarga. @@ -414,7 +417,7 @@ Desactivar para ocultar comentarios Reproducción automática Sin comentarios - No se pudo cargar comentarios + No se pudieron cargar los comentarios Cerrar Continuar reproducción Restaurar última posición de la reproducción @@ -426,16 +429,18 @@ Borra todas las posiciones de reproducción ¿Quieres borrar todas las posiciones de reproducción\? Activar/desactivar servicio, seleccionados actualmente: - Quiosco predefinido + Quiosco predeterminado Nadie está viendo - Viendo %s - Viendo %s + Visualización %s + Visualizaciones %s + Visualizaciones %s Nadie está escuchando - %s escucha - %s escuchas + %s oyente + %s oyentes + %s oyentes El idioma cambiará luego de que se reinicie la aplicación Duración de búsqueda al avanzar y/o retroceder @@ -454,7 +459,7 @@ Elige una instancia Limpiar historial de descargas Borrar archivos descargados - Permitir mostrar sobre otras aplicaciones + Dar permiso para mostrar sobre otras aplicaciones Idioma de aplicación Predefinido del sistema Pulsa en «Hecho» al resolverlo @@ -462,6 +467,7 @@ Vídeos %d segundo + %d segundos %d segundos Debido a limitaciones de ExoPlayer, la duración de la búsqueda fue definida en %d segundos @@ -470,14 +476,17 @@ Ayuda %d minuto + %d minutos %d minutos %d hora + %d horas %d horas %d día + %d días %d días Grupos de canales @@ -488,8 +497,9 @@ Elegir suscripciones No hay suscripciones seleccionadas - %d elegida - %d elegidas + %d seleccionado + %d seleccionados + %d seleccionados Nombre de grupo vacío ¿Borrar este grupo\? @@ -540,7 +550,7 @@ Sin marcadores de lista de reproducción aún Selecciona una lista de reproducción Por favor revisa si ya existe una discusión sobre tu problema. Al crear entradas duplicadas, toma tiempo de nosotros que podríamos usar para arreglar tal problema. - Informar en Github + Informe en GitHub Copiar informe con formato Mostrando resultados para: %s Orden aleatorio @@ -558,7 +568,7 @@ Almacenar en memoria (búfer) Repetir ¡Puedes seleccionar como máximo tres acciones para mostrar en la notificación compacta! - Edita cada una de las acciones en la notificación pulsando sobre ellas. Selecciona hasta tres de ellas para mostrarlas en la notificación compacta usando las casillas de verificación de la derecha. + Edite cada una de las acciones de notificación que aparecen a continuación pulsando sobre ellas. Seleccione hasta tres de ellas para que se muestren en la notificación compacta utilizando las casillas de verificación de la derecha Botón de quinta acción Botón de cuarta acción Botón de tercera acción @@ -574,21 +584,21 @@ Limpiar las cookies reCAPTCHA YouTube provee un «Modo restringido», el cual oculta contenido potencialmente solo apto para adultos Ajustar color de notificación - Permitir a Android personalizar el color de la notificación usando el color principal de la miniatura (ten en cuenta que esta opción no funciona en todos los dispositivos) + Hacer que Android personalice el color de la notificación de acuerdo con el color principal de la miniatura (tenga en cuenta que esto no está disponible en todos los dispositivos) Usar miniatura como fondo de pantalla de bloqueo y notificaciones Mostrar vista previa Desactivar para ocultar información adicional sobre el creador o contenido de la transmisión - Desactivar para ocultar la descripción del vídeo e información adicional - Ninguna aplicación en tu dispositivo puede abrir esto + Desactivar para ocultar la descripción del vídeo y la información adicional + Ninguna aplicación en su dispositivo puede abrir esto Capítulos - Recientes + Reciente Calculando el hash Descripción Transmisiones relacionadas Comentarios Notificaciones sobre el progreso del hashing del vídeo - Notificación de hash de vídeo - Mostrar metainformación + Notificación de hash de video + Mostrar meta información Mostrar descripción Abrir con Esta es una pista de SoundCloud Go+, al menos en tu país, por lo que no puede ser transmitido ni descargado por NewPipe. @@ -601,7 +611,7 @@ \nDebido a las nuevas políticas de YouTube con vídeos con restricción de edad, NewPipe no puede acceder a ninguna de sus transmisiones de vídeo, y por lo tanto, no puede reproducirlo. Radio La descarga ha comenzado - Resolver + Solucionar Puedes seleccionar tu tema nocturno favorito a continuación Modo oscuro Selecciona tu tema nocturno favorito — %s @@ -641,13 +651,13 @@ Apagado Encendido Modo tableta - Mostrar elementos vistos + Mostrar elementos ya vistos No mostrar Baja calidad (más pequeño) Alta calidad (más grande) Miniatura en barra de desplazamiento Los comentarios están deshabilitados - Valorado por el creador + De corazón por el creador Marcar como visto Mostrar cintas de colores Picasso encima de las imágenes indicando su origen: rojo para la red, azul para el disco y verde para la memoria Mostrar indicadores de imagen @@ -655,10 +665,12 @@ Sugerencias de búsqueda local Descarga %1$s eliminada + Descargas %1$s eliminadas Descargas %1$s eliminadas Descarga finalizada + %s descargas finalizadas %s descargas finalizadas Desliza los elementos para removerlos @@ -679,9 +691,11 @@ NewPipe ha detectado un error, pulse aquí para informar Se produjo un error, vea la notificación Crear una notificación de error - Mostrar un snackbar de error - No se encontró ningún administrador de archivos apropiado para esta acción. Instale un administrador de archivos o intente deshabilitar \'%s\' en la configuración de descarga - No se encontró ningún administrador de archivos apropiado para esta acción. Instale un administrador de archivos compatible con Storage Access Framework + Mostrar una barra de error + No se ha encontrado un gestor de archivos apropiado para esta acción. +\nPor favor, instale un gestor de archivos o intente desactivar \'%s\' en los ajustes de la descarga + No se encontró ningún administrador de archivos apropiado para esta acción. +\n Instale un administrador de archivos compatible con Storage Access Framework Comentario fijado LeakCanary no está disponible ExoPlayer valor por defecto @@ -690,7 +704,7 @@ Nuevos streams Notificación del reproductor Configurar notificación de la reproducción en curso - Ahora estás suscrito a este canal + Ahora te has suscrito a este canal Cualquier red , Comprobar la existencia de nuevos directos @@ -706,6 +720,7 @@ Se requiere conexión a red %s nuevo directo + %s nuevos directos %s nuevos directos Porcentaje @@ -719,4 +734,6 @@ Calidad desconocida Mostrar videos futuros Tamaño del intervalo de carga de reproducción + Ocultar los elementos mirados + Ocultar elementos futuros \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 2d776155c..71458729c 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -193,7 +193,7 @@ Vali määra allalaadimiste kataloog hiljem sätetes Need õigused on vajalikud \nhüpikakna avamiseks - Kustutati 1 element. + 1 üksus kustutatud. Laadi alla Lubatud tähemärgid failinimedes Vigased tähemärgid asendatakse selle väärtusega @@ -216,7 +216,7 @@ Loe litsentsi Ajalugu Ajalugu - Kas kustutada see kirje otsinguajaloost? + Kas kustutame selle kirje otsinguajaloost\? Viimati esitatud Enim esitatud Avalehe sisu @@ -607,8 +607,8 @@ Madalam kvaliteet (väiksem) Parem kvaliteet (suurem) Otsinguriba pisipildivaates - Teenuste algne tekstid on nähtavad voo elementides - Kuva elementide algupärane aeg + Teenuste algtekstid on nähtavad voo elementides + Kuva üksuste algupärane aeg Kommentaarid on välja lülitatud Palun kontrolli kas sinu kogetud krahhi käsitlev vearaport on juba olemas. Luues korduvraporteid võtad meilt aega, mida saaksime kulutada tegelike vigade parandamiseks. Instants on juba olemas @@ -650,7 +650,7 @@ Näita piltide allikat Kaugotsingu soovitused Kohaliku otsingu soovitused - Kirje eemaldamiseks viipa + Üksuse eemaldamiseks viipa Kustutasin %1$s allalaadimise Kustutasin %1$s allalaadimist @@ -678,13 +678,13 @@ Tekkis viga, vaata vastavat teadet Koosta veateade Selle tegevuse jaoks ei leidunud sobilikku failihaldurit. -\nPalun paigalda nutiseadmesse failihaldur või proovi allalaadimiste seadistustest „%s“ välja lülitada. +\nPalun paigalda nutiseadmesse failihaldur või proovi allalaadimiste seadistustest „%s“ välja lülitada Selle tegevuse jaoks ei leidunud sobilikku failihaldurit. -\nPalun paigalda nutiseadmesse failihaldur, mis järgib Storage Access Framework reeglistikku. +\nPalun paigalda nutiseadmesse failihaldur, mis järgib Storage Access Framework reeglistikku Esiletõstetud kommentaar LeakCanary pole saadaval ExoPlayer\'i vaikimisi väärtused - Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem. Muudatuste jõustamine eeldab rakenduse uuesti käivitamist. + Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem. Muudatuste jõustamine eeldab rakenduse uuesti käivitamist Meediamängija teavitused Teavitused pole kasutusel Kontrollimise sagedus @@ -717,5 +717,7 @@ Protsent Pooltoon Taasesituseks vajalike andmete laadimise samm - Näita tulevasi videoid + Näita tulevasi üksuseid + Peida tulevased üksused + Peida vaadatud üksused \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index c2d92c517..19f9fcfa6 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -673,12 +673,12 @@ Bilatu bertsio berriak eskuz Elementu berriak jarioan Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. -\nMesedez, instalatu Storage Access Framework-ekin bateragarria den fitxategi kudeatzaile bat. +\nMesedez, instalatu Storage Access Framework-ekin bateragarria den fitxategi kudeatzaile bat Ainguratutako iruzkina Itxi erreproduzigailua Eguneraketak bilatzen… Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. -\nMesedez, instalatu fitxategi kudeatzaile bat edo saiatu \'%s\' desgaitzen deskarga ezarpenetan. +\nMesedez, instalatu fitxategi kudeatzaile bat edo saiatu \'%s\' desgaitzen deskarga ezarpenetan Erreproduzigailua erabiltzean ustekabean ixteko aukera ematen du Erakutsi errore barra bat Sortu errore jakinarazpen bat @@ -693,7 +693,7 @@ Kanal honetara harpidetu zara , Txandakatu denak - Aldatu karga maiztasun tamaina (unean %s). Balio txikiago batek bideoaren hasierako karga azkartu dezake. Erreproduzigailuaren berrabiarazte bat behar du. + Aldatu karga maiztasun tamaina (unean %s). Balio txikiago batek bideoaren hasierako karga azkartu dezake. Erreproduzigailuaren berrabiaraztea behar du Harpidetzen jario berriei buruz jakinarazi Ezabatu deskargatutako fitxategi guztiak biltegitik\? Harpidetzentzako jario berrien jakinarazpenak @@ -716,6 +716,8 @@ Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen bideo jariorik Formatu ezezaguna Kalitate ezezaguna - Erakutsi etorkizuneko bideoak + Erakutsi etorkizuneko elementuak Hautatu kanpoko erreproduzigailuen kalitatea + Ezkutatu etorkizuneko elementuak + Ezkutatu ikusitako elementuak \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 6b607b6ae..1703784fd 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -672,18 +672,18 @@ نمایش یک گزینهٔ فروپاشی هنگام استفاده از پخش کننده نمایش «فروپاشی پخش کننده» مدیر پروندهٔ مناسبی برای این کنش یافت نشد. -\nلطفاً مدیر پرونده‌ای نصب کرده یا در تنظیمات بارگیری، «%s» را خاموش کنید. +\nلطفاً مدیر پرونده‌ای نصب کرده یا در تنظیمات بارگیری، «%s» را خاموش کنید آگاهی گزارش خطا آگاهی برای گزارش‌خطاها نمایش یک نوار خطا ایجاد یک آگاهی خطا مدیر پروندهٔ مناسبی برای این کنش یافت نشد. -\nلطفاً مدیر پرونده‌ای سازگار با چارچوب‌دسترسی ذخیره‌ساز نصب کنید. +\nلطفاً مدیر پرونده‌ای سازگار با چارچوب‌دسترسی ذخیره‌ساز نصب کنید نیوپایپ به خطایی برخورد. برای گزارش، بزنید خطایی رخ داد. آگاهی را ببینید نظر سنجاق شده لیک‌کاناری موجود نیست - تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد. تغییرها نیاز به یک آغاز دوبارهٔ پخش‌کننده دارند. + تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد. تغییرها نیاز به یک آغاز دوبارهٔ پخش‌کننده دارند پیش‌گزیدهٔ اگزوپلیر آگاهی‌ها بار کردن جزییات جریان… @@ -717,5 +717,7 @@ قالب ناشناخته کیفیت ناشناخته اندازهٔ دورهٔ بار کردن پخش - نمایش ویدیوهای آینده + نمایش موارد آینده + نهفتن موارد آینده + نهفتن موارد دیده شده \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 63a2e19d1..525bd6675 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -679,13 +679,13 @@ Une erreur s\'est produite, voir la notification Créer une notification d\'erreur Aucun gestionnaire de fichiers approprié n\'a été trouvé pour cette action. -\nVeuillez installer un gestionnaire de fichiers compatible avec l\'Infrastructure d\'accès au stockage. +\nVeuillez installer un gestionnaire de fichiers compatible avec l\'Infrastructure d\'accès au stockage Afficher une barre d’erreur - Aucun gestionnaire de fichier approprié n\'a été trouvé pour cette action. -\nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver \'%s\' dans les paramètres de téléchargement. + Aucun gestionnaire de fichiers approprié n\'a été trouvé pour cette action. +\nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver « %s » dans les paramètres de téléchargement Commentaire épinglé LeakCanary n\'est pas disponible - Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos . + Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos. Changer cette valeur nécessite de redémarrer le lecteur Valeur par défaut d’ExoPlayer Nouveaux flux Configurer la notification du flux en cours de lecture @@ -719,5 +719,7 @@ Le flux séléctionné n\'est pas supporté par les lecteurs externes Aucun flux vidéo n\'est disponible pour les lecteurs externes Taille de l\'intervalle de chargement de la lecture - Afficher les futures vidéos + Afficher les futurs éléments + Masquer les éléments visionnés + Masquer les éléments à venir \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index bebbf2483..0e792b7d9 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -3,7 +3,7 @@ Prema na lupa para comezar. Publicado o día %1$s Non foi encontrado ningún reprodutor. Quere instalar o VLC\? - Non foi encontrado ningún reprodutor (pode instalar o VLC para o reproducir). + Non se atopou ningún reprodutor de transmisión (podes instalar VLC para reproducilo). Instalar Cancelar Abrir no navegador @@ -334,8 +334,8 @@ Minimizar o reprodutor popup Limitado Só son compatibles os URLs HTTPS - Control xestual do volume - Desactíveo para agochar os comentarios + Control por xestos do volume + Desactiva para agochalos comentarios Retomar a reprodución Páxina das listas de reprodución Por %s @@ -455,7 +455,7 @@ Prema para descargar A actualización de NewPipe está dispoñible! Automático - Amosar indicadores de posición de reprodución en listas + Mostra os indicadores de posición de reprodución nas listas Use xestos para controlar o brillo do reprodutor Rede Lista @@ -534,8 +534,8 @@ Posicións nas listas Restaurar a última posición de reprodución Control do xesto de brillo - Use xestos para controlar o volume do reprodutor - Amosar comentarios + Use xestos para controlalo volume do reprodutor + Ensinalos comentarios Duración da busca rápida cara a adiante / cara atrás Elixir lapela Darse de baixa @@ -657,9 +657,10 @@ Inciar reprodutor principal en pantalla completa Non iniciar vídeos no reprodutor mini, mais cambiar a pantalla completa directamente, se a rotación estiver bloqueada. Aínda pode acceder o reprodutor mini ao saír da pantalla completa Deslice os elementos para removelos - Non se atopou ningún xestor de ficheiros axeitado para esta acción. Instala un xestor de ficheiros ou intenta desactivar \'%s\' na configuración de descarga - Non foi atopado ningún xestor de arquivos adecuado para esta acción. -\nPor favor instale un compatíbel co Sistema de Acceso ao Almacenamento. + Non se atopou ningún xestor de ficheiros axeitado para esta acción. +\nPor favor instala un xestor de ficheiros ou intenta desactivar \'%s\' na configuración de descarga + Non se atopou ningún xestor de ficheiros axeitado para esta acción. +\nPor favor instala un xestor de ficheiros compatible con Storage Access Framework Valorado polo creador Ocorreu un erro, vexa a notificación Auto-enfileirar @@ -673,7 +674,7 @@ Procurar manualmente novas versións A procurar actualizacións… A partir do Android 10, só o \'Sistema de Acceso ao Almacenamento\' está soportado - Cambia o tamaño do intervalo de carga (actualmente %s). Un valor menor pode acelerar o carregamento do vídeo. Cambios poden precisar un reinicio do reprodutor. + Cambial dimensión do intervalo de carga (actualmente %s). Un valor máis baixo pode alixeirala carga inicial do vídeo. Os cambios requiren un reinicio da aplicacion Procesando... Pode devagar un momento Crear unha notificación de erro Amosar fitas coloridas de Picasso na cima das imaxes que indican a súa fonte: vermello para a rede, azul para o disco e verde para a memoria @@ -715,6 +716,8 @@ Tamaño do intervalo de carregamento da reprodución As emisións seleccionadas non son soportadas polos reprodutores externos Non hai emisións de vídeo dispoñíbeis para reprodutores externos - Ver futuros vídeos + Mostrar elementos próximos Non hai emisións de audio dispoñíbeis para reprodutores externos + Ocultar elementos próximos + Ocultalos elementos xa ollados \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index a80d66849..e893f6d6a 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -743,5 +743,7 @@ בחירת איכות לנגנים חיצוניים תצורה לא מוכרת גודל משך טעינת נגינה - הצגת סרטונים עתידיים + הצגת פריטים עתידיים + הסתרת פריטים במעקב + הסתרת פריטים עתידיים \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index cd0cf6f52..a99795401 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1,23 +1,23 @@ - %1$s को प्रकाशित हुआ - स्ट्रीमिंग के लिए प्लेयर नहीं मिला। क्या आप VLC इंस्टॉल करना चाहेंगे\? - इंस्टॉल करें + %1$s पे प्रकाशित हुआ + स्ट्रीमिंग के लिए चालक नहीं मिला। क्या आप VLC इंस्टॉल करना चाहेंगे\? + स्थापित करें ब्राउज़र में खोलें पॉपअप मोड में खोलें शेयर करें डाउनलोड करे - सर्च करे + खोजें सेटिंग्स - सब्सक्राइब करें - सस्क्राइब्ड - चैनल अनसब्सक्राइब हुआ + सदस्यता लें + सदस्य है + चैनल सदस्यता हटाई गई सब्सक्रिप्शनस बैकग्राउंड पॉपअप - ऑडियो - लाइट - ब्लैक + ध्वनि + रौशनी + काला देखे हुए विडियोज का इतिहास डाउनलोड करे वीडियो और ऑडियो @@ -37,37 +37,37 @@ इतिहास फ़िलहाल चर्चा में है ऑडियो सेटिंग - आरंभ करने के लिए आवर्धक कांच पर टैप करें। - कैंसल करे + आरंभ करने के लिए आवर्धक कांच को स्पर्श करें। + रद्द करें क्या आप का मतलब \"%1$s\" था\? के साथ शेयर करे - कोई दूसरा विडियो प्लेयर इस्तेमाल करें - कुछ विडियो रिजॉल्यूशनस पर ऑडियो हट सकती है - कोई दूसरा ऑडियो प्लेयर उपयोग करें - सब्सक्रिप्शन बदला नहीं जा सका - सब्सक्रिप्शन अपडेट नहीं किया जा सका + कोई दूसरा विडियो चालक प्रयोग करें + कुछ विडियो गुणवत्ता स्तर पर ध्वनि हट सकती है + कोई दूसरा ध्वनि चालक उपयोग करें + सदस्यता बदला नहीं जा सका + सदस्यता अपडेट नहीं किया जा सका देखे की क्या नया है वीडियो डाउनलोड का फ़ोल्डर डाउनलोड की गई वीडियो फ़ाइलें यहां संग्रहीत हैं वीडियो फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें - ऑडियो डाउनलोड फ़ोल्डर - डाउनलोड की गई ऑडियो फ़ाइलें यहां संग्रहीत हैं - ऑडियो फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें - डिफ़ॉल्ट रिज़ॉल्यूशन - पॉपअप का डिफ़ॉल्ट रिज़ॉल्यूशन - उच्च रिज़ॉल्यूशनस दिखाएं - केवल कुछ ही डिवाइस 2K/4K मे विडियो चला सकते हैं - Kodi मे प्ले करे - Kore ऐप नहीं मिली, इसे इनस्टॉल करें\? - \"Kodi मे प्ले करे\" वाला विकल्प दिखाएँ - Kodi मीडिया सेंटर से विडियो प्ले करने के लिए विकल्प प्रदर्शित करें - डिफ़ॉल्ट ऑडियो फॉर्मेट - डिफ़ॉल्ट विडियो फॉर्मेट + ध्वनि डाउनलोड फ़ोल्डर + डाउनलोड की गई ध्वनि फ़ाइलें यहां संग्रहीत हैं + ध्वनि फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें + प्रथम स्थापित गुणवत्ता स्तर + पॉपअप का प्रथम स्थापित गुणवत्ता स्तर + उच्च गुणवत्ता स्तर दिखाएं + केवल कुछ ही यंत्र 2K/4K मे विडियो चला सकते हैं + Kodi मे चलाए + Kore ऐप नहीं मिली, इसे स्थापित करें\? + \"Kodi मे चलाएं\" वाला विकल्प दिखाएँ + Kodi मीडिया सेंटर से विडियो चलने के लिए विकल्प प्रदर्शित करें + प्रथम स्थापित ध्वनि फॉर्मेट + प्रथम स्थापित विडियो फॉर्मेट ऐप थीम - डार्क + गहरा विडियो पॉपअप का आकर और उसकी स्थति को याद रखे - विडियो पॉपअप की आखिरी स्थिति और आकर को याद रखे - खोज के सुझाव + विडियो पॉपअप की अंतिम स्थिति और आकर को याद रखे + खोज में सुझाव खोज के दौरान सुझाव दिखाये खोज का इतिहास खोज के डेटा को सिर्फ डिवाइस मेमोरी में रखे @@ -75,7 +75,7 @@ वीडियो रूकावटे खत्म होने के बाद विडियो प्ले करे (जैसे - फ़ोन कॉल) \'अगला\' और \'समान\' वीडियो दिखाए - \"जोड़ने के लिए पकड़ें रहे\" दिखाए + \"कतार में जोड़ने के लिए स्पर्श बनाये रखें\" दिखाए जब बैकग्राउंड और पॉपअप बटन विडियो के विवरण पन्ने में दबाई जाए तो tip को दिखाए असमर्थित URL डिफ़ॉल्ट विषय की भाषा @@ -95,8 +95,8 @@ बेहतर विडियो की क्वालिटी वापस जाए सारे प्ले करे - NewPipe की अधिसूचना - न्यूपाइप के बैकग्राउंड में चल रहे विडियो और पॉपअप विडियो के लिए अधिसूचना + NewPipe की सूचनापत्र + न्यूपाइप के बैकग्राउंड में चल रहे विडियो और पॉपअप विडियो के लिए सूचनापत्र [नहीं जानते] त्रुटी नेटवर्क में त्रुटी @@ -183,11 +183,11 @@ जोड़ने के लिए पकड़ें रहे पृष्टभूमि में चलाना शुरू करे पॉपअप में चलाना शुरू करे - स्ट्रीमिंग करने के लिए कोई प्लेयर उपलब्ध नहीं है (आप इसे चलाने के लिए VLC प्लेयर इंस्टॉल कर सकते हैं)। + स्ट्रीमिंग करने के लिए कोई चालक उपलब्ध नहीं है (आप इसे चलाने के लिए VLC चालक स्थापित कर सकते हैं)। स्ट्रीम फाइल डाउनलोड करें जानकारी दिखाएं बुकमार्क किये गए प्लेलिस्टस - में एड करे + इसमें जोड़ें डिफ़ॉल्ट देश का विषय हमेशा के लिए सिर्फ एक बार के लिए @@ -246,13 +246,13 @@ Out-of-Lifecycle त्रुटियों की रिपोर्ट करें थंबनेल लोड करें तेज और अनिश्चित तलाश का प्रयोग करें - अनिश्चित खोज के कारण वीडियो प्लेयर कम सटीकता से लेकिन तेजी से वीडियो पोजीशन्स की तलाश कर सकता है। 5,15 या 25 सेकंड की तलाश में यह काम नहीं करता। + अनिश्चित खोज के कारण वीडियो प्लेयर कम सटीकता से लेकिन तेजी से वीडियो पोजीशन्स की तलाश कर सकता है। ५, १५, या २५ सेकंड की तलाश में यह काम नहीं करता। थंबनेल लोड करने, डेटा और मेमोरी उपयोग को रोकने के लिए बंद करें। इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों को बदलता है| - इमेज कैश मिटाया गया + चित्र कैश मिटाया गया कैश मेटाडेटा मिटाएं कैश किए गए सभी वेबपेज का डेटा हटाएं मेटाडाटा कैश मिटाया गया - अगली स्ट्रीम को ऑटोमैटिकली जोड़ें + अगली स्ट्रीम को अपने आप जोड़े गैर-दोहराने वाली कतार में अंतिम स्ट्रीम चलाते समय संबंधित स्ट्रीम को स्वतः संलग्न करें फाइल चेनल्स @@ -319,17 +319,17 @@ पृष्ठभूमि प्लेयर में बदले पॉप अप प्लेयर में बदले न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं। - अनसब्सक्राइब करे + सदस्यता हटाए टैब चुने - गेस्चर वॉल्यूम नियंत्रण + ध्वनि नियंत्रण इशारा कतार - वीडियो प्लेयर की आवाज नियंत्रित करने के लिए गेस्चरस का इस्तेमाल करे - गेस्चर से चमक कंट्रोल करे - वीडियो प्लेयर की चमक को नियंत्रित करने के लिए गेस्चरस का इस्तेमाल करें + वीडियो प्लेयर की ध्वनि नियंत्रित करने के लिए इशारो का इस्तेमाल करे + रोशनी स्तर नियंत्रण के इशारे + वीडियो चालक की चमक को नियंत्रित करने के लिए इशारो का इस्तेमाल करें अपडेट फाइल मिटा दी गयी अप्प अपडेट अधिसूचना - नए NewPipe अपडेट की अधिसूचना + नए NewPipe अपडेट की सूचनापत्र एक्सटर्नल स्टोरेज अनुपलब्ध SD कार्ड पर डाउनलोड करना संभव नहीं।डाउनलोड स्थान पुनः चुने\? सामान्य चुनाव पर लौटें @@ -365,8 +365,8 @@ मोबाइल डाटा का इस्तेमाल करते समय उपयोगी है, परन्तु कुछ डौन्लोडस रोके नहीं जा सकते है घटनायें सम्मेलनों - कॉमेंट्स दिखाएं - कॉमेंट्स छिपाने के लिए इसे बंद करे + टिप्पणियां दिखाएं + टिप्पणियां छिपाने के लिए इसे बंद करे ऑटोप्ले करे कोई टिपण्णी नहीं टिप्पणियाँ लोड नहीं कर सका @@ -465,22 +465,22 @@ बच्चों के लिए अनुपयुक्त सामग्री दिखाएं क्योंकि इसकी आयु सीमा है (जैसे 18) केवल HTTPS यूआरएल ही समर्थित हैं URL की पहचान नहीं हो सकी। दूसरे ऐप से खोलें\? - ऑटोमैटिकली कतार करे + अपने आप कतार में जोड़े कतार को मिटाने से पहले सत्यापन के लिए पूछें तलाश अवधि फास्ट-फ़ॉरवर्ड /- रिवाइंड करे एंड्रॉइड को थंबनेल में मुख्य रंग के अनुसार अधिसूचना रंग को अनुकूलित करें (ध्यान दें कि यह सभी उपकरणों पर उपलब्ध नहीं है) - नोटीफिकेशन को रंगीन करें + सूचनापत्र को रंगीन करें कुछ नहीं बफरिंग Shuffle करे दोहराएं - आप कॉम्पैक्ट नोटिफिकेशन में दिखाए जाने वाले ऑप्शन्स में से अधिकतम 3 को चुन सकते है ! + आप संछिप्त सूचनापत्र में दिखाए जाने वाले विकल्प में से अधिकतम 3 को चुन सकते है ! नीचे दी गई प्रत्येक अधिसूचना क्रिया को उस पर टैप करके संपादित करें। दाईं ओर चेकबॉक्स का उपयोग करके उनमें से अधिकतम तीन का चयन करें जिन्हें कॉम्पैक्ट अधिसूचना में दिखाया जाना है पांचवा एक्शन बटन - चौथा एक्शन बटन - तीसरा एक्शन बटन - दूसरा एक्शन बटन - पहला एक्शन बटन + चतुर्थी एक्शन बटन + तृतीय एक्शन बटन + द्वितीय एक्शन बटन + प्रथम एक्शन बटन नोटिफिकेशन में दिखाए गए वीडियो थंबनेल को 16: 9 के बजाय 1: 1 के अनुपात में दिखाए (इस कारण कुछ परेशानियां हो सकती हैं) थंबनेल को 1:1 के अनुपात मैं दिखाएं @@ -518,12 +518,12 @@ विडीओ हैशिंग की प्रगति की सूचना वीडियो हैश अधिसूचना स्ट्रीम निर्माता, स्ट्रीम विषय सूची या खोज अनुरोध के बारे में अतिरिक्त जानकारी के साथ मेटा जानकारी बक्से को छिपाने के लिए बंद करें. - Meta info दिखाएँ + Meta जानकारी दिखाएँ वीडियो का विवरण और अतिरिक्त जानकारी छिपाने के लिए इसे बंद करें - डिस्क्रिप्शन दिखाएं - सक्रिय प्लेअर की क़तार बदल दी जाएगी - एक प्लेअर से दूसरे प्लेअर में जाने से आपकी कतार बदल सकती है - मे खोलें + विवरण दिखाएं + सक्रिय चालक की क़तार बदल दी जाएगी + एक चालक से दूसरे चालक में जाने से आपकी कतार बदल सकती है + इसमें खोलें थंबनेल दिखाएं लॉक स्क्रीन और नोटिफिकेशन दोनों के लिए थंबनेल का इस्तेमाल करे पाठ @@ -556,4 +556,8 @@ मिनी प्लेयर में वीडियो शुरू न करें, लेकिन ऑटो रोटेशन लॉक होने पर सीधे फुल स्क्रीन मोड पर जाएं। आप अब भी फ़ुलस्क्रीन से बाहर निकलकर मिनी प्लेयर तक पहुंच सकते हैं। टिप्पणियाँ करना बंद है देखा हुआ चिह्नित करें + चालक सूचनापत्र + सूचनापत्र + चालक असफल हुआ + स्थानीय खोज सुझाव \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index f7fb4113a..3798ed46c 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -173,7 +173,7 @@ Nama berkas tidak boleh kosong Telah terjadi galat: %1$s Tidak ada hasil - Tidak ada apapun disini selain jangkrik + Tidak ada apa pun di sini selain jangkrik Geser untuk ubah urutan Tidak ada pelanggan @@ -309,7 +309,7 @@ Trek Pengguna Kebijakan Privasi NewPipe - Proyek NewPipe sangat memperhatikan privasi Anda. Karena itu, apl tidak mengumpulkan data apapun tanpa persetujuan Anda. + Proyek NewPipe sangat memperhatikan privasi Anda. Oleh karena itu, aplikasi initidak mengumpulkan data apa pun tanpa persetujuan Anda. \nKebijakan privasi NewPipe menjelaskan secara detail data apa saja yang dikirim dan disimpan ketika Anda mengirimkan laporan kerusakan. Baca kebijakan privasi Percepat saat diam @@ -704,5 +704,7 @@ Pilih kualitas untuk pemain eksternal Format tidak diketahui Ukuran interval pemuatan playback - Tampilkan video mendatang + Tampilkan item mendatang + Sembunyikan item yang telah ditonton + Sembunyikan item mendatang \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 271d45ecb..bc7edb974 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -147,16 +147,19 @@ Nessun iscritto %s iscritto + %s iscritti %s iscritti Nessuna visualizzazione %s visualizzazione + %s visualizzazioni %s visualizzazioni Nessun video %s video + %s video %s video Nulla da mostrare @@ -424,11 +427,13 @@ Nessuno sta guardando %s sta guardando + %s stanno guardando %s stanno guardando Nessuno sta ascoltando %s ascoltatore + %s ascoltatori %s ascoltatori La lingua verrà cambiata al riavvio dell\'applicazione @@ -459,6 +464,7 @@ Video %d secondo + %d secondi %d secondi A causa delle limitazioni di ExoPlayer la durata dello spostamento rapido è stata impostata a %d secondi @@ -467,14 +473,17 @@ Aiuto %d minuto + %d minuti %d minuti %d ora + %d ore %d ore %d giorno + %d giorni %d giorni Gruppi di canali @@ -486,6 +495,7 @@ Nessuna iscrizione selezionata %d selezionato + %d selezionati %d selezionati Eliminare questo gruppo\? @@ -652,10 +662,12 @@ Suggerimenti di ricerca locali %1$s download eliminato + %1$s download eliminati %1$s download eliminati Download completato + %s download completati %s download completati Scorri gli elementi per rimuoverli @@ -699,6 +711,7 @@ Nuovi contenuti %s nuovo contenuto + %s nuovi contenuti %s nuovi contenuti Caricamento dei dettagli dei contenuti… @@ -717,5 +730,7 @@ Qualità sconosciuta Formato sconosciuto Dimensione intervallo di caricamento della riproduzione - Mostra video futuri + Mostra elementi futuri + Nascondi elementi visti + Nascondi elementi futuri \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 223a5f21a..4d3dd69b6 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -664,9 +664,9 @@ スナックバーにエラーを表示 固定されたコメント この動作に適切なファイルマネージャが見つかりませんでした。 -\nStorage Access Frameworkと互換性のあるファイルマネージャをインストールしてください。 +\nStorage Access Framework と互換性のあるファイルマネージャをインストールしてください この動作に適切なファイルマネージャが見つかりませんでした。 -\nファイルマネージャをインストールするか、ダウンロード設定で\'%s\'を無効にすることをお試しください。 +\nファイルマネージャをインストールするか、ダウンロード設定で \'%s\' を無効にすることをお試しください プレイヤー使用時にクラッシュオプションを表示 エラー通知を作成 エラーを報告する通知 @@ -691,7 +691,7 @@ 新しいストリーム 通知 現在再生しているストリームの通知を構成 - 読み込み間隔を変更します (現在 %s)。小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です。 + 読み込み間隔を変更します (現在 %s)。小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です 必要なネットワークの種類 パーセント 半音 @@ -699,10 +699,11 @@ データの読み込み間隔 未知の形式 未知の品質 - サポートされてない動画は表示されていません - 選択された動画は外部プレイヤーではサポートされていません - 外部プレイヤーで利用できる音声情報がありません - 外部プレイヤーで利用できる映像情報がありません + ダウンローダーによってサポートされてない動画は表示されません + 選択された動画は外部プレイヤーによってサポートされていません + 外部プレイヤーで利用可能な音声ストリームがありません + 外部プレイヤーで利用可能な動画ストリームがありません 外部プレイヤーでの品質を選択 次の動画を表示する + 再生済みを隠す \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index ad37ab778..31cf0ea25 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -13,10 +13,10 @@ 다음으로 공유 비디오 다운로드 폴더 다운로드된 비디오 파일이 이 곳에 저장됩니다 - 비디오 파일 다운로드 폴더 선택 + 비디오 파일이 다운로드 될 폴더를 선택하세요 기본 해상도 Kodi로 재생 - Kore를 설치할까요\? + Kore 앱이 발견되지 않았습니다. Kore를 설치할까요\? \"Kodi로 재생\" 옵션 표시 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 오디오 @@ -34,14 +34,14 @@ 외부 오디오 플레이어 사용 오디오 다운로드 폴더 다운로드된 오디오 파일이 이 곳에 저장됩니다 - 오디오 파일 다운로드 폴더 선택 + 오디오 파일이 다운로드 될 폴더를 선택하세요 테마 어두운 테마 밝은 테마 외관 백그라운드에서 재생 중 네트워크 오류 - \"검색\" 버튼을 눌러서 시작하세요. + 돋보기를 탭하여 시작합니다. 컨텐츠 연령 제한 컨텐츠 보여주기 라이브 @@ -73,7 +73,7 @@ 구독 구독중 구독 취소됨 - 구독 여부를 변경할 수 없음 + 구독을 변경할 수 없습니다 구독을 업데이트할 수 없음 구독 새로운 영상 @@ -81,7 +81,7 @@ 팝업 기본 팝업 해상도 높은 해상도 표시 - 일부 기기에서만 2K/4K 영상을 재생할 수 있습니다 + 일부 기기에서만 2K/4K 해상도 재생이 지원됩니다 기본 비디오 형식 검은 테마 팝업 크기 및 위치 기억 @@ -92,7 +92,7 @@ 검색 기록을 기기에 저장합니다 기록 보기 시청했던 비디오 기록을 저장합니다 - 재생 재개 + 이어서 재생 중단 후 계속 재생(예: 전화 통화) \"길게 눌러 대기열에 추가하기\" 팁 표시 비디오 \"세부사항:\"에서 배경 또는 팝업 버튼을 누를 때 팁 표시 @@ -114,7 +114,7 @@ 이 스트림을 재생할 수 없습니다 복구할 수 없는 플레이어 오류가 발생했습니다 플레이어 오류로부터 복구 중 - 무엇을:\\n요청:\\n컨텐츠 언어:\\n컨텐츠 국가:\\n앱 언어:\\n서비스:\\nGMT 시간:\\n패키지:\\n버전:\\nOS 버전: + 무엇:\\n요청:\\n콘텐츠 언어:\\n콘텐츠 국가:\\n앱 언어:\\n서비스:\\nGMT 시간:\\n패키지:\\n버전:\\nOS 버전: 결과 없음 구독할 항목을 추가하세요 @@ -157,7 +157,7 @@ 번역, 디자인, 코딩 등 다양한 기여를 언제나 환영합니다. 더 나아지도록 도와주세요! GitHub에서 보기 기부 - NewPipe는 최고의 사용자 경험을 제공하기 위해 자유 시간을 보내는 자원 봉사자에 의해 개발되었습니다. 개발자가 커피 한 잔을 즐기면서 NewPipe를 더욱 개선할 수 있도록 지원해주세요. + 여러분들의 더 나은 경험을 위해 많은 사람들이 NewPipe를 개발하는데 노력을 기울이고 있습니다. NewPipe에 참여하는 개발자들이 커피 한 잔을 즐길 수 있도록 기부해주세요. 보답하기 웹사이트 NewPipe에 관한 더 많은 정보를 얻으려면 웹사이트를 방문하세요. @@ -188,7 +188,7 @@ 재생목록 북마크 이곳에 추가 정확하지는 않지만 빠른 탐색 - 정확하지 않은 탐색은 더 빠르게 위치를 탐색할 수 있지만 정확도는 떨어집니다. 5, 15, 25초 탐색은 이 기능과 같이 작동하지 않습니다 + 정확하지 않은 탐색은 더 빠르게 위치를 탐색할 수 있지만 정확도는 떨어집니다. 5,15 또는 25초 탐색기능은 같이 동작하지 않습니다. 다음 스트림을 자동 대기열에 추가 이전 스트림이 반복 재생 대기열이 아닐 경우, 관련 스트림을 자동 재생 기본 콘텐츠 국가 @@ -320,7 +320,7 @@ 구독 취소 탭 선택 제스처 음량 조작 - 제스처를 사용하여 플레이어 볼륨 제어 + 제스처를 사용하여 재생기 볼륨 제어하기 제스처 밝기 조작 제스처를 사용하여 플레이어 밝기 제어 업데이트 @@ -340,7 +340,7 @@ 팝업 플레이어로 최소화 단계 초기화 - 저장된 탭을 읽을 수 없으므로 기본 탭 사용 + 저장된 탭을 읽을 수 없으므로, 기본 탭을 사용합니다 초기화 초기 설정으로 복원하시겠습니까\? 구독자 수를 가져올 수 없습니다 @@ -416,16 +416,16 @@ %s 동영상 - 하나의 다운로드가 동시에 진행됩니다 + 한 번에 하나씩 다운로드 합니다 서비스 토글, 현재 선택된 서비스: 기본 키오스크 - 시청자가 없음 + 시청자 없음 - %s 시청 + %s명 시청중 - 듣고 있는 사람 없음 + 청취자 없음 - %s 듣는사람 + %s명 청취중 앱이 다시 시작되면 언어가 변경됩니다 빠른-감기/되감기 찾는 시간 @@ -476,7 +476,7 @@ 첫번째 버튼 알림에 표시된 비디오 썸네일을 16:9에서 1:1 화면비로 자릅니다 1:1 화면비로 썸네일 자르기 - %s에 대한 검색 결과 + 검색된 개수: %s 셔플 연속 재생 재생목록 페이지 @@ -505,19 +505,19 @@ 네번째 버튼 세번째 버튼 두번째 버튼 - 다른 앱 위에 표시되는 권한 부여 + 다른 앱 위에 표시할 수 있는 권한 부여 메타 정보 표시 색상화된 알림 활성 플레이어 대기열 교체 - 파일 열기 + 다음으로 열기 시청한 것으로 처리 비활성화하면 비디오 설명과 추가 정보를 표시하지 않습니다 - 설명 표시 - 원래 플레이어에서 다른 플레이어로 바꾸면 대기열이 지워집니다 + 설명 표시하기 + 한 플레이어에서 다른 플레이어로 전환하면 대기열이 대체될 수 있습니다. 어두운 테마 최대 3개까지 축소 알림에 표시될 항목을 고를 수 있습니다! - 아래 항목을 터치해서 편집하세요. 위에서부터 체크된 3개 항목은 축소 알림일 때도 표시됩니다 - 유튜브의 \"제한 모드\"를 활성화 + 아래의 각 알림 작업을 눌러 편집하십시오. 오른쪽에 있는 확인란을 사용하여 압축 알림에 표시할 항목을 최대 3개까지 선택합니다. + YouTube의 \'제한 모드\' 켜기 비디오 해싱 진행 알림 새로운 스트림 구독에서 새 스트림이 있을 때 알림 @@ -528,7 +528,7 @@ 유튜브는 잔인할 수 있는 컨텐츠를 숨겨주는 \"제한 모드\"를 제공합니다 reCAPTCHA 쿠키 비우기 플레이어 크래시 발생 - 없음 + 존재하지 않음 전체화면으로 주 플레이어 시작 비디오 해시 알림 GitHub에 보고 @@ -666,12 +666,12 @@ 자동 (장치 테마) 고정된 댓글 추천 - 향후 동영상 표시 + 향후 항목 표시하기 알 수 없는 형식 외부 플레이어의 품질 선택 외부 플레이어에 사용할 수 있는 비디오 스트림이 없음 스트림 작성자, 스트림 콘텐츠 또는 검색 요청에 대한 추가 정보가 있는 메타 정보 상자를 숨기려면 끄세요 - 로드 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 비디오 로딩 속도가 빨라질 수 있습니다. 변경하려면 플레이어를 다시 시작해야 합니다. + 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 비디오 로딩 속도가 빨라질 수 있습니다. 변경하려면 플레이어를 다시 시작해야 합니다 충돌에 대해 논의하는 문제가 이미 존재하는지 확인하세요. 중복 티켓을 생성할 때 실제 버그를 수정하는 데 시간을 할애할 수 있습니다. 오류 알림 생성 구독 선택 @@ -687,10 +687,10 @@ 좋아하는 밤 테마 선택 — %s 다운로드가 시작되었습니다 이제 설명 내에서 텍스트를 선택할 수 있습니다. 선택 모드에서는 페이지가 깜박이고 링크를 클릭할 수 없는 경우가 있습니다. - 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. -\n저장영역 접속 프레임워크 호환 파일 관리자를 설치하십시오. - 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. -\n파일 관리자를 설치하거나 다운로드 설정에서 \'%s\'을(를) 비활성화하세요. + 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. +\n저장영역 접속 프레임워크 호환 파일 관리자를 설치하십시오 + 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. +\n파일 관리자를 설치하거나 다운로드 설정에서 \'%s\'을(를) 비활성화하십시오 피드 로딩이 너무 느리다고 생각하십니까\? 그렇다면 빠른 로딩을 활성화해 보십시오 (설정에서 변경하거나 아래 버튼을 눌러 변경할 수 있습니다). \n \nNewPipe는 두 가지 피드 로딩 전략을 제공합니다: @@ -705,4 +705,6 @@ 이 기능은 아직 NewPipe에서 지원하지 않습니다. \n \n이후 버전에서 지원될 예정입니다. + 감시한 항목 숨기기 + 향후 항목 숨기기 \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index dfcccd1ae..1b08a1e2c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,7 +1,7 @@ Gepubliceerd op %1$s - Geen speler met streamondersteuning gevonden. VLC installeren\? + Geen videospeler met streamondersteuning gevonden. VLC installeren\? Installeren Annuleren Openen in browser diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a009023d5..bca1511d0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -738,5 +738,7 @@ Wybierz jakość dla zewnętrznych odtwarzaczy Nieznany format Nieznana jakość - Pokaż przyszłe wideo + Pokaż przyszłe pozycje + Ukryj obejrzane pozycje + Ukryj przyszłe pozycje \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9d19a8585..8b6b21484 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -676,14 +676,14 @@ O NewPipe encontrou um erro, toque para reportar Crie uma notificação de erro Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. -\nInstale um gerenciador de arquivos compatível com o Storage Access Framework. +\nInstale um gerenciador de arquivos compatível com o Storage Access Framework Ocorreu um erro, consulte a notificação Mostrar um snackbar de erro Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. -\nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download. +\nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download Comentário fixado O LeakCanary não está disponível - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player reinicie. + Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player seja reiniciado ExoPlayer padrão Notificação do reprodutor Configurar a notificação do fluxo da reprodução atual @@ -711,11 +711,13 @@ Semitom A transmissão selecionada não é compatível com players externos Nenhum áudio de transmissão está disponível para players externos - As transmissão que ainda não são suportados pelo downloader não são exibidos + Transmissões que ainda não são suportadas pelo downloader não são exibidos Nenhum vídeo de transmissão está disponível para players externos Selecione a qualidade para players externos Formato desconhecido Qualidade desconhecida Tamanho do intervalo de carregamento da reprodução - Mostrar vídeos futuros + Mostrar itens futuros + Ocultar itens futuros + Ocultar itens assistidos \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index ebcda3f21..c4de8e3e1 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -678,12 +678,12 @@ Mostrar um snackbar de erro Criar uma notificação de erro Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. -\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar. +\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. -\nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework. +\nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework Comentário fixado LeakCanary não está disponível - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. Se fizer alterações é necessário reiniciar. + Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player seja reiniciado Predefinido do ExoPlayer Notificações A carregar detalhes do fluxo… @@ -717,5 +717,7 @@ Qualidade desconhecida Selecione a qualidade para reprodutores externos Tamanho do intervalo de carregamento da reprodução - Mostrar vídeos futuros + Mostrar artigos futuros + Ocultar artigos vistos + Ocultar artigos futuros \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 5aa3d4f4d..e90e619c6 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -729,6 +729,8 @@ Formato desconhecido Qualidade desconhecida A transmissão selecionada não é suportada por reprodutores externos - Mostrar vídeos futuros + Mostrar artigos futuros Tamanho do intervalo de carregamento da reprodução + Ocultar artigos vistos + Ocultar artigos futuros \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 52c1ef5a3..c5567b3f2 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -708,16 +708,16 @@ Procent Semiton Implicit ExoPlayer - Modificați dimensiunea intervalului de încărcare (în prezent %s). O valoare mai mică poate accelera încărcarea inițială a videoclipului. Modificările necesită o repornire a playerului. + Modificați dimensiunea intervalului de încărcare (în prezent %s). O valoare mai mică poate accelera încărcarea inițială a videoclipului. Modificările necesită o repornire a playerului Dați crash player-ului LeakCanary nu este disponibil Notificări Notificări despre noi fluxuri pentru abonamente Executați verificarea pentru fluxuri noi Nu a fost găsit niciun manager de fișiere adecvat pentru această acțiune. -\nVă rugăm să instalați un manager de fișiere sau să încercați să dezactivați \'%s\' în setările de descărcare. +\nVă rugăm să instalați un manager de fișiere sau să încercați să dezactivați \'%s\' în setările de descărcare Nu a fost găsit niciun manager de fișiere adecvat pentru această acțiune. -\nVă rugăm să instalați un manager de fișiere compatibil cu Storage Access Framework. +\nVă rugăm să instalați un manager de fișiere compatibil cu Storage Access Framework Primiți notificări V-ați abonat la acest canal Comutați toate @@ -730,5 +730,7 @@ Format necunoscut Calitate necunoscută Dimensiunea intervalului de încărcare de redare - Afișați videoclipurile din viitor + Afișați elementele din viitor + Ascunde elementele vizionate + Ascunde elementele din viitor \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 24f023c81..015276337 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -734,5 +734,7 @@ Выберите качество для внешних плееров Неизвестное качество Размер предварительной загрузки - Показывать будущие видео + Показывать будущие элементы + Скрыть проигранные + Скрывать будущие видео \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index d3a92b116..b05ae5605 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -676,15 +676,15 @@ Crea una notìfica de errore Elementos noos de su flussu No est istadu agatadu perunu gestore de documentos pro custa atzione. -\nPro praghere installa·nde unu o proa a inabilitare \'%s\' in sas impostatziones de iscarrigamentu. +\nPro praghere installa·nde unu o proa a inabilitare \'%s\' in sas impostatziones de iscarrigamentu Ammustra \"faghe serrare su riproduidore\" No est istadu agatadu perunu gestore de documentos pro custa atzione. -\nPro praghere installa unu gestore de documentos cumpatìbile cun su \"Sistema de Atzessu a s\'Archiviatzione\". +\nPro praghere installa unu gestore de documentos cumpatìbile cun su \"Sistema de Atzessu a s\'Archiviatzione\" Faghe serrare su riproduidore Cummentu apicadu LeakCanary no est a disponimentu Valore ExoPlayer predefinidu - Muda sa mannària de s\'intervallu de carrigamentu (in custu momentu %s). Unu valore prus bassu diat pòdere allestrare su carrigamentu de incumintzu de su vìdeu. Sas modìficas tenent bisòngiu de torrare a allùghere su riproduidore. + Muda sa mannària de s\'intervallu de carrigamentu (in custu momentu %s). Unu valore prus bassu diat pòdere allestrare su carrigamentu de incumintzu de su vìdeu. Sas modìficas tenent bisòngiu de torrare a allùghere su riproduidore Cunfigura sa notìfica de su flussu in cursu de riprodutzione Notìficas de flussos noos dae sas iscritziones @@ -717,5 +717,7 @@ Calidade disconnota Su flussu seletzionadu no est galu suportadu dae letores esternos Mannària de s\'intervallu de carrigamentu de sa riprodutzione - Ammustra sos vìdeos imbenientes + Ammustra sos elementos imbenientes + Cua sos elementos pompiados + Cua sos elementos imbenientes \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 799ea4288..f740eed62 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -685,7 +685,7 @@ Zobraziť „zlyhať prehrávač“ LeakCanary nie je k dispozícii Pre túto akciu sa nenašiel vhodný správca súborov. -\nNainštalujte správcu súborov kompatibilného s rozhraním Storage Access Framework. +\nNainštalujte správcu súborov kompatibilného s rozhraním Storage Access Framework Pripnutý komentár Zlyhanie prehrávača Nahlásenie chyby @@ -730,5 +730,7 @@ Streamy nepodporované sťahovačom sa nezobrazujú Žiadne video streamy nie sú k dispozícií pre externé prehrávače Neznáma kvalita - Zobraziť budúce videá + Zobraziť budúce položky + Skryť videné položky + Skryť nasledujúce položky \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index a20a88181..e4c7e73ea 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -717,5 +717,7 @@ Bilinmeyen biçim Bilinmeyen nitelik Oynatma yükleme aralığı boyutu - Gelecekteki videoları göster + Gelecekteki video öğelerini göster + Gelecekteki öğeleri gizle + İzlenen öğeleri gizle \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 882b3acc8..efa179565 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -734,5 +734,7 @@ Виберіть якість для зовнішніх програвачів Невідома якість Розмір інтервалу завантаження відтворення - Показати наступні відео + Показати наступні елементи + Сховати переглянуті елементи + Сховати майбутні елементи \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d1c28c87a..c39ee4b9e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -703,6 +703,8 @@ 没有视频流可用于外部播放器 不显示下载器尚不支持的串流 未知画质 - 回放加载间隔大小 - 显示未来视频 + 播放加载间隔大小 + 显示未来项目 + 隐藏看过的项目 + 隐藏未来项目 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 17ed3fc29..3a0595c8d 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -328,8 +328,8 @@ 執執佢 未裝 app 嚟播放呢個檔案 搞掂 - NewPipe 專案非常認真看待您嘅私隱。因此,呢個 app 未徵得您嘅同意係唔會收集任何資料。 -\nNewPipe 嘅私隱政策,詳加解釋當您傳送彈 app 報告嘅時候有咩資料會傳送同保存。 + NewPipe 專案非常著重您嘅私隱。因此,呢個 app 未得您同意係唔會收集任何資料。 +\nNewPipe 嘅私隱政策,詳述當您傳送彈 app 報告時,有咩資料會傳送同保存。 最近播放 最常播放 頭版內容 @@ -683,7 +683,7 @@ 啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中 服務原底嘅字會騷返喺串流項目上面 影像要推三色碼 - 顯示定預告上畫嘅影片 + 未夠鐘上畫嘅項目照顯示 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦 點樣用 Google 匯出嚟匯入 YouTube 訂閱: \n @@ -705,4 +705,6 @@ \nYouTube 就係其中一個服務,有用 RSS 摘要提供呢個快趣嘅門路。 \n \n所以就睇您點揀:想快定要準。 + 收埋睇過嘅項目 + 未夠鐘上畫嘅項目就收埋 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ba3cd2f98..6a7ecca05 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -704,5 +704,7 @@ 沒有可用於外部播放程式的視訊串流 選取外部播放程式的畫質 播放載入間隔大小 - 顯示未來影片 + 顯示未來項目 + 隱藏未來項目 + 隱藏已觀看的項目 \ No newline at end of file diff --git a/fastlane/metadata/android/es/changelogs/65.txt b/fastlane/metadata/android/es/changelogs/65.txt index 7f990f4e0..93e78c8ca 100644 --- a/fastlane/metadata/android/es/changelogs/65.txt +++ b/fastlane/metadata/android/es/changelogs/65.txt @@ -4,4 +4,23 @@ - Deshacer la eliminación de descargas #1472 - Opción de descarga en el menú de compartir #1498 - Añadida la opción de compartir en el menú de pulsación larga #1454 -- Minimizar el reproductor principal al salir #1354 +- Minimizar el reproductor principal al salir #1354 +- Actualización de la versión de la biblioteca y corrección de la copia de seguridad de la base de datos #1510 +- Actualización de ExoPlayer 2.8.2 #1392 + - Se ha rediseñado el diálogo de control de la velocidad de reproducción para que admita diferentes tamaños de paso para un cambio de velocidad más rápido. + - Se ha añadido una opción para avanzar rápidamente durante los silencios en el control de la velocidad de reproducción. Esto debería ser útil para los audiolibros y ciertos géneros musicales, y puede traer una verdadera experiencia sin problemas (y puede romper una canción con muchos silencios =\). + - Se ha refactorizado la resolución de la fuente de medios para permitir pasar los metadatos junto a los medios internamente en el reproductor, en lugar de hacerlo manualmente. Ahora tenemos una única fuente de metadatos y está directamente disponible cuando se inicia la reproducción. + - Se ha corregido que los metadatos de las listas de reproducción remotas no se actualizan cuando hay nuevos metadatos disponibles al abrir el fragmento de la lista de reproducción. + - Varias correcciones de la interfaz de usuario: #1383, los controles de notificación del reproductor en segundo plano ahora siempre son blancos, es más fácil apagar el reproductor emergente mediante el lanzamiento +- Usar nuevo extractor con arquitectura refactorizada para multiservicio + +### Correcciones + +- Arreglo #1440 Diseño de información de vídeo roto #1491 +- Arreglo del historial de visualización #1497 + - #1495, actualizando los metadatos (miniatura, título y recuento de vídeos) en cuanto el usuario accede a la lista de reproducción + - #1475, registrando una vista en la base de datos cuando el usuario inicia un vídeo en un reproductor externo en el fragmento de detalle. +- Arreglar el tiempo de espera de Creen en caso de modo emergente. #1463 (Arreglado #640) +- Arreglo del reproductor de vídeo principal #1509 + - [#1412] Corregido el modo de repetición que provoca NPE en el reproductor cuando se recibe una nueva intención mientras la actividad del reproductor está en segundo plano. + - Corregido que al minimizar el reproductor a la ventana emergente no se destruye el reproductor cuando el permiso de la ventana emergente no está concedido. diff --git a/fastlane/metadata/android/es/changelogs/68.txt b/fastlane/metadata/android/es/changelogs/68.txt index 728f819f9..643c0f135 100644 --- a/fastlane/metadata/android/es/changelogs/68.txt +++ b/fastlane/metadata/android/es/changelogs/68.txt @@ -1,8 +1,31 @@ -- Mostrar "Recuento de suscriptores no disponible" en esos casos -- Corregir NPE cuando una lista de reproducción de YouTube está vacía -- Corrección rápida de los quioscos en SoundCloud +# cambios de la v0.14.1 + +### Fijado +- Arreglado el fallo de descifrar la url del vídeo #1659 +- Corregido el enlace de descripción que no se extrae bien #1657 + +# cambios de v0.14.0 + +### Nuevo +- Nuevo diseño del cajón #1461 +- Nueva página frontal personalizable #1461 + +### Mejoras +- Controles gestuales rediseñados #1604 +- Nueva forma de cerrar el reproductor emergente #1597 + +### Corregido +- Arreglado el error cuando el recuento de suscripciones no está disponible. Cierra #1649. + - Mostrar "Recuento de suscriptores no disponible" en esos casos +- Arreglar NPE cuando una lista de reproducción de YouTube está vacía +- Arreglo rápido de los quioscos en SoundCloud - Refactorización y corrección de errores #1623 - - Arreglar el resultado cíclico de la búsqueda #1562 + - Arreglar resultado de búsqueda cíclica #1562 - Corrección de la barra de búsqueda no estática - Fix YT Premium video no se bloquean correctamente - Corregir los vídeos que a veces no se cargan (debido al análisis sintáctico de DASH) + - Arreglar los enlaces en la descripción del vídeo + - Mostrar advertencia cuando alguien trata de descargar a sdcard externa + - Fix nothing shown exception triggers report + - la miniatura no se muestra en el reproductor de fondo para android 8.1 [ver aquí](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Arreglar el registro del receptor de transmisión. Cierra #1641. diff --git a/fastlane/metadata/android/es/changelogs/750.txt b/fastlane/metadata/android/es/changelogs/750.txt new file mode 100644 index 000000000..715d704dc --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/750.txt @@ -0,0 +1,22 @@ +Nuevo +Resumen de la reproducción #2288 +- Reanudar las transmisiones donde se detuvo la última vez +Mejoras en el descargador #2149 +- Use Storage Access Framework para almacenar descargas en tarjetas SD externas +- Nuevo mp4 muxer +- Opción de cambiar el directorio de la descarga antes de iniciar una descarga +- Respeta las redes con contador + + +Mejora de +- Eliminación de las cadenas de gema #2295 +- Manejar los cambios de (auto)rotación durante la reproducción #2444 +- Hacer consistentes los menús de pulsación larga #2368 + +Arreglado +- Se corrigió el nombre de la pista de subtítulos seleccionados que no se mostraba #2394 +- No se bloquee cuando falle la verificación de la actualización de la aplicación (versión GitHub) #2423 +- Corregidas las descargas atascadas en el 99,9% #2440 +- Actualizar los metadatos de la cola de reproducción #2453 +- SoundCloud] Corregido el fallo al cargar listas de reproducción TeamNewPipe/NewPipeExtractor#170 +- YouTube] La duración fija no se puede emparejar TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/es/changelogs/760.txt b/fastlane/metadata/android/es/changelogs/760.txt new file mode 100644 index 000000000..e2d3903f5 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/760.txt @@ -0,0 +1,43 @@ +Cambios en 0.17.1 + +Nuevo +- Localización en tailandés + + +Mejora de +- Añadir la acción de empezar a reproducir aquí en los menús de pulsación larga para las listas de reproducción de nuevo #2518 +- Añadir interruptor para SAF / legado selector de archivos #2521 + +Corregido +- Arreglar la desaparición de los botones en la vista de descargas al cambiar de aplicación #2487 +- Arreglar que la posición de reproducción se almacene aunque el historial de visionado esté desactivado +- Corregir la reducción del rendimiento causada por la posición de reproducción en las vistas de lista #2517 +- Extractor] Fijar ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +- Extractor] [YouTube] Corregir error de búsqueda casual cuando las listas de reproducción están en los resultados TeamNewPipe/NewPipeExtractor#185 + + + +Cambios en 0.17.0 + +Nuevo +Reanudación de la reproducción #2288 +- Reanudar las secuencias donde se detuvo la última vez +- Mejoras en el descargador #2149 +- Utiliza el marco de acceso al almacenamiento para guardar las descargas en tarjetas SD externas +- Nuevo mp4 muxer +- Opción de cambiar el directorio de descarga antes de iniciar una descarga +- Respeta las redes con contador + + +Mejora de +- Eliminación de las cadenas de gema #2295 +- Manejar los cambios de (auto)rotación durante la reproducción #2444 +- Hacer consistentes los menús de pulsación larga #2368 + +Arreglado +- Corregido el nombre de la pista de subtítulos seleccionada que no se muestra #2394 +- No se bloquea cuando falla la comprobación de la actualización de la aplicación (versión GitHub) #2423 +- Corregidas las descargas atascadas en el 99,9% #2440 +- Actualizar los metadatos de la cola de reproducción #2453 +- SoundCloud] Corregido el fallo al cargar listas de reproducción TeamNewPipe/NewPipeExtractor#170 +- YouTube] Corregida la duración que no se puede emparejar TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/es/changelogs/780.txt b/fastlane/metadata/android/es/changelogs/780.txt new file mode 100644 index 000000000..3f11e2104 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/780.txt @@ -0,0 +1,12 @@ +Cambios en 0.17.3 + +Se ha mejorado +- Añadida la opción de borrar los estados de reproducción #2550 +- Mostrar directorios ocultos en el selector de archivos #2591 +- Soportar URLs de instancias de `invidio.us` para ser abiertas con NewPipe #2488 +- Añadir soporte para URLs de `music.youtube.com` TeamNewPipe/NewPipeExtractor#194 + +Corregido +- YouTube] Corregido 'java.lang.IllegalArgumentException' #192 +- YouTube] Arreglado que las transmisiones en directo no funcionan TeamNewPipe/NewPipeExtractor#195 +- Corregido el problema de rendimiento en android pie al descargar un stream #2592 diff --git a/fastlane/metadata/android/es/changelogs/790.txt b/fastlane/metadata/android/es/changelogs/790.txt new file mode 100644 index 000000000..16a670c97 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/790.txt @@ -0,0 +1,14 @@ +Mejora de +- Añadir más títulos para mejorar la accesibilidad de los invidentes #2655 +- Hacer que el lenguaje de la configuración de la carpeta de descarga sea más consistente y menos ambiguo #2637 + +Corregido +- Comprobar si se descarga el último byte del bloque #2646 +- Corregido el desplazamiento en el fragmento de detalle del vídeo #2672 +- Quitar las animaciones de doble caja de búsqueda a una sola #2695 +- [SoundCloud] Fijar la extracción de client_id #2745 + +Desarrollo +- Añadir las dependencias que faltan heredadas de NewPipeExtractor en NewPipe #2535 +- Migrar a AndroidX #685 +- Actualizar a ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/es/changelogs/800.txt b/fastlane/metadata/android/es/changelogs/800.txt new file mode 100644 index 000000000..6798a8e1a --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/800.txt @@ -0,0 +1,27 @@ +Nuevo +- Soporte de PeerTube sin P2P (#2201) [Beta]: + ◦ Ver y descargar vídeos de las instancias de PeerTube. + ◦ Añadir instancias en la configuración para acceder al mundo completo de PeerTube + ◦ Podría haber problemas con los apretones de manos SSL en Android 4.4 y 7.1 al acceder a ciertas instancias, lo que resulta en un error de red. + +- Descargador (#2679): + ◦ Calcular el tiempo estimado de descarga + ◦ Descargar opus (archivos webm) como ogg + ◦ Recuperar enlaces de descarga caducados para reanudar las descargas tras una larga pausa + +Mejorado +- Hacer el KioskFragment consciente de los cambios en el país de contenido preferido y mejorar el rendimiento de todas las fichas principales #2742 +- Utilizar las nuevas implementaciones de localización y descargador del extractor #2713 +- Hacer traducible la cadena "Kiosco por defecto +- Barra de navegación negra para el tema negro #2569 + +Corregido +- Se ha corregido un error que impedía mover el reproductor emergente si se colocaba otro dedo mientras se movía el reproductor emergente #2772 +- Permitir que las listas de reproducción no tengan un cargador y arreglar los fallos relacionados con este problema #2724, TeamNewPipe/NewPipeExtractor#219 +- Habilitar TLS1.1/1.2 en dispositivos Android 4.4 (API 19/KitKat) para arreglar el apretón de manos TLS con MediaCCC y algunas instancias de PeerTube #2792 +- SoundCloud] Corregida la extracción de client_id TeamNewPipe/NewPipeExtractor#217 +- SoundCloud] Corregir la extracción de flujos de audio + +Desarrollo +- Actualizar ExoPlayer a la versión 2.10.8 #2791, #2816 +- Actualizar Gradle a 3.5.1 y añadir soporte para Kotlin #2714 diff --git a/fastlane/metadata/android/es/changelogs/963.txt b/fastlane/metadata/android/es/changelogs/963.txt new file mode 100644 index 000000000..b1cb99b52 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] Continuación del canal fijo diff --git a/fastlane/metadata/android/es/changelogs/983.txt b/fastlane/metadata/android/es/changelogs/983.txt new file mode 100644 index 000000000..8a9155daf --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/983.txt @@ -0,0 +1,9 @@ +Añadir una nueva interfaz de usuario y comportamiento de doble pulsación para buscar +Hacer que se pueda buscar en los ajustes +Resaltar los comentarios anclados como tales +Añadir compatibilidad con aplicaciones abiertas para la instancia PeerTube de la FSFE +Añadir notificaciones de error +Arreglar la repetición del primer elemento de la cola al cambiar de jugador +Esperar más tiempo en el búfer durante las transmisiones en directo antes de fallar +Corregir el orden de los resultados de la búsqueda local +Arreglar los campos de elementos vacíos en la cola de reproducción diff --git a/fastlane/metadata/android/pt-BR/changelogs/963.txt b/fastlane/metadata/android/pt-BR/changelogs/963.txt new file mode 100644 index 000000000..fbbf0a6c6 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] Corrigido continuação de canal diff --git a/fastlane/metadata/android/pt-BR/changelogs/978.txt b/fastlane/metadata/android/pt-BR/changelogs/978.txt new file mode 100644 index 000000000..bc2b33ab2 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/978.txt @@ -0,0 +1 @@ +Corrigido execução de verificação para uma nova versão do NewPipe. Essa verificação era executada muito cedo algumas vezes e logo levava o aplicativo a crashar. Isso deve estar corrigido agora. diff --git a/fastlane/metadata/android/pt-BR/changelogs/982.txt b/fastlane/metadata/android/pt-BR/changelogs/982.txt new file mode 100644 index 000000000..127a63029 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/982.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir qualquer transmissão. diff --git a/fastlane/metadata/android/pt-BR/changelogs/985.txt b/fastlane/metadata/android/pt-BR/changelogs/985.txt new file mode 100644 index 000000000..59fc6a5cd --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/985.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir qualquer transmissão diff --git a/fastlane/metadata/android/pt-BR/changelogs/989.txt b/fastlane/metadata/android/pt-BR/changelogs/989.txt new file mode 100644 index 000000000..2bbb11532 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Corrigido carregamento quando tentava reproduzir qualquer vídeo +• [YouTube] Corrigido a aceleração em alguns vídeos +• Atualização da biblioteca jsoup para 1.15.3, que inclue uma correção de segurança diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt index 5b9f3813f..1bd52932a 100644 --- a/fastlane/metadata/android/pt-BR/full_description.txt +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -1 +1 @@ -O NewPipe não usa nenhuma biblioteca de framework do Google ou a API do YouTube. Ele só analisa o site para obter as informações que precisa. Portanto, este aplicativo pode ser usado em dispositivos sem o Google Services instalado. Além disso, você não precisa de uma conta no YouTube para usar o NewPipe, e seus FLOSS. +O NewPipe não usa nenhuma biblioteca de framework do Google ou a API do YouTube. Ele só analisa o site para obter as informações que precisa. Portanto, este aplicativo pode ser usado em dispositivos sem o Google Services instalado. Além disso, você não precisa de uma conta no YouTube para usar o NewPipe, e é FLOSS. diff --git a/fastlane/metadata/android/pt-PT/changelogs/65.txt b/fastlane/metadata/android/pt-PT/changelogs/65.txt new file mode 100644 index 000000000..a72ca3242 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/65.txt @@ -0,0 +1,26 @@ +### Melhorias + +- Desativar a animação do ícone do burgermenu #1486 +- Desfazer a eliminação de descarregamentos #1472 +- Opção de descarregamento no menu de partilha #1498 +- Opção de partilha adicionada ao menu de toque longo #1454 +- Minimize o jogador principal na saída #1354 +- Atualização da versão da biblioteca e correção de cópia de segurança da base de dados #1510 +- ExoPlayer 2.8.2 Atualização #1392 +- Retrabalhado a caixa de diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de etapa para uma mudança de velocidade mais rápida. +- Adicionado uma alternância para avanço rápido durante silêncios no controlo de velocidade de reprodução. Isso deve ser útil para audiolivros e certos géneros musicais, e pode trazer uma experiência verdadeiramente perfeita (e pode quebrar uma música com muitos silêncios =\\). +- Resolução de fonte de média ré fatorada para permitir a passagem de metadados com a média internamente no reprodutor, em vez de fazê-lo manualmente. Agora temos uma única fonte de metadados e está disponível diretamente quando a reprodução é iniciada. +- Correção de metadados de listas de reprodução remotas que não são atualizadas quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberta. +- Várias correções de interface do utilizador: #1383, controles de notificação do reprodutor em segundo plano agora sempre brancos, mais fácil de desligar o reprodutor pop-up por meio de arremesso +- Use novo extrator com arquitetura ré fatorada para multisserviço + +### Conserta + +- Correção #1440 Layout de informações de vídeo quebrado #1491 +- Ver correção de histórico #1497 +- #1495, atualizando os metadados (miniatura, título e contagem de vídeos) assim que o utilizador acessar a lista de reprodução. +- #1475, registando uma visualização na base de dados quando o utilizador inicia um vídeo no reprodutor externo no fragmento de detalhes. +- Correção de tempo limite de criação em caso de modo pop-up. #1463 (Corrigido #640) +- Correção do reprodutor de vídeo principal #1509 +- [#1412] Corrigido o modo de repetição causando NPE do reprodutor quando uma nova intenção é recebida enquanto a atividade do reprodutor está em segundo plano. +- Corrigida a minimização de reprodutor para pop-up não destrói o reprodutor quando a permissão de pop-up não é concedida. diff --git a/fastlane/metadata/android/pt-PT/changelogs/965.txt b/fastlane/metadata/android/pt-PT/changelogs/965.txt new file mode 100644 index 000000000..de54cf139 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/965.txt @@ -0,0 +1,6 @@ +Corrigido o crash que ocorria ao reordenar grupos de canais. +Corrigida a obtenção de mais vídeos do YouTube a partir de canais e listas de reprodução. +Corrigida a obtenção de comentários do YouTube. +Adicionado suporte a /watch/, /v/ e /w/ subpaths nas URLs do YouTube. +Corrigida a extração de id de cliente SoundCloud e conteúdo geo-restrito. +Adicionada a localização Curda do Norte. diff --git a/fastlane/metadata/android/pt-PT/changelogs/982.txt b/fastlane/metadata/android/pt-PT/changelogs/982.txt new file mode 100644 index 000000000..8da695715 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/982.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir nenhuma transmissão. diff --git a/fastlane/metadata/android/pt-PT/changelogs/984.txt b/fastlane/metadata/android/pt-PT/changelogs/984.txt new file mode 100644 index 000000000..7dd898c2c --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/984.txt @@ -0,0 +1,7 @@ +Carregamento de itens iniciais suficientes em listas para preencher o ecrã inteiro e corrigir a rolagem em tablets e TVs +Correção de falhas aleatórias ao percorrer listas +Procura rápida no reprodutor do arco overlay passando pela UI do sistema +Reversão das mudanças para recortes ao jogar em várias janelas, causando a regressão do jogador deslocado em alguns telefones +Aumento do compileSdk de 30 para 31 +Atualização da biblioteca de relatórios de erros +Refatoração de algum código no reprodutor diff --git a/fastlane/metadata/android/pt-PT/changelogs/985.txt b/fastlane/metadata/android/pt-PT/changelogs/985.txt new file mode 100644 index 000000000..93519d64d --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/985.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir nenhuma transmissão diff --git a/fastlane/metadata/android/pt-PT/changelogs/988.txt b/fastlane/metadata/android/pt-PT/changelogs/988.txt new file mode 100644 index 000000000..fe6ecb633 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Correção do erro "Não foi possível obter nenhum stream" ao tentar reproduzir qualquer vídeo +[YouTube] Correção "O seguinte conteúdo não está disponível nesta aplicação" mensagem mostrada em vez do vídeo solicitado diff --git a/fastlane/metadata/android/pt-PT/changelogs/989.txt b/fastlane/metadata/android/pt-PT/changelogs/989.txt new file mode 100644 index 000000000..7b0ae5981 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/989.txt @@ -0,0 +1,3 @@ +- [YouTube] Corrigido o carregamento infinito ao tentar reproduzir qualquer vídeo +- [YouTube] Corrigido a limitação em alguns vídeos +- Atualizado a biblioteca do jsoup para 1.15.3, que inclui uma correção de segurança diff --git a/fastlane/metadata/android/pt/changelogs/982.txt b/fastlane/metadata/android/pt/changelogs/982.txt new file mode 100644 index 000000000..8da695715 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/982.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir nenhuma transmissão. diff --git a/fastlane/metadata/android/pt/changelogs/984.txt b/fastlane/metadata/android/pt/changelogs/984.txt new file mode 100644 index 000000000..7dd898c2c --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/984.txt @@ -0,0 +1,7 @@ +Carregamento de itens iniciais suficientes em listas para preencher o ecrã inteiro e corrigir a rolagem em tablets e TVs +Correção de falhas aleatórias ao percorrer listas +Procura rápida no reprodutor do arco overlay passando pela UI do sistema +Reversão das mudanças para recortes ao jogar em várias janelas, causando a regressão do jogador deslocado em alguns telefones +Aumento do compileSdk de 30 para 31 +Atualização da biblioteca de relatórios de erros +Refatoração de algum código no reprodutor diff --git a/fastlane/metadata/android/pt/changelogs/985.txt b/fastlane/metadata/android/pt/changelogs/985.txt new file mode 100644 index 000000000..93519d64d --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/985.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir nenhuma transmissão diff --git a/fastlane/metadata/android/pt/changelogs/988.txt b/fastlane/metadata/android/pt/changelogs/988.txt new file mode 100644 index 000000000..fe6ecb633 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Correção do erro "Não foi possível obter nenhum stream" ao tentar reproduzir qualquer vídeo +[YouTube] Correção "O seguinte conteúdo não está disponível nesta aplicação" mensagem mostrada em vez do vídeo solicitado diff --git a/fastlane/metadata/android/pt/changelogs/989.txt b/fastlane/metadata/android/pt/changelogs/989.txt new file mode 100644 index 000000000..7b0ae5981 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/989.txt @@ -0,0 +1,3 @@ +- [YouTube] Corrigido o carregamento infinito ao tentar reproduzir qualquer vídeo +- [YouTube] Corrigido a limitação em alguns vídeos +- Atualizado a biblioteca do jsoup para 1.15.3, que inclui uma correção de segurança diff --git a/fastlane/metadata/android/tr/changelogs/68.txt b/fastlane/metadata/android/tr/changelogs/68.txt new file mode 100644 index 000000000..b2507d484 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/68.txt @@ -0,0 +1,31 @@ +# v0.14.1 değişiklikleri + +### Sabit +- Sabit video url # 1659 şifresini çözmek için başarısız oldu +- Sabit açıklama bağlantısı iyi ayıklanmıyor # 1657 + +# v0.14.0 değişiklikleri + +### Yeni +- Yeni Çekmece tasarımı # 1461 +- Yeni özelleştirilebilir ön sayfa # 1461 + +### Geliştirmeler +- Yeniden işlenmiş Hareket kontrolleri # 1604 +- Pop-up oynatıcıyı kapatmanın yeni yolu # 1597 + +### Sabit +- Abonelik sayısı mevcut olmadığında bir hata düzeltildi. # 1649'u kapatır. +- Bu durumlarda "Abone sayısı mevcut değil" i göster +- Bir YouTube çalma listesi boş olduğunda npe'yi düzeltin +- Soundcloud'daki kiosklar için hızlı düzeltme +- Refactor ve hata düzeltme # 1623 +- Döngüsel arama sonucunu düzelt # 1562 +- Statik olarak yerleştirilmemiş Arama çubuğunu düzeltin +- Fix YT Premium video doğru engellenmiyor +- Bazen yüklenmeyen videoları düzeltin (ÇİZGİ ayrıştırma nedeniyle) +- Video açıklamasındaki bağlantıları düzeltin +- Birisi harici sd karta indirmeye çalıştığında uyarıyı göster +- gösterilen hiçbir şey düzeltilmedi istisna tetikleyicileri raporu +- android 8.1 için arka plan oynatıcısında gösterilmeyen küçük resim [buraya bakın] (https://github.com/TeamNewPipe/NewPipe/issues/943 ) +- Yayın alıcısının kaydını düzeltin. # 1641'i kapatır. From 4a278ef102d65a2c1f67c7603781cba3a042f11b Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 11 Oct 2022 21:27:04 +0200 Subject: [PATCH 14/63] Hide play queue button in VideoDetailsFragment mini player when the play queue is empty Related PR introducing the button: #8946 --- .../fragments/detail/VideoDetailFragment.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index bf84c7325..580585d4e 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -248,6 +248,7 @@ public final class VideoDetailFragment autoPlayEnabled = true; // forcefully start playing openVideoPlayerAutoFullscreen(); } + updateOverlayPlayQueueButtonVisibility(); } @Override @@ -337,6 +338,8 @@ public final class VideoDetailFragment activity.sendBroadcast(new Intent(ACTION_VIDEO_FRAGMENT_RESUMED)); + updateOverlayPlayQueueButtonVisibility(); + setupBrightness(); if (tabSettingsChanged) { @@ -1820,6 +1823,14 @@ public final class VideoDetailFragment + title + "], playQueue = [" + playQueue + "]"); } + // Register broadcast receiver to listen to playQueue changes + // and hide the overlayPlayQueueButton when the playQueue is empty / destroyed. + if (playQueue != null && playQueue.getBroadcastReceiver() != null) { + playQueue.getBroadcastReceiver().subscribe( + event -> updateOverlayPlayQueueButtonVisibility() + ); + } + // This should be the only place where we push data to stack. // It will allow to have live instance of PlayQueue with actual information about // deleted/added items inside Channel/Playlist queue and makes possible to have @@ -1926,6 +1937,7 @@ public final class VideoDetailFragment currentInfo.getUploaderName(), currentInfo.getThumbnailUrl()); } + updateOverlayPlayQueueButtonVisibility(); } @Override @@ -2392,6 +2404,18 @@ public final class VideoDetailFragment }); } + private void updateOverlayPlayQueueButtonVisibility() { + final boolean isPlayQueueEmpty = + player == null // no player => no play queue :) + || player.getPlayQueue() == null + || player.getPlayQueue().isEmpty(); + if (binding != null) { + // binding is null when rotating the device... + binding.overlayPlayQueueButton.setVisibility( + isPlayQueueEmpty ? View.GONE : View.VISIBLE); + } + } + private void updateOverlayData(@Nullable final String overlayTitle, @Nullable final String uploader, @Nullable final String thumbnailUrl) { From 02deaa0f1ab829181aec4291c0da94ef6ccb7b07 Mon Sep 17 00:00:00 2001 From: opusforlife2 <53176348+opusforlife2@users.noreply.github.com> Date: Fri, 14 Oct 2022 17:02:24 +0000 Subject: [PATCH 15/63] Update label to 'feature request' --- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 52b2a4241..31ef92c44 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,6 +1,6 @@ name: Feature request description: Suggest an idea for this project -labels: [enhancement, needs triage] +labels: [feature request, needs triage] body: - type: markdown attributes: From 6277d4981c6260ff5fac36608f9a868458c48b8b Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 17 Sep 2022 19:17:03 +0530 Subject: [PATCH 16/63] Update Android Gradle Plugin to 7.3.0. --- app/build.gradle | 2 +- app/src/debug/AndroidManifest.xml | 6 ++---- app/src/main/AndroidManifest.xml | 4 +++- build.gradle | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9d941d5a7..7d9eafdd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ plugins { android { compileSdk 31 - buildToolsVersion '31.0.0' + namespace 'org.schabi.newpipe' defaultConfig { applicationId "org.schabi.newpipe" diff --git a/app/src/debug/AndroidManifest.xml b/app/src/debug/AndroidManifest.xml index 5cc2fa66a..02a0f6c74 100644 --- a/app/src/debug/AndroidManifest.xml +++ b/app/src/debug/AndroidManifest.xml @@ -1,8 +1,6 @@ - + @@ -14,6 +13,9 @@ + Date: Sun, 23 Oct 2022 23:43:52 +1100 Subject: [PATCH 17/63] Created a non-functional button in HeaderWithMenuItem.kt --- .../newpipe/local/subscription/SubscriptionFragment.kt | 1 + .../newpipe/local/subscription/item/HeaderWithMenuItem.kt | 8 +++++++- app/src/main/res/layout/header_with_menu_item.xml | 8 ++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) 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 20f8a01c1..a804b0ff3 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 @@ -269,6 +269,7 @@ class SubscriptionFragment : BaseStateFragment() { feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter) feedGroupsSortMenuItem = HeaderWithMenuItem( getString(R.string.feed_groups_header_title), + R.drawable.ic_list, R.drawable.ic_sort, menuItemOnClickListener = ::openReorderDialog ) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt index 79a272178..cb312b023 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt @@ -11,8 +11,10 @@ import org.schabi.newpipe.databinding.HeaderWithMenuItemBinding class HeaderWithMenuItem( val title: String, @DrawableRes val itemIcon: Int = 0, + @DrawableRes val itemIconListView: Int = 0, var showMenuItem: Boolean = true, private val onClickListener: (() -> Unit)? = null, + private val onClickListenerListView: (() -> Unit)? = null, private val menuItemOnClickListener: (() -> Unit)? = null ) : BindableItem() { companion object { @@ -32,11 +34,15 @@ class HeaderWithMenuItem( override fun bind(viewBinding: HeaderWithMenuItemBinding, position: Int) { viewBinding.headerTitle.text = title - viewBinding.headerMenuItem.setImageResource(itemIcon) + viewBinding.headerMenuItem2.setImageResource(itemIcon) + viewBinding.headerMenuItem.setImageResource(itemIconListView) val listener = onClickListener?.let { OnClickListener { onClickListener.invoke() } } viewBinding.root.setOnClickListener(listener) + val listenerListView = onClickListenerListView?.let { OnClickListener { onClickListenerListView.invoke() } } + viewBinding.root.setOnClickListener(listenerListView) + val menuItemListener = menuItemOnClickListener?.let { OnClickListener { menuItemOnClickListener.invoke() } } viewBinding.headerMenuItem.setOnClickListener(menuItemListener) updateMenuItemVisibility(viewBinding) diff --git a/app/src/main/res/layout/header_with_menu_item.xml b/app/src/main/res/layout/header_with_menu_item.xml index fcf888ed5..170c40098 100644 --- a/app/src/main/res/layout/header_with_menu_item.xml +++ b/app/src/main/res/layout/header_with_menu_item.xml @@ -22,6 +22,14 @@ android:textStyle="bold" tools:text="Header" /> + + Date: Mon, 24 Oct 2022 14:14:41 +1100 Subject: [PATCH 18/63] Added sharing a link with timestamp from a chapter into the long click for each chapter --- .../newpipe/info_list/StreamSegmentAdapter.kt | 1 + .../newpipe/info_list/StreamSegmentItem.kt | 1 + .../newpipe/player/ui/MainPlayerUi.java | 26 +++++++++++++++---- 3 files changed, 23 insertions(+), 5 deletions(-) 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 9fb4bfbb3..869bf6f48 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 @@ -61,5 +61,6 @@ class StreamSegmentAdapter( interface StreamSegmentListener { fun onItemClick(item: StreamSegmentItem, seconds: Int) + fun onItemLongClick(item: StreamSegmentItem, seconds: Int) } } 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 f233c7627..5fc8aa684 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 @@ -41,6 +41,7 @@ class StreamSegmentItem( viewHolder.root.findViewById(R.id.textViewStartSeconds).text = Localization.getDurationString(item.startTimeSeconds.toLong()) viewHolder.root.setOnClickListener { onClick.onItemClick(this, item.startTimeSeconds) } + viewHolder.root.setOnLongClickListener { onClick.onItemLongClick(this, item.startTimeSeconds); true } viewHolder.root.isSelected = isSelected } diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index 81dc954d1..4f00bcf12 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -52,6 +52,7 @@ import org.schabi.newpipe.extractor.stream.StreamSegment; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.info_list.StreamSegmentAdapter; +import org.schabi.newpipe.info_list.StreamSegmentItem; import org.schabi.newpipe.ktx.AnimationType; import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.player.Player; @@ -69,6 +70,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueueItemTouchCallback; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.KoreUtils; +import org.schabi.newpipe.util.external_communication.ShareUtils; import java.util.List; import java.util.Objects; @@ -644,7 +646,7 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh private void buildSegments() { binding.itemsList.setAdapter(segmentAdapter); binding.itemsList.setClickable(true); - binding.itemsList.setLongClickable(false); + binding.itemsList.setLongClickable(true); binding.itemsList.clearOnScrollListeners(); if (itemTouchHelper != null) { @@ -696,10 +698,24 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh } private StreamSegmentAdapter.StreamSegmentListener getStreamSegmentListener() { - return (item, seconds) -> { - segmentAdapter.selectSegment(item); - player.seekTo(seconds * 1000L); - player.triggerProgressUpdate(); + return new StreamSegmentAdapter.StreamSegmentListener() { + @Override + public void onItemClick(@NonNull final StreamSegmentItem item, final int seconds) { + segmentAdapter.selectSegment(item); + player.seekTo(seconds * 1000L); + player.triggerProgressUpdate(); + } + + @Override + public void onItemLongClick(@NonNull final StreamSegmentItem item, final int seconds) { + final PlayQueueItem currentItem = player.getCurrentItem(); + if (currentItem != null) { + String videoUrl = player.getVideoUrl(); + videoUrl += ("&t=" + seconds); + ShareUtils.shareText(context, currentItem.getTitle(), + videoUrl, currentItem.getThumbnailUrl()); + } + } }; } From 29e56b9f2d68594ff313f1f9a2a69d3f3903ace1 Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Mon, 24 Oct 2022 16:55:12 +1100 Subject: [PATCH 19/63] Created a button in SubscriptionFragment.kt that reads whether button is clicked --- .../newpipe/local/subscription/SubscriptionFragment.kt | 5 +++++ .../newpipe/local/subscription/item/HeaderWithMenuItem.kt | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) 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 a804b0ff3..bf4941e8e 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 @@ -221,6 +221,10 @@ class SubscriptionFragment : BaseStateFragment() { FeedGroupReorderDialog().show(parentFragmentManager, null) } + private fun temp() { + println("This button is clicked") + } + private fun requestExportResult(result: ActivityResult) { if (result.data != null && result.resultCode == Activity.RESULT_OK) { activity.startService( @@ -271,6 +275,7 @@ class SubscriptionFragment : BaseStateFragment() { getString(R.string.feed_groups_header_title), R.drawable.ic_list, R.drawable.ic_sort, + listViewOnClickListener = ::temp, menuItemOnClickListener = ::openReorderDialog ) add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel))) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt index cb312b023..338083c87 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/HeaderWithMenuItem.kt @@ -14,7 +14,7 @@ class HeaderWithMenuItem( @DrawableRes val itemIconListView: Int = 0, var showMenuItem: Boolean = true, private val onClickListener: (() -> Unit)? = null, - private val onClickListenerListView: (() -> Unit)? = null, + private val listViewOnClickListener: (() -> Unit)? = null, private val menuItemOnClickListener: (() -> Unit)? = null ) : BindableItem() { companion object { @@ -40,8 +40,8 @@ class HeaderWithMenuItem( val listener = onClickListener?.let { OnClickListener { onClickListener.invoke() } } viewBinding.root.setOnClickListener(listener) - val listenerListView = onClickListenerListView?.let { OnClickListener { onClickListenerListView.invoke() } } - viewBinding.root.setOnClickListener(listenerListView) + val listViewListener = listViewOnClickListener?.let { OnClickListener { listViewOnClickListener.invoke() } } + viewBinding.headerMenuItem2.setOnClickListener(listViewListener) val menuItemListener = menuItemOnClickListener?.let { OnClickListener { menuItemOnClickListener.invoke() } } viewBinding.headerMenuItem.setOnClickListener(menuItemListener) From 78547b4fa464cac863e63e07f30529528703dad7 Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Mon, 24 Oct 2022 18:55:08 +1100 Subject: [PATCH 20/63] Created a list view for channel group. --- .../decoration/FeedGroupCarouselDecoration.kt | 2 +- .../subscription/item/FeedGroupCardItem.kt | 2 +- .../item/FeedGroupCarouselItem.kt | 2 +- .../main/res/layout/feed_group_list_item.xml | 43 +++++++++++++++++++ 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/layout/feed_group_list_item.xml diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/decoration/FeedGroupCarouselDecoration.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/decoration/FeedGroupCarouselDecoration.kt index 7b7490eaa..a113a8b41 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/decoration/FeedGroupCarouselDecoration.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/decoration/FeedGroupCarouselDecoration.kt @@ -26,7 +26,7 @@ class FeedGroupCarouselDecoration(context: Context) : RecyclerView.ItemDecoratio outRect.set(marginBetweenItems, marginTopBottom, 0, marginTopBottom) - if (childAdapterPosition == 0) { + if (childAdapterPosition >= 0) { outRect.left = marginStartEnd } else if (childAdapterPosition == childAdapterCount - 1) { outRect.right = marginStartEnd diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt index 7b78b3d95..fd8a75da1 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt @@ -21,7 +21,7 @@ data class FeedGroupCardItem( } } - override fun getLayout(): Int = R.layout.feed_group_card_item + override fun getLayout(): Int = R.layout.feed_group_list_item override fun bind(viewBinding: FeedGroupCardItemBinding, position: Int) { viewBinding.title.text = name diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt index 44af16280..031eb9b18 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt @@ -36,7 +36,7 @@ class FeedGroupCarouselItem( override fun initializeViewBinding(view: View): FeedItemCarouselBinding { val viewHolder = FeedItemCarouselBinding.bind(view) - linearLayoutManager = LinearLayoutManager(view.context, RecyclerView.HORIZONTAL, false) + linearLayoutManager = LinearLayoutManager(view.context, RecyclerView.VERTICAL, false) viewHolder.recyclerView.apply { layoutManager = linearLayoutManager diff --git a/app/src/main/res/layout/feed_group_list_item.xml b/app/src/main/res/layout/feed_group_list_item.xml new file mode 100644 index 000000000..c49da1eab --- /dev/null +++ b/app/src/main/res/layout/feed_group_list_item.xml @@ -0,0 +1,43 @@ + + + + + + + + + + From f37d869ea2c2474985a1386af9fbed67abf092ef Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Mon, 24 Oct 2022 23:01:02 +1100 Subject: [PATCH 21/63] Button can be toggled but not all strings have been fed --- .../5.json | 26 +++-- .../database/feed/model/FeedGroupEntity.kt | 2 +- .../subscription/SubscriptionFragment.kt | 101 ++++++++++++++++-- .../subscription/item/FeedGroupCardItem.kt | 4 +- .../item/FeedGroupCardVerticalItem.kt | 32 ++++++ .../item/FeedGroupCarouselItem.kt | 6 +- ....xml => feed_group_card_vertical_item.xml} | 7 +- 7 files changed, 155 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardVerticalItem.kt rename app/src/main/res/layout/{feed_group_list_item.xml => feed_group_card_vertical_item.xml} (92%) diff --git a/app/schemas/org.schabi.newpipe.database.AppDatabase/5.json b/app/schemas/org.schabi.newpipe.database.AppDatabase/5.json index 9a1c62995..eeebdeb49 100644 --- a/app/schemas/org.schabi.newpipe.database.AppDatabase/5.json +++ b/app/schemas/org.schabi.newpipe.database.AppDatabase/5.json @@ -71,6 +71,7 @@ "service_id", "url" ], + "orders": [], "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" } ], @@ -78,14 +79,8 @@ }, { "tableName": "search_history", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, { "fieldPath": "creationDate", "columnName": "creation_date", @@ -103,6 +98,12 @@ "columnName": "search", "affinity": "TEXT", "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true } ], "primaryKey": { @@ -118,6 +119,7 @@ "columnNames": [ "search" ], + "orders": [], "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)" } ], @@ -220,6 +222,7 @@ "service_id", "url" ], + "orders": [], "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" } ], @@ -262,6 +265,7 @@ "columnNames": [ "stream_id" ], + "orders": [], "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)" } ], @@ -353,6 +357,7 @@ "columnNames": [ "name" ], + "orders": [], "createSql": "CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)" } ], @@ -396,6 +401,7 @@ "playlist_id", "join_index" ], + "orders": [], "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)" }, { @@ -404,6 +410,7 @@ "columnNames": [ "stream_id" ], + "orders": [], "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)" } ], @@ -492,6 +499,7 @@ "columnNames": [ "name" ], + "orders": [], "createSql": "CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)" }, { @@ -501,6 +509,7 @@ "service_id", "url" ], + "orders": [], "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" } ], @@ -537,6 +546,7 @@ "columnNames": [ "subscription_id" ], + "orders": [], "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" } ], @@ -607,6 +617,7 @@ "columnNames": [ "sort_order" ], + "orders": [], "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)" } ], @@ -643,6 +654,7 @@ "columnNames": [ "subscription_id" ], + "orders": [], "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" } ], diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt index 1dd26946a..c7415ace0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt @@ -24,7 +24,7 @@ data class FeedGroupEntity( var icon: FeedGroupIcon, @ColumnInfo(name = SORT_ORDER) - var sortOrder: Long = -1 + var sortOrder: Long = -1, ) { companion object { const val FEED_GROUP_TABLE = "feed_group" 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 bf4941e8e..659187ffa 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 @@ -20,6 +20,7 @@ import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.xwray.groupie.Group import com.xwray.groupie.GroupAdapter import com.xwray.groupie.Item @@ -45,6 +46,7 @@ import org.schabi.newpipe.local.subscription.item.ChannelItem import org.schabi.newpipe.local.subscription.item.EmptyPlaceholderItem import org.schabi.newpipe.local.subscription.item.FeedGroupAddItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem +import org.schabi.newpipe.local.subscription.item.FeedGroupCardVerticalItem import org.schabi.newpipe.local.subscription.item.FeedGroupCarouselItem import org.schabi.newpipe.local.subscription.item.HeaderWithMenuItem import org.schabi.newpipe.local.subscription.item.HeaderWithMenuItem.Companion.PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM @@ -76,6 +78,7 @@ class SubscriptionFragment : BaseStateFragment() { private val groupAdapter = GroupAdapter>() private val feedGroupsSection = Section() private var feedGroupsCarousel: FeedGroupCarouselItem? = null + private var feedGroupsCarouselVertical: FeedGroupCarouselItem? = feedGroupsCarousel private lateinit var feedGroupsSortMenuItem: HeaderWithMenuItem private val subscriptionsSection = Section() @@ -92,6 +95,10 @@ class SubscriptionFragment : BaseStateFragment() { @JvmField var feedGroupsListState: Parcelable? = null + @State + @JvmField + var feedGroupsListVerticalState: Parcelable? = null + init { setHasOptionsMenu(true) } @@ -118,6 +125,7 @@ class SubscriptionFragment : BaseStateFragment() { super.onPause() itemsListState = binding.itemsList.layoutManager?.onSaveInstanceState() feedGroupsListState = feedGroupsCarousel?.onSaveInstanceState() + feedGroupsListVerticalState = feedGroupsCarouselVertical?.onSaveInstanceState() } override fun onDestroy() { @@ -221,10 +229,6 @@ class SubscriptionFragment : BaseStateFragment() { FeedGroupReorderDialog().show(parentFragmentManager, null) } - private fun temp() { - println("This button is clicked") - } - private fun requestExportResult(result: ActivityResult) { if (result.data != null && result.resultCode == Activity.RESULT_OK) { activity.startService( @@ -270,16 +274,16 @@ class SubscriptionFragment : BaseStateFragment() { return@setOnItemLongClickListener true } - feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter) + feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter, RecyclerView.HORIZONTAL) feedGroupsSortMenuItem = HeaderWithMenuItem( getString(R.string.feed_groups_header_title), R.drawable.ic_list, R.drawable.ic_sort, - listViewOnClickListener = ::temp, + listViewOnClickListener = ::changeLayout, menuItemOnClickListener = ::openReorderDialog ) add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel))) - + groupAdapter.clear() groupAdapter.add(this) } @@ -296,6 +300,62 @@ class SubscriptionFragment : BaseStateFragment() { ) } + private fun changeLayout() { + Section().apply { + val carouselAdapter = GroupAdapter>() + + carouselAdapter.add(FeedGroupCardVerticalItem(-1, getString(R.string.all), FeedGroupIcon.RSS)) + carouselAdapter.add(feedGroupsSection) + carouselAdapter.add(FeedGroupAddItem()) // change this button later + carouselAdapter.setOnItemClickListener { item, _ -> + listenerFeedVerticalGroups.selected(item) + } + carouselAdapter.setOnItemLongClickListener { item, _ -> + if (item is FeedGroupCardVerticalItem) { + if (item.groupId == FeedGroupEntity.GROUP_ALL_ID) { + return@setOnItemLongClickListener false + } + } + listenerFeedVerticalGroups.held(item) + return@setOnItemLongClickListener true + } + + feedGroupsCarouselVertical = FeedGroupCarouselItem(requireContext(), carouselAdapter, RecyclerView.VERTICAL) + feedGroupsSortMenuItem = HeaderWithMenuItem( + getString(R.string.feed_groups_header_title), + R.drawable.ic_apps, + R.drawable.ic_sort, + listViewOnClickListener = ::setupInitialLayout, + menuItemOnClickListener = ::openReorderDialog + ) + add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarouselVertical))) + groupAdapter.clear() + groupAdapter.add(this) + } + subscriptionsSection.setPlaceholder(EmptyPlaceholderItem()) + subscriptionsSection.setHideWhenEmpty(true) + + groupAdapter.add( + Section( + HeaderWithMenuItem( + getString(R.string.tab_subscriptions) + ), + listOf(subscriptionsSection) + ) + ) + + // TODO: remove this + groupAdapter.spanCount = if (shouldUseGridLayout(context)) getGridSpanCountChannels(context) else 1 + binding.itemsList.layoutManager = GridLayoutManager(requireContext(), groupAdapter.spanCount).apply { + spanSizeLookup = groupAdapter.spanSizeLookup + } + binding.itemsList.adapter = groupAdapter + + viewModel = ViewModelProvider(this).get(SubscriptionViewModel::class.java) + viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(this::handleResult) } + viewModel.feedGroupsLiveData.observe(viewLifecycleOwner) { it?.let(this::handleFeedVerticalGroups) } + } + override fun initViews(rootView: View, savedInstanceState: Bundle?) { super.initViews(rootView, savedInstanceState) _binding = FragmentSubscriptionBinding.bind(rootView) @@ -367,6 +427,21 @@ class SubscriptionFragment : BaseStateFragment() { } } + private val listenerFeedVerticalGroups = object : OnClickGesture> { + override fun selected(selectedItem: Item<*>?) { + when (selectedItem) { + is FeedGroupCardVerticalItem -> NavigationHelper.openFeedFragment(fm, selectedItem.groupId, selectedItem.name) + is FeedGroupAddItem -> FeedGroupDialog.newInstance().show(fm, null) + } + } + + override fun held(selectedItem: Item<*>?) { + when (selectedItem) { + is FeedGroupCardVerticalItem -> FeedGroupDialog.newInstance(selectedItem.groupId).show(fm, null) + } + } + } + private val listenerChannelItem = object : OnClickGesture { override fun selected(selectedItem: ChannelInfoItem) = NavigationHelper.openChannelFragment( fm, @@ -420,6 +495,18 @@ class SubscriptionFragment : BaseStateFragment() { binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } } + private fun handleFeedVerticalGroups(groups: List) { + feedGroupsSection.update(groups) + + if (feedGroupsListState != null) { + feedGroupsCarouselVertical?.onRestoreInstanceState(feedGroupsListVerticalState) + feedGroupsListVerticalState = null + } + + feedGroupsSortMenuItem.showMenuItem = groups.size > 1 + binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } + } + // ///////////////////////////////////////////////////////////////////////// // Contract // ///////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt index fd8a75da1..a4fa84798 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt @@ -10,7 +10,7 @@ import org.schabi.newpipe.local.subscription.FeedGroupIcon data class FeedGroupCardItem( 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) @@ -21,7 +21,7 @@ data class FeedGroupCardItem( } } - override fun getLayout(): Int = R.layout.feed_group_list_item + override fun getLayout(): Int = R.layout.feed_group_card_item override fun bind(viewBinding: FeedGroupCardItemBinding, position: Int) { viewBinding.title.text = name diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardVerticalItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardVerticalItem.kt new file mode 100644 index 000000000..9750da7b4 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardVerticalItem.kt @@ -0,0 +1,32 @@ +package org.schabi.newpipe.local.subscription.item + +import android.view.View +import com.xwray.groupie.viewbinding.BindableItem +import org.schabi.newpipe.R +import org.schabi.newpipe.database.feed.model.FeedGroupEntity +import org.schabi.newpipe.databinding.FeedGroupCardVerticalItemBinding +import org.schabi.newpipe.local.subscription.FeedGroupIcon + +data class FeedGroupCardVerticalItem( + val groupId: Long = FeedGroupEntity.GROUP_ALL_ID, + val name: String, + val icon: FeedGroupIcon +) : BindableItem() { + constructor (feedGroupEntity: FeedGroupEntity) : this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon) + + override fun getId(): Long { + return when (groupId) { + FeedGroupEntity.GROUP_ALL_ID -> super.getId() + else -> groupId + } + } + + override fun getLayout(): Int = R.layout.feed_group_card_vertical_item + + override fun bind(viewBinding: FeedGroupCardVerticalItemBinding, position: Int) { + viewBinding.title.text = name + viewBinding.icon.setImageResource(icon.getDrawableRes()) + } + + override fun initializeViewBinding(view: View) = FeedGroupCardVerticalItemBinding.bind(view) +} diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt index 031eb9b18..a574fa01b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt @@ -4,7 +4,6 @@ import android.content.Context import android.os.Parcelable import android.view.View import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import com.xwray.groupie.GroupAdapter import com.xwray.groupie.viewbinding.BindableItem import com.xwray.groupie.viewbinding.GroupieViewHolder @@ -14,7 +13,8 @@ import org.schabi.newpipe.local.subscription.decoration.FeedGroupCarouselDecorat class FeedGroupCarouselItem( context: Context, - private val carouselAdapter: GroupAdapter> + private val carouselAdapter: GroupAdapter>, + private var listView: Int ) : BindableItem() { private val feedGroupCarouselDecoration = FeedGroupCarouselDecoration(context) @@ -36,7 +36,7 @@ class FeedGroupCarouselItem( override fun initializeViewBinding(view: View): FeedItemCarouselBinding { val viewHolder = FeedItemCarouselBinding.bind(view) - linearLayoutManager = LinearLayoutManager(view.context, RecyclerView.VERTICAL, false) + linearLayoutManager = LinearLayoutManager(view.context, listView, false) viewHolder.recyclerView.apply { layoutManager = linearLayoutManager diff --git a/app/src/main/res/layout/feed_group_list_item.xml b/app/src/main/res/layout/feed_group_card_vertical_item.xml similarity index 92% rename from app/src/main/res/layout/feed_group_list_item.xml rename to app/src/main/res/layout/feed_group_card_vertical_item.xml index c49da1eab..aadfc95a8 100644 --- a/app/src/main/res/layout/feed_group_list_item.xml +++ b/app/src/main/res/layout/feed_group_card_vertical_item.xml @@ -2,7 +2,7 @@ + From 3bfcb16f9a5929ef5ace7d34960cfe22a372bc90 Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Tue, 25 Oct 2022 00:32:21 +1100 Subject: [PATCH 22/63] Bug: SubscriptionViewModel.kt did not map values for FeedGroupCardVerticalItem in line 26 --- .../subscription/SubscriptionFragment.kt | 45 +++++-------------- 1 file changed, 12 insertions(+), 33 deletions(-) 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 659187ffa..eafa9f62c 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 @@ -78,7 +78,6 @@ class SubscriptionFragment : BaseStateFragment() { private val groupAdapter = GroupAdapter>() private val feedGroupsSection = Section() private var feedGroupsCarousel: FeedGroupCarouselItem? = null - private var feedGroupsCarouselVertical: FeedGroupCarouselItem? = feedGroupsCarousel private lateinit var feedGroupsSortMenuItem: HeaderWithMenuItem private val subscriptionsSection = Section() @@ -125,7 +124,6 @@ class SubscriptionFragment : BaseStateFragment() { super.onPause() itemsListState = binding.itemsList.layoutManager?.onSaveInstanceState() feedGroupsListState = feedGroupsCarousel?.onSaveInstanceState() - feedGroupsListVerticalState = feedGroupsCarouselVertical?.onSaveInstanceState() } override fun onDestroy() { @@ -275,6 +273,7 @@ class SubscriptionFragment : BaseStateFragment() { } feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter, RecyclerView.HORIZONTAL) + feedGroupsSortMenuItem = HeaderWithMenuItem( getString(R.string.feed_groups_header_title), R.drawable.ic_list, @@ -282,6 +281,7 @@ class SubscriptionFragment : BaseStateFragment() { listViewOnClickListener = ::changeLayout, menuItemOnClickListener = ::openReorderDialog ) + add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel))) groupAdapter.clear() groupAdapter.add(this) @@ -302,15 +302,16 @@ class SubscriptionFragment : BaseStateFragment() { private fun changeLayout() { Section().apply { - val carouselAdapter = GroupAdapter>() + val carouselAdapter2 = GroupAdapter>() - carouselAdapter.add(FeedGroupCardVerticalItem(-1, getString(R.string.all), FeedGroupIcon.RSS)) - carouselAdapter.add(feedGroupsSection) - carouselAdapter.add(FeedGroupAddItem()) // change this button later - carouselAdapter.setOnItemClickListener { item, _ -> + carouselAdapter2.add(FeedGroupCardVerticalItem(-1, getString(R.string.all), FeedGroupIcon.RSS)) + carouselAdapter2.add(feedGroupsSection) + carouselAdapter2.add(FeedGroupAddItem()) + + carouselAdapter2.setOnItemClickListener { item, _ -> listenerFeedVerticalGroups.selected(item) } - carouselAdapter.setOnItemLongClickListener { item, _ -> + carouselAdapter2.setOnItemLongClickListener { item, _ -> if (item is FeedGroupCardVerticalItem) { if (item.groupId == FeedGroupEntity.GROUP_ALL_ID) { return@setOnItemLongClickListener false @@ -319,8 +320,8 @@ class SubscriptionFragment : BaseStateFragment() { listenerFeedVerticalGroups.held(item) return@setOnItemLongClickListener true } + feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter2, RecyclerView.VERTICAL) - feedGroupsCarouselVertical = FeedGroupCarouselItem(requireContext(), carouselAdapter, RecyclerView.VERTICAL) feedGroupsSortMenuItem = HeaderWithMenuItem( getString(R.string.feed_groups_header_title), R.drawable.ic_apps, @@ -328,7 +329,7 @@ class SubscriptionFragment : BaseStateFragment() { listViewOnClickListener = ::setupInitialLayout, menuItemOnClickListener = ::openReorderDialog ) - add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarouselVertical))) + add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel))) groupAdapter.clear() groupAdapter.add(this) } @@ -343,17 +344,6 @@ class SubscriptionFragment : BaseStateFragment() { listOf(subscriptionsSection) ) ) - - // TODO: remove this - groupAdapter.spanCount = if (shouldUseGridLayout(context)) getGridSpanCountChannels(context) else 1 - binding.itemsList.layoutManager = GridLayoutManager(requireContext(), groupAdapter.spanCount).apply { - spanSizeLookup = groupAdapter.spanSizeLookup - } - binding.itemsList.adapter = groupAdapter - - viewModel = ViewModelProvider(this).get(SubscriptionViewModel::class.java) - viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(this::handleResult) } - viewModel.feedGroupsLiveData.observe(viewLifecycleOwner) { it?.let(this::handleFeedVerticalGroups) } } override fun initViews(rootView: View, savedInstanceState: Bundle?) { @@ -366,6 +356,7 @@ class SubscriptionFragment : BaseStateFragment() { } binding.itemsList.adapter = groupAdapter + //TODO: change viewModel or create another one viewModel = ViewModelProvider(this).get(SubscriptionViewModel::class.java) viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(this::handleResult) } viewModel.feedGroupsLiveData.observe(viewLifecycleOwner) { it?.let(this::handleFeedGroups) } @@ -495,18 +486,6 @@ class SubscriptionFragment : BaseStateFragment() { binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } } - private fun handleFeedVerticalGroups(groups: List) { - feedGroupsSection.update(groups) - - if (feedGroupsListState != null) { - feedGroupsCarouselVertical?.onRestoreInstanceState(feedGroupsListVerticalState) - feedGroupsListVerticalState = null - } - - feedGroupsSortMenuItem.showMenuItem = groups.size > 1 - binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } - } - // ///////////////////////////////////////////////////////////////////////// // Contract // ///////////////////////////////////////////////////////////////////////// From 1aa1a0287e47ddddaf19bcdcafcb9c3e3f3ecc8b Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Tue, 25 Oct 2022 02:01:57 +1100 Subject: [PATCH 23/63] Could toggle between list view and grid view...once. Requires bug fixing on refreshing --- .../local/subscription/SubscriptionFragment.kt | 15 ++++++++++++++- .../local/subscription/SubscriptionViewModel.kt | 13 +++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) 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 eafa9f62c..d282e58c1 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 @@ -356,10 +356,11 @@ class SubscriptionFragment : BaseStateFragment() { } binding.itemsList.adapter = groupAdapter - //TODO: change viewModel or create another one + // TODO: change viewModel or create another one viewModel = ViewModelProvider(this).get(SubscriptionViewModel::class.java) viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(this::handleResult) } viewModel.feedGroupsLiveData.observe(viewLifecycleOwner) { it?.let(this::handleFeedGroups) } + viewModel.feedGroupsVerticalLiveData.observe(viewLifecycleOwner) { it?.let(this::handleFeedGroupsVertical) } } private fun showLongTapDialog(selectedItem: ChannelInfoItem) { @@ -486,6 +487,18 @@ class SubscriptionFragment : BaseStateFragment() { binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } } + private fun handleFeedGroupsVertical(groups: List) { + feedGroupsSection.update(groups) + + if (feedGroupsListState != null) { + feedGroupsCarousel?.onRestoreInstanceState(feedGroupsListState) + feedGroupsListVerticalState = null + } + + feedGroupsSortMenuItem.showMenuItem = groups.size > 1 + binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } + } + // ///////////////////////////////////////////////////////////////////////// // Contract // ///////////////////////////////////////////////////////////////////////// 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 da009e1a0..3f378929e 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 io.reactivex.rxjava3.schedulers.Schedulers import org.schabi.newpipe.local.feed.FeedDatabaseManager import org.schabi.newpipe.local.subscription.item.ChannelItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem +import org.schabi.newpipe.local.subscription.item.FeedGroupCardVerticalItem import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT import java.util.concurrent.TimeUnit @@ -18,8 +19,10 @@ class SubscriptionViewModel(application: Application) : AndroidViewModel(applica private val mutableStateLiveData = MutableLiveData() private val mutableFeedGroupsLiveData = MutableLiveData>() + private val mutableFeedGroupsVerticalLiveData = MutableLiveData>() val stateLiveData: LiveData = mutableStateLiveData val feedGroupsLiveData: LiveData> = mutableFeedGroupsLiveData + val feedGroupsVerticalLiveData: LiveData> = mutableFeedGroupsVerticalLiveData private var feedGroupItemsDisposable = feedDatabaseManager.groups() .throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS) @@ -30,6 +33,15 @@ class SubscriptionViewModel(application: Application) : AndroidViewModel(applica { mutableStateLiveData.postValue(SubscriptionState.ErrorState(it)) } ) + private var feedGroupVerticalItemsDisposable = feedDatabaseManager.groups() + .throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS) + .map { it.map(::FeedGroupCardVerticalItem) } + .subscribeOn(Schedulers.io()) + .subscribe( + { mutableFeedGroupsVerticalLiveData.postValue(it) }, + { mutableStateLiveData.postValue(SubscriptionState.ErrorState(it)) } + ) + private var stateItemsDisposable = subscriptionManager.subscriptions() .throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS) .map { it.map { entity -> ChannelItem(entity.toChannelInfoItem(), entity.uid, ChannelItem.ItemVersion.MINI) } } @@ -43,6 +55,7 @@ class SubscriptionViewModel(application: Application) : AndroidViewModel(applica super.onCleared() stateItemsDisposable.dispose() feedGroupItemsDisposable.dispose() + feedGroupVerticalItemsDisposable.dispose() } sealed class SubscriptionState { From 6eddaa0d38d4c49136f3e3572e9555364884a209 Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Tue, 25 Oct 2022 02:20:14 +1100 Subject: [PATCH 24/63] Added boolean to handle feed groups. May need a better solution for this --- .../subscription/SubscriptionFragment.kt | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) 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 d282e58c1..667243c83 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 @@ -80,6 +80,7 @@ class SubscriptionFragment : BaseStateFragment() { private var feedGroupsCarousel: FeedGroupCarouselItem? = null private lateinit var feedGroupsSortMenuItem: HeaderWithMenuItem private val subscriptionsSection = Section() + private var listView: Boolean = false private val requestExportLauncher = registerForActivityResult(StartActivityForResult(), this::requestExportResult) @@ -124,6 +125,7 @@ class SubscriptionFragment : BaseStateFragment() { super.onPause() itemsListState = binding.itemsList.layoutManager?.onSaveInstanceState() feedGroupsListState = feedGroupsCarousel?.onSaveInstanceState() + feedGroupsListVerticalState = feedGroupsCarousel?.onSaveInstanceState() } override fun onDestroy() { @@ -252,6 +254,7 @@ class SubscriptionFragment : BaseStateFragment() { // //////////////////////////////////////////////////////////////////////// private fun setupInitialLayout() { + listView = false Section().apply { val carouselAdapter = GroupAdapter>() @@ -301,6 +304,7 @@ class SubscriptionFragment : BaseStateFragment() { } private fun changeLayout() { + listView = true Section().apply { val carouselAdapter2 = GroupAdapter>() @@ -476,27 +480,31 @@ class SubscriptionFragment : BaseStateFragment() { } private fun handleFeedGroups(groups: List) { - feedGroupsSection.update(groups) + if (!listView) { + feedGroupsSection.update(groups) - if (feedGroupsListState != null) { - feedGroupsCarousel?.onRestoreInstanceState(feedGroupsListState) - feedGroupsListState = null + if (feedGroupsListState != null) { + feedGroupsCarousel?.onRestoreInstanceState(feedGroupsListState) + feedGroupsListState = null + } + + feedGroupsSortMenuItem.showMenuItem = groups.size > 1 + binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } } - - feedGroupsSortMenuItem.showMenuItem = groups.size > 1 - binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } } private fun handleFeedGroupsVertical(groups: List) { - feedGroupsSection.update(groups) + if (listView) { + feedGroupsSection.update(groups) - if (feedGroupsListState != null) { - feedGroupsCarousel?.onRestoreInstanceState(feedGroupsListState) - feedGroupsListVerticalState = null + if (feedGroupsListVerticalState != null) { + feedGroupsCarousel?.onRestoreInstanceState(feedGroupsListVerticalState) + feedGroupsListVerticalState = null + } + + feedGroupsSortMenuItem.showMenuItem = groups.size > 1 + binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } } - - feedGroupsSortMenuItem.showMenuItem = groups.size > 1 - binding.itemsList.post { feedGroupsSortMenuItem.notifyChanged(PAYLOAD_UPDATE_VISIBILITY_MENU_ITEM) } } // ///////////////////////////////////////////////////////////////////////// From 082d7a3f187c46ab5a69412701934e2b2247f782 Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Tue, 25 Oct 2022 02:38:31 +1100 Subject: [PATCH 25/63] Added working binding for a "new" button that works in the list layout. --- .../subscription/SubscriptionFragment.kt | 18 ++++---- .../item/FeedGroupAddItemVertical.kt | 12 +++++ .../feed_group_add_new_item_vertical.xml | 45 +++++++++++++++++++ 3 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddItemVertical.kt create mode 100644 app/src/main/res/layout/feed_group_add_new_item_vertical.xml 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 667243c83..84e63554f 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 @@ -45,6 +45,7 @@ import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialog import org.schabi.newpipe.local.subscription.item.ChannelItem import org.schabi.newpipe.local.subscription.item.EmptyPlaceholderItem import org.schabi.newpipe.local.subscription.item.FeedGroupAddItem +import org.schabi.newpipe.local.subscription.item.FeedGroupAddItemVertical import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardVerticalItem import org.schabi.newpipe.local.subscription.item.FeedGroupCarouselItem @@ -306,16 +307,16 @@ class SubscriptionFragment : BaseStateFragment() { private fun changeLayout() { listView = true Section().apply { - val carouselAdapter2 = GroupAdapter>() + val carouselAdapter = GroupAdapter>() - carouselAdapter2.add(FeedGroupCardVerticalItem(-1, getString(R.string.all), FeedGroupIcon.RSS)) - carouselAdapter2.add(feedGroupsSection) - carouselAdapter2.add(FeedGroupAddItem()) + carouselAdapter.add(FeedGroupCardVerticalItem(-1, getString(R.string.all), FeedGroupIcon.RSS)) + carouselAdapter.add(feedGroupsSection) + carouselAdapter.add(FeedGroupAddItemVertical()) - carouselAdapter2.setOnItemClickListener { item, _ -> + carouselAdapter.setOnItemClickListener { item, _ -> listenerFeedVerticalGroups.selected(item) } - carouselAdapter2.setOnItemLongClickListener { item, _ -> + carouselAdapter.setOnItemLongClickListener { item, _ -> if (item is FeedGroupCardVerticalItem) { if (item.groupId == FeedGroupEntity.GROUP_ALL_ID) { return@setOnItemLongClickListener false @@ -324,7 +325,7 @@ class SubscriptionFragment : BaseStateFragment() { listenerFeedVerticalGroups.held(item) return@setOnItemLongClickListener true } - feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter2, RecyclerView.VERTICAL) + feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter, RecyclerView.VERTICAL) feedGroupsSortMenuItem = HeaderWithMenuItem( getString(R.string.feed_groups_header_title), @@ -360,7 +361,6 @@ class SubscriptionFragment : BaseStateFragment() { } binding.itemsList.adapter = groupAdapter - // TODO: change viewModel or create another one viewModel = ViewModelProvider(this).get(SubscriptionViewModel::class.java) viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(this::handleResult) } viewModel.feedGroupsLiveData.observe(viewLifecycleOwner) { it?.let(this::handleFeedGroups) } @@ -427,7 +427,7 @@ class SubscriptionFragment : BaseStateFragment() { override fun selected(selectedItem: Item<*>?) { when (selectedItem) { is FeedGroupCardVerticalItem -> NavigationHelper.openFeedFragment(fm, selectedItem.groupId, selectedItem.name) - is FeedGroupAddItem -> FeedGroupDialog.newInstance().show(fm, null) + is FeedGroupAddItemVertical -> FeedGroupDialog.newInstance().show(fm, null) } } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddItemVertical.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddItemVertical.kt new file mode 100644 index 000000000..deb126219 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddItemVertical.kt @@ -0,0 +1,12 @@ +package org.schabi.newpipe.local.subscription.item + +import android.view.View +import com.xwray.groupie.viewbinding.BindableItem +import org.schabi.newpipe.R +import org.schabi.newpipe.databinding.FeedGroupAddNewItemVerticalBinding + +class FeedGroupAddItemVertical : BindableItem() { + override fun getLayout(): Int = R.layout.feed_group_add_new_item_vertical + override fun bind(viewBinding: FeedGroupAddNewItemVerticalBinding, position: Int) {} + override fun initializeViewBinding(view: View) = FeedGroupAddNewItemVerticalBinding.bind(view) +} diff --git a/app/src/main/res/layout/feed_group_add_new_item_vertical.xml b/app/src/main/res/layout/feed_group_add_new_item_vertical.xml new file mode 100644 index 000000000..43427f291 --- /dev/null +++ b/app/src/main/res/layout/feed_group_add_new_item_vertical.xml @@ -0,0 +1,45 @@ + + + + + + + + + + From ed68e3bd46dafbc36952f22b776d50de5076b238 Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Tue, 25 Oct 2022 10:54:27 +1100 Subject: [PATCH 26/63] Fully working toggle button that change between vertical and horizontal view --- .../subscription/SubscriptionFragment.kt | 30 +++++++++++-------- ...ertical.kt => FeedGroupAddVerticalItem.kt} | 2 +- 2 files changed, 18 insertions(+), 14 deletions(-) rename app/src/main/java/org/schabi/newpipe/local/subscription/item/{FeedGroupAddItemVertical.kt => FeedGroupAddVerticalItem.kt} (89%) 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 84e63554f..89d394a4a 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 @@ -45,7 +45,7 @@ import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialog import org.schabi.newpipe.local.subscription.item.ChannelItem import org.schabi.newpipe.local.subscription.item.EmptyPlaceholderItem import org.schabi.newpipe.local.subscription.item.FeedGroupAddItem -import org.schabi.newpipe.local.subscription.item.FeedGroupAddItemVertical +import org.schabi.newpipe.local.subscription.item.FeedGroupAddVerticalItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardVerticalItem import org.schabi.newpipe.local.subscription.item.FeedGroupCarouselItem @@ -78,10 +78,12 @@ class SubscriptionFragment : BaseStateFragment() { private val groupAdapter = GroupAdapter>() private val feedGroupsSection = Section() + private val feedGroupsVerticalSection = Section() private var feedGroupsCarousel: FeedGroupCarouselItem? = null + private var feedGroupsVerticalCarousel: FeedGroupCarouselItem? = null private lateinit var feedGroupsSortMenuItem: HeaderWithMenuItem private val subscriptionsSection = Section() - private var listView: Boolean = false + private var defaultListView: Boolean = true private val requestExportLauncher = registerForActivityResult(StartActivityForResult(), this::requestExportResult) @@ -255,7 +257,7 @@ class SubscriptionFragment : BaseStateFragment() { // //////////////////////////////////////////////////////////////////////// private fun setupInitialLayout() { - listView = false + defaultListView = true Section().apply { val carouselAdapter = GroupAdapter>() @@ -302,16 +304,17 @@ class SubscriptionFragment : BaseStateFragment() { listOf(subscriptionsSection) ) ) + view?.let { initViews(it, savedInstanceState = Bundle()) } } private fun changeLayout() { - listView = true + defaultListView = false Section().apply { val carouselAdapter = GroupAdapter>() carouselAdapter.add(FeedGroupCardVerticalItem(-1, getString(R.string.all), FeedGroupIcon.RSS)) - carouselAdapter.add(feedGroupsSection) - carouselAdapter.add(FeedGroupAddItemVertical()) + carouselAdapter.add(feedGroupsVerticalSection) + carouselAdapter.add(FeedGroupAddVerticalItem()) carouselAdapter.setOnItemClickListener { item, _ -> listenerFeedVerticalGroups.selected(item) @@ -325,7 +328,7 @@ class SubscriptionFragment : BaseStateFragment() { listenerFeedVerticalGroups.held(item) return@setOnItemLongClickListener true } - feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter, RecyclerView.VERTICAL) + feedGroupsVerticalCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter, RecyclerView.VERTICAL) feedGroupsSortMenuItem = HeaderWithMenuItem( getString(R.string.feed_groups_header_title), @@ -334,7 +337,7 @@ class SubscriptionFragment : BaseStateFragment() { listViewOnClickListener = ::setupInitialLayout, menuItemOnClickListener = ::openReorderDialog ) - add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel))) + add(Section(feedGroupsSortMenuItem, listOf(feedGroupsVerticalCarousel))) groupAdapter.clear() groupAdapter.add(this) } @@ -349,6 +352,7 @@ class SubscriptionFragment : BaseStateFragment() { listOf(subscriptionsSection) ) ) + view?.let { initViews(it, savedInstanceState = Bundle()) } } override fun initViews(rootView: View, savedInstanceState: Bundle?) { @@ -427,7 +431,7 @@ class SubscriptionFragment : BaseStateFragment() { override fun selected(selectedItem: Item<*>?) { when (selectedItem) { is FeedGroupCardVerticalItem -> NavigationHelper.openFeedFragment(fm, selectedItem.groupId, selectedItem.name) - is FeedGroupAddItemVertical -> FeedGroupDialog.newInstance().show(fm, null) + is FeedGroupAddVerticalItem -> FeedGroupDialog.newInstance().show(fm, null) } } @@ -480,7 +484,7 @@ class SubscriptionFragment : BaseStateFragment() { } private fun handleFeedGroups(groups: List) { - if (!listView) { + if (defaultListView) { feedGroupsSection.update(groups) if (feedGroupsListState != null) { @@ -494,11 +498,11 @@ class SubscriptionFragment : BaseStateFragment() { } private fun handleFeedGroupsVertical(groups: List) { - if (listView) { - feedGroupsSection.update(groups) + if (!defaultListView) { + feedGroupsVerticalSection.update(groups) if (feedGroupsListVerticalState != null) { - feedGroupsCarousel?.onRestoreInstanceState(feedGroupsListVerticalState) + feedGroupsVerticalCarousel?.onRestoreInstanceState(feedGroupsListVerticalState) feedGroupsListVerticalState = null } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddItemVertical.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddVerticalItem.kt similarity index 89% rename from app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddItemVertical.kt rename to app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddVerticalItem.kt index deb126219..eae8bd5f2 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddItemVertical.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddVerticalItem.kt @@ -5,7 +5,7 @@ import com.xwray.groupie.viewbinding.BindableItem import org.schabi.newpipe.R import org.schabi.newpipe.databinding.FeedGroupAddNewItemVerticalBinding -class FeedGroupAddItemVertical : BindableItem() { +class FeedGroupAddVerticalItem : BindableItem() { override fun getLayout(): Int = R.layout.feed_group_add_new_item_vertical override fun bind(viewBinding: FeedGroupAddNewItemVerticalBinding, position: Int) {} override fun initializeViewBinding(view: View) = FeedGroupAddNewItemVerticalBinding.bind(view) From 28464344c14425ebfdc80c653c48a8a4380f6dfe Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Tue, 25 Oct 2022 11:43:25 +1100 Subject: [PATCH 27/63] Finalized design for vertical card view and removed unneeded variables in SubscriptionFragment.kt --- .../local/subscription/SubscriptionFragment.kt | 16 +++++++--------- .../item/FeedGroupAddVerticalItem.kt | 10 +++++----- ....xml => feed_group_add_new_vertical_item.xml} | 0 .../res/layout/feed_group_card_vertical_item.xml | 13 +++++++------ app/src/main/res/values/dimens.xml | 2 +- 5 files changed, 20 insertions(+), 21 deletions(-) rename app/src/main/res/layout/{feed_group_add_new_item_vertical.xml => feed_group_add_new_vertical_item.xml} (100%) 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 89d394a4a..348dd5897 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 @@ -78,9 +78,7 @@ class SubscriptionFragment : BaseStateFragment() { private val groupAdapter = GroupAdapter>() private val feedGroupsSection = Section() - private val feedGroupsVerticalSection = Section() private var feedGroupsCarousel: FeedGroupCarouselItem? = null - private var feedGroupsVerticalCarousel: FeedGroupCarouselItem? = null private lateinit var feedGroupsSortMenuItem: HeaderWithMenuItem private val subscriptionsSection = Section() private var defaultListView: Boolean = true @@ -284,7 +282,7 @@ class SubscriptionFragment : BaseStateFragment() { getString(R.string.feed_groups_header_title), R.drawable.ic_list, R.drawable.ic_sort, - listViewOnClickListener = ::changeLayout, + listViewOnClickListener = ::changeVerticalLayout, menuItemOnClickListener = ::openReorderDialog ) @@ -307,13 +305,13 @@ class SubscriptionFragment : BaseStateFragment() { view?.let { initViews(it, savedInstanceState = Bundle()) } } - private fun changeLayout() { + private fun changeVerticalLayout() { defaultListView = false Section().apply { val carouselAdapter = GroupAdapter>() carouselAdapter.add(FeedGroupCardVerticalItem(-1, getString(R.string.all), FeedGroupIcon.RSS)) - carouselAdapter.add(feedGroupsVerticalSection) + carouselAdapter.add(feedGroupsSection) carouselAdapter.add(FeedGroupAddVerticalItem()) carouselAdapter.setOnItemClickListener { item, _ -> @@ -328,7 +326,7 @@ class SubscriptionFragment : BaseStateFragment() { listenerFeedVerticalGroups.held(item) return@setOnItemLongClickListener true } - feedGroupsVerticalCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter, RecyclerView.VERTICAL) + feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter, RecyclerView.VERTICAL) feedGroupsSortMenuItem = HeaderWithMenuItem( getString(R.string.feed_groups_header_title), @@ -337,7 +335,7 @@ class SubscriptionFragment : BaseStateFragment() { listViewOnClickListener = ::setupInitialLayout, menuItemOnClickListener = ::openReorderDialog ) - add(Section(feedGroupsSortMenuItem, listOf(feedGroupsVerticalCarousel))) + add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel))) groupAdapter.clear() groupAdapter.add(this) } @@ -499,10 +497,10 @@ class SubscriptionFragment : BaseStateFragment() { private fun handleFeedGroupsVertical(groups: List) { if (!defaultListView) { - feedGroupsVerticalSection.update(groups) + feedGroupsSection.update(groups) if (feedGroupsListVerticalState != null) { - feedGroupsVerticalCarousel?.onRestoreInstanceState(feedGroupsListVerticalState) + feedGroupsCarousel?.onRestoreInstanceState(feedGroupsListVerticalState) feedGroupsListVerticalState = null } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddVerticalItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddVerticalItem.kt index eae8bd5f2..049728591 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddVerticalItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddVerticalItem.kt @@ -3,10 +3,10 @@ package org.schabi.newpipe.local.subscription.item import android.view.View import com.xwray.groupie.viewbinding.BindableItem import org.schabi.newpipe.R -import org.schabi.newpipe.databinding.FeedGroupAddNewItemVerticalBinding +import org.schabi.newpipe.databinding.FeedGroupAddNewVerticalItemBinding -class FeedGroupAddVerticalItem : BindableItem() { - override fun getLayout(): Int = R.layout.feed_group_add_new_item_vertical - override fun bind(viewBinding: FeedGroupAddNewItemVerticalBinding, position: Int) {} - override fun initializeViewBinding(view: View) = FeedGroupAddNewItemVerticalBinding.bind(view) +class FeedGroupAddVerticalItem : BindableItem() { + override fun getLayout(): Int = R.layout.feed_group_add_new_vertical_item + override fun bind(viewBinding: FeedGroupAddNewVerticalItemBinding, position: Int) {} + override fun initializeViewBinding(view: View) = FeedGroupAddNewVerticalItemBinding.bind(view) } diff --git a/app/src/main/res/layout/feed_group_add_new_item_vertical.xml b/app/src/main/res/layout/feed_group_add_new_vertical_item.xml similarity index 100% rename from app/src/main/res/layout/feed_group_add_new_item_vertical.xml rename to app/src/main/res/layout/feed_group_add_new_vertical_item.xml diff --git a/app/src/main/res/layout/feed_group_card_vertical_item.xml b/app/src/main/res/layout/feed_group_card_vertical_item.xml index aadfc95a8..2924483c2 100644 --- a/app/src/main/res/layout/feed_group_card_vertical_item.xml +++ b/app/src/main/res/layout/feed_group_card_vertical_item.xml @@ -17,10 +17,10 @@ diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 419b3ca43..86bf9da5b 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -125,7 +125,7 @@ 12dp - 2dp + 4dp 4dp 16sp From c607089cbb7f2345594115875968f4bbff912cc5 Mon Sep 17 00:00:00 2001 From: Samuel Wu Date: Wed, 26 Oct 2022 00:06:48 +1100 Subject: [PATCH 28/63] Altered grid view similar to Youtube app layout --- .../local/subscription/item/FeedGroupCarouselItem.kt | 3 ++- app/src/main/res/layout/feed_group_card_item.xml | 10 ++++++---- app/src/main/res/values/dimens.xml | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt index a574fa01b..01f058913 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt @@ -3,6 +3,7 @@ package org.schabi.newpipe.local.subscription.item import android.content.Context import android.os.Parcelable import android.view.View +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import com.xwray.groupie.GroupAdapter import com.xwray.groupie.viewbinding.BindableItem @@ -43,7 +44,7 @@ class FeedGroupCarouselItem( adapter = carouselAdapter addItemDecoration(feedGroupCarouselDecoration) } - + viewHolder.recyclerView.setLayoutManager(GridLayoutManager(view.context, 3)) return viewHolder } diff --git a/app/src/main/res/layout/feed_group_card_item.xml b/app/src/main/res/layout/feed_group_card_item.xml index e57a8167f..5e87216cb 100644 --- a/app/src/main/res/layout/feed_group_card_item.xml +++ b/app/src/main/res/layout/feed_group_card_item.xml @@ -2,9 +2,9 @@ @@ -39,7 +41,7 @@ android:padding="2dp" android:textAllCaps="false" android:textColor="?attr/colorAccent" - android:textSize="10sp" + android:textSize="14sp" android:textStyle="bold" tools:ignore="SmallSp" tools:text="ALL" /> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 86bf9da5b..ad0e029dd 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -125,7 +125,7 @@ 12dp - 4dp + 12dp 4dp 16sp From 16860603fd77e016f5217a60e4ab86c2eac0eb81 Mon Sep 17 00:00:00 2001 From: Yuuu2990 <110877395+Yuuu2990@users.noreply.github.com> Date: Wed, 26 Oct 2022 18:59:51 +1100 Subject: [PATCH 29/63] Add Link to FAQ in the app (#9164) * Link to FAQ in the app #4447 * remove redundant comments produced by me. * Update app/src/main/res/values/strings.xml Update FAQ description Co-authored-by: opusforlife2 <53176348+opusforlife2@users.noreply.github.com> * Format the CodeStyle and readjust the layout. * Update app/src/main/res/layout/fragment_about.xml Remove redundant id. Co-authored-by: Stypox * Update app/src/main/res/layout/fragment_about.xml Remove redundant id. Co-authored-by: Stypox * Update app/src/main/res/values/strings.xml Keep the uppercase for consistency. Co-authored-by: Stypox * Update app/src/main/res/values/strings.xml Modify the description of FAQ. Co-authored-by: Stypox Co-authored-by: opusforlife2 <53176348+opusforlife2@users.noreply.github.com> Co-authored-by: Stypox --- .../org/schabi/newpipe/about/AboutActivity.kt | 1 + app/src/main/res/layout/fragment_about.xml | 20 +++++++++++++++++++ app/src/main/res/values/donottranslate.xml | 1 + app/src/main/res/values/strings.xml | 5 ++++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index 50a3984e3..c1eec1526 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -78,6 +78,7 @@ class AboutActivity : AppCompatActivity() { aboutDonationLink.openLink(R.string.donation_url) aboutWebsiteLink.openLink(R.string.website_url) aboutPrivacyPolicyLink.openLink(R.string.privacy_policy_url) + faqLink.openLink(R.string.faq_url) return root } } diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml index 1807acb10..5e6e11d00 100644 --- a/app/src/main/res/layout/fragment_about.xml +++ b/app/src/main/res/layout/fragment_about.xml @@ -44,6 +44,26 @@ android:paddingBottom="5dp" android:text="@string/app_description" /> + + + + +