eneim / toro

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

App is crashing with the following error #495

Open sanjay147654 opened 4 years ago

sanjay147654 commented 4 years ago

java.lang.NoSuchMethodError: No direct method (Lcom/google/android/exoplayer2/RenderersFactory;Lcom/google/android/exoplayer2/trackselection/TrackSelector;Lcom/google/android/exoplayer2/LoadControl;Lcom/google/android/exoplayer2/drm/DrmSessionManager;)V in class Lcom/google/android/exoplayer2/SimpleExoPlayer; or its super classes (declaration of 'com.google.android.exoplayer2.SimpleExoPlayer' appears in /data/app/com.architectica.socialcomponents-YF9M7H9a9efK3DXdaFg6gw==/base.apk) at im.ene.toro.exoplayer.ToroExoPlayer.(ToroExoPlayer.java:47) at im.ene.toro.exoplayer.DefaultExoCreator.createPlayer(DefaultExoCreator.java:118) at im.ene.toro.exoplayer.ToroExo.requestPlayer(ToroExo.java:153) at im.ene.toro.exoplayer.PlayableImpl.ensurePlayer(PlayableImpl.java:261) at im.ene.toro.exoplayer.PlayableImpl.ensureMediaSource(PlayableImpl.java:251) at im.ene.toro.exoplayer.PlayableImpl.play(PlayableImpl.java:101) at im.ene.toro.exoplayer.ExoPlayable.play(ExoPlayable.java:47) at im.ene.toro.exoplayer.ExoPlayerViewHelper.play(ExoPlayerViewHelper.java:108) at com.architectica.socialcomponents.adapters.holders.PostVideoViewHolder.play(PostVideoViewHolder.java:239) at im.ene.toro.widget.PlayerManager.play(PlayerManager.java:85) at im.ene.toro.widget.PlayerManager.play(PlayerManager.java:75) at im.ene.toro.widget.Container.onScrollStateChanged(Container.java:335) at im.ene.toro.widget.Container$AnimatorHelper.handleMessage(Container.java:796) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:232) at android.app.ActivityThread.main(ActivityThread.java:7172) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:576) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

My Build.gradle

//exoplayer implementation "com.google.android.exoplayer:exoplayer:2.8.4" implementation 'com.google.android.exoplayer:exoplayer-ui:2.8.4' implementation "im.ene.toro3:toro:3.6.2.2804" implementation "im.ene.toro3:toro-ext-exoplayer:3.6.2.2804"

My ViewHolder public class PostVideoViewHolder extends RecyclerView.ViewHolder implements ToroPlayer {

public static final String TAG = PostViewHolder.class.getSimpleName();

ExoPlayerViewHelper helper;
PlayerView playerView;

public LinearLayout mediaContainer;
private LinearLayout countersLayout;
protected Context context;
public ImageView postImageView;
TextView titleTextView;
SocialTextView detailsTextView;
private TextView likeCounterTextView,userName,userSkill;
private ImageView likesImageView;
private TextView commentsCountTextView;
private TextView watcherCounterTextView;
private TextView dateTextView;
private ImageView authorImageView;
private ViewGroup likeViewGroup;

private ProfileManager profileManager;
protected PostManager postManager;

private LikeController likeController;
private BaseActivity baseActivity;

Uri mediaUri = Uri.parse("https://www.youtube.com/watch?v=0tOxrpPbx_c");
Post post;

public PostVideoViewHolder(View view, final PostViewHolder.OnClickListener onClickListener, BaseActivity activity) {
    this(view, onClickListener, activity, true);
}

public PostVideoViewHolder(View view, final PostViewHolder.OnClickListener onClickListener, BaseActivity activity, boolean isAuthorNeeded) {
    super(view);
    this.context = view.getContext();
    this.baseActivity = activity;

    playerView = view.findViewById(R.id.playerView);

    mediaContainer = view.findViewById(R.id.mediaContainer);
    postImageView = view.findViewById(R.id.postImageView);
    userName=view.findViewById(R.id.user);
    userSkill=view.findViewById(R.id.userInfo);
    likeCounterTextView = view.findViewById(R.id.likeCounterTextView);
    likesImageView = view.findViewById(R.id.likesImageView);
    commentsCountTextView = view.findViewById(R.id.commentsCountTextView);
    watcherCounterTextView = view.findViewById(R.id.watcherCounterTextView);
    dateTextView = view.findViewById(R.id.dateTextView);
    titleTextView = view.findViewById(R.id.titleTextView);
    detailsTextView = view.findViewById(R.id.detailsTextView);
    countersLayout = view.findViewById(R.id.countersContainer);

    countersLayout.setVisibility(View.VISIBLE);

    detailsTextView.setHashtagColor(Color.RED);
    detailsTextView.setOnHashtagClickListener(new SocialView.OnClickListener() {
        @Override
        public void onClick(SocialView view, CharSequence text) {

            //Toast.makeText(context, text, Toast.LENGTH_SHORT).show();

            Log.i("text","" + text);

            Intent intent = new Intent(context, HashtagPostsActivity.class);
            intent.putExtra("hashtag","" + text);
            context.startActivity(intent);
            ((Activity) context).finish();

        }
    });

    authorImageView = view.findViewById(R.id.authorImageView);
    likeViewGroup = view.findViewById(R.id.likesContainer);

    authorImageView.setVisibility(isAuthorNeeded ? View.VISIBLE : View.GONE);

    profileManager = ProfileManager.getInstance(context.getApplicationContext());
    postManager = PostManager.getInstance(context.getApplicationContext());
    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

    view.setOnClickListener(v -> {
        int position = getAdapterPosition();
        if (onClickListener != null && position != RecyclerView.NO_POSITION) {
            onClickListener.onItemClick(getAdapterPosition(), v);
        }
    });

    likeViewGroup.setOnClickListener(view1 -> {
        int position = getAdapterPosition();
        if (onClickListener != null && position != RecyclerView.NO_POSITION) {
            onClickListener.onLikeClick(likeController, position);
        }
    });

    authorImageView.setOnClickListener(v -> {
        int position = getAdapterPosition();
        if (onClickListener != null && position != RecyclerView.NO_POSITION) {
            onClickListener.onAuthorClick(getAdapterPosition(), v);
        }
    });

}

public void bindData(Post post) {

    this.post = post;

    postManager.loadImageMediumSize(GlideApp.with(baseActivity), post.getImageTitle(), postImageView);

    likeController = new LikeController(context, post, likeCounterTextView, likesImageView, true);

    String title = removeNewLinesDividers(post.getTitle());
    titleTextView.setText(title);
    String description = removeNewLinesDividers(post.getDescription());
    detailsTextView.setText(description);
    likeCounterTextView.setText(String.valueOf(post.getLikesCount()));
    commentsCountTextView.setText(String.valueOf(post.getCommentsCount()));
    watcherCounterTextView.setText(String.valueOf(post.getWatchersCount()));

    CharSequence date = FormatterUtil.getRelativeTimeSpanStringShort(context, post.getCreatedDate());
    dateTextView.setText(date);

    if (post.getAuthorId() != null) {
        ProfileManager profileManager=new ProfileManager(context);
        profileManager.getProfileDetail(post.getAuthorId(),userName,userSkill);
        profileManager.getProfileSingleValue(post.getAuthorId(), createProfileChangeListener(authorImageView));
    }

    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    if (firebaseUser != null) {
        postManager.hasCurrentUserLikeSingleValue(post.getId(), firebaseUser.getUid(), createOnLikeObjectExistListener());
    }
}

private String removeNewLinesDividers(String text) {
    int decoratedTextLength = text.length() < Constants.Post.MAX_TEXT_LENGTH_IN_LIST ?
            text.length() : Constants.Post.MAX_TEXT_LENGTH_IN_LIST;
    return text.substring(0, decoratedTextLength).replaceAll("\n", " ").trim();
}

private OnObjectChangedListener<Profile> createProfileChangeListener(final ImageView authorImageView) {
    return new OnObjectChangedListenerSimple<Profile>() {
        @Override
        public void onObjectChanged(Profile obj) {
            if (obj != null && obj.getPhotoUrl() != null) {
                if (!baseActivity.isFinishing() && !baseActivity.isDestroyed()) {
                    ProjectImageUtil.loadImage(GlideApp.with(baseActivity), obj.getPhotoUrl(), authorImageView);
                }
            }
        }
    };
}

private OnObjectExistListener<Like> createOnLikeObjectExistListener() {
    return exist -> likeController.initLike(exist);
}

public void bind(Uri media) {
    if (media != null){
        this.mediaUri = media;
    }
}

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

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

@Override
public void initialize(@NonNull Container container, @NonNull PlaybackInfo playbackInfo) {
    if (helper == null) {
        if (mediaUri != null){
            helper = new ExoPlayerViewHelper(this, mediaUri);
        }
    }
    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.release();
        helper = null;
    }
}

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

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

public interface OnClickListener {
    void onItemClick(int position, View view);

    void onLikeClick(LikeController likeController, int position);

    void onAuthorClick(int position, View view);
}

}

Let me know if you need anything else.

What i have tried: I tried using the latest version of toro with the corresponding exoplayer version, but no success

xyarim commented 4 years ago

Found a solution?

OhhhThisVarun commented 4 years ago

Got anything on this?

anathefish commented 4 years ago

Also having it

mehdishz11 commented 3 years ago

It's because of exoPlayer version! library not update by last version of Exoplayer. by the way use these implementation :

implementation "im.ene.toro3:toro:3.7.0.2010003"
    implementation "im.ene.toro3:toro-ext-exoplayer:3.7.0.2010003"
    implementation "com.google.android.exoplayer:exoplayer:2.10.3"
itmanzzz commented 3 years ago

It's because of exoPlayer version! library not update by last version of Exoplayer. by the way use these implementation :

implementation "im.ene.toro3:toro:3.7.0.2010003"
    implementation "im.ene.toro3:toro-ext-exoplayer:3.7.0.2010003"
    implementation "com.google.android.exoplayer:exoplayer:2.10.3"

Yeah, you saved my day ^^ Thank you!