1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2025-11-06 02:03:00 +00:00

Merge pull request #588 from coffeemakr/feature-speedup

Speed up detail page loading ⏱
This commit is contained in:
Mauricio Colli
2017-06-27 18:12:30 -03:00
committed by GitHub
18 changed files with 538 additions and 527 deletions

View File

@@ -213,7 +213,7 @@ public class ChannelFragment extends BaseFragment implements ChannelExtractorWor
channelVideosList.setLayoutManager(new LinearLayoutManager(activity));
if (infoListAdapter == null) {
infoListAdapter = new InfoListAdapter(activity, rootView);
infoListAdapter = new InfoListAdapter(activity);
if (savedInstanceState != null) {
//noinspection unchecked
ArrayList<InfoItem> serializable = (ArrayList<InfoItem>) savedInstanceState.getSerializable(INFO_LIST_KEY);

View File

@@ -1,12 +1,17 @@
package org.schabi.newpipe.fragments.detail;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.preference.PreferenceManager;
import android.support.annotation.FloatRange;
import android.support.annotation.NonNull;
@@ -15,6 +20,7 @@ import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.text.Html;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.Log;
@@ -26,7 +32,7 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -112,9 +118,9 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
private Spinner spinnerToolbar;
private ParallaxScrollView parallaxScrollRootView;
private RelativeLayout contentRootLayoutHiding;
private LinearLayout contentRootLayoutHiding;
private Button thumbnailBackgroundButton;
private View thumbnailBackgroundButton;
private ImageView thumbnailImageView;
private ImageView thumbnailPlayButton;
@@ -126,12 +132,11 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
private TextView detailControlsBackground;
private TextView detailControlsPopup;
private RelativeLayout videoDescriptionRootLayout;
private LinearLayout videoDescriptionRootLayout;
private TextView videoUploadDateView;
private TextView videoDescriptionView;
private View uploaderRootLayout;
private Button uploaderButton;
private TextView uploaderTextView;
private ImageView uploaderThumb;
@@ -142,9 +147,12 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
private TextView thumbsDisabledTextView;
private TextView nextStreamTitle;
private RelativeLayout relatedStreamRootLayout;
private LinearLayout relatedStreamRootLayout;
private LinearLayout relatedStreamsView;
private ImageButton relatedStreamExpandButton;
private Handler uiHandler;
private Handler backgroundHandler;
private HandlerThread backgroundHandlerThread;
/*////////////////////////////////////////////////////////////////////////*/
@@ -194,6 +202,16 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
thousand = getString(R.string.short_thousand);
million = getString(R.string.short_million);
billion = getString(R.string.short_billion);
if(uiHandler == null) {
uiHandler = new Handler(Looper.getMainLooper(), new UICallback());
}
if(backgroundHandler == null) {
HandlerThread handlerThread = new HandlerThread("VideoDetailFragment-BG");
handlerThread.start();
backgroundHandlerThread = handlerThread;
backgroundHandler = new Handler(handlerThread.getLooper(), new BackgroundCallback(uiHandler, getContext()));
}
}
@Override
@@ -241,6 +259,11 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
@Override
public void onDestroy() {
super.onDestroy();
if(backgroundHandlerThread != null) {
backgroundHandlerThread.quit();
}
backgroundHandlerThread = null;
backgroundHandler = null;
PreferenceManager.getDefaultSharedPreferences(activity).unregisterOnSharedPreferenceChangeListener(this);
}
@@ -272,7 +295,7 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
videoUploadDateView = null;
videoDescriptionView = null;
uploaderButton = null;
uploaderRootLayout = null;
uploaderTextView = null;
uploaderThumb = null;
@@ -353,10 +376,14 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
case R.id.detail_controls_popup:
openInPopup();
break;
case R.id.detail_uploader_button:
NavigationHelper.openChannelFragment(getFragmentManager(), currentStreamInfo.service_id, currentStreamInfo.channel_url, currentStreamInfo.uploader);
case R.id.detail_uploader_root_layout:
if(currentStreamInfo.channel_url == null || currentStreamInfo.channel_url.isEmpty()) {
Log.w(TAG, "Can't open channel because we got no channel URL");
} else {
NavigationHelper.openChannelFragment(getFragmentManager(), currentStreamInfo.service_id, currentStreamInfo.channel_url, currentStreamInfo.uploader);
}
break;
case R.id.detail_thumbnail_background_button:
case R.id.detail_thumbnail_root_layout:
playVideo(currentStreamInfo);
break;
case R.id.detail_title_root_layout:
@@ -484,12 +511,11 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
parallaxScrollRootView = (ParallaxScrollView) rootView.findViewById(R.id.detail_main_content);
//thumbnailRootLayout = (RelativeLayout) rootView.findViewById(R.id.detail_thumbnail_root_layout);
thumbnailBackgroundButton = (Button) rootView.findViewById(R.id.detail_thumbnail_background_button);
thumbnailBackgroundButton = rootView.findViewById(R.id.detail_thumbnail_root_layout);
thumbnailImageView = (ImageView) rootView.findViewById(R.id.detail_thumbnail_image_view);
thumbnailPlayButton = (ImageView) rootView.findViewById(R.id.detail_thumbnail_play_button);
contentRootLayoutHiding = (RelativeLayout) rootView.findViewById(R.id.detail_content_root_hiding);
contentRootLayoutHiding = (LinearLayout) rootView.findViewById(R.id.detail_content_root_hiding);
videoTitleRoot = rootView.findViewById(R.id.detail_title_root_layout);
videoTitleTextView = (TextView) rootView.findViewById(R.id.detail_video_title_view);
@@ -499,7 +525,7 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
detailControlsBackground = (TextView) rootView.findViewById(R.id.detail_controls_background);
detailControlsPopup = (TextView) rootView.findViewById(R.id.detail_controls_popup);
videoDescriptionRootLayout = (RelativeLayout) rootView.findViewById(R.id.detail_description_root_layout);
videoDescriptionRootLayout = (LinearLayout) rootView.findViewById(R.id.detail_description_root_layout);
videoUploadDateView = (TextView) rootView.findViewById(R.id.detail_upload_date_view);
videoDescriptionView = (TextView) rootView.findViewById(R.id.detail_description_view);
@@ -511,19 +537,19 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
thumbsDisabledTextView = (TextView) rootView.findViewById(R.id.detail_thumbs_disabled_view);
uploaderRootLayout = rootView.findViewById(R.id.detail_uploader_root_layout);
uploaderButton = (Button) rootView.findViewById(R.id.detail_uploader_button);
uploaderTextView = (TextView) rootView.findViewById(R.id.detail_uploader_text_view);
uploaderThumb = (ImageView) rootView.findViewById(R.id.detail_uploader_thumbnail_view);
relatedStreamRootLayout = (RelativeLayout) rootView.findViewById(R.id.detail_related_streams_root_layout);
relatedStreamRootLayout = (LinearLayout) rootView.findViewById(R.id.detail_related_streams_root_layout);
nextStreamTitle = (TextView) rootView.findViewById(R.id.detail_next_stream_title);
relatedStreamsView = (LinearLayout) rootView.findViewById(R.id.detail_related_streams_view);
relatedStreamExpandButton = ((ImageButton) rootView.findViewById(R.id.detail_related_streams_expand));
actionBarHandler = new ActionBarHandler(activity);
videoDescriptionView.setMovementMethod(LinkMovementMethod.getInstance());
infoItemBuilder = new InfoItemBuilder(activity, rootView.findViewById(android.R.id.content));
infoItemBuilder = new InfoItemBuilder(activity);
setHeightThumbnail();
}
@@ -539,7 +565,7 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
});
videoTitleRoot.setOnClickListener(this);
uploaderButton.setOnClickListener(this);
uploaderRootLayout.setOnClickListener(this);
thumbnailBackgroundButton.setOnClickListener(this);
detailControlsBackground.setOnClickListener(this);
detailControlsPopup.setOnClickListener(this);
@@ -593,6 +619,7 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
}
}
/*//////////////////////////////////////////////////////////////////////////
// Menu
//////////////////////////////////////////////////////////////////////////*/
@@ -739,8 +766,17 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
// Get url from the new top
StackItem peek = stack.peek();
if (peek.getInfo() != null) selectAndHandleInfo(peek.getInfo());
else selectAndLoadVideo(0, peek.getUrl(), !TextUtils.isEmpty(peek.getTitle()) ? peek.getTitle() : "");
if (peek.getInfo() != null) {
final StreamInfo streamInfo = peek.getInfo();
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
selectAndHandleInfo(streamInfo);
}
});
} else {
selectAndLoadVideo(0, peek.getUrl(), !TextUtils.isEmpty(peek.getTitle()) ? peek.getTitle() : "");
}
return true;
}
@@ -848,7 +884,7 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
}
}
private void handleStreamInfo(@NonNull StreamInfo info, boolean fromNetwork) {
private void handleStreamInfo(@NonNull final StreamInfo info, boolean fromNetwork) {
if (DEBUG) Log.d(TAG, "handleStreamInfo() called with: info = [" + info + "]");
currentStreamInfo = info;
selectVideo(info.service_id, info.webpage_url, info.title);
@@ -862,7 +898,6 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
if (!TextUtils.isEmpty(info.uploader)) uploaderTextView.setText(info.uploader);
uploaderTextView.setVisibility(!TextUtils.isEmpty(info.uploader) ? View.VISIBLE : View.GONE);
uploaderButton.setVisibility(!TextUtils.isEmpty(info.channel_url) ? View.VISIBLE : View.GONE);
uploaderThumb.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.buddy));
if (info.view_count >= 0) videoCountView.setText(Localization.localizeViewCount(info.view_count, activity));
@@ -887,14 +922,8 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
thumbsUpImageView.setVisibility(info.like_count >= 0 ? View.VISIBLE : View.GONE);
}
if (!TextUtils.isEmpty(info.upload_date)) videoUploadDateView.setText(Localization.localizeDate(info.upload_date, activity));
videoUploadDateView.setVisibility(!TextUtils.isEmpty(info.upload_date) ? View.VISIBLE : View.GONE);
if (!TextUtils.isEmpty(info.description)) { //noinspection deprecation
videoDescriptionView.setText(Build.VERSION.SDK_INT >= 24 ? Html.fromHtml(info.description, 0) : Html.fromHtml(info.description));
}
videoDescriptionView.setVisibility(!TextUtils.isEmpty(info.description) ? View.VISIBLE : View.GONE);
videoDescriptionView.setVisibility(View.GONE);
videoDescriptionRootLayout.setVisibility(View.GONE);
videoTitleToggleArrow.setImageResource(R.drawable.arrow_down);
videoTitleToggleArrow.setVisibility(View.VISIBLE);
@@ -908,9 +937,26 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
toggleExpandRelatedVideos(currentStreamInfo);
wasRelatedStreamsExpanded = false;
}
setTitleToUrl(info.webpage_url, info.title);
setStreamInfoToUrl(info.webpage_url, info);
prepareDescription(info.description);
prepareUploadDate(info.upload_date);
}
private void prepareUploadDate(final String uploadDate) {
// Hide until date is prepared or forever if no date is supplied
videoUploadDateView.setVisibility(View.GONE);
if (!TextUtils.isEmpty(uploadDate)) {
backgroundHandler.sendMessage(Message.obtain(backgroundHandler, BackgroundCallback.MESSAGE_UPLOADER_DATE, uploadDate));
}
}
private void prepareDescription(final String descriptionHtml) {
// Send the unparsed description to the handler as a message
if (!TextUtils.isEmpty(descriptionHtml)) {
backgroundHandler.sendMessage(Message.obtain(backgroundHandler, BackgroundCallback.MESSAGE_DESCRIPTION, descriptionHtml));
}
}
public void playVideo(StreamInfo info) {
@@ -987,10 +1033,8 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
int height = isPortrait ? (int) (getResources().getDisplayMetrics().widthPixels / (16.0f / 9.0f))
: (int) (getResources().getDisplayMetrics().heightPixels / 2f);
thumbnailImageView.setScaleType(isPortrait ? ImageView.ScaleType.CENTER_CROP : ImageView.ScaleType.FIT_CENTER);
thumbnailImageView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height));
thumbnailImageView.setLayoutParams(new FrameLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height));
thumbnailImageView.setMinimumHeight(height);
thumbnailBackgroundButton.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height));
thumbnailBackgroundButton.setMinimumHeight(height);
}
public String getShortCount(Long viewCount) {
@@ -1126,4 +1170,65 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
public void onUnrecoverableError(Exception exception) {
activity.finish();
}
private static class BackgroundCallback implements Handler.Callback {
private static final int MESSAGE_DESCRIPTION = 1;
public static final int MESSAGE_UPLOADER_DATE = 2;
private final Handler uiHandler;
private final Context context;
BackgroundCallback(Handler uiHandler, Context context) {
this.uiHandler = uiHandler;
this.context = context;
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_DESCRIPTION:
handleDescription((String) msg.obj);
return true;
case MESSAGE_UPLOADER_DATE:
handleUploadDate((String) msg.obj);
return true;
}
return false;
}
private void handleUploadDate(String uploadDate) {
String localizedDate = Localization.localizeDate(uploadDate, context);
uiHandler.sendMessage(Message.obtain(uiHandler, MESSAGE_UPLOADER_DATE, localizedDate));
}
private void handleDescription(String description) {
Spanned parsedDescription;
if (TextUtils.isEmpty(description)) {
return;
}
if (Build.VERSION.SDK_INT >= 24) {
parsedDescription = Html.fromHtml(description, 0);
} else {
//noinspection deprecation
parsedDescription = Html.fromHtml(description);
}
uiHandler.sendMessage(Message.obtain(uiHandler, MESSAGE_DESCRIPTION, parsedDescription));
}
}
private class UICallback implements Handler.Callback {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case BackgroundCallback.MESSAGE_DESCRIPTION:
videoDescriptionView.setText((Spanned) msg.obj);
videoDescriptionView.setVisibility(View.VISIBLE);
return true;
case BackgroundCallback.MESSAGE_UPLOADER_DATE:
videoUploadDateView.setText((String) msg.obj);
videoUploadDateView.setVisibility(View.VISIBLE);
return true;
}
return false;
}
}
}

View File

@@ -212,7 +212,7 @@ public class SearchFragment extends BaseFragment implements SuggestionWorker.OnS
resultRecyclerView.setLayoutManager(new LinearLayoutManager(activity));
if (infoListAdapter == null) {
infoListAdapter = new InfoListAdapter(getActivity(), getActivity().findViewById(android.R.id.content));
infoListAdapter = new InfoListAdapter(getActivity());
if (savedInstanceState != null) {
//noinspection unchecked
ArrayList<InfoItem> serializable = (ArrayList<InfoItem>) savedInstanceState.getSerializable(INFO_LIST_KEY);

View File

@@ -31,8 +31,7 @@ import de.hdodenhof.circleimageview.CircleImageView;
public class ChannelInfoItemHolder extends InfoItemHolder {
public final CircleImageView itemThumbnailView;
public final TextView itemChannelTitleView;
public final TextView itemSubscriberCountView;
public final TextView itemVideoCountView;
public final TextView itemAdditionalDetailView;
public final TextView itemChannelDescriptionView;
public final View itemRoot;
@@ -42,8 +41,7 @@ public class ChannelInfoItemHolder extends InfoItemHolder {
itemRoot = v.findViewById(R.id.itemRoot);
itemThumbnailView = (CircleImageView) v.findViewById(R.id.itemThumbnailView);
itemChannelTitleView = (TextView) v.findViewById(R.id.itemChannelTitleView);
itemSubscriberCountView = (TextView) v.findViewById(R.id.itemSubscriberCountView);
itemVideoCountView = (TextView) v.findViewById(R.id.itemVideoCountView);
itemAdditionalDetailView = (TextView) v.findViewById(R.id.itemAdditionalDetails);
itemChannelDescriptionView = (TextView) v.findViewById(R.id.itemChannelDescriptionView);
}

View File

@@ -17,6 +17,8 @@ import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
import org.schabi.newpipe.extractor.stream_info.StreamInfoItem;
import java.util.Locale;
/**
* Created by Christian Schabesberger on 26.09.16.
* <p>
@@ -54,18 +56,35 @@ public class InfoItemBuilder {
void selected(int serviceId, String url, String title);
}
private Context mContext = null;
private LayoutInflater inflater;
private View rootView = null;
private ImageLoader imageLoader = ImageLoader.getInstance();
private DisplayImageOptions displayImageOptions =
new DisplayImageOptions.Builder().cacheInMemory(true).build();
/** Base display options */
private static final DisplayImageOptions DISPLAY_IMAGE_OPTIONS =
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.build();
/** Display options for stream thumbnails */
private static final DisplayImageOptions DISPLAY_STREAM_THUMBNAIL_OPTIONS =
new DisplayImageOptions.Builder()
.cloneFrom(DISPLAY_IMAGE_OPTIONS)
.showImageOnFail(R.drawable.dummy_thumbnail)
.showImageForEmptyUri(R.drawable.dummy_thumbnail)
.showImageOnLoading(R.drawable.dummy_thumbnail)
.build();
/** Display options for channel thumbnails */
private static final DisplayImageOptions DISPLAY_CHANNEL_THUMBNAIL_OPTIONS =
new DisplayImageOptions.Builder()
.cloneFrom(DISPLAY_IMAGE_OPTIONS)
.showImageOnLoading(R.drawable.buddy_channel_item)
.showImageForEmptyUri(R.drawable.buddy_channel_item)
.showImageOnFail(R.drawable.buddy_channel_item)
.build();
private OnInfoItemSelectedListener onStreamInfoItemSelectedListener;
private OnInfoItemSelectedListener onChannelInfoItemSelectedListener;
public InfoItemBuilder(Context context, View rootView) {
mContext = context;
this.rootView = rootView;
public InfoItemBuilder(Context context) {
viewsS = context.getString(R.string.views);
videosS = context.getString(R.string.videos);
subsS = context.getString(R.string.subscriber);
@@ -73,7 +92,6 @@ public class InfoItemBuilder {
thousand = context.getString(R.string.short_thousand);
million = context.getString(R.string.short_million);
billion = context.getString(R.string.short_billion);
inflater = LayoutInflater.from(context);
}
public void setOnStreamInfoItemSelectedListener(
@@ -107,6 +125,7 @@ public class InfoItemBuilder {
public View buildView(ViewGroup parent, final InfoItem info) {
View itemView = null;
InfoItemHolder holder = null;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (info.infoType()) {
case STREAM:
//long start = System.nanoTime();
@@ -127,6 +146,22 @@ public class InfoItemBuilder {
return itemView;
}
private String getStreamInfoDetailLine(final StreamInfoItem info) {
String viewsAndDate = "";
if(info.view_count >= 0) {
viewsAndDate = shortViewCount(info.view_count);
}
if(!TextUtils.isEmpty(info.upload_date)) {
if(viewsAndDate.isEmpty()) {
viewsAndDate = info.upload_date;
} else {
viewsAndDate += "" + info.upload_date;
}
}
return viewsAndDate;
}
private void buildStreamInfoItem(StreamInfoItemHolder holder, final StreamInfoItem info) {
if (info.infoType() != InfoItem.InfoType.STREAM) {
Log.e("InfoItemBuilder", "Info type not yet supported");
@@ -146,46 +181,59 @@ public class InfoItemBuilder {
holder.itemDurationView.setVisibility(View.GONE);
}
}
if (info.view_count >= 0) {
holder.itemViewCountView.setText(shortViewCount(info.view_count));
} else {
holder.itemViewCountView.setVisibility(View.GONE);
}
if (!TextUtils.isEmpty(info.upload_date)) holder.itemUploadDateView.setText(info.upload_date + "");
holder.itemThumbnailView.setImageResource(R.drawable.dummy_thumbnail);
if (!TextUtils.isEmpty(info.thumbnail_url)) {
imageLoader.displayImage(info.thumbnail_url,
holder.itemThumbnailView, displayImageOptions,
new ImageErrorLoadingListener(mContext, rootView, info.service_id));
}
holder.itemAdditionalDetails.setText(getStreamInfoDetailLine(info));
// Default thumbnail is shown on error, while loading and if the url is empty
imageLoader.displayImage(info.thumbnail_url,
holder.itemThumbnailView,
DISPLAY_STREAM_THUMBNAIL_OPTIONS,
new ImageErrorLoadingListener(holder.itemRoot.getContext(), holder.itemRoot.getRootView(), info.service_id));
holder.itemRoot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onStreamInfoItemSelectedListener.selected(info.service_id, info.webpage_url, info.getTitle());
if(onStreamInfoItemSelectedListener != null) {
onStreamInfoItemSelectedListener.selected(info.service_id, info.webpage_url, info.getTitle());
}
}
});
}
private String getChannelInfoDetailLine(final ChannelInfoItem info) {
String details = "";
if(info.subscriberCount >= 0) {
details = shortSubscriber(info.subscriberCount);
}
if(info.videoAmount >= 0) {
String formattedVideoAmount = info.videoAmount + " " + videosS;
if(!details.isEmpty()) {
details += "" + formattedVideoAmount;
} else {
details = formattedVideoAmount;
}
}
return details;
}
private void buildChannelInfoItem(ChannelInfoItemHolder holder, final ChannelInfoItem info) {
if (!TextUtils.isEmpty(info.getTitle())) holder.itemChannelTitleView.setText(info.getTitle());
holder.itemSubscriberCountView.setText(shortSubscriber(info.subscriberCount) + "");
holder.itemVideoCountView.setText(info.videoAmount + " " + videosS);
holder.itemAdditionalDetailView.setText(getChannelInfoDetailLine(info));
if (!TextUtils.isEmpty(info.description)) holder.itemChannelDescriptionView.setText(info.description);
holder.itemThumbnailView.setImageResource(R.drawable.buddy_channel_item);
if (!TextUtils.isEmpty(info.thumbnailUrl)) {
imageLoader.displayImage(info.thumbnailUrl,
holder.itemThumbnailView,
displayImageOptions,
new ImageErrorLoadingListener(mContext, rootView, info.serviceId));
}
imageLoader.displayImage(info.thumbnailUrl,
holder.itemThumbnailView,
DISPLAY_CHANNEL_THUMBNAIL_OPTIONS,
new ImageErrorLoadingListener(holder.itemRoot.getContext(), holder.itemRoot.getRootView(), info.serviceId));
holder.itemRoot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onChannelInfoItemSelectedListener.selected(info.serviceId, info.getLink(), info.channelName);
if(onStreamInfoItemSelectedListener != null) {
onChannelInfoItemSelectedListener.selected(info.serviceId, info.getLink(), info.channelName);
}
}
});
}
@@ -218,7 +266,10 @@ public class InfoItemBuilder {
}
public static String getDurationString(int duration) {
String output = "";
if(duration < 0) {
duration = 0;
}
String output;
int days = duration / (24 * 60 * 60); /* greater than a day */
duration %= (24 * 60 * 60);
int hours = duration / (60 * 60); /* greater than an hour */
@@ -228,46 +279,12 @@ public class InfoItemBuilder {
//handle days
if (days > 0) {
output = Integer.toString(days) + ":";
}
// handle hours
if (hours > 0 || !output.isEmpty()) {
if (hours > 0) {
if (hours >= 10 || output.isEmpty()) {
output += Integer.toString(hours);
} else {
output += "0" + Integer.toString(hours);
}
} else {
output += "00";
}
output += ":";
}
//handle minutes
if (minutes > 0 || !output.isEmpty()) {
if (minutes > 0) {
if (minutes >= 10 || output.isEmpty()) {
output += Integer.toString(minutes);
} else {
output += "0" + Integer.toString(minutes);
}
} else {
output += "00";
}
output += ":";
}
//handle seconds
if (output.isEmpty()) {
output += "0:";
}
if (seconds >= 10) {
output += Integer.toString(seconds);
output = String.format(Locale.US, "%d:%02d:%02d:%02d", days, hours, minutes, seconds);
} else if(hours > 0) {
output = String.format(Locale.US, "%d:%02d:%02d", hours, minutes, seconds);
} else {
output += "0" + Integer.toString(seconds);
output = String.format(Locale.US, "%d:%02d", minutes, seconds);
}
return output;
}
}

View File

@@ -55,8 +55,8 @@ public class InfoListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
notifyDataSetChanged();
}
public InfoListAdapter(Activity a, View rootView) {
infoItemBuilder = new InfoItemBuilder(a, rootView);
public InfoListAdapter(Activity a) {
infoItemBuilder = new InfoItemBuilder(a);
infoItemList = new ArrayList<>();
}
@@ -78,6 +78,9 @@ public class InfoListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
}
public void clearStreamItemList() {
if(infoItemList.isEmpty()) {
return;
}
infoItemList.clear();
notifyDataSetChanged();
}

View File

@@ -33,8 +33,7 @@ public class StreamInfoItemHolder extends InfoItemHolder {
public final TextView itemVideoTitleView,
itemUploaderView,
itemDurationView,
itemUploadDateView,
itemViewCountView;
itemAdditionalDetails;
public final View itemRoot;
public StreamInfoItemHolder(View v) {
@@ -44,8 +43,7 @@ public class StreamInfoItemHolder extends InfoItemHolder {
itemVideoTitleView = (TextView) v.findViewById(R.id.itemVideoTitleView);
itemUploaderView = (TextView) v.findViewById(R.id.itemUploaderView);
itemDurationView = (TextView) v.findViewById(R.id.itemDurationView);
itemUploadDateView = (TextView) v.findViewById(R.id.itemUploadDateView);
itemViewCountView = (TextView) v.findViewById(R.id.itemViewCountView);
itemAdditionalDetails = (TextView) v.findViewById(R.id.itemAdditionalDetails);
}
@Override