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 279b396dfe2..38a32228560 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 void onAttach(Context context) { @Override public void onDetach() { - infoListAdapter.dispose(); super.onDetach(); } @@ -97,8 +96,6 @@ public void onResume() { } updateFlags = 0; } - - itemsList.post(infoListAdapter::updateStates); } /*////////////////////////////////////////////////////////////////////////// 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 39f7971dd61..e279ee21bb3 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 @@ 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.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 InfoItemBuilder(Context context) { 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 @@ private InfoItemHolder holderFromInfoType(@NonNull ViewGroup parent, @NonNull In 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 7f5b07dbee6..d8515e4ba9f 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.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 @@ * 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 HFHolder(View v) { } } - 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 void setGridItemVariants(boolean useGridVariant) { } 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 void clearStreamItemList() { return; } infoItemList.clear(); - clearStates(); notifyDataSetChanged(); } @@ -254,7 +245,6 @@ public int getItemViewType(int position) { case COMMENT: return useMiniVariant ? MINI_COMMENT_HOLDER_TYPE : COMMENT_HOLDER_TYPE; default: - Log.e(TAG, "Trollolo"); return -1; } } @@ -292,7 +282,6 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int 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 void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi // 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 void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi 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 void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi } } - @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 17ac919d91e..00000000000 --- a/app/src/main/java/org/schabi/newpipe/info_list/StateObjectsListAdapter.java +++ /dev/null @@ -1,180 +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()) { - List streamStateEntities = null; - try { - streamStateEntities = recordManager.loadStreamStateBatch(list).blockingGet(); - } catch (Exception e) { - if (BuildConfig.DEBUG) e.printStackTrace(); - } - if(streamStateEntities != null) appendStates(streamStateEntities, offset); - callback.run(); - } else { - callback.run(); - } - } - - protected void loadState(InfoItem item, int offset, Runnable callback) { - if (isPlaybackStatesVisible()) { - StreamStateEntity[] streamStateEntities = null; - try { - streamStateEntities = recordManager.loadStreamState(item).blockingGet(); - } catch (Exception e) { - if (BuildConfig.DEBUG) e.printStackTrace(); - } - if(streamStateEntities != null && streamStateEntities.length > 0) appendState(streamStateEntities[0], offset); - callback.run(); - } else { - callback.run(); - } - } - - protected void loadStatesForLocal(List list, int offset, Runnable callback) { - if (isPlaybackStatesVisible()) { - List streamStateEntities = null; - try { - streamStateEntities = recordManager.loadLocalStreamStateBatch(list).blockingGet(); - } catch (Exception e) { - if (BuildConfig.DEBUG) e.printStackTrace(); - } - if(streamStateEntities != null) appendStates(streamStateEntities, offset); - 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 31793445576..956bc47a682 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 ChannelInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup parent) } @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 a191707c0c5..3f4e4e398c3 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 ChannelMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup pare } @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 4ecf8696162..90212ea318a 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 CommentsInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup parent) } @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 3d3a9bb0976..4794ce3fd99 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 String transformUrl(Matcher match, String url) { 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 CommentsMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup par } @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 void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateE 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 void onClick(View view) { 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 3bc0d9e54ad..e0641912653 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 InfoItemHolder(InfoItemBuilder infoItemBuilder, int layoutId, ViewGroup p 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 f9d617e6696..b73f22d93a7 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 PlaylistMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup par } @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 25502bc81ed..ea058bc0e30 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 StreamInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup parent) { } @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 aa2a3f8786c..6c685c6cf62 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.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 StreamMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup paren } @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 void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateE 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 void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateE } @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 @@ private void disableLongClick() { 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 94672bd49ac..abdf82353af 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 void onResume() { } updateFlags = 0; } - - itemsList.post(itemListAdapter::updateStates); } /*////////////////////////////////////////////////////////////////////////// @@ -152,7 +150,6 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 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 d29e85ee324..4b1a1f363ef 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 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 @@ * 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 void unsetSelectedListener() { } 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 @@ private void addItemsImpl(@NonNull List data) { } } - 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 boolean swapItems(int fromAdapterPosition, int toAdapterPosition) { 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 void clearStreamItemList() { return; } localItems.clear(); - clearStates(); notifyDataSetChanged(); } @@ -236,8 +220,9 @@ public int getItemViewType(int position) { } } + @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 RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) { } @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 void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { // 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 void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi 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 void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi } } - @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 5973ad920d0..6565709434d 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.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 void selected(LocalItem selectedItem) { 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 void selected(LocalItem selectedItem) { @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 @@ private void onPlaylistSelected(@NonNull LocalPlaylistManager manager, @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/holder/LocalItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java index c00fa1fb4b1..ed6a9b4cdca 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 LocalItemHolder(LocalItemBuilder itemBuilder, int layoutId, ViewGroup par 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 0e6eca9ba3f..1366bd02e93 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 LocalPlaylistItemHolder(LocalItemBuilder infoItemBuilder, ViewGroup paren } @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 void updateFromItem(final LocalItem localItem, @Nullable final StreamStat 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 0c4e66c9d2a..c5d9a6428c1 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.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 LocalPlaylistStreamItemHolder(LocalItemBuilder infoItemBuilder, ViewGroup } @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 void updateFromItem(final LocalItem localItem, @Nullable final StreamStat 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 void updateFromItem(final LocalItem localItem, @Nullable final StreamStat } @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 b24051a4f3a..05717392c2f 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.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 @@ private String getStreamInfoDetailLine(final StreamStatisticsEntry entry, } @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 void updateFromItem(final LocalItem localItem, @Nullable final StreamStat 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 void updateFromItem(final LocalItem localItem, @Nullable final StreamStat } @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 2a81f95718c..c5f1813c707 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 PlaylistItemHolder(LocalItemBuilder infoItemBuilder, ViewGroup parent) { } @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 bdcd42f6731..f9542850edd 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 RemotePlaylistItemHolder(LocalItemBuilder infoItemBuilder, ViewGroup pare } @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 void updateFromItem(final LocalItem localItem, @Nullable final StreamStat 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/subscription/SubscriptionFragment.java b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.java index 9a53e7e94cc..a2727c29b9f 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 void onAttach(Context context) { @Override public void onDetach() { - infoListAdapter.dispose(); super.onDetach(); } @@ -153,8 +152,6 @@ public void onResume() { } updateFlags = 0; } - - itemsList.post(infoListAdapter::updateStates); } @Override @@ -382,7 +379,6 @@ public void held(ChannelInfoItem selectedItem) { }); - //noinspection ConstantConditions whatsNewItemListHeader.setOnClickListener(v -> { FragmentManager fragmentManager = getFM(); NavigationHelper.openWhatsNewFragment(fragmentManager); @@ -430,12 +426,12 @@ private void showLongTapDialog(ChannelInfoItem selectedItem) { } - private void shareChannel (ChannelInfoItem selectedItem) { - ShareUtils.shareUrl(this.getContext(), selectedItem.getName(), selectedItem.getUrl()); + private void shareChannel(ChannelInfoItem selectedItem) { + ShareUtils.shareUrl(getContext(), selectedItem.getName(), selectedItem.getUrl()); } @SuppressLint("CheckResult") - private void deleteChannel (ChannelInfoItem selectedItem) { + private void deleteChannel(ChannelInfoItem selectedItem) { subscriptionService.subscriptionTable() .getSubscription(selectedItem.getServiceId(), selectedItem.getUrl()) .toObservable() @@ -447,7 +443,7 @@ private void deleteChannel (ChannelInfoItem selectedItem) { - private Observer> getDeleteObserver(){ + private Observer> getDeleteObserver() { return new Observer>() { @Override public void onSubscribe(Disposable d) {