mirror of
https://github.com/TeamNewPipe/NewPipe.git
synced 2024-11-24 20:15:16 +01:00
Merge pull request #11238 from Isira-Seneviratne/Coil
Migrate image loading from Picasso to Coil
This commit is contained in:
commit
d336f4cef2
@ -203,7 +203,7 @@ dependencies {
|
||||
// name and the commit hash with the commit hash of the (pushed) commit you want to test
|
||||
// This works thanks to JitPack: https://jitpack.io/
|
||||
implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751'
|
||||
implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.24.0'
|
||||
implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.24.1'
|
||||
implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0'
|
||||
|
||||
/** Checkstyle **/
|
||||
@ -267,8 +267,7 @@ dependencies {
|
||||
implementation "com.github.lisawray.groupie:groupie-viewbinding:${groupieVersion}"
|
||||
|
||||
// Image loading
|
||||
//noinspection GradleDependency --> 2.8 is the last version, not 2.71828!
|
||||
implementation "com.squareup.picasso:picasso:2.8"
|
||||
implementation 'io.coil-kt:coil:2.7.0'
|
||||
|
||||
// Markdown library for Android
|
||||
implementation "io.noties.markwon:core:${markwonVersion}"
|
||||
|
@ -1,5 +1,6 @@
|
||||
package org.schabi.newpipe;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
@ -8,6 +9,7 @@ import android.util.Log;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.app.NotificationChannelCompat;
|
||||
import androidx.core.app.NotificationManagerCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
import com.jakewharton.processphoenix.ProcessPhoenix;
|
||||
@ -20,10 +22,9 @@ import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||
import org.schabi.newpipe.ktx.ExceptionUtils;
|
||||
import org.schabi.newpipe.settings.NewPipeSettings;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.image.ImageStrategy;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.ServiceHelper;
|
||||
import org.schabi.newpipe.util.StateSaver;
|
||||
import org.schabi.newpipe.util.image.ImageStrategy;
|
||||
import org.schabi.newpipe.util.image.PreferredImageQuality;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -32,6 +33,9 @@ import java.net.SocketException;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import coil.ImageLoader;
|
||||
import coil.ImageLoaderFactory;
|
||||
import coil.util.DebugLogger;
|
||||
import io.reactivex.rxjava3.exceptions.CompositeException;
|
||||
import io.reactivex.rxjava3.exceptions.MissingBackpressureException;
|
||||
import io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException;
|
||||
@ -57,7 +61,7 @@ import io.reactivex.rxjava3.plugins.RxJavaPlugins;
|
||||
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
public class App extends Application {
|
||||
public class App extends Application implements ImageLoaderFactory {
|
||||
public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID;
|
||||
private static final String TAG = App.class.toString();
|
||||
|
||||
@ -108,20 +112,22 @@ public class App extends Application {
|
||||
|
||||
// Initialize image loader
|
||||
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
PicassoHelper.init(this);
|
||||
ImageStrategy.setPreferredImageQuality(PreferredImageQuality.fromPreferenceKey(this,
|
||||
prefs.getString(getString(R.string.image_quality_key),
|
||||
getString(R.string.image_quality_default))));
|
||||
PicassoHelper.setIndicatorsEnabled(MainActivity.DEBUG
|
||||
&& prefs.getBoolean(getString(R.string.show_image_indicators_key), false));
|
||||
|
||||
configureRxJavaErrorHandler();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public void onTerminate() {
|
||||
super.onTerminate();
|
||||
PicassoHelper.terminate();
|
||||
public ImageLoader newImageLoader() {
|
||||
return new ImageLoader.Builder(this)
|
||||
.allowRgb565(ContextCompat.getSystemService(this, ActivityManager.class)
|
||||
.isLowRamDevice())
|
||||
.logger(BuildConfig.DEBUG ? new DebugLogger() : null)
|
||||
.crossfade(true)
|
||||
.build();
|
||||
}
|
||||
|
||||
protected Downloader getDownloader() {
|
||||
|
@ -167,8 +167,8 @@ class AboutActivity : AppCompatActivity() {
|
||||
"https://square.github.io/okhttp/", StandardLicenses.APACHE2
|
||||
),
|
||||
SoftwareComponent(
|
||||
"Picasso", "2013", "Square, Inc.",
|
||||
"https://square.github.io/picasso/", StandardLicenses.APACHE2
|
||||
"Coil", "2023", "Coil Contributors",
|
||||
"https://coil-kt.github.io/coil/", StandardLicenses.APACHE2
|
||||
),
|
||||
SoftwareComponent(
|
||||
"PrettyTime", "2012 - 2020", "Lincoln Baxter, III",
|
||||
|
@ -116,7 +116,7 @@ import org.schabi.newpipe.util.StreamTypeUtil;
|
||||
import org.schabi.newpipe.util.ThemeHelper;
|
||||
import org.schabi.newpipe.util.external_communication.KoreUtils;
|
||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
@ -127,6 +127,7 @@ import java.util.Optional;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import coil.util.CoilUtils;
|
||||
import icepick.State;
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.disposables.CompositeDisposable;
|
||||
@ -159,8 +160,6 @@ public final class VideoDetailFragment
|
||||
private static final String DESCRIPTION_TAB_TAG = "DESCRIPTION TAB";
|
||||
private static final String EMPTY_TAB_TAG = "EMPTY TAB";
|
||||
|
||||
private static final String PICASSO_VIDEO_DETAILS_TAG = "PICASSO_VIDEO_DETAILS_TAG";
|
||||
|
||||
// tabs
|
||||
private boolean showComments;
|
||||
private boolean showRelatedItems;
|
||||
@ -1471,7 +1470,11 @@ public final class VideoDetailFragment
|
||||
}
|
||||
}
|
||||
|
||||
PicassoHelper.cancelTag(PICASSO_VIDEO_DETAILS_TAG);
|
||||
CoilUtils.dispose(binding.detailThumbnailImageView);
|
||||
CoilUtils.dispose(binding.detailSubChannelThumbnailView);
|
||||
CoilUtils.dispose(binding.overlayThumbnail);
|
||||
CoilUtils.dispose(binding.detailUploaderThumbnailView);
|
||||
|
||||
binding.detailThumbnailImageView.setImageBitmap(null);
|
||||
binding.detailSubChannelThumbnailView.setImageBitmap(null);
|
||||
}
|
||||
@ -1562,8 +1565,8 @@ public final class VideoDetailFragment
|
||||
binding.detailSecondaryControlPanel.setVisibility(View.GONE);
|
||||
|
||||
checkUpdateProgressInfo(info);
|
||||
PicassoHelper.loadDetailsThumbnail(info.getThumbnails()).tag(PICASSO_VIDEO_DETAILS_TAG)
|
||||
.into(binding.detailThumbnailImageView);
|
||||
CoilHelper.INSTANCE.loadDetailsThumbnail(binding.detailThumbnailImageView,
|
||||
info.getThumbnails());
|
||||
showMetaInfoInTextView(info.getMetaInfo(), binding.detailMetaInfoTextView,
|
||||
binding.detailMetaInfoSeparator, disposables);
|
||||
|
||||
@ -1613,8 +1616,8 @@ public final class VideoDetailFragment
|
||||
binding.detailUploaderTextView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
PicassoHelper.loadAvatar(info.getUploaderAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG)
|
||||
.into(binding.detailSubChannelThumbnailView);
|
||||
CoilHelper.INSTANCE.loadAvatar(binding.detailSubChannelThumbnailView,
|
||||
info.getUploaderAvatars());
|
||||
binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE);
|
||||
binding.detailUploaderThumbnailView.setVisibility(View.GONE);
|
||||
}
|
||||
@ -1645,11 +1648,11 @@ public final class VideoDetailFragment
|
||||
binding.detailUploaderTextView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
PicassoHelper.loadAvatar(info.getSubChannelAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG)
|
||||
.into(binding.detailSubChannelThumbnailView);
|
||||
CoilHelper.INSTANCE.loadAvatar(binding.detailSubChannelThumbnailView,
|
||||
info.getSubChannelAvatars());
|
||||
binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE);
|
||||
PicassoHelper.loadAvatar(info.getUploaderAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG)
|
||||
.into(binding.detailUploaderThumbnailView);
|
||||
CoilHelper.INSTANCE.loadAvatar(binding.detailUploaderThumbnailView,
|
||||
info.getUploaderAvatars());
|
||||
binding.detailUploaderThumbnailView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@ -2403,8 +2406,7 @@ public final class VideoDetailFragment
|
||||
binding.overlayTitleTextView.setText(isEmpty(overlayTitle) ? "" : overlayTitle);
|
||||
binding.overlayChannelTextView.setText(isEmpty(uploader) ? "" : uploader);
|
||||
binding.overlayThumbnail.setImageDrawable(null);
|
||||
PicassoHelper.loadDetailsThumbnail(thumbnails).tag(PICASSO_VIDEO_DETAILS_TAG)
|
||||
.into(binding.overlayThumbnail);
|
||||
CoilHelper.INSTANCE.loadDetailsThumbnail(binding.overlayThumbnail, thumbnails);
|
||||
}
|
||||
|
||||
private void setOverlayPlayPauseImage(final boolean playerIsPlaying) {
|
||||
|
@ -50,15 +50,16 @@ import org.schabi.newpipe.util.ExtractorHelper;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.StateSaver;
|
||||
import org.schabi.newpipe.util.image.ImageStrategy;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.ThemeHelper;
|
||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
import org.schabi.newpipe.util.image.ImageStrategy;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import coil.util.CoilUtils;
|
||||
import icepick.State;
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
@ -73,7 +74,6 @@ public class ChannelFragment extends BaseStateFragment<ChannelInfo>
|
||||
implements StateSaver.WriteRead {
|
||||
|
||||
private static final int BUTTON_DEBOUNCE_INTERVAL = 100;
|
||||
private static final String PICASSO_CHANNEL_TAG = "PICASSO_CHANNEL_TAG";
|
||||
|
||||
@State
|
||||
protected int serviceId = Constants.NO_SERVICE_ID;
|
||||
@ -576,7 +576,9 @@ public class ChannelFragment extends BaseStateFragment<ChannelInfo>
|
||||
@Override
|
||||
public void showLoading() {
|
||||
super.showLoading();
|
||||
PicassoHelper.cancelTag(PICASSO_CHANNEL_TAG);
|
||||
CoilUtils.dispose(binding.channelAvatarView);
|
||||
CoilUtils.dispose(binding.channelBannerImage);
|
||||
CoilUtils.dispose(binding.subChannelAvatarView);
|
||||
animate(binding.channelSubscribeButton, false, 100);
|
||||
}
|
||||
|
||||
@ -587,17 +589,15 @@ public class ChannelFragment extends BaseStateFragment<ChannelInfo>
|
||||
setInitialData(result.getServiceId(), result.getOriginalUrl(), result.getName());
|
||||
|
||||
if (ImageStrategy.shouldLoadImages() && !result.getBanners().isEmpty()) {
|
||||
PicassoHelper.loadBanner(result.getBanners()).tag(PICASSO_CHANNEL_TAG)
|
||||
.into(binding.channelBannerImage);
|
||||
CoilHelper.INSTANCE.loadBanner(binding.channelBannerImage, result.getBanners());
|
||||
} else {
|
||||
// do not waste space for the banner, if the user disabled images or there is not one
|
||||
binding.channelBannerImage.setImageDrawable(null);
|
||||
}
|
||||
|
||||
PicassoHelper.loadAvatar(result.getAvatars()).tag(PICASSO_CHANNEL_TAG)
|
||||
.into(binding.channelAvatarView);
|
||||
PicassoHelper.loadAvatar(result.getParentChannelAvatars()).tag(PICASSO_CHANNEL_TAG)
|
||||
.into(binding.subChannelAvatarView);
|
||||
CoilHelper.INSTANCE.loadAvatar(binding.channelAvatarView, result.getAvatars());
|
||||
CoilHelper.INSTANCE.loadAvatar(binding.subChannelAvatarView,
|
||||
result.getParentChannelAvatars());
|
||||
|
||||
binding.channelTitleView.setText(result.getName());
|
||||
binding.channelSubscriberView.setVisibility(View.VISIBLE);
|
||||
|
@ -23,8 +23,8 @@ import org.schabi.newpipe.util.DeviceUtils;
|
||||
import org.schabi.newpipe.util.ExtractorHelper;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
import org.schabi.newpipe.util.image.ImageStrategy;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.text.TextLinkifier;
|
||||
|
||||
import java.util.Queue;
|
||||
@ -82,7 +82,7 @@ public final class CommentRepliesFragment
|
||||
final CommentsInfoItem item = commentsInfoItem;
|
||||
|
||||
// load the author avatar
|
||||
PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(binding.authorAvatar);
|
||||
CoilHelper.INSTANCE.loadAvatar(binding.authorAvatar, item.getUploaderAvatars());
|
||||
binding.authorAvatar.setVisibility(ImageStrategy.shouldLoadImages()
|
||||
? View.VISIBLE : View.GONE);
|
||||
|
||||
|
@ -53,7 +53,7 @@ import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.PlayButtonHelper;
|
||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
import org.schabi.newpipe.util.text.TextEllipsizer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -62,6 +62,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import coil.util.CoilUtils;
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.core.Flowable;
|
||||
import io.reactivex.rxjava3.core.Single;
|
||||
@ -71,8 +72,6 @@ import io.reactivex.rxjava3.disposables.Disposable;
|
||||
public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, PlaylistInfo>
|
||||
implements PlaylistControlViewHolder {
|
||||
|
||||
private static final String PICASSO_PLAYLIST_TAG = "PICASSO_PLAYLIST_TAG";
|
||||
|
||||
private CompositeDisposable disposables;
|
||||
private Subscription bookmarkReactor;
|
||||
private AtomicBoolean isBookmarkButtonReady;
|
||||
@ -276,7 +275,7 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
|
||||
animate(headerBinding.getRoot(), false, 200);
|
||||
animateHideRecyclerViewAllowingScrolling(itemsList);
|
||||
|
||||
PicassoHelper.cancelTag(PICASSO_PLAYLIST_TAG);
|
||||
CoilUtils.dispose(headerBinding.uploaderAvatarView);
|
||||
animate(headerBinding.uploaderLayout, false, 200);
|
||||
}
|
||||
|
||||
@ -327,8 +326,8 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
|
||||
R.drawable.ic_radio)
|
||||
);
|
||||
} else {
|
||||
PicassoHelper.loadAvatar(result.getUploaderAvatars()).tag(PICASSO_PLAYLIST_TAG)
|
||||
.into(headerBinding.uploaderAvatarView);
|
||||
CoilHelper.INSTANCE.loadAvatar(headerBinding.uploaderAvatarView,
|
||||
result.getUploaderAvatars());
|
||||
}
|
||||
|
||||
streamCount = result.getStreamCount();
|
||||
|
@ -1,19 +1,18 @@
|
||||
package org.schabi.newpipe.info_list
|
||||
|
||||
import android.view.View
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import com.xwray.groupie.GroupieViewHolder
|
||||
import com.xwray.groupie.Item
|
||||
import com.xwray.groupie.viewbinding.BindableItem
|
||||
import com.xwray.groupie.viewbinding.GroupieViewHolder
|
||||
import org.schabi.newpipe.R
|
||||
import org.schabi.newpipe.databinding.ItemStreamSegmentBinding
|
||||
import org.schabi.newpipe.extractor.stream.StreamSegment
|
||||
import org.schabi.newpipe.util.Localization
|
||||
import org.schabi.newpipe.util.image.PicassoHelper
|
||||
import org.schabi.newpipe.util.image.CoilHelper
|
||||
|
||||
class StreamSegmentItem(
|
||||
private val item: StreamSegment,
|
||||
private val onClick: StreamSegmentAdapter.StreamSegmentListener
|
||||
) : Item<GroupieViewHolder>() {
|
||||
) : BindableItem<ItemStreamSegmentBinding>() {
|
||||
|
||||
companion object {
|
||||
const val PAYLOAD_SELECT = 1
|
||||
@ -21,31 +20,32 @@ class StreamSegmentItem(
|
||||
|
||||
var isSelected = false
|
||||
|
||||
override fun bind(viewHolder: GroupieViewHolder, position: Int) {
|
||||
item.previewUrl?.let {
|
||||
PicassoHelper.loadThumbnail(it)
|
||||
.into(viewHolder.root.findViewById<ImageView>(R.id.previewImage))
|
||||
}
|
||||
viewHolder.root.findViewById<TextView>(R.id.textViewTitle).text = item.title
|
||||
override fun bind(viewBinding: ItemStreamSegmentBinding, position: Int) {
|
||||
CoilHelper.loadThumbnail(viewBinding.previewImage, item.previewUrl)
|
||||
viewBinding.textViewTitle.text = item.title
|
||||
if (item.channelName == null) {
|
||||
viewHolder.root.findViewById<TextView>(R.id.textViewChannel).visibility = View.GONE
|
||||
viewBinding.textViewChannel.visibility = View.GONE
|
||||
// When the channel name is displayed there is less space
|
||||
// and thus the segment title needs to be only one line height.
|
||||
// But when there is no channel name displayed, the title can be two lines long.
|
||||
// The default maxLines value is set to 1 to display all elements in the AS preview,
|
||||
viewHolder.root.findViewById<TextView>(R.id.textViewTitle).maxLines = 2
|
||||
viewBinding.textViewTitle.maxLines = 2
|
||||
} else {
|
||||
viewHolder.root.findViewById<TextView>(R.id.textViewChannel).text = item.channelName
|
||||
viewHolder.root.findViewById<TextView>(R.id.textViewChannel).visibility = View.VISIBLE
|
||||
viewBinding.textViewChannel.text = item.channelName
|
||||
viewBinding.textViewChannel.visibility = View.VISIBLE
|
||||
}
|
||||
viewHolder.root.findViewById<TextView>(R.id.textViewStartSeconds).text =
|
||||
viewBinding.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
|
||||
viewBinding.root.setOnClickListener { onClick.onItemClick(this, item.startTimeSeconds) }
|
||||
viewBinding.root.setOnLongClickListener { onClick.onItemLongClick(this, item.startTimeSeconds); true }
|
||||
viewBinding.root.isSelected = isSelected
|
||||
}
|
||||
|
||||
override fun bind(viewHolder: GroupieViewHolder, position: Int, payloads: MutableList<Any>) {
|
||||
override fun bind(
|
||||
viewHolder: GroupieViewHolder<ItemStreamSegmentBinding>,
|
||||
position: Int,
|
||||
payloads: MutableList<Any>
|
||||
) {
|
||||
if (payloads.contains(PAYLOAD_SELECT)) {
|
||||
viewHolder.root.isSelected = isSelected
|
||||
return
|
||||
@ -54,4 +54,6 @@ class StreamSegmentItem(
|
||||
}
|
||||
|
||||
override fun getLayout() = R.layout.item_stream_segment
|
||||
|
||||
override fun initializeViewBinding(view: View) = ItemStreamSegmentBinding.bind(view)
|
||||
}
|
||||
|
@ -13,8 +13,8 @@ import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
|
||||
import org.schabi.newpipe.extractor.utils.Utils;
|
||||
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
public class ChannelMiniInfoItemHolder extends InfoItemHolder {
|
||||
private final ImageView itemThumbnailView;
|
||||
@ -56,7 +56,7 @@ public class ChannelMiniInfoItemHolder extends InfoItemHolder {
|
||||
itemAdditionalDetailView.setText(getDetailLine(item));
|
||||
}
|
||||
|
||||
PicassoHelper.loadAvatar(item.getThumbnails()).into(itemThumbnailView);
|
||||
CoilHelper.INSTANCE.loadAvatar(itemThumbnailView, item.getThumbnails());
|
||||
|
||||
itemView.setOnClickListener(view -> {
|
||||
if (itemBuilder.getOnChannelSelectedListener() != null) {
|
||||
|
@ -27,8 +27,8 @@ import org.schabi.newpipe.util.DeviceUtils;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
import org.schabi.newpipe.util.image.ImageStrategy;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.text.TextEllipsizer;
|
||||
|
||||
public class CommentInfoItemHolder extends InfoItemHolder {
|
||||
@ -82,14 +82,12 @@ public class CommentInfoItemHolder extends InfoItemHolder {
|
||||
@Override
|
||||
public void updateFromItem(final InfoItem infoItem,
|
||||
final HistoryRecordManager historyRecordManager) {
|
||||
if (!(infoItem instanceof CommentsInfoItem)) {
|
||||
if (!(infoItem instanceof CommentsInfoItem item)) {
|
||||
return;
|
||||
}
|
||||
final CommentsInfoItem item = (CommentsInfoItem) infoItem;
|
||||
|
||||
|
||||
// load the author avatar
|
||||
PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(itemThumbnailView);
|
||||
CoilHelper.INSTANCE.loadAvatar(itemThumbnailView, item.getUploaderAvatars());
|
||||
if (ImageStrategy.shouldLoadImages()) {
|
||||
itemThumbnailView.setVisibility(View.VISIBLE);
|
||||
itemRoot.setPadding(commentVerticalPadding, commentVerticalPadding,
|
||||
|
@ -9,8 +9,8 @@ import org.schabi.newpipe.extractor.InfoItem;
|
||||
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem;
|
||||
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
public class PlaylistMiniInfoItemHolder extends InfoItemHolder {
|
||||
public final ImageView itemThumbnailView;
|
||||
@ -46,7 +46,7 @@ public class PlaylistMiniInfoItemHolder extends InfoItemHolder {
|
||||
.localizeStreamCountMini(itemStreamCountView.getContext(), item.getStreamCount()));
|
||||
itemUploaderView.setText(item.getUploaderName());
|
||||
|
||||
PicassoHelper.loadPlaylistThumbnail(item.getThumbnails()).into(itemThumbnailView);
|
||||
CoilHelper.INSTANCE.loadPlaylistThumbnail(itemThumbnailView, item.getThumbnails());
|
||||
|
||||
itemView.setOnClickListener(view -> {
|
||||
if (itemBuilder.getOnPlaylistSelectedListener() != null) {
|
||||
|
@ -16,8 +16,8 @@ import org.schabi.newpipe.ktx.ViewUtils;
|
||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||
import org.schabi.newpipe.util.DependentPreferenceHelper;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.StreamTypeUtil;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
import org.schabi.newpipe.views.AnimatedProgressBar;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@ -87,7 +87,7 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder {
|
||||
}
|
||||
|
||||
// Default thumbnail is shown on error, while loading and if the url is empty
|
||||
PicassoHelper.loadThumbnail(item.getThumbnails()).into(itemThumbnailView);
|
||||
CoilHelper.INSTANCE.loadThumbnail(itemThumbnailView, item.getThumbnails());
|
||||
|
||||
itemView.setOnClickListener(view -> {
|
||||
if (itemBuilder.getOnStreamSelectedListener() != null) {
|
||||
|
13
app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt
Normal file
13
app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt
Normal file
@ -0,0 +1,13 @@
|
||||
package org.schabi.newpipe.ktx
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Rect
|
||||
import androidx.core.graphics.BitmapCompat
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline fun Bitmap.scale(
|
||||
width: Int,
|
||||
height: Int,
|
||||
srcRect: Rect? = null,
|
||||
scaleInLinearSpace: Boolean = true,
|
||||
) = BitmapCompat.createScaledBitmap(this, width, height, srcRect, scaleInLinearSpace)
|
@ -19,7 +19,7 @@ import org.schabi.newpipe.extractor.stream.StreamType.POST_LIVE_STREAM
|
||||
import org.schabi.newpipe.extractor.stream.StreamType.VIDEO_STREAM
|
||||
import org.schabi.newpipe.util.Localization
|
||||
import org.schabi.newpipe.util.StreamTypeUtil
|
||||
import org.schabi.newpipe.util.image.PicassoHelper
|
||||
import org.schabi.newpipe.util.image.CoilHelper
|
||||
import java.util.concurrent.TimeUnit
|
||||
import java.util.function.Consumer
|
||||
|
||||
@ -101,7 +101,7 @@ data class StreamItem(
|
||||
viewBinding.itemProgressView.visibility = View.GONE
|
||||
}
|
||||
|
||||
PicassoHelper.loadThumbnail(stream.thumbnailUrl).into(viewBinding.itemThumbnailView)
|
||||
CoilHelper.loadThumbnail(viewBinding.itemThumbnailView, stream.thumbnailUrl)
|
||||
|
||||
if (itemVersion != ItemVersion.MINI) {
|
||||
viewBinding.itemAdditionalDetails.text =
|
||||
|
@ -6,7 +6,6 @@ import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.provider.Settings
|
||||
@ -16,20 +15,17 @@ import androidx.core.app.PendingIntentCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.getSystemService
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.squareup.picasso.Picasso
|
||||
import com.squareup.picasso.Target
|
||||
import org.schabi.newpipe.R
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem
|
||||
import org.schabi.newpipe.local.feed.service.FeedUpdateInfo
|
||||
import org.schabi.newpipe.util.NavigationHelper
|
||||
import org.schabi.newpipe.util.image.PicassoHelper
|
||||
import org.schabi.newpipe.util.image.CoilHelper
|
||||
|
||||
/**
|
||||
* Helper for everything related to show notifications about new streams to the user.
|
||||
*/
|
||||
class NotificationHelper(val context: Context) {
|
||||
private val manager = NotificationManagerCompat.from(context)
|
||||
private val iconLoadingTargets = ArrayList<Target>()
|
||||
|
||||
/**
|
||||
* Show notifications for new streams from a single channel. The individual notifications are
|
||||
@ -68,51 +64,22 @@ class NotificationHelper(val context: Context) {
|
||||
summaryBuilder.setStyle(style)
|
||||
|
||||
// open the channel page when clicking on the summary notification
|
||||
summaryBuilder.setContentIntent(
|
||||
PendingIntentCompat.getActivity(
|
||||
context,
|
||||
data.pseudoId,
|
||||
NavigationHelper
|
||||
val intent = NavigationHelper
|
||||
.getChannelIntent(context, data.serviceId, data.url)
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK),
|
||||
0,
|
||||
false
|
||||
)
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
summaryBuilder.setContentIntent(
|
||||
PendingIntentCompat.getActivity(context, data.pseudoId, intent, 0, false)
|
||||
)
|
||||
|
||||
// a Target is like a listener for image loading events
|
||||
val target = object : Target {
|
||||
override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) {
|
||||
// set channel icon only if there is actually one (for Android versions < 7.0)
|
||||
summaryBuilder.setLargeIcon(bitmap)
|
||||
val avatarIcon =
|
||||
CoilHelper.loadBitmapBlocking(context, data.avatarUrl, R.drawable.ic_newpipe_triangle_white)
|
||||
|
||||
// Show individual stream notifications, set channel icon only if there is actually
|
||||
// one
|
||||
showStreamNotifications(newStreams, data.serviceId, bitmap)
|
||||
summaryBuilder.setLargeIcon(avatarIcon)
|
||||
|
||||
// Show individual stream notifications, set channel icon only if there is actually one
|
||||
showStreamNotifications(newStreams, data.serviceId, avatarIcon)
|
||||
// Show summary notification
|
||||
manager.notify(data.pseudoId, summaryBuilder.build())
|
||||
|
||||
iconLoadingTargets.remove(this) // allow it to be garbage-collected
|
||||
}
|
||||
|
||||
override fun onBitmapFailed(e: Exception, errorDrawable: Drawable) {
|
||||
// Show individual stream notifications
|
||||
showStreamNotifications(newStreams, data.serviceId, null)
|
||||
// Show summary notification
|
||||
manager.notify(data.pseudoId, summaryBuilder.build())
|
||||
iconLoadingTargets.remove(this) // allow it to be garbage-collected
|
||||
}
|
||||
|
||||
override fun onPrepareLoad(placeHolderDrawable: Drawable) {
|
||||
// Nothing to do
|
||||
}
|
||||
}
|
||||
|
||||
// add the target to the list to hold a strong reference and prevent it from being garbage
|
||||
// collected, since Picasso only holds weak references to targets
|
||||
iconLoadingTargets.add(target)
|
||||
|
||||
PicassoHelper.loadNotificationIcon(data.avatarUrl).into(target)
|
||||
}
|
||||
|
||||
private fun showStreamNotifications(
|
||||
|
@ -8,8 +8,8 @@ import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry;
|
||||
import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;
|
||||
import org.schabi.newpipe.local.LocalItemBuilder;
|
||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
@ -30,17 +30,16 @@ public class LocalPlaylistItemHolder extends PlaylistItemHolder {
|
||||
public void updateFromItem(final LocalItem localItem,
|
||||
final HistoryRecordManager historyRecordManager,
|
||||
final DateTimeFormatter dateTimeFormatter) {
|
||||
if (!(localItem instanceof PlaylistMetadataEntry)) {
|
||||
if (!(localItem instanceof PlaylistMetadataEntry item)) {
|
||||
return;
|
||||
}
|
||||
final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem;
|
||||
|
||||
itemTitleView.setText(item.name);
|
||||
itemStreamCountView.setText(Localization.localizeStreamCountMini(
|
||||
itemStreamCountView.getContext(), item.streamCount));
|
||||
itemUploaderView.setVisibility(View.INVISIBLE);
|
||||
|
||||
PicassoHelper.loadPlaylistThumbnail(item.thumbnailUrl).into(itemThumbnailView);
|
||||
CoilHelper.INSTANCE.loadPlaylistThumbnail(itemThumbnailView, item.thumbnailUrl);
|
||||
|
||||
if (item instanceof PlaylistDuplicatesEntry
|
||||
&& ((PlaylistDuplicatesEntry) item).timesStreamIsContained > 0) {
|
||||
|
@ -16,8 +16,8 @@ import org.schabi.newpipe.local.LocalItemBuilder;
|
||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||
import org.schabi.newpipe.util.DependentPreferenceHelper;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.ServiceHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
import org.schabi.newpipe.views.AnimatedProgressBar;
|
||||
|
||||
import java.time.format.DateTimeFormatter;
|
||||
@ -83,8 +83,8 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder {
|
||||
}
|
||||
|
||||
// Default thumbnail is shown on error, while loading and if the url is empty
|
||||
PicassoHelper.loadThumbnail(item.getStreamEntity().getThumbnailUrl())
|
||||
.into(itemThumbnailView);
|
||||
CoilHelper.INSTANCE.loadThumbnail(itemThumbnailView,
|
||||
item.getStreamEntity().getThumbnailUrl());
|
||||
|
||||
itemView.setOnClickListener(view -> {
|
||||
if (itemBuilder.getOnItemSelectedListener() != null) {
|
||||
|
@ -16,8 +16,8 @@ import org.schabi.newpipe.local.LocalItemBuilder;
|
||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||
import org.schabi.newpipe.util.DependentPreferenceHelper;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.ServiceHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
import org.schabi.newpipe.views.AnimatedProgressBar;
|
||||
|
||||
import java.time.format.DateTimeFormatter;
|
||||
@ -117,8 +117,8 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder {
|
||||
}
|
||||
|
||||
// Default thumbnail is shown on error, while loading and if the url is empty
|
||||
PicassoHelper.loadThumbnail(item.getStreamEntity().getThumbnailUrl())
|
||||
.into(itemThumbnailView);
|
||||
CoilHelper.INSTANCE.loadThumbnail(itemThumbnailView,
|
||||
item.getStreamEntity().getThumbnailUrl());
|
||||
|
||||
itemView.setOnClickListener(view -> {
|
||||
if (itemBuilder.getOnItemSelectedListener() != null) {
|
||||
|
@ -8,8 +8,8 @@ import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;
|
||||
import org.schabi.newpipe.local.LocalItemBuilder;
|
||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.ServiceHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
@ -29,10 +29,9 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder {
|
||||
public void updateFromItem(final LocalItem localItem,
|
||||
final HistoryRecordManager historyRecordManager,
|
||||
final DateTimeFormatter dateTimeFormatter) {
|
||||
if (!(localItem instanceof PlaylistRemoteEntity)) {
|
||||
if (!(localItem instanceof PlaylistRemoteEntity item)) {
|
||||
return;
|
||||
}
|
||||
final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem;
|
||||
|
||||
itemTitleView.setText(item.getName());
|
||||
itemStreamCountView.setText(Localization.localizeStreamCountMini(
|
||||
@ -45,7 +44,7 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder {
|
||||
itemUploaderView.setText(ServiceHelper.getNameOfServiceById(item.getServiceId()));
|
||||
}
|
||||
|
||||
PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView);
|
||||
CoilHelper.INSTANCE.loadPlaylistThumbnail(itemThumbnailView, item.getThumbnailUrl());
|
||||
|
||||
super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter);
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ import org.schabi.newpipe.R
|
||||
import org.schabi.newpipe.extractor.channel.ChannelInfoItem
|
||||
import org.schabi.newpipe.util.Localization
|
||||
import org.schabi.newpipe.util.OnClickGesture
|
||||
import org.schabi.newpipe.util.image.PicassoHelper
|
||||
import org.schabi.newpipe.util.image.CoilHelper
|
||||
|
||||
class ChannelItem(
|
||||
private val infoItem: ChannelInfoItem,
|
||||
@ -39,7 +39,7 @@ class ChannelItem(
|
||||
itemChannelDescriptionView.text = infoItem.description
|
||||
}
|
||||
|
||||
PicassoHelper.loadAvatar(infoItem.thumbnails).into(itemThumbnailView)
|
||||
CoilHelper.loadAvatar(itemThumbnailView, infoItem.thumbnails)
|
||||
|
||||
gesturesListener?.run {
|
||||
viewHolder.root.setOnClickListener { selected(infoItem) }
|
||||
|
@ -10,7 +10,7 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity
|
||||
import org.schabi.newpipe.databinding.PickerSubscriptionItemBinding
|
||||
import org.schabi.newpipe.ktx.AnimationType
|
||||
import org.schabi.newpipe.ktx.animate
|
||||
import org.schabi.newpipe.util.image.PicassoHelper
|
||||
import org.schabi.newpipe.util.image.CoilHelper
|
||||
|
||||
data class PickerSubscriptionItem(
|
||||
val subscriptionEntity: SubscriptionEntity,
|
||||
@ -21,7 +21,7 @@ data class PickerSubscriptionItem(
|
||||
override fun getSpanSize(spanCount: Int, position: Int): Int = 1
|
||||
|
||||
override fun bind(viewBinding: PickerSubscriptionItemBinding, position: Int) {
|
||||
PicassoHelper.loadAvatar(subscriptionEntity.avatarUrl).into(viewBinding.thumbnailView)
|
||||
CoilHelper.loadAvatar(viewBinding.thumbnailView, subscriptionEntity.avatarUrl)
|
||||
viewBinding.titleView.text = subscriptionEntity.name
|
||||
viewBinding.selectedHighlight.isVisible = isSelected
|
||||
}
|
||||
|
@ -60,6 +60,7 @@ import android.view.LayoutInflater;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.graphics.drawable.DrawableKt;
|
||||
import androidx.core.math.MathUtils;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
@ -77,8 +78,6 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
||||
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
|
||||
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
|
||||
import com.google.android.exoplayer2.video.VideoSize;
|
||||
import com.squareup.picasso.Picasso;
|
||||
import com.squareup.picasso.Target;
|
||||
|
||||
import org.schabi.newpipe.MainActivity;
|
||||
import org.schabi.newpipe.R;
|
||||
@ -86,8 +85,8 @@ import org.schabi.newpipe.databinding.PlayerBinding;
|
||||
import org.schabi.newpipe.error.ErrorInfo;
|
||||
import org.schabi.newpipe.error.ErrorUtil;
|
||||
import org.schabi.newpipe.error.UserAction;
|
||||
import org.schabi.newpipe.extractor.stream.AudioStream;
|
||||
import org.schabi.newpipe.extractor.Image;
|
||||
import org.schabi.newpipe.extractor.stream.AudioStream;
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||
import org.schabi.newpipe.extractor.stream.StreamType;
|
||||
import org.schabi.newpipe.extractor.stream.VideoStream;
|
||||
@ -118,14 +117,15 @@ import org.schabi.newpipe.player.ui.VideoPlayerUi;
|
||||
import org.schabi.newpipe.util.DependentPreferenceHelper;
|
||||
import org.schabi.newpipe.util.ListHelper;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.SerializedCache;
|
||||
import org.schabi.newpipe.util.StreamTypeUtil;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
import coil.target.Target;
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.core.Observable;
|
||||
import io.reactivex.rxjava3.disposables.CompositeDisposable;
|
||||
@ -174,7 +174,6 @@ public final class Player implements PlaybackListener, Listener {
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
public static final int RENDERER_UNAVAILABLE = -1;
|
||||
private static final String PICASSO_PLAYER_THUMBNAIL_TAG = "PICASSO_PLAYER_THUMBNAIL_TAG";
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Playback
|
||||
@ -193,6 +192,8 @@ public final class Player implements PlaybackListener, Listener {
|
||||
private MediaItemTag currentMetadata;
|
||||
@Nullable
|
||||
private Bitmap currentThumbnail;
|
||||
@Nullable
|
||||
private coil.request.Disposable thumbnailDisposable;
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Player
|
||||
@ -246,12 +247,6 @@ public final class Player implements PlaybackListener, Listener {
|
||||
@NonNull
|
||||
private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable();
|
||||
|
||||
// This is the only listener we need for thumbnail loading, since there is always at most only
|
||||
// one thumbnail being loaded at a time. This field is also here to maintain a strong reference,
|
||||
// which would otherwise be garbage collected since Picasso holds weak references to targets.
|
||||
@NonNull
|
||||
private final Target currentThumbnailTarget;
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Utils
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
@ -295,8 +290,6 @@ public final class Player implements PlaybackListener, Listener {
|
||||
videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver());
|
||||
audioResolver = new AudioPlaybackResolver(context, dataSource);
|
||||
|
||||
currentThumbnailTarget = getCurrentThumbnailTarget();
|
||||
|
||||
// The UIs added here should always be present. They will be initialized when the player
|
||||
// reaches the initialization step. Make sure the media session ui is before the
|
||||
// notification ui in the UIs list, since the notification depends on the media session in
|
||||
@ -602,7 +595,6 @@ public final class Player implements PlaybackListener, Listener {
|
||||
|
||||
databaseUpdateDisposable.clear();
|
||||
progressUpdateDisposable.set(null);
|
||||
cancelLoadingCurrentThumbnail();
|
||||
|
||||
UIs.destroyAll(Object.class); // destroy every UI: obviously every UI extends Object
|
||||
}
|
||||
@ -776,67 +768,58 @@ public final class Player implements PlaybackListener, Listener {
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
//region Thumbnail loading
|
||||
|
||||
private Target getCurrentThumbnailTarget() {
|
||||
// a Picasso target is just a listener for thumbnail loading events
|
||||
return new Target() {
|
||||
@Override
|
||||
public void onBitmapLoaded(final Bitmap bitmap, final Picasso.LoadedFrom from) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Thumbnail - onBitmapLoaded() called with: bitmap = [" + bitmap
|
||||
+ " -> " + bitmap.getWidth() + "x" + bitmap.getHeight() + "], from = ["
|
||||
+ from + "]");
|
||||
}
|
||||
// there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too.
|
||||
onThumbnailLoaded(bitmap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBitmapFailed(final Exception e, final Drawable errorDrawable) {
|
||||
Log.e(TAG, "Thumbnail - onBitmapFailed() called", e);
|
||||
// there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too.
|
||||
onThumbnailLoaded(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrepareLoad(final Drawable placeHolderDrawable) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Thumbnail - onPrepareLoad() called");
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void loadCurrentThumbnail(final List<Image> thumbnails) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Thumbnail - loadCurrentThumbnail() called with thumbnails = ["
|
||||
+ thumbnails.size() + "]");
|
||||
}
|
||||
|
||||
// first cancel any previous loading
|
||||
cancelLoadingCurrentThumbnail();
|
||||
// Cancel any ongoing image loading
|
||||
if (thumbnailDisposable != null) {
|
||||
thumbnailDisposable.dispose();
|
||||
}
|
||||
|
||||
// Unset currentThumbnail, since it is now outdated. This ensures it is not used in media
|
||||
// session metadata while the new thumbnail is being loaded by Picasso.
|
||||
// session metadata while the new thumbnail is being loaded by Coil.
|
||||
onThumbnailLoaded(null);
|
||||
if (thumbnails.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// scale down the notification thumbnail for performance
|
||||
PicassoHelper.loadScaledDownThumbnail(context, thumbnails)
|
||||
.tag(PICASSO_PLAYER_THUMBNAIL_TAG)
|
||||
.into(currentThumbnailTarget);
|
||||
final var thumbnailTarget = new Target() {
|
||||
@Override
|
||||
public void onError(@Nullable final Drawable error) {
|
||||
Log.e(TAG, "Thumbnail - onError() called");
|
||||
// there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too.
|
||||
onThumbnailLoaded(null);
|
||||
}
|
||||
|
||||
private void cancelLoadingCurrentThumbnail() {
|
||||
// cancel the Picasso job associated with the player thumbnail, if any
|
||||
PicassoHelper.cancelTag(PICASSO_PLAYER_THUMBNAIL_TAG);
|
||||
@Override
|
||||
public void onStart(@Nullable final Drawable placeholder) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Thumbnail - onStart() called");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(@NonNull final Drawable result) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Thumbnail - onSuccess() called with: drawable = [" + result + "]");
|
||||
}
|
||||
// there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too.
|
||||
onThumbnailLoaded(DrawableKt.toBitmapOrNull(result, result.getIntrinsicWidth(),
|
||||
result.getIntrinsicHeight(), null));
|
||||
}
|
||||
};
|
||||
thumbnailDisposable = CoilHelper.INSTANCE
|
||||
.loadScaledDownThumbnail(context, thumbnails, thumbnailTarget);
|
||||
}
|
||||
|
||||
private void onThumbnailLoaded(@Nullable final Bitmap bitmap) {
|
||||
// Avoid useless thumbnail updates, if the thumbnail has not actually changed. Based on the
|
||||
// thumbnail loading code, this if would be skipped only when both bitmaps are `null`, since
|
||||
// onThumbnailLoaded won't be called twice with the same nonnull bitmap by Picasso's target.
|
||||
// onThumbnailLoaded won't be called twice with the same nonnull bitmap by Coil's target.
|
||||
if (currentThumbnail != bitmap) {
|
||||
currentThumbnail = bitmap;
|
||||
UIs.call(playerUi -> playerUi.onThumbnailLoaded(bitmap));
|
||||
|
@ -6,8 +6,8 @@ import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import org.schabi.newpipe.util.Localization;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.ServiceHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
public class PlayQueueItemBuilder {
|
||||
private static final String TAG = PlayQueueItemBuilder.class.toString();
|
||||
@ -33,7 +33,7 @@ public class PlayQueueItemBuilder {
|
||||
holder.itemDurationView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
PicassoHelper.loadThumbnail(item.getThumbnails()).into(holder.itemThumbnailView);
|
||||
CoilHelper.INSTANCE.loadThumbnail(holder.itemThumbnailView, item.getThumbnails());
|
||||
|
||||
holder.itemRoot.setOnClickListener(view -> {
|
||||
if (onItemClickListener != null) {
|
||||
|
@ -13,8 +13,9 @@ import androidx.collection.SparseArrayCompat;
|
||||
|
||||
import com.google.common.base.Stopwatch;
|
||||
|
||||
import org.schabi.newpipe.App;
|
||||
import org.schabi.newpipe.extractor.stream.Frameset;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
@ -177,8 +178,8 @@ public class SeekbarPreviewThumbnailHolder {
|
||||
Log.d(TAG, "Downloading bitmap for seekbarPreview from '" + url + "'");
|
||||
|
||||
// Gets the bitmap within the timeout of 15 seconds imposed by default by OkHttpClient
|
||||
// Ensure that your are not running on the main-Thread this will otherwise hang
|
||||
final Bitmap bitmap = PicassoHelper.loadSeekbarThumbnailPreview(url).get();
|
||||
// Ensure that you are not running on the main thread, otherwise this will hang
|
||||
final var bitmap = CoilHelper.INSTANCE.loadBitmapBlocking(App.getApp(), url);
|
||||
|
||||
if (sw != null) {
|
||||
Log.d(TAG, "Download of bitmap for seekbarPreview from '" + url + "' took "
|
||||
|
@ -13,10 +13,9 @@ import org.schabi.newpipe.extractor.NewPipe;
|
||||
import org.schabi.newpipe.extractor.localization.ContentCountry;
|
||||
import org.schabi.newpipe.extractor.localization.Localization;
|
||||
import org.schabi.newpipe.util.image.ImageStrategy;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.image.PreferredImageQuality;
|
||||
|
||||
import java.io.IOException;
|
||||
import coil.Coil;
|
||||
|
||||
public class ContentSettingsFragment extends BasePreferenceFragment {
|
||||
private String youtubeRestrictedModeEnabledKey;
|
||||
@ -42,14 +41,13 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
|
||||
(preference, newValue) -> {
|
||||
ImageStrategy.setPreferredImageQuality(PreferredImageQuality
|
||||
.fromPreferenceKey(requireContext(), (String) newValue));
|
||||
try {
|
||||
PicassoHelper.clearCache(preference.getContext());
|
||||
final var loader = Coil.imageLoader(preference.getContext());
|
||||
loader.getMemoryCache().clear();
|
||||
loader.getDiskCache().clear();
|
||||
Toast.makeText(preference.getContext(),
|
||||
R.string.thumbnail_cache_wipe_complete_notice, Toast.LENGTH_SHORT)
|
||||
.show();
|
||||
} catch (final IOException e) {
|
||||
Log.e(TAG, "Unable to clear Picasso cache", e);
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
@ -10,7 +10,6 @@ import org.schabi.newpipe.error.ErrorInfo;
|
||||
import org.schabi.newpipe.error.ErrorUtil;
|
||||
import org.schabi.newpipe.error.UserAction;
|
||||
import org.schabi.newpipe.local.feed.notifications.NotificationWorker;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@ -25,8 +24,6 @@ public class DebugSettingsFragment extends BasePreferenceFragment {
|
||||
findPreference(getString(R.string.allow_heap_dumping_key));
|
||||
final Preference showMemoryLeaksPreference =
|
||||
findPreference(getString(R.string.show_memory_leaks_key));
|
||||
final Preference showImageIndicatorsPreference =
|
||||
findPreference(getString(R.string.show_image_indicators_key));
|
||||
final Preference checkNewStreamsPreference =
|
||||
findPreference(getString(R.string.check_new_streams_key));
|
||||
final Preference crashTheAppPreference =
|
||||
@ -38,7 +35,6 @@ public class DebugSettingsFragment extends BasePreferenceFragment {
|
||||
|
||||
assert allowHeapDumpingPreference != null;
|
||||
assert showMemoryLeaksPreference != null;
|
||||
assert showImageIndicatorsPreference != null;
|
||||
assert checkNewStreamsPreference != null;
|
||||
assert crashTheAppPreference != null;
|
||||
assert showErrorSnackbarPreference != null;
|
||||
@ -61,11 +57,6 @@ public class DebugSettingsFragment extends BasePreferenceFragment {
|
||||
showMemoryLeaksPreference.setSummary(R.string.leak_canary_not_available);
|
||||
}
|
||||
|
||||
showImageIndicatorsPreference.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
PicassoHelper.setIndicatorsEnabled((Boolean) newValue);
|
||||
return true;
|
||||
});
|
||||
|
||||
checkNewStreamsPreference.setOnPreferenceClickListener(preference -> {
|
||||
NotificationWorker.runNow(preference.getContext());
|
||||
return true;
|
||||
|
@ -19,8 +19,8 @@ import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.database.subscription.SubscriptionEntity;
|
||||
import org.schabi.newpipe.error.ErrorUtil;
|
||||
import org.schabi.newpipe.local.subscription.SubscriptionManager;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.ThemeHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
@ -190,7 +190,7 @@ public class SelectChannelFragment extends DialogFragment {
|
||||
final SubscriptionEntity entry = subscriptions.get(position);
|
||||
holder.titleView.setText(entry.getName());
|
||||
holder.view.setOnClickListener(view -> clickedItem(position));
|
||||
PicassoHelper.loadAvatar(entry.getAvatarUrl()).into(holder.thumbnailView);
|
||||
CoilHelper.INSTANCE.loadAvatar(holder.thumbnailView, entry.getAvatarUrl());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -27,7 +27,7 @@ import org.schabi.newpipe.error.ErrorUtil;
|
||||
import org.schabi.newpipe.error.UserAction;
|
||||
import org.schabi.newpipe.local.playlist.LocalPlaylistManager;
|
||||
import org.schabi.newpipe.local.playlist.RemotePlaylistManager;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
import org.schabi.newpipe.util.image.CoilHelper;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
@ -154,20 +154,15 @@ public class SelectPlaylistFragment extends DialogFragment {
|
||||
final int position) {
|
||||
final PlaylistLocalItem selectedItem = playlists.get(position);
|
||||
|
||||
if (selectedItem instanceof PlaylistMetadataEntry) {
|
||||
final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem);
|
||||
|
||||
if (selectedItem instanceof PlaylistMetadataEntry entry) {
|
||||
holder.titleView.setText(entry.name);
|
||||
holder.view.setOnClickListener(view -> clickedItem(position));
|
||||
PicassoHelper.loadPlaylistThumbnail(entry.thumbnailUrl).into(holder.thumbnailView);
|
||||
|
||||
} else if (selectedItem instanceof PlaylistRemoteEntity) {
|
||||
final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem);
|
||||
|
||||
CoilHelper.INSTANCE.loadPlaylistThumbnail(holder.thumbnailView, entry.thumbnailUrl);
|
||||
} else if (selectedItem instanceof PlaylistRemoteEntity entry) {
|
||||
holder.titleView.setText(entry.getName());
|
||||
holder.view.setOnClickListener(view -> clickedItem(position));
|
||||
PicassoHelper.loadPlaylistThumbnail(entry.getThumbnailUrl())
|
||||
.into(holder.thumbnailView);
|
||||
CoilHelper.INSTANCE.loadPlaylistThumbnail(holder.thumbnailView,
|
||||
entry.getThumbnailUrl());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,7 @@ import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.text.TextUtils;
|
||||
@ -25,12 +26,15 @@ import org.schabi.newpipe.BuildConfig;
|
||||
import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.extractor.Image;
|
||||
import org.schabi.newpipe.util.image.ImageStrategy;
|
||||
import org.schabi.newpipe.util.image.PicassoHelper;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import coil.Coil;
|
||||
import coil.disk.DiskCache;
|
||||
import coil.memory.MemoryCache;
|
||||
|
||||
public final class ShareUtils {
|
||||
private static final String TAG = ShareUtils.class.getSimpleName();
|
||||
|
||||
@ -278,7 +282,7 @@ public final class ShareUtils {
|
||||
* @param content the content to share
|
||||
* @param images a set of possible {@link Image}s of the subject, among which to choose with
|
||||
* {@link ImageStrategy#choosePreferredImage(List)} since that's likely to
|
||||
* provide an image that is in Picasso's cache
|
||||
* provide an image that is in Coil's cache
|
||||
*/
|
||||
public static void shareText(@NonNull final Context context,
|
||||
@NonNull final String title,
|
||||
@ -339,11 +343,9 @@ public final class ShareUtils {
|
||||
*
|
||||
* <p>
|
||||
* In order not to worry about network issues (timeouts, DNS issues, low connection speed, ...)
|
||||
* when sharing a content, only images in the {@link com.squareup.picasso.LruCache LruCache}
|
||||
* used by the Picasso library inside {@link PicassoHelper} are used as preview images. If the
|
||||
* thumbnail image is not in the cache, no {@link ClipData} will be generated and {@code null}
|
||||
* will be returned.
|
||||
* </p>
|
||||
* when sharing a content, only images in the {@link MemoryCache} or {@link DiskCache}
|
||||
* used by the Coil library are used as preview images. If the thumbnail image is not in the
|
||||
* cache, no {@link ClipData} will be generated and {@code null} will be returned.
|
||||
*
|
||||
* <p>
|
||||
* In order to display the image in the content preview of the Android share sheet, an URI of
|
||||
@ -359,12 +361,6 @@ public final class ShareUtils {
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* This method will call {@link PicassoHelper#getImageFromCacheIfPresent(String)} to get the
|
||||
* thumbnail of the content in the {@link com.squareup.picasso.LruCache LruCache} used by
|
||||
* the Picasso library inside {@link PicassoHelper}.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* Using the result of this method when sharing has only an effect on the system share sheet (if
|
||||
* OEMs didn't change Android system standard behavior) on Android API 29 and higher.
|
||||
* </p>
|
||||
@ -378,33 +374,46 @@ public final class ShareUtils {
|
||||
@NonNull final Context context,
|
||||
@NonNull final String thumbnailUrl) {
|
||||
try {
|
||||
final Bitmap bitmap = PicassoHelper.getImageFromCacheIfPresent(thumbnailUrl);
|
||||
if (bitmap == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Save the image in memory to the application's cache because we need a URI to the
|
||||
// image to generate a ClipData which will show the share sheet, and so an image file
|
||||
final Context applicationContext = context.getApplicationContext();
|
||||
final String appFolder = applicationContext.getCacheDir().getAbsolutePath();
|
||||
final File thumbnailPreviewFile = new File(appFolder
|
||||
+ "/android_share_sheet_image_preview.jpg");
|
||||
final var loader = Coil.imageLoader(context);
|
||||
final var value = loader.getMemoryCache()
|
||||
.get(new MemoryCache.Key(thumbnailUrl, Collections.emptyMap()));
|
||||
|
||||
// Any existing file will be overwritten with FileOutputStream
|
||||
final FileOutputStream fileOutputStream = new FileOutputStream(thumbnailPreviewFile);
|
||||
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream);
|
||||
fileOutputStream.close();
|
||||
final Bitmap cachedBitmap;
|
||||
if (value != null) {
|
||||
cachedBitmap = value.getBitmap();
|
||||
} else {
|
||||
try (var snapshot = loader.getDiskCache().openSnapshot(thumbnailUrl)) {
|
||||
if (snapshot != null) {
|
||||
cachedBitmap = BitmapFactory.decodeFile(snapshot.getData().toString());
|
||||
} else {
|
||||
cachedBitmap = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cachedBitmap == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final var path = applicationContext.getCacheDir().toPath()
|
||||
.resolve("android_share_sheet_image_preview.jpg");
|
||||
// Any existing file will be overwritten
|
||||
try (var outputStream = Files.newOutputStream(path)) {
|
||||
cachedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
|
||||
}
|
||||
|
||||
final ClipData clipData = ClipData.newUri(applicationContext.getContentResolver(), "",
|
||||
FileProvider.getUriForFile(applicationContext,
|
||||
BuildConfig.APPLICATION_ID + ".provider",
|
||||
thumbnailPreviewFile));
|
||||
path.toFile()));
|
||||
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "ClipData successfully generated for Android share sheet: " + clipData);
|
||||
}
|
||||
return clipData;
|
||||
|
||||
} catch (final Exception e) {
|
||||
Log.w(TAG, "Error when setting preview image for share sheet", e);
|
||||
return null;
|
||||
|
145
app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt
Normal file
145
app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt
Normal file
@ -0,0 +1,145 @@
|
||||
package org.schabi.newpipe.util.image
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.util.Log
|
||||
import android.widget.ImageView
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.core.graphics.drawable.toBitmapOrNull
|
||||
import coil.executeBlocking
|
||||
import coil.imageLoader
|
||||
import coil.request.Disposable
|
||||
import coil.request.ImageRequest
|
||||
import coil.size.Size
|
||||
import coil.target.Target
|
||||
import coil.transform.Transformation
|
||||
import org.schabi.newpipe.MainActivity
|
||||
import org.schabi.newpipe.R
|
||||
import org.schabi.newpipe.extractor.Image
|
||||
import org.schabi.newpipe.ktx.scale
|
||||
import kotlin.math.min
|
||||
|
||||
object CoilHelper {
|
||||
private val TAG = CoilHelper::class.java.simpleName
|
||||
|
||||
@JvmOverloads
|
||||
fun loadBitmapBlocking(
|
||||
context: Context,
|
||||
url: String?,
|
||||
@DrawableRes placeholderResId: Int = 0
|
||||
): Bitmap? {
|
||||
val request = getImageRequest(context, url, placeholderResId).build()
|
||||
return context.imageLoader.executeBlocking(request).drawable?.toBitmapOrNull()
|
||||
}
|
||||
|
||||
fun loadAvatar(target: ImageView, images: List<Image>) {
|
||||
loadImageDefault(target, images, R.drawable.placeholder_person)
|
||||
}
|
||||
|
||||
fun loadAvatar(target: ImageView, url: String?) {
|
||||
loadImageDefault(target, url, R.drawable.placeholder_person)
|
||||
}
|
||||
|
||||
fun loadThumbnail(target: ImageView, images: List<Image>) {
|
||||
loadImageDefault(target, images, R.drawable.placeholder_thumbnail_video)
|
||||
}
|
||||
|
||||
fun loadThumbnail(target: ImageView, url: String?) {
|
||||
loadImageDefault(target, url, R.drawable.placeholder_thumbnail_video)
|
||||
}
|
||||
|
||||
fun loadScaledDownThumbnail(context: Context, images: List<Image>, target: Target): Disposable {
|
||||
val url = ImageStrategy.choosePreferredImage(images)
|
||||
val request = getImageRequest(context, url, R.drawable.placeholder_thumbnail_video)
|
||||
.target(target)
|
||||
.transformations(object : Transformation {
|
||||
override val cacheKey = "COIL_PLAYER_THUMBNAIL_TRANSFORMATION_KEY"
|
||||
|
||||
override suspend fun transform(input: Bitmap, size: Size): Bitmap {
|
||||
if (MainActivity.DEBUG) {
|
||||
Log.d(TAG, "Thumbnail - transform() called")
|
||||
}
|
||||
|
||||
val notificationThumbnailWidth = min(
|
||||
context.resources.getDimension(R.dimen.player_notification_thumbnail_width),
|
||||
input.width.toFloat()
|
||||
).toInt()
|
||||
|
||||
var newHeight = input.height / (input.width / notificationThumbnailWidth)
|
||||
val result = input.scale(notificationThumbnailWidth, newHeight)
|
||||
|
||||
return if (result == input || !result.isMutable) {
|
||||
// create a new mutable bitmap to prevent strange crashes on some
|
||||
// devices (see #4638)
|
||||
newHeight = input.height / (input.width / (notificationThumbnailWidth - 1))
|
||||
input.scale(notificationThumbnailWidth, newHeight)
|
||||
} else {
|
||||
result
|
||||
}
|
||||
}
|
||||
})
|
||||
.build()
|
||||
|
||||
return context.imageLoader.enqueue(request)
|
||||
}
|
||||
|
||||
fun loadDetailsThumbnail(target: ImageView, images: List<Image>) {
|
||||
val url = ImageStrategy.choosePreferredImage(images)
|
||||
loadImageDefault(target, url, R.drawable.placeholder_thumbnail_video, false)
|
||||
}
|
||||
|
||||
fun loadBanner(target: ImageView, images: List<Image>) {
|
||||
loadImageDefault(target, images, R.drawable.placeholder_channel_banner)
|
||||
}
|
||||
|
||||
fun loadPlaylistThumbnail(target: ImageView, images: List<Image>) {
|
||||
loadImageDefault(target, images, R.drawable.placeholder_thumbnail_playlist)
|
||||
}
|
||||
|
||||
fun loadPlaylistThumbnail(target: ImageView, url: String?) {
|
||||
loadImageDefault(target, url, R.drawable.placeholder_thumbnail_playlist)
|
||||
}
|
||||
|
||||
private fun loadImageDefault(
|
||||
target: ImageView,
|
||||
images: List<Image>,
|
||||
@DrawableRes placeholderResId: Int
|
||||
) {
|
||||
loadImageDefault(target, ImageStrategy.choosePreferredImage(images), placeholderResId)
|
||||
}
|
||||
|
||||
private fun loadImageDefault(
|
||||
target: ImageView,
|
||||
url: String?,
|
||||
@DrawableRes placeholderResId: Int,
|
||||
showPlaceholder: Boolean = true
|
||||
) {
|
||||
val request = getImageRequest(target.context, url, placeholderResId, showPlaceholder)
|
||||
.target(target)
|
||||
.build()
|
||||
target.context.imageLoader.enqueue(request)
|
||||
}
|
||||
|
||||
private fun getImageRequest(
|
||||
context: Context,
|
||||
url: String?,
|
||||
@DrawableRes placeholderResId: Int,
|
||||
showPlaceholderWhileLoading: Boolean = true
|
||||
): ImageRequest.Builder {
|
||||
// if the URL was chosen with `choosePreferredImage` it will be null, but check again
|
||||
// `shouldLoadImages` in case the URL was chosen with `imageListToDbUrl` (which is the case
|
||||
// for URLs stored in the database)
|
||||
val takenUrl = url?.takeIf { it.isNotEmpty() && ImageStrategy.shouldLoadImages() }
|
||||
|
||||
return ImageRequest.Builder(context)
|
||||
.data(takenUrl)
|
||||
.error(placeholderResId)
|
||||
.memoryCacheKey(takenUrl)
|
||||
.diskCacheKey(takenUrl)
|
||||
.apply {
|
||||
if (takenUrl != null || showPlaceholderWhileLoading) {
|
||||
placeholder(placeholderResId)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,224 +0,0 @@
|
||||
package org.schabi.newpipe.util.image;
|
||||
|
||||
import static org.schabi.newpipe.MainActivity.DEBUG;
|
||||
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
||||
import static org.schabi.newpipe.util.image.ImageStrategy.choosePreferredImage;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.graphics.BitmapCompat;
|
||||
|
||||
import com.squareup.picasso.Cache;
|
||||
import com.squareup.picasso.LruCache;
|
||||
import com.squareup.picasso.OkHttp3Downloader;
|
||||
import com.squareup.picasso.Picasso;
|
||||
import com.squareup.picasso.RequestCreator;
|
||||
import com.squareup.picasso.Transformation;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.extractor.Image;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import okhttp3.OkHttpClient;
|
||||
|
||||
public final class PicassoHelper {
|
||||
private static final String TAG = PicassoHelper.class.getSimpleName();
|
||||
private static final String PLAYER_THUMBNAIL_TRANSFORMATION_KEY =
|
||||
"PICASSO_PLAYER_THUMBNAIL_TRANSFORMATION_KEY";
|
||||
|
||||
private PicassoHelper() {
|
||||
}
|
||||
|
||||
private static Cache picassoCache;
|
||||
private static OkHttpClient picassoDownloaderClient;
|
||||
|
||||
// suppress because terminate() is called in App.onTerminate(), preventing leaks
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private static Picasso picassoInstance;
|
||||
|
||||
|
||||
public static void init(final Context context) {
|
||||
picassoCache = new LruCache(10 * 1024 * 1024);
|
||||
picassoDownloaderClient = new OkHttpClient.Builder()
|
||||
.cache(new okhttp3.Cache(new File(context.getExternalCacheDir(), "picasso"),
|
||||
50L * 1024L * 1024L))
|
||||
// this should already be the default timeout in OkHttp3, but just to be sure...
|
||||
.callTimeout(15, TimeUnit.SECONDS)
|
||||
.build();
|
||||
|
||||
picassoInstance = new Picasso.Builder(context)
|
||||
.memoryCache(picassoCache) // memory cache
|
||||
.downloader(new OkHttp3Downloader(picassoDownloaderClient)) // disk cache
|
||||
.defaultBitmapConfig(Bitmap.Config.RGB_565)
|
||||
.build();
|
||||
}
|
||||
|
||||
public static void terminate() {
|
||||
picassoCache = null;
|
||||
picassoDownloaderClient = null;
|
||||
|
||||
if (picassoInstance != null) {
|
||||
picassoInstance.shutdown();
|
||||
picassoInstance = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void clearCache(final Context context) throws IOException {
|
||||
picassoInstance.shutdown();
|
||||
picassoCache.clear(); // clear memory cache
|
||||
final okhttp3.Cache diskCache = picassoDownloaderClient.cache();
|
||||
if (diskCache != null) {
|
||||
diskCache.delete(); // clear disk cache
|
||||
}
|
||||
init(context);
|
||||
}
|
||||
|
||||
public static void cancelTag(final Object tag) {
|
||||
picassoInstance.cancelTag(tag);
|
||||
}
|
||||
|
||||
public static void setIndicatorsEnabled(final boolean enabled) {
|
||||
picassoInstance.setIndicatorsEnabled(enabled); // useful for debugging
|
||||
}
|
||||
|
||||
|
||||
public static RequestCreator loadAvatar(@NonNull final List<Image> images) {
|
||||
return loadImageDefault(images, R.drawable.placeholder_person);
|
||||
}
|
||||
|
||||
public static RequestCreator loadAvatar(@Nullable final String url) {
|
||||
return loadImageDefault(url, R.drawable.placeholder_person);
|
||||
}
|
||||
|
||||
public static RequestCreator loadThumbnail(@NonNull final List<Image> images) {
|
||||
return loadImageDefault(images, R.drawable.placeholder_thumbnail_video);
|
||||
}
|
||||
|
||||
public static RequestCreator loadThumbnail(@Nullable final String url) {
|
||||
return loadImageDefault(url, R.drawable.placeholder_thumbnail_video);
|
||||
}
|
||||
|
||||
public static RequestCreator loadDetailsThumbnail(@NonNull final List<Image> images) {
|
||||
return loadImageDefault(choosePreferredImage(images),
|
||||
R.drawable.placeholder_thumbnail_video, false);
|
||||
}
|
||||
|
||||
public static RequestCreator loadBanner(@NonNull final List<Image> images) {
|
||||
return loadImageDefault(images, R.drawable.placeholder_channel_banner);
|
||||
}
|
||||
|
||||
public static RequestCreator loadPlaylistThumbnail(@NonNull final List<Image> images) {
|
||||
return loadImageDefault(images, R.drawable.placeholder_thumbnail_playlist);
|
||||
}
|
||||
|
||||
public static RequestCreator loadPlaylistThumbnail(@Nullable final String url) {
|
||||
return loadImageDefault(url, R.drawable.placeholder_thumbnail_playlist);
|
||||
}
|
||||
|
||||
public static RequestCreator loadSeekbarThumbnailPreview(@Nullable final String url) {
|
||||
return picassoInstance.load(url);
|
||||
}
|
||||
|
||||
public static RequestCreator loadNotificationIcon(@Nullable final String url) {
|
||||
return loadImageDefault(url, R.drawable.ic_newpipe_triangle_white);
|
||||
}
|
||||
|
||||
|
||||
public static RequestCreator loadScaledDownThumbnail(final Context context,
|
||||
@NonNull final List<Image> images) {
|
||||
// scale down the notification thumbnail for performance
|
||||
return PicassoHelper.loadThumbnail(images)
|
||||
.transform(new Transformation() {
|
||||
@Override
|
||||
public Bitmap transform(final Bitmap source) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Thumbnail - transform() called");
|
||||
}
|
||||
|
||||
final float notificationThumbnailWidth = Math.min(
|
||||
context.getResources()
|
||||
.getDimension(R.dimen.player_notification_thumbnail_width),
|
||||
source.getWidth());
|
||||
|
||||
final Bitmap result = BitmapCompat.createScaledBitmap(
|
||||
source,
|
||||
(int) notificationThumbnailWidth,
|
||||
(int) (source.getHeight()
|
||||
/ (source.getWidth() / notificationThumbnailWidth)),
|
||||
null,
|
||||
true);
|
||||
|
||||
if (result == source || !result.isMutable()) {
|
||||
// create a new mutable bitmap to prevent strange crashes on some
|
||||
// devices (see #4638)
|
||||
final Bitmap copied = BitmapCompat.createScaledBitmap(
|
||||
source,
|
||||
(int) notificationThumbnailWidth - 1,
|
||||
(int) (source.getHeight() / (source.getWidth()
|
||||
/ (notificationThumbnailWidth - 1))),
|
||||
null,
|
||||
true);
|
||||
source.recycle();
|
||||
return copied;
|
||||
} else {
|
||||
source.recycle();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String key() {
|
||||
return PLAYER_THUMBNAIL_TRANSFORMATION_KEY;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Bitmap getImageFromCacheIfPresent(@NonNull final String imageUrl) {
|
||||
// URLs in the internal cache finish with \n so we need to add \n to image URLs
|
||||
return picassoCache.get(imageUrl + "\n");
|
||||
}
|
||||
|
||||
|
||||
private static RequestCreator loadImageDefault(@NonNull final List<Image> images,
|
||||
@DrawableRes final int placeholderResId) {
|
||||
return loadImageDefault(choosePreferredImage(images), placeholderResId);
|
||||
}
|
||||
|
||||
private static RequestCreator loadImageDefault(@Nullable final String url,
|
||||
@DrawableRes final int placeholderResId) {
|
||||
return loadImageDefault(url, placeholderResId, true);
|
||||
}
|
||||
|
||||
private static RequestCreator loadImageDefault(@Nullable final String url,
|
||||
@DrawableRes final int placeholderResId,
|
||||
final boolean showPlaceholderWhileLoading) {
|
||||
// if the URL was chosen with `choosePreferredImage` it will be null, but check again
|
||||
// `shouldLoadImages` in case the URL was chosen with `imageListToDbUrl` (which is the case
|
||||
// for URLs stored in the database)
|
||||
if (isNullOrEmpty(url) || !ImageStrategy.shouldLoadImages()) {
|
||||
return picassoInstance
|
||||
.load((String) null)
|
||||
.placeholder(placeholderResId) // show placeholder when no image should load
|
||||
.error(placeholderResId);
|
||||
} else {
|
||||
final RequestCreator requestCreator = picassoInstance
|
||||
.load(url)
|
||||
.error(placeholderResId);
|
||||
if (showPlaceholderWhileLoading) {
|
||||
requestCreator.placeholder(placeholderResId);
|
||||
}
|
||||
return requestCreator;
|
||||
}
|
||||
}
|
||||
}
|
@ -302,7 +302,6 @@
|
||||
<item quantity="other">%s مشارك</item>
|
||||
</plurals>
|
||||
<string name="loading_metadata_title">جلب البيانات الوصفية…</string>
|
||||
<string name="show_image_indicators_title">إظهار مؤشرات الصور</string>
|
||||
<string name="app_update_available_notification_text">انقر للتنزيل %s</string>
|
||||
<string name="feed_use_dedicated_fetch_method_disable_button">تعطيل الوضع السريع</string>
|
||||
<string name="enumeration_comma">,</string>
|
||||
@ -830,7 +829,6 @@
|
||||
<string name="you_successfully_subscribed">لقد اشتركت الآن في هذه القناة</string>
|
||||
<string name="downloads_storage_use_saf_summary_api_29">بدءًا من Android 10، يتم دعم \"Storage Access Framework\" فقط</string>
|
||||
<string name="generate_unique_name">إنشاء اسم فريد</string>
|
||||
<string name="show_image_indicators_summary">أظهر أشرطة ملونة لبيكاسو أعلى الصور تشير إلى مصدرها: الأحمر للشبكة والأزرق للقرص والأخضر للذاكرة</string>
|
||||
<string name="error_ssl_exception">فشل الاتصال الآمن</string>
|
||||
<string name="youtube_music_premium_content">يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe.</string>
|
||||
<string name="previous_stream">البث السابق</string>
|
||||
|
@ -674,8 +674,6 @@
|
||||
<string name="seekbar_preview_thumbnail_title">معاينة مصغرة على شريط التمرير</string>
|
||||
<string name="mark_as_watched">وضع علامة على تمت مشاهدته</string>
|
||||
<string name="detail_heart_img_view_description">أُعجب بها منشئ المحتوى</string>
|
||||
<string name="show_image_indicators_summary">أظهر أشرطة ملونة لبيكاسو أعلى الصور تشير إلى مصدرها: الأحمر للشبكة والأزرق للقرص والأخضر للذاكرة</string>
|
||||
<string name="show_image_indicators_title">إظهار مؤشرات الصور</string>
|
||||
<string name="remote_search_suggestions">اقتراحات البحث عن بعد</string>
|
||||
<string name="local_search_suggestions">اقتراحات البحث المحلية</string>
|
||||
<string name="main_page_content_swipe_remove">اسحب العناصر لإزالتها</string>
|
||||
|
@ -505,8 +505,6 @@
|
||||
<string name="preferred_player_fetcher_notification_title">Məlumat əldə edilir…</string>
|
||||
<string name="show_original_time_ago_title">Elementlərdə orijinal əvvəlki vaxtı göstər</string>
|
||||
<string name="enable_disposed_exceptions_title">Yaşam dövrəsi xaricindəki xətaları bildir</string>
|
||||
<string name="show_image_indicators_title">Şəkil göstəricilərini göstər</string>
|
||||
<string name="show_image_indicators_summary">Şəkillərin üzərində mənbəsini göstərən Picasso rəngli lentləri göstər: şəbəkə üçün qırmızı, disk üçün mavi və yaddaş üçün yaşıl</string>
|
||||
<string name="pause_downloads_on_mobile_desc">Bəzi endirmələri dayandırmaq mümkün olmasa da, mobil dataya keçərkən faydalıdır</string>
|
||||
<string name="close">Bağla</string>
|
||||
<string name="error_progress_lost">Fayl silindiyi üçün irəliləyiş itirildi</string>
|
||||
|
@ -630,8 +630,6 @@
|
||||
<string name="faq">Перайсці на вэбсайт</string>
|
||||
<string name="main_page_content_swipe_remove">Правядзіце пальцам па элементах, каб выдаліць іх</string>
|
||||
<string name="unset_playlist_thumbnail">Адмяніць пастаянную мініяцюру</string>
|
||||
<string name="show_image_indicators_title">Паказаць індыкатары выявы</string>
|
||||
<string name="show_image_indicators_summary">Паказваць каляровыя стужкі Пікаса на выявах, якія пазначаюць іх крыніцу: чырвоная для сеткі, сіняя для дыска і зялёная для памяці</string>
|
||||
<string name="feed_processing_message">Апрацоўка стужкі…</string>
|
||||
<string name="downloads_storage_ask_summary_no_saf_notice">Вам будзе прапанавана, дзе захоўваць кожную спампоўку</string>
|
||||
<string name="feed_notification_loading">Загрузка стужкі…</string>
|
||||
|
@ -539,7 +539,6 @@
|
||||
<string name="restricted_video">Това видео е с възрастова граница.
|
||||
\n
|
||||
\nВключете „%1$s“ в настройките ако искате да го пуснете.</string>
|
||||
<string name="show_image_indicators_summary">Показвай цветни Picasso-панделки в горната част на изображенията като индикатор за техния произход (червен – от мрежата, син – от диска и червен – от паметта)</string>
|
||||
<string name="auto_device_theme_title">Автоматична (тази на устройството)</string>
|
||||
<string name="notification_scale_to_square_image_summary">Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания)</string>
|
||||
<string name="select_a_playlist">Избете плейлист</string>
|
||||
|
@ -589,7 +589,6 @@
|
||||
<string name="streams_notification_channel_name">নতুন ধারা</string>
|
||||
<string name="streams_notifications_interval_title">কম্পাঙ্ক দেখো</string>
|
||||
<string name="seekbar_preview_thumbnail_title">পূর্বদর্শন রেখার মাধ্যমে প্রাকদর্শন</string>
|
||||
<string name="show_image_indicators_title">ছবিরূপ সূচক দেখাও</string>
|
||||
<string name="dont_show">দেখিও না</string>
|
||||
<string name="any_network">যেকোনো নেটওয়ার্ক</string>
|
||||
<string name="enqueued_next">পরেরটা ক্রমে রাখা হয়েছে</string>
|
||||
|
@ -625,7 +625,6 @@
|
||||
<string name="dont_show">No mostris</string>
|
||||
<string name="low_quality_smaller">Baixa qualitat (més petit)</string>
|
||||
<string name="high_quality_larger">Alta qualitat (més gran)</string>
|
||||
<string name="show_image_indicators_title">Mostra indicadors de la imatge</string>
|
||||
<string name="disable_media_tunneling_summary">Desactiva l\'entunelament del contingut si en els videos hi ha una pantalla negre o tartamudegen</string>
|
||||
<string name="show_channel_details">Mostra detalls del canal</string>
|
||||
<string name="no_dir_yet">No s\'ha establert una carpeta de descàrregues, selecciona la carpeta per defecte ara</string>
|
||||
@ -669,7 +668,6 @@
|
||||
<string name="detail_pinned_comment_view_description">Comentari fixat</string>
|
||||
<string name="show_crash_the_player_title">Mostra \"Força el tancament del reproductor\"</string>
|
||||
<string name="show_crash_the_player_summary">Mostra una opció de fallada quan s\'utilitza el reproductor</string>
|
||||
<string name="show_image_indicators_summary">Mostra les cintes de color Picasso a la part superior de les imatges que indiquen la seva font: vermell per a la xarxa, blau per al disc i verd per a la memòria</string>
|
||||
<string name="leak_canary_not_available">El LeakCanary no està disponible</string>
|
||||
<string name="streams_notifications_interval_title">Comprovant freqüència</string>
|
||||
<string name="streams_notifications_network_title">Es necesita una conexió a Internet</string>
|
||||
|
@ -631,8 +631,6 @@
|
||||
<string name="dont_show">پیشان نەدرێت</string>
|
||||
<string name="low_quality_smaller">کواڵێتی نزم (بچووکتر)</string>
|
||||
<string name="high_quality_larger">کواڵێتی بەرز (گەورەتر)</string>
|
||||
<string name="show_image_indicators_summary">پیشاندانی شریتە ڕەنگکراوەکانی پیکاسۆ لەسەرووی وێنەکانەوە بۆ بەدیار خستنی سەرچاوەکانیان : سوور بۆ تۆڕ ، شین بۆ دیسک و سەوز بۆ بیرگە</string>
|
||||
<string name="show_image_indicators_title">پیشاندانی دیارخەرەکانی وێنە</string>
|
||||
<string name="remote_search_suggestions">پێشنیازکراوەکانی گەڕانی ڕیمۆت</string>
|
||||
<string name="local_search_suggestions">پێشنیازکراوەکانی گەڕانی نێوخۆیی</string>
|
||||
<string name="mark_as_watched">دیارکردن وەک بینراو</string>
|
||||
|
@ -654,8 +654,6 @@
|
||||
<item quantity="few">%s stahování dokončena</item>
|
||||
<item quantity="other">%s stahováních dokončeno</item>
|
||||
</plurals>
|
||||
<string name="show_image_indicators_summary">Zobrazit barevné pásky Picasso na obrázcích označujících jejich zdroj: červená pro síť, modrá pro disk a zelená pro paměť</string>
|
||||
<string name="show_image_indicators_title">Zobrazit indikátory obrázků</string>
|
||||
<string name="remote_search_suggestions">Vzdálené návrhy vyhledávání</string>
|
||||
<string name="local_search_suggestions">Lokální návrhy vyhledávání</string>
|
||||
<string name="start_main_player_fullscreen_summary">Pokud je vypnuté automatické otáčení, nespouštět video v mini přehrávači, ale přepnout se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky</string>
|
||||
|
@ -516,7 +516,6 @@
|
||||
<string name="processing_may_take_a_moment">Behandler… Det kan tage et øjeblik</string>
|
||||
<string name="show_memory_leaks">Vis hukommelseslækager</string>
|
||||
<string name="disable_media_tunneling_title">Deaktivér medietunneling</string>
|
||||
<string name="show_image_indicators_title">Vis billedindikatorer</string>
|
||||
<string name="streams_notifications_network_title">Netværkskrav</string>
|
||||
<string name="any_network">Alle netværk</string>
|
||||
<string name="streams_notifications_interval_title">Kontrolfrekvens</string>
|
||||
@ -695,7 +694,6 @@
|
||||
<string name="faq_title">Ofte stillede spørgsmål</string>
|
||||
<string name="faq_description">Hvis du har problemer med at bruge appen, bør du tjekke disse svar på almindelige spørgsmål!</string>
|
||||
<string name="faq">Se på webside</string>
|
||||
<string name="show_image_indicators_summary">Vis Picasso-farvede bånd oven på billeder, der angiver deres kilde: rød for netværk, blå for disk og grøn for hukommelse</string>
|
||||
<string name="app_update_unavailable_toast">Du kører den nyeste version af NewPipe</string>
|
||||
<string name="new_seek_duration_toast">Pga. ExoPlayer-begrænsninger blev søgevarigheden sat til %d sekunder</string>
|
||||
<string name="feed_group_show_only_ungrouped_subscriptions">Vis kun ikke-grupperede abonnementer</string>
|
||||
|
@ -637,8 +637,6 @@
|
||||
<string name="off">Aus</string>
|
||||
<string name="mark_as_watched">Als gesehen markieren</string>
|
||||
<string name="detail_heart_img_view_description">Vom Ersteller mit Herz versehen</string>
|
||||
<string name="show_image_indicators_summary">Farbige Picasso-Bänder über den Bildern anzeigen, die deren Quelle angeben: rot für Netzwerk, blau für Festplatte und grün für Speicher</string>
|
||||
<string name="show_image_indicators_title">Bildindikatoren anzeigen</string>
|
||||
<string name="remote_search_suggestions">Entfernte Suchvorschläge</string>
|
||||
<string name="local_search_suggestions">Lokale Suchvorschläge</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -634,8 +634,6 @@
|
||||
<string name="seekbar_preview_thumbnail_title">Προεπισκόπηση στην μπάρα αναζήτησης</string>
|
||||
<string name="mark_as_watched">Σήμανση ως αναπαραχθέν</string>
|
||||
<string name="detail_heart_img_view_description">Επισημάνθηκε από τον δημιουργό</string>
|
||||
<string name="show_image_indicators_summary">Εμφάνιση χρωματιστής κορδέλας πάνω στις εικόνες, που δείχνει την πηγή τους: κόκκινη για δίκτυο, μπλε για δίσκο και πράσινο για μνήμη</string>
|
||||
<string name="show_image_indicators_title">Εμφάνιση δεικτών εικόνων</string>
|
||||
<string name="remote_search_suggestions">Προτάσεις απομακρυσμένης αναζήτησης</string>
|
||||
<string name="local_search_suggestions">Προτάσεις τοπικής αναζήτησης</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -647,8 +647,6 @@
|
||||
<string name="comments_are_disabled">Los comentarios están deshabilitados</string>
|
||||
<string name="detail_heart_img_view_description">De corazón por el creador</string>
|
||||
<string name="mark_as_watched">Marcar como visto</string>
|
||||
<string name="show_image_indicators_summary">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</string>
|
||||
<string name="show_image_indicators_title">Mostrar indicadores de imagen</string>
|
||||
<string name="remote_search_suggestions">Sugerencias de búsqueda remota</string>
|
||||
<string name="local_search_suggestions">Sugerencias de búsqueda local</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -634,8 +634,6 @@
|
||||
\n
|
||||
\nNii et valik taandub sellele, mida eelistad: kiirus või täpne teave.</string>
|
||||
<string name="mark_as_watched">Märgi vaadatuks</string>
|
||||
<string name="show_image_indicators_summary">Näita piltide kohal Picasso värvides riba, mis märgib pildi allikat: punane tähistab võrku, sinine kohalikku andmekandjat ja roheline kohalikku mälu</string>
|
||||
<string name="show_image_indicators_title">Näita piltide allikat</string>
|
||||
<string name="remote_search_suggestions">Kaugotsingu soovitused</string>
|
||||
<string name="local_search_suggestions">Kohaliku otsingu soovitused</string>
|
||||
<string name="main_page_content_swipe_remove">Üksuse eemaldamiseks viipa</string>
|
||||
|
@ -641,8 +641,6 @@
|
||||
<item quantity="one">Deskarga amaituta</item>
|
||||
<item quantity="other">%s Deskarga amaituta</item>
|
||||
</plurals>
|
||||
<string name="show_image_indicators_summary">Irudien gainean Picasso koloretako zintak erakutsi, jatorria adieraziz: gorria sarerako, urdina diskorako eta berdea memoriarako</string>
|
||||
<string name="show_image_indicators_title">Erakutsi irudi-adierazleak</string>
|
||||
<string name="remote_search_suggestions">Urruneko bilaketaren iradokizunak</string>
|
||||
<string name="local_search_suggestions">Tokiko bilaketa-iradokizunak</string>
|
||||
<string name="mark_as_watched">Ikusi gisa markatu</string>
|
||||
|
@ -597,7 +597,6 @@
|
||||
<string name="notification_colorize_title">رنگی کردن آگاهی</string>
|
||||
<string name="open_with">گشودن با</string>
|
||||
<string name="mark_as_watched">نشانه به عنوان دیده شده</string>
|
||||
<string name="show_image_indicators_summary">نمایش روبانهای رنگی پیکاسو در بالای تصویرها کهنشانگر منبعشان است: قرمز برای شبکه ، آبی برای دیسک و سبز برای حافظه</string>
|
||||
<string name="notification_colorize_summary">درخواست از اندروید برای سفارشیسازی رنگ آگاهی براساس رنگ اصلی در بندانگشتی (توجّه داشته باشید که روی همهٔ افزارهها در دسترس نیست)</string>
|
||||
<string name="restricted_video">این ویدیو محدود به سن است.
|
||||
\n
|
||||
@ -635,7 +634,6 @@
|
||||
<string name="detail_heart_img_view_description">قلبشده به دست ایجادگر</string>
|
||||
<string name="local_search_suggestions">پیشنهادهای جستوجوی محلّی</string>
|
||||
<string name="remote_search_suggestions">پیشنهادهای جستوجوی دوردست</string>
|
||||
<string name="show_image_indicators_title">نمایش نشانگرهای تصویر</string>
|
||||
<plurals name="download_finished_notification">
|
||||
<item quantity="one">بارگیری پایان یافت</item>
|
||||
<item quantity="other">%s بارگیری پایان یافتند</item>
|
||||
|
@ -634,8 +634,6 @@
|
||||
<string name="no_dir_yet">Latauskansiota ei vielä asetettu, valitse ensin oletuslatauskansio</string>
|
||||
<string name="comments_are_disabled">Kommentit poistettu käytöstä</string>
|
||||
<string name="mark_as_watched">Merkitse katsotuksi</string>
|
||||
<string name="show_image_indicators_summary">Näytä Picasso-värjätyt nauhat kuvien päällä osoittaakseen lähteen: punainen tarkoittaa verkkoa, sininen tarkoittaa levytilaa ja vihreä tarkoittaa muistia</string>
|
||||
<string name="show_image_indicators_title">Näytä kuvailmaisimet</string>
|
||||
<string name="remote_search_suggestions">Etähakuehdotukset</string>
|
||||
<string name="local_search_suggestions">Paikalliset hakuehdotukset</string>
|
||||
<string name="enqueue_next_stream">Lisää seuraavaksi</string>
|
||||
|
@ -646,10 +646,8 @@
|
||||
<string name="seekbar_preview_thumbnail_title">Prévisualisation de la barre de progression sur la miniature</string>
|
||||
<string name="mark_as_watched">Marquer comme visionné</string>
|
||||
<string name="detail_heart_img_view_description">Apprécié par le créateur</string>
|
||||
<string name="show_image_indicators_title">Afficher les indicateurs d’image</string>
|
||||
<string name="remote_search_suggestions">Suggestions de recherche distante</string>
|
||||
<string name="local_search_suggestions">Suggestions de recherche locale</string>
|
||||
<string name="show_image_indicators_summary">Affiche les rubans colorés de Picasso au-dessus des images indiquant leur source : rouge pour le réseau, bleu pour le disque et vert pour la mémoire</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
<item quantity="one">%1$s téléchargement supprimé</item>
|
||||
<item quantity="many">%1$s téléchargements supprimés</item>
|
||||
|
@ -627,7 +627,6 @@
|
||||
<item quantity="other">%s descargas finalizadas</item>
|
||||
</plurals>
|
||||
<string name="seekbar_preview_thumbnail_title">Miniatura na barra de busca</string>
|
||||
<string name="show_image_indicators_title">Mostrar indicadores de imaxe</string>
|
||||
<string name="disable_media_tunneling_summary">Desactive o túnel multimedia se experimentar unha pantalla en negro ou interrupcións na reprodución.</string>
|
||||
<string name="disable_media_tunneling_title">Desactivar túnel multimedia</string>
|
||||
<string name="enqueued">Engadido á cola</string>
|
||||
@ -664,7 +663,6 @@
|
||||
<string name="downloads_storage_use_saf_summary_api_29">A partir do Android 10, só o \'Sistema de Acceso ao Almacenamento\' está soportado</string>
|
||||
<string name="processing_may_take_a_moment">Procesando... Pode devagar un momento</string>
|
||||
<string name="create_error_notification">Crear unha notificación de erro</string>
|
||||
<string name="show_image_indicators_summary">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</string>
|
||||
<string name="feed_new_items">Novos elementos</string>
|
||||
<string name="progressive_load_interval_exoplayer_default">Predefinido do ExoPlayer</string>
|
||||
<string name="show_crash_the_player_title">Amosar \"Travar o reprodutor\"</string>
|
||||
|
@ -654,8 +654,6 @@
|
||||
<string name="seekbar_preview_thumbnail_title">תמונה מוקטנת בסרגל הנגינה</string>
|
||||
<string name="detail_heart_img_view_description">סומן בלב על ידי היוצר</string>
|
||||
<string name="mark_as_watched">סימון כנצפה</string>
|
||||
<string name="show_image_indicators_summary">הצגת סרטים בסגנון פיקאסו בראש התמונות לציון המקור שלהם: אדום זה מהרשת, כחול מהכונן וירוק מהזיכרון</string>
|
||||
<string name="show_image_indicators_title">הצגת מחווני תמונות</string>
|
||||
<string name="remote_search_suggestions">הצעות חיפוש מרוחקות</string>
|
||||
<string name="local_search_suggestions">הצעות חיפוש מקומיות</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -570,7 +570,6 @@
|
||||
<string name="enqueued">कतारबद्ध हुआ</string>
|
||||
<string name="loading_stream_details">स्ट्रीम विवरण लोड हो रहे हैं…</string>
|
||||
<string name="processing_may_take_a_moment">प्रोसेस हो रहा है… कुछ समय लग सकता है</string>
|
||||
<string name="show_image_indicators_title">छवि संकेतक दिखाएं</string>
|
||||
<string name="show_crash_the_player_summary">प्लेयर का उपयोग करते समय क्रैश विकल्प दिखाता है</string>
|
||||
<string name="check_new_streams">नई स्ट्रीमों के लिए जांच चलाएं</string>
|
||||
<string name="show_error_snackbar">एक त्रुटि स्नैकबार दिखाएं</string>
|
||||
@ -668,7 +667,6 @@
|
||||
<string name="leak_canary_not_available">लीक-कैनरी उपलब्ध नहीं है</string>
|
||||
<string name="error_report_notification_toast">एक त्रुटी हुई है, नोटीफिकेशन देखें</string>
|
||||
<string name="disable_media_tunneling_summary">यदि वीडियो प्लेबैक पर आप काली स्क्रीन या रुक-रुक कर वीडियो चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें।</string>
|
||||
<string name="show_image_indicators_summary">छवियों के शीर्ष पर पिकासो रंगीन रिबन दिखाएँ जो उनके स्रोत को दर्शाता है: नेटवर्क के लिए लाल, डिस्क के लिए नीला और मेमोरी के लिए हरा</string>
|
||||
<string name="create_error_notification">त्रुटी की नोटीफिकेशन बनाएं</string>
|
||||
<string name="error_download_resource_gone">इस डाउनलोड को पुनर्प्राप्त नहीं किया जा सकता</string>
|
||||
<string name="no_dir_yet">अभी तक कोई डाउनलोड फ़ोल्डर सेट नहीं किया गया है, अब डिफ़ॉल्ट डाउनलोड फ़ोल्डर चुनें</string>
|
||||
|
@ -646,7 +646,6 @@
|
||||
<string name="service_provides_reason">%s pruža ovaj razlog:</string>
|
||||
<string name="processing_may_take_a_moment">Obrada u tijeku … Može malo potrajati</string>
|
||||
<string name="main_page_content_swipe_remove">Za ukljanjanje stavki povuci ih</string>
|
||||
<string name="show_image_indicators_title">Prikaži indikatore slike</string>
|
||||
<plurals name="download_finished_notification">
|
||||
<item quantity="one">Preuzimanje je gotovo</item>
|
||||
<item quantity="few">%s preuzimanja su gotova</item>
|
||||
@ -655,7 +654,6 @@
|
||||
<string name="start_main_player_fullscreen_title">Pokreni glavni player u cjeloekranskom prikazu</string>
|
||||
<string name="enqueue_next_stream">Dodaj u popis kao sljedeći</string>
|
||||
<string name="enqueued_next">Dodano u popis kao sljedeći</string>
|
||||
<string name="show_image_indicators_summary">Prikaži Picassove vrpce u boji na slikama koje označavaju njihov izvor: crvena za mrežu, plava za disk i zelena za memoriju</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
<item quantity="one">Izbrisano %1$s preuzimanje</item>
|
||||
<item quantity="few">Izbrisana %1$s preuzimanja</item>
|
||||
|
@ -570,7 +570,6 @@
|
||||
<string name="enable_disposed_exceptions_summary">Az eltávolítás utáni, fragment vagy activity életcikluson kívüli, nem kézbesíthető Rx kivételek jelentésének kényszerítése</string>
|
||||
<string name="show_original_time_ago_title">Eredeti „ennyi ideje” megjelenítése az elemeken</string>
|
||||
<string name="disable_media_tunneling_summary">Tiltsa le a médiacsatornázást, ha fekete képernyőt vagy akadozást tapasztal videólejátszáskor.</string>
|
||||
<string name="show_image_indicators_summary">Picasso színes szalagok megjelenítése a képek fölött, megjelölve a forrásukat: piros a hálózathoz, kék a lemezhez, zöld a memóriához</string>
|
||||
<string name="downloads_storage_ask_summary_no_saf_notice">Minden letöltésnél meg fogja kérdezni, hogy hova mentse el</string>
|
||||
<string name="choose_instance_prompt">Válasszon egy példányt</string>
|
||||
<string name="feed_oldest_subscription_update">Lista legutóbbi frissítése: %s</string>
|
||||
@ -657,7 +656,6 @@
|
||||
\nBiztos benne\? Ez nem vonható vissza!</string>
|
||||
<string name="show_original_time_ago_summary">A szolgáltatásokból származó eredeti szövegek láthatók lesznek a közvetítési elemeken</string>
|
||||
<string name="crash_the_player">Lejátszó összeomlasztása</string>
|
||||
<string name="show_image_indicators_title">Képjelölők megjelenítése</string>
|
||||
<string name="show_crash_the_player_title">A „lejátszó összeomlasztása” lehetőség megjelenítése</string>
|
||||
<string name="show_crash_the_player_summary">Megjeleníti az összeomlasztási lehetőséget a lejátszó használatakor</string>
|
||||
<string name="unhook_checkbox">Hangmagasság megtartása (torzítást okozhat)</string>
|
||||
|
@ -631,13 +631,11 @@
|
||||
<string name="detail_heart_img_view_description">Disukai oleh kreator</string>
|
||||
<string name="local_search_suggestions">Saran pencarian lokal</string>
|
||||
<string name="remote_search_suggestions">Saran pencarian remote</string>
|
||||
<string name="show_image_indicators_title">Tampilkan indikator gambar</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
<item quantity="other">Menghapus %1$s unduhan</item>
|
||||
</plurals>
|
||||
<string name="enqueue_next_stream">tambahkan ke selanjutnya</string>
|
||||
<string name="enqueued_next">telah ditambahkan ke selanjutnya</string>
|
||||
<string name="show_image_indicators_summary">Tampilkan Ribon bewarna Picasso di atas gambar yang mengindikasikan asalnya: merah untuk jaringan, biru untuk disk dan hijau untuk memori</string>
|
||||
<string name="start_main_player_fullscreen_summary">Jangan memulai memutar video di mini player, tapi nyalakan langsung di mode layar penuh, jika rotasi otomatis terkunci. Anda tetap dapat mengakses mini player dengan keluar dari layar penuh</string>
|
||||
<string name="processing_may_take_a_moment">Memproses… Mungkin butuh waktu sebentar</string>
|
||||
<string name="check_for_updates">Periksa Pembaruan</string>
|
||||
|
@ -657,8 +657,6 @@
|
||||
<string name="show_original_time_ago_summary">Upprunalegir textar frá þjónustu verða sýnilegir í atriðum</string>
|
||||
<string name="disable_media_tunneling_title">Slökkva á fjölmiðlagöngum</string>
|
||||
<string name="disable_media_tunneling_summary">Slökktu á fjölmiðlagöngum ef þú finnur fyrir svörtum skjá eða stami við spilun myndbandar</string>
|
||||
<string name="show_image_indicators_title">Sýna myndvísa</string>
|
||||
<string name="show_image_indicators_summary">Sýna Picasso litaða borða ofan á myndum sem gefa til kynna uppruna þeirra: rauðan fyrir netið, bláan fyrir disk og grænan fyrir minni</string>
|
||||
<string name="show_crash_the_player_title">Sýna „Hrynja spilara“</string>
|
||||
<string name="show_crash_the_player_summary">Sýna valkost til að hrynja spilara</string>
|
||||
<string name="crash_the_app">Hrynja forrit</string>
|
||||
|
@ -644,8 +644,6 @@
|
||||
<string name="comments_are_disabled">Commenti disattivati</string>
|
||||
<string name="detail_heart_img_view_description">Apprezzato dall\'autore</string>
|
||||
<string name="mark_as_watched">Segna come visto</string>
|
||||
<string name="show_image_indicators_summary">Mostra gli indicatori colorati Picasso sopra le immagini, per indicare la loro fonte: rosso per la rete, blu per il disco e verde per la memoria</string>
|
||||
<string name="show_image_indicators_title">Mostra indicatori immagine</string>
|
||||
<string name="remote_search_suggestions">Suggerimenti di ricerca remoti</string>
|
||||
<string name="local_search_suggestions">Suggerimenti di ricerca locali</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -634,8 +634,6 @@
|
||||
<plurals name="download_finished_notification">
|
||||
<item quantity="other">%s つのダウンロードが完了しました</item>
|
||||
</plurals>
|
||||
<string name="show_image_indicators_summary">ピカソは、画像の上に、画像の出所を識別する色彩記章を表示します: 赤はネットワーク、青はディスク、緑はメモリ</string>
|
||||
<string name="show_image_indicators_title">画像に標識を表示</string>
|
||||
<string name="processing_may_take_a_moment">処理中… 少し時間がかかるかもしれません</string>
|
||||
<string name="manual_update_description">新しいバージョンを手動で確認します</string>
|
||||
<string name="checking_updates_toast">アップデートを確認中…</string>
|
||||
|
@ -384,7 +384,6 @@
|
||||
<string name="show_original_time_ago_summary">ორიგინალური ტექსტები სერვისებიდან ხილული იქნება ნაკადის ერთეულებში</string>
|
||||
<string name="disable_media_tunneling_title">მედია გვირაბის გათიშვა</string>
|
||||
<string name="disable_media_tunneling_summary">გამორთეთ მედია გვირაბი, თუ ვიდეოს დაკვრისას შავი ეკრანი ან ჭუჭყი გაქვთ</string>
|
||||
<string name="show_image_indicators_title">გამოსახულების ინდიკატორების ჩვენება</string>
|
||||
<string name="show_crash_the_player_title">აჩვენე \"დამკვრელის დამსხვრევა\"</string>
|
||||
<string name="show_crash_the_player_summary">აჩვენებს ავარიის ვარიანტს დამკვრელის გამოყენებისას</string>
|
||||
<string name="check_new_streams">გაუშვით შემოწმება ახალი ნაკადებისთვის</string>
|
||||
@ -683,7 +682,6 @@
|
||||
<string name="subscriptions_import_unsuccessful">გამოწერების იმპორტი ვერ მოხერხდა</string>
|
||||
<string name="enable_disposed_exceptions_title">შეატყობინეთ სასიცოცხლო ციკლის შეცდომებს</string>
|
||||
<string name="enable_disposed_exceptions_summary">იძულებითი მოხსენება შეუსაბამო Rx გამონაკლისების შესახებ ფრაგმენტის ან აქტივობის სასიცოცხლო ციკლის გარეთ განკარგვის შემდეგ</string>
|
||||
<string name="show_image_indicators_summary">აჩვენეთ პიკასოს ფერადი ლენტები სურათების თავზე, სადაც მითითებულია მათი წყარო: წითელი ქსელისთვის, ლურჯი დისკისთვის და მწვანე მეხსიერებისთვის</string>
|
||||
<string name="feed_load_error_fast_unknown">სწრაფი კვების რეჟიმი ამაზე მეტ ინფორმაციას არ იძლევა.</string>
|
||||
<string name="feed_load_error_account_info">„%s“-ის არხის ჩატვირთვა ვერ მოხერხდა.</string>
|
||||
<string name="feed_use_dedicated_fetch_method_summary">ხელმისაწვდომია ზოგიერთ სერვისში, როგორც წესი, ბევრად უფრო სწრაფია, მაგრამ შეიძლება დააბრუნოს შეზღუდული რაოდენობის ელემენტი და ხშირად არასრული ინფორმაცია (მაგ. ხანგრძლივობის გარეშე, ელემენტის ტიპი, არ არის ლაივის სტატუსი)</string>
|
||||
|
@ -545,8 +545,6 @@
|
||||
<string name="disable_media_tunneling_title">미디어 터널링 비활성화</string>
|
||||
<string name="show_original_time_ago_summary">서비스의 원본 텍스트가 스트림 항목에 표시됩니다</string>
|
||||
<string name="disable_media_tunneling_summary">동영상 재생 시 검은 화면이 나타나거나 끊김 현상이 발생하면 미디어 터널링을 비활성화하세요.</string>
|
||||
<string name="show_image_indicators_title">이미지 표시기 표시</string>
|
||||
<string name="show_image_indicators_summary">원본을 나타내는 이미지 위에 피카소 컬러 리본 표시: 네트워크는 빨간색, 디스크는 파란색, 메모리는 녹색</string>
|
||||
<string name="show_crash_the_player_title">\"플레이어 충돌\" 표시</string>
|
||||
<string name="show_crash_the_player_summary">플레이어를 사용할 때 충돌 옵션을 표시합니다</string>
|
||||
<string name="check_new_streams">새로운 스트림 확인 실행</string>
|
||||
|
@ -644,8 +644,6 @@
|
||||
<string name="dont_show">Nerodyti</string>
|
||||
<string name="detail_heart_img_view_description">Širdelė nuo kurėjo</string>
|
||||
<string name="mark_as_watched">Pažymėti kaip peržiūrėtą</string>
|
||||
<string name="show_image_indicators_summary">Rodyti „Picasso“ spalvotas juosteles ant vaizdų, nurodančių jų šaltinį: raudona tinklui, mėlyna diskui ir žalia atmintis</string>
|
||||
<string name="show_image_indicators_title">Rodyti vaizdo indikatorius</string>
|
||||
<string name="remote_search_suggestions">Nuotolinės paieškos pasiūlymai</string>
|
||||
<string name="local_search_suggestions">Vietinės paieškos pasiūlymai</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -625,12 +625,10 @@
|
||||
<string name="start_main_player_fullscreen_summary">Nesākt video atskaņošanu samazinātā režīmā, bet pilnekrāna režīmā, ja automātiskā rotācija ir izslēgta</string>
|
||||
<string name="disable_media_tunneling_title">Izslēgt multivides tuneļošanu</string>
|
||||
<string name="disable_media_tunneling_summary">Izslēdziet multivides tuneļošanu, ja jums video atskaņošanas laikā parādās melns ekrāns vai aizķeršanās</string>
|
||||
<string name="show_image_indicators_summary">Rādīt krāsainas lentes virs attēliem, norādot to avotu: sarkana - tīkls, zila - disks, zaļa - atmiņa</string>
|
||||
<string name="description_select_enable">Ieslēgt teksta atlasīšanu video aprakstā</string>
|
||||
<string name="no_dir_yet">Lejupielādes mape vēl nav iestatīta, izvēlieties noklusējuma lejupielādes mapi</string>
|
||||
<string name="main_page_content_swipe_remove">Pārvelciet objektus, lai tos noņemtu</string>
|
||||
<string name="local_search_suggestions">Lokālie meklēšanas ieteikumi</string>
|
||||
<string name="show_image_indicators_title">Rādīt attēlu indikatorus</string>
|
||||
<string name="high_quality_larger">Augstas kvalitātes (lielāks)</string>
|
||||
<string name="check_for_updates">Pārbaudīt atjauninājumus</string>
|
||||
<string name="manual_update_description">Manuāli pārbaudīt, vai ir atjauninājumi</string>
|
||||
|
@ -595,7 +595,6 @@
|
||||
<string name="notification_action_1_title">രണ്ടാം പ്രവർത്തന ബട്ടൺ</string>
|
||||
<string name="notification_action_0_title">ആദ്യ പ്രവർത്തന ബട്ടൺ</string>
|
||||
<string name="disable_media_tunneling_summary">വീഡിയോ കാണുമ്പോൾ കറുത്ത സ്ക്രീൻ, അവ്യക്തത അനുഭവിക്കുന്നു എങ്കിൽ മീഡിയ ട്യൂൺലിങ് പ്രവർത്തനരഹിതമാക്കുക</string>
|
||||
<string name="show_image_indicators_summary">ഉറവിടം തിരിച്ചറിയാൻ പിക്കാസോ കളർഡ് റിബൺ ചിത്രങ്ങളുടെ മുകളിൽ കാണിക്കുക: നെറ്റ്വർക്കിന് ചുവപ്പ്, ഡിസ്കിനു നീല, മെമ്മറിയിക്ക് പച്ച</string>
|
||||
<string name="seekbar_preview_thumbnail_title">സീക്ബാർ ചെറുചിത്രം പ്രദർശനം</string>
|
||||
<string name="detail_heart_img_view_description">സ്നേഹത്തോടെ സൃഷ്ടാവ്</string>
|
||||
<string name="description_select_disable">ഡിസ്ക്രിപ്ഷനിലെ ടെക്സ്റ്റ് സെലക്ട് ചെയ്യുവാൻ അനുവദിക്കാതെ ഇരിക്കുക</string>
|
||||
@ -630,7 +629,6 @@
|
||||
<string name="dont_show">കാണിക്കരുത്</string>
|
||||
<string name="low_quality_smaller">കുറഞ്ഞ നിലവാരം (ചെറുത് )</string>
|
||||
<string name="high_quality_larger">ഉയർന്ന നിലവാരം (വലിയത് )</string>
|
||||
<string name="show_image_indicators_title">ഇമേജ് ഇൻഡിക്കേറ്ററുകൾ കാണിക്കുക</string>
|
||||
<string name="disable_media_tunneling_title">മീഡിയ ട്യൂൺലിങ് പ്രവർത്തനരഹിതമാക്കുക</string>
|
||||
<string name="no_dir_yet">ഡൌൺലോഡ് ഫോൾഡർ ഇത് വരെയും സെറ്റ് ചെയ്തിട്ടില്ല, സ്ഥിര ഡൌൺലോഡ് ഫോൾഡർ ഇപ്പോൾ തിരഞ്ഞെക്കുക</string>
|
||||
<string name="comments_are_disabled">അഭിപ്രായങ്ങൾ പ്രവർത്തനരഹിതമായിരിക്കുന്നു</string>
|
||||
|
@ -644,9 +644,7 @@
|
||||
<string name="local_search_suggestions">Lokale søkeforslag</string>
|
||||
<string name="mark_as_watched">Marker som sett</string>
|
||||
<string name="start_main_player_fullscreen_summary">Ikke start videoer i minispilleren, men bytt til fullskjermsmodus direkte dersom auto-rotering er låst. Du har fremdeles tilgang til minispilleren ved å avslutte fullskjermsvisningen</string>
|
||||
<string name="show_image_indicators_summary">Vis Picasso-fargede bånd på toppen av bilder for å indikere kilde: Rød for nettverk, blå for disk, og grønn for minne</string>
|
||||
<string name="detail_heart_img_view_description">Hjertemerket av skaperen</string>
|
||||
<string name="show_image_indicators_title">Vis bildeindikatorer</string>
|
||||
<string name="main_page_content_swipe_remove">Dra elementer for å fjerne dem</string>
|
||||
<string name="start_main_player_fullscreen_title">Start hovedspiller i fullskjerm</string>
|
||||
<string name="enqueue_next_stream">Still i kø neste</string>
|
||||
|
@ -611,7 +611,6 @@
|
||||
<string name="no_dir_yet">Geen download map ingesteld, kies nu de standaard download map</string>
|
||||
<string name="dont_show">Niet tonen</string>
|
||||
<string name="comments_are_disabled">Reacties zijn uitgeschakeld</string>
|
||||
<string name="show_image_indicators_title">Toon afbeeldingsindicatoren</string>
|
||||
<string name="settings_category_player_notification_title">Speler melding</string>
|
||||
<string name="settings_category_player_notification_summary">Configureer actieve stream melding</string>
|
||||
<string name="notifications">Meldingen</string>
|
||||
|
@ -632,8 +632,6 @@
|
||||
<string name="low_quality_smaller">Lage kwaliteit (kleiner)</string>
|
||||
<string name="high_quality_larger">Hoge kwaliteit (groter)</string>
|
||||
<string name="seekbar_preview_thumbnail_title">Zoekbalk miniatuurafbeelding voorbeeld</string>
|
||||
<string name="show_image_indicators_summary">Toon Picasso-gekleurde linten bovenop afbeeldingen die hun bron aangeven: rood voor netwerk, blauw voor schijf en groen voor geheugen</string>
|
||||
<string name="show_image_indicators_title">Afbeeldingsindicatoren tonen</string>
|
||||
<string name="comments_are_disabled">Reacties zijn uitgeschakeld</string>
|
||||
<string name="remote_search_suggestions">Zoeksuggesties op afstand</string>
|
||||
<string name="local_search_suggestions">Lokale zoeksuggesties</string>
|
||||
|
@ -440,8 +440,6 @@
|
||||
<string name="show_original_time_ago_summary">ߗߋߢߊߟߌ ߟߎ߬ ߞߟߏߜߍ߫ ߓߐߛߎ߲ߡߊ ߟߎ߬ ߦߌ߬ߘߊ߬ߕߐ߫ ߟߋ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߘߐ߫</string>
|
||||
<string name="disable_media_tunneling_title">ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬</string>
|
||||
<string name="disable_media_tunneling_summary">ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ ߣߴߌ ߞߊ߬ ߥߊ߲߬ߊߥߊ߲߬ ߝߌ߲ ߦߋ߫ ߥߟߊ߫ ߜߊߘߊ߲ߜߊߘߊ߲ߠߌ߲ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߐߛߊߙߌ߫ ߕߎߡߊ</string>
|
||||
<string name="show_image_indicators_title">ߞߊ߬ ߖߌ߬ߦߊ߬ߓߍ߫ ߦߌ߬ߘߊ߬ߟߊ߲ ߠߎ߫ ߝߍ߲߬ߛߍ߲߫</string>
|
||||
<string name="show_image_indicators_summary">ߏ߬ ߦߋ߫ ߔߌߛߊߞߏ߫ ߟߊ߫ ߡߙߎߝߋ߫ ߞߟߐ߬ߡߊ ߟߎ߫ ߟߋ߬ ߝߍ߲߬ߛߍ߲߬ ߠߊ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߫ ߞߎ߲߬ߘߐ߫ ߞߵߊ߬ߟߎ߬ ߓߐߛߎ߲ ߦߌ߬ߘߊ߬: ߥߎߟߋ߲߬ߡߊ߲ ߦߋ߫ ߞߙߏ߬ߝߏ ߕߊ ߘߌ߫߸ ߓߊ߯ߡߊ ߦߋ߫ ߝߘߍ߬ ߜߍߟߍ߲ ߕߊ ߘߌ߫ ߊ߬ߣߌ߫ ߝߙߌߛߌߡߊ ߦߋ߫ ߦߟߌߕߏߟߊ߲ ߕߊ ߘߌ߫</string>
|
||||
<string name="export_ongoing">ߟߊ߬ߓߐ߬ߟߌ ߦߴߌߘߐ߫…</string>
|
||||
<string name="start">ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬</string>
|
||||
<string name="comments_are_disabled">ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߟߊߛߊ߬ߣߍ߲ ߠߋ߬</string>
|
||||
|
@ -342,7 +342,6 @@
|
||||
<string name="show_original_time_ago_summary">ସେବାଗୁଡିକରୁ ମୂଳ ଲେଖା ଷ୍ଟ୍ରିମ୍ ଆଇଟମ୍ ଗୁଡିକରେ ଦୃଶ୍ୟମାନ ହେବ</string>
|
||||
<string name="disable_media_tunneling_title">ମିଡିଆ ଟନେଲିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ</string>
|
||||
<string name="disable_media_tunneling_summary">ଯଦି ଆପଣ ଏକ କଳା ପରଦା ଅନୁଭବ କରନ୍ତି କିମ୍ବା ଭିଡିଓ ପ୍ଲେବେକ୍ ଉପରେ ଝୁଣ୍ଟି ପଡ଼ନ୍ତି ତେବେ ମିଡିଆ ଟନେଲିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ ।</string>
|
||||
<string name="show_image_indicators_summary">ଚିତ୍ରଗୁଡ଼ିକର ଉପରେ ପିକାସୋ ରଙ୍ଗୀନ ଫିତା ଦେଖାନ୍ତୁ: ସେମାନଙ୍କର ଉତ୍ସକୁ ସୂଚାଇଥାଏ: ନେଟୱାର୍କ ପାଇଁ ନାଲି, ଡିସ୍କ ପାଇଁ ନୀଳ ଏବଂ ସ୍ମୃତି ପାଇଁ ସବୁଜ</string>
|
||||
<string name="import_title">ଆମଦାନି କରନ୍ତୁ</string>
|
||||
<string name="import_from">ଠାରୁ ଆମଦାନୀ କରନ୍ତୁ</string>
|
||||
<string name="import_ongoing">ଆମଦାନି…</string>
|
||||
@ -657,7 +656,6 @@
|
||||
<string name="playlist_no_uploader">ଅଟୋ-ଜେନେରେଟ୍ (କୌଣସି ଅପଲୋଡର୍ ମିଳିଲା ନାହିଁ)</string>
|
||||
<string name="resize_fill">ପୁରଣ କରନ୍ତୁ</string>
|
||||
<string name="caption_setting_title">କ୍ୟାପସନ୍</string>
|
||||
<string name="show_image_indicators_title">ପ୍ରତିଛବି ସୂଚକ ଦେଖାନ୍ତୁ</string>
|
||||
<string name="show_crash_the_player_summary">ପ୍ଲେୟାର ବ୍ୟବହାର କରିବା ସମୟରେ ଏକ କ୍ରାସ୍ ବିକଳ୍ପ ଦେଖାଏ</string>
|
||||
<string name="check_new_streams">ନୂତନ ଷ୍ଟ୍ରିମ୍ ପାଇଁ ଯାଞ୍ଚ ଚଲାନ୍ତୁ</string>
|
||||
<string name="crash_the_app">ଆପ୍ କ୍ରାସ୍ କରନ୍ତୁ</string>
|
||||
|
@ -626,8 +626,6 @@
|
||||
<string name="error_report_notification_title">ਨਿਊਪਾਈਪ ਖਾਮੀ ਤੋਂ ਪ੍ਰਭਾਵਤ ਹੋਈ ਹੈ, ਇੱਥੇ ਨੱਪ ਕੇ ਰਿਪੋਰਟ ਕਰੋ</string>
|
||||
<string name="error_report_notification_toast">ਇੱਕ ਖਾਮੀ ਪ੍ਰਭਾਵੀ ਹੋਈ ਹੈ, ਨੋਟੀਫੀਕੇਸ਼ਨ ਵੇਖੋ</string>
|
||||
<string name="main_page_content_swipe_remove">ਆਈਟਮਾਂ ਨੂੰ ਇੱਕ ਪਾਸੇ ਖਿੱਚ ਕੇ ਹਟਾਓ</string>
|
||||
<string name="show_image_indicators_title">ਦ੍ਰਿਸ਼ ਸੂਚਕ ਵਿਖਾਓ</string>
|
||||
<string name="show_image_indicators_summary">ਦ੍ਰਿਸ਼ਾਂ ਦੇ ਉੱਪਰ ਉਹਨਾਂ ਦੀ ਸਰੋਤ-ਪਛਾਣ ਲਈ ਪਿਕਾਸੋ ਦੇ ਰੰਗਦਾਰ ਰਿਬਨ ਵਿਖਾਓ : ਨੈੱਟਵਰਕ ਲਈ ਲਾਲ, ਡਿਸਕ ਲਈ ਨੀਲੇ ਤੇ ਮੈਮਰੀ ਲਈ ਹਰੇ</string>
|
||||
<string name="enable_streams_notifications_title">ਨਵੀਂ ਸਟ੍ਰੀਮ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>
|
||||
<string name="detail_pinned_comment_view_description">ਪਿੰਨ ਕੀਤੀ ਟਿੱਪਣੀ</string>
|
||||
<string name="checking_updates_toast">ਅੱਪਡੇਟ ਦੀ ਉਪਲੱਬਧਤਾ ਪਰਖੀ ਜਾ ਰਹੀ…</string>
|
||||
|
@ -649,8 +649,6 @@
|
||||
<string name="dont_show">Nie pokazuj</string>
|
||||
<string name="detail_heart_img_view_description">Serduszko od twórcy</string>
|
||||
<string name="mark_as_watched">Oznacz jako obejrzane</string>
|
||||
<string name="show_image_indicators_summary">Pokazuj kolorowe wstążki Picasso nad obrazami wskazujące ich źródło: czerwone dla sieci, niebieskie dla dysku i zielone dla pamięci</string>
|
||||
<string name="show_image_indicators_title">Pokazuj wskaźniki obrazu</string>
|
||||
<string name="remote_search_suggestions">Zdalne podpowiedzi wyszukiwania</string>
|
||||
<string name="local_search_suggestions">Lokalne podpowiedzi wyszukiwania</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -644,7 +644,6 @@
|
||||
<string name="comments_are_disabled">Os comentários estão desabilitados</string>
|
||||
<string name="mark_as_watched">Marcar como assistido</string>
|
||||
<string name="detail_heart_img_view_description">Curtido pelo criador</string>
|
||||
<string name="show_image_indicators_summary">Exibir fitas coloridas no topo das imagens indicando sua fonte: vermelho para rede, azul para disco e verde para memória</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
<item quantity="one">%1$s download excluído</item>
|
||||
<item quantity="many">%1$s downloads excluídos</item>
|
||||
@ -655,7 +654,6 @@
|
||||
<item quantity="many">%s downloads concluídos</item>
|
||||
<item quantity="other">%s downloads concluídos</item>
|
||||
</plurals>
|
||||
<string name="show_image_indicators_title">Mostrar indicadores de imagem</string>
|
||||
<string name="enqueued_next">Adicionado na próxima posição da fila</string>
|
||||
<string name="enqueue_next_stream">Enfileira a próxima</string>
|
||||
<string name="main_page_content_swipe_remove">Deslize os itens para remove-los</string>
|
||||
|
@ -644,8 +644,6 @@
|
||||
<string name="no_dir_yet">Ainda não foi definida uma pasta de descarregamento, escolha agora a pasta de descarregamento padrão</string>
|
||||
<string name="comments_are_disabled">Comentários estão desativados</string>
|
||||
<string name="mark_as_watched">Marcar como visto</string>
|
||||
<string name="show_image_indicators_summary">Mostrar fitas coloridas de Picasso em cima das imagens que indicam a sua fonte: vermelho para rede, azul para disco e verde para memória</string>
|
||||
<string name="show_image_indicators_title">Mostrar indicadores de imagem</string>
|
||||
<string name="remote_search_suggestions">Sugestões de pesquisa remotas</string>
|
||||
<string name="local_search_suggestions">Sugestões de pesquisa locais</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -644,8 +644,6 @@
|
||||
<string name="low_quality_smaller">Baixa qualidade (menor)</string>
|
||||
<string name="high_quality_larger">Alta qualidade (maior)</string>
|
||||
<string name="comments_are_disabled">Os comentários estão desativados</string>
|
||||
<string name="show_image_indicators_summary">Mostrar fitas coloridas de Picasso em cima das imagens que indicam a sua fonte: vermelho para rede, azul para disco e verde para memória</string>
|
||||
<string name="show_image_indicators_title">Mostrar indicadores de imagem</string>
|
||||
<string name="remote_search_suggestions">Sugestões de pesquisa remotas</string>
|
||||
<string name="local_search_suggestions">Sugestões de pesquisa locais</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -660,8 +660,6 @@
|
||||
<string name="low_quality_smaller">Calitate scăzută (mai mică)</string>
|
||||
<string name="high_quality_larger">Calitate înaltă (mai mare)</string>
|
||||
<string name="seekbar_preview_thumbnail_title">Miniatură de previzualizare în bara de derulare</string>
|
||||
<string name="show_image_indicators_summary">Afișați panglici colorate de Picasso deasupra imaginilor, indicând sursa acestora: roșu pentru rețea, albastru pentru disc și verde pentru memorie</string>
|
||||
<string name="show_image_indicators_title">Afișați indicatorii de imagine</string>
|
||||
<string name="disable_media_tunneling_summary">Dezactivați tunelarea media dacă întâmpinați un ecran negru sau blocaje la redarea video.</string>
|
||||
<string name="processing_may_take_a_moment">Procesarea.. Poate dura un moment</string>
|
||||
<string name="check_for_updates">Verifică dacă există actualizări</string>
|
||||
|
@ -652,8 +652,6 @@
|
||||
<string name="seekbar_preview_thumbnail_title">Миниатюра над полосой прокрутки</string>
|
||||
<string name="detail_heart_img_view_description">Автору видео понравилось это</string>
|
||||
<string name="mark_as_watched">Пометить проигранным</string>
|
||||
<string name="show_image_indicators_summary">Picasso: указать цветом источник изображений (красный — сеть, синий — диск, зелёный — память)</string>
|
||||
<string name="show_image_indicators_title">Цветные метки на изображениях</string>
|
||||
<string name="remote_search_suggestions">Серверные предложения поиска</string>
|
||||
<string name="local_search_suggestions">Локальные предложения поиска</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -646,8 +646,6 @@
|
||||
<item quantity="one">%sちぬダウンロードぬかんりょうさびたん</item>
|
||||
<item quantity="other">%sちぬダウンロードぬかんりょうさびたん</item>
|
||||
</plurals>
|
||||
<string name="show_image_indicators_summary">ピカソー、がぞうぬういに、がぞうくとぅどぅくるしーきびちするしきさいきしーょうひょうじさびーん: あかーネットワーク、あおーディスク、みどぅれーメモリ</string>
|
||||
<string name="show_image_indicators_title">やしがぞうんかいふぃいょうしきひょうじ</string>
|
||||
<string name="processing_may_take_a_moment">しーょりちゅう… くーてーんじがんがかかいんかむしりやびらん</string>
|
||||
<string name="manual_update_description">みーさるバージョンしーゅどうでぃかくにんさびーん</string>
|
||||
<string name="checking_updates_toast">アップデートかくにんちゅう…</string>
|
||||
|
@ -270,7 +270,6 @@
|
||||
<string name="leak_canary_not_available">LeakCanary ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ</string>
|
||||
<string name="enable_leak_canary_summary">ᱢᱮᱢᱚᱨᱤ ᱞᱤᱠᱟᱞ ᱢᱚᱱᱤᱴᱚᱨᱤᱝ ᱦᱤᱯ ᱰᱟᱢᱯᱤᱝ ᱚᱠᱛᱚ ᱨᱮ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱨᱟᱥᱴᱨᱤᱭ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ</string>
|
||||
<string name="enable_disposed_exceptions_title">ᱡᱤᱭᱚᱱ ᱪᱤᱠᱤ ᱠᱷᱚᱱ ᱵᱟᱦᱨᱮ ᱨᱮ ᱵᱷᱮᱜᱟᱨ ᱠᱚ ᱚᱱᱚᱞ ᱢᱮ</string>
|
||||
<string name="show_image_indicators_summary">ᱱᱮᱴᱣᱟᱨᱠ ᱞᱟᱹᱜᱤᱫ red, ᱰᱤᱥᱠ ᱞᱟᱹᱜᱤᱫ blue ᱟᱨ ᱢᱮᱢᱚᱨᱤ ᱞᱟᱹᱜᱤᱫ green</string>
|
||||
<string name="show_crash_the_player_summary">ᱯᱞᱮᱭᱟᱨ ᱵᱮᱵᱷᱟᱨ ᱚᱠᱛᱮ ᱨᱮ ᱠᱨᱟᱥ ᱚᱯᱥᱚᱱ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ</string>
|
||||
<string name="import_title">ᱤᱢᱯᱳᱨᱴ</string>
|
||||
<string name="import_from">ᱤᱢᱯᱚᱨᱴ</string>
|
||||
@ -540,7 +539,6 @@
|
||||
<string name="show_original_time_ago_title">ᱡᱤᱱᱤᱥ ᱠᱚᱨᱮᱱᱟᱜ ᱢᱩᱞ ᱚᱠᱛᱚ ᱧᱮᱞ ᱢᱮ</string>
|
||||
<string name="show_original_time_ago_summary">ᱥᱮᱵᱟ ᱠᱷᱚᱱ ᱚᱨᱡᱤᱱᱤᱭᱟᱞ ᱴᱮᱠᱥᱴ ᱠᱚ ᱥᱴᱨᱤᱢ ᱤᱴᱮᱢ ᱨᱮ ᱧᱮᱞᱚᱜᱼᱟ</string>
|
||||
<string name="disable_media_tunneling_summary">ᱡᱩᱫᱤ ᱟᱢ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱚᱯ ᱨᱮ ᱵᱞᱮᱠ ᱥᱠᱨᱤᱱ ᱟᱨᱵᱟᱝ ᱠᱷᱟᱹᱞᱤ ᱥᱴᱮᱴᱞᱤᱝ ᱮᱢ ᱧᱟᱢᱟ ᱮᱱᱠᱷᱟᱱ ᱢᱤᱰᱤᱭᱟ ᱴᱩᱱᱮᱞᱤᱝ ᱵᱚᱫᱚᱞ ᱢᱮ ᱾</string>
|
||||
<string name="show_image_indicators_title">ᱪᱤᱛᱟᱹᱨ ᱪᱤᱱᱦᱟᱹ ᱠᱚ ᱧᱮᱞ ᱢᱮ</string>
|
||||
<string name="check_new_streams">ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱞᱟᱹᱜᱤᱫ ᱪᱟᱪᱞᱟᱣ ᱢᱮ</string>
|
||||
<string name="create_error_notification">ᱢᱤᱫ error notification ᱛᱮᱭᱟᱨ ᱢᱮ</string>
|
||||
<string name="subscriptions_export_unsuccessful">ᱥᱮᱞᱮᱫ ᱮᱠᱥᱯᱳᱨᱴ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ</string>
|
||||
|
@ -634,8 +634,6 @@
|
||||
<string name="comments_are_disabled">Sos cummentos sunt disabilitados</string>
|
||||
<string name="detail_heart_img_view_description">Su creadore b\'at postu unu coro</string>
|
||||
<string name="mark_as_watched">Marca comente pompiadu</string>
|
||||
<string name="show_image_indicators_summary">Ammustra sos listrones colorados de Picasso in subra de sas immàgines chi indicant sa fonte issoro: ruja pro sa retze, biaita pro su discu e birde pro sa memòria</string>
|
||||
<string name="show_image_indicators_title">Ammustra sos indicadores de immàgines</string>
|
||||
<string name="remote_search_suggestions">Impòsitos de chirca remota</string>
|
||||
<string name="local_search_suggestions">Impòsitos de chirca locales</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -653,8 +653,6 @@
|
||||
<string name="low_quality_smaller">Nízka kvalita (menšie)</string>
|
||||
<string name="high_quality_larger">Vysoká kvalita (väčšie)</string>
|
||||
<string name="seekbar_preview_thumbnail_title">Náhľad miniatúry pri vyhľadávaní</string>
|
||||
<string name="show_image_indicators_summary">Zobrazí farebné pásiky Picasso na obrázkoch podľa ich zdroja: červený pre sieť, modrý pre disk a zelený pre pamäť</string>
|
||||
<string name="show_image_indicators_title">Zobraziť indikátory obrázka</string>
|
||||
<string name="main_page_content_swipe_remove">Potiahnutím vymazať</string>
|
||||
<string name="comments_are_disabled">Komentáre sú zakázané</string>
|
||||
<string name="start_main_player_fullscreen_summary">Ak je automatické otáčanie zablokované, nespustí videá v miniprehrávači, ale prepne sa do celoobrazovkového režimu. Do miniprehrávača sa dostanete po ukončení režimu celej obrazovky</string>
|
||||
|
@ -633,8 +633,6 @@
|
||||
<string name="comments_are_disabled">Fallooyinka waa laxidhay</string>
|
||||
<string name="detail_heart_img_view_description">Kahelay soosaaraha</string>
|
||||
<string name="mark_as_watched">Waan daawaday</string>
|
||||
<string name="show_image_indicators_summary">Soo bandhig shaambado midabka Picasso leh sawirrada dushooda oo tilmaamaya isha laga keenay: guduud waa khadka, buluug waa kaydka gudaha, cagaar waa kaydka K/G</string>
|
||||
<string name="show_image_indicators_title">Tus tilmaamayaasha sawirka</string>
|
||||
<string name="remote_search_suggestions">Soojeedinada raadinta banaanka</string>
|
||||
<string name="local_search_suggestions">Soojeedinada raadinta gudaha</string>
|
||||
<string name="progressive_load_interval_title">Cabirka soodaarida udhexeeya</string>
|
||||
|
@ -644,7 +644,6 @@
|
||||
<string name="mark_as_watched">Означи као одгледано</string>
|
||||
<string name="comments_are_disabled">Коментари су онемогућени</string>
|
||||
<string name="processing_may_take_a_moment">Обрађивање… Може потрајати пар тренутака</string>
|
||||
<string name="show_image_indicators_title">Прикажи индикаторе слике</string>
|
||||
<string name="start_main_player_fullscreen_summary">Не покрећите видео снимке у мини-плејеру, већ директно пређите на режим целог екрана, ако је аутоматска ротација закључана. И даље можете приступити мини-плејеру тако што ћете изаћи из целог екрана</string>
|
||||
<string name="start_main_player_fullscreen_title">Покрени главни плејер преко целог екрана</string>
|
||||
<string name="crash_the_player">Срушите плејер</string>
|
||||
@ -740,7 +739,6 @@
|
||||
<string name="error_report_channel_description">Обавештења за пријаву грешака</string>
|
||||
<string name="import_subscriptions_hint">Увезите или извезите праћења из менија са 3 тачке</string>
|
||||
<string name="audio_track">Аудио снимак</string>
|
||||
<string name="show_image_indicators_summary">Прикажите Picasso обојене траке на врху слика које указују на њихов извор: црвена за мрежу, плава за диск и зелена за меморију</string>
|
||||
<string name="create_error_notification">Направите обавештење о грешци</string>
|
||||
<string name="percent">Проценат</string>
|
||||
<string name="app_update_unavailable_toast">Користите најновију верзију NewPipe-а</string>
|
||||
|
@ -633,7 +633,6 @@
|
||||
<string name="select_night_theme_toast">Du kan välja det natt-tema du föredrar nedan</string>
|
||||
<string name="night_theme_summary">Välj det natt-tema du föredrar — %s</string>
|
||||
<string name="seekbar_preview_thumbnail_title">Sökradens förhandsvisningsminiatyr</string>
|
||||
<string name="show_image_indicators_title">Visa bildindikatorer</string>
|
||||
<string name="local_search_suggestions">Lokala sökningsförslag</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
<item quantity="one">Tog bort %1$s nedladdning</item>
|
||||
@ -651,7 +650,6 @@
|
||||
<string name="main_page_content_swipe_remove">Svep objekt för att ta bort dem</string>
|
||||
<string name="remote_search_suggestions">Förslag via fjärrsökning</string>
|
||||
<string name="start_main_player_fullscreen_summary">Starta inte videor i minispelaren, utan byt till helskärmsläge direkt, om automatisk rotation är låst. Du kan fortfarande komma åt minispelaren genom att gå ut ur helskärmsläge</string>
|
||||
<string name="show_image_indicators_summary">Visa Picasso färgade band ovanpå bilderna som anger deras källa: rött för nätverk, blått för disk och grönt för minne</string>
|
||||
<string name="check_for_updates">Sök efter uppdateringar</string>
|
||||
<string name="manual_update_description">Kolla manuellt efter nya versioner</string>
|
||||
<string name="checking_updates_toast">Söker efter uppdateringar…</string>
|
||||
|
@ -442,7 +442,6 @@
|
||||
<string name="playback_speed_control">ప్లేబ్యాక్ స్పీడ్ నియంత్రణలు</string>
|
||||
<string name="minimize_on_exit_none_description">ఏమిలేదు</string>
|
||||
<string name="disable_media_tunneling_summary">మీరు బ్లాక్ స్క్రీన్ లేదా చలనచిత్రం ప్లేబ్యాక్లో అంతరాయాన్ని అనుభవిస్తే మీడియా టన్నెలింగ్ను నిలిపివేయండి</string>
|
||||
<string name="show_image_indicators_summary">చిత్రాల మూలాన్ని సూచించే విధంగా వాటి పైభాగంలో పికాసో రంగు రిబ్బన్లను చూపండి: నెట్వర్క్ కోసం ఎరుపు, డిస్క్ కోసం నీలం మరియు మెమరీ కోసం ఆకుపచ్చ</string>
|
||||
<string name="show_error_snackbar">లోపం స్నాక్బార్ని చూపండి</string>
|
||||
<string name="app_update_unavailable_toast">మీరు NewPipe యొక్క తాజా సంస్కరణను అమలు చేస్తున్నారు</string>
|
||||
<string name="app_update_available_notification_title">NewPipe నవీకరణ అందుబాటులో ఉంది!</string>
|
||||
@ -455,7 +454,6 @@
|
||||
<string name="low_quality_smaller">తక్కువ నాణ్యత (చిన్నది)</string>
|
||||
<string name="dont_show">చూపించవద్దు</string>
|
||||
<string name="disable_media_tunneling_title">మీడియా టన్నెలింగ్ని నిలిపివేయండి</string>
|
||||
<string name="show_image_indicators_title">చిత్ర సూచికలను చూపు</string>
|
||||
<string name="check_new_streams">కొత్త స్ట్రీమ్ల కోసం తనిఖీని అమలు చేయండి</string>
|
||||
<string name="create_error_notification">ఎర్రర్ నోటిఫికేషన్ను సృష్టించండి</string>
|
||||
<string name="import_title">దిగుమతి</string>
|
||||
|
@ -633,8 +633,6 @@
|
||||
<string name="comments_are_disabled">Yorumlar devre dışı</string>
|
||||
<string name="detail_heart_img_view_description">Yaratıcısınca kalplendi</string>
|
||||
<string name="mark_as_watched">İzlendi olarak işaretle</string>
|
||||
<string name="show_image_indicators_summary">Resimlerin üzerinde kaynaklarını gösteren Picasso renkli şeritler göster: ağ için kırmızı, disk için mavi ve bellek için yeşil</string>
|
||||
<string name="show_image_indicators_title">Resim göstergelerini göster</string>
|
||||
<string name="remote_search_suggestions">Uzak arama önerileri</string>
|
||||
<string name="local_search_suggestions">Yerel arama önerileri</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -646,8 +646,6 @@
|
||||
<string name="seekbar_preview_thumbnail_title">Мініатюра з попереднім переглядом на повзунку поступу</string>
|
||||
<string name="detail_heart_img_view_description">Вподобано автором</string>
|
||||
<string name="mark_as_watched">Позначити переглянутим</string>
|
||||
<string name="show_image_indicators_summary">Показувати кольорові стрічки Пікассо поверх зображень із зазначенням їх джерела: червоний для мережі, синій для диска та зелений для пам’яті</string>
|
||||
<string name="show_image_indicators_title">Показати індикатори зображень</string>
|
||||
<string name="remote_search_suggestions">Віддалені пропозиції пошуку</string>
|
||||
<string name="local_search_suggestions">Локальні пошукові пропозиції</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -624,8 +624,6 @@
|
||||
<string name="comments_are_disabled">Bình luận đã bị tắt</string>
|
||||
<string name="detail_heart_img_view_description">Đã được chủ kênh thả \"thính\"</string>
|
||||
<string name="mark_as_watched">Đánh dấu là đã xem</string>
|
||||
<string name="show_image_indicators_summary">Hiển thị các dải băng màu Picasso trên đầu các hình ảnh cho biết nguồn của chúng: màu đỏ cho mạng, màu lam cho đĩa và màu lục cho bộ nhớ</string>
|
||||
<string name="show_image_indicators_title">Hiện dấu chỉ hình ảnh</string>
|
||||
<string name="remote_search_suggestions">Đề xuất tìm kiếm trên mạng</string>
|
||||
<string name="local_search_suggestions">Đề xuất tìm kiếm cục bộ</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -624,8 +624,6 @@
|
||||
<string name="high_quality_larger">高品质(较大)</string>
|
||||
<string name="detail_heart_img_view_description">被创作者喜爱</string>
|
||||
<string name="mark_as_watched">标记为已观看</string>
|
||||
<string name="show_image_indicators_summary">在图像顶部显示毕加索彩带,指示其来源:红色代表网络,蓝色代表磁盘,绿色代表内存</string>
|
||||
<string name="show_image_indicators_title">显示图像指示器</string>
|
||||
<string name="remote_search_suggestions">远程搜索建议</string>
|
||||
<string name="local_search_suggestions">本地搜索建议</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -668,9 +668,7 @@
|
||||
<string name="feed_create_new_group_button_title">新</string>
|
||||
<string name="feed_group_dialog_delete_message">你係咪要刪除呢個谷?</string>
|
||||
<string name="feed_group_show_only_ungrouped_subscriptions">淨係顯示未成谷嘅訂閱</string>
|
||||
<string name="show_image_indicators_summary">啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中</string>
|
||||
<string name="show_original_time_ago_summary">服務原本嘅字會騷返喺串流項目上面</string>
|
||||
<string name="show_image_indicators_title">影像要推三色碼</string>
|
||||
<string name="disable_media_tunneling_summary">若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦。</string>
|
||||
<string name="import_youtube_instructions">點樣用 Google 匯出嚟匯入 YouTube 訂閱:
|
||||
\n
|
||||
|
@ -624,8 +624,6 @@
|
||||
<string name="seekbar_preview_thumbnail_title">拖動列縮圖預覽</string>
|
||||
<string name="detail_heart_img_view_description">被創作者加心號</string>
|
||||
<string name="mark_as_watched">標記為已觀看</string>
|
||||
<string name="show_image_indicators_summary">在圖片頂部顯示畢卡索彩色絲帶,指示其來源:紅色代表網路、藍色代表磁碟、綠色代表記憶體</string>
|
||||
<string name="show_image_indicators_title">顯示圖片指示器</string>
|
||||
<string name="remote_search_suggestions">遠端搜尋建議</string>
|
||||
<string name="local_search_suggestions">本機搜尋建議</string>
|
||||
<plurals name="deleted_downloads_toast">
|
||||
|
@ -241,7 +241,6 @@
|
||||
<string name="show_memory_leaks_key">show_memory_leaks_key</string>
|
||||
<string name="allow_disposed_exceptions_key">allow_disposed_exceptions_key</string>
|
||||
<string name="show_original_time_ago_key">show_original_time_ago_key</string>
|
||||
<string name="show_image_indicators_key">show_image_indicators_key</string>
|
||||
<string name="show_crash_the_player_key">show_crash_the_player_key</string>
|
||||
<string name="check_new_streams_key">check_new_streams</string>
|
||||
<string name="crash_the_app_key">crash_the_app_key</string>
|
||||
|
@ -486,8 +486,6 @@
|
||||
<string name="disable_media_tunneling_title">Disable media tunneling</string>
|
||||
<string name="disable_media_tunneling_summary">Disable media tunneling if you experience a black screen or stuttering on video playback.</string>
|
||||
<string name="disable_media_tunneling_automatic_info">Media tunneling was disabled by default on your device because your device model is known to not support it.</string>
|
||||
<string name="show_image_indicators_title">Show image indicators</string>
|
||||
<string name="show_image_indicators_summary">Show Picasso colored ribbons on top of images indicating their source: red for network, blue for disk and green for memory</string>
|
||||
<string name="show_crash_the_player_title">Show \"Crash the player\"</string>
|
||||
<string name="show_crash_the_player_summary">Shows a crash option when using the player</string>
|
||||
<string name="check_new_streams">Run check for new streams</string>
|
||||
|
@ -34,13 +34,6 @@
|
||||
app:singleLineTitle="false"
|
||||
app:iconSpaceReserved="false" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="false"
|
||||
android:key="@string/show_image_indicators_key"
|
||||
android:summary="@string/show_image_indicators_summary"
|
||||
android:title="@string/show_image_indicators_title"
|
||||
app:iconSpaceReserved="false" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:defaultValue="false"
|
||||
android:key="@string/show_crash_the_player_key"
|
||||
|
Loading…
Reference in New Issue
Block a user