Skip to content

Commit

Permalink
fix some bugs and optimize performance
Browse files Browse the repository at this point in the history
  • Loading branch information
waynell committed May 9, 2016
1 parent e850150 commit b152323
Show file tree
Hide file tree
Showing 22 changed files with 567 additions and 479 deletions.
100 changes: 62 additions & 38 deletions app/src/main/java/com/waynell/videolist/demo/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
import android.view.LayoutInflater;
import android.view.ViewGroup;

import com.waynell.videolist.demo.model.VideoListItem;
import com.waynell.videolist.visibility.calculator.DefaultSingleItemCalculatorCallback;
import com.waynell.videolist.demo.model.VideoItem;
import com.waynell.videolist.visibility.calculator.SingleListViewItemActiveCalculator;
import com.waynell.videolist.visibility.scroll.ItemsPositionGetter;
import com.waynell.videolist.visibility.items.ListItem;
import com.waynell.videolist.visibility.scroll.ItemsProvider;
import com.waynell.videolist.visibility.scroll.RecyclerViewItemPositionGetter;

import java.util.ArrayList;
Expand All @@ -26,12 +26,7 @@ public class MainActivity extends AppCompatActivity {

private int mScrollState;

private ItemsPositionGetter mItemsPositionGetter;

private List<VideoListItem> mListItems = new ArrayList<>();

private SingleListViewItemActiveCalculator mCalculator = new SingleListViewItemActiveCalculator(new
DefaultSingleItemCalculatorCallback(), mListItems);
private SingleListViewItemActiveCalculator mCalculator;

private static final String url = "http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4";

Expand All @@ -52,65 +47,94 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
ButterKnife.bind(this);

mListItems.add(new VideoListItem(url, purl1));
mListItems.add(new VideoListItem(url2, purl2));
mListItems.add(new VideoListItem(url3, purl3));
mListItems.add(new VideoListItem(url4, purl4));
mListItems.add(new VideoListItem(url, purl1));
mListItems.add(new VideoListItem(url2, purl2));
mListItems.add(new VideoListItem(url3, purl3));
mListItems.add(new VideoListItem(url4, purl4));
mListItems.add(new VideoListItem(url, purl1));
mListItems.add(new VideoListItem(url2, purl2));
mListItems.add(new VideoListItem(url3, purl3));
mListItems.add(new VideoListItem(url4, purl4));
mListItems.add(new VideoListItem(url, purl1));
mListItems.add(new VideoListItem(url2, purl2));
mListItems.add(new VideoListItem(url3, purl3));
mListItems.add(new VideoListItem(url4, purl4));
mListItems.add(new VideoListItem(url, purl1));
mListItems.add(new VideoListItem(url2, purl2));
mListItems.add(new VideoListItem(url3, purl3));
mListItems.add(new VideoListItem(url4, purl4));

LinearLayoutManager layoutManager = new LinearLayoutManager(this);
final VideoListAdapter adapter = new VideoListAdapter();
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);

mCalculator = new SingleListViewItemActiveCalculator(adapter,
new RecyclerViewItemPositionGetter(layoutManager, mRecyclerView));

mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(new VideoListAdapter());
mItemsPositionGetter = new RecyclerViewItemPositionGetter(layoutManager, mRecyclerView);
mRecyclerView.setAdapter(adapter);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
mScrollState = newState;
if(newState == RecyclerView.SCROLL_STATE_IDLE && !mListItems.isEmpty()){
mCalculator.onScrollStateIdle(mItemsPositionGetter);
if(newState == RecyclerView.SCROLL_STATE_IDLE && adapter.getItemCount() > 0){
mCalculator.onScrollStateIdle();
}
}

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
mCalculator.onScrolled(mItemsPositionGetter, mScrollState);
mCalculator.onScrolled(mScrollState);
}
});
}

private class VideoListAdapter extends RecyclerView.Adapter<VideoViewHolder> {
private class VideoListAdapter extends RecyclerView.Adapter<VideoViewHolder> implements ItemsProvider {

private List<VideoItem> mListItems = new ArrayList<>();

public VideoListAdapter() {
generateMockData();
}

private void generateMockData() {
mListItems.add(new VideoItem(url, purl1));
mListItems.add(new VideoItem(url2, purl2));
mListItems.add(new VideoItem(url3, purl3));
mListItems.add(new VideoItem(url4, purl4));
mListItems.add(new VideoItem(url, purl1));
mListItems.add(new VideoItem(url2, purl2));
mListItems.add(new VideoItem(url3, purl3));
mListItems.add(new VideoItem(url4, purl4));
mListItems.add(new VideoItem(url, purl1));
mListItems.add(new VideoItem(url2, purl2));
mListItems.add(new VideoItem(url3, purl3));
mListItems.add(new VideoItem(url4, purl4));
mListItems.add(new VideoItem(url, purl1));
mListItems.add(new VideoItem(url2, purl2));
mListItems.add(new VideoItem(url3, purl3));
mListItems.add(new VideoItem(url4, purl4));
mListItems.add(new VideoItem(url, purl1));
mListItems.add(new VideoItem(url2, purl2));
mListItems.add(new VideoItem(url3, purl3));
mListItems.add(new VideoItem(url4, purl4));
}

@Override
public VideoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new VideoViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.video_list_item, parent, false));
}

public VideoItem getItem(int position) {
return mListItems.get(position);
}

@Override
public void onBindViewHolder(VideoViewHolder holder, int position) {
holder.bind(position, mListItems.get(position));
holder.bind(position, getItem(position));
}

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

@Override
public ListItem getListItem(int position) {
RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(position);
if (holder instanceof ListItem) {
return (ListItem) holder;
}
return null;
}

@Override
public int listItemSize() {
return getItemCount();
}
}

}
151 changes: 145 additions & 6 deletions app/src/main/java/com/waynell/videolist/demo/VideoViewHolder.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,37 @@
package com.waynell.videolist.demo;

import android.graphics.drawable.ColorDrawable;
import android.media.MediaPlayer;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorListener;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.model.GlideUrl;
import com.mikhaellopez.circularprogressbar.CircularProgressBar;
import com.waynell.videolist.demo.model.VideoListItem;
import com.waynell.videolist.demo.model.VideoItem;
import com.waynell.videolist.demo.model.VideoLoadMvpView;
import com.waynell.videolist.demo.target.VideoLoadTarget;
import com.waynell.videolist.demo.target.VideoProgressTarget;
import com.waynell.videolist.visibility.items.ListItem;
import com.waynell.videolist.widget.TextureVideoView;

import java.io.File;
import java.io.InputStream;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;


public class VideoViewHolder extends RecyclerView.ViewHolder {
public class VideoViewHolder extends RecyclerView.ViewHolder
implements ListItem, VideoLoadMvpView, ViewPropertyAnimatorListener {

@Bind(R.id.video_view)
public TextureVideoView videoView;
Expand All @@ -35,26 +45,155 @@ public class VideoViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.video_progress)
public CircularProgressBar progressBar;

private int videoState = STATE_IDLE;
private String videoLocalPath;

private final VideoProgressTarget progressTarget;
private final VideoLoadTarget videoTarget;

private static final int STATE_IDLE = 0;
private static final int STATE_ACTIVED = 1;
private static final int STATE_DEACTIVED = 2;

private static final String TAG = "ListItem";
private static final boolean SHOW_LOGS = BuildConfig.DEBUG;

public VideoViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
videoTarget = new VideoLoadTarget(videoView, videoCover);

videoView.setAlpha(0);

videoTarget = new VideoLoadTarget(this);
progressTarget = new VideoProgressTarget(videoTarget, progressBar);
}

public void bind(int position, VideoListItem item) {
item.bindView(videoView, videoCover);
videoTarget.bind(item);
@OnClick(R.id.video_view)
void cliclVideoView() {
if (!videoView.isHasAudio()) {
Toast.makeText(itemView.getContext(), "video has no sound", Toast.LENGTH_SHORT).show();
return;
}

if (videoView.isMute()) {
videoView.unMute();
Toast.makeText(itemView.getContext(), "turn on video sound", Toast.LENGTH_SHORT).show();
}
else {
videoView.mute();
Toast.makeText(itemView.getContext(), "turn off video sound", Toast.LENGTH_SHORT).show();
}
}

private void reset() {
videoState = STATE_IDLE;
videoView.stop();
videoLocalPath = null;
videoStopped();
}

public void bind(int position, VideoItem item) {
reset();

videoTitle.setText(String.format("Video Position %s", position));
progressTarget.setModel(item.getVideoUrl());

// load video cover photo
Glide.with(itemView.getContext())
.load(item.getCoverUrl())
.placeholder(new ColorDrawable(0xffdcdcdc))
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(videoCover);

// load video file
Glide.with(itemView.getContext())
.using(VideoListGlideModule.getOkHttpUrlLoader(), InputStream.class)
.load(new GlideUrl(item.getVideoUrl()))
.as(File.class)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(progressTarget);
}

private void cancelAlphaAnimate(View v) {
ViewCompat.animate(v).cancel();
}

private void startAlphaAnimate(View v) {
ViewCompat.animate(v).setListener(this).alpha(0f);
}

@Override
public TextureVideoView getVideoView() {
return videoView;
}

@Override
public void videoBeginning() {
videoView.setAlpha(1.f);
cancelAlphaAnimate(videoCover);
startAlphaAnimate(videoCover);
}

@Override
public void videoStopped() {
cancelAlphaAnimate(videoCover);
videoView.setAlpha(0);
videoCover.setAlpha(1.f);
videoCover.setVisibility(View.VISIBLE);
}

@Override
public void videoPrepared(MediaPlayer player) {

}

@Override
public void videoResourceReady(String videoPath) {
videoLocalPath = videoPath;
if(videoLocalPath != null) {
videoView.setVideoPath(videoPath);
if(videoState == STATE_ACTIVED) {
videoView.start();
}
}
}

@Override
public void setActive(View newActiveView, int newActiveViewPosition) {
if (SHOW_LOGS) {
Log.i(TAG, "setActive " + newActiveViewPosition + " path " + videoLocalPath);
}

videoState = STATE_ACTIVED;
if (videoLocalPath != null) {
videoView.setVideoPath(videoLocalPath);
videoView.start();
}
}

@Override
public void deactivate(View currentView, int position) {
if(SHOW_LOGS) {
Log.w(TAG, "deactivate " + position);
}

videoState = STATE_DEACTIVED;
videoView.stop();
videoStopped();
}

@Override
public void onAnimationStart(View view) {

}

@Override
public void onAnimationEnd(View view) {
view.setVisibility(View.GONE);
}

@Override
public void onAnimationCancel(View view) {

}
}
22 changes: 22 additions & 0 deletions app/src/main/java/com/waynell/videolist/demo/model/VideoItem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.waynell.videolist.demo.model;

/**
* @author Wayne
*/
public class VideoItem {
private String mVideoUrl;
private String mCoverUrl;

public VideoItem(String videoUrl, String coverUrl) {
mVideoUrl = videoUrl;
mCoverUrl = coverUrl;
}

public String getCoverUrl() {
return mCoverUrl;
}

public String getVideoUrl() {
return mVideoUrl;
}
}
Loading

0 comments on commit b152323

Please sign in to comment.