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();
}
}