package com.ved.musicmapapp.fragments; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import net.londatiga.android.ActionItem; import net.londatiga.android.QuickAction; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import uk.co.sevendigital.android.sdk.api.SDIApi; import uk.co.sevendigital.android.sdk.api.SDIApi.Streaming; import uk.co.sevendigital.android.sdk.api.object.SDITrack; import uk.co.sevendigital.android.sdk.api.request.preview.SDIGetTrackPreviewRequest; import uk.co.sevendigital.android.sdk.util.SDIServerUtil; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.Typeface; import android.media.MediaPlayer; import android.media.MediaPlayer.OnPreparedListener; import android.os.AsyncTask; import android.os.Handler; import android.os.AsyncTask.Status; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewCompat; import android.util.Log; import android.util.Pair; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AbsListView; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.android.volley.RequestQueue; import com.android.volley.toolbox.Volley; import com.google.android.youtube.player.YouTubePlayer.OnFullscreenListener; 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.MainActivity.OnShareListener; 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.adapters.SongAdapter; import com.ved.musicmapapp.adapters.SongAdapter.OnBuySong; import com.ved.musicmapapp.adapters.SongAdapter.OnClickSong; import com.ved.musicmapapp.fragments.ArtistFragment.TrackDetails; import com.ved.musicmapapp.providers.GetArtistAvatarTask; import com.ved.musicmapapp.providers.GetTrackBuyLink; import com.ved.musicmapapp.providers.GetTrackPreview; import com.ved.musicmapapp.providers.Save7digitalIdTask; import com.ved.musicmapapp.providers.SubmitSongBuyLink; import com.ved.musicmapapp.services.UpdateLocationService; import com.ved.musicmapapp.utils.Statics; import com.ved.musicmapapp.utils.ToastManager; import com.ved.musicmapapp.utils.Utils; import com.ved.musicmapapp.youtube.Video; import com.ved.musicmapapp.youtube.YouTube; import com.ved.musicmapapp.youtube.YouTubeException; public class PlaylistTracksFragment extends Fragment implements OnShareListener,OnFullscreenListener { ListView expListView; SongAdapter sAdapter; private ImageView imv_player, imv_player_next, imv_player_prev; private boolean showed = false; private ArrayList<PlaylistArtist> artists; private Playlist playlist; private ArrayList<Song> songs; private ImageLoader imageLoader; private DisplayImageOptions options; private GetTrackPreview getTrackPreviewTask; private MediaPlayer mMediaPlayer; private int mSong = -1; private boolean loaded = false; private boolean pause = false; private View mBtnPlayAll; private User mUser; private Activity mContext; Typeface tf = null; View spinner; TextView spinnerTitle; String backgroundUrl=""; boolean isPlayAllSelected; private FragmentActivity mActivity; List<String> listDataHeader; HashMap<String, List<String>> listDataChild; private SDITrack mTrack; private byte[] mPreview; ArrayList<Video> youTubeVideos=null; private View videoBox; private boolean isFullscreen; private VideoFragment videoFragment; /** The duration of the animation sliding up the video in portrait. */ private static final int ANIMATION_DURATION_MILLIS = 300; /** The padding between the video list and the video in landscape orientation. */ private static final int LANDSCAPE_VIDEO_PADDING_DP = 5; LinearLayout loading_video_layout; // ProgressDialog progressDialog; @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); this.mContext = activity; mActivity = (FragmentActivity) activity; } public void setUser(User user) { mUser = user; } public void setPlaylist(Playlist pl) { this.playlist = pl; this.artists = pl.getArtists(); } @Override public void onSaveInstanceState(Bundle outState) { outState.putSerializable("user", mUser); outState.putSerializable("artist", artists); super.onSaveInstanceState(outState); } @Override public void onResume() { super.onResume(); // if (mUser != null // && (mUser.getFbid() == Statics.curUser.getFbid() || mUser // .isFollowed())) { // ((MainActivity) mContext).showShareAction(this); // } ((MainActivity) mContext).hideShareAction(); } static void sortListAscending(ArrayList<?> list){ Collections.sort(list, new Comparator<Object>(){ public int compare(Object o1, Object o2) { Song p1 = (Song) o1; Song p2 = (Song) o2; return p1.getTitle().compareTo(p2.getTitle()); } }); } static void sortListDscending(ArrayList<?> list){ Collections.sort(list, new Comparator<Object>(){ public int compare(Object o1, Object o2) { Song p1 = (Song) o1; Song p2 = (Song) o2; return p2.getTitle().compareTo(p1.getTitle()); } }); } public void playAudioOnly(int groupPosition){ sAdapter.dismissLoading(true); if (null != mMediaPlayer && mMediaPlayer.isPlaying()) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } mSong = groupPosition; loaded = false; pause = false; imv_player.setTag(true); Song song = (Song)sAdapter.getItem(groupPosition); loadSong(song); sAdapter.setSelectedSongPosition(groupPosition); showed = true; } @SuppressLint("NewApi") private void startYoutubeVideo(final int groupPosition) { mSong = groupPosition; updateListViewPosition(groupPosition); if (videoBox.getVisibility() != View.VISIBLE) { if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { videoBox.setTranslationY(videoBox.getHeight()); } videoBox.setVisibility(View.VISIBLE); loading_video_layout.setVisibility(View.VISIBLE); } if (videoBox.getTranslationY() >= 0) { videoBox.animate().translationY(0).setDuration(ANIMATION_DURATION_MILLIS); } startYoutubeVideoSearch(groupPosition); } private void startYoutubeVideoSearch(int groupPosition) { startYoutube(groupPosition); } @SuppressLint("NewApi") public void startYoutube(int pos){ //progressDialog.show(); youTubeVideos = new ArrayList<Video>(); videoFragment = new VideoFragment(PlaylistTracksFragment.this); FragmentManager fragmentManager = mActivity.getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.video_fragment_container, videoFragment,"Youtube"); fragmentTransaction.commitAllowingStateLoss(); sAdapter.setSongStateInList(Song.ListStauts.PLAYING, pos); GetTrackFromYoutubeTask youtubeTask = new GetTrackFromYoutubeTask(sAdapter.getItem(pos).getTitle(), sAdapter.getArtistName(pos)); youtubeTask.execute(); } public void CreateSpinner() { ActionItem item1 = new ActionItem(1, "Download Mp3", getResources().getDrawable(R.drawable.seven_d)); ActionItem item2 = new ActionItem(2, "Youtube", getResources().getDrawable(R.drawable.youtubeicon)); ActionItem item3 = new ActionItem(3, "Audio Only", getResources().getDrawable(R.drawable.ic_note_light)); final QuickAction quickAction = new QuickAction(getActivity(), QuickAction.VERTICAL); //add action items into QuickAction quickAction.addActionItem(item1); quickAction.addActionItem(item2); quickAction.addActionItem(item3); spinnerTitle = (TextView) spinner.findViewById(R.id.tv_title); final ImageView icon = (ImageView) spinner.findViewById(R.id.iv_icon); quickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() { @Override public void onItemClick(QuickAction source, int pos, int actionId) { ActionItem actionItem = quickAction.getActionItem(pos); spinnerTitle.setText(actionItem.getTitle()); icon.setImageDrawable(actionItem.getIcon()); } }); //set listnener for on dismiss event, this listener will be called only if QuickAction dialog was dismissed //by clicking the area outside the dialog. quickAction.setOnDismissListener(new QuickAction.OnDismissListener() { @Override public void onDismiss() { // Toast.makeText(getActivity(), "Dismissed", Toast.LENGTH_SHORT).show(); } }); spinner.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { quickAction.show(v); } }); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); if (savedInstanceState != null) { if (mUser == null) { mUser = (User) savedInstanceState.getSerializable("user"); } } // progressDialog = new ProgressDialog(mContext); // progressDialog.setMessage("Getting Track Details..."); // progressDialog.setCancelable(false); tf = Typeface.createFromAsset(getActivity().getAssets(), "open_sans_regular.ttf"); View v = inflater.inflate(R.layout.activity_musician, container, false); loading_video_layout = (LinearLayout)v.findViewById(R.id.loading_video_layout); videoBox = v.findViewById(R.id.video_box); videoBox.setVisibility(View.GONE); spinner = v.findViewById(R.id.spinner1); CreateSpinner(); if (null == mContext) return v; 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(); expListView = (ListView) v.findViewById(R.id.list_song_of_musician); expListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { String text = spinnerTitle.getText().toString(); if(text.contains("Youtube")){ startYoutubeVideo(arg2); } else if(text.contains("Select Player")){ playAudioOnly(arg2); } } }); // OnGroupClickListener(new OnGroupClickListener() { // @Override // public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { // // String text = spinnerTitle.getText().toString(); // if(text.contains("Youtube")){ // startYoutubeVideo(groupPosition); // } // else if(text.contains("Select Player")){ // playAudioOnly(groupPosition); // } // return true; // } // // // // }); mBtnPlayAll = v.findViewById(R.id.btn_playall); mBtnPlayAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sAdapter.setPlayAll(true); String text = spinnerTitle.getText().toString(); if (sAdapter.getCount() > 0) { isPlayAllSelected = true; mSong = -1; sAdapter.clickItem(mSong + 1); } } }); if (null == artists) { return v; } PlaylistArtist plArtist = artists.get(0); final Artist firstArtist = Statics.getArtistFromPlaylistArtist(plArtist); sAdapter = new SongAdapter(getActivity(), getAllSongs(), mUser, playlist.getPlaylistName(), firstArtist , expListView, true, playlist.getArtists()); expListView.setAdapter(sAdapter); final ImageView imv_like = (ImageView) v.findViewById(R.id.imv_like); final ImageView imv_av = (ImageView) v .findViewById(R.id.imv_musician_av); TextView tvArtistName = (TextView) v .findViewById(R.id.tv_name_musician); TextView tvNoSong = (TextView) v.findViewById(R.id.tvNoSong); TextView tvGlobalNoSong = (TextView) v.findViewById(R.id.tvGlobalNoSong); ImageView playlistImage = (ImageView) v.findViewById(R.id.playlistImage); playlistImage.setVisibility(View.GONE); Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "open_sans_regular.ttf"); tvArtistName.setTypeface(tf); tvArtistName.setText(playlist.getPlaylistName()); tvNoSong.setTypeface(tf); tvNoSong.setVisibility(View.VISIBLE); int numberOfSongs = songs.size(); int numberOfArtists = playlist.getArtists().size(); StringBuilder sBuilder = new StringBuilder(); sBuilder.append(numberOfSongs); if(numberOfSongs > 1){ sBuilder.append(" Songs"); } else{ sBuilder.append(" Song"); } sBuilder.append(", "+numberOfArtists); if(numberOfArtists > 1){ sBuilder.append(" Artists"); } else{ sBuilder.append(" Artist"); } tvNoSong.setText(sBuilder.toString()); tvGlobalNoSong.setVisibility(View.GONE); if(playlist.getArtistAvatar() != null && playlist.getArtistAvatar().length() > 0 ) { loadAvatar(imv_av, playlist.getArtistAvatar().trim()); } else if (firstArtist.getAvatar().trim().length() > 0) { loadAvatar(imv_av, firstArtist.getAvatar().trim()); } else { new GetArtistAvatarTask(mContext) { public void onSuccess(String result) { firstArtist.setAvatar(result); loadAvatar(imv_av, result); }; }.execute(firstArtist.getID() + "", firstArtist.getName()); } if (firstArtist.isLiked()) { imv_like.setImageResource(R.drawable.btn_dislike); } else { imv_like.setImageResource(R.drawable.btn_like); } imv_like.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!Statics.isNetworkConnected(mContext) || null == Statics.curUser) { return; } if (firstArtist.isLiked()) { // Dislike firstArtist.setLiked(false); imv_like.setImageResource(R.drawable.btn_like); new LikeArtist().execute(Statics.curUser.getID(), firstArtist.getUserArtistId(), Statics.DISLIKE); } else { // Like firstArtist.setLiked(true); imv_like.setImageResource(R.drawable.btn_dislike); new LikeArtist().execute(Statics.curUser.getID(), firstArtist.getUserArtistId(), Statics.LIKE); } } }); imv_player = (ImageView) v.findViewById(R.id.imv_stop); imv_player.setTag(false); // pause imv_player.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { playPause(!(Boolean) imv_player.getTag()); sAdapter.resetSongStatus(); if(videoBox.getVisibility() == View.VISIBLE) stopYoutubeVideo(); } }); sAdapter.setOnClickSong(new OnClickSong() { @Override public void onClick(Song song, int position, boolean play) { if (null != mMediaPlayer && mMediaPlayer.isPlaying()) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } String text = spinnerTitle.getText().toString(); if(text.contains("Youtube")) { startYoutubeVideo(position); } else if(text.contains("Audio Only") || text.contains("Select Player")) { sAdapter.dismissLoading(true); /* if (null != mMediaPlayer && mMediaPlayer.isPlaying()) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; }*/ mSong = position; pause = false; imv_player.setTag(true); loadSong(song); sAdapter.setSelectedSongPosition(position); showed = true; } else if(text.contains("Download Mp3")){ sAdapter.dismissLoading(true); buySong(song); } } }); sAdapter.setOnClickBuySong(new OnBuySong() { @Override public void onBuyClick(Song song,int position) { stopYoutubeVideo(); buySong(song); // updateListViewPosition(position); } }); imv_player_next = (ImageView) v.findViewById(R.id.imv_player_next); imv_player_next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mSong >= 0 && mSong < songs.size() - 1) { sAdapter.setSongStateInList(Song.ListStauts.NORMAL, mSong); sAdapter.clickItem(mSong + 1); } } }); imv_player_prev = (ImageView) v.findViewById(R.id.imv_player_prev); imv_player_prev.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mSong > 0) { sAdapter.setSongStateInList(Song.ListStauts.NORMAL, mSong); sAdapter.clickItem(mSong - 1); } } }); return v; } public void smoothScrollToPositionFromTop(final AbsListView view, final int position) { View child = getChildAtPosition(view, position); // There's no need to scroll if child is already at top or view is already scrolled to its end if ((child != null) && ((child.getTop() == 0) || ((child.getTop() > 0) && !ViewCompat.canScrollVertically(view, 1)))) { return; } view.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(final AbsListView view, final int scrollState) { if (scrollState == SCROLL_STATE_IDLE) { view.setOnScrollListener(null); // Fix for scrolling bug new Handler().post(new Runnable() { @Override public void run() { view.setSelection(position); } }); } } @Override public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { } }); // Perform scrolling to position new Handler().post(new Runnable() { @Override public void run() { view.smoothScrollToPositionFromTop(position, 0); } }); } public static View getChildAtPosition(final AdapterView view, final int position) { final int index = position - view.getFirstVisiblePosition(); if ((index >= 0) && (index < view.getChildCount())) { return view.getChildAt(index); } else { return null; } } /*public void updateListViewPosition(final int position){ smoothScrollToPositionFromTop(expListView, position); }*/ public void updateListViewPosition(final int position){ expListView.post(new Runnable() { @Override public void run() { expListView.setSelection(position); if(expListView.getChildAt(position)!=null) expListView.requestChildRectangleOnScreen(expListView.getChildAt(position), new Rect(0, 0, expListView.getChildAt(position).getRight(), expListView.getChildAt(position).getHeight()), false); } }); } public boolean isFullVideoScreen(){ return isFullscreen; } public void sortAscending(){ // sAdapter.stopVideos(); // // for(int i = 0; i < songs.size(); i++) // expListView.collapseGroup(i); sortListAscending(songs); sAdapter.notifyDataSetChanged(); } private void initMedia() { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } mMediaPlayer = new MediaPlayer(); mMediaPlayer .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { playPause(false); if (sAdapter.isPlayAll()) { if (mSong < sAdapter.getCount() - 1) { sAdapter.setSongStateInList(Song.ListStauts.NORMAL, mSong); sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } }else { sAdapter.setCurrentSongState(); } } }); mMediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer arg0) { if (!pause) { mMediaPlayer.start(); } if (null != sAdapter) sAdapter.dismissLoading(true); } }); } private void playPause(boolean play) { String text = spinnerTitle.getText().toString(); if(text.contains("Youtube")){ // sAdapter.stopVideos(); } else{ imv_player.setTag(false); pause = true; if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); } } } public void loadSong(final Song song) { if (!Statics.isNetworkConnected(mContext)) { mBtnPlayAll.setVisibility(View.VISIBLE); sAdapter.dismissLoading(false); sAdapter.setCurrentSongState(); ToastManager.showToast(mContext, "Network unavailable!"); loaded = false; pause = false; // imv_player.setImageResource(R.drawable.media_play); imv_player.setTag(false); return; } String countryStr = getResources().getConfiguration().locale.getCountry().toLowerCase(); if(!countryStr.equals("us")) countryStr = "gb"; final String country = countryStr; if (song.get7DigigtalTrackId(country) == null) { if (getTrackPreviewTask != null && !(getTrackPreviewTask.getStatus() == Status.FINISHED)) { getTrackPreviewTask.cancel(true); } PlaylistArtist plArtist = Statics.getArtistById(this.artists, song.getAristitId()); getTrackPreviewTask = new GetTrackPreview(mContext, song.getTitle(), plArtist.getName(), false) { @Override public void onSucess(Pair<String, String> trackDetail) { try { loaded = true; song.set7DigigtalTrackId(trackDetail.first,country); song.setBuyLink(trackDetail.second,country); if (mTaskPlaySong != null && !(mTaskPlaySong.getStatus() == Status.FINISHED)) { mTaskPlaySong.cancel(true); } mTaskPlaySong = new TrackDetailAsync(song); mTaskPlaySong.execute(song.get7DigigtalTrackId(country)); song.set7DigigtalTrackId(trackDetail.first, country); song.setBuyLink(trackDetail.second, country); song.setUserId(mUser.getID()); new Save7digitalIdTask(mContext,(PlaylistArSong)song,true).execute(); // update to server new SubmitSongBuyLink().execute(song.getID() + "", trackDetail.first, trackDetail.second,country); } catch (IllegalArgumentException e) { e.printStackTrace(); ToastManager.showToast(mContext, "Can't not play!"); if (sAdapter.isPlayAll()) { if (mSong < sAdapter.getCount() - 1) { sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } } } catch (IllegalStateException e) { ToastManager.showToast(mContext, "Can't not play!"); e.printStackTrace(); if (sAdapter.isPlayAll()) { if (mSong < sAdapter.getCount() - 1) { sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } } } } @Override public void onError(String error) { ToastManager.showToast(mContext, error); // song.set7DigigtalTrackId(""); playPause(false); loaded = false; ToastManager.showToast(mContext, error); sAdapter.setCurrentSongState(); sAdapter.dismissLoading(false); imv_player.setTag(false); if (sAdapter.isPlayAll()) { if (mSong < sAdapter.getCount() - 1) { sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } } } }; getTrackPreviewTask.execute(); } else if (song.get7DigigtalTrackId(country).length() > 0) { try { loaded = true; song.set7DigigtalTrackId(song.get7DigigtalTrackId(country),country); if (mTaskPlaySong != null && !(mTaskPlaySong.getStatus() == Status.FINISHED)) { mTaskPlaySong.cancel(true); } mTaskPlaySong = new TrackDetailAsync(song); mTaskPlaySong.execute(song.get7DigigtalTrackId(country)); // mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (IllegalArgumentException e) { e.printStackTrace(); ToastManager.showToast(mContext, "Can't not play!"); if (sAdapter.isPlayAll()) { if (mSong < sAdapter.getCount() - 1) { sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } } } catch (IllegalStateException e) { ToastManager.showToast(mContext, "Can't not play!"); e.printStackTrace(); if (sAdapter.isPlayAll()) { if (mSong < sAdapter.getCount() - 1) { sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } } } } else { sAdapter.dismissLoading(false); sAdapter.setCurrentSongState(); loaded = false; pause = false; //imv_player.setImageResource(R.drawable.media_play); imv_player.setTag(false); ToastManager.showToast(mContext, "Track not found!"); if (sAdapter.isPlayAll()) { if (mSong < sAdapter.getCount() - 1) { sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } } } } public void buySong(final Song song) { if (!Statics.isNetworkConnected(mContext)) { ToastManager.showToast(mContext, "Cannot connect to network!"); sAdapter.setCurrentSongState(); sAdapter.dismissLoading(false); return; } String countryStr = getResources().getConfiguration().locale.getCountry().toLowerCase(); if(!countryStr.equals("us")) countryStr = "gb"; final String country = countryStr; if (song.get7DigigtalTrackId(country) == null) { if (getTrackPreviewTask != null && !(getTrackPreviewTask.getStatus() == Status.FINISHED)) { getTrackPreviewTask.cancel(true); } PlaylistArtist plArtist = Statics.getArtistById(this.artists, song.getAristitId()); getTrackPreviewTask = new GetTrackPreview(mContext, song.getTitle(), plArtist.getName(), false) { @Override public void onSucess(Pair<String, String> trackDetail) { sAdapter.setCurrentSongState(); sAdapter.dismissLoading(false); song.set7DigigtalTrackId(trackDetail.first,country); song.setBuyLink(trackDetail.second,country); if (trackDetail.second == null || trackDetail.second.length() == 0) { new GetTrackBuyLink(mContext, song).execute(); } else { // Intent intent = new Intent(Intent.ACTION_VIEW, // Uri.parse(trackDetail.second)); // startActivity(intent); // ((MainActivity)mContext).hideSpinnerForSort(); DigitalTrackFragment fragment = new DigitalTrackFragment(); fragment.setUrl(trackDetail.second); FragmentTransaction fragmentTransaction = getFragmentActivity() .getSupportFragmentManager() .beginTransaction(); fragmentTransaction.replace(R.id.frame_content, fragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); // update to Server new SubmitSongBuyLink().execute(song.getID() + "", trackDetail.first, trackDetail.second,country); } } @Override public void onError(String error) { song.set7DigigtalTrackId("",country); sAdapter.setCurrentSongState(); sAdapter.dismissLoading(false); ToastManager.showToast(mContext, "Track not found!"); } }; getTrackPreviewTask.execute(); } else if (song.getBuyLink(country) == null || song.getBuyLink(country).length() == 0) { new GetTrackBuyLink(mContext, song).execute(); } else { sAdapter.setCurrentSongState(); sAdapter.dismissLoading(false); ((MainActivity)mContext).hideSpinnerForSort(); DigitalTrackFragment fragment = new DigitalTrackFragment(); fragment.setUrl(song.getBuyLink(country)); FragmentTransaction fragmentTransaction = getFragmentActivity() .getSupportFragmentManager() .beginTransaction(); fragmentTransaction.replace(R.id.frame_content, fragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); // try { // Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(song // .getBuyLink())); // startActivity(intent); // } catch (Exception e) { // Toast.makeText(mContext, "Cannot get buy link!", // Toast.LENGTH_LONG).show(); // } } } public FragmentActivity getFragmentActivity() { if (getActivity() != null) return getActivity(); if (mActivity != null) return mActivity; return null; } public boolean isPlayerShowed() { return showed; } public void hiddenPlayer() { showed = false; // group_player.setVisibility(View.GONE); } private void loadAvatar(final ImageView imv_av, String url) { imageLoader.displayImage(url, imv_av, options, new ImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) { } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { } @Override public void onLoadingComplete(String imageUri, View view,Bitmap loadedImage) { backgroundUrl = imageUri; imv_av.setImageBitmap(loadedImage); } @Override public void onLoadingCancelled(String imageUri, View view) { } }); } private class LikeArtist extends AsyncTask<Integer, Void, String> { @Override protected String doInBackground(Integer... params) { String res = ""; try { if (!Statics.isNetworkConnected(mContext)) { return "No internet conneciton!"; } HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(Statics.WS_PATH + "likeArtist.php"); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("user_id", params[0] + "")); nvps.add(new BasicNameValuePair("user_artist_id", params[1] + "")); nvps.add(new BasicNameValuePair("liked", params[2] + "")); httppost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); if (entity != null) { // get the response content as a string InputStream instream = entity.getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(instream, "UTF-8")); String line; StringBuilder sb = new StringBuilder(""); while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } res = sb.toString(); } } catch (UnsupportedEncodingException e1) { Log.e("Exception", "" + e1.getMessage()); // e1.printStackTrace(); } catch (ClientProtocolException e1) { Log.e("ClientProtocolException", "" + e1.getMessage()); // e1.printStackTrace(); } catch (IOException e1) { Log.e("IOException", "" + e1.getMessage()); e1.printStackTrace(); } return res; } } @Override public void onDestroy() { if (getTrackPreviewTask != null && getTrackPreviewTask.getStatus() != Status.FINISHED) { getTrackPreviewTask.cancel(true); getTrackPreviewTask = null; } mSong = -1; // sAdapter.clear(); videoFragment = null; if(sAdapter != null) sAdapter.resetSongStatus(); // ((MainActivity)mContext).hideSpinnerForSort(); super.onDestroy(); } TrackDetailAsync mTaskPlaySong; @Override public void onDestroyView() { if (getView() != null) { ((ViewGroup) getView().getParent()).removeView(getView()); } if (mMediaPlayer != null) { mMediaPlayer.stop(); mMediaPlayer.release(); } mMediaPlayer = null; //((MainActivity) mContext).hideShareAction(); super.onDestroyView(); } @Override public void onShare() { if (mUser != null) { // String sharedUrl = Statics.WEB_APP_URL + mUser.getUserName() + "/" // + artists.getID(); // String shareBody; // if (Statics.curUser.getFbid() == mUser.getFbid()) { // shareBody = getString(R.string.share_artist_current_user, // artists.getName()); // // } else { // shareBody = getString(R.string.share_artist_other_user, // mUser.getFirstName(), artists.getName()); // } // shareBody += "\n" + sharedUrl; // Intent sharingIntent = new Intent( // android.content.Intent.ACTION_SEND); // sharingIntent.setType("text/plain"); // sharingIntent // .putExtra(android.content.Intent.EXTRA_TEXT, shareBody); // startActivity(Intent.createChooser(sharingIntent, "Share")); } } public ArrayList<Song> getAllSongs() { songs = new ArrayList<Song>(); for(PlaylistArtist artist: this.artists) { Artist nArtist = Statics.getArtistFromPlaylistArtist(artist); ArrayList<Song> artistSongs = nArtist.getSongs(); for(int i = 0; i < artistSongs.size(); i++) { Song artistSong = artistSongs.get(i); if(i == 0) { artistSong.setHeaderText(nArtist.getName()); artistSong.setArtistAvatar(nArtist.getAvatar()); }else { artistSong.setHeaderText(""); } songs.add(artistSong); } } return songs; } public void handleFullScreen(boolean isFull){ videoFragment.setPlayerFullScreen(false); isFullscreen = isFull; layout(); } @SuppressLint("NewApi") public boolean stopYoutubeVideo(){ if(videoBox.getVisibility() == View.VISIBLE){ sAdapter.setCurrentSongState(); sAdapter.notifyDataSetChanged(); expListView.clearChoices(); expListView.requestLayout(); expListView.setStackFromBottom(false); videoFragment.pause(); videoBox.animate() .translationYBy(videoBox.getHeight()) .setDuration(ANIMATION_DURATION_MILLIS) .withEndAction(new Runnable() { @Override public void run() { videoBox.setVisibility(View.GONE); } }); return true; } return false; } @Override public void onFullscreen(boolean isFull) { isFullscreen = isFull; layout(); } @SuppressLint("NewApi") private void layout() { boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; expListView.setVisibility(isFullscreen ? View.GONE : View.VISIBLE); if (isFullscreen) { videoBox.setTranslationY(0); // Reset any translation that was applied in portrait. setLayoutSize(videoFragment.getView(), MATCH_PARENT, MATCH_PARENT); setLayoutSizeAndGravity(videoBox, MATCH_PARENT, MATCH_PARENT, Gravity.TOP | Gravity.LEFT); } else if (isPortrait) { setLayoutSize(expListView, MATCH_PARENT, MATCH_PARENT/2); setLayoutSize(videoFragment.getView(), MATCH_PARENT, MATCH_PARENT); setLayoutSizeAndGravity(videoBox, MATCH_PARENT, MATCH_PARENT/2, Gravity.BOTTOM | Gravity.LEFT); } else { videoBox.setTranslationY(0); // Reset any translation that was applied in portrait. int screenWidth = dpToPx(getResources().getConfiguration().screenWidthDp); int screenHeight = dpToPx(getResources().getConfiguration().screenHeightDp); setLayoutSize(expListView, screenWidth, screenHeight/2); int videoWidth = screenWidth - dpToPx(LANDSCAPE_VIDEO_PADDING_DP); setLayoutSize(videoFragment.getView(), videoWidth, screenHeight/2); setLayoutSizeAndGravity(videoBox, videoWidth, screenHeight/2, Gravity.RIGHT | Gravity.CENTER_VERTICAL); } } private static final class VideoEntry { private final String text; private final String videoId; public VideoEntry(String text, String videoId) { this.text = text; this.videoId = videoId; } } // Utility methods for layouting. private int dpToPx(int dp) { return (int) (dp * getResources().getDisplayMetrics().density + 1f); } private static void setLayoutSize(View view, int width, int height) { LayoutParams params = view.getLayoutParams(); params.width = width; params.height = height; view.setLayoutParams(params); } private static void setLayoutSizeAndGravity(View view, int width, int height, int gravity) { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams(); params.width = width; params.height = height; params.gravity = gravity; view.setLayoutParams(params); } 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; } @SuppressLint("NewApi") @Override protected void onPostExecute(String result) { //progressDialog.dismiss(); loading_video_layout.setVisibility(View.GONE); if(result == null || youTubeVideos.size() == 0){ Toast.makeText(mContext, "Error While loading Song, Try Again Later..!", Toast.LENGTH_SHORT).show(); sAdapter.setCurrentSongState(); sAdapter.notifyDataSetChanged(); stopYoutubeVideo(); if(isPlayAllSelected){ sAdapter.clickItem(mSong + 1); } return; } String videoId = Video.getId(0);//"Y_UmWdcTrrc";//VIDEO_LIST.get(position).videoId; /*if (videoBox.getVisibility() != View.VISIBLE) { if (isAdded() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { videoBox.setTranslationY(videoBox.getHeight()); } videoBox.setVisibility(View.VISIBLE); } if (videoBox.getTranslationY() >= 0) { videoBox.animate().translationY(0).setDuration(ANIMATION_DURATION_MILLIS); }*/ if(expListView.getCount() - 3 > mSong){ expListView.setStackFromBottom(false); } else{ expListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); expListView.setStackFromBottom(true); } /* int visibleChildCount = (expListView.getLastVisiblePosition() - expListView.getFirstVisiblePosition()) + 1; if(visibleChildCount <= mSong){ expListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); expListView.setStackFromBottom(true); } else expListView.setStackFromBottom(false); */ videoFragment.setVideoId(videoId); } } public void loadNextSong(){ if (sAdapter.isPlayAll()) { sAdapter.setCurrentSongState(); if (mSong < sAdapter.getCount() - 1) { sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } } } private class TrackDetailAsync extends AsyncTask<String, Void, TrackDetails> { private SDIApi sSDIApi; private SDIServerUtil.OauthConsumer sOauthConsumer; private RequestQueue sRequestQueue; private static final String TEST_OAUTH_CONSUMER_KEY = "7dvgzk7twy2f"; private static final String TEST_OAUTH_CONSUMER_SECRET = "6f3kb7mw2uvzsyty"; Song currentSong; private TrackDetailAsync(Song song) { currentSong = song; } @Override protected void onPreExecute() { super.onPreExecute(); currentSong.setListStatus(Song.ListStauts.LOADING); sAdapter.notifyDataSetChanged(); } @Override protected TrackDetails doInBackground(String... params) { String trackId = params[0]; sRequestQueue = Volley.newRequestQueue(mContext); sOauthConsumer = new SDIServerUtil.OauthConsumer(TEST_OAUTH_CONSUMER_KEY, TEST_OAUTH_CONSUMER_SECRET); sSDIApi = new SDIApi(mContext, sRequestQueue, sOauthConsumer); /* attempt to get track preview*/ byte[] preview = null; try { String country = getResources().getConfiguration().locale.getCountry(); // Pair<Double, Double> loc = UpdateLocationService.getLastLocation(mContext); // String country = Utils.getCountryName(mContext, loc.first, loc.second);//context.getResources().getConfiguration().locale.getCountry(); SDIGetTrackPreviewRequest.Result previewResult = sSDIApi.streaming().getTrackPreview(trackId,country); preview = previewResult.getTrackPreview(); } catch (Exception e) { e.printStackTrace(); } return new TrackDetails(null, preview); } @Override protected void onPostExecute(TrackDetails track) { super.onPostExecute(track); if (!isAdded()) return; mTrack = track.getTrack(); mPreview = track.getPreview(); if(mPreview != null && mPreview.length > 0){ playMp3(mPreview); currentSong.setListStatus(Song.ListStauts.PLAYING); sAdapter.notifyDataSetChanged(); } else{ sAdapter.dismissLoading(false); loaded = false; pause = false; //imv_player.setImageResource(R.drawable.media_play); imv_player.setTag(false); currentSong.setListStatus(Song.ListStauts.NORMAL); sAdapter.notifyDataSetChanged(); ToastManager.showToast(mContext, "Track not found!"); if (sAdapter.isPlayAll()) { if (mSong < sAdapter.getCount() - 1) { sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } } } } @Override protected void onCancelled() { super.onCancelled(); currentSong.setListStatus(Song.ListStauts.NORMAL); sAdapter.notifyDataSetChanged(); } } public static class TrackDetails { private SDITrack mTrack; private byte[] mPreview; public TrackDetails(SDITrack track, byte[] preview) { mTrack = track; mPreview = preview; } public SDITrack getTrack() { return mTrack; } public byte[] getPreview() { return mPreview; } } private void playMp3(byte[] mp3SoundByteArray) { try { initMedia(); //mMediaPlayer.reset(); String previewPath = getActivity().getCacheDir() + "/preview.mp3"; File path = new File(previewPath); writeFile(path, new String(mp3SoundByteArray)); FileInputStream fis = new FileInputStream(path); mMediaPlayer.setDataSource(fis.getFD()); mMediaPlayer.prepare(); mMediaPlayer.start(); } catch (IOException ex) { String s = ex.toString(); ex.printStackTrace(); } } public static void writeFile(File file, String contents) throws FileNotFoundException, UnsupportedEncodingException { if (file == null || contents == null) throw new IllegalArgumentException(); PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-1"), true); try { out.write(contents); } finally { out.close(); } } public interface TrackDetailListener { String getTrackId(); } }