/* * Copyright (C) 2015 Naman Dwivedi * * Licensed under the GNU General Public License v3 * * This is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ package com.naman14.timber.nowplaying; import android.animation.ObjectAnimator; import android.graphics.Bitmap; import android.graphics.PorterDuff; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import com.afollestad.appthemeengine.ATE; import com.afollestad.appthemeengine.Config; import com.naman14.timber.MusicPlayer; import com.naman14.timber.R; import com.naman14.timber.activities.BaseActivity; import com.naman14.timber.adapters.BaseQueueAdapter; import com.naman14.timber.adapters.SlidingQueueAdapter; import com.naman14.timber.dataloaders.QueueLoader; import com.naman14.timber.listeners.MusicStateListener; import com.naman14.timber.timely.TimelyView; import com.naman14.timber.utils.Helpers; import com.naman14.timber.utils.PreferencesUtility; import com.naman14.timber.utils.SlideTrackSwitcher; import com.naman14.timber.utils.TimberUtils; import com.naman14.timber.widgets.CircularSeekBar; import com.naman14.timber.widgets.DividerItemDecoration; import com.naman14.timber.widgets.PlayPauseButton; import com.naman14.timber.widgets.PlayPauseDrawable; 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.SimpleImageLoadingListener; import net.steamcrafted.materialiconlib.MaterialDrawableBuilder; import net.steamcrafted.materialiconlib.MaterialIconView; import java.security.InvalidParameterException; public class BaseNowplayingFragment extends Fragment implements MusicStateListener { ImageView albumart; ImageView shuffle; ImageView repeat; MaterialIconView previous, next; PlayPauseButton mPlayPause; PlayPauseDrawable playPauseDrawable = new PlayPauseDrawable(); FloatingActionButton playPauseFloating; View playPauseWrapper; String ateKey; int accentColor; TextView songtitle, songalbum, songartist, songduration, elapsedtime; SeekBar mProgress; //seekbar public Runnable mUpdateProgress = new Runnable() { @Override public void run() { if (mProgress != null) { long position = MusicPlayer.position(); mProgress.setProgress((int) position); if (elapsedtime != null && getActivity() != null) elapsedtime.setText(TimberUtils.makeShortTimeString(getActivity(), position / 1000)); } if (MusicPlayer.isPlaying()) { mProgress.postDelayed(mUpdateProgress, 50); } } }; CircularSeekBar mCircularProgress; //circular seekbar public Runnable mUpdateCircularProgress = new Runnable() { @Override public void run() { if (mCircularProgress != null) { long position = MusicPlayer.position(); mCircularProgress.setProgress((int) position); if (elapsedtime != null && getActivity() != null) elapsedtime.setText(TimberUtils.makeShortTimeString(getActivity(), position / 1000)); } if (MusicPlayer.isPlaying()) { mCircularProgress.postDelayed(mUpdateCircularProgress, 50); } } }; RecyclerView recyclerView; BaseQueueAdapter mAdapter; SlidingQueueAdapter slidingQueueAdapter; TimelyView timelyView11, timelyView12, timelyView13, timelyView14, timelyView15; TextView hourColon; int[] timeArr = new int[]{0, 0, 0, 0, 0}; Handler mElapsedTimeHandler; public Runnable mUpdateElapsedTime = new Runnable() { @Override public void run() { if (getActivity() != null) { String time = TimberUtils.makeShortTimeString(getActivity(), MusicPlayer.position() / 1000); if (time.length() < 5) { timelyView11.setVisibility(View.GONE); timelyView12.setVisibility(View.GONE); hourColon.setVisibility(View.GONE); tv13(time.charAt(0) - '0'); tv14(time.charAt(2) - '0'); tv15(time.charAt(3) - '0'); } else if (time.length() == 5) { timelyView12.setVisibility(View.VISIBLE); tv12(time.charAt(0) - '0'); tv13(time.charAt(1) - '0'); tv14(time.charAt(3) - '0'); tv15(time.charAt(4) - '0'); } else { timelyView11.setVisibility(View.VISIBLE); hourColon.setVisibility(View.VISIBLE); tv11(time.charAt(0) - '0'); tv12(time.charAt(2) - '0'); tv13(time.charAt(3) - '0'); tv14(time.charAt(5) - '0'); tv15(time.charAt(6) - '0'); } mElapsedTimeHandler.postDelayed(this, 600); } } }; private boolean duetoplaypause = false; private final View.OnClickListener mButtonListener = new View.OnClickListener() { @Override public void onClick(View v) { duetoplaypause = true; if (!mPlayPause.isPlayed()) { mPlayPause.setPlayed(true); mPlayPause.startAnimation(); } else { mPlayPause.setPlayed(false); mPlayPause.startAnimation(); } Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { MusicPlayer.playOrPause(); if (recyclerView != null && recyclerView.getAdapter() != null) recyclerView.getAdapter().notifyDataSetChanged(); } }, 200); } }; private final View.OnClickListener mFLoatingButtonListener = new View.OnClickListener() { @Override public void onClick(View v) { duetoplaypause = true; playPauseDrawable.transformToPlay(true); playPauseDrawable.transformToPause(true); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { MusicPlayer.playOrPause(); if (recyclerView != null && recyclerView.getAdapter() != null) recyclerView.getAdapter().notifyDataSetChanged(); } }, 250); } }; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ateKey = Helpers.getATEKey(getActivity()); accentColor = Config.accentColor(getActivity(), ateKey); } public void setSongDetails(View view) { albumart = (ImageView) view.findViewById(R.id.album_art); shuffle = (ImageView) view.findViewById(R.id.shuffle); repeat = (ImageView) view.findViewById(R.id.repeat); next = (MaterialIconView) view.findViewById(R.id.next); previous = (MaterialIconView) view.findViewById(R.id.previous); mPlayPause = (PlayPauseButton) view.findViewById(R.id.playpause); playPauseFloating = (FloatingActionButton) view.findViewById(R.id.playpausefloating); playPauseWrapper = view.findViewById(R.id.playpausewrapper); songtitle = (TextView) view.findViewById(R.id.song_title); songalbum = (TextView) view.findViewById(R.id.song_album); songartist = (TextView) view.findViewById(R.id.song_artist); songduration = (TextView) view.findViewById(R.id.song_duration); elapsedtime = (TextView) view.findViewById(R.id.song_elapsed_time); timelyView11 = (TimelyView) view.findViewById(R.id.timelyView11); timelyView12 = (TimelyView) view.findViewById(R.id.timelyView12); timelyView13 = (TimelyView) view.findViewById(R.id.timelyView13); timelyView14 = (TimelyView) view.findViewById(R.id.timelyView14); timelyView15 = (TimelyView) view.findViewById(R.id.timelyView15); hourColon = (TextView) view.findViewById(R.id.hour_colon); mProgress = (SeekBar) view.findViewById(R.id.song_progress); mCircularProgress = (CircularSeekBar) view.findViewById(R.id.song_progress_circular); recyclerView = (RecyclerView) view.findViewById(R.id.queue_recyclerview); Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); if (toolbar != null) { ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); final ActionBar ab = ((AppCompatActivity) getActivity()).getSupportActionBar(); ab.setDisplayHomeAsUpEnabled(true); ab.setTitle(""); } if (mPlayPause != null && getActivity() != null) { mPlayPause.setColor(ContextCompat.getColor(getContext(), android.R.color.white)); } if (playPauseFloating != null) { playPauseDrawable.setColorFilter(TimberUtils.getBlackWhiteColor(accentColor), PorterDuff.Mode.MULTIPLY); playPauseFloating.setImageDrawable(playPauseDrawable); if (MusicPlayer.isPlaying()) playPauseDrawable.transformToPause(false); else playPauseDrawable.transformToPlay(false); } if (mCircularProgress != null) { mCircularProgress.setCircleProgressColor(accentColor); mCircularProgress.setPointerColor(accentColor); mCircularProgress.setPointerHaloColor(accentColor); } if (timelyView11 != null) { String time = TimberUtils.makeShortTimeString(getActivity(), MusicPlayer.position() / 1000); if (time.length() < 5) { timelyView11.setVisibility(View.GONE); timelyView12.setVisibility(View.GONE); hourColon.setVisibility(View.GONE); changeDigit(timelyView13, time.charAt(0) - '0'); changeDigit(timelyView14, time.charAt(2) - '0'); changeDigit(timelyView15, time.charAt(3) - '0'); } else if (time.length() == 5) { timelyView12.setVisibility(View.VISIBLE); changeDigit(timelyView12, time.charAt(0) - '0'); changeDigit(timelyView13, time.charAt(1) - '0'); changeDigit(timelyView14, time.charAt(3) - '0'); changeDigit(timelyView15, time.charAt(4) - '0'); } else { timelyView11.setVisibility(View.VISIBLE); hourColon.setVisibility(View.VISIBLE); changeDigit(timelyView11, time.charAt(0) - '0'); changeDigit(timelyView12, time.charAt(2) - '0'); changeDigit(timelyView13, time.charAt(3) - '0'); changeDigit(timelyView14, time.charAt(5) - '0'); changeDigit(timelyView15, time.charAt(6) - '0'); } } setSongDetails(); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("dark_theme", false)) { ATE.apply(this, "dark_theme"); } else { ATE.apply(this, "light_theme"); } } private void setSongDetails() { updateSongDetails(); if (recyclerView != null) setQueueSongs(); setSeekBarListener(); if (next != null) { next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { MusicPlayer.next(); notifyPlayingDrawableChange(); } }, 200); } }); } if (previous != null) { previous.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { MusicPlayer.previous(getActivity(), false); notifyPlayingDrawableChange(); } }, 200); } }); } if (playPauseWrapper != null) playPauseWrapper.setOnClickListener(mButtonListener); if (playPauseFloating != null) playPauseFloating.setOnClickListener(mFLoatingButtonListener); updateShuffleState(); updateRepeatState(); } public void updateShuffleState() { if (shuffle != null && getActivity() != null) { MaterialDrawableBuilder builder = MaterialDrawableBuilder.with(getActivity()) .setIcon(MaterialDrawableBuilder.IconValue.SHUFFLE) .setSizeDp(30); if (getActivity() != null) { if (MusicPlayer.getShuffleMode() == 0) { builder.setColor(Config.textColorPrimary(getActivity(), ateKey)); } else builder.setColor(Config.accentColor(getActivity(), ateKey)); } shuffle.setImageDrawable(builder.build()); shuffle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MusicPlayer.cycleShuffle(); updateShuffleState(); updateRepeatState(); } }); } } public void updateRepeatState() { if (repeat != null && getActivity() != null) { MaterialDrawableBuilder builder = MaterialDrawableBuilder.with(getActivity()) .setIcon(MaterialDrawableBuilder.IconValue.REPEAT) .setSizeDp(30); if (getActivity() != null) { if (MusicPlayer.getRepeatMode() == 0) { builder.setColor(Config.textColorPrimary(getActivity(), ateKey)); } else builder.setColor(Config.accentColor(getActivity(), ateKey)); } repeat.setImageDrawable(builder.build()); repeat.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MusicPlayer.cycleRepeat(); updateRepeatState(); updateShuffleState(); } }); } } private void setSeekBarListener() { if (mProgress != null) mProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { if (b) { MusicPlayer.seek((long) i); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); if (mCircularProgress != null) { mCircularProgress.setOnSeekBarChangeListener(new CircularSeekBar.OnCircularSeekBarChangeListener() { @Override public void onProgressChanged(CircularSeekBar circularSeekBar, int progress, boolean fromUser) { if (fromUser) { MusicPlayer.seek((long) progress); } } @Override public void onStopTrackingTouch(CircularSeekBar seekBar) { } @Override public void onStartTrackingTouch(CircularSeekBar seekBar) { } }); } } public void updateSongDetails() { //do not reload image if it was a play/pause change if (!duetoplaypause) { if (albumart != null) { ImageLoader.getInstance().displayImage(TimberUtils.getAlbumArtUri(MusicPlayer.getCurrentAlbumId()).toString(), albumart, new DisplayImageOptions.Builder().cacheInMemory(true) .showImageOnFail(R.drawable.ic_empty_music2) .build(), new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { doAlbumArtStuff(loadedImage); } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { Bitmap failedBitmap = ImageLoader.getInstance().loadImageSync("drawable://" + R.drawable.ic_empty_music2); doAlbumArtStuff(failedBitmap); } }); } } duetoplaypause = false; if (mPlayPause != null) updatePlayPauseButton(); if (playPauseFloating != null) updatePlayPauseFloatingButton(); if (songtitle != null) songtitle.setText(MusicPlayer.getTrackName()); if (songalbum != null) songalbum.setText(MusicPlayer.getAlbumName()); if (songartist != null) songartist.setText(MusicPlayer.getArtistName()); if (songduration != null && getActivity() != null) songduration.setText(TimberUtils.makeShortTimeString(getActivity(), MusicPlayer.duration() / 1000)); if (mProgress != null) { mProgress.setMax((int) MusicPlayer.duration()); if (mUpdateProgress != null) { mProgress.removeCallbacks(mUpdateProgress); } mProgress.postDelayed(mUpdateProgress, 10); } if (mCircularProgress != null) { mCircularProgress.setMax((int) MusicPlayer.duration()); if (mUpdateCircularProgress != null) { mCircularProgress.removeCallbacks(mUpdateCircularProgress); } mCircularProgress.postDelayed(mUpdateCircularProgress, 10); } if (timelyView11 != null) { mElapsedTimeHandler = new Handler(); mElapsedTimeHandler.postDelayed(mUpdateElapsedTime, 600); } } public void setQueueSongs() { recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); //load queue songs in asynctask if (getActivity() != null) new loadQueueSongs().execute(""); } public void updatePlayPauseButton() { if (MusicPlayer.isPlaying()) { if (!mPlayPause.isPlayed()) { mPlayPause.setPlayed(true); mPlayPause.startAnimation(); } } else { if (mPlayPause.isPlayed()) { mPlayPause.setPlayed(false); mPlayPause.startAnimation(); } } } public void updatePlayPauseFloatingButton() { if (MusicPlayer.isPlaying()) { playPauseDrawable.transformToPause(false); } else { playPauseDrawable.transformToPlay(false); } } public void notifyPlayingDrawableChange() { int position = MusicPlayer.getQueuePosition(); BaseQueueAdapter.currentlyPlayingPosition = position; } public void restartLoader() { } public void onPlaylistChanged() { } public void onMetaChanged() { updateSongDetails(); if (recyclerView != null && recyclerView.getAdapter() != null) recyclerView.getAdapter().notifyDataSetChanged(); } public void setMusicStateListener() { ((BaseActivity) getActivity()).setMusicStateListenerListener(this); } public void doAlbumArtStuff(Bitmap loadedImage) { } public void changeDigit(TimelyView tv, int end) { ObjectAnimator obja = tv.animate(end); obja.setDuration(400); obja.start(); } public void changeDigit(TimelyView tv, int start, int end) { try { ObjectAnimator obja = tv.animate(start, end); obja.setDuration(400); obja.start(); } catch (InvalidParameterException e) { e.printStackTrace(); } } public void tv11(int a) { if (a != timeArr[0]) { changeDigit(timelyView11, timeArr[0], a); timeArr[0] = a; } } public void tv12(int a) { if (a != timeArr[1]) { changeDigit(timelyView12, timeArr[1], a); timeArr[1] = a; } } public void tv13(int a) { if (a != timeArr[2]) { changeDigit(timelyView13, timeArr[2], a); timeArr[2] = a; } } public void tv14(int a) { if (a != timeArr[3]) { changeDigit(timelyView14, timeArr[3], a); timeArr[3] = a; } } public void tv15(int a) { if (a != timeArr[4]) { changeDigit(timelyView15, timeArr[4], a); timeArr[4] = a; } } protected void initGestures(View v) { if (PreferencesUtility.getInstance(v.getContext()).isGesturesEnabled()) { new SlideTrackSwitcher() { @Override public void onSwipeBottom() { getActivity().finish(); } }.attach(v); } } private class loadQueueSongs extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { if (getActivity() != null) { mAdapter = new BaseQueueAdapter((AppCompatActivity) getActivity(), QueueLoader.getQueueSongs(getActivity())); return "Executed"; } else return null; } @Override protected void onPostExecute(String result) { if (result != null) { recyclerView.setAdapter(mAdapter); if (getActivity() != null) recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); recyclerView.scrollToPosition(MusicPlayer.getQueuePosition() - 1); } } @Override protected void onPreExecute() { } } }