package com.ved.musicmapapp.adapters; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Typeface; import android.os.AsyncTask; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.BaseExpandableListAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ExpandableListView; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; import com.google.android.youtube.player.YouTubeInitializationResult; import com.google.android.youtube.player.YouTubePlayer; import com.google.android.youtube.player.YouTubePlayer.ErrorReason; import com.google.android.youtube.player.YouTubePlayer.OnFullscreenListener; import com.google.android.youtube.player.YouTubePlayer.OnInitializedListener; import com.google.android.youtube.player.YouTubePlayer.PlaybackEventListener; import com.google.android.youtube.player.YouTubePlayer.PlayerStateChangeListener; import com.google.android.youtube.player.YouTubePlayer.PlayerStyle; import com.google.android.youtube.player.YouTubePlayer.Provider; import com.google.android.youtube.player.YouTubePlayerSupportFragment; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.ved.musicmapapp.MainActivity; import com.ved.musicmapapp.R; import com.ved.musicmapapp.Objects.Artist; import com.ved.musicmapapp.Objects.Playlist; import com.ved.musicmapapp.Objects.PlaylistArSong; import com.ved.musicmapapp.Objects.PlaylistArtist; import com.ved.musicmapapp.Objects.Song; import com.ved.musicmapapp.Objects.User; import com.ved.musicmapapp.providers.AddSongToUserPlaylistTask; import com.ved.musicmapapp.providers.AddUserPlaylistsListTask; import com.ved.musicmapapp.providers.LikeSongTask; import com.ved.musicmapapp.utils.Statics; import com.ved.musicmapapp.youtube.Video; import com.ved.musicmapapp.youtube.YouTube; import com.ved.musicmapapp.youtube.YouTubeException; public class ExpandableListAdapter extends BaseExpandableListAdapter implements OnInitializedListener{ //private Context _context; private Activity cxt; private ArrayList<Song> songs; private ArrayList<PlaylistArtist> playlistArtists; private LayoutInflater inflat; private OnClickSong oCS; private OnBuySong oBS; private int curSelected = -1; private boolean hasData = false; private boolean isPlayAll; private User user; private int positionClicked = -1; private Artist artist; private boolean isCurrentUser; private ImageLoader imageLoader; private DisplayImageOptions options; ArrayList<Video> youTubeVideos=null; ImageView play,back,forword; SeekBar timelineBar; TextView startTime,endTime; TextView title; List<String> songIdList=null; long currentTime; String artistName; YouTubePlayer player; YouTubePlayerSupportFragment youTubePlayerView; public static final String YOUTUBE_API_KEY = "AIzaSyDyUIwVD3XycHKHL_acjO1OPf3PHPsuFHA"; // ProgressDialog pd; float mDensity; int lastExpandedGroupPosition= -1; private boolean fromPlaylists; FrameLayout loadingLayout; LinearLayout youtubeVideoContainer; ImageButton btnFullScreen; public boolean isPlayAll() { return isPlayAll; } ExpandableListView listView; public void setPlayAll(boolean isPlayAll) { this.isPlayAll = isPlayAll; } public ExpandableListAdapter(Activity cxt, ArrayList<Song> songs, User mUser, String artistName, Artist artist, ExpandableListView listView) { this.cxt = cxt; this.songs = songs; this.user = mUser; this.artistName = artistName; this.artist = artist; this.listView = listView; // pd = new ProgressDialog(cxt); // pd.setMessage("Loading..."); // pd.setCancelable(false); youTubeVideos = new ArrayList<Video>(); youTubePlayerView = new YouTubePlayerSupportFragment(); youTubePlayerView.initialize(YOUTUBE_API_KEY, this); mDensity = cxt.getResources().getDisplayMetrics().density; inflat = (LayoutInflater) cxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE); isCurrentUser = mUser.getID() == Statics.curUser.getID() ? true : false; imageLoader = ImageLoader.getInstance(); options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.img_no_image) .showImageForEmptyUri(R.drawable.img_no_image) .showImageOnFail(R.drawable.img_no_image).cacheInMemory(true) .cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565).build(); } public ExpandableListAdapter(Activity cxt, ArrayList<Song> songs, User mUser, String artistName, Artist artist, ExpandableListView listView, boolean fromPlaylists, ArrayList<PlaylistArtist> artists) { this.cxt = cxt; this.songs = songs; this.user = mUser; this.artistName = artistName; this.artist = artist; this.fromPlaylists = fromPlaylists; this.playlistArtists = artists; this.listView = listView; // pd = new ProgressDialog(cxt); // pd.setMessage("Loading..."); // pd.setCancelable(false); youTubeVideos = new ArrayList<Video>(); youTubePlayerView = new YouTubePlayerSupportFragment(); youTubePlayerView.initialize(YOUTUBE_API_KEY, this); mDensity = cxt.getResources().getDisplayMetrics().density; inflat = (LayoutInflater) cxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE); isCurrentUser = mUser.getID() == Statics.curUser.getID() ? true : false; imageLoader = ImageLoader.getInstance(); options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.img_no_image) .showImageForEmptyUri(R.drawable.img_no_image) .showImageOnFail(R.drawable.img_no_image).cacheInMemory(true) .cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565).build(); } @Override public Object getChild(int groupPosition, int childPosititon) { return this.songs.get(groupPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, final int childPosition,boolean isLastChild, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this.cxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_item, null); } youtubeVideoContainer = (LinearLayout)convertView.findViewById(R.id.youtube_video_container); loadingLayout = (FrameLayout)convertView.findViewById(R.id.loading_video_layout); youtubeVideoContainer.setVisibility(View.GONE); loadingLayout.setVisibility(View.VISIBLE); startTime=(TextView)convertView.findViewById(R.id.txt_starttime); endTime=(TextView)convertView.findViewById(R.id.txt_endtime); btnFullScreen = (ImageButton)convertView.findViewById(R.id.btnFullScreen); if(player == null){ FragmentManager fragmentManager = ((FragmentActivity)cxt).getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.youtube_view, youTubePlayerView,"Youtube"); fragmentTransaction.commit(); startTime.setText("00:00"); endTime.setText("00:00"); } play = (ImageView)convertView.findViewById(R.id.btnPlay); back = (ImageView)convertView.findViewById(R.id.btnBack); forword = (ImageView)convertView.findViewById(R.id.btnForword); back.setEnabled(false); forword.setEnabled(false); timelineBar = (SeekBar)convertView.findViewById(R.id.songProgressBar); title=(TextView)convertView.findViewById(R.id.song_title); btnFullScreen.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if(player!=null) player.setFullscreen(true); } }); timelineBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { int progress = timelineBar.getProgress(); if(player!=null) { player.seekToMillis(progress*1000); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { } }); play.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if(songIdList==null) { play.setImageDrawable(cxt.getResources().getDrawable(R.drawable.pause_youtube)); } else if (player != null && player.isPlaying()) { player.pause(); } else if(player != null && !player.isPlaying()) { player.play(); } notifyDataSetChanged(); } }); if(player != null && player.isPlaying()) { play.setImageDrawable(cxt.getResources().getDrawable(R.drawable.pause_youtube)); } else if (player!=null && !player.isPlaying()) { play.setImageDrawable(cxt.getResources().getDrawable(R.drawable.play_youtube)); } return convertView; } @Override public int getChildrenCount(int groupPosition) { return 1; } @Override public Object getGroup(int groupPosition) { return this.songs.get(groupPosition); } @Override public int getGroupCount() { return this.songs.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } public Song getItem(int arg0) { // TODO Auto-generated method stub return songs.get(arg0); } public void startYoutube(int pos){ dismissLoading(true); setSongStateInList(Song.ListStauts.PLAYING, pos); GetTrackFromYoutubeTask youtubeTask = new GetTrackFromYoutubeTask(songs.get(pos).getTitle(), artistName); youtubeTask.execute(); } public void startYoutube_forPlaylist(int pos){ dismissLoading(true); setSongStateInList(Song.ListStauts.PLAYING, pos); GetTrackFromYoutubeTask youtubeTask = new GetTrackFromYoutubeTask(songs.get(pos).getTitle(), songs.get(pos).getHeaderText()); youtubeTask.execute(); } @Override public View getGroupView(final int pos, boolean isExpanded,View v, ViewGroup parent) { final Song songDataModel = getItem(pos); if (v == null) { v = inflat.inflate(R.layout.item_song, null); } View headerView = v.findViewById(R.id.layout_section); if(this.fromPlaylists && this.playlistArtists != null && this.playlistArtists.size() > 0) { if(songDataModel.getHeaderText().equals("")) { headerView.setVisibility(View.GONE); }else { headerView.setVisibility(View.VISIBLE); TextView artistNameTv = (TextView) v.findViewById(R.id.artistName); artistNameTv.setText(songDataModel.getHeaderText()); songDataModel.getAristitId(); final ImageView avatar = (ImageView) v.findViewById(R.id.ivThumb); imageLoader.displayImage(songDataModel.getArtistAvatar(), avatar, options, new ImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) { // TODO Auto-generated method stub } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { // TODO Auto-generated method stub } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { avatar.setImageBitmap(loadedImage); } @Override public void onLoadingCancelled(String imageUri, View view) { // TODO Auto-generated method stub } }); } }else { headerView.setVisibility(View.GONE); } View imv_like = v.findViewById(R.id.imv_like); if(isCurrentUser || this.fromPlaylists) { imv_like.setVisibility(View.INVISIBLE); } final TextView tv_name = (TextView) v.findViewById(R.id.tv_songName); Typeface tf = Typeface.createFromAsset(cxt.getAssets(), "open_sans_regular.ttf"); tv_name.setTypeface(tf); tv_name.setText(songDataModel.getTitle()); imv_like.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { choosePlaylistDialog(pos); } }); ImageView imv_play = (ImageView) v.findViewById(R.id.imv_play); ImageView imv_buy = (ImageView) v.findViewById(R.id.imv_buy); ProgressBar progLoading = (ProgressBar) v.findViewById(R.id.progLoading); if (Song.ListStauts.LOADING == songDataModel.getListStatus() ) { progLoading.setVisibility(View.VISIBLE); imv_buy.setVisibility(View.GONE); imv_play.setVisibility(View.GONE); } else if (Song.ListStauts.PLAYING == songDataModel.getListStatus()) { progLoading.setVisibility(View.GONE); imv_buy.setVisibility(View.VISIBLE); imv_play.setVisibility(View.GONE); positionClicked = -1; } else if (Song.ListStauts.NORMAL == songDataModel.getListStatus()) { progLoading.setVisibility(View.GONE); imv_buy.setVisibility(View.GONE); imv_play.setVisibility(View.VISIBLE); } imv_buy.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if (null != oBS) oBS.onBuyClick(getItem(pos)); } }); v.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if (null != oCS) { setSelected(pos); oCS.onClick(songDataModel, pos, true); } } }); return v; } public void choosePlaylistDialog(final int pos){ final Dialog dialog = new Dialog(this.cxt); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.choose_playlist_dialog); dialog.setCanceledOnTouchOutside(false); // TextView existing_playlists_header = (TextView) dialog.findViewById(R.id.existing_playlists_header); LinearLayout playListContainer = (LinearLayout) dialog.findViewById(R.id.existing_playlists_container); View no_data = dialog.findViewById(R.id.no_data); final ArrayList <Playlist> playlists = Statics.curUser.getPlaylists(); if(playlists != null){ no_data.setVisibility(View.GONE); if(playlists.size() > 0){ for(int i = 0; i < playlists.size();i++){ final int finalIndex = i; View childLayout = inflat.inflate(R.layout.custom_textview, null); TextView customText = (TextView)childLayout.findViewById(R.id.customText); final Playlist currentIterationPlaylist = playlists.get(i); customText.setText(currentIterationPlaylist.getPlaylistName()); childLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int playlistId = currentIterationPlaylist.getID(); int playlistDbId = currentIterationPlaylist.getDB_id(); PlaylistArSong song = addSongToPlaylistDB(playlistId, playlistDbId, songs.get(pos), currentIterationPlaylist); if(song != null) { dialog.dismiss(); playlists.remove(currentIterationPlaylist); currentIterationPlaylist.addTrack(song, artist); playlists.add(finalIndex, currentIterationPlaylist); Statics.curUser.setPlaylists(playlists); Toast.makeText( cxt.getApplicationContext(), "Song Added Successfully..", Toast.LENGTH_SHORT).show(); ((MainActivity)cxt).pullDB(); } if(Statics.isNetworkConnected(cxt)){ new AddSongToUserPlaylistTask(cxt, Statics.curUser, currentIterationPlaylist) { protected void onPostExecute(String result) { super.onPostExecute(result); if(!result.equals("")) { Toast.makeText( cxt.getApplicationContext(), result, Toast.LENGTH_SHORT).show(); } }; }.execute(); new LikeSongTask(cxt).execute(Statics.curUser.getID(), songs.get(pos).getID(), Statics.LIKE); }else { Toast.makeText( cxt.getApplicationContext(), "Network not available, Information saved locally..", Toast.LENGTH_SHORT).show(); } } }); playListContainer.addView(childLayout); } } else no_data.setVisibility(View.VISIBLE); } else{ // existing_playlists_header.setVisibility(View.GONE); // playListContainer.setVisibility(View.GONE); } View create_playlist = dialog.findViewById(R.id.create_playlist); create_playlist.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { dialog.dismiss(); addPlaylistDialog(); } }); dialog.show(); } private PlaylistArSong addSongToPlaylistDB(int playlistId, int playlistDbId, Song song, Playlist playlist) { DBAdapter adapter = new DBAdapter(cxt); PlaylistArSong plSong = new PlaylistArSong(); plSong.setID(song.getID()); plSong.setTitle(song.getTitle()); plSong.setAlbum(song.getAlbum()); plSong.setBuyLink(song.getBuyLink("us"),"us"); plSong.set7DigigtalTrackId(song.get7DigigtalTrackId("us"),"us"); plSong.setBuyLink(song.getBuyLink("gb"),"gb"); plSong.set7DigigtalTrackId(song.get7DigigtalTrackId("gb"),"gb"); plSong.setHasSong(song.isHasSong()); plSong.setLiked(song.isLiked()); plSong.setStartLike(song.getStartLike()); plSong.setEndLike(song.getEndLike()); plSong.setAristitId(artist.getID()); plSong.setUserId(Statics.curUser.getID()); plSong.setIsSynch(-1); plSong.setPlaylistId(playlistId); //Adding song to songs table String output = adapter.addSongToPlaylist(plSong); if(output.equals("")) { //Adding artist to artist table adapter.addPlaylistArtist(artist, Statics.curUser, playlistId); //Upating track count in playlist table int trackCount = playlist.getNumberOfTracks(); playlist.setNumberOfTracks(trackCount + 1); adapter.updatePlaylist(playlist, Statics.curUser); return plSong; } else { Toast.makeText( cxt.getApplicationContext(), output, Toast.LENGTH_SHORT).show(); return null; } } private void addPlaylistToDB(String name) { DBAdapter adapter = new DBAdapter(cxt); Playlist pl = new Playlist(); pl.setID(-1); pl.setUserId(Statics.curUser.getID()+""); pl.setPlaylistName(name); pl.setDateAdded(System.currentTimeMillis()); pl.setLastUpdated(0L); pl.setArtistAvatar(""); pl.setNumberOfTracks(0); boolean success = adapter.addUserPlaylistIfNotExists(pl, Statics.curUser); if(success) { // Adding list to memory model, if its added to database ArrayList <Playlist> playlists = Statics.curUser.getPlaylists(); if(playlists == null) { playlists = new ArrayList<Playlist>(); } playlists.add(pl); Statics.curUser.setPlaylists(playlists); Toast.makeText( cxt.getApplicationContext(), "Playlist Successfully Created..", Toast.LENGTH_SHORT).show(); } else { Toast.makeText( cxt.getApplicationContext(), "Playlist with same name already exists.", Toast.LENGTH_SHORT).show(); } } public void addPlaylistDialog(){ final Dialog dialog = new Dialog(this.cxt); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.create_playlist_dialog); dialog.setCanceledOnTouchOutside(false); final EditText playlistName = (EditText) dialog.findViewById(R.id.et_playlist_name); Button add = (Button)dialog.findViewById(R.id.btn_addplaylist); add.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { String text = playlistName.getText().toString(); if(!text.equals("")){ dialog.dismiss(); addPlaylistToDB(text); if(Statics.isNetworkConnected(cxt)) { //Post those which are not yet posted to server new AddUserPlaylistsListTask(cxt, Statics.curUser) { protected void onPostExecute(User result) { super.onPostExecute(result); }; }.execute(); }else { Toast.makeText( cxt.getApplicationContext(), "Network not available, Information saved locally..", Toast.LENGTH_SHORT).show(); } } } }); dialog.show(); } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } public void setOnClickSong(OnClickSong oCS) { this.oCS = oCS; } public void setOnClickBuySong(OnBuySong oBS) { this.oBS = oBS; } public interface OnClickSong { public void onClick(Song song, int position, boolean play); } public interface OnBuySong { public void onBuyClick(Song song); } public void clickItem(int position) { if (null != oCS) { setSelected(position); oCS.onClick(songs.get(position), position, true); } } public void dismissLoading(boolean hasData) { this.hasData = hasData; notifyDataSetChanged(); } public void setSelected(int pos) { curSelected = pos; notifyDataSetChanged(); } public void setSelectedSongPosition(int pos) { positionClicked = pos; notifyDataSetChanged(); } public void setCurrentSongState() { if(songs.size() > curSelected) { Song selectedSong = songs.get(curSelected); selectedSong.setListStatus(Song.ListStauts.NORMAL); notifyDataSetChanged(); } } // @Override // public int getCount() { // // count = songs.size(); // // count = (count > Statics.EXPAND_VIEW_COUNT) ? // // Statics.EXPAND_VIEW_COUNT // // : count; // return /* count */songs.size(); // } public int getCount() { return songs.size(); } private class GetTrackFromYoutubeTask extends AsyncTask<Void, Void, String> { private String songTitlesToSearch; public GetTrackFromYoutubeTask (String songTitle, String artistName) { if(!artistName.toLowerCase().contains("unknown")) songTitlesToSearch = songTitle + ","+artistName; else songTitlesToSearch = songTitle; } @Override protected void onPreExecute(){ // pd.show(); // youtubeVideoContainer.setVisibility(View.GONE); // loadingLayout.setVisibility(View.VISIBLE); } @Override protected String doInBackground(Void... params) { List<Video> lst = null; try { lst = new YouTube().getVideos(songTitlesToSearch); } catch (YouTubeException e) { e.printStackTrace(); return null; } if(lst != null){ youTubeVideos.clear(); for (Video l : lst) { youTubeVideos.add(l); } } return songTitlesToSearch; } @Override protected void onPostExecute(String result) { if(result == null || youTubeVideos.size() == 0){ Toast.makeText(cxt, "Error While loading Song, Try Again Later..!", Toast.LENGTH_SHORT).show(); // youtubeVideoContainer.setVisibility(View.VISIBLE); // loadingLayout.setVisibility(View.GONE); // pd.dismiss(); if(isPlayAll){ lastExpandedGroupPosition++; startYoutubeVideo(lastExpandedGroupPosition); } return; } Video video = youTubeVideos.get(0); new VideoAsyncTask(cxt).execute(); } } @Override public void onInitializationFailure(Provider provider, YouTubeInitializationResult result) { Toast.makeText(cxt, "Failured to Initialize!", Toast.LENGTH_LONG).show(); } @Override public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) { this.player = player; this.player.setFullscreen(false); player.setFullscreenControlFlags(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_SYSTEM_UI); this.player.setShowFullscreenButton(true); this.player.setPlayerStyle(PlayerStyle.CHROMELESS); this.player.setPlayerStateChangeListener(playerStateChangeListener); this.player.setPlaybackEventListener(playbackEventListener); player.setOnFullscreenListener(new OnFullscreenListener(){ @Override public void onFullscreen(boolean arg0) { Log.i("check","Video Played in full screen"); }}); } private class VideoAsyncTask extends AsyncTask<String, String, String> { public VideoAsyncTask(Activity con) { //TODO: } @Override protected void onPreExecute() { //TODO: } @Override protected String doInBackground(String... params) { //TODO: Log.i("check","In do in background...."); return null; } @Override protected void onPostExecute(String result) { if(player!=null) { songIdList = new ArrayList<String>(); songIdList.add(Video.getId(0)); //songIdList = getSongIds(videoList); if(songIdList != null){ Log.i("check","Video id is : "+ Video.getId(0)); player.loadVideos(songIdList); } //player.play(); } } @Override protected void onProgressUpdate(String... text) { //TODO: } } private PlayerStateChangeListener playerStateChangeListener = new PlayerStateChangeListener() { @Override public void onAdStarted() { Log.i("check","///onVideo AddStarted"); } @Override public void onLoaded(final String id) { cxt.runOnUiThread(new Runnable() { @Override public void run() { Video video = youTubeVideos.get(0); Log.i("check","///onLoaded : "+ video.title); } }); } @Override public void onLoading() { Log.i("check","///onVideo Loading"); } @Override public void onVideoEnded() { Log.i("check","///onVideo Ended"); Log.i("check","///onVideo End"); if(isPlayAll){ lastExpandedGroupPosition++; startYoutubeVideo(lastExpandedGroupPosition); } if(play != null) play.setImageDrawable(cxt.getResources().getDrawable(R.drawable.play_youtube)); } @SuppressLint("NewApi") @Override public void onVideoStarted() { Log.i("check","///onVideo Started"); final long duration = TimeUnit.MILLISECONDS.toSeconds(player.getDurationMillis()); timelineBar.setMax((int)duration); currentTime = TimeUnit.MILLISECONDS.toSeconds(player.getCurrentTimeMillis()); final Thread t = new Thread(){ int stTimeSec = 0; int stTimeMin=0; int count=0; @Override public void run(){ while(currentTime<=duration){ try { sleep(900); } catch (InterruptedException e) { e.printStackTrace(); } cxt.runOnUiThread(new Runnable() { @Override public void run() { //pd.dismiss(); long progress =+ currentTime; if(player != null){ play.setImageDrawable(cxt.getResources().getDrawable(R.drawable.pause_youtube)); long mili = player.getDurationMillis(); SimpleDateFormat formatter = new SimpleDateFormat("mm:ss"); Date date = new Date(mili); String result = formatter.format(date); endTime.setText(""+result); //int second = (player.getCurrentTimeMillis()/1000)%60; Log.i("","onVideo time "+currentTime); stTimeSec = (player.getCurrentTimeMillis()/1000)%60; stTimeMin = (player.getCurrentTimeMillis() / 1000) / 60; long mili1 = player.getCurrentTimeMillis(); SimpleDateFormat formatter1 = new SimpleDateFormat("mm:ss"); Date date1 = new Date(mili1); String result1 = formatter1.format(date1); startTime.setText(result1); currentTime = (player.getCurrentTimeMillis()/1000) % 60; Log.i("","onVideo current Time"+currentTime); count = (stTimeMin*60)+stTimeSec; // circularSeekbar.setProgress(count); timelineBar.setProgress(count); notifyDataSetChanged(); } }}); } //} } }; t.start(); } @Override public void onError(ErrorReason arg0) { youtubeVideoContainer.setVisibility(View.VISIBLE); loadingLayout.setVisibility(View.GONE); // pd.dismiss(); Log.i("check","///onError"); if(play != null) play.setImageDrawable(cxt.getResources().getDrawable(R.drawable.play_youtube)); } }; private PlaybackEventListener playbackEventListener = new PlaybackEventListener() { @Override public void onBuffering(boolean arg0) { youtubeVideoContainer.setVisibility(View.GONE); loadingLayout.setVisibility(View.VISIBLE); double mili = player.getDurationMillis(); double min = (mili/1000)/60; min = roundTwoDecimals(min); Log.i("","///mili "+ min); Log.i("check","///onBuffering"); } @Override public void onPaused() { Log.i("check","///onPaused"); } @Override public void onPlaying() { // pd.dismiss(); youtubeVideoContainer.setVisibility(View.VISIBLE); loadingLayout.setVisibility(View.GONE); Log.i("check","///onPlaying"); } @Override public void onSeekTo(int arg0) { Log.i("check","///onSeek "+arg0); } @Override public void onStopped() { Log.i("check","///onStopped "); } }; double roundTwoDecimals(double d) { DecimalFormat twoDForm = new DecimalFormat("#.##"); return Double.valueOf(twoDForm.format(d)); } public void clear() { if(player != null) player.release(); player = null; resetSongStatus(); } @Override public void onGroupExpanded(int groupPosition){ //collapse the old expanded group, if not the same //as new group to expand if(groupPosition != lastExpandedGroupPosition){ //pd.dismiss(); if(youtubeVideoContainer != null) youtubeVideoContainer.setVisibility(View.VISIBLE); if(loadingLayout != null) loadingLayout.setVisibility(View.GONE); listView.collapseGroup(lastExpandedGroupPosition); } super.onGroupExpanded(groupPosition); lastExpandedGroupPosition = groupPosition; } private void startYoutubeVideo(int groupPosition) { dismissLoading(true); //pd.dismiss(); youtubeVideoContainer.setVisibility(View.VISIBLE); loadingLayout.setVisibility(View.GONE); if(groupPosition >= songs.size()){ listView.collapseGroup(lastExpandedGroupPosition-1); isPlayAll = false; return; } if(!listView.isGroupExpanded(groupPosition)){ listView.collapseGroup(lastExpandedGroupPosition-1); listView.expandGroup(groupPosition); } else{ listView.collapseGroup(groupPosition); clear(); } startYoutube(groupPosition); } public void stopVideos(){ play.setImageDrawable(cxt.getResources().getDrawable(R.drawable.play_youtube)); notifyDataSetChanged(); player.pause(); } public void setSongStateInList(Song.ListStauts status, int position) { if(songs.size() > position) { Song song = songs.get(position); song.setListStatus(status); notifyDataSetChanged(); } } public void resetSongStatus() { for(Song song: songs) { song.setListStatus(Song.ListStauts.NORMAL); } notifyDataSetChanged(); } }