eneim / toro

Video list auto playback made simple, specially built for RecyclerView
Apache License 2.0
1.41k stars 253 forks source link

Initialize() in VideoViewHolder is not getting called. #489

Closed androidvk closed 4 years ago

androidvk commented 4 years ago

I am trying to implement video playing where screen orientation will always be fixed. I have tried a lot of ways. Finally, I copied the way you declared adapter and holders but initialize() or ToroPlayer listeners are not getting called. I also used it on my default adapter where initialize was getting called before onBind() there I was unable to get URI.

Sample Video Link:: https://www.radiantmediaplayer.com/media/bbb-360p.mp4

I'm using latest version of the library. which is 3.7.2.......3

RecyclerView Fragment. ** private void setupRecyclerView() { final Query query = postRef; PreCachingLayoutManager layoutManager = new PreCachingLayoutManager(getActivity()); layoutManager.setExtraLayoutSpace(Store.getDeviceHeight()); layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    forumHelpers = new ArrayList<ForumHelper>();
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerView.setItemViewCacheSize(20);
    forumAdapter = new TimelineAdapter(forumHelpers, getActivity(), query, recyclerView);
    recyclerView.setAdapter(forumAdapter);
    recyclerView.setCacheManager(forumAdapter);
    recyclerView.setPlayerSelector(PlayerSelector.DEFAULT);
} ** 

RecyclerView Adapter::: ** public class TimelineAdapter extends RecyclerView.Adapter implements CacheManager {

private static final String TAG = "TimelineAdapter";

static final int TYPE_IMAGE = 1;
static final int TYPE_VIDEO = 2;
@Nullable
private Callback callback;
private List<ForumHelper> forumHelpers = new ArrayList<>();
private final Query query;
private RecyclerView feedRecycler;
private RequestManager requestManager;
private PreCachingLayoutManager layoutManager;
private List<String> contentIds = new ArrayList<>();
private ForumHelper forumHelperChanged;
private long id;
private Context activity;
private View vidPost;
public DocumentSnapshot lastResult;

public TimelineAdapter(final List<ForumHelper> forumHelpers, final Context activity,
                       final Query query, RecyclerView feedRecycler) {
    super();
    this.activity = activity;
    this.forumHelpers = forumHelpers;
    this.query = query;
    this.feedRecycler = feedRecycler;
    setHasStableIds(true);
    getData(forumHelpers, query); // for getiing data from firebstore and 

}

public void setCallback(@Nullable Callback callback) { this.callback = callback; }

@Override
public long getItemId(int position) {
    return position;
}

@NonNull
@Override
public TimelineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    final TimelineViewHolder viewHolder = TimelineViewHolder.createViewHolder(parent, viewType);
    viewHolder.setClickListener(v -> {
        int pos = viewHolder.getAdapterPosition();
        if (callback != null && pos != RecyclerView.NO_POSITION) {
            callback.onItemClick(viewHolder, v, getItem(pos), pos);
        }
    });
    return viewHolder;
}

private ForumHelper getItem(int pos) {
    return forumHelpers.get(pos);
}

@Override
public int getItemViewType(int position) {
        if (forumHelpers.get(position).getType().equals(kMap.video)) {
            return TYPE_VIDEO;
        } else return TYPE_IMAGE;
}

@Override
public void onBindViewHolder(@NonNull TimelineViewHolder holder, int position) {
    forumHelpers.get(position).setIndex(position);
    holder.bind(this, holder, getItem(position), null);
    holder.setClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e(TAG, "onBindViewHolder:Index::" + getItem(position).getIndex());
            Log.e(TAG, "onClick: Position::" + position);
        }
    });

}

@Override
public void onViewRecycled(@NonNull TimelineViewHolder holder) {
    holder.onRecycled();
}

@Override
public int getItemCount() {
    return forumHelpers.size();
}

static abstract class Callback {

    abstract void onItemClick(@NonNull TimelineViewHolder viewHolder, @NonNull View view,
                              @NonNull ForumHelper item, int position);
}

// Implement the CacheManager;

@NonNull
@Override
public Object getKeyForOrder(int order) {
    Log.e(TAG, "getKeyForOrder: " + order);
    return getItem(order);
}

@Nullable
@Override
public Integer getOrderForKey(@NonNull Object key) {
    Log.e(TAG, "getOrderForKey: " + key);
    return key instanceof ForumHelper ? forumHelpers.indexOf(key) : null;
}

} **

Recyclerview View Holder ** public class TimelineViewHolder extends RecyclerView.ViewHolder { private static final String TAG = "TimelineViewHolder"; private static final int LAYOUT_RES = R.layout.z_feed_main;

public ImageView iHeart;
public CircleIndicator2 indicator;
private List<String> contentIds;
public TextView time_post, tLiked, tViewCount, tComment;
public Context context;
public ImageView privacyBtn;
public CircleImageView profileImg;
public TextView name_post, userId;

public View imageContainer, textContainer, videoContainer;
public FirebaseFirestore db = FirebaseFirestore.getInstance();

//Header
public ImageButton ib_more;
public View lHeader2;

//Text Holder
public SocialTextView tRawText;
private ImageView iBackground;
public SocialTextView stTextView;
//ImageHolder
public RecyclerView recyclerView;
public RelativeLayout iRL;

public TimelineViewHolder(@NonNull View itemView) {
    super(itemView);
    imageContainer = itemView.findViewById(R.id.imageContainer);
    textContainer = itemView.findViewById(R.id.textContainer);
    videoContainer = itemView.findViewById(R.id.videoContainer);
    context = itemView.getContext();

    // Header
    name_post = itemView.findViewById(R.id.tName);
    userId = itemView.findViewById(R.id.tUserId);
    profileImg = itemView.findViewById(R.id.iCircleUserImg);
    ib_more = itemView.findViewById(R.id.ib_more);
    lHeader2 = itemView.findViewById(R.id.lHeader2);
    // Footer
    time_post = itemView.findViewById(R.id.tTime);
    privacyBtn = itemView.findViewById(R.id.iPrivacy);
    iHeart = itemView.findViewById(R.id.iHeart);
    tLiked = itemView.findViewById(R.id.tLiked);
    tViewCount = itemView.findViewById(R.id.tViewCount);
    tComment = itemView.findViewById(R.id.tComment);
    // TextHolder
    tRawText = itemView.findViewById(R.id.detail_text_type);

    // ImageHolder
    recyclerView = itemView.findViewById(R.id.imageRecyclerForum);
    indicator = itemView.findViewById(R.id.indicator);
    stTextView = itemView.findViewById(R.id.stTextView);
    //iRL=itemView.findViewById(R.id.lIRL);

    //Video Container

}

public static TimelineViewHolder createViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(LAYOUT_RES, parent, false);
    final TimelineViewHolder viewHolder;
    switch (viewType) {
        case TimelineAdapter.TYPE_IMAGE:
            viewHolder = new TimelineViewHolder(view);
            break;
        case TimelineAdapter.TYPE_VIDEO:
            viewHolder = new TimelineVideoViewHolder(view);
            break;
        default:
            throw new IllegalArgumentException("Non supported view type: " + viewType);
    }

    return viewHolder;
}

public void setClickListener(View.OnClickListener clickListener) {
    this.itemView.setOnClickListener(clickListener);
}

public void bind(TimelineAdapter timelineAdapter, TimelineViewHolder holder,
                 ForumHelper item, Object o) {
    new Header(holder, item, itemView.getContext());
    new Footer(holder, item, itemView.getContext());
    holder.imageContainer.setVisibility(View.VISIBLE);
    holder.textContainer.setVisibility(View.GONE);
    holder.videoContainer.setVisibility(View.GONE);
    if(item.getType().equals(kMap.image)){
        new ImageHolder(holder, item, itemView.getContext());
    }

}

public void onRecycled() {
}

} **

VideoViewHolder ** class TimelineVideoViewHolder extends TimelineViewHolder implements ToroPlayer { private static final String TAG = "TimelineVideoViewHolder"; private final Playable.EventListener listener = new Playable.DefaultEventListener() { @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { super.onPlayerStateChanged(playWhenReady, playbackState); tPlayerState.setText(format(Locale.getDefault(), "STATE: %d・PWR: %s", playbackState, playWhenReady)); } }; @Nullable private ExoPlayerViewHelper helper; @Nullable private Uri mediaUri; private String val; //Video Holder public PlayerView playerView; public TextView tPlayerState;

public TimelineVideoViewHolder(View itemView) {
    super(itemView);
    playerView = itemView.findViewById(R.id.playerView);
    tPlayerState = itemView.findViewById(R.id.player_state);
    imageContainer.setVisibility(View.GONE);
    textContainer.setVisibility(View.GONE);
    videoContainer.setVisibility(View.VISIBLE);
    val="/////////////////////////////////";
    Log.e(TAG, "TimelineVideoViewHolder: ");
}

@Override
public void bind(TimelineAdapter timelineAdapter, TimelineViewHolder holder,
                 ForumHelper item, Object o) {
    super.bind(timelineAdapter, holder, item, o);
    mediaUri = Uri.parse(item.getMedia_url());
    Log.d(TAG, "bind: "+mediaUri);
}

@NonNull
@Override
public View getPlayerView() {
    return this.playerView;
}

@NonNull
@Override
public PlaybackInfo getCurrentPlaybackInfo() {
    return helper != null ? helper.getLatestPlaybackInfo() : new PlaybackInfo();
}

@Override
public void initialize(@NonNull Container container, @NonNull PlaybackInfo playbackInfo) {
    Log.e(TAG, "initialize: " + val);
    if (mediaUri == null) throw new IllegalStateException("mediaUri is null.");
    if (helper == null) {
        helper = new ExoPlayerViewHelper(this, mediaUri);
        helper.addEventListener(listener);
    }
    helper.initialize(container, playbackInfo);
}

@Override
public void play() {
    if (helper != null) helper.play();
}

@Override
public void pause() {
    if (helper != null) helper.pause();
}

@Override
public boolean isPlaying() {
    return helper != null && helper.isPlaying();
}

@Override
public void release() {
    if (helper != null) {
        helper.removeEventListener(listener);
        helper.release();
        helper = null;
    }
}

@Override
public boolean wantsToPlay() {
    return ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= 0.85;
}

@Override
public int getPlayerOrder() {
    return getAdapterPosition();
}

} **