Animate states changed
This commit is contained in:
parent
273f731dd5
commit
93f2518159
16 changed files with 113 additions and 22 deletions
|
@ -1287,7 +1287,7 @@ public class VideoDetailFragment
|
||||||
.subscribe(state -> {
|
.subscribe(state -> {
|
||||||
final int seconds = (int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime());
|
final int seconds = (int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime());
|
||||||
positionView.setMax((int) info.getDuration());
|
positionView.setMax((int) info.getDuration());
|
||||||
positionView.setProgress(seconds);
|
positionView.setProgressAnimated(seconds);
|
||||||
detailPositionView.setText(Localization.getDurationString(seconds));
|
detailPositionView.setText(Localization.getDurationString(seconds));
|
||||||
animateView(positionView, true, 500);
|
animateView(positionView, true, 500);
|
||||||
animateView(detailPositionView, true, 500);
|
animateView(detailPositionView, true, 500);
|
||||||
|
|
|
@ -101,7 +101,7 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I> implem
|
||||||
updateFlags = 0;
|
updateFlags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
infoListAdapter.updateStates();
|
itemsList.post(infoListAdapter::updateStates);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -312,9 +312,26 @@ public class InfoListAdapter extends StateObjectsListAdapter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List<Object> payloads) {
|
||||||
|
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);
|
||||||
|
} else if (payload instanceof Boolean) {
|
||||||
|
((InfoItemHolder) holder).updateState(infoItemList.get(header == null ? position : position - 1),
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onBindViewHolder(holder, position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onItemStateChanged(int position, @Nullable StreamStateEntity state) {
|
protected void onItemStateChanged(int position, @Nullable StreamStateEntity state) {
|
||||||
notifyItemChanged(header == null ? position : position + 1, state);
|
notifyItemChanged(header == null ? position : position + 1, state != null ? state : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) {
|
public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) {
|
||||||
|
|
|
@ -38,4 +38,7 @@ public abstract class InfoItemHolder extends RecyclerView.ViewHolder {
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state);
|
public abstract void updateFromItem(final InfoItem infoItem, @Nullable final StreamStateEntity state);
|
||||||
|
|
||||||
|
public void updateState(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ import android.support.v4.content.ContextCompat;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
@ -14,8 +13,10 @@ import org.schabi.newpipe.extractor.InfoItem;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamType;
|
import org.schabi.newpipe.extractor.stream.StreamType;
|
||||||
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
||||||
|
import org.schabi.newpipe.util.AnimationUtils;
|
||||||
import org.schabi.newpipe.util.ImageDisplayConstants;
|
import org.schabi.newpipe.util.ImageDisplayConstants;
|
||||||
import org.schabi.newpipe.util.Localization;
|
import org.schabi.newpipe.util.Localization;
|
||||||
|
import org.schabi.newpipe.views.AnimatedProgressBar;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -25,7 +26,7 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder {
|
||||||
public final TextView itemVideoTitleView;
|
public final TextView itemVideoTitleView;
|
||||||
public final TextView itemUploaderView;
|
public final TextView itemUploaderView;
|
||||||
public final TextView itemDurationView;
|
public final TextView itemDurationView;
|
||||||
public final ProgressBar itemProgressView;
|
public final AnimatedProgressBar itemProgressView;
|
||||||
|
|
||||||
StreamMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, int layoutId, ViewGroup parent) {
|
StreamMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, int layoutId, ViewGroup parent) {
|
||||||
super(infoItemBuilder, layoutId, parent);
|
super(infoItemBuilder, layoutId, parent);
|
||||||
|
@ -99,6 +100,22 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(final InfoItem infoItem, @Nullable final StreamStateEntity state) {
|
||||||
|
final StreamInfoItem item = (StreamInfoItem) infoItem;
|
||||||
|
if (state != null && item.getDuration() > 0 && item.getStreamType() != StreamType.LIVE_STREAM) {
|
||||||
|
itemProgressView.setMax((int) item.getDuration());
|
||||||
|
if (itemProgressView.getVisibility() == View.VISIBLE) {
|
||||||
|
itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime()));
|
||||||
|
} else {
|
||||||
|
itemProgressView.setProgress((int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime()));
|
||||||
|
AnimationUtils.animateView(itemProgressView, true, 500);
|
||||||
|
}
|
||||||
|
} else if (itemProgressView.getVisibility() == View.VISIBLE) {
|
||||||
|
AnimationUtils.animateView(itemProgressView, false, 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void enableLongClick(final StreamInfoItem item) {
|
private void enableLongClick(final StreamInfoItem item) {
|
||||||
itemView.setLongClickable(true);
|
itemView.setLongClickable(true);
|
||||||
itemView.setOnLongClickListener(view -> {
|
itemView.setOnLongClickListener(view -> {
|
||||||
|
|
|
@ -76,7 +76,8 @@ public abstract class BaseLocalListFragment<I, N> extends BaseStateFragment<I>
|
||||||
}
|
}
|
||||||
updateFlags = 0;
|
updateFlags = 0;
|
||||||
}
|
}
|
||||||
itemListAdapter.updateStates();
|
|
||||||
|
itemsList.post(itemListAdapter::updateStates);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -285,9 +285,26 @@ public class LocalItemListAdapter extends StateObjectsListAdapter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List<Object> payloads) {
|
||||||
|
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);
|
||||||
|
} else if (payload instanceof Boolean) {
|
||||||
|
((LocalItemHolder) holder).updateState(localItems.get(header == null ? position : position - 1),
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onBindViewHolder(holder, position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onItemStateChanged(int position, @Nullable StreamStateEntity state) {
|
protected void onItemStateChanged(int position, @Nullable StreamStateEntity state) {
|
||||||
notifyItemChanged(header == null ? position : position + 1, state);
|
notifyItemChanged(header == null ? position : position + 1, state != null ? state : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) {
|
public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) {
|
||||||
|
|
|
@ -41,4 +41,7 @@ public abstract class LocalItemHolder extends RecyclerView.ViewHolder {
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void updateFromItem(final LocalItem item, @Nullable final StreamStateEntity state, final DateFormat dateFormat);
|
public abstract void updateFromItem(final LocalItem item, @Nullable final StreamStateEntity state, final DateFormat dateFormat);
|
||||||
|
|
||||||
|
public void updateState(final LocalItem localItem, @Nullable final StreamStateEntity state) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
@ -15,8 +14,10 @@ import org.schabi.newpipe.database.playlist.PlaylistStreamEntry;
|
||||||
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
|
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.local.LocalItemBuilder;
|
import org.schabi.newpipe.local.LocalItemBuilder;
|
||||||
|
import org.schabi.newpipe.util.AnimationUtils;
|
||||||
import org.schabi.newpipe.util.ImageDisplayConstants;
|
import org.schabi.newpipe.util.ImageDisplayConstants;
|
||||||
import org.schabi.newpipe.util.Localization;
|
import org.schabi.newpipe.util.Localization;
|
||||||
|
import org.schabi.newpipe.views.AnimatedProgressBar;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -28,7 +29,7 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder {
|
||||||
public final TextView itemAdditionalDetailsView;
|
public final TextView itemAdditionalDetailsView;
|
||||||
public final TextView itemDurationView;
|
public final TextView itemDurationView;
|
||||||
public final View itemHandleView;
|
public final View itemHandleView;
|
||||||
public final ProgressBar itemProgressView;
|
public final AnimatedProgressBar itemProgressView;
|
||||||
|
|
||||||
LocalPlaylistStreamItemHolder(LocalItemBuilder infoItemBuilder, int layoutId, ViewGroup parent) {
|
LocalPlaylistStreamItemHolder(LocalItemBuilder infoItemBuilder, int layoutId, ViewGroup parent) {
|
||||||
super(infoItemBuilder, layoutId, parent);
|
super(infoItemBuilder, layoutId, parent);
|
||||||
|
@ -92,6 +93,23 @@ public class LocalPlaylistStreamItemHolder extends LocalItemHolder {
|
||||||
itemHandleView.setOnTouchListener(getOnTouchListener(item));
|
itemHandleView.setOnTouchListener(getOnTouchListener(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(LocalItem localItem, @Nullable StreamStateEntity state) {
|
||||||
|
if (!(localItem instanceof PlaylistStreamEntry)) return;
|
||||||
|
final PlaylistStreamEntry item = (PlaylistStreamEntry) localItem;
|
||||||
|
if (state != null && item.duration > 0) {
|
||||||
|
itemProgressView.setMax((int) item.duration);
|
||||||
|
if (itemProgressView.getVisibility() == View.VISIBLE) {
|
||||||
|
itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime()));
|
||||||
|
} else {
|
||||||
|
itemProgressView.setProgress((int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime()));
|
||||||
|
AnimationUtils.animateView(itemProgressView, true, 500);
|
||||||
|
}
|
||||||
|
} else if (itemProgressView.getVisibility() == View.VISIBLE) {
|
||||||
|
AnimationUtils.animateView(itemProgressView, false, 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private View.OnTouchListener getOnTouchListener(final PlaylistStreamEntry item) {
|
private View.OnTouchListener getOnTouchListener(final PlaylistStreamEntry item) {
|
||||||
return (view, motionEvent) -> {
|
return (view, motionEvent) -> {
|
||||||
view.performClick();
|
view.performClick();
|
||||||
|
|
|
@ -5,7 +5,6 @@ import android.support.v4.content.ContextCompat;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
@ -14,8 +13,10 @@ import org.schabi.newpipe.database.stream.StreamStatisticsEntry;
|
||||||
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
|
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.local.LocalItemBuilder;
|
import org.schabi.newpipe.local.LocalItemBuilder;
|
||||||
|
import org.schabi.newpipe.util.AnimationUtils;
|
||||||
import org.schabi.newpipe.util.ImageDisplayConstants;
|
import org.schabi.newpipe.util.ImageDisplayConstants;
|
||||||
import org.schabi.newpipe.util.Localization;
|
import org.schabi.newpipe.util.Localization;
|
||||||
|
import org.schabi.newpipe.views.AnimatedProgressBar;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -48,7 +49,7 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder {
|
||||||
public final TextView itemDurationView;
|
public final TextView itemDurationView;
|
||||||
@Nullable
|
@Nullable
|
||||||
public final TextView itemAdditionalDetails;
|
public final TextView itemAdditionalDetails;
|
||||||
public final ProgressBar itemProgressView;
|
public final AnimatedProgressBar itemProgressView;
|
||||||
|
|
||||||
public LocalStatisticStreamItemHolder(LocalItemBuilder itemBuilder, ViewGroup parent) {
|
public LocalStatisticStreamItemHolder(LocalItemBuilder itemBuilder, ViewGroup parent) {
|
||||||
this(itemBuilder, R.layout.list_stream_item, parent);
|
this(itemBuilder, R.layout.list_stream_item, parent);
|
||||||
|
@ -121,4 +122,21 @@ public class LocalStatisticStreamItemHolder extends LocalItemHolder {
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateState(LocalItem localItem, @Nullable StreamStateEntity state) {
|
||||||
|
if (!(localItem instanceof StreamStatisticsEntry)) return;
|
||||||
|
final StreamStatisticsEntry item = (StreamStatisticsEntry) localItem;
|
||||||
|
if (state != null && item.duration > 0) {
|
||||||
|
itemProgressView.setMax((int) item.duration);
|
||||||
|
if (itemProgressView.getVisibility() == View.VISIBLE) {
|
||||||
|
itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime()));
|
||||||
|
} else {
|
||||||
|
itemProgressView.setProgress((int) TimeUnit.MILLISECONDS.toSeconds(state.getProgressTime()));
|
||||||
|
AnimationUtils.animateView(itemProgressView, true, 500);
|
||||||
|
}
|
||||||
|
} else if (itemProgressView.getVisibility() == View.VISIBLE) {
|
||||||
|
AnimationUtils.animateView(itemProgressView, false, 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,6 +153,8 @@ public class SubscriptionFragment extends BaseStateFragment<List<SubscriptionEnt
|
||||||
}
|
}
|
||||||
updateFlags = 0;
|
updateFlags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
itemsList.post(infoListAdapter::updateStates);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -25,8 +25,7 @@ public final class AnimatedProgressBar extends ProgressBar {
|
||||||
super(context, attrs, defStyleAttr);
|
super(context, attrs, defStyleAttr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public synchronized void setProgressAnimated(int progress) {
|
||||||
public synchronized void setProgress(int progress) {
|
|
||||||
cancelAnimation();
|
cancelAnimation();
|
||||||
animation = new ProgressBarAnimation(this, getProgress(), progress);
|
animation = new ProgressBarAnimation(this, getProgress(), progress);
|
||||||
startAnimation(animation);
|
startAnimation(animation);
|
||||||
|
@ -40,10 +39,6 @@ public final class AnimatedProgressBar extends ProgressBar {
|
||||||
clearAnimation();
|
clearAnimation();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setProgressInternal(int progress) {
|
|
||||||
super.setProgress(progress);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ProgressBarAnimation extends Animation {
|
private static class ProgressBarAnimation extends Animation {
|
||||||
|
|
||||||
private final AnimatedProgressBar progressBar;
|
private final AnimatedProgressBar progressBar;
|
||||||
|
@ -63,7 +58,7 @@ public final class AnimatedProgressBar extends ProgressBar {
|
||||||
protected void applyTransformation(float interpolatedTime, Transformation t) {
|
protected void applyTransformation(float interpolatedTime, Transformation t) {
|
||||||
super.applyTransformation(interpolatedTime, t);
|
super.applyTransformation(interpolatedTime, t);
|
||||||
float value = from + (to - from) * interpolatedTime;
|
float value = from + (to - from) * interpolatedTime;
|
||||||
progressBar.setProgressInternal((int) value);
|
progressBar.setProgress((int) value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@
|
||||||
android:textSize="@dimen/video_item_search_uploader_text_size"
|
android:textSize="@dimen/video_item_search_uploader_text_size"
|
||||||
tools:text="Uploader"/>
|
tools:text="Uploader"/>
|
||||||
|
|
||||||
<ProgressBar
|
<org.schabi.newpipe.views.AnimatedProgressBar
|
||||||
android:id="@+id/itemProgressView"
|
android:id="@+id/itemProgressView"
|
||||||
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
||||||
android:progressDrawable="?progress_horizontal_drawable"
|
android:progressDrawable="?progress_horizontal_drawable"
|
||||||
|
|
|
@ -80,7 +80,7 @@
|
||||||
android:textSize="@dimen/video_item_search_upload_date_text_size"
|
android:textSize="@dimen/video_item_search_upload_date_text_size"
|
||||||
tools:text="2 years ago • 10M views"/>
|
tools:text="2 years ago • 10M views"/>
|
||||||
|
|
||||||
<ProgressBar
|
<org.schabi.newpipe.views.AnimatedProgressBar
|
||||||
android:id="@+id/itemProgressView"
|
android:id="@+id/itemProgressView"
|
||||||
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
||||||
android:progressDrawable="?progress_horizontal_drawable"
|
android:progressDrawable="?progress_horizontal_drawable"
|
||||||
|
|
|
@ -70,7 +70,7 @@
|
||||||
android:textSize="@dimen/video_item_search_uploader_text_size"
|
android:textSize="@dimen/video_item_search_uploader_text_size"
|
||||||
tools:text="Uploader" />
|
tools:text="Uploader" />
|
||||||
|
|
||||||
<ProgressBar
|
<org.schabi.newpipe.views.AnimatedProgressBar
|
||||||
android:id="@+id/itemProgressView"
|
android:id="@+id/itemProgressView"
|
||||||
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
||||||
android:progressDrawable="?progress_horizontal_drawable"
|
android:progressDrawable="?progress_horizontal_drawable"
|
||||||
|
|
|
@ -83,7 +83,7 @@
|
||||||
android:textSize="@dimen/video_item_search_uploader_text_size"
|
android:textSize="@dimen/video_item_search_uploader_text_size"
|
||||||
tools:text="Uploader" />
|
tools:text="Uploader" />
|
||||||
|
|
||||||
<ProgressBar
|
<org.schabi.newpipe.views.AnimatedProgressBar
|
||||||
android:id="@+id/itemProgressView"
|
android:id="@+id/itemProgressView"
|
||||||
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
||||||
android:progressDrawable="?progress_horizontal_drawable"
|
android:progressDrawable="?progress_horizontal_drawable"
|
||||||
|
|
Loading…
Reference in a new issue