package com.simplecity.amp_library.ui.fragments; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.LayerDrawable; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.Priority; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.simplecity.amp_library.R; import com.simplecity.amp_library.glide.utils.GlideUtils; import com.simplecity.amp_library.model.Song; import com.simplecity.amp_library.playback.MusicService; import com.simplecity.amp_library.ui.activities.MainActivity; import com.simplecity.amp_library.ui.activities.PlayerActivity; import com.simplecity.amp_library.ui.presenters.PlayerPresenter; import com.simplecity.amp_library.ui.views.PlayPauseView; import com.simplecity.amp_library.ui.views.PlayerView; import com.simplecity.amp_library.utils.ColorUtils; import com.simplecity.amp_library.utils.DrawableUtils; import com.simplecity.amp_library.utils.MusicServiceConnectionUtils; import com.simplecity.amp_library.utils.MusicUtils; public class MiniPlayerFragment extends BaseFragment implements PlayerView { private static final String TAG = "MiniPlayerFragment"; private View rootView; private PlayPauseView playPauseView; private ProgressBar progressBar; private SharedPreferences sharedPreferences; private SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener; private PlayerPresenter presenter = new PlayerPresenter(); private TextView trackName; private TextView artistName; private ImageView miniArtwork; public MiniPlayerFragment() { } public static MiniPlayerFragment newInstance() { MiniPlayerFragment fragment = new MiniPlayerFragment(); Bundle args = new Bundle(); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); onSharedPreferenceChangeListener = (sharedPreferences, key) -> { if (key.equals("pref_theme_highlight_color") || key.equals("pref_theme_accent_color") || key.equals("pref_theme_white_accent")) { themeUIComponents(); } }; sharedPreferences.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_mini_player, container, false); rootView.setBackgroundColor(ColorUtils.getPrimaryColor()); rootView.setOnTouchListener(new OnSwipeTouchListener(getActivity())); playPauseView = (PlayPauseView) rootView.findViewById(R.id.mini_play); playPauseView.setOnClickListener(v -> { playPauseView.toggle(); playPauseView.postDelayed(() -> presenter.togglePlayback(), 200); }); progressBar = (ProgressBar) rootView.findViewById(R.id.progressbar); progressBar.setMax(1000); trackName = (TextView) rootView.findViewById(R.id.track_name); artistName = (TextView) rootView.findViewById(R.id.artist_name); miniArtwork = (ImageView) rootView.findViewById(R.id.mini_album_artwork); themeUIComponents(); return rootView; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); presenter.bindView(this); } @Override public void onResume() { super.onResume(); if (presenter != null) { presenter.updateTrackInfo(); } } @Override public void onPause() { super.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); presenter.unbindView(this); } @Override public void onDestroy() { sharedPreferences.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener); rootView.setOnTouchListener(null); super.onDestroy(); } private void themeUIComponents() { if (progressBar != null) { progressBar.setProgressDrawable(DrawableUtils.getProgressDrawable(getActivity(), (LayerDrawable) progressBar.getProgressDrawable())); } if (rootView != null) { rootView.setBackgroundColor(ColorUtils.getPrimaryColor()); } } void updateMiniPlayerVisibility() { boolean show = !(MusicServiceConnectionUtils.sServiceBinder == null || MusicUtils.getSongId() == -1); ((MainActivity) getActivity()).togglePanelVisibility(show); } private class OnSwipeTouchListener implements View.OnTouchListener { private final GestureDetector gestureDetector; OnSwipeTouchListener(Context context) { gestureDetector = new GestureDetector(context, new GestureListener()); } void onSwipeLeft() { presenter.skip(); } void onSwipeRight() { presenter.prev(false); } public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { rootView.setPressed(true); } else if (event.getAction() == MotionEvent.ACTION_UP) { rootView.setPressed(false); } return gestureDetector.onTouchEvent(event); } private final class GestureListener extends GestureDetector.SimpleOnGestureListener { private static final int SWIPE_DISTANCE_THRESHOLD = 100; private static final int SWIPE_VELOCITY_THRESHOLD = 100; GestureListener() { } @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onSingleTapUp(MotionEvent e) { Activity parent = getActivity(); if (getResources().getBoolean(R.bool.isSlidingEnabled)) { if (parent instanceof MainActivity) { ((MainActivity) parent).togglePane(); } } else { Intent intent = new Intent(parent, PlayerActivity.class); parent.startActivityForResult(intent, MainActivity.REQUEST_SEARCH); } return super.onSingleTapUp(e); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { if (distanceX > 0) onSwipeRight(); else onSwipeLeft(); return true; } return false; } } } @Override protected String screenName() { return TAG; } @Override public void setSeekProgress(int progress) { progressBar.setProgress(progress); } @Override public void currentTimeVisibilityChanged(boolean visible) { } @Override public void currentTimeChanged(long seconds) { } @Override public void queueChanged(int queuePosition, int queueLength) { } @Override public void playbackChanged(boolean isPlaying) { if (isPlaying) { if (playPauseView.isPlay()) { playPauseView.toggle(); } } else { if (!playPauseView.isPlay()) { playPauseView.toggle(); } } } @Override public void shuffleChanged(@MusicService.ShuffleMode int shuffleMode) { } @Override public void repeatChanged(@MusicService.RepeatMode int repeatMode) { } @Override public void favoriteChanged() { } @Override public void trackInfoChanged(@Nullable Song song) { if (song == null) return; ((MainActivity) getActivity()).togglePanelVisibility(true); trackName.setText(song.name); artistName.setText(String.format("%s | %s", song.artistName, song.albumName)); Glide.with(getContext()) .load(song) .priority(Priority.HIGH) .diskCacheStrategy(DiskCacheStrategy.ALL) .placeholder(GlideUtils.getMediumPlaceHolderResId()) .into(miniArtwork); rootView.setContentDescription(getString(R.string.btn_now_playing, song.name, song.artistName)); } }