package com.ved.musicmapapp.fragments; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; 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.object.SDITrack; import uk.co.sevendigital.android.sdk.api.request.preview.SDIGetTrackPreviewRequest; import uk.co.sevendigital.android.sdk.api.request.track.SDIGetTrackDetailsRequest; import uk.co.sevendigital.android.sdk.util.SDIServerUtil; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Typeface; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnPreparedListener; import android.os.AsyncTask; import android.os.AsyncTask.Status; import android.os.Bundle; import android.os.Handler; 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.WindowManager; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import android.widget.AdapterView; 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.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.providers.GetArtistAvatarTask; import com.ved.musicmapapp.providers.GetTrackBuyLink; import com.ved.musicmapapp.providers.GetTrackOauthDetails; import com.ved.musicmapapp.providers.GetTrackPreview; import com.ved.musicmapapp.providers.Save7digitalIdTask; import com.ved.musicmapapp.providers.SaveDataTask; 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 ArtistFragment extends Fragment implements OnShareListener,OnFullscreenListener { String[] _methodStrings = new String[]{"Select Player","Download Mp3","Youtube"}; //private ListView list; ListView expListView; // ExpandableListAdapter sAdapter; private SongAdapter sAdapter; // private View group_player; // private TextView songName, songArtistName; private ImageView imv_player, imv_player_next, imv_player_prev; private boolean showed = false; // private LinearLayout group_loadmore; // private boolean alertShowing = false; private Artist artist; 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; // private Button sortAscending; // Button sortDescending; View spinner; TextView spinnerTitle; String backgroundUrl=""; boolean isPlayAllSelected; private FragmentActivity mActivity; ArrayList<Video> youTubeVideos=null; List<String> listDataHeader; HashMap<String, List<String>> listDataChild; private View videoBox; // private View closeButton; private boolean isFullscreen; private VideoFragment videoFragment; private SDITrack mTrack; private byte[] mPreview; /** 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; // ProgressDialog progressDialog; LinearLayout loading_video_layout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @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 setArtist(Artist artist) { this.artist = artist; } @Override public void onSaveInstanceState(Bundle outState) { outState.putSerializable("user", mUser); outState.putSerializable("artist", artist); super.onSaveInstanceState(outState); } @Override public void onResume() { // TODO Auto-generated method stub super.onResume(); // ((MainActivity)getActivity()).showSpinnerForSort(); if (mUser != null && (mUser.getFbid() == Statics.curUser.getFbid() || mUser .isFollowed())) { ((MainActivity) mContext).showShareAction(this); } } 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.setImageResource(R.drawable.media_pause); imv_player.setTag(true); Song song = (Song)sAdapter.getItem(groupPosition); loadSong(song); sAdapter.setSelectedSongPosition(groupPosition); // songName.setText(song.getTitle()); // songArtistName.setText(artist.getName()); // group_player.setVisibility(View.VISIBLE); showed = true; } private void startYoutubeVideoSearch(int groupPosition) { startYoutube(groupPosition); } @SuppressLint("NewApi") public void startYoutube(int pos){ //progressDialog.show(); youTubeVideos = new ArrayList<Video>(); videoFragment = new VideoFragment(ArtistFragment.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(), artist.getName()); youtubeTask.execute(); } @SuppressLint("NewApi") private void startYoutubeVideo(final int groupPosition) { mSong = 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); } 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) { stopAllPlayers(); 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); } }); } protected void stopAllPlayers() { stopYoutubeVideo(); if (null != mMediaPlayer && mMediaPlayer.isPlaying()) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } } public void loadNextSong(){ if (sAdapter.isPlayAll()) { sAdapter.setCurrentSongState(); if (mSong < sAdapter.getCount() - 1) { sAdapter.clickItem(mSong + 1); } else { mBtnPlayAll.setVisibility(View.VISIBLE); } } } 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 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 void updateListViewPosition(final int position){ smoothScrollToPositionFromTop(expListView, position); } @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"); } if (artist == null) { artist = (Artist) savedInstanceState.getSerializable("artist"); } } // 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); 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 == artist) { return v; } // sAdapter = new ExpandableListAdapter(getActivity(), artist.getSongs(), mUser,artist.getName(), artist, expListView); sAdapter = new SongAdapter(getActivity(), artist.getSongs(), mUser,artist.getName(), artist, expListView); 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); Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "open_sans_regular.ttf"); tvArtistName.setTypeface(tf); tvArtistName.setText(artist.getName()); tvGlobalNoSong.setTypeface(tf); tvGlobalNoSong.setText(artist.getGlobalPlaylist() > 1 ? getString( R.string.artist_detail_playlists, artist.getGlobalPlaylist()) : getString(R.string.artist_detail_playlist, artist.getGlobalPlaylist())); v.findViewById(R.id.layout_artist_detail).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { onGlobalUser(v); } }); tvNoSong.setTypeface(tf); tvNoSong.setText(artist.getSongs().size() + ""); if (artist.getAvatar().trim().length() > 0) { ///backgroundUrl = artist.getAvatar().trim(); loadAvatar(imv_av, artist.getAvatar().trim()); } else { new GetArtistAvatarTask(mContext) { public void onSuccess(String result) { artist.setAvatar(result); //backgroundUrl = result; loadAvatar(imv_av, result); }; }.execute(artist.getID() + "", artist.getName()); } if (artist.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) { // Statics.showToast(mContext, // "No internet connection!"); return; } if (artist.isLiked()) { // Dislike artist.setLiked(false); imv_like.setImageResource(R.drawable.btn_like); new LikeArtist().execute(Statics.curUser.getID(), artist.getUserArtistId(), Statics.DISLIKE); } else { // Like artist.setLiked(true); imv_like.setImageResource(R.drawable.btn_dislike); new LikeArtist().execute(Statics.curUser.getID(), artist.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(); int count = sAdapter.getCount(); //for (int i = 0; i <count ; i++) // expListView.collapseGroup(i); // if(closeButton.getVisibility() == View.VISIBLE) // closeButton.performClick(); if(videoBox.getVisibility() == View.VISIBLE) stopYoutubeVideo(); } }); sAdapter.setOnClickSong(new OnClickSong() { @Override public void onClick(Song song, final int position, boolean play) { String text = spinnerTitle.getText().toString(); if (null != mMediaPlayer && mMediaPlayer.isPlaying()) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } if(text.contains("Youtube")){ startYoutubeVideo(position); if (expListView.getLastVisiblePosition() == expListView.getAdapter().getCount() -1 && expListView.getChildAt(expListView.getChildCount() - 1) != null && expListView.getChildAt(expListView.getChildCount() - 1).getBottom() <= expListView.getHeight()) { expListView.setSelection(expListView.getLastVisiblePosition()); } else updateListViewPosition(position); } else if(text.contains("Audio Only") || text.contains("Select Player")) { stopAllPlayers(); sAdapter.dismissLoading(true); 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) { stopAllPlayers(); 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 < artist.getSongs().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 sortAscending(){ // sAdapter.stopVideos(); // for(int i = 0;i<artist.getSongs().size();i++) // expListView.collapseGroup(i); sortListAscending(artist.getSongs()); 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); } getTrackPreviewTask = new GetTrackPreview(mContext, song.getTitle(), artist.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,song,false).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); loaded = false; pause = false; //imv_player.setImageResource(R.drawable.media_play); imv_player.setTag(false); sAdapter.setCurrentSongState(); 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)) { sAdapter.setCurrentSongState(); sAdapter.dismissLoading(false); ToastManager.showToast(mContext, "Cannot connect to network!"); 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); } getTrackPreviewTask = new GetTrackPreview(mContext, song.getTitle(), artist.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 { ((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 boolean isFullVideoScreen(){ return isFullscreen; } 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; } videoFragment = null; sAdapter.resetSongStatus(); mSong = -1; // sAdapter.clear(); // ((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() + "/" + artist.getID(); String shareBody; if (Statics.curUser.getFbid() == mUser.getFbid()) { shareBody = getString(R.string.share_artist_current_user, artist.getName()); } else { shareBody = getString(R.string.share_artist_other_user, mUser.getFirstName(), artist.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 void onGlobalUser(View v) { GlobalUserFragment frg = new GlobalUserFragment(); frg.setArtist(artist); FragmentTransaction fragmentTransaction = getFragmentManager() .beginTransaction(); fragmentTransaction.replace(R.id.frame_content, frg); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } public void handleFullScreen(boolean isFull){ mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); videoFragment.setPlayerFullScreen(false); isFullscreen = isFull; layout(); } @SuppressLint("NewApi") public boolean stopYoutubeVideo(){ if(videoBox.getVisibility() == View.VISIBLE){ sAdapter.setCurrentSongState(); sAdapter.notifyDataSetChanged(); expListView.clearChoices(); expListView.setStackFromBottom(false); expListView.requestLayout(); 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) { mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 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) { mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 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 { sAdapter.setCurrentSongState(); sAdapter.notifyDataSetChanged(); mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 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 + 0.5f); } 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) { String subString = songTitle; if(subString.length() > 20) subString = songTitle.substring(0, 20); if(!artistName.toLowerCase().contains("unknown")){ songTitlesToSearch = subString+ " "+artistName; } else{ songTitlesToSearch = subString; } } @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) { loading_video_layout.setVisibility(View.GONE); // progressDialog.dismiss(); if(result == null || youTubeVideos.size() == 0 || videoFragment == null){ 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 (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((mSong == expListView.getLastVisiblePosition() || mSong == expListView.getLastVisiblePosition()-1) && getCountOfVisibleItems() <= mSong){ int visibleChildCount = (expListView.getLastVisiblePosition() - expListView.getFirstVisiblePosition()); if((mSong == expListView.getLastVisiblePosition() || mSong == expListView.getLastVisiblePosition()-1)){ if((visibleChildCount < mSong)) expListView.setStackFromBottom(true); } else if((mSong == expListView.getLastVisiblePosition() || mSong == expListView.getLastVisiblePosition()-1) || (visibleChildCount < mSong)){ expListView.setStackFromBottom(true); } else expListView.setStackFromBottom(false); if(videoFragment != null) videoFragment.setVideoId(videoId); } } 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(); } } @Override public void onPause() { super.onPause(); try { if (mMediaPlayer.isPlaying()) mMediaPlayer.pause(); mMediaPlayer.release(); mMediaPlayer = null; } catch (Exception e) { } } 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 (Exception 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(); } }