package com.sdsmdg.harjot.MusicDNA.fragments.PlayerFragment; import android.content.res.ColorStateList; import android.graphics.Canvas; import android.net.ConnectivityManager; import android.support.v4.app.Fragment; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.audiofx.BassBoost; import android.media.audiofx.Equalizer; import android.media.audiofx.PresetReverb; import android.media.audiofx.Visualizer; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Html; import android.text.method.ScrollingMovementMethod; import android.util.Base64; import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import com.github.amlcurran.showcaseview.ShowcaseView; import com.github.amlcurran.showcaseview.targets.ViewTarget; import com.sdsmdg.harjot.MusicDNA.activities.HomeActivity; import com.sdsmdg.harjot.MusicDNA.clickitemtouchlistener.ClickItemTouchListener; import com.sdsmdg.harjot.MusicDNA.Config; import com.sdsmdg.harjot.MusicDNA.lyrics.Lyrics; import com.sdsmdg.harjot.MusicDNA.snappyrecyclerview.CustomAdapter; import com.sdsmdg.harjot.MusicDNA.snappyrecyclerview.SnappyRecyclerView; import com.sdsmdg.harjot.MusicDNA.customviews.CustomProgressBar; import com.sdsmdg.harjot.MusicDNA.models.LocalTrack; import com.sdsmdg.harjot.MusicDNA.models.SavedDNA; import com.sdsmdg.harjot.MusicDNA.models.Track; import com.sdsmdg.harjot.MusicDNA.models.UnifiedTrack; import com.sdsmdg.harjot.MusicDNA.MusicDNAApplication; import com.sdsmdg.harjot.MusicDNA.notificationmanager.AudioPlayerBroadcastReceiver; import com.sdsmdg.harjot.MusicDNA.R; import com.sdsmdg.harjot.MusicDNA.utilities.DownloadThread; import com.sdsmdg.harjot.MusicDNA.visualizers.VisualizerView; import com.sdsmdg.harjot.MusicDNA.imageloader.ImageLoader; import com.squareup.leakcanary.RefWatcher; import com.squareup.picasso.Picasso; import com.wang.avi.AVLoadingIndicatorView; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; /** * A simple {@link Fragment} subclass. */ public class PlayerFragment extends Fragment implements AudioPlayerBroadcastReceiver.onCallbackListener, Lyrics.Callback { public SnappyRecyclerView snappyRecyclerView; CustomAdapter customAdapter; public static VisualizerView mVisualizerView; public static MediaPlayer mMediaPlayer; public static Visualizer mVisualizer; public static Equalizer mEqualizer; public static BassBoost bassBoost; public static PresetReverb presetReverb; public static boolean isReplayIconVisible = false; public static boolean isPrepared = false; AVLoadingIndicatorView bufferingIndicator; public static CustomProgressBar cpb; Pair<String, String> temp; TextView currTime, totalTime; public ImageView repeatController; public ImageView shuffleController; public ImageView equalizerIcon; public ImageView mainTrackController; public ImageView nextTrackController; public ImageView previousTrackController; public ImageView favouriteIcon; public ImageView queueIcon; public ImageView saveDNAToggle; boolean isFav = false; public RelativeLayout bottomContainer; public RelativeLayout seekBarContainer; public RelativeLayout toggleContainer; public ImageView selected_track_image; public TextView selected_track_title; public TextView selected_track_artist; public ImageView player_controller; public RelativeLayout smallPlayer; ImageView favControllerSp, nextControllerSp; ImageLoader imgLoader; public SeekBar progressBar; public static int durationInMilliSec; static boolean completed = false; public boolean pauseClicked = false; boolean isTracking = false; public static boolean localIsPlaying = false; public Timer timer; public static Track track; public static LocalTrack localTrack; static boolean isRefreshed = false; public PlayerFragmentCallbackListener mCallback; public onPlayPauseListener mCallback7; @Override public void onLyricsDownloaded(Lyrics lyrics) { if (lyrics.getTrack().equals(selected_track_title.getText().toString()) && lyrics.getArtist().equals(selected_track_artist.getText().toString())) { currentLyrics = lyrics; lyricsLoadingIndicator.setVisibility(View.GONE); if (currentLyrics.getFlag() == Lyrics.POSITIVE_RESULT) { lyricsContent.setText(Html.fromHtml(currentLyrics.getText())); lyricsStatus.setVisibility(View.GONE); } else { lyricsStatus.setText("No Lyrics Found!"); lyricsStatus.setVisibility(View.VISIBLE); } } } public interface PlayerFragmentCallbackListener { void onComplete(); void onPreviousTrack(); void onEqualizerClicked(); void onQueueClicked(); void onPrepared(); void onFullScreen(); void onSettingsClicked(); void onAddedtoFavfromPlayer(); void onShuffleEnabled(); void onShuffleDisabled(); void onSmallPlayerTouched(); void addCurrentSongtoPlaylist(UnifiedTrack ut); } public interface onPlayPauseListener { void onPlayPause(); } HomeActivity homeActivity; public static Context ctx; public RelativeLayout spToolbar; ImageView overflowMenuAB; ImageView spImgAB; TextView spTitleAB; TextView spArtistAB; TextView lyricsStatus; AVLoadingIndicatorView lyricsLoadingIndicator; public DownloadThread downloadThread; public RelativeLayout lyricsContainer; public ImageView lyricsIcon; public TextView lyricsContent; public boolean isLyricsVisisble = false; public Lyrics currentLyrics = null; public boolean isStart = true; ShowcaseView showCase; long startTrack; long endTrack; public PlayerFragment() { // Required empty public constructor } public void setupVisualizerFxAndUI() { try { mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId()); mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId()); mEqualizer.setEnabled(true); try { bassBoost = new BassBoost(0, mMediaPlayer.getAudioSessionId()); bassBoost.setEnabled(false); BassBoost.Settings bassBoostSettingTemp = bassBoost.getProperties(); BassBoost.Settings bassBoostSetting = new BassBoost.Settings(bassBoostSettingTemp.toString()); bassBoostSetting.strength = (1000 / 19); bassBoost.setProperties(bassBoostSetting); mMediaPlayer.setAuxEffectSendLevel(1.0f); presetReverb = new PresetReverb(0, mMediaPlayer.getAudioSessionId()); presetReverb.setPreset(PresetReverb.PRESET_NONE); presetReverb.setEnabled(false); mMediaPlayer.setAuxEffectSendLevel(1.0f); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } if (homeActivity.isEqualizerEnabled) { try { bassBoost.setEnabled(true); BassBoost.Settings bassBoostSettingTemp = bassBoost.getProperties(); BassBoost.Settings bassBoostSetting = new BassBoost.Settings(bassBoostSettingTemp.toString()); if (homeActivity.bassStrength == -1) { bassBoostSetting.strength = (1000 / 19); } else { bassBoostSetting.strength = homeActivity.bassStrength; } bassBoost.setProperties(bassBoostSetting); mMediaPlayer.setAuxEffectSendLevel(1.0f); if (homeActivity.reverbPreset == -1) { presetReverb.setPreset(PresetReverb.PRESET_NONE); } else { presetReverb.setPreset(homeActivity.reverbPreset); } presetReverb.setEnabled(true); mMediaPlayer.setAuxEffectSendLevel(1.0f); } catch (Exception e) { e.printStackTrace(); } } if (homeActivity.isEqualizerEnabled && homeActivity.isEqualizerReloaded) { try { homeActivity.isEqualizerEnabled = true; int pos = homeActivity.presetPos; if (pos != 0) { mEqualizer.usePreset((short) (pos - 1)); } else { for (short i = 0; i < 5; i++) { mEqualizer.setBandLevel(i, (short) homeActivity.seekbarpos[i]); } } if (homeActivity.bassStrength != -1 && homeActivity.reverbPreset != -1) { bassBoost.setEnabled(true); bassBoost.setStrength(homeActivity.bassStrength); presetReverb.setEnabled(true); presetReverb.setPreset(homeActivity.reverbPreset); } mMediaPlayer.setAuxEffectSendLevel(1.0f); } catch (Exception e) { e.printStackTrace(); } } try { mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); mVisualizer.setDataCaptureListener( new Visualizer.OnDataCaptureListener() { public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { } public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { homeActivity.updateVisualizer(bytes); } }, Visualizer.getMaxCaptureRate() / 2, false, true); } catch (Exception e) { e.printStackTrace(); } } public void togglePlayPause() { if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); if (homeActivity.isPlayerVisible) { mainTrackController.setImageResource(R.drawable.ic_play_arrow_white_48dp); player_controller.setImageResource(R.drawable.ic_queue_music_white_48dp); isReplayIconVisible = false; } else { player_controller.setImageResource(R.drawable.ic_play_arrow_white_48dp); mainTrackController.setImageResource(R.drawable.ic_play_arrow_white_48dp); isReplayIconVisible = false; } if (mVisualizer != null) mVisualizer.setEnabled(false); if (!isStart && mCallback != null) mCallback7.onPlayPause(); } else { if (!completed) { setupVisualizerFxAndUI(); if (mVisualizer != null) mVisualizer.setEnabled(true); if (homeActivity.isPlayerVisible) { mainTrackController.setImageResource(R.drawable.ic_pause_white_48dp); player_controller.setImageResource(R.drawable.ic_queue_music_white_48dp); isReplayIconVisible = false; } else { mainTrackController.setImageResource(R.drawable.ic_pause_white_48dp); player_controller.setImageResource(R.drawable.ic_pause_white_48dp); isReplayIconVisible = false; } mMediaPlayer.start(); if (!isStart && mCallback != null) mCallback7.onPlayPause(); } else { mMediaPlayer.seekTo(0); setupVisualizerFxAndUI(); if (mVisualizer != null) mVisualizer.setEnabled(true); mMediaPlayer.start(); completed = false; if (homeActivity.isPlayerVisible) { mainTrackController.setImageResource(R.drawable.ic_pause_white_48dp); player_controller.setImageResource(R.drawable.ic_pause_white_48dp); isReplayIconVisible = false; } else { mainTrackController.setImageResource(R.drawable.ic_pause_white_48dp); player_controller.setImageResource(R.drawable.ic_pause_white_48dp); isReplayIconVisible = false; } } } } @Override public void onAttach(final Context context) { super.onAttach(context); homeActivity = (HomeActivity) context; ctx = context; try { mCallback = (PlayerFragmentCallbackListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " must implement OnHeadlineSelectedListener"); } mMediaPlayer = new MediaPlayer(); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { currentLyrics = null; if (downloadThread != null) { downloadThread.interrupt(); } if (isLyricsVisisble) { isLyricsVisisble = false; lyricsContent.setText(""); lyricsContainer.setVisibility(View.GONE); lyricsIcon.setAlpha(0.5f); mVisualizerView.setVisibility(View.VISIBLE); } completed = false; pauseClicked = false; isPrepared = true; mCallback.onPrepared(); if (homeActivity.isPlayerVisible) { player_controller.setVisibility(View.VISIBLE); player_controller.setImageResource(R.drawable.ic_queue_music_white_48dp); } else { player_controller.setVisibility(View.VISIBLE); player_controller.setImageResource(R.drawable.ic_pause_white_48dp); } togglePlayPause(); togglePlayPause(); togglePlayPause(); bufferingIndicator.setVisibility(View.GONE); mainTrackController.setVisibility(View.VISIBLE); equalizerIcon.setVisibility(View.VISIBLE); snappyRecyclerView.setCurrentPosition(HomeActivity.queueCurrentIndex); snappyRecyclerView.setTransparency(); new HomeActivity.SaveQueue().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); new HomeActivity.SaveRecents().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { completed = true; if (homeActivity.isPlayerVisible) { mainTrackController.setImageResource(R.drawable.ic_replay_white_48dp); player_controller.setImageResource(R.drawable.ic_replay_white_48dp); isReplayIconVisible = true; } else { player_controller.setImageResource(R.drawable.ic_replay_white_48dp); mainTrackController.setImageResource(R.drawable.ic_replay_white_48dp); isReplayIconVisible = true; } new SaveDNA().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { double ratio = percent / 100.0; double bufferingLevel = (int) (mp.getDuration() * ratio); if (progressBar != null) { progressBar.setSecondaryProgress((int) bufferingLevel); } } }); mMediaPlayer.setOnErrorListener( new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { return true; } } ); mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { switch (what) { case MediaPlayer.MEDIA_INFO_BUFFERING_START: bufferingIndicator.setVisibility(View.VISIBLE); mainTrackController.setVisibility(View.GONE); isPrepared = false; break; case MediaPlayer.MEDIA_INFO_BUFFERING_END: bufferingIndicator.setVisibility(View.GONE); mainTrackController.setVisibility(View.VISIBLE); isPrepared = true; break; } return true; } }); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_player, container, false); return view; } @Override public void onPause() { super.onPause(); } @Override public void onResume() { super.onResume(); if (snappyRecyclerView.getCurrentPosition() != HomeActivity.queueCurrentIndex) { snappyRecyclerView.scrollToPosition(HomeActivity.queueCurrentIndex); snappyRecyclerView.setCurrentPosition(HomeActivity.queueCurrentIndex); customAdapter.notifyDataSetChanged(); } snappyRecyclerView.setTransparency(); } @Override public void onCallbackCalled(int i) { switch (i) { case 6: mCallback.onPrepared(); break; case 3: if (homeActivity.queueCurrentIndex != 0) { mMediaPlayer.pause(); mCallback.onPreviousTrack(); } break; case 2: mMediaPlayer.pause(); homeActivity.nextControllerClicked = true; mCallback.onComplete(); break; } } @Override public void togglePLayPauseCallback() { togglePlayPause(); } @Override public boolean getPauseClicked() { return pauseClicked; } @Override public void setPauseClicked(boolean bool) { pauseClicked = bool; } @Override public MediaPlayer getMediaPlayer() { return mMediaPlayer; } @Override public void onViewCreated(final View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); imgLoader = new ImageLoader(getContext()); smallPlayer = (RelativeLayout) view.findViewById(R.id.smallPlayer); snappyRecyclerView = (SnappyRecyclerView) view.findViewById(R.id.visualizer_recycler); bufferingIndicator = (AVLoadingIndicatorView) view.findViewById(R.id.bufferingIndicator); currTime = (TextView) view.findViewById(R.id.currTime); totalTime = (TextView) view.findViewById(R.id.totalTime); repeatController = (ImageView) view.findViewById(R.id.repeat_controller); shuffleController = (ImageView) view.findViewById(R.id.shuffle_controller); spToolbar = (RelativeLayout) view.findViewById(R.id.smallPlayer_AB); overflowMenuAB = (ImageView) view.findViewById(R.id.menuIcon); lyricsContainer = (RelativeLayout) view.findViewById(R.id.lyrics_container); lyricsIcon = (ImageView) view.findViewById(R.id.lyrics_icon); lyricsContent = (TextView) view.findViewById(R.id.lyrics_content); lyricsLoadingIndicator = (AVLoadingIndicatorView) view.findViewById(R.id.lyrics_loading_indicator); lyricsStatus = (TextView) view.findViewById(R.id.lyrics_status_text); lyricsIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!isLyricsVisisble) { lyricsIcon.setAlpha(1.0f); mVisualizerView.setVisibility(View.GONE); lyricsContainer.setVisibility(View.VISIBLE); lyricsLoadingIndicator.setVisibility(View.VISIBLE); lyricsStatus.setText("Searching Lyrics"); lyricsStatus.setVisibility(View.VISIBLE); if (currentLyrics == null) { downloadThread = new DownloadThread(PlayerFragment.this, false, selected_track_artist.getText().toString(), selected_track_title.getText().toString()); downloadThread.start(); } else { onLyricsDownloaded(currentLyrics); } } else { lyricsIcon.setAlpha(0.5f); lyricsContent.setText(""); lyricsContainer.setVisibility(View.GONE); mVisualizerView.setVisibility(View.VISIBLE); } isLyricsVisisble = !isLyricsVisisble; } }); spImgAB = (ImageView) view.findViewById(R.id.selected_track_image_sp_AB); spImgAB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!homeActivity.isPlayerTransitioning && smallPlayer != null) { homeActivity.hidePlayer(); homeActivity.isPlayerVisible = false; } } }); spTitleAB = (TextView) view.findViewById(R.id.selected_track_title_sp_AB); spTitleAB.setSelected(true); spArtistAB = (TextView) view.findViewById(R.id.selected_track_artist_sp_AB); if (homeActivity.shuffleEnabled) { shuffleController.setImageResource(R.drawable.ic_shuffle_filled); } else { shuffleController.setImageResource(R.drawable.ic_shuffle_alpha); } if (homeActivity.repeatEnabled) { repeatController.setImageResource(R.drawable.ic_repeat_filled); } else if (homeActivity.repeatOnceEnabled) { repeatController.setImageResource(R.drawable.ic_repeat_once); } else { repeatController.setImageResource(R.drawable.ic_repeat_alpha); } repeatController.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (homeActivity.repeatOnceEnabled) { homeActivity.repeatOnceEnabled = false; repeatController.setImageResource(R.drawable.ic_repeat_alpha); } else if (homeActivity.repeatEnabled) { homeActivity.repeatEnabled = false; homeActivity.repeatOnceEnabled = true; repeatController.setImageResource(R.drawable.ic_repeat_once); } else { homeActivity.repeatEnabled = true; repeatController.setImageResource(R.drawable.ic_repeat_filled); } } }); shuffleController.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (homeActivity.shuffleEnabled) { homeActivity.shuffleEnabled = false; shuffleController.setImageResource(R.drawable.ic_shuffle_alpha); mCallback.onShuffleDisabled(); } else { homeActivity.shuffleEnabled = true; shuffleController.setImageResource(R.drawable.ic_shuffle_filled); mCallback.onShuffleEnabled(); } snappyRecyclerView.scrollToPosition(HomeActivity.queueCurrentIndex); snappyRecyclerView.setCurrentPosition(HomeActivity.queueCurrentIndex); customAdapter.notifyDataSetChanged(); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { snappyRecyclerView.setTransparency(); } }, 400); } }); equalizerIcon = (ImageView) view.findViewById(R.id.equalizer_icon); equalizerIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCallback.onEqualizerClicked(); } }); equalizerIcon.setVisibility(View.INVISIBLE); saveDNAToggle = (ImageView) view.findViewById(R.id.toggleSaveDNA); if (homeActivity.isSaveDNAEnabled) { saveDNAToggle.setImageResource(R.drawable.ic_save_filled); } else { saveDNAToggle.setImageResource(R.drawable.ic_save_alpha); } saveDNAToggle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (homeActivity.isSaveDNAEnabled) { homeActivity.isSaveDNAEnabled = false; saveDNAToggle.setImageResource(R.drawable.ic_save_alpha); } else { homeActivity.isSaveDNAEnabled = true; saveDNAToggle.setImageResource(R.drawable.ic_save_filled); } } }); mainTrackController = (ImageView) view.findViewById(R.id.controller); nextTrackController = (ImageView) view.findViewById(R.id.next); previousTrackController = (ImageView) view.findViewById(R.id.previous); isFav = false; favouriteIcon = (ImageView) view.findViewById(R.id.fav_icon); favControllerSp = (ImageView) view.findViewById(R.id.fav_controller_sp); if (homeActivity.isFavourite) { favouriteIcon.setImageResource(R.drawable.ic_heart_filled_1); favControllerSp.setImageResource(R.drawable.ic_heart_filled_1); isFav = true; } else { favouriteIcon.setImageResource(R.drawable.ic_heart_alpha); favControllerSp.setImageResource(R.drawable.ic_heart_alpha); isFav = false; } favouriteIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isFav) { favouriteIcon.setImageResource(R.drawable.ic_heart_alpha); favControllerSp.setImageResource(R.drawable.ic_heart_alpha); isFav = false; removeFromFavourite(); } else { favouriteIcon.setImageResource(R.drawable.ic_heart_filled_1); favControllerSp.setImageResource(R.drawable.ic_heart_filled_1); isFav = true; addToFavourite(); } new HomeActivity.SaveFavourites().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); favControllerSp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isFav) { favouriteIcon.setImageResource(R.drawable.ic_heart_alpha); favControllerSp.setImageResource(R.drawable.ic_heart_alpha); isFav = false; removeFromFavourite(); } else { favouriteIcon.setImageResource(R.drawable.ic_heart_filled_1); favControllerSp.setImageResource(R.drawable.ic_heart_filled_1); isFav = true; addToFavourite(); } new HomeActivity.SaveFavourites().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); queueIcon = (ImageView) view.findViewById(R.id.queue_icon); queueIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCallback.onQueueClicked(); } }); selected_track_image = (ImageView) view.findViewById(R.id.selected_track_image_sp); selected_track_title = (TextView) view.findViewById(R.id.selected_track_title_sp); selected_track_artist = (TextView) view.findViewById(R.id.selected_track_artist_sp); player_controller = (ImageView) view.findViewById(R.id.player_control_sp); nextControllerSp = (ImageView) view.findViewById(R.id.next_controller_sp); nextControllerSp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mMediaPlayer.pause(); homeActivity.nextControllerClicked = true; mCallback.onComplete(); } }); bottomContainer = (RelativeLayout) view.findViewById(R.id.mainControllerContainer); seekBarContainer = (RelativeLayout) view.findViewById(R.id.seekBarContainer); toggleContainer = (RelativeLayout) view.findViewById(R.id.toggleContainer); mVisualizerView = (VisualizerView) view.findViewById(R.id.myvisualizerview); VisualizerView.w = HomeActivity.screen_width; VisualizerView.h = HomeActivity.screen_height; VisualizerView.conf = Bitmap.Config.ARGB_8888; VisualizerView.bmp = Bitmap.createBitmap(VisualizerView.w, VisualizerView.h, VisualizerView.conf); HomeActivity.cacheCanvas = new Canvas(VisualizerView.bmp); if (HomeActivity.queue != null) { customAdapter = new CustomAdapter(getContext(), snappyRecyclerView, HomeActivity.queue.getQueue()); } else { customAdapter = new CustomAdapter(getContext(), snappyRecyclerView, new ArrayList<UnifiedTrack>()); } LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false); snappyRecyclerView.setLayoutManager(linearLayoutManager); snappyRecyclerView.setItemAnimator(new DefaultItemAnimator()); snappyRecyclerView.setAdapter(customAdapter); snappyRecyclerView.setActivity(homeActivity); snappyRecyclerView.addOnItemTouchListener(new ClickItemTouchListener(snappyRecyclerView) { @Override public boolean onClick(RecyclerView parent, View view, int position, long id) { return false; } @Override public boolean onLongClick(RecyclerView parent, View view, int position, long id) { if (homeActivity.isFullScreenEnabled) { homeActivity.isFullScreenEnabled = false; bottomContainer.setVisibility(View.VISIBLE); seekBarContainer.setVisibility(View.VISIBLE); toggleContainer.setVisibility(View.VISIBLE); spToolbar.setVisibility(View.VISIBLE); mCallback.onFullScreen(); } else { homeActivity.isFullScreenEnabled = true; bottomContainer.setVisibility(View.GONE); seekBarContainer.setVisibility(View.GONE); toggleContainer.setVisibility(View.GONE); spToolbar.setVisibility(View.INVISIBLE); mCallback.onFullScreen(); } return true; } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); cpb = (CustomProgressBar) view.findViewById(R.id.customProgress); smallPlayer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCallback.onSmallPlayerTouched(); } }); track = homeActivity.selectedTrack; localTrack = homeActivity.localSelectedTrack; if (homeActivity.streamSelected) { try { durationInMilliSec = track.getDuration(); } catch (Exception e) { } if (track.getArtworkURL() != null) { Picasso.with(getActivity()).load(track.getArtworkURL()).resize(100, 100).into(selected_track_image); } else { selected_track_image.setImageResource(R.drawable.ic_default); } try { spTitleAB.setText(track.getTitle()); selected_track_title.setText(track.getTitle()); selected_track_artist.setText(""); spArtistAB.setText(""); } catch (Exception e) { } } else { try { durationInMilliSec = (int) localTrack.getDuration(); } catch (Exception e) { } try { imgLoader.DisplayImage(localTrack.getPath(), selected_track_image); } catch (Exception e) { } try { spTitleAB.setText(localTrack.getTitle()); selected_track_title.setText(localTrack.getTitle()); selected_track_artist.setText(localTrack.getArtist()); spArtistAB.setText(localTrack.getArtist()); } catch (Exception e) { } } temp = getTime(durationInMilliSec); totalTime.setText(temp.first + ":" + temp.second); homeActivity.mWifi = homeActivity.connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); try { if (homeActivity.streamSelected) { if ((homeActivity.settings.isStreamOnlyOnWifiEnabled() && homeActivity.mWifi.isConnected()) || !homeActivity.settings.isStreamOnlyOnWifiEnabled()) { isPrepared = false; mMediaPlayer.reset(); mMediaPlayer.setDataSource(track.getStreamURL() + "?client_id=" + Config.CLIENT_ID); mMediaPlayer.prepareAsync(); } else { mMediaPlayer.pause(); homeActivity.nextControllerClicked = true; mCallback.onComplete(); } } else { isPrepared = false; mMediaPlayer.reset(); File f = new File(localTrack.getPath()); if (f.exists()) { mMediaPlayer.setDataSource(localTrack.getPath()); mMediaPlayer.prepareAsync(); } else { Toast.makeText(getContext(), "Error playing " + localTrack.getTitle() + ". Skipping to next track", Toast.LENGTH_SHORT).show(); mMediaPlayer.pause(); homeActivity.nextControllerClicked = true; mCallback.onComplete(); } } bufferingIndicator.setVisibility(View.VISIBLE); mainTrackController.setVisibility(View.GONE); } catch (Exception e) { e.printStackTrace(); } overflowMenuAB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PopupMenu popMenu = new PopupMenu(getContext(), overflowMenuAB); popMenu.getMenuInflater().inflate(R.menu.player_overflow_menu, popMenu.getMenu()); popMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (item.getTitle().equals("Full Screen")) { if (homeActivity.isFullScreenEnabled) { homeActivity.isFullScreenEnabled = false; bottomContainer.setVisibility(View.VISIBLE); seekBarContainer.setVisibility(View.VISIBLE); toggleContainer.setVisibility(View.VISIBLE); spToolbar.setVisibility(View.VISIBLE); mCallback.onFullScreen(); } else { homeActivity.isFullScreenEnabled = true; bottomContainer.setVisibility(View.GONE); seekBarContainer.setVisibility(View.GONE); toggleContainer.setVisibility(View.GONE); spToolbar.setVisibility(View.INVISIBLE); mCallback.onFullScreen(); } } else if (item.getTitle().equals("Settings")) { mCallback.onSettingsClicked(); } else if (item.getTitle().equals("Add to playlist")) { UnifiedTrack ut = HomeActivity.queue.getQueue().get(HomeActivity.queueCurrentIndex); mCallback.addCurrentSongtoPlaylist(ut); } return true; } }); popMenu.show(); } }); player_controller.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isReplayIconVisible) { homeActivity.hasQueueEnded = true; mCallback.onComplete(); } else { if (!pauseClicked) { pauseClicked = true; } togglePlayPause(); } } }); mainTrackController.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isReplayIconVisible) { homeActivity.hasQueueEnded = true; mCallback.onComplete(); } else { if (!pauseClicked) { pauseClicked = true; } togglePlayPause(); } } }); nextTrackController.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mMediaPlayer.pause(); homeActivity.nextControllerClicked = true; mCallback.onComplete(); } }); previousTrackController.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (homeActivity.queueCurrentIndex != 0) { mMediaPlayer.pause(); mCallback.onPreviousTrack(); } } }); progressBar = (SeekBar) view.findViewById(R.id.progressBar); progressBar.setMax(durationInMilliSec); timer = new Timer(); timer.scheduleAtFixedRate( new TimerTask() { public void run() { if (isPrepared && !isTracking && getActivity() != null) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { float[] hsv = new float[3]; hsv[0] = homeActivity.seekBarColor; hsv[1] = (float) 0.8; hsv[2] = (float) 0.5; progressBar.getProgressDrawable().setColorFilter(new PorterDuffColorFilter(Color.HSVToColor(hsv), PorterDuff.Mode.SRC_IN)); cpb.update(); } }); try { temp = getTime(mMediaPlayer.getCurrentPosition()); getActivity().runOnUiThread(new Runnable() { @Override public void run() { currTime.setText(temp.first + ":" + temp.second); } }); progressBar.setProgress(mMediaPlayer.getCurrentPosition()); } catch (Exception e) { Log.e("MEDIA", e.getMessage() + ":"); } } } }, 0, 50); progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { temp = getTime(progress); getActivity().runOnUiThread(new Runnable() { @Override public void run() { currTime.setText(temp.first + ":" + temp.second); } }); } @Override public void onStartTrackingTouch(SeekBar seekBar) { isTracking = true; } @Override public void onStopTrackingTouch(SeekBar seekBar) { mMediaPlayer.seekTo(seekBar.getProgress()); if (mMediaPlayer.isPlaying()) mMediaPlayer.start(); isTracking = false; } }); final Button mEndButton = new Button(getContext()); mEndButton.setBackgroundColor(homeActivity.themeColor); mEndButton.setTextColor(Color.WHITE); Handler handler = new Handler(); handler.postDelayed( new Runnable() { @Override public void run() { showCase = new ShowcaseView.Builder(getActivity()) .blockAllTouches() .singleShot(2) .setStyle(R.style.CustomShowcaseTheme) .useDecorViewAsParent() .replaceEndButton(mEndButton) .setContentTitlePaint(homeActivity.tp) .setTarget(new ViewTarget(mVisualizerView.getId(), getActivity())) .setContentTitle("The DNA") .setContentText("The DNA of the currently playing song.") .build(); showCase.setButtonText("Next"); showCase.setButtonPosition(homeActivity.lps); showCase.overrideButtonClick(new View.OnClickListener() { int count1 = -1; @Override public void onClick(View v) { count1++; switch (count1) { case 0: showCase.setTarget(new ViewTarget(mVisualizerView.getId(), getActivity())); showCase.setContentTitle("The DNA"); showCase.setContentText("Swipe Left or Right to change Song." + "Long Press for fullscreen"); showCase.setButtonPosition(homeActivity.lps); showCase.setButtonText("Next"); break; case 1: showCase.setTarget(new ViewTarget(R.id.toggleContainer, getActivity())); showCase.setContentTitle("The Controls"); showCase.setContentText("Equalizer \n" + "Save DNA toggle\n" + "Add to Favourites \n" + "Queue"); showCase.setButtonPosition(homeActivity.lps); showCase.setButtonText("Done"); break; case 2: showCase.setTarget(new ViewTarget(R.id.lyrics_icon, getActivity())); showCase.setContentTitle("Lyrics"); showCase.setContentText("Get lyrics by tapping this icon"); showCase.setButtonPosition(homeActivity.lps); showCase.setButtonText("Done"); break; case 3: showCase.hide(); break; } } }); } }, 500); } public void addToFavourite() { UnifiedTrack ut; if (homeActivity.localSelected) ut = new UnifiedTrack(true, localTrack, null); else ut = new UnifiedTrack(false, null, track); homeActivity.favouriteTracks.getFavourite().add(ut); mCallback.onAddedtoFavfromPlayer(); } public void removeFromFavourite() { UnifiedTrack ut; if (homeActivity.localSelected) ut = new UnifiedTrack(true, localTrack, null); else ut = new UnifiedTrack(false, null, track); for (int i = 0; i < homeActivity.favouriteTracks.getFavourite().size(); i++) { UnifiedTrack ut1 = homeActivity.favouriteTracks.getFavourite().get(i); if (ut.getType() && ut1.getType()) { if (ut.getLocalTrack().getTitle().equals(ut1.getLocalTrack().getTitle())) { homeActivity.favouriteTracks.getFavourite().remove(i); break; } } else if (!ut.getType() && !ut1.getType()) { if (ut.getStreamTrack().getTitle().equals(ut1.getStreamTrack().getTitle())) { homeActivity.favouriteTracks.getFavourite().remove(i); break; } } } mCallback.onAddedtoFavfromPlayer(); } @Override public void onDestroy() { super.onDestroy(); RefWatcher refWatcher = MusicDNAApplication.getRefWatcher(getContext()); refWatcher.watch(this); } @Override public void onDestroyView() { super.onDestroyView(); super.onDestroy(); RefWatcher refWatcher = MusicDNAApplication.getRefWatcher(getContext()); refWatcher.watch(this); if (mMediaPlayer != null) { if (mMediaPlayer.isPlaying()) { mMediaPlayer.stop(); } mMediaPlayer.release(); mMediaPlayer = null; } if (mVisualizer != null) { mVisualizer.release(); } } public void refresh() { isRefreshed = true; pauseClicked = false; completed = false; isTracking = false; if (snappyRecyclerView.getCurrentPosition() != HomeActivity.queueCurrentIndex) { snappyRecyclerView.scrollToPosition(HomeActivity.queueCurrentIndex); snappyRecyclerView.setCurrentPosition(HomeActivity.queueCurrentIndex); customAdapter.notifyDataSetChanged(); } VisualizerView.w = HomeActivity.screen_width; VisualizerView.h = HomeActivity.screen_height; VisualizerView.conf = Bitmap.Config.ARGB_8888; VisualizerView.bmp = Bitmap.createBitmap(VisualizerView.w, VisualizerView.h, VisualizerView.conf); HomeActivity.cacheCanvas = new Canvas(VisualizerView.bmp); if (homeActivity.isPlayerVisible) { player_controller.setVisibility(View.VISIBLE); player_controller.setImageResource(R.drawable.ic_queue_music_white_48dp); } else { player_controller.setVisibility(View.VISIBLE); player_controller.setImageResource(R.drawable.ic_pause_white_48dp); } isFav = false; if (homeActivity.isFavourite) { favouriteIcon.setImageResource(R.drawable.ic_heart_filled_1); favControllerSp.setImageResource(R.drawable.ic_heart_filled_1); isFav = true; } else { favouriteIcon.setImageResource(R.drawable.ic_heart_alpha); favControllerSp.setImageResource(R.drawable.ic_heart_alpha); isFav = false; } if (homeActivity.shuffleEnabled) { shuffleController.setImageResource(R.drawable.ic_shuffle_filled); } else { shuffleController.setImageResource(R.drawable.ic_shuffle_alpha); } if (homeActivity.repeatEnabled) { repeatController.setImageResource(R.drawable.ic_repeat_filled); } else if (homeActivity.repeatOnceEnabled) { repeatController.setImageResource(R.drawable.ic_repeat_once); } else { repeatController.setImageResource(R.drawable.ic_repeat_alpha); } if (homeActivity.isSaveDNAEnabled) { saveDNAToggle.setImageResource(R.drawable.ic_save_filled); } else { saveDNAToggle.setImageResource(R.drawable.ic_save_alpha); } equalizerIcon.setVisibility(View.INVISIBLE); track = homeActivity.selectedTrack; localTrack = homeActivity.localSelectedTrack; if (homeActivity.streamSelected) { durationInMilliSec = track.getDuration(); if (track.getArtworkURL() != null) { Picasso.with(getActivity()).load(track.getArtworkURL()).resize(100, 100).into(selected_track_image); } else { selected_track_image.setImageResource(R.drawable.ic_default); } try { spTitleAB.setText(track.getTitle()); selected_track_title.setText(track.getTitle()); selected_track_artist.setText(""); spArtistAB.setText(""); } catch (Exception e) { } } else { try { durationInMilliSec = (int) localTrack.getDuration(); } catch (Exception e) { } try { imgLoader.DisplayImage(localTrack.getPath(), selected_track_image); } catch (Exception e) { } try { spTitleAB.setText(localTrack.getTitle()); selected_track_title.setText(localTrack.getTitle()); selected_track_artist.setText(localTrack.getArtist()); spArtistAB.setText(localTrack.getArtist()); } catch (Exception e) { } } temp = getTime(durationInMilliSec); totalTime.setText(temp.first + ":" + temp.second); homeActivity.mWifi = homeActivity.connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); try { if (homeActivity.streamSelected) { if ((homeActivity.settings.isStreamOnlyOnWifiEnabled() && homeActivity.mWifi.isConnected()) || !homeActivity.settings.isStreamOnlyOnWifiEnabled()) { isPrepared = false; mMediaPlayer.reset(); progressBar.setProgress(0); progressBar.setSecondaryProgress(0); mMediaPlayer.setDataSource(track.getStreamURL() + "?client_id=" + Config.CLIENT_ID); mMediaPlayer.prepareAsync(); } else { mMediaPlayer.pause(); homeActivity.nextControllerClicked = true; mCallback.onComplete(); } } else { isPrepared = false; mMediaPlayer.reset(); progressBar.setProgress(0); progressBar.setSecondaryProgress(0); File f = new File(localTrack.getPath()); if (f.exists()) { mMediaPlayer.setDataSource(localTrack.getPath()); mMediaPlayer.prepareAsync(); } else { Toast.makeText(getContext(), "Error playing " + localTrack.getTitle() + ". Skipping to next track", Toast.LENGTH_SHORT).show(); mMediaPlayer.pause(); homeActivity.nextControllerClicked = true; mCallback.onComplete(); } } bufferingIndicator.setVisibility(View.VISIBLE); mainTrackController.setVisibility(View.GONE); } catch (Exception e) { e.printStackTrace(); } progressBar.setMax(durationInMilliSec); timer.cancel(); timer = new Timer(); timer.scheduleAtFixedRate( new TimerTask() { public void run() { if (isPrepared && !isTracking && getActivity() != null) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { float[] hsv = new float[3]; hsv[0] = homeActivity.seekBarColor; hsv[1] = (float) 0.8; hsv[2] = (float) 0.5; progressBar.getProgressDrawable().setColorFilter(new PorterDuffColorFilter(Color.HSVToColor(hsv), PorterDuff.Mode.SRC_IN)); cpb.update(); } }); try { temp = getTime(mMediaPlayer.getCurrentPosition()); getActivity().runOnUiThread(new Runnable() { @Override public void run() { currTime.setText(temp.first + ":" + temp.second); } }); progressBar.setProgress(mMediaPlayer.getCurrentPosition()); } catch (Exception e) { Log.e("MEDIA", e.getMessage() + ":"); } } } }, 0, 50); progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { temp = getTime(progress); getActivity().runOnUiThread(new Runnable() { @Override public void run() { currTime.setText(temp.first + ":" + temp.second); } }); } @Override public void onStartTrackingTouch(SeekBar seekBar) { startTrack = System.currentTimeMillis(); isTracking = true; } @Override public void onStopTrackingTouch(SeekBar seekBar) { endTrack = System.currentTimeMillis(); mMediaPlayer.seekTo(seekBar.getProgress()); if (mMediaPlayer.isPlaying()) mMediaPlayer.start(); isTracking = false; } }); } public Pair<String, String> getTime(int millsec) { int min, sec; sec = millsec / 1000; min = sec / 60; sec = sec % 60; String minS, secS; minS = String.valueOf(min); secS = String.valueOf(sec); if (sec < 10) { secS = "0" + secS; } Pair<String, String> pair = Pair.create(minS, secS); return pair; } public class SaveDNA extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { if (homeActivity.isSaveDNAEnabled) { Bitmap bmp = mVisualizerView.bmp; // Generate base64 encoded bitmap String base64encoded = getBase64encodedBitmap(bmp); // Create SavedDNA object with relevant values. SavedDNA savedDNA; if (localIsPlaying) { savedDNA = new SavedDNA(localTrack.getTitle(), true, localTrack.getPath(), null, localTrack.getArtist(), base64encoded); } else { savedDNA = new SavedDNA(track.getTitle(), false, null, track.getArtworkURL(), "", base64encoded); } // Check if a DNA exists for the current song, and remove it. for (int i = 0; i < homeActivity.savedDNAs.getSavedDNAs().size(); i++) { if (homeActivity.savedDNAs.getSavedDNAs().get(i).getName().equals(savedDNA.getName())) { homeActivity.savedDNAs.getSavedDNAs().remove(i); break; } } // Add the DNA to the first position. homeActivity.savedDNAs.getSavedDNAs().add(0, savedDNA); // If number of DNAs get more than 10, then remove the 11th DNA to keep size as 10. // Caution : 0-indexed arrays. if (homeActivity.savedDNAs.getSavedDNAs().size() > 10) { homeActivity.savedDNAs.getSavedDNAs().remove(10); } // Display Toast. homeActivity.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(ctx, "DNA Saved!", Toast.LENGTH_SHORT).show(); } }); } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); // Set flags to initial values. completed = false; isPrepared = false; // Pause the MediaPlayer and call onComplete(). mMediaPlayer.pause(); mCallback.onComplete(); } } public boolean isShowcaseVisible() { return (showCase != null && showCase.isShowing()); } public void hideShowcase() { showCase.hide(); } public void toggleAlbumArtBackground() { snappyRecyclerView.setTransparency(); } public String getBase64encodedBitmap(Bitmap image) { ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOS); return Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT); } }