diff --git a/app/build.gradle b/app/build.gradle index 298ef0833..d0fa5a4e6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.schabi.newpipe" minSdkVersion 19 targetSdkVersion 28 - versionCode 740 - versionName "0.16.2" + versionCode 750 + versionName "0.17.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.java b/app/src/main/java/org/schabi/newpipe/database/Migrations.java index 239fc02bb..9d24dbb08 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.java +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.java @@ -3,15 +3,24 @@ package org.schabi.newpipe.database; import android.arch.persistence.db.SupportSQLiteDatabase; import android.arch.persistence.room.migration.Migration; import android.support.annotation.NonNull; +import android.util.Log; + +import org.schabi.newpipe.BuildConfig; public class Migrations { public static final int DB_VER_11_0 = 1; public static final int DB_VER_12_0 = 2; + public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release"); + private static final String TAG = Migrations.class.getName(); + public static final Migration MIGRATION_11_12 = new Migration(DB_VER_11_0, DB_VER_12_0) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { + if(DEBUG) { + Log.d(TAG, "Start migrating database"); + } /* * Unfortunately these queries must be hardcoded due to the possibility of * schema and names changing at a later date, thus invalidating the older migration @@ -56,6 +65,10 @@ public class Migrations { "ORDER BY creation_date DESC"); database.execSQL("DROP TABLE IF EXISTS watch_history"); + + if(DEBUG) { + Log.d(TAG, "Stop migrating database"); + } } }; } diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java index 41971dfd4..2bc200f05 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java @@ -61,6 +61,7 @@ public class DownloadActivity extends AppCompatActivity { .commit(); } + @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); @@ -86,9 +87,4 @@ public class DownloadActivity extends AppCompatActivity { return super.onOptionsItemSelected(item); } } - - @Override - public void onRestoreInstanceState(Bundle inState){ - super.onRestoreInstanceState(inState); - } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 5202c4b2a..9d8481251 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -75,7 +75,6 @@ import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; -import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.ImageDisplayConstants; @@ -963,7 +962,7 @@ public class VideoDetailFragment } private void showContent() { - AnimationUtils.slideUp(contentRootLayoutHiding,120, 96, 0.06f); + contentRootLayoutHiding.setVisibility(View.VISIBLE); } protected void setInitialData(int serviceId, String url, String name) { @@ -996,9 +995,14 @@ public class VideoDetailFragment @Override public void showLoading() { + super.showLoading(); - contentRootLayoutHiding.setVisibility(View.INVISIBLE); + //if data is already cached, transition from VISIBLE -> INVISIBLE -> VISIBLE is not required + if(!ExtractorHelper.isCached(serviceId, url, InfoItem.InfoType.STREAM)){ + contentRootLayoutHiding.setVisibility(View.INVISIBLE); + } + animateView(spinnerToolbar, false, 200); animateView(thumbnailPlayButton, false, 50); animateView(detailDurationView, false, 100); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index 279b396df..38a322285 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -64,7 +64,6 @@ public abstract class BaseListFragment extends BaseStateFragment implem @Override public void onDetach() { - infoListAdapter.dispose(); super.onDetach(); } @@ -97,8 +96,6 @@ public abstract class BaseListFragment extends BaseStateFragment implem } updateFlags = 0; } - - itemsList.post(infoListAdapter::updateStates); } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 1bac54df8..b469be3b8 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -1,8 +1,11 @@ package org.schabi.newpipe.fragments.list.playlist; +import android.app.Activity; +import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Log; @@ -26,7 +29,9 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue; @@ -36,6 +41,7 @@ import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.ImageDisplayConstants; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ShareUtils; +import org.schabi.newpipe.util.StreamDialogEntry; import org.schabi.newpipe.util.ThemeHelper; import java.util.ArrayList; @@ -130,6 +136,42 @@ public class PlaylistFragment extends BaseListInfoFragment { infoListAdapter.useMiniItemVariants(true); } + private PlayQueue getPlayQueueStartingAt(StreamInfoItem infoItem) { + return getPlayQueue(Math.max(infoListAdapter.getItemsList().indexOf(infoItem), 0)); + } + + @Override + protected void showStreamDialog(StreamInfoItem item) { + final Context context = getContext(); + final Activity activity = getActivity(); + if (context == null || context.getResources() == null || activity == null) return; + + if (item.getStreamType() == StreamType.AUDIO_STREAM) { + StreamDialogEntry.setEnabledEntries( + StreamDialogEntry.enqueue_on_background, + StreamDialogEntry.start_here_on_background, + StreamDialogEntry.append_playlist, + StreamDialogEntry.share); + } else { + StreamDialogEntry.setEnabledEntries( + StreamDialogEntry.enqueue_on_background, + StreamDialogEntry.enqueue_on_popup, + StreamDialogEntry.start_here_on_background, + StreamDialogEntry.start_here_on_popup, + StreamDialogEntry.append_playlist, + StreamDialogEntry.share); + + StreamDialogEntry.start_here_on_popup.setCustomAction( + (fragment, infoItem) -> NavigationHelper.playOnPopupPlayer(context, getPlayQueueStartingAt(infoItem), true)); + } + + StreamDialogEntry.start_here_on_background.setCustomAction( + (fragment, infoItem) -> NavigationHelper.playOnBackgroundPlayer(context, getPlayQueueStartingAt(infoItem), true)); + + new InfoItemDialog(activity, item, StreamDialogEntry.getCommands(context), (dialog, which) -> + StreamDialogEntry.clickOn(which, this, item)).show(); + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (DEBUG) Log.d(TAG, "onCreateOptionsMenu() called with: menu = [" + menu + diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java index 39f7971dd..e279ee21b 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java @@ -2,14 +2,11 @@ package org.schabi.newpipe.info_list; import android.content.Context; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import com.nostra13.universalimageloader.core.ImageLoader; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; @@ -24,6 +21,7 @@ import org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamMiniInfoItemHolder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.OnClickGesture; /* @@ -61,14 +59,14 @@ public class InfoItemBuilder { this.context = context; } - public View buildView(@NonNull ViewGroup parent, @NonNull final InfoItem infoItem, @Nullable StreamStateEntity state) { - return buildView(parent, infoItem, state, false); + public View buildView(@NonNull ViewGroup parent, @NonNull final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { + return buildView(parent, infoItem, historyRecordManager, false); } public View buildView(@NonNull ViewGroup parent, @NonNull final InfoItem infoItem, - @Nullable StreamStateEntity state, boolean useMiniVariant) { + final HistoryRecordManager historyRecordManager, boolean useMiniVariant) { InfoItemHolder holder = holderFromInfoType(parent, infoItem.getInfoType(), useMiniVariant); - holder.updateFromItem(infoItem, state); + holder.updateFromItem(infoItem, historyRecordManager); return holder.itemView; } @@ -83,7 +81,6 @@ public class InfoItemBuilder { case COMMENT: return useMiniVariant ? new CommentsMiniInfoItemHolder(this, parent) : new CommentsInfoItemHolder(this, parent); default: - Log.e(TAG, "Trollolo"); throw new RuntimeException("InfoType not expected = " + infoType.name()); } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java index 7f5b07dbe..d8515e4ba 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.info_list; -import android.app.Activity; +import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.GridLayoutManager; @@ -27,6 +27,7 @@ import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamGridInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamMiniInfoItemHolder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.FallbackViewHolder; import org.schabi.newpipe.util.OnClickGesture; @@ -53,7 +54,7 @@ import java.util.List; * along with NewPipe. If not, see . */ -public class InfoListAdapter extends StateObjectsListAdapter { +public class InfoListAdapter extends RecyclerView.Adapter { private static final String TAG = InfoListAdapter.class.getSimpleName(); private static final boolean DEBUG = false; @@ -74,6 +75,8 @@ public class InfoListAdapter extends StateObjectsListAdapter { private final InfoItemBuilder infoItemBuilder; private final ArrayList infoItemList; + private final HistoryRecordManager recordManager; + private boolean useMiniVariant = false; private boolean useGridVariant = false; private boolean showFooter = false; @@ -89,9 +92,9 @@ public class InfoListAdapter extends StateObjectsListAdapter { } } - public InfoListAdapter(Activity a) { - super(a.getApplicationContext()); - infoItemBuilder = new InfoItemBuilder(a); + public InfoListAdapter(Context context) { + this.recordManager = new HistoryRecordManager(context); + infoItemBuilder = new InfoItemBuilder(context); infoItemList = new ArrayList<>(); } @@ -120,63 +123,52 @@ public class InfoListAdapter extends StateObjectsListAdapter { } public void addInfoItemList(@Nullable final List data) { - if (data != null) { - loadStates(data, infoItemList.size(), () -> addInfoItemListImpl(data)); - } - } - - private void addInfoItemListImpl(@NonNull List data) { - if (DEBUG) { - Log.d(TAG, "addInfoItemList() before > infoItemList.size() = " + infoItemList.size() + ", data.size() = " + data.size()); + if (data == null) { + return; } + if (DEBUG) Log.d(TAG, "addInfoItemList() before > infoItemList.size() = " + + infoItemList.size() + ", data.size() = " + data.size()); int offsetStart = sizeConsideringHeaderOffset(); infoItemList.addAll(data); - if (DEBUG) { - Log.d(TAG, "addInfoItemList() after > offsetStart = " + offsetStart + ", infoItemList.size() = " + infoItemList.size() + ", header = " + header + ", footer = " + footer + ", showFooter = " + showFooter); - } - + if (DEBUG) Log.d(TAG, "addInfoItemList() after > offsetStart = " + offsetStart + + ", infoItemList.size() = " + infoItemList.size() + + ", header = " + header + ", footer = " + footer + + ", showFooter = " + showFooter); notifyItemRangeInserted(offsetStart, data.size()); if (footer != null && showFooter) { int footerNow = sizeConsideringHeaderOffset(); notifyItemMoved(offsetStart, footerNow); - if (DEBUG) Log.d(TAG, "addInfoItemList() footer from " + offsetStart + " to " + footerNow); + if (DEBUG) Log.d(TAG, "addInfoItemList() footer from " + offsetStart + + " to " + footerNow); } } public void addInfoItem(@Nullable InfoItem data) { - if (data != null) { - loadState(data, infoItemList.size(), () -> addInfoItemImpl(data)); - } - } - - private void addInfoItemImpl(@NonNull InfoItem data) { - if (DEBUG) { - Log.d(TAG, "addInfoItem() before > infoItemList.size() = " + infoItemList.size() + ", thread = " + Thread.currentThread()); + if (data == null) { + return; } + if (DEBUG) Log.d(TAG, "addInfoItem() before > infoItemList.size() = " + + infoItemList.size() + ", thread = " + Thread.currentThread()); int positionInserted = sizeConsideringHeaderOffset(); infoItemList.add(data); - if (DEBUG) { - Log.d(TAG, "addInfoItem() after > position = " + positionInserted + ", infoItemList.size() = " + infoItemList.size() + ", header = " + header + ", footer = " + footer + ", showFooter = " + showFooter); - } + if (DEBUG) Log.d(TAG, "addInfoItem() after > position = " + positionInserted + + ", infoItemList.size() = " + infoItemList.size() + + ", header = " + header + ", footer = " + footer + + ", showFooter = " + showFooter); notifyItemInserted(positionInserted); if (footer != null && showFooter) { int footerNow = sizeConsideringHeaderOffset(); notifyItemMoved(positionInserted, footerNow); - if (DEBUG) Log.d(TAG, "addInfoItem() footer from " + positionInserted + " to " + footerNow); - } - } - - public void updateStates() { - if (!infoItemList.isEmpty()) { - updateAllStates(infoItemList); + if (DEBUG) Log.d(TAG, "addInfoItem() footer from " + positionInserted + + " to " + footerNow); } } @@ -185,7 +177,6 @@ public class InfoListAdapter extends StateObjectsListAdapter { return; } infoItemList.clear(); - clearStates(); notifyDataSetChanged(); } @@ -254,7 +245,6 @@ public class InfoListAdapter extends StateObjectsListAdapter { case COMMENT: return useMiniVariant ? MINI_COMMENT_HOLDER_TYPE : COMMENT_HOLDER_TYPE; default: - Log.e(TAG, "Trollolo"); return -1; } } @@ -292,7 +282,6 @@ public class InfoListAdapter extends StateObjectsListAdapter { case COMMENT_HOLDER_TYPE: return new CommentsInfoItemHolder(infoItemBuilder, parent); default: - Log.e(TAG, "Trollolo"); return new FallbackViewHolder(new View(parent.getContext())); } } @@ -304,7 +293,7 @@ public class InfoListAdapter extends StateObjectsListAdapter { // If header isn't null, offset the items by -1 if (header != null) position--; - ((InfoItemHolder) holder).updateFromItem(infoItemList.get(position), getState(position)); + ((InfoItemHolder) holder).updateFromItem(infoItemList.get(position), recordManager); } else if (holder instanceof HFHolder && position == 0 && header != null) { ((HFHolder) holder).view = header; } else if (holder instanceof HFHolder && position == sizeConsideringHeaderOffset() && footer != null && showFooter) { @@ -317,11 +306,9 @@ public class InfoListAdapter extends StateObjectsListAdapter { if (!payloads.isEmpty() && holder instanceof InfoItemHolder) { for (Object payload : payloads) { if (payload instanceof StreamStateEntity) { - ((InfoItemHolder) holder).updateState(infoItemList.get(header == null ? position : position - 1), - (StreamStateEntity) payload); + ((InfoItemHolder) holder).updateState(infoItemList.get(header == null ? position : position - 1), recordManager); } else if (payload instanceof Boolean) { - ((InfoItemHolder) holder).updateState(infoItemList.get(header == null ? position : position - 1), - null); + ((InfoItemHolder) holder).updateState(infoItemList.get(header == null ? position : position - 1), recordManager); } } } else { @@ -329,11 +316,6 @@ public class InfoListAdapter extends StateObjectsListAdapter { } } - @Override - protected void onItemStateChanged(int position, @Nullable StreamStateEntity state) { - notifyItemChanged(header == null ? position : position + 1, state != null ? state : false); - } - public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) { return new GridLayoutManager.SpanSizeLookup() { @Override diff --git a/app/src/main/java/org/schabi/newpipe/info_list/StateObjectsListAdapter.java b/app/src/main/java/org/schabi/newpipe/info_list/StateObjectsListAdapter.java deleted file mode 100644 index 23ae17bac..000000000 --- a/app/src/main/java/org/schabi/newpipe/info_list/StateObjectsListAdapter.java +++ /dev/null @@ -1,189 +0,0 @@ -package org.schabi.newpipe.info_list; - -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; -import android.util.SparseArray; - -import org.schabi.newpipe.BuildConfig; -import org.schabi.newpipe.R; -import org.schabi.newpipe.database.LocalItem; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.SparseArrayUtils; - -import java.util.List; -import java.util.Objects; - -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.CompositeDisposable; - -public abstract class StateObjectsListAdapter extends RecyclerView.Adapter { - - private final SparseArray states; - private final HistoryRecordManager recordManager; - private final CompositeDisposable stateLoaders; - private final Context context; - - public StateObjectsListAdapter(Context context) { - this.states = new SparseArray<>(); - this.recordManager = new HistoryRecordManager(context); - this.context = context; - this.stateLoaders = new CompositeDisposable(); - } - - @Nullable - public StreamStateEntity getState(int position) { - return states.get(position); - } - - protected void clearStates() { - states.clear(); - } - - private void appendStates(List statesEntities, int offset) { - for (int i = 0; i < statesEntities.size(); i++) { - final StreamStateEntity state = statesEntities.get(i); - if (state != null) { - states.append(offset + i, state); - } - } - } - - private void appendState(StreamStateEntity statesEntity, int offset) { - if (statesEntity != null) { - states.append(offset, statesEntity); - } - } - - protected void removeState(int index) { - states.remove(index); - } - - protected void moveState(int from, int to) { - final StreamStateEntity item = states.get(from); - if (from < to) { - SparseArrayUtils.shiftItemsDown(states, from, to); - } else { - SparseArrayUtils.shiftItemsUp(states, to, from); - } - states.put(to, item); - } - - protected void loadStates(List list, int offset, Runnable callback) { - if (isPlaybackStatesVisible()) { - stateLoaders.add( - recordManager.loadStreamStateBatch(list) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(streamStateEntities -> { - appendStates(streamStateEntities, offset); - callback.run(); - }, throwable -> { - if (BuildConfig.DEBUG) throwable.printStackTrace(); - callback.run(); - }) - ); - } else { - callback.run(); - } - } - - protected void loadState(InfoItem item, int offset, Runnable callback) { - if (isPlaybackStatesVisible()) { - stateLoaders.add( - recordManager.loadStreamState(item) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(streamStateEntities -> { - appendState(streamStateEntities[0], offset); - callback.run(); - }, throwable -> { - if (BuildConfig.DEBUG) throwable.printStackTrace(); - callback.run(); - }) - ); - } else { - callback.run(); - } - } - - protected void loadStatesForLocal(List list, int offset, Runnable callback) { - if (isPlaybackStatesVisible()) { - stateLoaders.add( - recordManager.loadLocalStreamStateBatch(list) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(streamStateEntities -> { - appendStates(streamStateEntities, offset); - callback.run(); - }, throwable -> { - if (BuildConfig.DEBUG) throwable.printStackTrace(); - callback.run(); - }) - ); - } else { - callback.run(); - } - } - - private void processStatesUpdates(List streamStateEntities) { - for (int i = 0; i < streamStateEntities.size(); i++) { - final StreamStateEntity newState = streamStateEntities.get(i); - if (!Objects.equals(states.get(i), newState)) { - if (newState == null) { - states.remove(i); - } else { - states.put(i, newState); - } - onItemStateChanged(i, newState); - } - } - } - - protected void updateAllStates(List list) { - if (isPlaybackStatesVisible()) { - stateLoaders.add( - recordManager.loadStreamStateBatch(list) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(this::processStatesUpdates, throwable -> { - if (BuildConfig.DEBUG) throwable.printStackTrace(); - }) - ); - } else { - final int[] positions = SparseArrayUtils.getKeys(states); - states.clear(); - for (int pos : positions) onItemStateChanged(pos, null); - } - } - - protected void updateAllLocalStates(List list) { - if (isPlaybackStatesVisible()) { - stateLoaders.add( - recordManager.loadLocalStreamStateBatch(list) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(this::processStatesUpdates, throwable -> { - if (BuildConfig.DEBUG) throwable.printStackTrace(); - }) - ); - } else { - final int[] positions = SparseArrayUtils.getKeys(states); - states.clear(); - for (int pos : positions) onItemStateChanged(pos, null); - } - } - - public void dispose() { - stateLoaders.dispose(); - } - - protected boolean isPlaybackStatesVisible() { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - return prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true) - && prefs.getBoolean(context.getString(R.string.enable_playback_resume_key), true) - && prefs.getBoolean(context.getString(R.string.enable_playback_state_lists_key), true); - } - - protected abstract void onItemStateChanged(int position, @Nullable StreamStateEntity state); - -} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java index 317934455..956bc47a6 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java @@ -1,14 +1,13 @@ package org.schabi.newpipe.info_list.holder; -import android.support.annotation.Nullable; import android.view.ViewGroup; import android.widget.TextView; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.Localization; /* @@ -40,8 +39,8 @@ public class ChannelInfoItemHolder extends ChannelMiniInfoItemHolder { } @Override - public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) { - super.updateFromItem(infoItem, state); + public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { + super.updateFromItem(infoItem, historyRecordManager); if (!(infoItem instanceof ChannelInfoItem)) return; final ChannelInfoItem item = (ChannelInfoItem) infoItem; diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java index a191707c0..3f4e4e398 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java @@ -1,14 +1,13 @@ package org.schabi.newpipe.info_list.holder; -import android.support.annotation.Nullable; import android.view.ViewGroup; import android.widget.TextView; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.ImageDisplayConstants; import org.schabi.newpipe.util.Localization; @@ -32,7 +31,7 @@ public class ChannelMiniInfoItemHolder extends InfoItemHolder { } @Override - public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) { + public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { if (!(infoItem instanceof ChannelInfoItem)) return; final ChannelInfoItem item = (ChannelInfoItem) infoItem; diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java index 4ecf86961..90212ea31 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java @@ -1,14 +1,13 @@ package org.schabi.newpipe.info_list.holder; -import android.support.annotation.Nullable; import android.view.ViewGroup; import android.widget.TextView; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; /* * Created by Christian Schabesberger on 12.02.17. @@ -41,8 +40,8 @@ public class CommentsInfoItemHolder extends CommentsMiniInfoItemHolder { } @Override - public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) { - super.updateFromItem(infoItem, state); + public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { + super.updateFromItem(infoItem, historyRecordManager); if (!(infoItem instanceof CommentsInfoItem)) return; final CommentsInfoItem item = (CommentsInfoItem) infoItem; diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java index 3d3a9bb09..4794ce3fd 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java @@ -1,18 +1,16 @@ package org.schabi.newpipe.info_list.holder; -import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.text.util.Linkify; -import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import org.jsoup.helper.StringUtil; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.CommentTextOnTouchListener; import org.schabi.newpipe.util.ImageDisplayConstants; @@ -48,7 +46,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { if(hours != null) timestamp += (Integer.parseInt(hours.replace(":", ""))*3600); if(minutes != null) timestamp += (Integer.parseInt(minutes.replace(":", ""))*60); if(seconds != null) timestamp += (Integer.parseInt(seconds)); - return streamUrl + url.replace(match.group(0), "#timestamp=" + String.valueOf(timestamp)); + return streamUrl + url.replace(match.group(0), "#timestamp=" + timestamp); } }; @@ -67,7 +65,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { } @Override - public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) { + public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { if (!(infoItem instanceof CommentsInfoItem)) return; final CommentsInfoItem item = (CommentsInfoItem) infoItem; @@ -76,20 +74,17 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { itemThumbnailView, ImageDisplayConstants.DISPLAY_THUMBNAIL_OPTIONS); - itemThumbnailView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if(StringUtil.isBlank(item.getAuthorEndpoint())) return; - try { - final AppCompatActivity activity = (AppCompatActivity) itemBuilder.getContext(); - NavigationHelper.openChannelFragment( - activity.getSupportFragmentManager(), - item.getServiceId(), - item.getAuthorEndpoint(), - item.getAuthorName()); - } catch (Exception e) { - ErrorActivity.reportUiError((AppCompatActivity) itemBuilder.getContext(), e); - } + itemThumbnailView.setOnClickListener(view -> { + if(StringUtil.isBlank(item.getAuthorEndpoint())) return; + try { + final AppCompatActivity activity = (AppCompatActivity) itemBuilder.getContext(); + NavigationHelper.openChannelFragment( + activity.getSupportFragmentManager(), + item.getServiceId(), + item.getAuthorEndpoint(), + item.getAuthorName()); + } catch (Exception e) { + ErrorActivity.reportUiError((AppCompatActivity) itemBuilder.getContext(), e); } }); @@ -101,7 +96,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); if (itemContentView.getLineCount() == 0) { - itemContentView.post(() -> ellipsize()); + itemContentView.post(this::ellipsize); } else { ellipsize(); } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/InfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/InfoItemHolder.java index 3bc0d9e54..e06419126 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/InfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/InfoItemHolder.java @@ -1,13 +1,12 @@ package org.schabi.newpipe.info_list.holder; -import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; /* * Created by Christian Schabesberger on 12.02.17. @@ -37,8 +36,8 @@ public abstract class InfoItemHolder extends RecyclerView.ViewHolder { this.itemBuilder = infoItemBuilder; } - public abstract void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state); + public abstract void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager); - public void updateState(final InfoItem infoItem, @Nullable final StreamStateEntity state) { + public void updateState(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java index f9d617e66..b73f22d93 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java @@ -1,15 +1,14 @@ package org.schabi.newpipe.info_list.holder; -import android.support.annotation.Nullable; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; 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.ImageDisplayConstants; public class PlaylistMiniInfoItemHolder extends InfoItemHolder { @@ -32,7 +31,7 @@ public class PlaylistMiniInfoItemHolder extends InfoItemHolder { } @Override - public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) { + public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { if (!(infoItem instanceof PlaylistInfoItem)) return; final PlaylistInfoItem item = (PlaylistInfoItem) infoItem; diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java index 25502bc81..ea058bc0e 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java @@ -1,15 +1,14 @@ package org.schabi.newpipe.info_list.holder; -import android.support.annotation.Nullable; import android.text.TextUtils; import android.view.ViewGroup; import android.widget.TextView; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.Localization; /* @@ -42,8 +41,8 @@ public class StreamInfoItemHolder extends StreamMiniInfoItemHolder { } @Override - public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) { - super.updateFromItem(infoItem, state); + public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { + super.updateFromItem(infoItem, historyRecordManager); if (!(infoItem instanceof StreamInfoItem)) return; final StreamInfoItem item = (StreamInfoItem) infoItem; diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java index aa2a3f878..6c685c6cf 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.info_list.holder; -import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.view.View; import android.view.ViewGroup; @@ -13,6 +12,7 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.ImageDisplayConstants; import org.schabi.newpipe.util.Localization; @@ -43,7 +43,7 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder { } @Override - public void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state) { + public void updateFromItem(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { if (!(infoItem instanceof StreamInfoItem)) return; final StreamInfoItem item = (StreamInfoItem) infoItem; @@ -55,10 +55,12 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder { itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(), R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); - if (state != null) { + + StreamStateEntity state2 = historyRecordManager.loadStreamState(infoItem).blockingGet()[0]; + if (state2 != null) { itemProgressView.setVisibility(View.VISIBLE); itemProgressView.setMax((int) item.getDuration()); - itemProgressView.setProgress((int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime())); + itemProgressView.setProgress((int) TimeUnit.MILLISECONDS.toSeconds(state2.getProgressTime())); } else { itemProgressView.setVisibility(View.GONE); } @@ -101,8 +103,10 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder { } @Override - public void updateState(final InfoItem infoItem, @Nullable final StreamStateEntity state) { + public void updateState(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { final StreamInfoItem item = (StreamInfoItem) infoItem; + + StreamStateEntity state = historyRecordManager.loadStreamState(infoItem).blockingGet()[0]; if (state != null && item.getDuration() > 0 && item.getStreamType() != StreamType.LIVE_STREAM) { itemProgressView.setMax((int) item.getDuration()); if (itemProgressView.getVisibility() == View.VISIBLE) { @@ -130,4 +134,4 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder { itemView.setLongClickable(false); itemView.setOnLongClickListener(null); } -} +} \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java index 94672bd49..abdf82353 100644 --- a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java @@ -76,8 +76,6 @@ public abstract class BaseLocalListFragment extends BaseStateFragment } updateFlags = 0; } - - itemsList.post(itemListAdapter::updateStates); } /*////////////////////////////////////////////////////////////////////////// @@ -152,7 +150,6 @@ public abstract class BaseLocalListFragment extends BaseStateFragment public void onDestroyView() { super.onDestroyView(); itemsList = null; - itemListAdapter.dispose(); itemListAdapter = null; } diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index d29e85ee3..4b1a1f363 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.local; -import android.app.Activity; +import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.GridLayoutManager; @@ -11,7 +11,7 @@ import android.view.ViewGroup; import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.stream.model.StreamStateEntity; -import org.schabi.newpipe.info_list.StateObjectsListAdapter; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.local.holder.LocalItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistGridItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistItemHolder; @@ -49,7 +49,7 @@ import java.util.List; * along with NewPipe. If not, see . */ -public class LocalItemListAdapter extends StateObjectsListAdapter { +public class LocalItemListAdapter extends RecyclerView.Adapter { private static final String TAG = LocalItemListAdapter.class.getSimpleName(); private static final boolean DEBUG = false; @@ -68,6 +68,7 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { private final LocalItemBuilder localItemBuilder; private final ArrayList localItems; + private final HistoryRecordManager recordManager; private final DateFormat dateFormat; private boolean showFooter = false; @@ -75,12 +76,12 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { private View header = null; private View footer = null; - public LocalItemListAdapter(Activity activity) { - super(activity.getApplicationContext()); - localItemBuilder = new LocalItemBuilder(activity); + public LocalItemListAdapter(Context context) { + recordManager = new HistoryRecordManager(context); + localItemBuilder = new LocalItemBuilder(context); localItems = new ArrayList<>(); dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, - Localization.getPreferredLocale(activity)); + Localization.getPreferredLocale(context)); } public void setSelectedListener(OnClickGesture listener) { @@ -92,27 +93,19 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { } public void addItems(@Nullable List data) { - if (data != null) { - loadStatesForLocal(data, localItems.size(), () -> addItemsImpl(data)); - } - } - - private void addItemsImpl(@NonNull List data) { - if (DEBUG) { - Log.d(TAG, "addItems() before > localItems.size() = " + - localItems.size() + ", data.size() = " + data.size()); + if (data == null) { + return; } + if (DEBUG) Log.d(TAG, "addItems() before > localItems.size() = " + + localItems.size() + ", data.size() = " + data.size()); int offsetStart = sizeConsideringHeader(); localItems.addAll(data); - if (DEBUG) { - Log.d(TAG, "addItems() after > offsetStart = " + offsetStart + - ", localItems.size() = " + localItems.size() + - ", header = " + header + ", footer = " + footer + - ", showFooter = " + showFooter); - } - + if (DEBUG) Log.d(TAG, "addItems() after > offsetStart = " + offsetStart + + ", localItems.size() = " + localItems.size() + + ", header = " + header + ", footer = " + footer + + ", showFooter = " + showFooter); notifyItemRangeInserted(offsetStart, data.size()); if (footer != null && showFooter) { @@ -124,16 +117,9 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { } } - public void updateStates() { - if (!localItems.isEmpty()) { - updateAllLocalStates(localItems); - } - } - public void removeItem(final LocalItem data) { final int index = localItems.indexOf(data); localItems.remove(index); - removeState(index); notifyItemRemoved(index + (header != null ? 1 : 0)); } @@ -145,7 +131,6 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { if (actualFrom >= localItems.size() || actualTo >= localItems.size()) return false; localItems.add(actualTo, localItems.remove(actualFrom)); - moveState(actualFrom, actualTo); notifyItemMoved(fromAdapterPosition, toAdapterPosition); return true; } @@ -155,7 +140,6 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { return; } localItems.clear(); - clearStates(); notifyDataSetChanged(); } @@ -236,8 +220,9 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { } } + @NonNull @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) { + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int type) { if (DEBUG) Log.d(TAG, "onCreateViewHolder() called with: parent = [" + parent + "], type = [" + type + "]"); switch (type) { @@ -268,7 +253,7 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { } @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (DEBUG) Log.d(TAG, "onBindViewHolder() called with: holder = [" + holder.getClass().getSimpleName() + "], position = [" + position + "]"); @@ -276,7 +261,7 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { // If header isn't null, offset the items by -1 if (header != null) position--; - ((LocalItemHolder) holder).updateFromItem(localItems.get(position), getState(position), dateFormat); + ((LocalItemHolder) holder).updateFromItem(localItems.get(position), recordManager, dateFormat); } else if (holder instanceof HeaderFooterHolder && position == 0 && header != null) { ((HeaderFooterHolder) holder).view = header; } else if (holder instanceof HeaderFooterHolder && position == sizeConsideringHeader() @@ -290,11 +275,9 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { if (!payloads.isEmpty() && holder instanceof LocalItemHolder) { for (Object payload : payloads) { if (payload instanceof StreamStateEntity) { - ((LocalItemHolder) holder).updateState(localItems.get(header == null ? position : position - 1), - (StreamStateEntity) payload); + ((LocalItemHolder) holder).updateState(localItems.get(header == null ? position : position - 1), recordManager); } else if (payload instanceof Boolean) { - ((LocalItemHolder) holder).updateState(localItems.get(header == null ? position : position - 1), - null); + ((LocalItemHolder) holder).updateState(localItems.get(header == null ? position : position - 1), recordManager); } } } else { @@ -302,11 +285,6 @@ public class LocalItemListAdapter extends StateObjectsListAdapter { } } - @Override - protected void onItemStateChanged(int position, @Nullable StreamStateEntity state) { - notifyItemChanged(header == null ? position : position + 1, state != null ? state : false); - } - public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) { return new GridLayoutManager.SpanSizeLookup() { @Override diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 5973ad920..656570943 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.local.dialog; -import android.annotation.SuppressLint; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -28,7 +27,7 @@ import java.util.Collections; import java.util.List; import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.Disposable; +import io.reactivex.disposables.CompositeDisposable; public final class PlaylistAppendDialog extends PlaylistDialog { private static final String TAG = PlaylistAppendDialog.class.getCanonicalName(); @@ -36,7 +35,7 @@ public final class PlaylistAppendDialog extends PlaylistDialog { private RecyclerView playlistRecyclerView; private LocalItemListAdapter playlistAdapter; - private Disposable playlistReactor; + private CompositeDisposable playlistDisposables = new CompositeDisposable(); public static PlaylistAppendDialog fromStreamInfo(final StreamInfo info) { PlaylistAppendDialog dialog = new PlaylistAppendDialog(); @@ -99,9 +98,9 @@ public final class PlaylistAppendDialog extends PlaylistDialog { final View newPlaylistButton = view.findViewById(R.id.newPlaylist); newPlaylistButton.setOnClickListener(ignored -> openCreatePlaylistDialog()); - playlistReactor = playlistManager.getPlaylists() + playlistDisposables.add(playlistManager.getPlaylists() .observeOn(AndroidSchedulers.mainThread()) - .subscribe(this::onPlaylistsReceived); + .subscribe(this::onPlaylistsReceived)); } /*////////////////////////////////////////////////////////////////////////// @@ -111,13 +110,12 @@ public final class PlaylistAppendDialog extends PlaylistDialog { @Override public void onDestroyView() { super.onDestroyView(); - if (playlistReactor != null) playlistReactor.dispose(); + playlistDisposables.dispose(); if (playlistAdapter != null) { - playlistAdapter.dispose(); playlistAdapter.unsetSelectedListener(); } - playlistReactor = null; + playlistDisposables.clear(); playlistRecyclerView = null; playlistAdapter = null; } @@ -151,13 +149,12 @@ public final class PlaylistAppendDialog extends PlaylistDialog { @NonNull List streams) { if (getStreams() == null) return; - @SuppressLint("ShowToast") final Toast successToast = Toast.makeText(getContext(), R.string.playlist_add_stream_success, Toast.LENGTH_SHORT); - manager.appendToPlaylist(playlist.uid, streams) + playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> successToast.show()); + .subscribe(ignored -> successToast.show())); getDialog().dismiss(); } diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java index dd2d67e43..6714edcc5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java @@ -51,6 +51,7 @@ import java.util.List; import io.reactivex.Completable; import io.reactivex.Flowable; import io.reactivex.Maybe; +import io.reactivex.Scheduler; import io.reactivex.Single; import io.reactivex.schedulers.Schedulers; @@ -109,6 +110,11 @@ public class HistoryRecordManager { .subscribeOn(Schedulers.io()); } + public Single deleteCompelteStreamStateHistory() { + return Single.fromCallable(streamStateTable::deleteAll) + .subscribeOn(Schedulers.io()); + } + public Flowable> getStreamHistory() { return streamHistoryTable.getHistory().subscribeOn(Schedulers.io()); } @@ -165,7 +171,7 @@ public class HistoryRecordManager { .subscribeOn(Schedulers.io()); } - public Single deleteWholeSearchHistory() { + public Single deleteCompleteSearchHistory() { return Single.fromCallable(searchHistoryTable::deleteAll) .subscribeOn(Schedulers.io()); } @@ -291,4 +297,5 @@ public class HistoryRecordManager { public Single removeOrphanedRecords() { return Single.fromCallable(streamTable::deleteOrphans).subscribeOn(Schedulers.io()); } + } diff --git a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java index 61f1c6418..149dcfbdf 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java @@ -22,6 +22,7 @@ import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; import org.schabi.newpipe.R; import org.schabi.newpipe.database.LocalItem; +import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; import org.schabi.newpipe.database.stream.StreamStatisticsEntry; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamType; @@ -180,7 +181,7 @@ public class StatisticsPlaylistFragment .observeOn(AndroidSchedulers.mainThread()) .subscribe( howManyDeleted -> Toast.makeText(getContext(), - R.string.view_history_deleted, + R.string.watch_history_deleted, Toast.LENGTH_SHORT).show(), throwable -> ErrorActivity.reportError(getContext(), throwable, @@ -357,6 +358,10 @@ public class StatisticsPlaylistFragment startLoading(true); } + private PlayQueue getPlayQueueStartingAt(StreamStatisticsEntry infoItem) { + return getPlayQueue(Math.max(itemListAdapter.getItemsList().indexOf(infoItem), 0)); + } + private void showStreamDialog(final StreamStatisticsEntry item) { final Context context = getContext(); final Activity activity = getActivity(); @@ -379,8 +384,13 @@ public class StatisticsPlaylistFragment StreamDialogEntry.delete, StreamDialogEntry.append_playlist, StreamDialogEntry.share); + + StreamDialogEntry.start_here_on_popup.setCustomAction( + (fragment, infoItemDuplicate) -> NavigationHelper.playOnPopupPlayer(context, getPlayQueueStartingAt(item), true)); } + StreamDialogEntry.start_here_on_background.setCustomAction( + (fragment, infoItemDuplicate) -> NavigationHelper.playOnBackgroundPlayer(context, getPlayQueueStartingAt(item), true)); StreamDialogEntry.delete.setCustomAction((fragment, infoItemDuplicate) -> deleteEntry(Math.max(itemListAdapter.getItemsList().indexOf(item), 0))); diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java index c00fa1fb4..ed6a9b4cd 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java @@ -1,13 +1,12 @@ package org.schabi.newpipe.local.holder; -import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; import org.schabi.newpipe.database.LocalItem; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import java.text.DateFormat; @@ -40,8 +39,8 @@ public abstract class LocalItemHolder extends RecyclerView.ViewHolder { this.itemBuilder = itemBuilder; } - public abstract void updateFromItem(final LocalItem item, @Nullable final StreamStateEntity state, final DateFormat dateFormat); + public abstract void updateFromItem(final LocalItem item, HistoryRecordManager historyRecordManager, final DateFormat dateFormat); - public void updateState(final LocalItem localItem, @Nullable final StreamStateEntity state) { + public void updateState(final LocalItem localItem, HistoryRecordManager historyRecordManager) { } } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java index 0e6eca9ba..1366bd02e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java @@ -1,13 +1,12 @@ package org.schabi.newpipe.local.holder; -import android.support.annotation.Nullable; import android.view.View; import android.view.ViewGroup; import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.ImageDisplayConstants; import java.text.DateFormat; @@ -23,7 +22,7 @@ public class LocalPlaylistItemHolder extends PlaylistItemHolder { } @Override - public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) { + public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) { if (!(localItem instanceof PlaylistMetadataEntry)) return; final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem; @@ -34,6 +33,6 @@ public class LocalPlaylistItemHolder extends PlaylistItemHolder { itemBuilder.displayImage(item.thumbnailUrl, itemThumbnailView, ImageDisplayConstants.DISPLAY_PLAYLIST_OPTIONS); - super.updateFromItem(localItem, state, dateFormat); + super.updateFromItem(localItem, historyRecordManager, dateFormat); } } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java index 0c4e66c9d..c5d9a6428 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.local.holder; -import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.view.MotionEvent; import android.view.View; @@ -14,12 +13,14 @@ import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.ImageDisplayConstants; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.views.AnimatedProgressBar; import java.text.DateFormat; +import java.util.ArrayList; import java.util.concurrent.TimeUnit; public class LocalPlaylistStreamItemHolder extends LocalItemHolder { @@ -47,7 +48,7 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder { } @Override - public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) { + public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) { if (!(localItem instanceof PlaylistStreamEntry)) return; final PlaylistStreamEntry item = (PlaylistStreamEntry) localItem; @@ -60,6 +61,8 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder { itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(), R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); + + StreamStateEntity state = historyRecordManager.loadLocalStreamStateBatch(new ArrayList() {{ add(localItem); }}).blockingGet().get(0); if (state != null) { itemProgressView.setVisibility(View.VISIBLE); itemProgressView.setMax((int) item.duration); @@ -94,9 +97,11 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder { } @Override - public void updateState(LocalItem localItem, @Nullable StreamStateEntity state) { + public void updateState(LocalItem localItem, HistoryRecordManager historyRecordManager) { if (!(localItem instanceof PlaylistStreamEntry)) return; final PlaylistStreamEntry item = (PlaylistStreamEntry) localItem; + + StreamStateEntity state = historyRecordManager.loadLocalStreamStateBatch(new ArrayList() {{ add(localItem); }}).blockingGet().get(0); if (state != null && item.duration > 0) { itemProgressView.setMax((int) item.duration); if (itemProgressView.getVisibility() == View.VISIBLE) { diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java index b24051a4f..05717392c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java @@ -13,12 +13,14 @@ import org.schabi.newpipe.database.stream.StreamStatisticsEntry; import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.ImageDisplayConstants; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.views.AnimatedProgressBar; import java.text.DateFormat; +import java.util.ArrayList; import java.util.concurrent.TimeUnit; /* @@ -76,7 +78,7 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder { } @Override - public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) { + public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) { if (!(localItem instanceof StreamStatisticsEntry)) return; final StreamStatisticsEntry item = (StreamStatisticsEntry) localItem; @@ -88,6 +90,8 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder { itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(), R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); + + StreamStateEntity state = historyRecordManager.loadLocalStreamStateBatch(new ArrayList() {{ add(localItem); }}).blockingGet().get(0); if (state != null) { itemProgressView.setVisibility(View.VISIBLE); itemProgressView.setMax((int) item.duration); @@ -124,9 +128,11 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder { } @Override - public void updateState(LocalItem localItem, @Nullable StreamStateEntity state) { + public void updateState(LocalItem localItem, HistoryRecordManager historyRecordManager) { if (!(localItem instanceof StreamStatisticsEntry)) return; final StreamStatisticsEntry item = (StreamStatisticsEntry) localItem; + + StreamStateEntity state = historyRecordManager.loadLocalStreamStateBatch(new ArrayList() {{ add(localItem); }}).blockingGet().get(0); if (state != null && item.duration > 0) { itemProgressView.setMax((int) item.duration); if (itemProgressView.getVisibility() == View.VISIBLE) { diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java index 2a81f9571..c5f1813c7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java @@ -1,14 +1,13 @@ package org.schabi.newpipe.local.holder; -import android.support.annotation.Nullable; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import org.schabi.newpipe.R; import org.schabi.newpipe.database.LocalItem; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import java.text.DateFormat; @@ -33,7 +32,7 @@ public abstract class PlaylistItemHolder extends LocalItemHolder { } @Override - public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) { + public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) { itemView.setOnClickListener(view -> { if (itemBuilder.getOnItemSelectedListener() != null) { itemBuilder.getOnItemSelectedListener().selected(localItem); diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java index bdcd42f67..f9542850e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java @@ -1,13 +1,12 @@ package org.schabi.newpipe.local.holder; -import android.support.annotation.Nullable; import android.view.ViewGroup; import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.ImageDisplayConstants; import org.schabi.newpipe.util.Localization; @@ -23,7 +22,7 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder { } @Override - public void updateFromItem(final LocalItem localItem, @Nullable final StreamStateEntity state, final DateFormat dateFormat) { + public void updateFromItem(final LocalItem localItem, HistoryRecordManager historyRecordManager, final DateFormat dateFormat) { if (!(localItem instanceof PlaylistRemoteEntity)) return; final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem; @@ -35,6 +34,6 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder { itemBuilder.displayImage(item.getThumbnailUrl(), itemThumbnailView, ImageDisplayConstants.DISPLAY_PLAYLIST_OPTIONS); - super.updateFromItem(localItem, state, dateFormat); + super.updateFromItem(localItem, historyRecordManager, dateFormat); } } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 640174ab7..a8750ed47 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -511,6 +511,10 @@ public class LocalPlaylistFragment extends BaseLocalListFragment NavigationHelper.playOnPopupPlayer(context, getPlayQueueStartingAt(item), true)); } + StreamDialogEntry.start_here_on_background.setCustomAction( + (fragment, infoItemDuplicate) -> NavigationHelper.playOnBackgroundPlayer(context, getPlayQueueStartingAt(item), true)); StreamDialogEntry.set_as_playlist_thumbnail.setCustomAction( (fragment, infoItemDuplicate) -> changeThumbnailUrl(item.thumbnailUrl)); StreamDialogEntry.delete.setCustomAction( diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java index 9a53e7e94..a2727c29b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java @@ -130,7 +130,6 @@ public class SubscriptionFragment extends BaseStateFragment { FragmentManager fragmentManager = getFM(); NavigationHelper.openWhatsNewFragment(fragmentManager); @@ -430,12 +426,12 @@ public class SubscriptionFragment extends BaseStateFragment> getDeleteObserver(){ + private Observer> getDeleteObserver() { return new Observer>() { @Override public void onSubscribe(Disposable d) { diff --git a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java index 46e7c1fdc..e256070ca 100644 --- a/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/BasePlayer.java @@ -187,6 +187,7 @@ public abstract class BasePlayer implements protected MediaSessionManager mediaSessionManager; private boolean isPrepared = false; + private Disposable stateLoader; //////////////////////////////////////////////////////////////////////////*/ @@ -283,16 +284,14 @@ public abstract class BasePlayer implements ) { simpleExoPlayer.seekTo(playQueue.getIndex(), queue.getItem().getRecoveryPosition()); return; + } else if (intent.getBooleanExtra(RESUME_PLAYBACK, false) && isPlaybackResumeEnabled()) { final PlayQueueItem item = queue.getItem(); - if (item != null && item.getRecoveryPosition() == PlayQueueItem.RECOVERY_UNSET && isPlaybackResumeEnabled()) { - final Disposable stateLoader = recordManager.loadStreamState(item) + if (item != null && item.getRecoveryPosition() == PlayQueueItem.RECOVERY_UNSET) { + stateLoader = recordManager.loadStreamState(item) .observeOn(AndroidSchedulers.mainThread()) - .doFinally(() -> { - if (simpleExoPlayer == null) return; // doFinally called while closing - initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence, - /*playOnInit=*/true); - }) + .doFinally(() -> initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence, + /*playOnInit=*/true)) .subscribe( state -> queue.setRecovery(queue.getIndex(), state.getProgressTime()), error -> { @@ -334,13 +333,13 @@ public abstract class BasePlayer implements simpleExoPlayer.removeListener(this); simpleExoPlayer.stop(); simpleExoPlayer.release(); - simpleExoPlayer = null; } if (isProgressLoopRunning()) stopProgressLoop(); if (playQueue != null) playQueue.dispose(); if (audioReactor != null) audioReactor.dispose(); if (playbackManager != null) playbackManager.dispose(); if (mediaSessionManager != null) mediaSessionManager.dispose(); + if (stateLoader != null) stateLoader.dispose(); if (playQueueAdapter != null) { playQueueAdapter.unsetSelectedListener(); @@ -1050,27 +1049,33 @@ public abstract class BasePlayer implements private void savePlaybackState(final StreamInfo info, final long progress) { if (info == null) return; if (DEBUG) Log.d(TAG, "savePlaybackState() called"); - final Disposable stateSaver = recordManager.saveStreamState(info, progress) - .observeOn(AndroidSchedulers.mainThread()) - .doOnError((e) -> { - if (DEBUG) e.printStackTrace(); - }) - .onErrorComplete() - .subscribe(); - databaseUpdateReactor.add(stateSaver); + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + if (prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true)) { + final Disposable stateSaver = recordManager.saveStreamState(info, progress) + .observeOn(AndroidSchedulers.mainThread()) + .doOnError((e) -> { + if (DEBUG) e.printStackTrace(); + }) + .onErrorComplete() + .subscribe(); + databaseUpdateReactor.add(stateSaver); + } } private void resetPlaybackState(final PlayQueueItem queueItem) { if (queueItem == null) return; - final Disposable stateSaver = queueItem.getStream() - .flatMapCompletable(info -> recordManager.saveStreamState(info, 0)) - .observeOn(AndroidSchedulers.mainThread()) - .doOnError((e) -> { - if (DEBUG) e.printStackTrace(); - }) - .onErrorComplete() - .subscribe(); - databaseUpdateReactor.add(stateSaver); + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + if (prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true)) { + final Disposable stateSaver = queueItem.getStream() + .flatMapCompletable(info -> recordManager.saveStreamState(info, 0)) + .observeOn(AndroidSchedulers.mainThread()) + .doOnError((e) -> { + if (DEBUG) e.printStackTrace(); + }) + .onErrorComplete() + .subscribe(); + databaseUpdateReactor.add(stateSaver); + } } public void resetPlaybackState(final StreamInfo info) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 82604f7da..25b443b1b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -274,7 +274,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { else if (v instanceof String) prefEdit.putString(key, ((String) v)); } - prefEdit.apply(); + prefEdit.commit(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java index d28c3179c..cf5425a50 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java @@ -18,7 +18,7 @@ import io.reactivex.disposables.Disposable; public class HistorySettingsFragment extends BasePreferenceFragment { private String cacheWipeKey; - private String viewsHistroyClearKey; + private String viewsHistoryClearKey; private String searchHistoryClearKey; private HistoryRecordManager recordManager; private CompositeDisposable disposables; @@ -27,7 +27,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); cacheWipeKey = getString(R.string.metadata_cache_wipe_key); - viewsHistroyClearKey = getString(R.string.clear_views_history_key); + viewsHistoryClearKey = getString(R.string.clear_views_history_key); searchHistoryClearKey = getString(R.string.clear_search_history_key); recordManager = new HistoryRecordManager(getActivity()); disposables = new CompositeDisposable(); @@ -46,16 +46,31 @@ public class HistorySettingsFragment extends BasePreferenceFragment { Toast.LENGTH_SHORT).show(); } - if (preference.getKey().equals(viewsHistroyClearKey)) { + if (preference.getKey().equals(viewsHistoryClearKey)) { new AlertDialog.Builder(getActivity()) .setTitle(R.string.delete_view_history_alert) .setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss())) .setPositiveButton(R.string.delete, ((dialog, which) -> { + final Disposable onDeletePlaybackStates = recordManager.deleteCompelteStreamStateHistory() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + howManyDeleted -> Toast.makeText(getActivity(), + R.string.watch_history_states_deleted, + Toast.LENGTH_SHORT).show(), + throwable -> ErrorActivity.reportError(getContext(), + throwable, + SettingsActivity.class, null, + ErrorActivity.ErrorInfo.make( + UserAction.DELETE_FROM_HISTORY, + "none", + "Delete view history", + R.string.general_error))); + final Disposable onDelete = recordManager.deleteWholeStreamHistory() .observeOn(AndroidSchedulers.mainThread()) .subscribe( howManyDeleted -> Toast.makeText(getActivity(), - R.string.view_history_deleted, + R.string.watch_history_deleted, Toast.LENGTH_SHORT).show(), throwable -> ErrorActivity.reportError(getContext(), throwable, @@ -78,6 +93,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment { "none", "Delete search history", R.string.general_error))); + disposables.add(onDeletePlaybackStates); disposables.add(onClearOrphans); disposables.add(onDelete); })) @@ -90,7 +106,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment { .setTitle(R.string.delete_search_history_alert) .setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss())) .setPositiveButton(R.string.delete, ((dialog, which) -> { - final Disposable onDelete = recordManager.deleteWholeSearchHistory() + final Disposable onDelete = recordManager.deleteCompleteSearchHistory() .observeOn(AndroidSchedulers.mainThread()) .subscribe( howManyDeleted -> Toast.makeText(getActivity(), diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index b70e5fdef..c4471942e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -228,6 +228,10 @@ public final class ExtractorHelper { }); } + public static boolean isCached(final int serviceId, final String url, InfoItem.InfoType infoType) { + return null != loadFromCache(serviceId, url, infoType).blockingGet(); + } + /** * A simple and general error handler that show a Toast for known exceptions, and for others, opens the report error activity with the (optional) error message. */ diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManager.java b/app/src/main/java/us/shandian/giga/service/DownloadManager.java index c2bba7396..b168ef474 100644 --- a/app/src/main/java/us/shandian/giga/service/DownloadManager.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManager.java @@ -666,9 +666,9 @@ public class DownloadManager { continue; if (mission.running) - paused = true; - else running = true; + else + paused = true; } } diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index ebc6e94c2..e53ab4f1f 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -122,14 +122,8 @@ public class MissionAdapter extends Adapter { break; } - if (mStartButton != null && mPauseButton != null) switch (msg.what) { - case DownloadManagerService.MESSAGE_DELETED: - case DownloadManagerService.MESSAGE_ERROR: - case DownloadManagerService.MESSAGE_FINISHED: - case DownloadManagerService.MESSAGE_PAUSED: - checkMasterButtonsVisibility(); - break; - } + if (mStartButton != null && mPauseButton != null) + checkMasterButtonsVisibility(); } }; @@ -163,8 +157,7 @@ public class MissionAdapter extends Adapter { mPendingDownloadsItems.remove(h); if (mPendingDownloadsItems.size() < 1) { setAutoRefresh(false); - if (mStartButton != null) mStartButton.setVisible(false); - if (mPauseButton != null) mPauseButton.setVisible(false); + checkMasterButtonsVisibility(); } } @@ -664,11 +657,11 @@ public class MissionAdapter extends Adapter { if (mEmptyMessage.getVisibility() != flag) mEmptyMessage.setVisibility(flag); } - private void checkMasterButtonsVisibility() { + public void checkMasterButtonsVisibility() { boolean[] state = mIterator.hasValidPendingMissions(); - mStartButton.setVisible(state[0]); - mPauseButton.setVisible(state[1]); + mPauseButton.setVisible(state[0]); + mStartButton.setVisible(state[1]); } public void ensurePausedMissions() { diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index f8cecbed9..69c8e8f50 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -138,6 +138,7 @@ public class MissionsFragment extends Fragment { * deprecated in API level 23, * but must remain to allow compatibility with api<23 */ + @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); @@ -273,6 +274,7 @@ public class MissionsFragment extends Fragment { } mBinder.addMissionEventListener(mAdapter.getMessenger()); + mAdapter.checkMasterButtonsVisibility(); } if (mBinder != null) mBinder.enableNotifications(false); } diff --git a/app/src/main/res/menu/download_menu.xml b/app/src/main/res/menu/download_menu.xml index 4e4549957..f91f8ad7b 100644 --- a/app/src/main/res/menu/download_menu.xml +++ b/app/src/main/res/menu/download_menu.xml @@ -1,11 +1,13 @@ - + tools:ignore="AlwaysShowAction" + app:showAsAction="always" /> لا يمكن حذف قائمة التشغيل. ملئ الشاشة تكبير - حجم خط التسمية - أصغر خط - خط عادي - خط ذو حجم كبير - مُزامَنة تنزيل ملف البث الإشارات المرجعية استعمال التقديم السريع الغير دقيق @@ -354,7 +349,7 @@ محو سجل المشاهدة احذف سِجل الفيديوهات التي تم تشغيلها حذف سجل المشاهدة بالكامل\? - تم حذف سجل المشاهدة. + تم حذف سجل المشاهدة. محو سجل البحث يحذف تاريخ البحث عن الكلمات الرئيسية حذف سِجل البحث بالكامل\? @@ -496,6 +491,5 @@ لا توجد تعليقات تعذر تحميل التعليقات - التشغيل مباشرة في الخلفية إغلاق \ No newline at end of file diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index b256888cb..e371e03ff 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -368,11 +368,6 @@ RELLENAR ZOOM - Tamañu de fonte de sotítulos - Fonte más pequeña - Fonte media - Fonte más grande - Activar LeakCanary La supervisión d\'escapes de memoria podría facer que l\'aplicación nun respuenda al volquiar la pila diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index f3fa08377..08d74d525 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -143,7 +143,7 @@ Ачысціць гісторыю праглядаў Выдаліць гісторыю прайграных патокаў Выдаліць усю гісторыю праглядаў. - Гісторыя праглядаў выдалена. + Гісторыя праглядаў выдалена. Ачысціць гісторыю пошуку Выдаліць гісторыю пошукавых запытаў Выдаліць усю гісторыю пошуку. @@ -405,5 +405,4 @@ Фонавы плэер Плэер у акне Адпісацца - Іграць \"у фоне\" \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 87be750be..5758bfb90 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -216,7 +216,7 @@ Експортиране на историята, абонаментите и плейлистите Изтрий историята с изгледани Изтрий цялата история с изгледани\? - Историята с изгледани е изтрита. + Историята с изгледани е изтрита. Изтрий историята на търсенията Изтрива историята с въвежданите за търсене ключови думи Изтрий цялата история на търсенията\? diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index b75e7cee5..5ad960c75 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -333,18 +333,13 @@ Omple Escala Generats automàticament - Mida dels subtítols - Mida més petita - Mida normal - Mida més gran Habilita el LeakCanary Darrera exportació No s\'han pogut importar les subscripcions No s\'han pogut exportar les subscripcions Desvincula (pot provocar distorsió) - Nightcore Elimina totes les dades de llocs web de la memòria cau - Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició. + Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició Mostra els missatges d\'ajuda Mostra un missatge d\'ajuda quan el botó de mode en segon pla o emergent estigui premut a la pàgina de detalls d\'un vídeo Què ha passat:\\nPetició:\\nIdioma del contingut:\\nServei:\\nHora GMT:\\nPaquet:\\nVersió:\\nVersió del SO: @@ -376,7 +371,7 @@ Esborra l\'historial de reproduccions Esborra l\'historial dels vídeos que s\'han reproduït Voleu esborrar tot l\'historial de reproduccions\? - S\'ha esborrat l\'historial de reproduccions. + S\'ha esborrat l\'historial de reproduccions. Esborra l\'historial de cerca Esborra l\'historial de paraules cercades Voleu esborrar tot l\'historial de cerca\? @@ -465,6 +460,13 @@ Reproducció automàtica No hi ha comentaris No s\'han pogut carregar els comentaris - Reprodueix directament en segon pla Tanca + S\'estan utilitzant les pestanyes per defecte, s\'ha produït un error en llegir les pestanyes desades + Mostra una notificació per demanar l\'actualització de l\'aplicació si hi ha una nova versió disponible + Toca per baixar + El servidor no està enviant dades + + Comentaris + + \ No newline at end of file diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index e460f5508..a98969a1e 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -134,7 +134,6 @@ 不支持该网址 默认内容的国家 服务 - 默认内容的语言 播放器 行为 视频与音频 @@ -188,7 +187,7 @@ 导出历史记录、订阅和播放列表 删除播放过的媒体历史记录 确定要清除所有观看历史记录吗? - 观看历史记录已清除。 + 观看历史记录已清除。 清除搜索历史记录 清除搜索关键词的历史记录 确定要清除所有搜索历史记录吗? diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index ed90b7114..7d9a03c08 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -316,13 +316,7 @@ otevření ve vyskakovacím okně Přizpůsobit Vyplnit Zvětšit - Velikost písma nadpisu - Menší písmo - Normální písmo - Větší písmo Sledovat únik paměti - Sledování úniku paměti vypnuto - Sledování úniku paměti povoleno, aplikace může při zátěži přestat reagovat Ladění "Automaticky generováno " Povolit službu LeakCanary @@ -377,7 +371,6 @@ otevření ve vyskakovacím okně Rychlost Výška tónu Rozpojit (může způsobit zkreslení) - Nightcore mód Výchozí nastavení Ke stažení nejsou dostupné žádné streamy Preferovaná \'otevřít\' akce @@ -388,7 +381,7 @@ otevření ve vyskakovacím okně Vymazat historii sledování Vymaže historii přehrávaných streamů Vymazat celkovou historii sledování\? - Historie sledování smazána. + Historie sledování smazána. Vymazat historii vyhledávání Vymaže historii vyhledávaných klíčových slov Vymazat celkovou historii vyhledávání\? @@ -492,7 +485,6 @@ otevření ve vyskakovacím okně Žádné komentáře Nelze načíst komentáře - Přehrát přímo na pozadí Zavřít Stahování na externí SD kartu ještě není možné. Resetovat umístění složky pro stahování\? \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 7a051e7a8..67d1128dc 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -158,7 +158,7 @@ Slet visningshistorik Sletter historikken for viste videoer Slet hele visningshistorikken\? - Visningshistorikken blev slettet. + Visningshistorikken blev slettet. Slet søgehistorik Sletter historikken for søgeord Slet hele søgehistorikken\? diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 78995b446..ff75b74c6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -302,9 +302,7 @@ Vorschaubild der Wiedergabeliste geändert. Konnte Wiedergabeliste nicht löschen. Keine Untertitel - Schriftgröße der Untertitel Abbrechen - Normale Schriftgröße Stream-Datei herunterladen Schnelle, ungenaue Suche verwenden Mit ungenauem Suchen kann die Abspielposition schneller erreicht werden, aber auf Kosten der Genauigkeit @@ -314,8 +312,6 @@ Dateiname darf nicht leer sein Ein Fehler ist aufgetreten: %1$s Automatisch erzeugt - Kleinere Schrift - Größere Schrift LeakCanary aktivieren Import von Export nach @@ -344,7 +340,6 @@ Geschwindigkeit Tonhöhe Verknüpfung aufheben (kann zu Verzerrungen führen) - Nightcore Standard Abschalten, um das Laden von Miniaturansichten zu verhindern, was Daten- und Speicherverbrauch spart. Änderungen löschen den Bildzwischenspeicher sowohl im Arbeitsspeicher als auch auf dem internen Speicher. Nächsten Stream automatisch einreihen @@ -378,7 +373,7 @@ Wiedergabeverlauf löschen Löscht den Verlauf der abgespielten Streams Den ganzen Wiedergabeverlauf löschen\? - Wiedergabeverlauf gelöscht. + Wiedergabeverlauf gelöscht. Suchverlauf löschen Löscht den Verlauf der Suchbegriffe Den gesamten Suchverlauf löschen\? @@ -482,6 +477,5 @@ Keine Kommentare Kommentare konnten nicht geladen werden - Direkt im Hintergrund wiedergeben Schließen \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9a573c5c8..3484c0e58 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -175,7 +175,7 @@ Εκκαθάριση ιστορικού προβολής Διαγράφει το ιστορικό των ροών που έχουν αναπαραχθεί Διαγραφή ολόκληρου του ιστορικού προβολής; - Το στορικό προβολής διαγράφηκε. + Το στορικό προβολής διαγράφηκε. Διαγραφή ιστορικού αναζητήσεων Διαγράφει το ιστορικό αναζητήσεών σας Διαγραφή ολόκληρου του ιστορικού αναζητήσεων; @@ -475,6 +475,5 @@ Χωρίς σχόλια Δεν ήταν δυνατή η φόρτωση σχολίων - Αναπαραγωγή απευθείας στο παρασκήνιο Κλείσιμο \ No newline at end of file diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 668708130..42d46cb95 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -1,4 +1,4 @@ - + %1$s vidoj Eldonita je %1$s @@ -15,7 +15,6 @@ turno Uzi eksteran videoludilon Uzi eksteran sonludilon - Defaŭlta distingivo Ludi per Kodi Montri \"Ludi per Kodi\"-opcion @@ -24,7 +23,6 @@ Etoso Malluma Luma - Elŝuti Sekva video Ligilo ne subtenita @@ -37,7 +35,6 @@ Eraro Reteraro Enhavo ne estas disponebla - Ŝatoj Malŝatoj Uzi la programon Tor @@ -55,27 +52,22 @@ Elŝutujo por videoj Elŝutujo por muziko (Eksperimenta) Devigi elŝuttrafikon tra Tor por pli bona privateco (elsendfluaj videoj estas ankoraŭ ne subtenitaj). - Montri opcion por ludi videon per la aplikaĵo Kodi Dosierujo por konservi elŝutitajn videojn Dosierujo por konservi elŝutitan muzikon Elektu lokon por konservi elŝutitajn videojn - Elektu lokon por konservi elŝutitan muzikon - Enhavo Raporti eraron per retpoŝto RAPORTI Informoj: Via komento (en la angla): Detaloj: - - Raporti eraron Video Reprovi -Tapu serĉo por komenci - Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin) + Tapu serĉo por komenci + Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin). Malfermi en ŝprucfenestron modon Iuj rezolucioj NE havos aŭdion kiam ĉi tiu eblo estas ebligita NewPipe ŝprucfenestron modon @@ -83,20 +75,16 @@ Abonita Kanalo malabonita Neebla ŝanĝi abonon - Elŝutu dosieron. + Elŝutu dosieron Ne eblas ĝisdatigi abonon Montri informon - Ĉefa Abonoj Legosigno - Kio novas - Fono ŝprucfenestron Aldonu al - Aŭtomata play Ludas video kiam NewPipe vokas de alia programo Defaŭlta popup rezolucio @@ -109,4 +97,4 @@ Uzu rapide, ne preciza serĉon Ne preciza serĉo permesas al la ludanto serĉi poziciojn pli rapide kun malalta precizeco Ŝarĝi bildetojn - + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f61584639..fcc5afda9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -322,8 +322,6 @@ abrir en modo popup La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión Auto-encolar la siguiente transmisión Añadir de forma automática un vídeo relacionado con el último vídeo reproducido en una cola no repetitiva - DIRECTO - SINCRONIZAR Archivo Archivo movido o eliminado No existe el directorio @@ -375,7 +373,7 @@ abrir en modo popup Borrar historial de reproducciones Elimina el historial de las transmisiones reproducidas ¿Eliminar todo el historial de reproducciones\? - Historial de reproducciones eliminado. + Historial de reproducciones eliminado. Borrar historial de búsqueda Elimina el historial de palabras clave de búsqueda ¿Eliminar todo el historial de búsqueda\? @@ -498,6 +496,5 @@ abrir en modo popup Sin comentarios No se pudo cargar comentarios - Reproducir directamente en segundo plano Cerrar \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 1a1f6e145..baad94b5d 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -137,7 +137,7 @@ Puhasta vaatamiste ajalugu Kustutab vaadatud voogude ajaloo Kas kustutada kogu vaatamiste ajalugu\? - Vaatamiste ajalugu kustutati. + Vaatamiste ajalugu kustutati. Kustuta otsinguajalugu Kustutab otsisõnade ajaloo Kas kustutada kogu otsinguajalugu\? diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 7fe0bfd31..5379b6104 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -290,7 +290,7 @@ Garbitu ikusitakoaren historiala Jotako jarioen historiala ezabatzen du Ezabatu ikusitakoaren historia osoa\? - Ikusitakoaren historiala ezabatuta. + Ikusitakoaren historiala ezabatuta. Garbitu bilaketa historiala Ezabatu bilaketa gakoen historiala Ezabatu bilaketen historia osoa\? @@ -374,7 +374,6 @@ Tempoa Tonua Deslotu (distortsioa sor lezake) - Nightcore Lehenetsia Ezarpenak ere inportatu nahi dituzu? Bilaketa ez zehatzak posizioak azkarrago baina prezisio gutxiagoz bilatzea ahalbidetzen du @@ -477,6 +476,5 @@ Iruzkinik ez Ezin izan dira iruzkinak kargatu - Erreproduzitu zuzenean bigarren planoan Itxi \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 3e0124ea0..7646eb437 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -55,10 +55,10 @@ خطا خطای شبکه نمی‌توان تمام بندانگشتی‌ها را بار کرد - نمی‌توان امضای نشانی اینترنتی ویدیو را رمزگشایی کرد. - نمی‌توان پایگاه وب را تجزیه کرد. - نمی‌توان پایگاه وب را به صورت کامل تجزیه کرد. - محتوا در دسترس نیست. + نمی‌توان امضای نشانی اینترنتی ویدیو را رمزگشایی کرد + نمی‌توان پایگاه وب را تجزیه کرد + نمی‌توان پایگاه وب را به صورت کامل تجزیه کرد + محتوا در دسترس نیست نمی‌توان فهرست بارگیری را برپا ساخت. جریان‌های زنده هنوز پشتیبانی نمی‌شوند نمی‌توان هیچ جریانی را گرفت @@ -170,7 +170,7 @@ هیچ بهترین وضوح تمام تاریخچه نمایش پاک شود؟ - تاریخچه نمایش پاک شد. + تاریخچه نمایش پاک شد. پاک‌کردن تاریخچه جستجو تاریخچه کلیدواژه‌های جستجو را پاک می‌کند تمام تاریخچه جستجو پاک شود؟ diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 71bf922d1..063700509 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -315,7 +315,7 @@ Poista katseluhistoria Poistaa toistohistorian Poista koko katseluhistoria. - Katseluhistoria onnistuneesti poistettu. + Katseluhistoria onnistuneesti poistettu. Poista hakuhistoria Poistaa historian haetuista videoista Poista koko hakuhistoria. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 35843d656..64914be6a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -308,10 +308,6 @@ Aucuns sous-titres Ajuster Zoom - Taille des sous-titres - Petite - Normale - Grande Recherche rapide approximative Permettre au lecteur d\'accéder plus rapidement à une position au détriment de la précision Charger les miniatures @@ -373,12 +369,11 @@ Sous-titres Modifier la taille du texte et les styles d\'arrière-plan du lecteur. Redémarrage requis pour prendre effet. Ton - Nightcore Aucune application installée pour lire ce fichier Effacer l\'historique Supprimer l\'historique des flux regardés Supprimer tout l\'historique regardé \? - Historique des vidéos vues supprimé. + Historique des vidéos vues supprimé. Supprimer l\'historique des recherches Supprimer l\'historique de recherche par mot clef Supprimer tout l\'historique de recherche \? @@ -483,6 +478,5 @@ Pas de commentaires Impossible de charger les commentaires - Jouer directement en arrière-plan Fermer \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 5f11c4fab..899a9be10 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -93,7 +93,6 @@ Este URL non está soportado País predeterminado para o contido Servizo - Idioma predeterminado do contido Reprodutor Comportamento Vídeo e audio @@ -152,7 +151,7 @@ Limpar historial de reproducións Elimina o historial de emisións reproducidas Elimina todo o historial de reproducións. - O historial de reproducións foi eliminado. + O historial de reproducións foi eliminado. Limpar o historial de procura Elimina o historial de termos procurados Elimina todo o historial de procura. diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index de77881f2..07fc6ab6f 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -277,7 +277,7 @@ מטמון נתוני העל התרוקן ייצוא היסטוריה, מינויים ורשימות נגינה מחיקת היסטוריית הצפייה - היסטוריית הצפייה נמחקה. + היסטוריית הצפייה נמחקה. מחיקת היסטוריית החיפוש היסטוריית החיפוש נמחקה. הקובץ אינו קיים או שחסרה הרשאה לקרוא אותו או לכתוב אליו @@ -471,7 +471,6 @@ מספר הניסיונות החוזרים המרבי בטרם ביטול ההורדה להשהות בעת מעבר לתקשורת נתונים סלולרית הורדות שלא ניתן להשהות יופעלו מחדש - בהמתנה הצגת תגובות יש להשבית כדי להפסיק הצגת תגובות ניגון אוטומטי @@ -483,6 +482,5 @@ אין תגובות לא ניתן לטעון תגובות - לנגן ישירות ברקע סגירה \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index d2877a9df..44edee145 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -310,10 +310,6 @@ फिट भरें ज़ूम करें - कैप्शन फ़ॉंट आकार - छोटे फ़ॉंट - सामांय फ़ॉंट - बड़ा फ़ॉंट डीबग करें ऑटो-जनरेटेड LeakCanary सक्षम करें @@ -337,7 +333,7 @@ देखे हुए वीडियो की सूची साफ करें चलाये गए स्ट्रीम का इतिहास साफ करता है देखे गए सभी का इतिहास साफ करें\? - देखे हुए का इतिहास साफ कर दिया गया। + देखे हुए का इतिहास साफ कर दिया गया। ढूंढने के इतिहास को साफ करें ढूंढे गए शब्दो का इतिहास साफ करता है पूरे खोज इतिहास को मिटा दे \? diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 29398b6a8..e85d5810e 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -276,10 +276,6 @@ Ispuniti Povećaj Auto generirano - Veličina fonta naslova - Manji font - Normalni font - Veći font Omogući \"LeakCanary\" Monitoring curenja memorije može uzrokovati greške u radu aplikacije prilikom odlaganje gomile Izvijestite o pogreškama izvan životnog ciklusa @@ -307,7 +303,7 @@ Očisti povijest gledanja Briše povijest reproduciranih streamova Obriši cijelu povijest gledanja\? - Povijest gledanja izbrisana. + Povijest gledanja izbrisana. Obriši povijest pretraživanja Obriši cijelu povijest pretraživanja\? Povijest pretraživanja obrisana. @@ -478,7 +474,6 @@ Nema komentara Komentare nije moguće učitati - Sviraj izravno u pozadini Zatvori NewPipe je copyleft libre software: možete ga koristiti, proučavati i poboljšavati po volji. Konkretno, možete ga redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila Free Software Foundation, bilo verzije 3 Licence, ili (po vašem izboru) bilo koje kasnije verzije. "Projekt NewPipe ozbiljno shvaća vašu privatnost. Stoga aplikacija ne prikuplja nikakve podatke bez vašeg pristanka. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 251f4cc3f..f53024709 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -215,7 +215,7 @@ Megtekintési előzmények törlése Eltávolítja a megtekintési előzményeket Törlöd az összes megtekintési előzményt\? - Megtekintési előzmények törölve. + Megtekintési előzmények törölve. Keresési előzmények törlése Eltávolítja a kereséshez használt kifejezéseket az előzményekből Törlöd az összes keresési előzményt\? diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 8e0890c3c..2131974b3 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -312,12 +312,7 @@ Isi Perbesar Otomatis dibuat - Ukuran fon deskripsi - Fon lebih kecil - Fon normal - Fon lebih besar Aktifkan LeakCanary - Nightcore Bawaan Pemutar stream tidak ditemukan (anda bisa memasang VLC untuk memutarnya). Unduh berkas stream @@ -327,7 +322,7 @@ Hapus riwayat tontonan Hapus riwayat stream yang telah diputar Hapus seluruh riwayat tontonan\? - Riwayat tontonan dihapus. + Riwayat tontonan dihapus. Hapus riwayat pencarian Hapus riwayat lema pencarian Hapus seluruh riwayat pencarian\? @@ -476,6 +471,5 @@ Tidak ada komentar Tidak bisa memuat komentar - Putar di latar belakang Tutup \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f5bb31b1e..f9308ec8f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -310,10 +310,6 @@ Rientrato Pieno Ingrandito - Dimensione dei caratteri dei sottotitoli - Carattere più piccolo - Carattere normale - Carattere più grande A breve qualcosa apparirà qui ;D Debug Generato automaticamente @@ -325,7 +321,6 @@ La ricerca imprecisa permette al lettore multimediale di spostarsi nelle posizioni più velocemente con una precisione ridotta Metti in coda automaticamente il prossimo flusso Aggiungi automaticamente uno stream correlato raggiunta la fine della coda se la ripetizione è disattivata - SINCRONIZZAZIONE File Nessuna cartella Nessun file o cartella che contiene sorgenti @@ -367,7 +362,6 @@ Tempo Tono Scollega (può causare distorsione) - Nightcore Valore predefinito Nessun flusso disponibile per il download \'Apri\' preferibilmente con @@ -378,7 +372,7 @@ Pulisci cronologia visualizzazioni Elimina la cronologia dei flussi riprodotti Elimina l\'intera cronologia delle visualizzazioni\? - Cronologia visualizzazioni eliminata. + Cronologia visualizzazioni eliminata. Pulisci cronologia delle ricerche Cancella la cronologia dei termini di ricerca Elimina l\'intera cronologia delle ricerche\? @@ -482,6 +476,5 @@ Nessun commento Impossibile caricare i commenti - Riproduci direttamente in sottofondo Chiudi \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 13d232121..f4e33d454 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -294,7 +294,6 @@ プレイリストのサムネイルを変更しました。 プレイリストを削除できませんでした。 字幕表示なし - 字幕の文字サイズ インポート/エクスポート インポート インポート元 @@ -312,7 +311,7 @@ ポップアップ再生の順番待ちに追加 再生履歴を消去 再生した動画の履歴を削除します - 再生履歴を削除しました。 + 再生履歴を削除しました。 検索履歴を消去 検索キーワードの履歴を削除します 検索履歴を削除しました。 @@ -463,9 +462,9 @@ メインページに表示されるタブ 新しいバージョンが利用可能なときにアプリの更新を確認する通知を表示します ダウンロードから %s の保留中の転送を続行します - モバイルデータ通信に切り替え時に休止 - 休止できないダウンロードが再開されます - 接続タイムアウト + モバイルデータ通信に切替時に、一時停止する + 一時停止できない場合は再開して継続されます + コメントを表示 無効にするとコメントの表示を停止します 自動再生 @@ -473,7 +472,6 @@ コメントはありません コメントを読み込めませんでした - バックグラウンドで直接再生 閉じる - コメントを表示 - \ No newline at end of file + 接続タイムアウト + diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 478664ced..c82e0044b 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -257,7 +257,6 @@ 기본 콘텐츠 국가 서비스 디버그 - 라이브 (LIVE) 항상 한번만 디바이스 방향 토글 @@ -315,11 +314,6 @@ 채우기 확대 자동 생성됨 - 자막 폰트 크기 - 작은 폰트 - 보통 폰트 - 큰 폰트 - 동기화 LeakCanary 할성화 힙 덤프 중 메모리 누수 점검으로 앱이 불안정해질 수 있습니다 out-of-lifecycle 오류 보고 @@ -368,7 +362,6 @@ 템포 피치 영상과 소리 분리 (소리가 깨질 수 있음) - 나이트코어 기본 다운로드 가능한 스트림이 없습니다 이 파일을 재생할 수 있는 플레이어 앱이 없습니다 @@ -381,7 +374,7 @@ 시청 기록 삭제하기 동영상 시청 기록을 삭제합니다 모든 시청 기록을 삭제하시겠습니까\? - 동영상 시청 기록이 삭제되었습니다. + 동영상 시청 기록이 삭제되었습니다. 검색 기록 삭제 검색 기록을 모두 삭제합니다 모든 검색 기록을 삭제하시겠습니까\? @@ -481,6 +474,5 @@ 댓글 없음 댓글을 불러올 수 없음 - 백그라운드에서 바로 재생 닫기 \ No newline at end of file diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index edb78cc3c..43fe9d862 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -362,10 +362,6 @@ Priartinti Automatiškai sugeneruotas - Antraštės šrifto dydis - Mažesnis šriftas - Normalus šriftas - Didesnis šriftas Įjungti LeakCanary Atminties nutekėjimo stebėjimas gali padaryti programėlę nestabilią diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 3d37d6a0f..ca1721115 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -368,10 +368,6 @@ Зумирај Автоматски создадено - Големина на преводот - Помал фонт - Нормален фонт - Поголем фонт Вклучи LeakCanary Следењето на мемориските грешки може да ја прикочува апликацијата @@ -414,12 +410,11 @@ Темпо Тон Откачи (може да создаде мутации) - „Nightcore“ Стандардно Избриши историја на гледаност Ја брише историјата на пуштени видеа Избриши ја целата историја на гледаност. - Избришана е историјата на гледаност. + Избришана е историјата на гледаност. Избриши историја на пребарувања Ја брише историјата на пребарувања Избриши ја целата историја на пребарувања. diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index dcc41f17c..01655bd2a 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -158,7 +158,7 @@ Hapuskan sejarah tontonan Hapuskan sejarah strim yang telah dimain Padamkan seluruh sejarah tontonan\? - Sejarah tontonan dipadamkan. + Sejarah tontonan dipadamkan. Hapuskan sejarah carian Padamkan sejarah kata kunci carian Padamkan seluruh sejarah carian\? diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index a3e2d2938..dfb221ee8 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -310,10 +310,6 @@ Tilpass Fyll Forstørr - Bildetekstens størrelse - Mindre skrift - Normal skrift - Større skrift Bruk raskt unøyaktig blafring Feilretting Fil @@ -353,7 +349,7 @@ Tøm avspillingshistorikk Slett historikken for avspilte strømmer Slett hele visningshistorikken\? - Visningshistorikk slettet. + Visningshistorikk slettet. Tøm søkehistorikk Sletter historikken for søkte nøkkelord Slett hele søkehistorikken\? @@ -383,7 +379,6 @@ Rapporter feil som opptrer utenfor sin levetid Tving rapportering av uleverbare Rx-unntak utenom fragment eller aktivitetslevetid etter forkastelse Avhekt (kan forårsake forvrenging) - Nightcore NewPipes personvernspraksis NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke programmet inn data uten ditt samtykke. \nNewPipes personvernspraksis forklarer i detalj hvilken deta som sendes og lagres når du sender en kræsjrapport. @@ -478,6 +473,5 @@ Ingen kommenterer Kunne ikke laste inn kommentarer - Spill direkte i bakgrunnen Lukk \ No newline at end of file diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 4d264f24b..2dd854acf 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -367,12 +367,11 @@ Tempo Toon Ontkoppelen (kan ruis veroorzaken) - Nightcore Standaard Kijkgeschiedenis wissen Verwijdert de geschiedenis van afgespeelde streams De ganse kijkgeschiedenis verwijderen\? - Kijkgeschiedenis verwijderd. + Kijkgeschiedenis verwijderd. Zoekgeschiedenis wissen Verwijdert de gebruikte zoektermen De ganse zoekgeschiedenis verwijderen\? @@ -474,6 +473,5 @@ Geen commentaren Kan commentaren niet laden - Rechtstreeks in achtergrond afspelen Sluiten \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index cf6565439..b53ed1d90 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -310,10 +310,6 @@ Inpassen Opvullen Inzoomen - Lettergrootte van bijschrift - Kleiner lettertype - Normaal lettertype - Groter lettertype Hier zal binnenkort iets verschijnen ;D Foutopsporing Automatisch gegenereerd @@ -325,7 +321,6 @@ Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie Volgende stream automatisch in wachtrij plaatsen Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst - SYNCHRONISEREN Bestand Deze map bestaat niet Bestand/Inhoudsbron bestaat niet @@ -367,7 +362,6 @@ Tempo Toon Ontlinken (kan ruis veroorzaken) - Nightcore Standaard Voorkeursactie voor openen Standaardactie bij openen van inhoud — %s @@ -378,7 +372,7 @@ Kijkgeschiedenis wissen Verwijdert de geschiedenis van afgespeelde streams De gehele kijkgeschiedenis wissen\? - Kijkgeschiedenis gewist. + Kijkgeschiedenis gewist. Zoekgeschiedenis wissen Verwijdert de gebruikte zoektermen De gehele zoekgeschiedenis wissen\? @@ -482,6 +476,5 @@ Geen reacties Kan reacties niet laden - Direct spelen in achtergrond Sluiten \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index fbdc106bd..11ecf9d96 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -375,7 +375,7 @@ Wyczyść historię oglądania Usuwa historię odtworzonych strumieni Usunąć całą historię oglądania\? - Usunięto historię oglądania. + Usunięto historię oglądania. Wyczyść historię wyszukiwania Usuwa historię wyszukiwania słów kluczowych Usunąć całą historię wyszukiwania\? @@ -479,6 +479,5 @@ Brak komentarzy Nie można załadować komentarzy - Odtwarzaj bezpośrednio w tle Zamknij \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6d1c21f33..83eca913a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -371,7 +371,7 @@ abrir em modo popup "Limpar histórico de já assistidos " Deleta o histórico de videos já reproduzidos Deletar todo o histórico de já reproduzidos\? - Histórico de já assistidos deletado. + Histórico de já assistidos deletado. Limpar histórico de pesquisa Deleta histórico de palavras chave pesquisadas Deletar todo o histórico de pesquisa\? @@ -476,6 +476,5 @@ abrir em modo popup Não há comentários Não foi possível carregar comentários - Reproduzir diretamente em segundo plano Fechar \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index ab0f807fe..821b9d086 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -353,7 +353,7 @@ Utilizadores Apaga o histórico dos vídeos reproduzidos Apagar todo o histórico de visualizações\? - Histórico de vídeos apagado. + Histórico de vídeos apagado. Apagar histórico de pesquisas Apaga o histórico de palavras-chave pesquisadas Apagar todo o histórico de pesquisa\? @@ -475,6 +475,5 @@ Sem comentários Não foi possível carregar comentários - Reproduzir diretamente no fundo Fechar \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index a37df98e9..5c65ee30b 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -358,7 +358,7 @@ pentru a deschide în mod pop-up Fișier șters Notificare actualizare aplicație Notificări pentru noi versiuni NewPipe - Afișare istoric șters. + Afișare istoric șters. Șterge istoric căutare Ștergere istoric căutare cuvinte cheie Șterge întregul istoric căutare\? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index faae30dcd..fb2abaec1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -15,7 +15,7 @@ Выбор браузера поворот Путь для скачанного видео - Путь для сохранения скачанного видео + Папка для хранения загруженных видео Введите путь к папке для скачивания видео Разрешение по умолчанию Воспроизвести в Kodi @@ -27,7 +27,7 @@ Скачать Следующее URL не поддерживается - Показывать \"Следующее\" и \"Похожие\" видео + \"Следующее\" и \"Похожие\" видео Язык контента по умолчанию Видео и аудио Внешний вид @@ -239,8 +239,8 @@ Удалить Вы подписаны Подписка отменена - Показывать \"Зажмите, чтобы добавить\" - Показывать подсказку при нажатии кнопок всплывающего окна или фонового воспроизведения на странице сведений о видео + \"Зажмите, чтобы добавить\" + Показать подсказку при нажатии \"В окне\" или \"В фоне\" на странице сведений о видео [Неизвестно] Восстановление после ошибки плеера В фоне @@ -331,7 +331,6 @@ Заполнить Приблизить Созданы автоматически - Синхронизировать Включить LeakCanary Мониторинг утечки памяти может привести к зависанию приложения Сообщать об ошибках жизненного цикла @@ -378,7 +377,7 @@ Изменить размер текста и стиль титров. Нужен перезапуск Очистить историю просмотров Удалить всю историю просмотров\? - История просмотров удалена + История просмотров удалена Очистить историю поиска Удалить историю запросов поиска Удалить историю воспроизведённых потоков @@ -487,5 +486,4 @@ Нет комментариев Не удалось загрузить комментарии - Играть сейчас в фоне \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index b3c5ffe62..1760e8ade 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -314,10 +314,6 @@ Prispôsobiť Vyplniť Zväčšiť - Veľkosť písma titulkov - Menšie Písmo - Normálne Písmo - Väčšie Písmo Používať rýchly posun Rýchly posun umožňuje prejsť na novú pozíciu rýchlejšie, ale s menšou presnosťou Načítanie miniatúr @@ -380,12 +376,11 @@ Rýchlosť Výška "Spomalenie (môže spôsobovať skreslenie)" - Nightcore režim Predvolené Vymazať históriu pozretí Odstráni históriu prehrávaných streamov Vymazať celú históriu pozretí. - História pozretí bola vymazaná. + História pozretí bola vymazaná. Vymazať históriu vyhľadávania Vymaže históriu vyhľadávania kľúčových slov Vymazať celú históriu vyhľadávania. diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 0fef06279..d5f031ad8 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -47,9 +47,9 @@ Светла Изглед Грешка мреже - Одредиште преузимања за аудио + Фолдер преузимања за аудио Унесите путању за преузимање аудио фајлова - Путања за упис преузетих аудио фајлова + Овде се чувају преузети аудио-снимци Направљен директоријум за преузимање „%1$s“ Не могу да направим директоријум за преузимање„ %1$s“ Грешка @@ -133,7 +133,7 @@ Очисти Позадина Прозорче - Неке резолуције биће БЕЗ звука када је ова опција укључена + Уклања звук на неким резолуцијама Упамти величину и позицију искачућег прозора Памти последњу величину и позицију искачућег прозорчета Контроле прејера потезом @@ -243,7 +243,7 @@ Нема плејера тока (можете инсталирати ВЛЦ). Преузимање фајла тока Прикажи податке - Обележивачи + Сачуване плејлисте Додај у Подразумевана држава за садржај Услуга @@ -259,4 +259,16 @@ Да бисте добили више информација и најновије вести о ЊуПајпу посетите наш вебсајт. Задржи за стављање у ред Пусти одавде + Користи брзо, али непрецизно премотавање + Омогућава плејеру да брже долази до позиције уз смањену прецизност + Учитавање слика + Искључите како се не би преузимале слике, чиме ћете смањити количину пренетог саобраћаја и потрошњу меморије. Промена ове опције ће уклонити слике из радне и трајне меморије. + Очишћен кеш са сликама + Уклони кеширане метаподатке + Уклони све податке о кешираним веб-странама + Откажи претплату + Нова картица + Одабери картицу + Приказивање коментара + Искључите како се не би приказивали коментари \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 18ceb75a4..0d583a41b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -320,7 +320,7 @@ Rensa visningshistorik Tar bort historiken för spelade videoklipp Ta bort hela visningshistoriken\? - Visningshistorik borttagen. + Visningshistorik borttagen. Rensa sökhistorik Tar bort historiken för sökta nyckelord Ta bort hela sökhistoriken\? diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index a90739766..6f71a8b97 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -93,7 +93,7 @@ ஒரு முறை கோப்பு பார்த்த வரலாற்றை நீக்கு - பார்த்த வரலாறு அழிக்கப்பட்டது. + பார்த்த வரலாறு அழிக்கப்பட்டது. பார்த்த வரலாற்றை நீக்கு தேடல் வரலாறு அழிக்கப்பட்டது. கோப்பு பெயர் காலியாக இருக்க முடியாது @@ -121,7 +121,6 @@ தேடப்பட்ட வாக்கியத்தை அமைவிடத்தில் சேமிக்கவும் ஆதரிக்கப்படாத URL இயல்புநிலை தகவல்களின் நாடு - தகவல்களின் இயல்பு மொழி பிழைதிருத்து உள்ளடக்கம் வயது வரம்புக்கு உட்பட்டது diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-th/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 92ee7ccc8..a64dc320f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -310,10 +310,6 @@ Sığdır Doldur Yakınlaştır - Alt yazı boyutu - Daha küçük yazı tipi - Normal yazı tipi - Daha büyük yazı tipi Hata ayıklama Yakında bir şeyler burada görünecek ;D Kendiliğinden Oluşturulan @@ -325,7 +321,6 @@ İsabetsiz konumlama, oynatıcının daha düşük hassasiyetle daha hızlı pozisyon aramasını sağlar Sonraki akışı otomatik kuyruğa ekle Yinelenmeyen bir kuyruktaki son akışı oynatırken, ilgili bir akışı kendiliğinden ekle - EŞZAMANLA Dosya Böyle bir dizin yok Dosya/içerik kaynağı değil @@ -368,7 +363,6 @@ Öntanımlı Ses titreşimi Bağlantısız (bozulmaya neden olabilir) - Nightcore İndirilebilecek akış yok Tercih edilen \'aç\' eylemi İçerik açılırken öntanımlı eylem — %s @@ -378,7 +372,7 @@ İzleme geçmişini temizle Oynatılan akışların geçmişini siler İzleme geçmişinin tamamı silinsin mi\? - İzleme geçmişi silindi. + İzleme geçmişi silindi. Arama geçmişini temizle Aramada kullanılan anahtar kelimelerin geçmişini siler Tüm arama geçmişi silinsin mi\? @@ -481,6 +475,5 @@ Yorum yok Yorumlar yüklenemedi - Arka planda direkt başlat Kapat \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index eaa3f922e..75a60d264 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -379,7 +379,7 @@ Очистити історію переглядів Видаляє історію відтворень Видалити всю історію переглядів\? - Історію переглядів видалено. + Історію переглядів видалено. Очистити історію пошуку Видаляє історію пошукових ключових слів Видалити всю історію пошуку\? @@ -484,6 +484,5 @@ Коментарі відсутні Не вдалося підвантажити коментарів - Програвати у фоні Закрити \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 33781230d..16171429e 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -222,7 +222,7 @@ Xóa lịch sử xem Xóa lịch sử của các luồng đã phát Xóa toàn bộ lịch sử xem\? - Đã xóa lịch sử xem. + Đã xóa lịch sử xem. Xóa lịch sử tìm kiếm Xóa lịch sử của từ khóa tìm kiếm Xóa toàn bộ lịch sử tìm kiếm\? diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0b9241f75..9aa4b9245 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -383,10 +383,6 @@ 放大填充 自动生成 - 字幕字体大小 - 小字体 - 中等字体 - 大字体 启用 LeakCanary 内存泄露监测可能会在heap dumping时导致应用失去响应 @@ -426,7 +422,6 @@ 速度 音调 Unhook(可能导致失真) - Nightcore 默认 未安装能播放此文件的应用 @@ -436,7 +431,7 @@ 清除观看记录 删除视频观看记录 删除全部观看记录。 - 观看记录已删除。 + 观看记录已删除。 清除搜索记录 删除搜索关键词记录 删除全部搜索记录。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 605ad5928..50e16464e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -306,10 +306,6 @@ 合適的 填滿 縮放 - 標題字體大小 - 縮小字體 - 正常字體 - 加大字體 某些東西即將在此出現 ;D 除錯 自動產生 @@ -321,7 +317,6 @@ 粗略的尋找能讓播放器以降低的精確度更快找到影片的進度位置 自動將下一部影片新增至佇列 在非重複播放佇列中最後一個串流開始播放時,自動新增相關串流 - 同步 檔案 無效的資料夾 無效的檔案/內容來源 @@ -363,7 +358,6 @@ 節奏 音高 解除連結(可能導致失真) - Nightcore 預設 偏好的「開啟」動作 開啟內容時的預設動作 — %s @@ -374,7 +368,7 @@ 清除觀看歷史 刪除播放過的串流歷史 刪除所有觀看歷史記錄? - 觀看歷史已刪除。 + 觀看歷史已刪除。 清除搜尋歷史 刪除搜尋關鍵字的歷史 刪除所有搜尋歷史記錄? @@ -477,6 +471,5 @@ 沒有留言 無法載入留言 - 直接在背景播放 關閉 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 916a31230..91b0953cc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -173,7 +173,8 @@ Clear watch history Deletes the history of played streams Delete entire watch history? - Watch history deleted. + Watch history deleted. + Playback positions deleted. Clear search history Deletes history of search keywords Delete entire search history? diff --git a/fastlane/metadata/android/en-US/changelogs/750.txt b/fastlane/metadata/android/en-US/changelogs/750.txt new file mode 100644 index 000000000..a22084523 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/750.txt @@ -0,0 +1,23 @@ +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks + + +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 + +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 +