kotlin conversion

This commit is contained in:
h4h13 2018-11-30 06:36:16 +05:30
parent 8e6ab40d93
commit b2c15ef186
316 changed files with 13055 additions and 22983 deletions

View file

@ -18,6 +18,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import androidx.appcompat.widget.Toolbar;
@ -30,7 +31,6 @@ import butterknife.ButterKnife;
import butterknife.OnClick;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
import code.name.monkey.retromusic.Constants;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.model.Contributor;
import code.name.monkey.retromusic.ui.activities.base.AbsBaseActivity;
@ -38,7 +38,10 @@ import code.name.monkey.retromusic.ui.adapter.ContributorAdapter;
import code.name.monkey.retromusic.util.NavigationUtil;
import static code.name.monkey.retromusic.Constants.APP_INSTAGRAM_LINK;
import static code.name.monkey.retromusic.Constants.APP_TELEGRAM_LINK;
import static code.name.monkey.retromusic.Constants.APP_TWITTER_LINK;
import static code.name.monkey.retromusic.Constants.DISCORD_LINK;
import static code.name.monkey.retromusic.Constants.FAQ_LINK;
import static code.name.monkey.retromusic.Constants.GITHUB_PROJECT;
import static code.name.monkey.retromusic.Constants.GOOGLE_PLUS_COMMUNITY;
import static code.name.monkey.retromusic.Constants.RATE_ON_GOOGLE_PLAY;
@ -115,13 +118,13 @@ public class AboutActivity extends AbsBaseActivity {
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.faq_link:
openUrl(Constants.FAQ_LINK);
openUrl(FAQ_LINK);
break;
case R.id.telegram_link:
openUrl(Constants.APP_TELEGRAM_LINK);
openUrl(APP_TELEGRAM_LINK);
break;
case R.id.discord_link:
openUrl(Constants.DISCORD_LINK);
openUrl(DISCORD_LINK);
break;
case R.id.app_github:
openUrl(GITHUB_PROJECT);
@ -200,7 +203,7 @@ public class AboutActivity extends AbsBaseActivity {
}.getType();
List<Contributor> contributors = new Gson().fromJson(data, type);
ContributorAdapter contributorAdapter = new ContributorAdapter(contributors);
ContributorAdapter contributorAdapter = new ContributorAdapter((ArrayList<Contributor>) contributors);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(contributorAdapter);

View file

@ -1,426 +0,0 @@
package code.name.monkey.retromusic.ui.activities;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.transition.Slide;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.util.Pair;
import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.appthemehelper.util.TintHelper;
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog;
import code.name.monkey.retromusic.dialogs.DeleteSongsDialog;
import code.name.monkey.retromusic.glide.ArtistGlideRequest;
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget;
import code.name.monkey.retromusic.glide.SongGlideRequest;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder;
import code.name.monkey.retromusic.loaders.ArtistLoader;
import code.name.monkey.retromusic.misc.AppBarStateChangeListener;
import code.name.monkey.retromusic.model.Album;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.mvp.contract.AlbumDetailsContract;
import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsPresenter;
import code.name.monkey.retromusic.ui.activities.base.AbsSlidingMusicPanelActivity;
import code.name.monkey.retromusic.ui.activities.tageditor.AbsTagEditorActivity;
import code.name.monkey.retromusic.ui.activities.tageditor.AlbumTagEditorActivity;
import code.name.monkey.retromusic.ui.adapter.album.AlbumAdapter;
import code.name.monkey.retromusic.ui.adapter.album.HorizontalAlbumAdapter;
import code.name.monkey.retromusic.ui.adapter.song.SimpleSongAdapter;
import code.name.monkey.retromusic.util.MusicUtil;
import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.util.PreferenceUtil;
import code.name.monkey.retromusic.util.RetroUtil;
import code.name.monkey.retromusic.views.CollapsingFAB;
public class AlbumDetailsActivity extends AbsSlidingMusicPanelActivity implements
AlbumDetailsContract.AlbumDetailsView {
public static final String EXTRA_ALBUM_ID = "extra_album_id";
private static final int TAG_EDITOR_REQUEST = 2001;
@BindView(R.id.image)
ImageView image;
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
@BindView(R.id.title)
TextView title;
@BindView(R.id.text)
TextView text;
@BindView(R.id.song_title)
AppCompatTextView songTitle;
@BindView(R.id.action_shuffle_all)
CollapsingFAB shuffleButton;
@BindView(R.id.collapsing_toolbar)
@Nullable
CollapsingToolbarLayout collapsingToolbarLayout;
@BindView(R.id.app_bar)
@Nullable
AppBarLayout appBarLayout;
@BindView(R.id.content)
NestedScrollView contentContainer;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.more_recycler_view)
RecyclerView moreRecyclerView;
@BindView(R.id.more_title)
TextView moreTitle;
@BindView(R.id.artist_image)
@Nullable
ImageView artistImage;
private AlbumDetailsPresenter albumDetailsPresenter;
private SimpleSongAdapter adapter;
private Album album;
@Override
protected View createContentView() {
return wrapSlidingMusicPanel(R.layout.activity_album);
}
void setupWindowTransition() {
Slide slide = new Slide(Gravity.BOTTOM);
slide.setInterpolator(
AnimationUtils.loadInterpolator(this, android.R.interpolator.linear_out_slow_in));
getWindow().setEnterTransition(slide);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
setDrawUnderStatusBar();
setupWindowTransition();
super.onCreate(savedInstanceState);
ButterKnife.bind(this);
toggleBottomNavigationView(true);
setLightNavigationBar(true);
setNavigationbarColorAuto();
ActivityCompat.postponeEnterTransition(this);
int albumId = getIntent().getIntExtra(EXTRA_ALBUM_ID, -1);
albumDetailsPresenter = new AlbumDetailsPresenter(this, albumId);
albumDetailsPresenter.subscribe();
setupRecyclerView();
setupToolbarMarginHeight();
contentContainer.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
if (scrollY > oldScrollY) {
shuffleButton.setShowTitle(false);
}
if (scrollY < oldScrollY) {
shuffleButton.setShowTitle(true);
}
});
}
private void setupRecyclerView() {
adapter = new SimpleSongAdapter(this, new ArrayList<>(), R.layout.item_song);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setAdapter(adapter);
}
private void setupToolbarMarginHeight() {
int primaryColor = ThemeStore.primaryColor(this);
TintHelper.setTintAuto(contentContainer, primaryColor, true);
if (collapsingToolbarLayout != null) {
collapsingToolbarLayout.setContentScrimColor(primaryColor);
collapsingToolbarLayout.setStatusBarScrimColor(ColorUtil.darkenColor(primaryColor));
}
toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp);
setSupportActionBar(toolbar);
//noinspection ConstantConditions
getSupportActionBar().setTitle(null);
if (toolbar != null && !PreferenceUtil.getInstance().getFullScreenMode()) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams();
params.topMargin = RetroUtil.getStatusBarHeight( );
toolbar.setLayoutParams(params);
}
if (appBarLayout != null) {
appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() {
@Override
public void onStateChanged(AppBarLayout appBarLayout, State state) {
int color;
switch (state) {
case COLLAPSED:
setLightStatusbar(ColorUtil.isColorLight(ThemeStore.primaryColor(AlbumDetailsActivity.this)));
color = ThemeStore.primaryColor(AlbumDetailsActivity.this);
break;
default:
case EXPANDED:
case IDLE:
setLightStatusbar(false);
color = Color.TRANSPARENT;
break;
}
ToolbarContentTintHelper.setToolbarContentColorBasedOnToolbarColor(AlbumDetailsActivity.this, toolbar, color);
}
});
}
}
@OnClick({R.id.action_shuffle_all, R.id.artist_image})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.artist_image:
Pair[] artistPairs = new Pair[]{Pair.create(image,
getResources().getString(R.string.transition_artist_image))};
NavigationUtil.goToArtist(this, getAlbum().getArtistId(),
artistPairs);
break;
case R.id.action_shuffle_all:
if (getAlbum().songs != null) {
MusicPlayerRemote.openAndShuffleQueue(getAlbum().songs, true);
}
break;
}
}
@Override
protected void onPause() {
super.onPause();
albumDetailsPresenter.unsubscribe();
}
@Override
public void loading() {
}
@Override
public void showEmptyView() {
}
@Override
public void completed() {
ActivityCompat.startPostponedEnterTransition(this);
}
@Override
public void showData(Album album) {
if (album.songs.isEmpty()) {
finish();
return;
}
this.album = album;
title.setText(album.getTitle());
text.setText(String.format("%s%s • %s", album.getArtistName(),
"" + MusicUtil.getYearString(album.getYear()),
MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs))));
loadAlbumCover();
loadMoreFrom(album);
adapter.swapDataSet(album.songs);
}
private void loadMoreFrom(Album album) {
if (artistImage != null) {
ArtistGlideRequest.Builder.from(Glide.with(this),
ArtistLoader.getArtist(this, album.getArtistId()).blockingFirst())
.forceDownload(false)
.generatePalette(this).build()
.dontAnimate()
.into(new RetroMusicColoredTarget(artistImage) {
@Override
public void onColorReady(int color) {
//setColors(color);
}
});
}
ArrayList<Album> albums = ArtistLoader.getArtist(this, album.getArtistId())
.blockingFirst().albums;
albums.remove(album);
if (!albums.isEmpty()) {
moreTitle.setVisibility(View.VISIBLE);
moreRecyclerView.setVisibility(View.VISIBLE);
} else {
return;
}
moreTitle.setText(String.format("More from %s", album.getArtistName()));
AlbumAdapter albumAdapter = new HorizontalAlbumAdapter(this, albums, false, null);
moreRecyclerView.setLayoutManager(new GridLayoutManager(this, 1, GridLayoutManager.HORIZONTAL, false));
moreRecyclerView.setAdapter(albumAdapter);
}
public Album getAlbum() {
return album;
}
private void loadAlbumCover() {
SongGlideRequest.Builder.from(Glide.with(this), getAlbum().safeGetFirstSong())
.checkIgnoreMediaStore(this)
.generatePalette(this).build()
.dontAnimate()
.into(new RetroMusicColoredTarget(image) {
@Override
public void onColorReady(int color) {
setColors(color);
}
});
}
private void setColors(int color) {
int themeColor =
PreferenceUtil.getInstance().getAdaptiveColor() ? color : ThemeStore.accentColor(this);
songTitle.setTextColor(themeColor);
moreTitle.setTextColor(themeColor);
shuffleButton.setColor(themeColor);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_album_detail, menu);
MenuItem sortOrder = menu.findItem(R.id.action_sort_order);
setUpSortOrderMenu(sortOrder.getSubMenu());
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return handleSortOrderMenuItem(item);
}
private boolean handleSortOrderMenuItem(@NonNull MenuItem item) {
String sortOrder = null;
final ArrayList<Song> songs = adapter.getDataSet();
switch (item.getItemId()) {
case R.id.action_play_next:
MusicPlayerRemote.playNext(songs);
return true;
case R.id.action_add_to_current_playing:
MusicPlayerRemote.enqueue(songs);
return true;
case R.id.action_add_to_playlist:
AddToPlaylistDialog.create(songs).show(getSupportFragmentManager(), "ADD_PLAYLIST");
return true;
case R.id.action_delete_from_device:
DeleteSongsDialog.create(songs).show(getSupportFragmentManager(), "DELETE_SONGS");
return true;
case android.R.id.home:
super.onBackPressed();
return true;
case R.id.action_tag_editor:
Intent intent = new Intent(this, AlbumTagEditorActivity.class);
intent.putExtra(AbsTagEditorActivity.EXTRA_ID, getAlbum().getId());
startActivityForResult(intent, TAG_EDITOR_REQUEST);
return true;
case R.id.action_go_to_artist:
NavigationUtil.goToArtist(this, getAlbum().getArtistId());
return true;
/*Sort*/
case R.id.action_sort_order_title:
sortOrder = AlbumSongSortOrder.SONG_A_Z;
break;
case R.id.action_sort_order_title_desc:
sortOrder = AlbumSongSortOrder.SONG_Z_A;
break;
case R.id.action_sort_order_track_list:
sortOrder = AlbumSongSortOrder.SONG_TRACK_LIST;
break;
case R.id.action_sort_order_artist_song_duration:
sortOrder = AlbumSongSortOrder.SONG_DURATION;
break;
}
if (sortOrder != null) {
item.setChecked(true);
setSaveSortOrder(sortOrder);
}
return true;
}
private String getSavedSortOrder() {
return PreferenceUtil.getInstance().getAlbumDetailSongSortOrder();
}
private void setUpSortOrderMenu(@NonNull SubMenu sortOrder) {
switch (getSavedSortOrder()) {
case AlbumSongSortOrder.SONG_A_Z:
sortOrder.findItem(R.id.action_sort_order_title).setChecked(true);
break;
case AlbumSongSortOrder.SONG_Z_A:
sortOrder.findItem(R.id.action_sort_order_title_desc).setChecked(true);
break;
case AlbumSongSortOrder.SONG_TRACK_LIST:
sortOrder.findItem(R.id.action_sort_order_track_list).setChecked(true);
break;
case AlbumSongSortOrder.SONG_DURATION:
sortOrder.findItem(R.id.action_sort_order_artist_song_duration).setChecked(true);
break;
}
}
private void setSaveSortOrder(String sortOrder) {
PreferenceUtil.getInstance().setAlbumDetailSongSortOrder(sortOrder);
reload();
}
@Override
public void onMediaStoreChanged() {
super.onMediaStoreChanged();
reload();
}
private void reload() {
albumDetailsPresenter.subscribe();
}
}

View file

@ -0,0 +1,338 @@
package code.name.monkey.retromusic.ui.activities
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.transition.Slide
import android.view.*
import android.view.animation.AnimationUtils
import androidx.core.app.ActivityCompat
import androidx.core.util.Pair
import androidx.core.widget.NestedScrollView
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import butterknife.ButterKnife
import butterknife.OnClick
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
import code.name.monkey.retromusic.dialogs.DeleteSongsDialog
import code.name.monkey.retromusic.glide.ArtistGlideRequest
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder
import code.name.monkey.retromusic.loaders.ArtistLoader
import code.name.monkey.retromusic.misc.AppBarStateChangeListener
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.mvp.contract.AlbumDetailsContract
import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsPresenter
import code.name.monkey.retromusic.ui.activities.base.AbsSlidingMusicPanelActivity
import code.name.monkey.retromusic.ui.activities.tageditor.AbsTagEditorActivity
import code.name.monkey.retromusic.ui.activities.tageditor.AlbumTagEditorActivity
import code.name.monkey.retromusic.ui.adapter.album.HorizontalAlbumAdapter
import code.name.monkey.retromusic.ui.adapter.song.SimpleSongAdapter
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import code.name.monkey.retromusic.views.CircularImageView
import com.bumptech.glide.Glide
import com.google.android.material.appbar.AppBarLayout
import kotlinx.android.synthetic.main.activity_album.*
import kotlinx.android.synthetic.main.activity_album_content.*
import java.util.*
class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsContract.AlbumDetailsView {
private var albumDetailsPresenter: AlbumDetailsPresenter? = null
private var adapter: SimpleSongAdapter? = null
var album: Album? = null
private set
private val savedSortOrder: String
get() = PreferenceUtil.getInstance().albumDetailSongSortOrder
override fun createContentView(): View {
return wrapSlidingMusicPanel(R.layout.activity_album)
}
private fun setupWindowTransition() {
val slide = Slide(Gravity.BOTTOM)
slide.interpolator = AnimationUtils.loadInterpolator(this, android.R.interpolator.linear_out_slow_in)
window.enterTransition = slide
}
override fun onCreate(savedInstanceState: Bundle?) {
setDrawUnderStatusBar()
setupWindowTransition()
super.onCreate(savedInstanceState)
ButterKnife.bind(this)
toggleBottomNavigationView(true)
setLightNavigationBar(true)
setNavigationbarColorAuto()
ActivityCompat.postponeEnterTransition(this)
val albumId = intent.getIntExtra(EXTRA_ALBUM_ID, -1)
albumDetailsPresenter = AlbumDetailsPresenter(this, albumId)
albumDetailsPresenter!!.subscribe()
setupRecyclerView()
setupToolbarMarginHeight()
contentContainer.setOnScrollChangeListener { v: NestedScrollView?, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int ->
run {
if (scrollY > oldScrollY) {
actionShuffleAll!!.setShowTitle(false)
}
if (scrollY < oldScrollY) {
actionShuffleAll!!.setShowTitle(true)
}
}
}
}
private fun setupRecyclerView() {
adapter = SimpleSongAdapter(this, ArrayList(), R.layout.item_song)
recyclerView.apply {
layoutManager = LinearLayoutManager(this@AlbumDetailsActivity)
itemAnimator = DefaultItemAnimator()
isNestedScrollingEnabled = false
adapter = adapter
}
}
private fun setupToolbarMarginHeight() {
val primaryColor = ThemeStore.primaryColor(this)
TintHelper.setTintAuto(contentContainer!!, primaryColor, true)
if (collapsingToolbarLayout != null) {
collapsingToolbarLayout!!.setContentScrimColor(primaryColor)
collapsingToolbarLayout!!.setStatusBarScrimColor(ColorUtil.darkenColor(primaryColor))
}
toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp)
setSupportActionBar(toolbar)
supportActionBar!!.title = null
if (toolbar != null && !PreferenceUtil.getInstance().fullScreenMode) {
val params = toolbar!!.layoutParams as ViewGroup.MarginLayoutParams
params.topMargin = RetroUtil.getStatusBarHeight()
toolbar!!.layoutParams = params
}
if (appBarLayout != null) {
appBarLayout!!.addOnOffsetChangedListener(object : AppBarStateChangeListener() {
override fun onStateChanged(appBarLayout: AppBarLayout, state: AppBarStateChangeListener.State) {
val color: Int
when (state) {
AppBarStateChangeListener.State.COLLAPSED -> {
setLightStatusbar(ColorUtil.isColorLight(ThemeStore.primaryColor(this@AlbumDetailsActivity)))
color = ThemeStore.primaryColor(this@AlbumDetailsActivity)
}
AppBarStateChangeListener.State.EXPANDED, AppBarStateChangeListener.State.IDLE -> {
setLightStatusbar(false)
color = Color.TRANSPARENT
}
else -> {
setLightStatusbar(false)
color = Color.TRANSPARENT
}
}
ToolbarContentTintHelper.setToolbarContentColorBasedOnToolbarColor(this@AlbumDetailsActivity, toolbar, color)
}
})
}
}
@OnClick(R.id.action_shuffle_all, R.id.artist_image)
fun onViewClicked(view: View) {
when (view.id) {
R.id.artist_image -> {
val artistPairs = arrayOf<Pair<*, *>>(Pair.create(image, resources.getString(R.string.transition_artist_image)))
NavigationUtil.goToArtist(this, album!!.artistId, *artistPairs)
}
R.id.action_shuffle_all -> if (album!!.songs != null) {
MusicPlayerRemote.openAndShuffleQueue(album!!.songs!!, true)
}
}
}
override fun onPause() {
super.onPause()
albumDetailsPresenter!!.unsubscribe()
}
override fun loading() {
}
override fun showEmptyView() {
}
override fun completed() {
ActivityCompat.startPostponedEnterTransition(this)
}
override fun showData(album: Album) {
if (album.songs!!.isEmpty()) {
finish()
return
}
this.album = album
albumTitle.text = album.title
albumText.text = String.format("%s • %s • %s", album.artistName, MusicUtil.getYearString(album.year), MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs)))
loadAlbumCover()
loadMoreFrom(album)
adapter!!.swapDataSet(album.songs)
}
private fun loadMoreFrom(album: Album) {
if (artistImage != null) {
ArtistGlideRequest.Builder.from(Glide.with(this),
ArtistLoader.getArtist(this, album.artistId).blockingFirst())
.forceDownload(false)
.generatePalette(this).build()
.dontAnimate()
.into(object : RetroMusicColoredTarget(artistImage as CircularImageView) {
override fun onColorReady(color: Int) {
//setColors(color);
}
})
}
val albums = ArtistLoader.getArtist(this, album.artistId)
.blockingFirst().albums
albums!!.remove(album)
if (!albums.isEmpty()) {
moreTitle.visibility = View.VISIBLE
moreRecyclerView!!.visibility = View.VISIBLE
} else {
return
}
moreTitle.text = String.format("More from %s", album.artistName)
val albumAdapter = HorizontalAlbumAdapter(this, albums, false, null)
moreRecyclerView!!.layoutManager = GridLayoutManager(this, 1, GridLayoutManager.HORIZONTAL, false)
moreRecyclerView!!.adapter = albumAdapter
}
private fun loadAlbumCover() {
SongGlideRequest.Builder.from(Glide.with(this), album!!.safeGetFirstSong())
.checkIgnoreMediaStore(this)
.generatePalette(this).build()
.dontAnimate()
.into(object : RetroMusicColoredTarget(image) {
override fun onColorReady(color: Int) {
setColors(color)
}
})
}
private fun setColors(color: Int) {
val themeColor = if (PreferenceUtil.getInstance().adaptiveColor) color else ThemeStore.accentColor(this)
songTitle.setTextColor(themeColor)
moreTitle.setTextColor(themeColor)
actionShuffleAll.setColor(themeColor)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_album_detail, menu)
val sortOrder = menu.findItem(R.id.action_sort_order)
setUpSortOrderMenu(sortOrder.subMenu)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return handleSortOrderMenuItem(item)
}
private fun handleSortOrderMenuItem(item: MenuItem): Boolean {
var sortOrder: String? = null
val songs = adapter!!.dataSet
when (item.itemId) {
R.id.action_play_next -> {
MusicPlayerRemote.playNext(songs)
return true
}
R.id.action_add_to_current_playing -> {
MusicPlayerRemote.enqueue(songs)
return true
}
R.id.action_add_to_playlist -> {
AddToPlaylistDialog.create(songs).show(supportFragmentManager, "ADD_PLAYLIST")
return true
}
R.id.action_delete_from_device -> {
DeleteSongsDialog.create(songs).show(supportFragmentManager, "DELETE_SONGS")
return true
}
android.R.id.home -> {
super.onBackPressed()
return true
}
R.id.action_tag_editor -> {
val intent = Intent(this, AlbumTagEditorActivity::class.java)
intent.putExtra(AbsTagEditorActivity.EXTRA_ID, album!!.id)
startActivityForResult(intent, TAG_EDITOR_REQUEST)
return true
}
R.id.action_go_to_artist -> {
NavigationUtil.goToArtist(this, album!!.artistId)
return true
}
/*Sort*/
R.id.action_sort_order_title -> sortOrder = AlbumSongSortOrder.SONG_A_Z
R.id.action_sort_order_title_desc -> sortOrder = AlbumSongSortOrder.SONG_Z_A
R.id.action_sort_order_track_list -> sortOrder = AlbumSongSortOrder.SONG_TRACK_LIST
R.id.action_sort_order_artist_song_duration -> sortOrder = AlbumSongSortOrder.SONG_DURATION
}
if (sortOrder != null) {
item.isChecked = true
setSaveSortOrder(sortOrder)
}
return true
}
private fun setUpSortOrderMenu(sortOrder: SubMenu) {
when (savedSortOrder) {
AlbumSongSortOrder.SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title).isChecked = true
AlbumSongSortOrder.SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked = true
AlbumSongSortOrder.SONG_TRACK_LIST -> sortOrder.findItem(R.id.action_sort_order_track_list).isChecked = true
AlbumSongSortOrder.SONG_DURATION -> sortOrder.findItem(R.id.action_sort_order_artist_song_duration).isChecked = true
}
}
private fun setSaveSortOrder(sortOrder: String?) {
PreferenceUtil.getInstance().albumDetailSongSortOrder = sortOrder
reload()
}
override fun onMediaStoreChanged() {
super.onMediaStoreChanged()
reload()
}
private fun reload() {
albumDetailsPresenter!!.subscribe()
}
companion object {
const val EXTRA_ALBUM_ID = "extra_album_id"
private const val TAG_EDITOR_REQUEST = 2001
}
}

View file

@ -238,8 +238,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
private void setupRecyclerView() {
albumAdapter = new HorizontalAlbumAdapter(this, new ArrayList<>(), false, null);
albumRecyclerView.setItemAnimator(new DefaultItemAnimator());
albumRecyclerView
.setLayoutManager(new GridLayoutManager(this, 1, GridLayoutManager.HORIZONTAL, false));
albumRecyclerView.setLayoutManager(new GridLayoutManager(this, 1, GridLayoutManager.HORIZONTAL, false));
albumRecyclerView.setAdapter(albumAdapter);
songAdapter = new SimpleSongAdapter(this, new ArrayList<>(), R.layout.item_song);
@ -313,7 +312,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
.getReadableDurationString(MusicUtil.getTotalDuration(this, artist.getSongs()))));
songAdapter.swapDataSet(artist.getSongs());
albumAdapter.swapDataSet(artist.albums);
albumAdapter.swapDataSet(artist.getAlbums());
}
private void loadBiography() {
@ -398,7 +397,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.action_shuffle_all:
MusicPlayerRemote.openAndShuffleQueue(getArtist().getSongs(), true);
MusicPlayerRemote.INSTANCE.openAndShuffleQueue(getArtist().getSongs(), true);
break;
}
}
@ -415,10 +414,10 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
super.onBackPressed();
return true;
case R.id.action_play_next:
MusicPlayerRemote.playNext(songs);
MusicPlayerRemote.INSTANCE.playNext(songs);
return true;
case R.id.action_add_to_current_playing:
MusicPlayerRemote.enqueue(songs);
MusicPlayerRemote.INSTANCE.enqueue(songs);
return true;
case R.id.action_add_to_playlist:
AddToPlaylistDialog.create(songs).show(getSupportFragmentManager(), "ADD_PLAYLIST");

View file

@ -66,7 +66,7 @@ public class EqualizerActivity extends AbsMusicServiceActivity implements
private CompoundButton.OnCheckedChangeListener mListener = (buttonView, isChecked) -> {
switch (buttonView.getId()) {
case R.id.equalizer:
EqualizerHelper.getInstance().getEqualizer().setEnabled(isChecked);
EqualizerHelper.Companion.getInstance().getEqualizer().setEnabled(isChecked);
TransitionManager.beginDelayedTransition(mContent);
mContent.setVisibility(isChecked ? View.VISIBLE : View.GONE);
break;
@ -78,12 +78,12 @@ public class EqualizerActivity extends AbsMusicServiceActivity implements
if (fromUser) {
if (seekBar == mBassBoostStrength) {
mBassBoost.setEnabled(progress > 0);
EqualizerHelper.getInstance().setBassBoostStrength(progress);
EqualizerHelper.getInstance().setBassBoostEnabled(progress > 0);
EqualizerHelper.Companion.getInstance().setBassBoostStrength(progress);
EqualizerHelper.Companion.getInstance().setBassBoostEnabled(progress > 0);
} else if (seekBar == mVirtualizerStrength) {
mVirtualizer.setEnabled(progress > 0);
EqualizerHelper.getInstance().setVirtualizerEnabled(progress > 0);
EqualizerHelper.getInstance().setVirtualizerStrength(progress);
EqualizerHelper.Companion.getInstance().setVirtualizerEnabled(progress > 0);
EqualizerHelper.Companion.getInstance().setVirtualizerStrength(progress);
}
}
}
@ -113,17 +113,17 @@ public class EqualizerActivity extends AbsMusicServiceActivity implements
setupToolbar();
mEnable.setChecked(EqualizerHelper.getInstance().getEqualizer().getEnabled());
mEnable.setChecked(EqualizerHelper.Companion.getInstance().getEqualizer().getEnabled());
mEnable.setOnCheckedChangeListener(mListener);
mPresetsNamesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
mPresets.setAdapter(mPresetsNamesAdapter);
mPresets.setOnItemSelectedListener(this);
mBassBoostStrength.setProgress(EqualizerHelper.getInstance().getBassBoostStrength());
mBassBoostStrength.setProgress(EqualizerHelper.Companion.getInstance().getBassBoostStrength());
mBassBoostStrength.setOnSeekBarChangeListener(mSeekBarChangeListener);
mVirtualizerStrength.setProgress(EqualizerHelper.getInstance().getVirtualizerStrength());
mVirtualizerStrength.setProgress(EqualizerHelper.Companion.getInstance().getVirtualizerStrength());
mVirtualizerStrength.setOnSeekBarChangeListener(mSeekBarChangeListener);
setupUI();
@ -153,13 +153,13 @@ public class EqualizerActivity extends AbsMusicServiceActivity implements
private void addPresets() {
mPresetsNamesAdapter.clear();
mPresetsNamesAdapter.add("Custom");
for (int j = 0; j < EqualizerHelper.getInstance().getEqualizer().getNumberOfPresets(); j++) {
for (int j = 0; j < EqualizerHelper.Companion.getInstance().getEqualizer().getNumberOfPresets(); j++) {
mPresetsNamesAdapter
.add(EqualizerHelper.getInstance().getEqualizer().getPresetName((short) j));
.add(EqualizerHelper.Companion.getInstance().getEqualizer().getPresetName((short) j));
mPresetsNamesAdapter.notifyDataSetChanged();
}
mPresets
.setSelection((int) EqualizerHelper.getInstance().getEqualizer().getCurrentPreset() + 1);
.setSelection((int) EqualizerHelper.Companion.getInstance().getEqualizer().getCurrentPreset() + 1);
}
private void setupUI() {
@ -167,7 +167,7 @@ public class EqualizerActivity extends AbsMusicServiceActivity implements
short bands;
try {
// get number of supported bands
bands = (short) EqualizerHelper.getInstance().getNumberOfBands();
bands = (short) EqualizerHelper.Companion.getInstance().getNumberOfBands();
// for each of the supported bands, we will set up a slider from -10dB to 10dB boost/attenuation,
// as well as text labels to assist the user
@ -177,26 +177,26 @@ public class EqualizerActivity extends AbsMusicServiceActivity implements
View view = LayoutInflater.from(this).inflate(R.layout.retro_seekbar, mLinearLayout, false);
TextView freqTextView = view.findViewById(R.id.hurtz);
freqTextView.setText(
String.format("%d Hz", EqualizerHelper.getInstance().getCenterFreq((int) band) / 1000));
String.format("%d Hz", EqualizerHelper.Companion.getInstance().getCenterFreq((int) band) / 1000));
TextView minDbTextView = view.findViewById(R.id.minus_db);
minDbTextView
.setText(String.format("%d dB", EqualizerHelper.getInstance().getBandLevelLow() / 100));
.setText(String.format("%d dB", EqualizerHelper.Companion.getInstance().getBandLevelLow() / 100));
TextView maxDbTextView = view.findViewById(R.id.plus_db);
maxDbTextView.setText(
String.format("%d dB", EqualizerHelper.getInstance().getBandLevelHigh() / 100));
String.format("%d dB", EqualizerHelper.Companion.getInstance().getBandLevelHigh() / 100));
SeekBar bar = view.findViewById(R.id.seekbar);
bar.setMax(EqualizerHelper.getInstance().getBandLevelHigh() - EqualizerHelper.getInstance()
bar.setMax(EqualizerHelper.Companion.getInstance().getBandLevelHigh() - EqualizerHelper.Companion.getInstance()
.getBandLevelLow());
bar.setProgress(
EqualizerHelper.getInstance().getBandLevel((int) band) - EqualizerHelper.getInstance()
EqualizerHelper.Companion.getInstance().getBandLevel((int) band) - EqualizerHelper.Companion.getInstance()
.getBandLevelLow());
bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
EqualizerHelper.getInstance().setBandLevel((int) band,
(int) (progress + EqualizerHelper.getInstance().getBandLevelLow()));
EqualizerHelper.Companion.getInstance().setBandLevel((int) band,
(int) (progress + EqualizerHelper.Companion.getInstance().getBandLevelLow()));
if (fromUser) {
mPresets.setSelection(0);
}
@ -221,7 +221,7 @@ public class EqualizerActivity extends AbsMusicServiceActivity implements
if (position == 0) {
return;
}
EqualizerHelper.getInstance().getEqualizer().usePreset((short) (position - 1));
EqualizerHelper.Companion.getInstance().getEqualizer().usePreset((short) (position - 1));
setupUI();
}

View file

@ -1 +1 @@
package code.name.monkey.retromusic.ui.activities; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import android.view.View; import butterknife.OnClick; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.RetroApplication; public class ErrorHandlerActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_error_handler); } @OnClick(R.id.clear_app_data) void clearAppDate(View view) { RetroApplication.deleteAppData(); } }
package code.name.monkey.retromusic.ui.activities; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import android.view.View; import butterknife.OnClick; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.RetroApplication; public class ErrorHandlerActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_error_handler); } @OnClick(R.id.clear_app_data) void clearAppDate(View view) { RetroApplication.Companion.deleteAppData(); } }

View file

@ -89,7 +89,7 @@ public class GenreDetailsActivity extends AbsSlidingMusicPanelActivity implement
genre = getIntent().getParcelableExtra(EXTRA_GENRE_ID);
presenter = new GenreDetailsPresenter(this, genre.id);
presenter = new GenreDetailsPresenter(this, genre.getId());
setUpToolBar();
setupRecyclerView();
@ -99,13 +99,13 @@ public class GenreDetailsActivity extends AbsSlidingMusicPanelActivity implement
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.action_shuffle:
MusicPlayerRemote.openAndShuffleQueue(songAdapter.getDataSet(), true);
MusicPlayerRemote.INSTANCE.openAndShuffleQueue(songAdapter.getDataSet(), true);
break;
}
}
private void setUpToolBar() {
title.setText(genre.name);
title.setText(genre.getName());
title.setTextColor(ThemeStore.textColorPrimary(this));
int primaryColor = ThemeStore.primaryColor(this);
@ -162,7 +162,7 @@ public class GenreDetailsActivity extends AbsSlidingMusicPanelActivity implement
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
return GenreMenuHelper.handleMenuClick(this, genre, item);
return GenreMenuHelper.INSTANCE.handleMenuClick(this, genre, item);
}
private void setupRecyclerView() {

View file

@ -1,86 +0,0 @@
package code.name.monkey.retromusic.ui.activities;
import android.os.Bundle;
import androidx.core.view.ViewCompat;
import android.view.WindowManager;
import com.bumptech.glide.Glide;
import com.r0adkll.slidr.Slidr;
import com.r0adkll.slidr.model.SlidrConfig;
import com.r0adkll.slidr.model.SlidrPosition;
import butterknife.ButterKnife;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget;
import code.name.monkey.retromusic.glide.SongGlideRequest;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.ui.activities.base.AbsMusicServiceActivity;
import code.name.monkey.retromusic.ui.fragments.player.lockscreen.LockScreenPlayerControlsFragment;
public class LockScreenActivity extends AbsMusicServiceActivity {
private LockScreenPlayerControlsFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
setDrawUnderStatusBar();
setContentView(R.layout.activity_lock_screen_old_style);
hideStatusBar();
setStatusbarColorAuto();
setNavigationbarColorAuto();
setTaskDescriptionColorAuto();
setLightNavigationBar(true);
SlidrConfig config = new SlidrConfig.Builder()
.position(SlidrPosition.BOTTOM)
.build();
Slidr.attach(this, config);
ButterKnife.bind(this);
mFragment = (LockScreenPlayerControlsFragment) getSupportFragmentManager().findFragmentById(R.id.playback_controls_fragment);
findViewById(R.id.slide).setTranslationY(100f);
findViewById(R.id.slide).setAlpha(0f);
ViewCompat.animate(findViewById(R.id.slide))
.translationY(0f)
.alpha(1f)
.setDuration(1500)
.start();
findViewById(R.id.root_layout).setBackgroundColor(ThemeStore.primaryColor(this));
}
@Override
public void onPlayingMetaChanged() {
super.onPlayingMetaChanged();
updateSongs();
}
@Override
public void onServiceConnected() {
super.onServiceConnected();
updateSongs();
}
private void updateSongs() {
Song song = MusicPlayerRemote.getCurrentSong();
SongGlideRequest.Builder.from(Glide.with(this), song)
.checkIgnoreMediaStore(this)
.generatePalette(this)
.build().into(new RetroMusicColoredTarget(findViewById(R.id.image)) {
@Override
public void onColorReady(int color) {
mFragment.setDark(color);
}
});
}
}

View file

@ -137,8 +137,8 @@ public class LyricsActivity extends AbsMusicServiceActivity implements
}
private void loadLRCLyrics() {
if (LyricUtil.isLrcFileExist(song.title, song.artistName)) {
showLyricsLocal(LyricUtil.getLocalLyricFile(song.title, song.artistName));
if (LyricUtil.isLrcFileExist(song.getTitle(), song.getArtistName())) {
showLyricsLocal(LyricUtil.getLocalLyricFile(song.getTitle(), song.getArtistName()));
}
}
@ -150,7 +150,7 @@ public class LyricsActivity extends AbsMusicServiceActivity implements
disposable = new CompositeDisposable();
lyricView
.setOnPlayerClickListener((progress, content) -> MusicPlayerRemote.seekTo((int) progress));
.setOnPlayerClickListener((progress, content) -> MusicPlayerRemote.INSTANCE.seekTo((int) progress));
//lyricView.setHighLightTextColor(ThemeStore.accentColor(this));
lyricView.setDefaultColor(ContextCompat.getColor(this, R.color.md_grey_400));
//lyricView.setTouchable(false);
@ -205,9 +205,9 @@ public class LyricsActivity extends AbsMusicServiceActivity implements
}
private void loadLrcFile() {
song = MusicPlayerRemote.getCurrentSong();
bottomAppBar.setTitle(song.title);
bottomAppBar.setSubtitle(song.artistName);
song = MusicPlayerRemote.INSTANCE.getCurrentSong();
bottomAppBar.setTitle(song.getTitle());
bottomAppBar.setSubtitle(song.getArtistName());
SongGlideRequest.Builder.from(Glide.with(this), song)
.checkIgnoreMediaStore(this)
.generatePalette(this)
@ -254,7 +254,7 @@ public class LyricsActivity extends AbsMusicServiceActivity implements
if (updateLyricsAsyncTask != null) {
updateLyricsAsyncTask.cancel(false);
}
final Song song = MusicPlayerRemote.getCurrentSong();
final Song song = MusicPlayerRemote.INSTANCE.getCurrentSong();
updateLyricsAsyncTask = new AsyncTask<Void, Void, Lyrics>() {
@Override
protected Lyrics doInBackground(Void... params) {
@ -292,7 +292,7 @@ public class LyricsActivity extends AbsMusicServiceActivity implements
private void showSyncedLyrics() {
String content = "";
try {
content = LyricUtil.getStringFromFile(song.title, song.artistName);
content = LyricUtil.getStringFromFile(song.getTitle(), song.getArtistName());
} catch (Exception e) {
e.printStackTrace();
}
@ -302,21 +302,21 @@ public class LyricsActivity extends AbsMusicServiceActivity implements
.content("Add time frame lyrics")
.negativeText("Delete")
.onNegative((dialog, which) -> {
LyricUtil.deleteLrcFile(song.title, song.artistName);
LyricUtil.deleteLrcFile(song.getTitle(), song.getArtistName());
loadLrcFile();
})
.onNeutral(
(dialog, which) -> RetroUtil.openUrl(LyricsActivity.this, getGoogleSearchLrcUrl()))
.inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE)
.input("Paste lyrics here", content, (dialog, input) -> {
LyricUtil.writeLrcToLoc(song.title, song.artistName, input.toString());
LyricUtil.writeLrcToLoc(song.getTitle(), song.getArtistName(), input.toString());
loadLrcFile();
}).show();
}
private String getGoogleSearchLrcUrl() {
String baseUrl = "http://www.google.com/search?";
String query = song.title + "+" + song.artistName;
String query = song.getTitle() + "+" + song.getArtistName();
query = "q=" + query.replace(" ", "+") + " .lrc";
baseUrl += query;
return baseUrl;
@ -335,7 +335,7 @@ public class LyricsActivity extends AbsMusicServiceActivity implements
.onNeutral(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
RetroUtil.openUrl(LyricsActivity.this, getGoogleSearchUrl(song.title, song.artistName));
RetroUtil.openUrl(LyricsActivity.this, getGoogleSearchUrl(song.getTitle(), song.getArtistName()));
}
})
.inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE)
@ -353,7 +353,7 @@ public class LyricsActivity extends AbsMusicServiceActivity implements
private ArrayList<String> getSongPaths(Song song) {
ArrayList<String> paths = new ArrayList<>(1);
paths.add(song.data);
paths.add(song.getData());
return paths;
}

View file

@ -1,341 +0,0 @@
package code.name.monkey.retromusic.ui.activities;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import butterknife.BindView;
import butterknife.ButterKnife;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.RetroApplication;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.helper.SearchQueryHelper;
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks;
import code.name.monkey.retromusic.loaders.AlbumLoader;
import code.name.monkey.retromusic.loaders.ArtistLoader;
import code.name.monkey.retromusic.loaders.PlaylistSongsLoader;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.service.MusicService;
import code.name.monkey.retromusic.ui.activities.base.AbsSlidingMusicPanelActivity;
import code.name.monkey.retromusic.ui.fragments.mainactivity.LibraryFragment;
import code.name.monkey.retromusic.ui.fragments.mainactivity.home.BannerHomeFragment;
import code.name.monkey.retromusic.util.PreferenceUtil;
import io.reactivex.disposables.CompositeDisposable;
public class MainActivity extends AbsSlidingMusicPanelActivity implements SharedPreferences.OnSharedPreferenceChangeListener, BottomNavigationView.OnNavigationItemSelectedListener {
public static final int APP_INTRO_REQUEST = 2323;
public static final int LIBRARY = 1;
public static final int FOLDERS = 3;
public static final int HOME = 0;
private static final String TAG = "MainActivity";
private static final int APP_USER_INFO_REQUEST = 9003;
private static final int REQUEST_CODE_THEME = 9002;
@Nullable
MainActivityFragmentCallbacks currentFragment;
@BindView(R.id.parent_container)
FrameLayout drawerLayout;
private boolean blockRequestPermissions;
private CompositeDisposable disposable = new CompositeDisposable();
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action != null && action.equals(Intent.ACTION_SCREEN_OFF)) {
if (PreferenceUtil.getInstance().getLockScreen() && MusicPlayerRemote.isPlaying()) {
Intent activity = new Intent(context, LockScreenActivity.class);
activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
ActivityCompat.startActivity(context, activity, null);
}
}
}
};
@Override
protected View createContentView() {
@SuppressLint("InflateParams")
View contentView = getLayoutInflater().inflate(R.layout.activity_main_drawer_layout, null);
ViewGroup drawerContent = contentView.findViewById(R.id.drawer_content_container);
drawerContent.addView(wrapSlidingMusicPanel(R.layout.activity_main_content));
return contentView;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
setDrawUnderStatusBar();
super.onCreate(savedInstanceState);
ButterKnife.bind(this);
getBottomNavigationView().setOnNavigationItemSelectedListener(this);
if (savedInstanceState == null) {
selectedFragment(PreferenceUtil.getInstance().getLastPage());
} else {
restoreCurrentFragment();
}
checkShowChangelog();
if (!RetroApplication.isProVersion() && !PreferenceManager.getDefaultSharedPreferences(this).getBoolean("shown", false)) {
showPromotionalOffer();
}
}
private void checkShowChangelog() {
try {
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
int currentVersion = pInfo.versionCode;
if (currentVersion != PreferenceUtil.getInstance().getLastChangelogVersion()) {
startActivity(new Intent(this, WhatsNewActivity.class));
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
IntentFilter screenOnOff = new IntentFilter();
screenOnOff.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(broadcastReceiver, screenOnOff);
PreferenceUtil.getInstance().registerOnSharedPreferenceChangedListener(this);
if (getIntent().hasExtra("expand")) {
if (getIntent().getBooleanExtra("expand", false)) {
//expandPanel();
getIntent().putExtra("expand", false);
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
disposable.clear();
if (broadcastReceiver == null) {
return;
}
unregisterReceiver(broadcastReceiver);
PreferenceUtil.getInstance().unregisterOnSharedPreferenceChangedListener(this);
}
public void setCurrentFragment(@NonNull Fragment fragment, boolean isStackAdd, String tag) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment, tag);
if (isStackAdd) {
fragmentTransaction.addToBackStack(tag);
}
fragmentTransaction.commit();
currentFragment = (MainActivityFragmentCallbacks) fragment;
}
private void restoreCurrentFragment() {
currentFragment = (MainActivityFragmentCallbacks) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
}
private void handlePlaybackIntent(@Nullable Intent intent) {
if (intent == null) {
return;
}
Uri uri = intent.getData();
String mimeType = intent.getType();
boolean handled = false;
if (intent.getAction() != null && intent.getAction().equals(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH)) {
final ArrayList<Song> songs = SearchQueryHelper.getSongs(this, intent.getExtras());
if (MusicPlayerRemote.getShuffleMode() == MusicService.SHUFFLE_MODE_SHUFFLE) {
MusicPlayerRemote.openAndShuffleQueue(songs, true);
} else {
MusicPlayerRemote.openQueue(songs, 0, true);
}
handled = true;
}
if (uri != null && uri.toString().length() > 0) {
MusicPlayerRemote.playFromUri(uri);
handled = true;
} else if (MediaStore.Audio.Playlists.CONTENT_TYPE.equals(mimeType)) {
final int id = (int) parseIdFromIntent(intent, "playlistId", "playlist");
if (id >= 0) {
int position = intent.getIntExtra("position", 0);
ArrayList<Song> songs = new ArrayList<>(
PlaylistSongsLoader.getPlaylistSongList(this, id).blockingFirst());
MusicPlayerRemote.openQueue(songs, position, true);
handled = true;
}
} else if (MediaStore.Audio.Albums.CONTENT_TYPE.equals(mimeType)) {
final int id = (int) parseIdFromIntent(intent, "albumId", "album");
if (id >= 0) {
int position = intent.getIntExtra("position", 0);
MusicPlayerRemote
.openQueue(AlbumLoader.getAlbum(this, id).blockingFirst().songs, position, true);
handled = true;
}
} else if (MediaStore.Audio.Artists.CONTENT_TYPE.equals(mimeType)) {
final int id = (int) parseIdFromIntent(intent, "artistId", "artist");
if (id >= 0) {
int position = intent.getIntExtra("position", 0);
MusicPlayerRemote
.openQueue(ArtistLoader.getArtist(this, id).blockingFirst().getSongs(), position, true);
handled = true;
}
}
if (handled) {
setIntent(new Intent());
}
}
private long parseIdFromIntent(@NonNull Intent intent, String longKey, String stringKey) {
long id = intent.getLongExtra(longKey, -1);
if (id < 0) {
String idString = intent.getStringExtra(stringKey);
if (idString != null) {
try {
id = Long.parseLong(idString);
} catch (NumberFormatException e) {
Log.e(TAG, e.getMessage());
}
}
}
return id;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case APP_INTRO_REQUEST:
blockRequestPermissions = false;
if (!hasPermissions()) {
requestPermissions();
}
break;
case REQUEST_CODE_THEME:
case APP_USER_INFO_REQUEST:
postRecreate();
break;
}
}
@Override
public boolean handleBackPress() {
return super.handleBackPress() || (currentFragment != null &&
currentFragment.handleBackPress());
}
@Override
public void onServiceConnected() {
super.onServiceConnected();
handlePlaybackIntent(getIntent());
}
@Override
protected void requestPermissions() {
if (!blockRequestPermissions) {
super.requestPermissions();
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(PreferenceUtil.GENERAL_THEME) ||
key.equals(PreferenceUtil.ADAPTIVE_COLOR_APP) ||
key.equals(PreferenceUtil.DOMINANT_COLOR) ||
key.equals(PreferenceUtil.USER_NAME) ||
key.equals(PreferenceUtil.TOGGLE_FULL_SCREEN) ||
key.equals(PreferenceUtil.TOGGLE_VOLUME) ||
key.equals(PreferenceUtil.ROUND_CORNERS) ||
key.equals(PreferenceUtil.CAROUSEL_EFFECT) ||
key.equals(PreferenceUtil.NOW_PLAYING_SCREEN_ID) ||
key.equals(PreferenceUtil.TOGGLE_GENRE) ||
key.equals(PreferenceUtil.BANNER_IMAGE_PATH) ||
key.equals(PreferenceUtil.PROFILE_IMAGE_PATH) ||
key.equals(PreferenceUtil.CIRCULAR_ALBUM_ART) ||
key.equals(PreferenceUtil.KEEP_SCREEN_ON) ||
key.equals(PreferenceUtil.TOGGLE_SEPARATE_LINE) ||
key.equals(PreferenceUtil.ALBUM_GRID_STYLE) ||
key.equals(PreferenceUtil.ARTIST_GRID_STYLE) ||
key.equals(PreferenceUtil.TOGGLE_HOME_BANNER) ||
key.equals(PreferenceUtil.TOGGLE_ADD_CONTROLS) ||
key.equals(PreferenceUtil.ALBUM_COVER_STYLE) ||
key.equals(PreferenceUtil.HOME_ARTIST_GRID_STYLE) ||
key.equals(PreferenceUtil.ALBUM_COVER_TRANSFORM) ||
key.equals(PreferenceUtil.TAB_TEXT_MODE)) postRecreate();
}
private void showPromotionalOffer() {
new MaterialDialog.Builder(this)
.positiveText("Buy")
.onPositive((dialog, which) ->
startActivity(new Intent(MainActivity.this, ProVersionActivity.class)))
.negativeText(android.R.string.cancel)
.customView(R.layout.dialog_promotional_offer, false)
.dismissListener(dialog -> {
PreferenceManager.getDefaultSharedPreferences(MainActivity.this)
.edit()
.putBoolean("shown", true)
.apply();
})
.show();
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
PreferenceUtil.getInstance().setLastPage(menuItem.getItemId());
selectedFragment(menuItem.getItemId());
return true;
}
private void selectedFragment(int itemId) {
switch (itemId) {
case R.id.action_album:
case R.id.action_artist:
case R.id.action_playlist:
case R.id.action_song:
setCurrentFragment(LibraryFragment.newInstance(itemId), false, LibraryFragment.TAG);
break;
case R.id.action_home:
setCurrentFragment(BannerHomeFragment.newInstance(), false, BannerHomeFragment.TAG);
break;
}
}
}

View file

@ -0,0 +1,294 @@
package code.name.monkey.retromusic.ui.activities
import android.annotation.SuppressLint
import android.content.*
import android.content.pm.PackageManager
import android.os.Bundle
import android.preference.PreferenceManager
import android.provider.MediaStore
import android.util.Log
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import butterknife.ButterKnife
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.RetroApplication
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SearchQueryHelper
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
import code.name.monkey.retromusic.loaders.AlbumLoader
import code.name.monkey.retromusic.loaders.ArtistLoader
import code.name.monkey.retromusic.loaders.PlaylistSongsLoader
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.ui.activities.base.AbsSlidingMusicPanelActivity
import code.name.monkey.retromusic.ui.fragments.mainactivity.LibraryFragment
import code.name.monkey.retromusic.ui.fragments.mainactivity.home.BannerHomeFragment
import code.name.monkey.retromusic.util.PreferenceUtil
import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.bottomnavigation.BottomNavigationView
import io.reactivex.disposables.CompositeDisposable
import java.util.*
class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedPreferenceChangeListener, BottomNavigationView.OnNavigationItemSelectedListener {
lateinit var currentFragment: MainActivityFragmentCallbacks
private var blockRequestPermissions: Boolean = false
private val disposable = CompositeDisposable()
private val broadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action
if (action != null && action == Intent.ACTION_SCREEN_OFF) {
if (PreferenceUtil.getInstance().lockScreen && MusicPlayerRemote.isPlaying) {
/*Intent activity = new Intent(context, LockScreenActivity.class);
activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
ActivityCompat.startActivity(context, activity, null);*/
}
}
}
}
override fun createContentView(): View {
@SuppressLint("InflateParams")
val contentView = layoutInflater.inflate(R.layout.activity_main_drawer_layout, null)
val drawerContent = contentView.findViewById<ViewGroup>(R.id.drawer_content_container)
drawerContent.addView(wrapSlidingMusicPanel(R.layout.activity_main_content))
return contentView
}
override fun onCreate(savedInstanceState: Bundle?) {
setDrawUnderStatusBar()
super.onCreate(savedInstanceState)
ButterKnife.bind(this)
getBottomNavigationView()!!.setOnNavigationItemSelectedListener(this)
if (savedInstanceState == null) {
selectedFragment(PreferenceUtil.getInstance().lastPage)
} else {
restoreCurrentFragment()
}
checkShowChangelog()
if (!RetroApplication.isProVersion && !PreferenceManager.getDefaultSharedPreferences(this).getBoolean("shown", false)) {
showPromotionalOffer()
}
}
private fun checkShowChangelog() {
try {
val pInfo = packageManager.getPackageInfo(packageName, 0)
val currentVersion = pInfo.versionCode
if (currentVersion != PreferenceUtil.getInstance().lastChangelogVersion) {
startActivityForResult(Intent(this, WhatsNewActivity::class.java), APP_INTRO_REQUEST)
}
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
}
override fun onResume() {
super.onResume()
val screenOnOff = IntentFilter()
screenOnOff.addAction(Intent.ACTION_SCREEN_OFF)
registerReceiver(broadcastReceiver, screenOnOff)
PreferenceUtil.getInstance().registerOnSharedPreferenceChangedListener(this)
if (intent.hasExtra("expand")) {
if (intent.getBooleanExtra("expand", false)) {
//expandPanel();
intent.putExtra("expand", false)
}
}
}
override fun onDestroy() {
super.onDestroy()
disposable.clear()
unregisterReceiver(broadcastReceiver)
PreferenceUtil.getInstance().unregisterOnSharedPreferenceChangedListener(this)
}
fun setCurrentFragment(fragment: Fragment, isStackAdd: Boolean, tag: String) {
val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.fragment_container, fragment, tag)
if (isStackAdd) {
fragmentTransaction.addToBackStack(tag)
}
fragmentTransaction.commit()
currentFragment = fragment as MainActivityFragmentCallbacks
}
private fun restoreCurrentFragment() {
currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as MainActivityFragmentCallbacks
}
private fun handlePlaybackIntent(intent: Intent?) {
if (intent == null) {
return
}
val uri = intent.data
val mimeType = intent.type
var handled = false
if (intent.action != null && intent.action == MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) {
val songs = SearchQueryHelper.getSongs(this, intent.extras!!)
if (MusicPlayerRemote.shuffleMode == MusicService.SHUFFLE_MODE_SHUFFLE) {
MusicPlayerRemote.openAndShuffleQueue(songs, true)
} else {
MusicPlayerRemote.openQueue(songs, 0, true)
}
handled = true
}
if (uri != null && uri.toString().length > 0) {
MusicPlayerRemote.playFromUri(uri)
handled = true
} else if (MediaStore.Audio.Playlists.CONTENT_TYPE == mimeType) {
val id = parseIdFromIntent(intent, "playlistId", "playlist").toInt()
if (id >= 0) {
val position = intent.getIntExtra("position", 0)
val songs = ArrayList(
PlaylistSongsLoader.getPlaylistSongList(this, id).blockingFirst())
MusicPlayerRemote.openQueue(songs, position, true)
handled = true
}
} else if (MediaStore.Audio.Albums.CONTENT_TYPE == mimeType) {
val id = parseIdFromIntent(intent, "albumId", "album").toInt()
if (id >= 0) {
val position = intent.getIntExtra("position", 0)
MusicPlayerRemote
.openQueue(AlbumLoader.getAlbum(this, id).blockingFirst().songs!!, position, true)
handled = true
}
} else if (MediaStore.Audio.Artists.CONTENT_TYPE == mimeType) {
val id = parseIdFromIntent(intent, "artistId", "artist").toInt()
if (id >= 0) {
val position = intent.getIntExtra("position", 0)
MusicPlayerRemote
.openQueue(ArtistLoader.getArtist(this, id).blockingFirst().songs, position, true)
handled = true
}
}
if (handled) {
setIntent(Intent())
}
}
private fun parseIdFromIntent(intent: Intent, longKey: String, stringKey: String): Long {
var id = intent.getLongExtra(longKey, -1)
if (id < 0) {
val idString = intent.getStringExtra(stringKey)
if (idString != null) {
try {
id = java.lang.Long.parseLong(idString)
} catch (e: NumberFormatException) {
Log.e(TAG, e.message)
}
}
}
return id
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
APP_INTRO_REQUEST -> {
blockRequestPermissions = false
if (!hasPermissions()) {
requestPermissions()
}
}
REQUEST_CODE_THEME, APP_USER_INFO_REQUEST -> postRecreate()
}
}
override fun handleBackPress(): Boolean {
return super.handleBackPress() || currentFragment.handleBackPress()
}
override fun onServiceConnected() {
super.onServiceConnected()
handlePlaybackIntent(intent)
}
override fun requestPermissions() {
if (!blockRequestPermissions) {
super.requestPermissions()
}
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
if (key == PreferenceUtil.GENERAL_THEME ||
key == PreferenceUtil.ADAPTIVE_COLOR_APP ||
key == PreferenceUtil.DOMINANT_COLOR ||
key == PreferenceUtil.USER_NAME ||
key == PreferenceUtil.TOGGLE_FULL_SCREEN ||
key == PreferenceUtil.TOGGLE_VOLUME ||
key == PreferenceUtil.ROUND_CORNERS ||
key == PreferenceUtil.CAROUSEL_EFFECT ||
key == PreferenceUtil.NOW_PLAYING_SCREEN_ID ||
key == PreferenceUtil.TOGGLE_GENRE ||
key == PreferenceUtil.BANNER_IMAGE_PATH ||
key == PreferenceUtil.PROFILE_IMAGE_PATH ||
key == PreferenceUtil.CIRCULAR_ALBUM_ART ||
key == PreferenceUtil.KEEP_SCREEN_ON ||
key == PreferenceUtil.TOGGLE_SEPARATE_LINE ||
key == PreferenceUtil.ALBUM_GRID_STYLE ||
key == PreferenceUtil.ARTIST_GRID_STYLE ||
key == PreferenceUtil.TOGGLE_HOME_BANNER ||
key == PreferenceUtil.TOGGLE_ADD_CONTROLS ||
key == PreferenceUtil.ALBUM_COVER_STYLE ||
key == PreferenceUtil.HOME_ARTIST_GRID_STYLE ||
key == PreferenceUtil.ALBUM_COVER_TRANSFORM ||
key == PreferenceUtil.TAB_TEXT_MODE)
postRecreate()
}
private fun showPromotionalOffer() {
MaterialDialog.Builder(this)
.positiveText("Buy")
.onPositive { dialog, which -> startActivity(Intent(this@MainActivity, ProVersionActivity::class.java)) }
.negativeText(android.R.string.cancel)
.customView(R.layout.dialog_promotional_offer, false)
.dismissListener { dialog ->
PreferenceManager.getDefaultSharedPreferences(this@MainActivity)
.edit()
.putBoolean("shown", true)
.apply()
}
.show()
}
override fun onNavigationItemSelected(menuItem: MenuItem): Boolean {
PreferenceUtil.getInstance().lastPage = menuItem.itemId
selectedFragment(menuItem.itemId)
return true
}
private fun selectedFragment(itemId: Int) {
when (itemId) {
R.id.action_album, R.id.action_artist, R.id.action_playlist, R.id.action_song -> setCurrentFragment(LibraryFragment.newInstance(itemId), false, LibraryFragment.TAG)
R.id.action_home -> setCurrentFragment(BannerHomeFragment.newInstance(), false, BannerHomeFragment.TAG)
}
}
companion object {
const val APP_INTRO_REQUEST = 2323
const val LIBRARY = 1
const val FOLDERS = 3
const val HOME = 0
private const val TAG = "MainActivity"
private const val APP_USER_INFO_REQUEST = 9003
private const val REQUEST_CODE_THEME = 9002
}
}

View file

@ -1,180 +0,0 @@
package code.name.monkey.retromusic.ui.activities;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.transition.Slide;
import android.view.Gravity;
import android.view.animation.AnimationUtils;
import androidx.fragment.app.Fragment;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.ui.activities.base.AbsMusicServiceActivity;
import code.name.monkey.retromusic.ui.fragments.NowPlayingScreen;
import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.adaptive.AdaptiveFragment;
import code.name.monkey.retromusic.ui.fragments.player.blur.BlurPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.card.CardFragment;
import code.name.monkey.retromusic.ui.fragments.player.cardblur.CardBlurFragment;
import code.name.monkey.retromusic.ui.fragments.player.color.ColorFragment;
import code.name.monkey.retromusic.ui.fragments.player.fit.FitFragment;
import code.name.monkey.retromusic.ui.fragments.player.flat.FlatPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.full.FullPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.hmm.HmmPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.material.MaterialFragment;
import code.name.monkey.retromusic.ui.fragments.player.normal.PlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.plain.PlainPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.simple.SimplePlayerFragment;
import code.name.monkey.retromusic.util.PreferenceUtil;
public class NowPayingActivity extends AbsMusicServiceActivity implements AbsPlayerFragment.Callbacks, SharedPreferences.OnSharedPreferenceChangeListener {
private NowPlayingScreen currentNowPlayingScreen;
private AbsPlayerFragment playerFragment;
void setupWindowTransition() {
Slide slide = new Slide(Gravity.BOTTOM);
slide.setInterpolator(
AnimationUtils.loadInterpolator(this, android.R.interpolator.linear_out_slow_in));
getWindow().setEnterTransition(slide);
//getWindow().setExitTransition(slide);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
setLightNavigationBar(true);
setDrawUnderNavigationBar();
setupWindowTransition();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_now_playng);
chooseFragmentForTheme();
}
private boolean isOneOfTheseThemes() {
return currentNowPlayingScreen == NowPlayingScreen.FLAT
|| currentNowPlayingScreen == NowPlayingScreen.PLAIN
|| currentNowPlayingScreen == NowPlayingScreen.SIMPLE
|| currentNowPlayingScreen == NowPlayingScreen.NORMAL
|| currentNowPlayingScreen == NowPlayingScreen.ADAPTIVE
|| currentNowPlayingScreen == NowPlayingScreen.TINY
|| currentNowPlayingScreen == NowPlayingScreen.MATERIAL;
}
@Override
public void onPaletteColorChanged() {
int paletteColor = playerFragment.getPaletteColor();
boolean isColorLight = ColorUtil.isColorLight(paletteColor);
super.setTaskDescriptionColor(paletteColor);
if ((currentNowPlayingScreen == NowPlayingScreen.FLAT || currentNowPlayingScreen == NowPlayingScreen.NORMAL) && PreferenceUtil.getInstance().getAdaptiveColor()) {
setLightNavigationBar(ColorUtil.isColorLight(ThemeStore.primaryColor(this)));
setLightStatusbar(isColorLight);
} else if (currentNowPlayingScreen == NowPlayingScreen.COLOR) {
setLightStatusbar(isColorLight);
setLightNavigationBar(isColorLight);
setNavigationbarColor(paletteColor);
} else if (currentNowPlayingScreen == NowPlayingScreen.BLUR || currentNowPlayingScreen == NowPlayingScreen.BLUR_CARD) {
setLightStatusbar(false);
setLightNavigationBar(false);
} else if (currentNowPlayingScreen == NowPlayingScreen.CARD || currentNowPlayingScreen == NowPlayingScreen.FULL) {
setLightStatusbar(false);
setLightNavigationBar(false);
} else if (currentNowPlayingScreen == NowPlayingScreen.FIT) {
setNavigationbarColor(ThemeStore.primaryColor(this));
setLightNavigationBar(ColorUtil.isColorLight(ThemeStore.primaryColor(this)));
setLightStatusbar(false);
} else {
boolean isTheme = isOneOfTheseThemes() && ColorUtil.isColorLight(ThemeStore.primaryColor(this));
setStatusbarColor(Color.TRANSPARENT);
setLightStatusbar(isTheme);
setLightNavigationBar(isTheme);
}
}
@Override
protected void onResume() {
super.onResume();
if (currentNowPlayingScreen != PreferenceUtil.getInstance().getNowPlayingScreen()) {
postRecreate();
}
PreferenceUtil.getInstance().registerOnSharedPreferenceChangedListener(this);
}
@Override
protected void onPause() {
super.onPause();
PreferenceUtil.getInstance().unregisterOnSharedPreferenceChangedListener(this);
}
@Override
public void onQueueChanged() {
super.onQueueChanged();
if (MusicPlayerRemote.getPlayingQueue().isEmpty()) {
finish();
}
}
private void chooseFragmentForTheme() {
currentNowPlayingScreen = PreferenceUtil.getInstance().getNowPlayingScreen();
Fragment fragment; // must implement AbsPlayerFragment
switch (currentNowPlayingScreen) {
case MATERIAL:
fragment = new MaterialFragment();
break;
case FIT:
fragment = new FitFragment();
break;
case BLUR:
fragment = new BlurPlayerFragment();
break;
case FLAT:
fragment = new FlatPlayerFragment();
break;
case PLAIN:
fragment = new PlainPlayerFragment();
break;
case FULL:
fragment = new FullPlayerFragment();
break;
case COLOR:
fragment = new ColorFragment();
break;
case CARD:
fragment = new CardFragment();
break;
case SIMPLE:
fragment = new SimplePlayerFragment();
break;
case TINY:
fragment = new HmmPlayerFragment();
break;
case BLUR_CARD:
fragment = new CardBlurFragment();
break;
case ADAPTIVE:
fragment = new AdaptiveFragment();
break;
case NORMAL:
default:
fragment = new PlayerFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.player_fragment_container, fragment).commit();
getSupportFragmentManager().executePendingTransactions();
playerFragment = (AbsPlayerFragment) getSupportFragmentManager()
.findFragmentById(R.id.player_fragment_container);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(PreferenceUtil.ALBUM_COVER_STYLE) || key.equals(PreferenceUtil.ALBUM_COVER_TRANSFORM)) {
recreate();
}
}
}

View file

@ -81,8 +81,8 @@ public class PlayingQueueActivity extends AbsMusicServiceActivity {
mPlayingQueueAdapter = new PlayingQueueAdapter(
this,
MusicPlayerRemote.getPlayingQueue(),
MusicPlayerRemote.getPosition(),
MusicPlayerRemote.INSTANCE.getPlayingQueue(),
MusicPlayerRemote.INSTANCE.getPosition(),
R.layout.item_queue);
mWrappedAdapter = mRecyclerViewDragDropManager.createWrappedAdapter(mPlayingQueueAdapter);
@ -92,7 +92,7 @@ public class PlayingQueueActivity extends AbsMusicServiceActivity {
mRecyclerView.setAdapter(mWrappedAdapter);
mRecyclerView.setItemAnimator(animator);
mRecyclerViewDragDropManager.attachRecyclerView(mRecyclerView);
mLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.getPosition() + 1, 0);
mLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.INSTANCE.getPosition() + 1, 0);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
@ -109,7 +109,7 @@ public class PlayingQueueActivity extends AbsMusicServiceActivity {
@Override
public void onQueueChanged() {
if (MusicPlayerRemote.getPlayingQueue().isEmpty()) {
if (MusicPlayerRemote.INSTANCE.getPlayingQueue().isEmpty()) {
finish();
return;
}
@ -133,18 +133,18 @@ public class PlayingQueueActivity extends AbsMusicServiceActivity {
}
private void updateQueuePosition() {
mPlayingQueueAdapter.setCurrent(MusicPlayerRemote.getPosition());
mPlayingQueueAdapter.setCurrent(MusicPlayerRemote.INSTANCE.getPosition());
resetToCurrentPosition();
}
private void updateQueue() {
mPlayingQueueAdapter.swapDataSet(MusicPlayerRemote.getPlayingQueue(), MusicPlayerRemote.getPosition());
mPlayingQueueAdapter.swapDataSet(MusicPlayerRemote.INSTANCE.getPlayingQueue(), MusicPlayerRemote.INSTANCE.getPosition());
resetToCurrentPosition();
}
private void resetToCurrentPosition() {
mRecyclerView.stopScroll();
mLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.getPosition() + 1, 0);
mLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.INSTANCE.getPosition() + 1, 0);
}
@Override
@ -178,7 +178,7 @@ public class PlayingQueueActivity extends AbsMusicServiceActivity {
}
protected String getUpNextAndQueueTime() {
return getResources().getString(R.string.up_next) + "" + MusicUtil.getReadableDurationString(MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.getPosition()));
return getResources().getString(R.string.up_next) + "" + MusicUtil.getReadableDurationString(MusicPlayerRemote.INSTANCE.getQueueDurationMillis(MusicPlayerRemote.INSTANCE.getPosition()));
}
private void setupToolbar() {
@ -198,6 +198,6 @@ public class PlayingQueueActivity extends AbsMusicServiceActivity {
@OnClick(R.id.clear_queue)
void clearQueue() {
MusicPlayerRemote.clearQueue();
MusicPlayerRemote.INSTANCE.clearQueue();
}
}

View file

@ -32,7 +32,6 @@ import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.loaders.PlaylistLoader;
import code.name.monkey.retromusic.model.AbsCustomPlaylist;
import code.name.monkey.retromusic.model.Playlist;
import code.name.monkey.retromusic.model.PlaylistSong;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.mvp.contract.PlaylistSongsContract;
import code.name.monkey.retromusic.mvp.presenter.PlaylistSongsPresenter;
@ -114,10 +113,9 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
} else {
recyclerViewDragDropManager = new RecyclerViewDragDropManager();
final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator();
adapter = new OrderablePlaylistSongAdapter(this, new ArrayList<PlaylistSong>(),
adapter = new OrderablePlaylistSongAdapter(this, new ArrayList<>(),
R.layout.item_list, false, this, (fromPosition, toPosition) -> {
if (PlaylistsUtil
.moveItem(PlaylistDetailActivity.this, playlist.id, fromPosition, toPosition)) {
if (PlaylistsUtil.moveItem(PlaylistDetailActivity.this, playlist.id, fromPosition, toPosition)) {
Song song = adapter.getDataSet().remove(fromPosition);
adapter.getDataSet().add(toPosition, song);
adapter.notifyItemMoved(fromPosition, toPosition);
@ -186,7 +184,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
onBackPressed();
return true;
}
return PlaylistMenuHelper.handleMenuClick(this, playlist, item);
return PlaylistMenuHelper.INSTANCE.handleMenuClick(this, playlist, item);
}
@NonNull
@ -228,7 +226,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
// Playlist renamed
final String playlistName = PlaylistsUtil.getNameForPlaylist(this, playlist.id);
if (!playlistName.equals(playlist.name)) {
playlist = PlaylistLoader.getPlaylist(this, playlist.id).blockingFirst();
playlist = PlaylistLoader.INSTANCE.getPlaylist(this, playlist.id).blockingFirst();
setToolbarTitle(playlist.name);
}
}
@ -306,6 +304,6 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
if (adapter.getDataSet().isEmpty()) {
return;
}
MusicPlayerRemote.openAndShuffleQueue(adapter.getDataSet(), true);
MusicPlayerRemote.INSTANCE.openAndShuffleQueue(adapter.getDataSet(), true);
}
}

View file

@ -119,7 +119,7 @@ public class ProVersionActivity extends AbsBaseActivity implements
@Override
public void onPurchaseHistoryRestored() {
if (RetroApplication.isProVersion()) {
if (RetroApplication.Companion.isProVersion()) {
Toast.makeText(this, R.string.restored_previous_purchase_please_restart, Toast.LENGTH_LONG)
.show();
setResult(RESULT_OK);

View file

@ -1,7 +1,6 @@
package code.name.monkey.retromusic.ui.activities;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
@ -26,7 +25,6 @@ import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager;
import code.name.monkey.retromusic.ui.activities.base.AbsBaseActivity;
import code.name.monkey.retromusic.ui.fragments.settings.MainSettingsFragment;
import code.name.monkey.retromusic.util.PreferenceUtil;
@ -65,9 +63,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
break;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
new DynamicShortcutManager(this).updateDynamicShortcuts();
}
recreate();
}

View file

@ -115,7 +115,7 @@ public class SupportDevelopmentActivity extends AbsBaseActivity implements Billi
@OnClick(R.id.donate)
void donate() {
RetroUtil.openUrl(this, PAYPAL_ME_URL);
RetroUtil.openUrl(this,PAYPAL_ME_URL);
}
@Override

View file

@ -1,98 +0,0 @@
package code.name.monkey.retromusic.ui.activities;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.webkit.WebView;
import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.google.android.material.appbar.AppBarLayout;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import butterknife.BindView;
import butterknife.ButterKnife;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.ui.activities.base.AbsBaseActivity;
import code.name.monkey.retromusic.util.PreferenceUtil;
public class WhatsNewActivity extends AbsBaseActivity {
@BindView(R.id.web_view)
WebView webView;
@BindView(R.id.title)
TextView title;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.app_bar)
AppBarLayout appBarLayout;
private static void setChangelogRead(@NonNull Context context) {
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
int currentVersion = pInfo.versionCode;
PreferenceUtil.getInstance().setLastChangeLogVersion(currentVersion);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
private static String colorToHex(int color) {
return Integer.toHexString(color).substring(2);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_whats_new);
ButterKnife.bind(this);
setStatusbarColorAuto();
setNavigationbarColorAuto();
setTaskDescriptionColorAuto();
toolbar.setBackgroundColor(ThemeStore.primaryColor(this));
appBarLayout.setBackgroundColor(ThemeStore.primaryColor(this));
setSupportActionBar(toolbar);
setTitle(null);
toolbar.setNavigationOnClickListener(v -> onBackPressed());
title.setTextColor(ThemeStore.textColorPrimary(this));
ToolbarContentTintHelper.colorBackButton(toolbar, ThemeStore.accentColor(this));
try {
// Load from phonograph-changelog.html in the assets folder
StringBuilder buf = new StringBuilder();
InputStream json = getAssets().open("retro-changelog.html");
BufferedReader in = new BufferedReader(new InputStreamReader(json, "UTF-8"));
String str;
while ((str = in.readLine()) != null)
buf.append(str);
in.close();
// Inject color values for WebView body background and links
final String backgroundColor = colorToHex(ThemeStore.primaryColor(this));
final String contentColor = ThemeSingleton.get().darkTheme ? "#ffffff" : "#000000";
webView.loadData(buf.toString()
.replace("{style-placeholder}",
String.format("body { background-color: %s; color: %s; }", backgroundColor, contentColor))
.replace("{link-color}", colorToHex(ThemeSingleton.get().positiveColor.getDefaultColor()))
.replace("{link-color-active}", colorToHex(ColorUtil.lightenColor(ThemeSingleton.get().positiveColor.getDefaultColor())))
, "text/html", "UTF-8");
} catch (Throwable e) {
webView.loadData("<h1>Unable to load</h1><p>" + e.getLocalizedMessage() + "</p>", "text/html", "UTF-8");
}
setChangelogRead(this);
}
}

View file

@ -0,0 +1,75 @@
package code.name.monkey.retromusic.ui.activities
import android.content.Context
import android.content.pm.PackageManager
import android.os.Bundle
import butterknife.ButterKnife
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.ui.activities.base.AbsBaseActivity
import code.name.monkey.retromusic.util.PreferenceUtil
import com.afollestad.materialdialogs.internal.ThemeSingleton
import kotlinx.android.synthetic.main.activity_whats_new.*
import java.io.BufferedReader
import java.io.InputStreamReader
class WhatsNewActivity : AbsBaseActivity() {
private fun setChangelogRead(context: Context) {
try {
val pInfo = context.packageManager.getPackageInfo(context.packageName, 0)
val currentVersion = pInfo.versionCode
PreferenceUtil.getInstance().setLastChangeLogVersion(currentVersion)
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
}
private fun colorToHex(color: Int): String {
return Integer.toHexString(color).substring(2)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_whats_new)
ButterKnife.bind(this)
setStatusbarColorAuto()
setNavigationbarColorAuto()
setTaskDescriptionColorAuto()
toolbar.setBackgroundColor(ThemeStore.primaryColor(this))
appBarLayout.setBackgroundColor(ThemeStore.primaryColor(this))
setSupportActionBar(toolbar)
title = null
toolbar.setNavigationOnClickListener({ v -> onBackPressed() })
whatNewtitle.setTextColor(ThemeStore.textColorPrimary(this))
ToolbarContentTintHelper.colorBackButton(toolbar, ThemeStore.accentColor(this))
try {
val buf = StringBuilder()
val json = assets.open("retro-changelog.html")
val inputStream = BufferedReader(InputStreamReader(json, "UTF-8"))
while (inputStream.readLine() != null) {
buf.append(inputStream.readLine())
}
inputStream.close()
// Inject color values for WebView body background and links
val backgroundColor = colorToHex(ThemeStore.primaryColor(this))
val contentColor = if (ThemeSingleton.get().darkTheme) "#ffffff" else "#000000"
webView.loadData(buf.toString()
.replace("{style-placeholder}",
String.format("body { background-color: %s; color: %s; }", backgroundColor, contentColor))
.replace("{link-color}", colorToHex(ThemeSingleton.get().positiveColor.defaultColor))
.replace("{link-color-active}", colorToHex(ColorUtil.lightenColor(ThemeSingleton.get().positiveColor.defaultColor))), "text/html", "UTF-8")
} catch (e: Throwable) {
webView.loadData("<h1>Unable to load</h1><p>" + e.localizedMessage + "</p>", "text/html", "UTF-8")
}
setChangelogRead(this)
}
}

View file

@ -1,159 +0,0 @@
package code.name.monkey.retromusic.ui.activities.base;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.material.snackbar.Snackbar;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.view.ViewCompat;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;
public abstract class AbsBaseActivity extends AbsThemeActivity {
public static final int PERMISSION_REQUEST = 100;
private boolean hadPermissions;
private String[] permissions;
private String permissionDeniedMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
permissions = getPermissionsToRequest();
hadPermissions = hasPermissions();
setPermissionDeniedMessage(null);
}
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
if (!hasPermissions()) {
requestPermissions();
}
}
@Override
protected void onResume() {
super.onResume();
final boolean hasPermissions = hasPermissions();
if (hasPermissions != hadPermissions) {
hadPermissions = hasPermissions;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
onHasPermissionsChanged(hasPermissions);
}
}
}
protected void onHasPermissionsChanged(boolean hasPermissions) {
// implemented by sub classes
}
@Override
public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU && event.getAction() == KeyEvent.ACTION_UP) {
showOverflowMenu();
return true;
}
return super.dispatchKeyEvent(event);
}
protected void showOverflowMenu() {
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
@Nullable
protected String[] getPermissionsToRequest() {
return null;
}
protected View getSnackBarContainer() {
return getWindow().getDecorView();
}
private String getPermissionDeniedMessage() {
return permissionDeniedMessage == null ? getString(R.string.permissions_denied)
: permissionDeniedMessage;
}
protected void setPermissionDeniedMessage(String message) {
permissionDeniedMessage = message;
}
protected void requestPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permissions != null) {
requestPermissions(permissions, PERMISSION_REQUEST);
}
}
protected boolean hasPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permissions != null) {
for (String permission : permissions) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST) {
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(AbsBaseActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//User has deny from permission dialog
Snackbar.make(getSnackBarContainer(), getPermissionDeniedMessage(),
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.action_grant, view -> requestPermissions())
.setActionTextColor(ThemeStore.accentColor(this))
.show();
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make(getSnackBarContainer(), getPermissionDeniedMessage(),
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.action_settings, view -> {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", AbsBaseActivity.this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
})
.setActionTextColor(ThemeStore.accentColor(this))
.show();
}
return;
}
}
hadPermissions = true;
onHasPermissionsChanged(true);
}
}
}

View file

@ -0,0 +1,145 @@
package code.name.monkey.retromusic.ui.activities.base
import android.Manifest
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.media.AudioManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.view.KeyEvent
import android.view.View
import androidx.core.app.ActivityCompat
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
import com.google.android.material.snackbar.Snackbar
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper
abstract class AbsBaseActivity : AbsThemeActivity() {
private var hadPermissions: Boolean = false
private var permissions: Array<String>? = null
private var permissionDeniedMessage: String? = null
open fun getPermissionsToRequest(): Array<String>? {
return null
}
protected fun setPermissionDeniedMessage(message: String) {
permissionDeniedMessage = message
}
fun getPermissionDeniedMessage(): String {
return if (permissionDeniedMessage == null) getString(R.string.permissions_denied) else permissionDeniedMessage!!
}
private val snackBarContainer: View
get() = window.decorView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
volumeControlStream = AudioManager.STREAM_MUSIC
permissions = getPermissionsToRequest()
hadPermissions = hasPermissions()
permissionDeniedMessage = null
}
override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
if (!hasPermissions()) {
requestPermissions()
}
}
override fun onResume() {
super.onResume()
val hasPermissions = hasPermissions()
if (hasPermissions != hadPermissions) {
hadPermissions = hasPermissions
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
onHasPermissionsChanged(hasPermissions)
}
}
}
protected open fun onHasPermissionsChanged(hasPermissions: Boolean) {
// implemented by sub classes
}
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
if (event.keyCode == KeyEvent.KEYCODE_MENU && event.action == KeyEvent.ACTION_UP) {
showOverflowMenu()
return true
}
return super.dispatchKeyEvent(event)
}
protected fun showOverflowMenu() {
}
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase))
}
protected open fun requestPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissions!!, PERMISSION_REQUEST)
}
}
protected fun hasPermissions(): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (permission in permissions!!) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
return false
}
}
}
return true
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_REQUEST) {
for (grantResult in grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this@AbsBaseActivity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//User has deny from permission dialog
Snackbar.make(snackBarContainer, permissionDeniedMessage!!,
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.action_grant) { requestPermissions() }
.setActionTextColor(ThemeStore.accentColor(this))
.show()
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make(snackBarContainer, permissionDeniedMessage!!,
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.action_settings) {
val intent = Intent()
intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
val uri = Uri.fromParts("package", this@AbsBaseActivity.packageName, null)
intent.data = uri
startActivity(intent)
}
.setActionTextColor(ThemeStore.accentColor(this))
.show()
}
return
}
}
hadPermissions = true
onHasPermissionsChanged(true)
}
}
companion object {
const val PERMISSION_REQUEST = 100
}
}

View file

@ -1,157 +0,0 @@
package code.name.monkey.retromusic.ui.activities.base;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import com.google.android.gms.cast.framework.CastButtonFactory;
import com.google.android.gms.cast.framework.CastContext;
import com.google.android.gms.cast.framework.CastSession;
import com.google.android.gms.cast.framework.SessionManagerListener;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import java.io.IOException;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.cast.WebServer;
public abstract class AbsCastActivity extends AbsBaseActivity {
private static final String TAG = "AbsCastActivity";
public boolean playServicesAvailable = false;
private CastContext castContext;
private SessionManagerListener<CastSession> sessionManagerListener;
private CastSession castSession;
private WebServer castServer;
private void setupCastListener() {
sessionManagerListener = new SessionManagerListener<CastSession>() {
@Override
public void onSessionEnded(CastSession session, int error) {
onApplicationDisconnected();
Log.i(TAG, "onSessionEnded: ");
}
@Override
public void onSessionResumed(CastSession session, boolean wasSuspended) {
onApplicationConnected(session);
Log.i(TAG, "onSessionResumed: ");
}
@Override
public void onSessionResumeFailed(CastSession session, int error) {
onApplicationDisconnected();
Log.i(TAG, "onSessionResumeFailed: ");
}
@Override
public void onSessionStarted(CastSession session, String sessionId) {
onApplicationConnected(session);
Log.i(TAG, "onSessionStarted: ");
}
@Override
public void onSessionStartFailed(CastSession session, int error) {
onApplicationDisconnected();
Log.i(TAG, "onSessionStartFailed: ");
}
@Override
public void onSessionStarting(CastSession session) {
}
@Override
public void onSessionEnding(CastSession session) {
}
@Override
public void onSessionResuming(CastSession session, String sessionId) {
}
@Override
public void onSessionSuspended(CastSession session, int reason) {
}
private void onApplicationConnected(CastSession castSession) {
AbsCastActivity.this.castSession = castSession;
castServer = new WebServer(getApplicationContext());
try {
castServer.start();
} catch (IOException e) {
e.printStackTrace();
}
supportInvalidateOptionsMenu();
showCastMiniController();
}
private void onApplicationDisconnected() {
if (castServer != null) {
castServer.stop();
}
supportInvalidateOptionsMenu();
hideCastMiniController();
}
};
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
playServicesAvailable = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS;
} catch (Exception ignored) {
}
if (playServicesAvailable)
initCast();
}
@Override
protected void onResume() {
if (playServicesAvailable) {
castContext.getSessionManager().addSessionManagerListener(sessionManagerListener, CastSession.class);
}
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
if (playServicesAvailable) {
castContext.getSessionManager().removeSessionManagerListener(sessionManagerListener, CastSession.class);
}
}
private void initCast() {
setupCastListener();
castContext = CastContext.getSharedInstance(this);
castSession = castContext.getSessionManager().getCurrentCastSession();
}
/* @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_cast, menu);
if (playServicesAvailable) {
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), menu, R.id.media_route_menu_item);
}
return true;
}*/
public void showCastMiniController() {
//implement by overriding in activities
}
public void hideCastMiniController() {
//implement by overriding in activities
}
public CastSession getCastSession() {
return castSession;
}
}

View file

@ -0,0 +1,135 @@
package code.name.monkey.retromusic.ui.activities.base
import android.os.Bundle
import android.util.Log
import code.name.monkey.retromusic.cast.WebServer
import com.google.android.gms.cast.framework.CastContext
import com.google.android.gms.cast.framework.CastSession
import com.google.android.gms.cast.framework.SessionManagerListener
import com.google.android.gms.common.ConnectionResult
import com.google.android.gms.common.GoogleApiAvailability
import java.io.IOException
abstract class AbsCastActivity : AbsBaseActivity() {
var playServicesAvailable = false
private var castContext: CastContext? = null
private var sessionManagerListener: SessionManagerListener<CastSession>? = null
var castSession: CastSession? = null
private set
private var castServer: WebServer? = null
private fun setupCastListener() {
sessionManagerListener = object : SessionManagerListener<CastSession> {
override fun onSessionEnded(session: CastSession, error: Int) {
onApplicationDisconnected()
Log.i(TAG, "onSessionEnded: ")
}
override fun onSessionResumed(session: CastSession, wasSuspended: Boolean) {
onApplicationConnected(session)
Log.i(TAG, "onSessionResumed: ")
}
override fun onSessionResumeFailed(session: CastSession, error: Int) {
onApplicationDisconnected()
Log.i(TAG, "onSessionResumeFailed: ")
}
override fun onSessionStarted(session: CastSession, sessionId: String) {
onApplicationConnected(session)
Log.i(TAG, "onSessionStarted: ")
}
override fun onSessionStartFailed(session: CastSession, error: Int) {
onApplicationDisconnected()
Log.i(TAG, "onSessionStartFailed: ")
}
override fun onSessionStarting(session: CastSession) {}
override fun onSessionEnding(session: CastSession) {}
override fun onSessionResuming(session: CastSession, sessionId: String) {}
override fun onSessionSuspended(session: CastSession, reason: Int) {}
private fun onApplicationConnected(castSession: CastSession) {
this@AbsCastActivity.castSession = castSession
castServer = WebServer(applicationContext)
try {
castServer!!.start()
} catch (e: IOException) {
e.printStackTrace()
}
invalidateOptionsMenu()
showCastMiniController()
}
private fun onApplicationDisconnected() {
if (castServer != null) {
castServer!!.stop()
}
invalidateOptionsMenu()
hideCastMiniController()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
try {
playServicesAvailable = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS
} catch (ignored: Exception) {
}
if (playServicesAvailable)
initCast()
}
override fun onResume() {
if (playServicesAvailable) {
castContext!!.sessionManager.addSessionManagerListener(sessionManagerListener!!, CastSession::class.java)
}
super.onResume()
}
override fun onPause() {
super.onPause()
if (playServicesAvailable) {
castContext!!.sessionManager.removeSessionManagerListener(sessionManagerListener, CastSession::class.java)
}
}
private fun initCast() {
setupCastListener()
castContext = CastContext.getSharedInstance(this)
castSession = castContext!!.sessionManager.currentCastSession
}
/* @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_cast, menu);
if (playServicesAvailable) {
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), menu, R.id.media_route_menu_item);
}
return true;
}*/
open fun showCastMiniController() {
//implement by overriding in activities
}
open fun hideCastMiniController() {
//implement by overriding in activities
}
companion object {
private val TAG = "AbsCastActivity"
}
}

View file

@ -1,224 +0,0 @@
package code.name.monkey.retromusic.ui.activities.base;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.interfaces.MusicServiceEventListener;
import static code.name.monkey.retromusic.Constants.MEDIA_STORE_CHANGED;
import static code.name.monkey.retromusic.Constants.META_CHANGED;
import static code.name.monkey.retromusic.Constants.PLAY_STATE_CHANGED;
import static code.name.monkey.retromusic.Constants.QUEUE_CHANGED;
import static code.name.monkey.retromusic.Constants.REPEAT_MODE_CHANGED;
import static code.name.monkey.retromusic.Constants.SHUFFLE_MODE_CHANGED;
public abstract class AbsMusicServiceActivity extends AbsCastActivity implements MusicServiceEventListener {
public static final String TAG = AbsMusicServiceActivity.class.getSimpleName();
private final ArrayList<MusicServiceEventListener> mMusicServiceEventListeners = new ArrayList<>();
private MusicPlayerRemote.ServiceToken serviceToken;
private MusicStateReceiver musicStateReceiver;
private boolean receiverRegistered;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
serviceToken = MusicPlayerRemote.bindToService(this, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
AbsMusicServiceActivity.this.onServiceConnected();
}
@Override
public void onServiceDisconnected(ComponentName name) {
AbsMusicServiceActivity.this.onServiceDisconnected();
}
});
setPermissionDeniedMessage(getString(R.string.permission_external_storage_denied));
}
@Override
public void onDestroy() {
super.onDestroy();
MusicPlayerRemote.unbindFromService(serviceToken);
if (receiverRegistered) {
unregisterReceiver(musicStateReceiver);
receiverRegistered = false;
}
}
public void addMusicServiceEventListener(final MusicServiceEventListener listener) {
if (listener != null) {
mMusicServiceEventListeners.add(listener);
}
}
public void removeMusicServiceEventListener(final MusicServiceEventListener listener) {
if (listener != null) {
mMusicServiceEventListeners.remove(listener);
}
}
@Override
public void onServiceConnected() {
if (!receiverRegistered) {
musicStateReceiver = new MusicStateReceiver(this);
final IntentFilter filter = new IntentFilter();
filter.addAction(PLAY_STATE_CHANGED);
filter.addAction(SHUFFLE_MODE_CHANGED);
filter.addAction(REPEAT_MODE_CHANGED);
filter.addAction(META_CHANGED);
filter.addAction(QUEUE_CHANGED);
filter.addAction(MEDIA_STORE_CHANGED);
registerReceiver(musicStateReceiver, filter);
receiverRegistered = true;
}
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onServiceConnected();
}
}
}
@Override
public void onServiceDisconnected() {
if (receiverRegistered) {
unregisterReceiver(musicStateReceiver);
receiverRegistered = false;
}
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onServiceDisconnected();
}
}
}
@Override
public void onPlayingMetaChanged() {
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onPlayingMetaChanged();
}
}
}
@Override
public void onQueueChanged() {
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onQueueChanged();
}
}
}
@Override
public void onPlayStateChanged() {
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onPlayStateChanged();
}
}
}
@Override
public void onMediaStoreChanged() {
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onMediaStoreChanged();
}
}
}
@Override
public void onRepeatModeChanged() {
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onRepeatModeChanged();
}
}
}
@Override
public void onShuffleModeChanged() {
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onShuffleModeChanged();
}
}
}
@Override
protected void onHasPermissionsChanged(boolean hasPermissions) {
super.onHasPermissionsChanged(hasPermissions);
Intent intent = new Intent(MEDIA_STORE_CHANGED);
intent.putExtra("from_permissions_changed", true); // just in case we need to know this at some point
sendBroadcast(intent);
}
@Nullable
@Override
protected String[] getPermissionsToRequest() {
return new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
}
private static final class MusicStateReceiver extends BroadcastReceiver {
private final WeakReference<AbsMusicServiceActivity> reference;
public MusicStateReceiver(final AbsMusicServiceActivity activity) {
reference = new WeakReference<>(activity);
}
@Override
public void onReceive(final Context context, @NonNull final Intent intent) {
final String action = intent.getAction();
AbsMusicServiceActivity activity = reference.get();
if (activity != null && action != null) {
switch (action) {
case META_CHANGED:
activity.onPlayingMetaChanged();
break;
case QUEUE_CHANGED:
activity.onQueueChanged();
break;
case PLAY_STATE_CHANGED:
activity.onPlayStateChanged();
break;
case REPEAT_MODE_CHANGED:
activity.onRepeatModeChanged();
break;
case SHUFFLE_MODE_CHANGED:
activity.onShuffleModeChanged();
break;
case MEDIA_STORE_CHANGED:
activity.onMediaStoreChanged();
break;
}
}
}
}
}

View file

@ -0,0 +1,168 @@
package code.name.monkey.retromusic.ui.activities.base
import android.Manifest
import android.content.*
import android.os.Bundle
import android.os.IBinder
import code.name.monkey.retromusic.Constants.MEDIA_STORE_CHANGED
import code.name.monkey.retromusic.Constants.META_CHANGED
import code.name.monkey.retromusic.Constants.PLAY_STATE_CHANGED
import code.name.monkey.retromusic.Constants.QUEUE_CHANGED
import code.name.monkey.retromusic.Constants.REPEAT_MODE_CHANGED
import code.name.monkey.retromusic.Constants.SHUFFLE_MODE_CHANGED
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
import java.lang.ref.WeakReference
import java.util.*
abstract class AbsMusicServiceActivity : AbsCastActivity(), MusicServiceEventListener {
private val mMusicServiceEventListeners = ArrayList<MusicServiceEventListener>()
private var serviceToken: MusicPlayerRemote.ServiceToken? = null
private var musicStateReceiver: MusicStateReceiver? = null
private var receiverRegistered: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
serviceToken = MusicPlayerRemote.bindToService(this, object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, service: IBinder) {
this@AbsMusicServiceActivity.onServiceConnected()
}
override fun onServiceDisconnected(name: ComponentName) {
this@AbsMusicServiceActivity.onServiceDisconnected()
}
})
setPermissionDeniedMessage(getString(R.string.permission_external_storage_denied));
}
override fun onDestroy() {
super.onDestroy()
MusicPlayerRemote.unbindFromService(serviceToken)
if (receiverRegistered) {
unregisterReceiver(musicStateReceiver)
receiverRegistered = false
}
}
fun addMusicServiceEventListener(listener: MusicServiceEventListener?) {
if (listener != null) {
mMusicServiceEventListeners.add(listener)
}
}
fun removeMusicServiceEventListener(listener: MusicServiceEventListener?) {
if (listener != null) {
mMusicServiceEventListeners.remove(listener)
}
}
override fun onServiceConnected() {
if (!receiverRegistered) {
musicStateReceiver = MusicStateReceiver(this)
val filter = IntentFilter()
filter.addAction(PLAY_STATE_CHANGED)
filter.addAction(SHUFFLE_MODE_CHANGED)
filter.addAction(REPEAT_MODE_CHANGED)
filter.addAction(META_CHANGED)
filter.addAction(QUEUE_CHANGED)
filter.addAction(MEDIA_STORE_CHANGED)
registerReceiver(musicStateReceiver, filter)
receiverRegistered = true
}
for (listener in mMusicServiceEventListeners) {
listener.onServiceConnected()
}
}
override fun onServiceDisconnected() {
if (receiverRegistered) {
unregisterReceiver(musicStateReceiver)
receiverRegistered = false
}
for (listener in mMusicServiceEventListeners) {
listener.onServiceDisconnected()
}
}
override fun onPlayingMetaChanged() {
for (listener in mMusicServiceEventListeners) {
listener.onPlayingMetaChanged()
}
}
override fun onQueueChanged() {
for (listener in mMusicServiceEventListeners) {
listener.onQueueChanged()
}
}
override fun onPlayStateChanged() {
for (listener in mMusicServiceEventListeners) {
listener.onPlayStateChanged()
}
}
override fun onMediaStoreChanged() {
for (listener in mMusicServiceEventListeners) {
listener.onMediaStoreChanged()
}
}
override fun onRepeatModeChanged() {
for (listener in mMusicServiceEventListeners) {
listener.onRepeatModeChanged()
}
}
override fun onShuffleModeChanged() {
for (listener in mMusicServiceEventListeners) {
listener.onShuffleModeChanged()
}
}
override fun onHasPermissionsChanged(hasPermissions: Boolean) {
super.onHasPermissionsChanged(hasPermissions)
val intent = Intent(MEDIA_STORE_CHANGED)
intent.putExtra("from_permissions_changed", true) // just in case we need to know this at some point
sendBroadcast(intent)
}
override fun getPermissionsToRequest(): Array<String>? {
return arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
private class MusicStateReceiver(activity: AbsMusicServiceActivity) : BroadcastReceiver() {
private val reference: WeakReference<AbsMusicServiceActivity> = WeakReference(activity)
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action
val activity = reference.get()
if (activity != null && action != null) {
when (action) {
META_CHANGED -> activity.onPlayingMetaChanged()
QUEUE_CHANGED -> activity.onQueueChanged()
PLAY_STATE_CHANGED -> activity.onPlayStateChanged()
REPEAT_MODE_CHANGED -> activity.onRepeatModeChanged()
SHUFFLE_MODE_CHANGED -> activity.onShuffleModeChanged()
MEDIA_STORE_CHANGED -> activity.onMediaStoreChanged()
}
}
}
}
companion object {
val TAG = AbsMusicServiceActivity::class.java.simpleName
}
}

View file

@ -1,455 +0,0 @@
package code.name.monkey.retromusic.ui.activities.base;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.view.animation.PathInterpolator;
import com.google.android.gms.cast.framework.CastSession;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import com.sothree.slidinguppanel.SlidingUpPanelLayout.PanelState;
import androidx.annotation.FloatRange;
import androidx.annotation.LayoutRes;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.fragment.app.Fragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.ui.fragments.MiniPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.NowPlayingScreen;
import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.adaptive.AdaptiveFragment;
import code.name.monkey.retromusic.ui.fragments.player.blur.BlurPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.card.CardFragment;
import code.name.monkey.retromusic.ui.fragments.player.cardblur.CardBlurFragment;
import code.name.monkey.retromusic.ui.fragments.player.color.ColorFragment;
import code.name.monkey.retromusic.ui.fragments.player.fit.FitFragment;
import code.name.monkey.retromusic.ui.fragments.player.flat.FlatPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.full.FullPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.hmm.HmmPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.material.MaterialFragment;
import code.name.monkey.retromusic.ui.fragments.player.normal.PlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.plain.PlainPlayerFragment;
import code.name.monkey.retromusic.ui.fragments.player.simple.SimplePlayerFragment;
import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.util.PreferenceUtil;
import code.name.monkey.retromusic.util.ViewUtil;
import code.name.monkey.retromusic.views.BottomNavigationBarTinted;
public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivity implements
SlidingUpPanelLayout.PanelSlideListener, PlayerFragment.Callbacks {
public static final String TAG = AbsSlidingMusicPanelActivity.class.getSimpleName();
@BindView(R.id.sliding_layout)
SlidingUpPanelLayout slidingUpPanelLayout;
@BindView(R.id.bottom_navigation)
BottomNavigationBarTinted bottomNavigationView;
@BindView(R.id.main_content)
CoordinatorLayout coordinatorLayout;
private MiniPlayerFragment miniPlayerFragment;
private AbsPlayerFragment playerFragment;
private NowPlayingScreen currentNowPlayingScreen;
private int navigationbarColor;
private int taskColor;
private boolean lightStatusbar;
private boolean lightNavigationBar;
private ValueAnimator navigationBarColorAnimator;
private ArgbEvaluator argbEvaluator = new ArgbEvaluator();
protected AbsSlidingMusicPanelActivity() {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(createContentView());
ButterKnife.bind(this);
choosFragmentForTheme();
setupSlidingUpPanel();
}
public void setBottomBarVisibility(int gone) {
if (bottomNavigationView != null) {
bottomNavigationView.setVisibility(gone);
hideBottomBar(false);
}
}
protected abstract View createContentView();
@Override
public void onServiceConnected() {
super.onServiceConnected();
if (!MusicPlayerRemote.getPlayingQueue().isEmpty()) {
slidingUpPanelLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
slidingUpPanelLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
hideBottomBar(false);
}
});
} // don't call hideBottomBar(true) here as it causes a bug with the SlidingUpPanelLayout
}
@Override
public void onQueueChanged() {
super.onQueueChanged();
hideBottomBar(MusicPlayerRemote.getPlayingQueue().isEmpty());
}
public void hideBottomBar(final boolean hide) {
int heightOfBar = getResources().getDimensionPixelSize(R.dimen.mini_player_height);
int heightOfBarWithTabs = getResources().getDimensionPixelSize(R.dimen.mini_player_height_expanded);
if (hide) {
slidingUpPanelLayout.setPanelHeight(0);
collapsePanel();
} else {
if (!MusicPlayerRemote.getPlayingQueue().isEmpty()) {
slidingUpPanelLayout.setPanelHeight(bottomNavigationView.getVisibility() == View.VISIBLE ? heightOfBarWithTabs : heightOfBar);
}
}
}
private void checkDisplayCutout() {
WindowManager.LayoutParams attrs = getWindow().getAttributes();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
attrs.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
}
}
protected View wrapSlidingMusicPanel(@LayoutRes int resId) {
@SuppressLint("InflateParams")
View slidingMusicPanelLayout = getLayoutInflater().inflate(R.layout.sliding_music_panel_layout, null);
ViewGroup contentContainer = slidingMusicPanelLayout.findViewById(R.id.content_container);
getLayoutInflater().inflate(resId, contentContainer);
return slidingMusicPanelLayout;
}
@Override
public void onBackPressed() {
if (!handleBackPress())
super.onBackPressed();
}
public boolean handleBackPress() {
if (slidingUpPanelLayout.getPanelHeight() != 0 && playerFragment.onBackPressed())
return true;
if (getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) {
collapsePanel();
return true;
}
return false;
}
@Override
protected View getSnackBarContainer() {
return findViewById(R.id.content_container);
}
@Override
public void hideCastMiniController() {
super.hideCastMiniController();
}
@Override
public void showCastMiniController() {
super.showCastMiniController();
}
@Override
public void onPlayingMetaChanged() {
super.onPlayingMetaChanged();
CastSession castSession = getCastSession();
if (castSession == null) {
return;
}
//MusicPlayerRemote.setZeroVolume();
//CastHelper.startCasting(castSession, MusicPlayerRemote.getCurrentSong());
}
public void toggleBottomNavigationView(boolean toggle) {
bottomNavigationView.setVisibility(toggle ? View.GONE : View.VISIBLE);
}
public BottomNavigationView getBottomNavigationView() {
return bottomNavigationView;
}
public SlidingUpPanelLayout getSlidingUpPanelLayout() {
return slidingUpPanelLayout;
}
public AbsPlayerFragment getPlayerFragment() {
return playerFragment;
}
protected void setupSlidingUpPanel() {
slidingUpPanelLayout.getViewTreeObserver()
.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
slidingUpPanelLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
if (getPanelState() == PanelState.EXPANDED) {
onPanelSlide(slidingUpPanelLayout, 1);
onPanelExpanded(slidingUpPanelLayout);
} else if (getPanelState() == PanelState.COLLAPSED) {
onPanelCollapsed(slidingUpPanelLayout);
} else {
playerFragment.onHide();
}
}
});
slidingUpPanelLayout.addPanelSlideListener(this);
}
public SlidingUpPanelLayout.PanelState getPanelState() {
return slidingUpPanelLayout == null ? null : slidingUpPanelLayout.getPanelState();
}
@Override
public void onPanelSlide(View panel, float slideOffset) {
bottomNavigationView.setTranslationY(slideOffset * 400);
setMiniPlayerAlphaProgress(slideOffset);
//if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel();
//super.setNavigationbarColor((int) argbEvaluator.evaluate(slideOffset, navigationbarColor, Color.TRANSPARENT));
}
@Override
public void onPanelStateChanged(View panel, PanelState previousState, PanelState newState) {
switch (newState) {
case COLLAPSED:
onPanelCollapsed(panel);
break;
case EXPANDED:
onPanelExpanded(panel);
break;
case ANCHORED:
collapsePanel(); // this fixes a bug where the panel would get stuck for some reason
break;
}
}
public void onPanelCollapsed(View panel) {
// restore values
super.setLightStatusbar(lightStatusbar);
super.setTaskDescriptionColor(taskColor);
super.setNavigationbarColor(navigationbarColor);
super.setLightNavigationBar(lightNavigationBar);
playerFragment.setMenuVisibility(false);
playerFragment.setUserVisibleHint(false);
playerFragment.onHide();
}
public void onPanelExpanded(View panel) {
int playerFragmentColor = playerFragment.getPaletteColor();
super.setTaskDescriptionColor(playerFragmentColor);
playerFragment.setMenuVisibility(true);
playerFragment.setUserVisibleHint(true);
playerFragment.onShow();
onPaletteColorChanged();
}
private void setMiniPlayerAlphaProgress(@FloatRange(from = 0, to = 1) float progress) {
if (miniPlayerFragment.getView() == null) return;
float alpha = 1 - progress;
miniPlayerFragment.getView().setAlpha(alpha);
// necessary to make the views below clickable
miniPlayerFragment.getView().setVisibility(alpha == 0 ? View.GONE : View.VISIBLE);
}
private void choosFragmentForTheme() {
currentNowPlayingScreen = PreferenceUtil.getInstance().getNowPlayingScreen();
Fragment fragment; // must implement AbsPlayerFragment
switch (currentNowPlayingScreen) {
case MATERIAL:
fragment = new MaterialFragment();
break;
case BLUR:
fragment = new BlurPlayerFragment();
break;
case FLAT:
fragment = new FlatPlayerFragment();
break;
case PLAIN:
fragment = new PlainPlayerFragment();
break;
case FULL:
fragment = new FullPlayerFragment();
break;
case COLOR:
fragment = new ColorFragment();
break;
case CARD:
fragment = new CardFragment();
break;
case SIMPLE:
fragment = new SimplePlayerFragment();
break;
case TINY:
fragment = new HmmPlayerFragment();
break;
case BLUR_CARD:
fragment = new CardBlurFragment();
break;
case ADAPTIVE:
fragment = new AdaptiveFragment();
break;
case FIT:
fragment = new FitFragment();
break;
case NORMAL:
default:
fragment = new PlayerFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.player_fragment_container, fragment).commit();
getSupportFragmentManager().executePendingTransactions();
playerFragment = (AbsPlayerFragment) getSupportFragmentManager().findFragmentById(R.id.player_fragment_container);
miniPlayerFragment = (MiniPlayerFragment) getSupportFragmentManager().findFragmentById(R.id.mini_player_fragment);
//noinspection ConstantConditions
miniPlayerFragment.getView().setOnClickListener(v -> expandPanel());
}
@Override
protected void onResume() {
super.onResume();
if (currentNowPlayingScreen != PreferenceUtil.getInstance().getNowPlayingScreen()) {
postRecreate();
}
}
public void setAntiDragView(View antiDragView) {
//slidingUpPanelLayout.setAntiDragView(antiDragView);
}
public void collapsePanel() {
slidingUpPanelLayout.setPanelState(PanelState.COLLAPSED);
}
public void expandPanel() {
slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
}
@Override
public void onPaletteColorChanged() {
if (getPanelState() == PanelState.EXPANDED) {
int paletteColor = playerFragment.getPaletteColor();
boolean isColorLight = ColorUtil.isColorLight(paletteColor);
super.setTaskDescriptionColor(paletteColor);
if ((currentNowPlayingScreen == NowPlayingScreen.FLAT || currentNowPlayingScreen == NowPlayingScreen.NORMAL) && PreferenceUtil.getInstance().getAdaptiveColor()) {
super.setLightNavigationBar(true);
super.setLightStatusbar(isColorLight);
} else if (currentNowPlayingScreen == NowPlayingScreen.COLOR) {
super.setLightStatusbar(isColorLight);
super.setLightNavigationBar(isColorLight);
super.setNavigationbarColor(paletteColor);
} else if (currentNowPlayingScreen == NowPlayingScreen.BLUR || currentNowPlayingScreen == NowPlayingScreen.BLUR_CARD) {
super.setLightStatusbar(false);
super.setLightNavigationBar(true);
} else if (currentNowPlayingScreen == NowPlayingScreen.CARD || currentNowPlayingScreen == NowPlayingScreen.FULL) {
super.setLightStatusbar(false);
super.setLightNavigationBar(ColorUtil.isColorLight(ThemeStore.primaryColor(this)));
} else if (currentNowPlayingScreen == NowPlayingScreen.FIT) {
super.setNavigationbarColor(ThemeStore.primaryColor(this));
super.setLightNavigationBar(ColorUtil.isColorLight(ThemeStore.primaryColor(this)));
super.setLightStatusbar(false);
} else {
boolean isTheme = isOneOfTheseThemes() && ColorUtil.isColorLight(ThemeStore.primaryColor(this));
super.setStatusbarColor(Color.TRANSPARENT);
super.setLightStatusbar(isTheme);
super.setLightNavigationBar(isTheme);
}
}
}
private boolean isOneOfTheseThemes() {
return currentNowPlayingScreen == NowPlayingScreen.FLAT
|| currentNowPlayingScreen == NowPlayingScreen.PLAIN
|| currentNowPlayingScreen == NowPlayingScreen.SIMPLE
|| currentNowPlayingScreen == NowPlayingScreen.NORMAL
|| currentNowPlayingScreen == NowPlayingScreen.ADAPTIVE
|| currentNowPlayingScreen == NowPlayingScreen.TINY
|| currentNowPlayingScreen == NowPlayingScreen.MATERIAL;
}
@Override
public void setLightStatusbar(boolean enabled) {
lightStatusbar = enabled;
if (getPanelState() == PanelState.COLLAPSED) {
super.setLightStatusbar(enabled);
}
}
@Override
public void setLightNavigationBar(boolean enabled) {
lightNavigationBar = enabled;
if (getPanelState() == PanelState.COLLAPSED) {
super.setLightNavigationBar(enabled);
}
}
@Override
public void setNavigationbarColor(int color) {
navigationbarColor = color;
if (getPanelState() == PanelState.COLLAPSED) {
if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel();
super.setNavigationbarColor(color);
}
}
@Override
public void setTaskDescriptionColor(int color) {
taskColor = color;
if (getPanelState() == PanelState.COLLAPSED) {
super.setTaskDescriptionColor(color);
}
}
private void animateNavigationBarColor(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel();
navigationBarColorAnimator = ValueAnimator
.ofArgb(getWindow().getNavigationBarColor(), color)
.setDuration(ViewUtil.RETRO_MUSIC_ANIM_TIME);
navigationBarColorAnimator.setInterpolator(new PathInterpolator(0.4f, 0f, 1f, 1f));
navigationBarColorAnimator.addUpdateListener(animation -> AbsSlidingMusicPanelActivity.super.setNavigationbarColor((Integer) animation.getAnimatedValue()));
navigationBarColorAnimator.start();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel(); // just in case
}
}

View file

@ -0,0 +1,301 @@
package code.name.monkey.retromusic.ui.activities.base
import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import androidx.annotation.FloatRange
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import butterknife.ButterKnife
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.ui.fragments.MiniPlayerFragment
import code.name.monkey.retromusic.ui.fragments.NowPlayingScreen
import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.ui.fragments.player.adaptive.AdaptiveFragment
import code.name.monkey.retromusic.ui.fragments.player.blur.BlurPlayerFragment
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.views.BottomNavigationBarTinted
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.sothree.slidinguppanel.SlidingUpPanelLayout
import com.sothree.slidinguppanel.SlidingUpPanelLayout.PanelState
abstract class AbsSlidingMusicPanelActivity protected constructor() : AbsMusicServiceActivity(), SlidingUpPanelLayout.PanelSlideListener, AbsPlayerFragment.Callbacks {
lateinit var slidingUpPanelLayout: SlidingUpPanelLayout
private lateinit var bottomNavigationView: BottomNavigationBarTinted
private var miniPlayerFragment: MiniPlayerFragment? = null
var playerFragment: AbsPlayerFragment? = null
private var currentNowPlayingScreen: NowPlayingScreen? = null
private var navigationbarColor: Int = 0
private var taskColor: Int = 0
private var lightStatusbar: Boolean = false
private var lightNavigationBar: Boolean = false
private var navigationBarColorAnimator: ValueAnimator? = null
private val argbEvaluator = ArgbEvaluator()
val panelState: SlidingUpPanelLayout.PanelState?
get() = slidingUpPanelLayout.panelState
private val isOneOfTheseThemes: Boolean
get() = (currentNowPlayingScreen == NowPlayingScreen.ADAPTIVE)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(createContentView())
ButterKnife.bind(this)
slidingUpPanelLayout = findViewById(R.id.sliding_layout);
bottomNavigationView = findViewById(R.id.bottom_navigation);
choosFragmentForTheme()
setupSlidingUpPanel()
}
fun setBottomBarVisibility(gone: Int) {
bottomNavigationView.visibility = gone
hideBottomBar(false)
}
protected abstract fun createContentView(): View
override fun onServiceConnected() {
super.onServiceConnected()
if (!MusicPlayerRemote.playingQueue.isEmpty()) {
slidingUpPanelLayout.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
slidingUpPanelLayout.viewTreeObserver.removeOnGlobalLayoutListener(this)
hideBottomBar(false)
}
})
} // don't call hideBottomBar(true) here as it causes a bug with the SlidingUpPanelLayout
}
override fun onQueueChanged() {
super.onQueueChanged()
hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty())
}
fun hideBottomBar(hide: Boolean) {
val heightOfBar = resources.getDimensionPixelSize(R.dimen.mini_player_height)
val heightOfBarWithTabs = resources.getDimensionPixelSize(R.dimen.mini_player_height_expanded)
if (hide) {
slidingUpPanelLayout.panelHeight = 0
collapsePanel()
} else {
if (!MusicPlayerRemote.playingQueue.isEmpty()) {
slidingUpPanelLayout.panelHeight = if (bottomNavigationView.visibility == View.VISIBLE) heightOfBarWithTabs else heightOfBar
}
}
}
protected fun wrapSlidingMusicPanel(@LayoutRes resId: Int): View {
@SuppressLint("InflateParams")
val slidingMusicPanelLayout = layoutInflater.inflate(R.layout.sliding_music_panel_layout, null)
val contentContainer = slidingMusicPanelLayout.findViewById<ViewGroup>(R.id.content_container)
layoutInflater.inflate(resId, contentContainer)
return slidingMusicPanelLayout
}
override fun onBackPressed() {
if (!handleBackPress())
super.onBackPressed()
}
open fun handleBackPress(): Boolean {
if (slidingUpPanelLayout.panelHeight != 0 && playerFragment!!.onBackPressed())
return true
if (panelState == SlidingUpPanelLayout.PanelState.EXPANDED) {
collapsePanel()
return true
}
return false
}
override fun onPlayingMetaChanged() {
super.onPlayingMetaChanged()
castSession ?: return
//MusicPlayerRemote.setZeroVolume();
//CastHelper.startCasting(castSession, MusicPlayerRemote.getCurrentSong());
}
fun toggleBottomNavigationView(toggle: Boolean) {
bottomNavigationView.visibility = if (toggle) View.GONE else View.VISIBLE
}
fun getBottomNavigationView(): BottomNavigationView? {
return bottomNavigationView
}
private fun setupSlidingUpPanel() {
slidingUpPanelLayout.viewTreeObserver
.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
slidingUpPanelLayout.viewTreeObserver.removeOnGlobalLayoutListener(this)
if (panelState == PanelState.EXPANDED) {
onPanelSlide(slidingUpPanelLayout, 1f)
onPanelExpanded()
} else if (panelState == PanelState.COLLAPSED) {
onPanelCollapsed()
} else {
playerFragment!!.onHide()
}
}
})
slidingUpPanelLayout.addPanelSlideListener(this)
}
override fun onPanelSlide(panel: View?, slideOffset: Float) {
bottomNavigationView.translationY = slideOffset * 400
setMiniPlayerAlphaProgress(slideOffset)
//if (navigationBarColorAnimator != null) navigationBarColorAnimator.cancel();
//super.setNavigationbarColor((int) argbEvaluator.evaluate(slideOffset, navigationbarColor, Color.TRANSPARENT));
}
override fun onPanelStateChanged(panel: View, previousState: PanelState, newState: PanelState) {
when (newState) {
SlidingUpPanelLayout.PanelState.COLLAPSED -> onPanelCollapsed()
SlidingUpPanelLayout.PanelState.EXPANDED -> onPanelExpanded()
SlidingUpPanelLayout.PanelState.ANCHORED -> collapsePanel() // this fixes a bug where the panel would get stuck for some reason
else -> {
}
}
}
fun onPanelCollapsed() {
// restore values
super.setLightStatusbar(lightStatusbar)
super.setTaskDescriptionColor(taskColor)
super.setNavigationbarColor(navigationbarColor)
super.setLightNavigationBar(lightNavigationBar)
playerFragment!!.setMenuVisibility(false)
playerFragment!!.userVisibleHint = false
playerFragment!!.onHide()
}
fun onPanelExpanded() {
val playerFragmentColor = playerFragment!!.paletteColor
super.setTaskDescriptionColor(playerFragmentColor)
playerFragment!!.setMenuVisibility(true)
playerFragment!!.userVisibleHint = true
playerFragment!!.onShow()
onPaletteColorChanged()
}
private fun setMiniPlayerAlphaProgress(@FloatRange(from = 0.0, to = 1.0) progress: Float) {
if (miniPlayerFragment!!.view == null) return
val alpha = 1 - progress
miniPlayerFragment!!.view!!.alpha = alpha
// necessary to make the views below clickable
miniPlayerFragment!!.view!!.visibility = if (alpha == 0f) View.GONE else View.VISIBLE
}
private fun choosFragmentForTheme() {
currentNowPlayingScreen = PreferenceUtil.getInstance().nowPlayingScreen
val fragment: Fragment // must implement AbsPlayerFragment
when (currentNowPlayingScreen) {
NowPlayingScreen.BLUR -> fragment = BlurPlayerFragment()
NowPlayingScreen.ADAPTIVE -> fragment = AdaptiveFragment()
else -> fragment = AdaptiveFragment()
}
supportFragmentManager.beginTransaction().replace(R.id.player_fragment_container, fragment).commit()
supportFragmentManager.executePendingTransactions()
playerFragment = supportFragmentManager.findFragmentById(R.id.player_fragment_container) as AbsPlayerFragment?
miniPlayerFragment = supportFragmentManager.findFragmentById(R.id.mini_player_fragment) as MiniPlayerFragment?
miniPlayerFragment!!.view!!.setOnClickListener { expandPanel() }
}
override fun onResume() {
super.onResume()
if (currentNowPlayingScreen != PreferenceUtil.getInstance().nowPlayingScreen) {
postRecreate()
}
}
private fun collapsePanel() {
slidingUpPanelLayout.panelState = PanelState.COLLAPSED
}
private fun expandPanel() {
slidingUpPanelLayout.panelState = PanelState.EXPANDED
}
override fun onPaletteColorChanged() {
if (panelState == PanelState.EXPANDED) {
val paletteColor = playerFragment!!.paletteColor
ColorUtil.isColorLight(paletteColor)
super.setTaskDescriptionColor(paletteColor)
if (currentNowPlayingScreen == NowPlayingScreen.BLUR) {
super.setLightStatusbar(false)
super.setLightNavigationBar(true)
} else {
val isTheme = isOneOfTheseThemes && ColorUtil.isColorLight(ThemeStore.primaryColor(this))
super.setStatusbarColor(Color.TRANSPARENT)
super.setLightStatusbar(isTheme)
super.setLightNavigationBar(isTheme)
}
}
}
override fun setLightStatusbar(enabled: Boolean) {
lightStatusbar = enabled
if (panelState == PanelState.COLLAPSED) {
super.setLightStatusbar(enabled)
}
}
override fun setLightNavigationBar(enabled: Boolean) {
lightNavigationBar = enabled
if (panelState == PanelState.COLLAPSED) {
super.setLightNavigationBar(enabled)
}
}
override fun setNavigationbarColor(color: Int) {
navigationbarColor = color
if (panelState == PanelState.COLLAPSED) {
if (navigationBarColorAnimator != null) navigationBarColorAnimator!!.cancel()
super.setNavigationbarColor(color)
}
}
override fun setTaskDescriptionColor(color: Int) {
taskColor = color
if (panelState == PanelState.COLLAPSED) {
super.setTaskDescriptionColor(color)
}
}
override fun onDestroy() {
super.onDestroy()
if (navigationBarColorAnimator != null) navigationBarColorAnimator!!.cancel() // just in case
}
companion object {
val TAG = AbsSlidingMusicPanelActivity::class.java.simpleName
}
}

View file

@ -1,216 +0,0 @@
package code.name.monkey.retromusic.ui.activities.base;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import androidx.annotation.ColorInt;
import androidx.core.content.ContextCompat;
import code.name.monkey.appthemehelper.ATH;
import code.name.monkey.appthemehelper.ATHActivity;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ATHUtil;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.appthemehelper.util.MaterialDialogsUtil;
import code.name.monkey.appthemehelper.util.TintHelper;
import code.name.monkey.appthemehelper.util.VersionUtils;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.util.PreferenceUtil;
import code.name.monkey.retromusic.util.RetroUtil;
public abstract class AbsThemeActivity extends ATHActivity implements Runnable {
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(PreferenceUtil.getInstance().getGeneralTheme());
hideStatusBar();
super.onCreate(savedInstanceState);
MaterialDialogsUtil.updateMaterialDialogsThemeSingleton(this);
changeBackgroundShape();
setImmersiveFullscreen();
registerSystemUiVisibility();
toggleScreenOn();
}
private void toggleScreenOn() {
if (PreferenceUtil.getInstance().isScreenOnEnabled()) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
hideStatusBar();
handler.removeCallbacks(this);
handler.postDelayed(this, 300);
} else {
handler.removeCallbacks(this);
}
}
public void hideStatusBar() {
hideStatusBar(PreferenceUtil.getInstance().getFullScreenMode());
}
private void hideStatusBar(boolean fullscreen) {
final View statusBar = getWindow().getDecorView().getRootView().findViewById(R.id.status_bar);
if (statusBar != null) {
statusBar.setVisibility(fullscreen ? View.GONE : View.VISIBLE);
}
}
private void changeBackgroundShape() {
Drawable background = PreferenceUtil.getInstance().isRoundCorners() ?
ContextCompat.getDrawable(this, R.drawable.round_window)
: ContextCompat.getDrawable(this, R.drawable.square_window);
background = TintHelper.createTintedDrawable(background, ThemeStore.primaryColor(this));
getWindow().setBackgroundDrawable(background);
}
public void setDrawUnderStatusBar() {
if (VersionUtils.hasLollipop()) {
RetroUtil.setAllowDrawUnderStatusBar(getWindow());
} else if (VersionUtils.hasKitKat()) {
RetroUtil.setStatusBarTranslucent(getWindow());
}
}
public void setDrawUnderNavigationBar() {
RetroUtil.setAllowDrawUnderNavigationBar(getWindow());
}
/**
* This will set the color of the view with the id "status_bar" on KitKat and Lollipop. On
* Lollipop if no such view is found it will set the statusbar color using the native method.
*
* @param color the new statusbar color (will be shifted down on Lollipop and above)
*/
public void setStatusbarColor(int color) {
if (VersionUtils.hasKitKat()) {
final View statusBar = getWindow().getDecorView().getRootView().findViewById(R.id.status_bar);
if (statusBar != null) {
if (VersionUtils.hasMarshmallow()) {
getWindow().setStatusBarColor(color);
} else if (VersionUtils.hasLollipop()) {
statusBar.setBackgroundColor(ColorUtil.darkenColor(color));
} else {
statusBar.setBackgroundColor(color);
}
} else if (Build.VERSION.SDK_INT >= 21) {
getWindow().setStatusBarColor(ColorUtil.darkenColor(color));
}
}
setLightStatusbarAuto(color);
}
public void setStatusbarColorAuto() {
// we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat
setStatusbarColor(ThemeStore.primaryColor(this));
}
public void setTaskDescriptionColor(@ColorInt int color) {
ATH.setTaskDescriptionColor(this, color);
}
public void setTaskDescriptionColorAuto() {
setTaskDescriptionColor(ThemeStore.primaryColor(this));
}
public void setNavigationbarColor(int color) {
if (ThemeStore.coloredNavigationBar(this)) {
ATH.setNavigationbarColor(this, color);
} else {
ATH.setNavigationbarColor(this, Color.BLACK);
}
}
public void setNavigationbarColorAuto() {
setNavigationbarColor(ThemeStore.navigationBarColor(this));
}
public void setLightStatusbar(boolean enabled) {
ATH.setLightStatusbar(this, enabled);
}
public void setLightStatusbarAuto(int bgColor) {
setLightStatusbar(ColorUtil.isColorLight(bgColor));
}
public void setLightNavigationBar(boolean enabled) {
if (!ATHUtil.isWindowBackgroundDark(this) && ThemeStore.coloredNavigationBar(this)) {
ATH.setLightNavigationbar(this, enabled);
}
}
private void registerSystemUiVisibility() {
final View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener(visibility -> {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
setImmersiveFullscreen();
}
});
}
private void unregisterSystemUiVisibility() {
final View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener(null);
}
public void setImmersiveFullscreen() {
int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
if (PreferenceUtil.getInstance().getFullScreenMode()) {
getWindow().getDecorView().setSystemUiVisibility(flags);
}
}
public void exitFullscreen() {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
@Override
public void run() {
setImmersiveFullscreen();
}
@Override
protected void onStop() {
handler.removeCallbacks(this);
super.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterSystemUiVisibility();
exitFullscreen();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP)) {
handler.removeCallbacks(this);
handler.postDelayed(this, 500);
}
return super.onKeyDown(keyCode, event);
}
}

View file

@ -0,0 +1,206 @@
package code.name.monkey.retromusic.ui.activities.base
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.view.KeyEvent
import android.view.View
import android.view.WindowManager
import androidx.annotation.ColorInt
import androidx.core.content.ContextCompat
import code.name.monkey.appthemehelper.ATH
import code.name.monkey.appthemehelper.ATHActivity
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.*
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
abstract class AbsThemeActivity : ATHActivity(), Runnable {
private val handler = Handler()
override fun onCreate(savedInstanceState: Bundle?) {
setTheme(PreferenceUtil.getInstance().generalTheme)
hideStatusBar()
super.onCreate(savedInstanceState)
MaterialDialogsUtil.updateMaterialDialogsThemeSingleton(this)
changeBackgroundShape()
setImmersiveFullscreen()
registerSystemUiVisibility()
toggleScreenOn()
}
private fun toggleScreenOn() {
if (PreferenceUtil.getInstance().isScreenOnEnabled) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} else {
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus) {
hideStatusBar()
handler.removeCallbacks(this)
handler.postDelayed(this, 300)
} else {
handler.removeCallbacks(this)
}
}
fun hideStatusBar() {
hideStatusBar(PreferenceUtil.getInstance().fullScreenMode)
}
private fun hideStatusBar(fullscreen: Boolean) {
val statusBar = window.decorView.rootView.findViewById<View>(R.id.status_bar)
if (statusBar != null) {
statusBar.visibility = if (fullscreen) View.GONE else View.VISIBLE
}
}
private fun changeBackgroundShape() {
var background: Drawable? = if (PreferenceUtil.getInstance().isRoundCorners)
ContextCompat.getDrawable(this, R.drawable.round_window)
else
ContextCompat.getDrawable(this, R.drawable.square_window)
background = TintHelper.createTintedDrawable(background, ThemeStore.primaryColor(this))
window.setBackgroundDrawable(background)
}
fun setDrawUnderStatusBar() {
if (VersionUtils.hasLollipop()) {
RetroUtil.setAllowDrawUnderStatusBar(window)
} else if (VersionUtils.hasKitKat()) {
RetroUtil.setStatusBarTranslucent(window)
}
}
fun setDrawUnderNavigationBar() {
RetroUtil.setAllowDrawUnderNavigationBar(window)
}
/**
* This will set the color of the view with the id "status_bar" on KitKat and Lollipop. On
* Lollipop if no such view is found it will set the statusbar color using the native method.
*
* @param color the new statusbar color (will be shifted down on Lollipop and above)
*/
fun setStatusbarColor(color: Int) {
if (VersionUtils.hasKitKat()) {
val statusBar = window.decorView.rootView.findViewById<View>(R.id.status_bar)
if (statusBar != null) {
if (VersionUtils.hasMarshmallow()) {
window.statusBarColor = color
} else if (VersionUtils.hasLollipop()) {
statusBar.setBackgroundColor(ColorUtil.darkenColor(color))
} else {
statusBar.setBackgroundColor(color)
}
} else if (Build.VERSION.SDK_INT >= 21) {
window.statusBarColor = ColorUtil.darkenColor(color)
}
}
setLightStatusbarAuto(color)
}
fun setStatusbarColorAuto() {
// we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat
setStatusbarColor(ThemeStore.primaryColor(this))
}
open fun setTaskDescriptionColor(@ColorInt color: Int) {
ATH.setTaskDescriptionColor(this, color)
}
fun setTaskDescriptionColorAuto() {
setTaskDescriptionColor(ThemeStore.primaryColor(this))
}
open fun setNavigationbarColor(color: Int) {
if (ThemeStore.coloredNavigationBar(this)) {
ATH.setNavigationbarColor(this, color)
} else {
ATH.setNavigationbarColor(this, Color.BLACK)
}
}
fun setNavigationbarColorAuto() {
setNavigationbarColor(ThemeStore.navigationBarColor(this))
}
open fun setLightStatusbar(enabled: Boolean) {
ATH.setLightStatusbar(this, enabled)
}
fun setLightStatusbarAuto(bgColor: Int) {
setLightStatusbar(ColorUtil.isColorLight(bgColor))
}
open fun setLightNavigationBar(enabled: Boolean) {
if (!ATHUtil.isWindowBackgroundDark(this) && ThemeStore.coloredNavigationBar(this)) {
ATH.setLightNavigationbar(this, enabled)
}
}
private fun registerSystemUiVisibility() {
val decorView = window.decorView
decorView.setOnSystemUiVisibilityChangeListener { visibility ->
if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
setImmersiveFullscreen()
}
}
}
private fun unregisterSystemUiVisibility() {
val decorView = window.decorView
decorView.setOnSystemUiVisibilityChangeListener(null)
}
private fun setImmersiveFullscreen() {
val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
if (PreferenceUtil.getInstance().fullScreenMode) {
window.decorView.systemUiVisibility = flags
}
}
private fun exitFullscreen() {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
}
override fun run() {
setImmersiveFullscreen()
}
override fun onStop() {
handler.removeCallbacks(this)
super.onStop()
}
public override fun onDestroy() {
super.onDestroy()
unregisterSystemUiVisibility()
exitFullscreen()
}
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
handler.removeCallbacks(this)
handler.postDelayed(this, 500)
}
return super.onKeyDown(keyCode, event)
}
}

View file

@ -245,10 +245,10 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@NonNull
@Override
protected List<String> getSongPaths() {
ArrayList<Song> songs = AlbumLoader.getAlbum(this, getId()).blockingFirst().songs;
ArrayList<Song> songs = AlbumLoader.Companion.getAlbum(this, getId()).blockingFirst().getSongs();
ArrayList<String> paths = new ArrayList<>(songs.size());
for (Song song : songs) {
paths.add(song.data);
paths.add(song.getData());
}
return paths;
}

View file

@ -147,7 +147,7 @@ public class SongTagEditorActivity extends AbsTagEditorActivity implements TextW
@Override
protected List<String> getSongPaths() {
ArrayList<String> paths = new ArrayList<>(1);
paths.add(SongLoader.Companion.getSong(this, getId()).blockingFirst().data);
paths.add(SongLoader.INSTANCE.getSong(this, getId()).blockingFirst().getData());
return paths;
}

View file

@ -84,7 +84,7 @@ public class CollageSongAdapter extends RecyclerView.Adapter<CollageSongViewHold
Context context = itemView.getContext();
int color = ThemeStore.accentColor(context);
view.setOnClickListener(v -> {
MusicPlayerRemote.openQueue(dataSet, 0, true);
MusicPlayerRemote.INSTANCE.openQueue(dataSet, 0, true);
});
view.setBackgroundColor(color);
view.setTextColor(MaterialValueHelper.getPrimaryTextColor(context, ColorUtil.isColorLight(color)));
@ -96,7 +96,7 @@ public class CollageSongAdapter extends RecyclerView.Adapter<CollageSongViewHold
final int startPosition = i;
ImageView imageView = imageViews.get(i);
imageView.setOnClickListener(view -> {
MusicPlayerRemote.playNext(dataSet.get(startPosition));
MusicPlayerRemote.INSTANCE.playNext(dataSet.get(startPosition));
});
}
}

View file

@ -1,71 +0,0 @@
package code.name.monkey.retromusic.ui.adapter;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.model.Contributor;
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder;
import code.name.monkey.retromusic.views.NetworkImageView;
import static code.name.monkey.retromusic.util.RetroUtil.openUrl;
public class ContributorAdapter extends RecyclerView.Adapter<ContributorAdapter.ViewHolder> {
private List<Contributor> contributors = new ArrayList<>();
public ContributorAdapter(List<Contributor> contributors) {
this.contributors = contributors;
}
public ContributorAdapter() {
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_contributor, parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Contributor contributor = contributors.get(position);
holder.bindData(contributor);
}
@Override
public int getItemCount() {
return contributors.size();
}
public class ViewHolder extends MediaEntryViewHolder {
public ViewHolder(View itemView) {
super(itemView);
}
void bindData(Contributor contributor) {
if (title != null) {
title.setText(contributor.getName());
}
if (text != null) {
text.setText(contributor.getSummary());
}
if (image instanceof NetworkImageView) {
((NetworkImageView) image).setImageUrl(contributor.getProfileImage());
}
}
@Override
public void onClick(View v) {
super.onClick(v);
openUrl((Activity) v.getContext(), contributors.get(getAdapterPosition()).getLink());
}
}
}

View file

@ -0,0 +1,48 @@
package code.name.monkey.retromusic.ui.adapter
import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.model.Contributor
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.util.RetroUtil.openUrl
import code.name.monkey.retromusic.views.NetworkImageView
class ContributorAdapter(private var contributors: ArrayList<Contributor>) : RecyclerView.Adapter<ContributorAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_contributor, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val contributor = contributors[position]
holder.bindData(contributor)
}
override fun getItemCount(): Int {
return contributors.size
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
internal fun bindData(contributor: Contributor) {
if (title != null) {
title!!.text = contributor.name
}
if (text != null) {
text!!.text = contributor.summary
}
if (image is NetworkImageView) {
(image as NetworkImageView).setImageUrl(contributor.profileImage)
}
}
override fun onClick(v: View?) {
super.onClick(v)
openUrl(v!!.context as Activity, contributors[adapterPosition].link)
}
}
}

View file

@ -1,87 +0,0 @@
package code.name.monkey.retromusic.ui.adapter;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.Locale;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.model.Genre;
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder;
import code.name.monkey.retromusic.util.NavigationUtil;
/**
* @author Hemanth S (h4h13).
*/
public class GenreAdapter extends RecyclerView.Adapter<GenreAdapter.ViewHolder> {
private ArrayList<Genre> mGenres = new ArrayList<>();
private Activity mActivity;
private int mItemLayoutRes;
public GenreAdapter(@NonNull Activity activity, ArrayList<Genre> dataSet, int itemLayoutRes) {
mActivity = activity;
mGenres = dataSet;
mItemLayoutRes = itemLayoutRes;
}
public ArrayList<Genre> getDataSet() {
return mGenres;
}
@NonNull
@Override
public GenreAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(mActivity).inflate(mItemLayoutRes, parent, false));
}
@Override
public void onBindViewHolder(@NonNull GenreAdapter.ViewHolder holder, int position) {
Genre genre = mGenres.get(position);
if (holder.title != null) {
holder.title.setText(genre.name);
}
if (holder.text != null) {
holder.text.setText(String.format(Locale.getDefault(), "%d %s", genre.songCount, genre.songCount > 1 ?
mActivity.getString(R.string.songs) :
mActivity.getString(R.string.song)));
}
if (holder.separator != null) {
holder.separator.setVisibility(View.VISIBLE);
}
}
@Override
public int getItemCount() {
return mGenres.size();
}
public void swapDataSet(ArrayList<Genre> list) {
mGenres = list;
notifyDataSetChanged();
}
public class ViewHolder extends MediaEntryViewHolder {
public ViewHolder(View itemView) {
super(itemView);
if (menu != null) {
menu.setVisibility(View.GONE);
}
assert imageContainer != null;
imageContainer.setVisibility(View.GONE);
}
@Override
public void onClick(View v) {
super.onClick(v);
Genre genre = mGenres.get(getAdapterPosition());
NavigationUtil.goToGenre(mActivity, genre);
}
}
}

View file

@ -0,0 +1,73 @@
package code.name.monkey.retromusic.ui.adapter
import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import java.util.ArrayList
import java.util.Locale
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.util.NavigationUtil
/**
* @author Hemanth S (h4h13).
*/
class GenreAdapter(private val mActivity: Activity, dataSet: ArrayList<Genre>, private val mItemLayoutRes: Int) : RecyclerView.Adapter<GenreAdapter.ViewHolder>() {
var dataSet = ArrayList<Genre>()
private set
init {
this.dataSet = dataSet
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GenreAdapter.ViewHolder {
return ViewHolder(LayoutInflater.from(mActivity).inflate(mItemLayoutRes, parent, false))
}
override fun onBindViewHolder(holder: GenreAdapter.ViewHolder, position: Int) {
val genre = dataSet[position]
if (holder.title != null) {
holder.title!!.text = genre.name
}
if (holder.text != null) {
holder.text!!.text = String.format(Locale.getDefault(), "%d %s", genre.songCount, if (genre.songCount > 1)
mActivity.getString(R.string.songs)
else
mActivity.getString(R.string.song))
}
if (holder.separator != null) {
holder.separator!!.visibility = View.VISIBLE
}
}
override fun getItemCount(): Int {
return dataSet.size
}
fun swapDataSet(list: ArrayList<Genre>) {
dataSet = list
notifyDataSetChanged()
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init {
if (menu != null) {
menu!!.visibility = View.GONE
}
assert(imageContainer != null)
imageContainer!!.visibility = View.GONE
}
override fun onClick(v: View?) {
super.onClick(v)
val genre = dataSet[adapterPosition]
NavigationUtil.goToGenre(mActivity, genre)
}
}
}

View file

@ -1,163 +0,0 @@
package code.name.monkey.retromusic.ui.adapter;
import androidx.annotation.NonNull;
import androidx.core.util.Pair;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.List;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.glide.ArtistGlideRequest;
import code.name.monkey.retromusic.glide.SongGlideRequest;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.helper.menu.SongMenuHelper;
import code.name.monkey.retromusic.model.Album;
import code.name.monkey.retromusic.model.Artist;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder;
import code.name.monkey.retromusic.util.MusicUtil;
import code.name.monkey.retromusic.util.NavigationUtil;
public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder> {
private static final int HEADER = 0;
private static final int ALBUM = 1;
private static final int ARTIST = 2;
private static final int SONG = 3;
private final AppCompatActivity activity;
private List<Object> dataSet;
public SearchAdapter(@NonNull AppCompatActivity activity, @NonNull List<Object> dataSet) {
this.activity = activity;
this.dataSet = dataSet;
}
public void swapDataSet(@NonNull ArrayList<Object> dataSet) {
this.dataSet = dataSet;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if (dataSet.get(position) instanceof Album) return ALBUM;
if (dataSet.get(position) instanceof Artist) return ARTIST;
if (dataSet.get(position) instanceof Song) return SONG;
return HEADER;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == HEADER)
return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.sub_header, parent, false), viewType);
return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false), viewType);
}
@SuppressWarnings("ConstantConditions")
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case ALBUM:
final Album album = (Album) dataSet.get(position);
holder.title.setText(album.getTitle());
holder.text.setText(album.getArtistName());
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
.checkIgnoreMediaStore(activity).build()
.into(holder.image);
break;
case ARTIST:
final Artist artist = (Artist) dataSet.get(position);
holder.title.setText(artist.getName());
holder.text.setText(MusicUtil.getArtistInfoString(activity, artist));
ArtistGlideRequest.Builder.from(Glide.with(activity), artist)
.build().into(holder.image);
break;
case SONG:
final Song song = (Song) dataSet.get(position);
holder.title.setText(song.title);
holder.text.setText(song.albumName);
break;
default:
holder.title.setText(dataSet.get(position).toString());
holder.title.setTextColor(ThemeStore.accentColor(activity));
break;
}
}
@Override
public int getItemCount() {
return dataSet.size();
}
public class ViewHolder extends MediaEntryViewHolder {
public ViewHolder(@NonNull View itemView, int itemViewType) {
super(itemView);
itemView.setOnLongClickListener(null);
if (itemViewType != HEADER) {
if (separator != null) {
separator.setVisibility(View.GONE);
}
}
if (menu != null) {
if (itemViewType == SONG) {
menu.setVisibility(View.VISIBLE);
menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override
public Song getSong() {
return (Song) dataSet.get(getAdapterPosition());
}
});
} else {
menu.setVisibility(View.GONE);
}
}
switch (itemViewType) {
case ALBUM:
setImageTransitionName(activity.getString(R.string.transition_album_art));
break;
case ARTIST:
setImageTransitionName(activity.getString(R.string.transition_artist_image));
break;
default:
View container = itemView.findViewById(R.id.image_container);
if (container != null) {
container.setVisibility(View.GONE);
}
break;
}
}
@Override
public void onClick(View view) {
Object item = dataSet.get(getAdapterPosition());
switch (getItemViewType()) {
case ALBUM:
NavigationUtil.goToAlbum(activity,
((Album) item).getId(), Pair.create(image, activity.getResources().getString(R.string.transition_album_art)));
break;
case ARTIST:
NavigationUtil.goToArtist(activity,
((Artist) item).getId(), Pair.create(image, activity.getResources().getString(R.string.transition_artist_image)));
break;
case SONG:
ArrayList<Song> playList = new ArrayList<>();
playList.add((Song) item);
MusicPlayerRemote.openQueue(playList, 0, true);
break;
}
}
}
}

View file

@ -0,0 +1,132 @@
package code.name.monkey.retromusic.ui.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.core.util.Pair
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.glide.ArtistGlideRequest
import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil
import com.bumptech.glide.Glide
import java.util.*
class SearchAdapter(private val activity: AppCompatActivity, private var dataSet: List<Any>?) : RecyclerView.Adapter<SearchAdapter.ViewHolder>() {
fun swapDataSet(dataSet: ArrayList<Any>) {
this.dataSet = dataSet
notifyDataSetChanged()
}
override fun getItemViewType(position: Int): Int {
if (dataSet!![position] is Album) return ALBUM
if (dataSet!![position] is Artist) return ARTIST
return if (dataSet!![position] is Song) SONG else HEADER
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return if (viewType == HEADER) ViewHolder(LayoutInflater.from(activity).inflate(R.layout.sub_header, parent, false), viewType) else ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false), viewType)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
when (getItemViewType(position)) {
ALBUM -> {
val album = dataSet!![position] as Album
holder.title!!.text = album.title
holder.text!!.text = album.artistName
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
.checkIgnoreMediaStore(activity).build()
.into(holder.image!!)
}
ARTIST -> {
val artist = dataSet!![position] as Artist
holder.title!!.text = artist.name
holder.text!!.text = MusicUtil.getArtistInfoString(activity, artist)
ArtistGlideRequest.Builder.from(Glide.with(activity), artist)
.build().into(holder.image!!)
}
SONG -> {
val song = dataSet!![position] as Song
holder.title!!.text = song.title
holder.text!!.text = song.albumName
}
else -> {
holder.title!!.text = dataSet!![position].toString()
holder.title!!.setTextColor(ThemeStore.accentColor(activity))
}
}
}
override fun getItemCount(): Int {
return dataSet!!.size
}
inner class ViewHolder(itemView: View, itemViewType: Int) : MediaEntryViewHolder(itemView) {
init {
itemView.setOnLongClickListener(null)
if (itemViewType != HEADER) {
if (separator != null) {
separator!!.visibility = View.GONE
}
}
if (menu != null) {
if (itemViewType == SONG) {
menu!!.visibility = View.VISIBLE
menu!!.setOnClickListener(object : SongMenuHelper.OnClickSongMenu(activity) {
override val song: Song
get() = dataSet!![adapterPosition] as Song
})
} else {
menu!!.visibility = View.GONE
}
}
when (itemViewType) {
ALBUM -> setImageTransitionName(activity.getString(R.string.transition_album_art))
ARTIST -> setImageTransitionName(activity.getString(R.string.transition_artist_image))
else -> {
val container = itemView.findViewById<View>(R.id.image_container)
if (container != null) {
container.visibility = View.GONE
}
}
}
}
override fun onClick(v: View?) {
val item = dataSet!![adapterPosition]
when (itemViewType) {
ALBUM -> NavigationUtil.goToAlbum(activity,
(item as Album).id, Pair.create(image, activity.resources.getString(R.string.transition_album_art)))
ARTIST -> NavigationUtil.goToArtist(activity,
(item as Artist).id, Pair.create(image, activity.resources.getString(R.string.transition_artist_image)))
SONG -> {
val playList = ArrayList<Song>()
playList.add(item as Song)
MusicPlayerRemote.openQueue(playList, 0, true)
}
}
}
}
companion object {
private val HEADER = 0
private val ALBUM = 1
private val ARTIST = 2
private val SONG = 3
}
}

View file

@ -1,215 +0,0 @@
package code.name.monkey.retromusic.ui.adapter;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.signature.MediaStoreSignature;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import code.name.monkey.appthemehelper.util.ATHUtil;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter;
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder;
import code.name.monkey.retromusic.util.RetroUtil;
public class SongFileAdapter extends AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File> implements FastScrollRecyclerView.SectionedAdapter {
private static final int FILE = 0;
private static final int FOLDER = 1;
private final AppCompatActivity activity;
private final int itemLayoutRes;
@Nullable
private final Callbacks callbacks;
private List<File> dataSet;
public SongFileAdapter(@NonNull AppCompatActivity activity, @NonNull List<File> songFiles, @LayoutRes int itemLayoutRes, @Nullable Callbacks callback, @Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity;
this.dataSet = songFiles;
this.itemLayoutRes = itemLayoutRes;
this.callbacks = callback;
setHasStableIds(true);
}
public static String readableFileSize(long size) {
if (size <= 0) return size + " B";
final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.##").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
@Override
public int getItemViewType(int position) {
return dataSet.get(position).isDirectory() ? FOLDER : FILE;
}
@Override
public long getItemId(int position) {
return dataSet.get(position).hashCode();
}
public void swapDataSet(@NonNull List<File> songFiles) {
this.dataSet = songFiles;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false));
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int index) {
final File file = dataSet.get(index);
holder.itemView.setActivated(isChecked(file));
if (holder.getAdapterPosition() == getItemCount() - 1) {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.GONE);
}
} else {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.VISIBLE);
}
}
if (holder.title != null) {
holder.title.setText(getFileTitle(file));
}
if (holder.text != null) {
if (holder.getItemViewType() == FILE) {
holder.text.setText(getFileText(file));
} else {
holder.text.setVisibility(View.GONE);
}
}
if (holder.image != null) {
loadFileImage(file, holder);
}
}
protected String getFileTitle(File file) {
return file.getName();
}
protected String getFileText(File file) {
return file.isDirectory() ? null : readableFileSize(file.length());
}
@SuppressWarnings("ConstantConditions")
protected void loadFileImage(File file, final ViewHolder holder) {
final int iconColor = ATHUtil.resolveColor(activity, R.attr.iconColor);
if (file.isDirectory()) {
holder.image.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN);
holder.image.setImageResource(R.drawable.ic_folder_white_24dp);
} else {
Drawable error = RetroUtil.getTintedVectorDrawable(activity, R.drawable.ic_file_music_white_24dp, iconColor);
Glide.with(activity)
.load(new AudioFileCover(file.getPath()))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(error)
.placeholder(error)
.animate(android.R.anim.fade_in)
.signature(new MediaStoreSignature("", file.lastModified(), 0))
.into(holder.image);
}
}
@Override
public int getItemCount() {
return dataSet.size();
}
@Override
protected File getIdentifier(int position) {
return dataSet.get(position);
}
@Override
protected String getName(File object) {
return getFileTitle(object);
}
@Override
protected void onMultipleItemAction(MenuItem menuItem, ArrayList<File> selection) {
if (callbacks == null) return;
callbacks.onMultipleItemAction(menuItem, selection);
}
@NonNull
@Override
public String getSectionName(int position) {
return String.valueOf(dataSet.get(position).getName().charAt(0)).toUpperCase();
}
public interface Callbacks {
void onFileSelected(File file);
void onFileMenuClicked(File file, View view);
void onMultipleItemAction(MenuItem item, ArrayList<File> files);
}
public class ViewHolder extends MediaEntryViewHolder {
public ViewHolder(View itemView) {
super(itemView);
if (menu != null && callbacks != null) {
menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (isPositionInRange(position)) {
callbacks.onFileMenuClicked(dataSet.get(position), v);
}
}
});
}
}
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (isPositionInRange(position)) {
if (isInQuickSelectMode()) {
toggleChecked(position);
} else {
if (callbacks != null) {
callbacks.onFileSelected(dataSet.get(position));
}
}
}
}
@Override
public boolean onLongClick(View view) {
int position = getAdapterPosition();
return isPositionInRange(position) && toggleChecked(position);
}
private boolean isPositionInRange(int position) {
return position >= 0 && position < dataSet.size();
}
}
}

View file

@ -0,0 +1,180 @@
package code.name.monkey.retromusic.ui.adapter
import android.graphics.PorterDuff
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.util.RetroUtil
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.signature.MediaStoreSignature
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import java.io.File
import java.text.DecimalFormat
import java.util.*
class SongFileAdapter(private val activity: AppCompatActivity, private var dataSet: List<File>?, @param:LayoutRes private val itemLayoutRes: Int, private val callbacks: Callbacks?, cabHolder: CabHolder?) : AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File>(activity, cabHolder, R.menu.menu_media_selection), FastScrollRecyclerView.SectionedAdapter {
init {
this.setHasStableIds(true)
}
override fun getItemViewType(position: Int): Int {
return if (dataSet!![position].isDirectory) FOLDER else FILE
}
override fun getItemId(position: Int): Long {
return dataSet!![position].hashCode().toLong()
}
fun swapDataSet(songFiles: List<File>) {
this.dataSet = songFiles
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, index: Int) {
val file = dataSet!![index]
holder.itemView.isActivated = isChecked(file)
if (holder.adapterPosition == itemCount - 1) {
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.GONE
}
} else {
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.VISIBLE
}
}
if (holder.title != null) {
holder.title!!.text = getFileTitle(file)
}
if (holder.text != null) {
if (holder.itemViewType == FILE) {
holder.text!!.text = getFileText(file)
} else {
holder.text!!.visibility = View.GONE
}
}
if (holder.image != null) {
loadFileImage(file, holder)
}
}
private fun getFileTitle(file: File): String {
return file.name
}
private fun getFileText(file: File): String? {
return if (file.isDirectory) null else readableFileSize(file.length())
}
private fun loadFileImage(file: File, holder: ViewHolder) {
val iconColor = ATHUtil.resolveColor(activity, R.attr.iconColor)
if (file.isDirectory) {
holder.image!!.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN)
holder.image!!.setImageResource(R.drawable.ic_folder_white_24dp)
} else {
val error = RetroUtil.getTintedVectorDrawable(activity, R.drawable.ic_file_music_white_24dp, iconColor)
Glide.with(activity)
.load(AudioFileCover(file.path))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(error)
.placeholder(error)
.animate(android.R.anim.fade_in)
.signature(MediaStoreSignature("", file.lastModified(), 0))
.into(holder.image!!)
}
}
override fun getItemCount(): Int {
return dataSet!!.size
}
override fun getIdentifier(position: Int): File? {
return dataSet!![position]
}
override fun getName(`object`: File): String {
return getFileTitle(`object`)
}
override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList<File>) {
if (callbacks == null) return
callbacks.onMultipleItemAction(menuItem, selection)
}
override fun getSectionName(position: Int): String {
return dataSet!![position].name[0].toString().toUpperCase()
}
interface Callbacks {
fun onFileSelected(file: File)
fun onFileMenuClicked(file: File, view: View)
fun onMultipleItemAction(item: MenuItem, files: ArrayList<File>)
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init {
if (menu != null && callbacks != null) {
menu!!.setOnClickListener { v ->
val position = adapterPosition
if (isPositionInRange(position)) {
callbacks.onFileMenuClicked(dataSet!![position], v)
}
}
}
}
override fun onClick(v: View?) {
val position = adapterPosition
if (isPositionInRange(position)) {
if (isInQuickSelectMode) {
toggleChecked(position)
} else {
callbacks?.onFileSelected(dataSet!![position])
}
}
}
override fun onLongClick(v: View?): Boolean {
val position = adapterPosition
return isPositionInRange(position) && toggleChecked(position)
}
private fun isPositionInRange(position: Int): Boolean {
return position >= 0 && position < dataSet!!.size
}
}
companion object {
private const val FILE = 0
private const val FOLDER = 1
fun readableFileSize(size: Long): String {
if (size <= 0) return size.toString() + " B"
val units = arrayOf("B", "KB", "MB", "GB", "TB")
val digitGroups = (Math.log10(size.toDouble()) / Math.log10(1024.0)).toInt()
return DecimalFormat("#,##0.##").format(size / Math.pow(1024.0, digitGroups.toDouble())) + " " + units[digitGroups]
}
}
}

View file

@ -1,249 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.album;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.bumptech.glide.Glide;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.util.Pair;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.appthemehelper.util.MaterialValueHelper;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget;
import code.name.monkey.retromusic.glide.SongGlideRequest;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.helper.SortOrder;
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.model.Album;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter;
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder;
import code.name.monkey.retromusic.util.MusicUtil;
import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.util.PreferenceUtil;
public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder, Album> implements
FastScrollRecyclerView.SectionedAdapter {
public static final String TAG = AlbumAdapter.class.getSimpleName();
protected final AppCompatActivity activity;
protected ArrayList<Album> dataSet;
protected int itemLayoutRes;
protected boolean usePalette = false;
public AlbumAdapter(@NonNull AppCompatActivity activity, ArrayList<Album> dataSet,
@LayoutRes int itemLayoutRes, boolean usePalette,
@Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity;
this.dataSet = dataSet;
this.itemLayoutRes = itemLayoutRes;
this.usePalette = usePalette;
setHasStableIds(true);
}
public void useItemLayout(int itemLayoutRes) {
this.itemLayoutRes = itemLayoutRes;
notifyDataSetChanged();
}
public void usePalette(boolean usePalette) {
this.usePalette = usePalette;
notifyDataSetChanged();
}
public void swapDataSet(ArrayList<Album> dataSet) {
this.dataSet = dataSet;
notifyDataSetChanged();
}
public ArrayList<Album> getDataSet() {
return dataSet;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false);
return createViewHolder(view, viewType);
}
protected ViewHolder createViewHolder(View view, int viewType) {
return new ViewHolder(view);
}
private String getAlbumTitle(Album album) {
return album.getTitle();
}
protected String getAlbumText(Album album) {
return album.getArtistName();
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Album album = dataSet.get(position);
final boolean isChecked = isChecked(album);
holder.itemView.setActivated(isChecked);
if (holder.getAdapterPosition() == getItemCount() - 1) {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.GONE);
}
} else {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.VISIBLE);
}
}
if (holder.title != null) {
holder.title.setText(getAlbumTitle(album));
}
if (holder.text != null) {
holder.text.setText(getAlbumText(album));
}
if (holder.playSongs != null) {
holder.playSongs.setOnClickListener(v -> MusicPlayerRemote.openQueue(album.songs, 0, true));
}
loadAlbumCover(album, holder);
}
protected void setColors(int color, ViewHolder holder) {
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setBackgroundColor(color);
if (holder.title != null) {
holder.title.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)));
}
if (holder.text != null) {
holder.text.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color)));
}
}
if (holder.mask != null) {
holder.mask.setBackgroundTintList(ColorStateList.valueOf(color));
}
}
protected void loadAlbumCover(Album album, final ViewHolder holder) {
if (holder.image == null) {
return;
}
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
.into(new RetroMusicColoredTarget(holder.image) {
@Override
public void onLoadCleared(Drawable placeholder) {
super.onLoadCleared(placeholder);
setColors(getDefaultFooterColor(), holder);
}
@Override
public void onColorReady(int color) {
setColors(color, holder);
}
});
}
@Override
public int getItemCount() {
return dataSet.size();
}
@Override
public long getItemId(int position) {
return dataSet.get(position).getId();
}
@Override
protected Album getIdentifier(int position) {
return dataSet.get(position);
}
@Override
protected String getName(Album album) {
return album.getTitle();
}
@Override
protected void onMultipleItemAction(@NonNull MenuItem menuItem,
@NonNull ArrayList<Album> selection) {
SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.getItemId());
}
@NonNull
private ArrayList<Song> getSongList(@NonNull List<Album> albums) {
final ArrayList<Song> songs = new ArrayList<>();
for (Album album : albums) {
songs.addAll(album.songs);
}
return songs;
}
@NonNull
@Override
public String getSectionName(int position) {
@Nullable String sectionName = null;
switch (PreferenceUtil.getInstance().getAlbumSortOrder()) {
case SortOrder.AlbumSortOrder.ALBUM_A_Z:
case SortOrder.AlbumSortOrder.ALBUM_Z_A:
sectionName = dataSet.get(position).getTitle();
break;
case SortOrder.AlbumSortOrder.ALBUM_ARTIST:
sectionName = dataSet.get(position).getArtistName();
break;
case SortOrder.AlbumSortOrder.ALBUM_YEAR:
return MusicUtil.getYearString(dataSet.get(position).getYear());
}
return MusicUtil.getSectionName(sectionName);
}
public class ViewHolder extends MediaEntryViewHolder {
public ViewHolder(@NonNull final View itemView) {
super(itemView);
setImageTransitionName(activity.getString(R.string.transition_album_art));
if (menu != null) {
menu.setVisibility(View.GONE);
}
}
@Override
public void onClick(View v) {
if (isInQuickSelectMode()) {
toggleChecked(getAdapterPosition());
} else {
Pair[] albumPairs = new Pair[]{Pair.create(image, activity.getResources().getString(R.string.transition_album_art))};
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).getId(), albumPairs);
}
}
@Override
public boolean onLongClick(View view) {
toggleChecked(getAdapterPosition());
return true;
}
}
}

View file

@ -0,0 +1,214 @@
package code.name.monkey.retromusic.ui.adapter.album
import android.content.res.ColorStateList
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.util.Pair
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import java.util.*
open class AlbumAdapter(protected val activity: AppCompatActivity,
dataSet: ArrayList<Album>,
@param:LayoutRes protected var itemLayoutRes: Int,
usePalette: Boolean,
cabHolder: CabHolder?) : AbsMultiSelectAdapter<AlbumAdapter.ViewHolder, Album>(activity, cabHolder, R.menu.menu_media_selection), FastScrollRecyclerView.SectionedAdapter {
var dataSet: ArrayList<Album>
protected set
protected var usePalette = false
init {
this.dataSet = dataSet
this.usePalette = usePalette
this.setHasStableIds(true)
}
fun useItemLayout(itemLayoutRes: Int) {
this.itemLayoutRes = itemLayoutRes
notifyDataSetChanged()
}
fun usePalette(usePalette: Boolean) {
this.usePalette = usePalette
notifyDataSetChanged()
}
fun swapDataSet(dataSet: ArrayList<Album>) {
this.dataSet = dataSet
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)
return createViewHolder(view, viewType)
}
protected open fun createViewHolder(view: View, viewType: Int): ViewHolder {
return ViewHolder(view)
}
private fun getAlbumTitle(album: Album): String? {
return album.title
}
protected open fun getAlbumText(album: Album): String? {
return album.artistName
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val album = dataSet[position]
val isChecked = isChecked(album)
holder.itemView.isActivated = isChecked
if (holder.adapterPosition == itemCount - 1) {
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.GONE
}
} else {
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.VISIBLE
}
}
if (holder.title != null) {
holder.title!!.text = getAlbumTitle(album)
}
if (holder.text != null) {
holder.text!!.text = getAlbumText(album)
}
if (holder.playSongs != null) {
holder.playSongs!!.setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) }
}
loadAlbumCover(album, holder)
}
protected open fun setColors(color: Int, holder: ViewHolder) {
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer!!.setBackgroundColor(color)
if (holder.title != null) {
holder.title!!.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)))
}
if (holder.text != null) {
holder.text!!.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color)))
}
}
if (holder.mask != null) {
holder.mask!!.backgroundTintList = ColorStateList.valueOf(color)
}
}
protected open fun loadAlbumCover(album: Album, holder: ViewHolder) {
if (holder.image == null) {
return
}
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onLoadCleared(placeholder: Drawable?) {
super.onLoadCleared(placeholder)
setColors(defaultFooterColor, holder)
}
override fun onColorReady(color: Int) {
setColors(color, holder)
}
})
}
override fun getItemCount(): Int {
return dataSet.size
}
override fun getItemId(position: Int): Long {
return dataSet[position].id.toLong()
}
override fun getIdentifier(position: Int): Album? {
return dataSet[position]
}
override fun getName(album: Album): String {
return album.title!!
}
override fun onMultipleItemAction(menuItem: MenuItem,
selection: ArrayList<Album>) {
SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId)
}
private fun getSongList(albums: List<Album>): ArrayList<Song> {
val songs = ArrayList<Song>()
for (album in albums) {
songs.addAll(album.songs!!)
}
return songs
}
override fun getSectionName(position: Int): String {
var sectionName: String? = null
when (PreferenceUtil.getInstance().albumSortOrder) {
SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName = dataSet[position].title
SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].artistName
SortOrder.AlbumSortOrder.ALBUM_YEAR -> return MusicUtil.getYearString(dataSet[position].year)
}
return MusicUtil.getSectionName(sectionName)
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init {
setImageTransitionName(activity.getString(R.string.transition_album_art))
if (menu != null) {
menu!!.visibility = View.GONE
}
}
override fun onClick(v: View?) {
super.onClick(v)
if (isInQuickSelectMode) {
toggleChecked(adapterPosition)
} else {
val albumPairs = arrayOf<Pair<*, *>>(Pair.create(image, activity.resources.getString(R.string.transition_album_art)))
NavigationUtil.goToAlbum(activity, dataSet[adapterPosition].id, *albumPairs)
}
}
override fun onLongClick(v: View?): Boolean {
toggleChecked(adapterPosition)
return super.onLongClick(v)
}
}
companion object {
val TAG = AlbumAdapter::class.java.simpleName
}
}

View file

@ -1,200 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.album;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget;
import code.name.monkey.retromusic.glide.SongGlideRequest;
import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.ui.activities.LyricsActivity;
import code.name.monkey.retromusic.util.PreferenceUtil;
public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter {
public static final String TAG = AlbumCoverPagerAdapter.class.getSimpleName();
private ArrayList<Song> dataSet;
private AlbumCoverFragment.ColorReceiver currentColorReceiver;
private int currentColorReceiverPosition = -1;
public AlbumCoverPagerAdapter(FragmentManager fm, ArrayList<Song> dataSet) {
super(fm);
this.dataSet = dataSet;
}
@Override
public Fragment getItem(final int position) {
return AlbumCoverFragment.newInstance(dataSet.get(position));
}
@Override
public int getCount() {
return dataSet.size();
}
@NonNull
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object o = super.instantiateItem(container, position);
if (currentColorReceiver != null && currentColorReceiverPosition == position) {
receiveColor(currentColorReceiver, currentColorReceiverPosition);
}
return o;
}
/**
* Only the latest passed {@link AlbumCoverFragment.ColorReceiver} is guaranteed to receive a
* response
*/
public void receiveColor(AlbumCoverFragment.ColorReceiver colorReceiver, int position) {
AlbumCoverFragment fragment = (AlbumCoverFragment) getFragment(position);
if (fragment != null) {
currentColorReceiver = null;
currentColorReceiverPosition = -1;
fragment.receiveColor(colorReceiver, position);
} else {
currentColorReceiver = colorReceiver;
currentColorReceiverPosition = position;
}
}
public static class AlbumCoverFragment extends Fragment {
private static final String SONG_ARG = "song";
@BindView(R.id.player_image)
ImageView albumCover;
private Unbinder unbinder;
private boolean isColorReady;
private int color;
private Song song;
private ColorReceiver colorReceiver;
private int request;
public static AlbumCoverFragment newInstance(final Song song) {
AlbumCoverFragment frag = new AlbumCoverFragment();
final Bundle args = new Bundle();
args.putParcelable(SONG_ARG, song);
frag.setArguments(args);
return frag;
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
song = getArguments().getParcelable(SONG_ARG);
}
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
int layout = getLayout();
View view = inflater.inflate(layout, container, false);
unbinder = ButterKnife.bind(this, view);
return view;
}
private int getLayout() {
int layout;
switch (PreferenceUtil.getInstance().getAlbumCoverStyle()) {
default:
case NORMAL:
layout = R.layout.fragment_album_cover;
break;
case FLAT:
layout = R.layout.fragment_album_flat_cover;
break;
case CIRCLE:
layout = R.layout.fragment_album_circle_cover;
break;
case CARD:
layout = R.layout.fragment_album_card_cover;
break;
case MATERIAL:
layout = R.layout.fragment_album_material_cover;
break;
case FULL:
layout = R.layout.fragment_album_full_cover;
break;
case FULL_CARD:
layout = R.layout.fragment_album_full_card_cover;
break;
}
return layout;
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
loadAlbumCover();
}
@OnClick(R.id.player_image)
void showLyrics() {
startActivity(new Intent(getContext(), LyricsActivity.class));
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
colorReceiver = null;
}
private void loadAlbumCover() {
SongGlideRequest.Builder.from(Glide.with(getContext()), song)
.checkIgnoreMediaStore(getActivity())
.generatePalette(getActivity()).build()
.into(new RetroMusicColoredTarget(albumCover) {
@Override
public void onColorReady(int color) {
setColor(color);
}
});
}
private void setColor(int color) {
this.color = color;
isColorReady = true;
if (colorReceiver != null) {
colorReceiver.onColorReady(color, request);
colorReceiver = null;
}
}
void receiveColor(ColorReceiver colorReceiver, int request) {
if (isColorReady) {
colorReceiver.onColorReady(color, request);
} else {
this.colorReceiver = colorReceiver;
this.request = request;
}
}
public interface ColorReceiver {
void onColorReady(int color, int request);
}
}
}

View file

@ -0,0 +1,172 @@
package code.name.monkey.retromusic.ui.adapter.album
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.ui.activities.LyricsActivity
import code.name.monkey.retromusic.ui.fragments.AlbumCoverStyle
import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide
import java.util.*
class AlbumCoverPagerAdapter(fm: FragmentManager, private val dataSet: ArrayList<Song>) : CustomFragmentStatePagerAdapter(fm) {
private var currentColorReceiver: AlbumCoverFragment.ColorReceiver? = null
private var currentColorReceiverPosition = -1
override fun getItem(position: Int): Fragment {
return AlbumCoverFragment.newInstance(dataSet[position])
}
override fun getCount(): Int {
return dataSet.size
}
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val o = super.instantiateItem(container, position)
if (currentColorReceiver != null && currentColorReceiverPosition == position) {
receiveColor(currentColorReceiver!!, currentColorReceiverPosition)
}
return o
}
/**
* Only the latest passed [AlbumCoverFragment.ColorReceiver] is guaranteed to receive a
* response
*/
fun receiveColor(colorReceiver: AlbumCoverFragment.ColorReceiver, position: Int) {
if (getFragment(position) is AlbumCoverFragment) {
val fragment = getFragment(position) as AlbumCoverFragment
currentColorReceiver = null
currentColorReceiverPosition = -1
fragment.receiveColor(colorReceiver, position)
} else {
currentColorReceiver = colorReceiver
currentColorReceiverPosition = position
}
/*val fragment = getFragment(position) as AlbumCoverFragment
if (fragment != null) {
currentColorReceiver = null
currentColorReceiverPosition = -1
fragment.receiveColor(colorReceiver, position)
} else {
currentColorReceiver = colorReceiver
currentColorReceiverPosition = position
}*/
}
class AlbumCoverFragment : Fragment() {
lateinit var albumCover: ImageView
private var isColorReady: Boolean = false
private var color: Int = 0
private var song: Song? = null
private var colorReceiver: ColorReceiver? = null
private var request: Int = 0
private val layout: Int
get() {
return when (PreferenceUtil.getInstance().albumCoverStyle) {
AlbumCoverStyle.NORMAL -> R.layout.fragment_album_cover
AlbumCoverStyle.FLAT -> R.layout.fragment_album_flat_cover
AlbumCoverStyle.CIRCLE -> R.layout.fragment_album_circle_cover
AlbumCoverStyle.CARD -> R.layout.fragment_album_card_cover
AlbumCoverStyle.MATERIAL -> R.layout.fragment_album_material_cover
AlbumCoverStyle.FULL -> R.layout.fragment_album_full_cover
AlbumCoverStyle.FULL_CARD -> R.layout.fragment_album_full_card_cover
else -> R.layout.fragment_album_cover
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null) {
song = arguments!!.getParcelable(SONG_ARG)
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val layout = layout
val view = inflater.inflate(layout, container, false)
albumCover = view.findViewById(R.id.player_image)
albumCover.setOnClickListener { startActivity(Intent(context, LyricsActivity::class.java)) }
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
loadAlbumCover()
}
override fun onDestroyView() {
super.onDestroyView()
colorReceiver = null
}
private fun loadAlbumCover() {
SongGlideRequest.Builder.from(Glide.with(context), song)
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
.into(object : RetroMusicColoredTarget(albumCover) {
override fun onColorReady(color: Int) {
setColor(color)
}
})
}
private fun setColor(color: Int) {
this.color = color
isColorReady = true
if (colorReceiver != null) {
colorReceiver!!.onColorReady(color, request)
colorReceiver = null
}
}
internal fun receiveColor(colorReceiver: ColorReceiver, request: Int) {
if (isColorReady) {
colorReceiver.onColorReady(color, request)
} else {
this.colorReceiver = colorReceiver
this.request = request
}
}
interface ColorReceiver {
fun onColorReady(color: Int, request: Int)
}
companion object {
private const val SONG_ARG = "song"
fun newInstance(song: Song): AlbumCoverFragment {
val frag = AlbumCoverFragment()
val args = Bundle()
args.putParcelable(SONG_ARG, song)
frag.arguments = args
return frag
}
}
}
companion object {
val TAG: String = AlbumCoverPagerAdapter::class.java.simpleName
}
}

View file

@ -1,151 +0,0 @@
/*
* Copyright (C) 2017. Alexander Bilchuk <a.bilchuk@sandrlab.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package code.name.monkey.retromusic.ui.adapter.album;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import androidx.annotation.NonNull;
import androidx.core.util.Pair;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.List;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget;
import code.name.monkey.retromusic.glide.SongGlideRequest;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.model.Album;
import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.views.MetalRecyclerViewPager;
public class AlbumFullWithAdapter extends
MetalRecyclerViewPager.MetalAdapter<AlbumFullWithAdapter.FullMetalViewHolder> {
private Activity activity;
private List<Album> dataSet = new ArrayList<>();
public AlbumFullWithAdapter(@NonNull Activity activity,
@NonNull DisplayMetrics metrics) {
super(metrics);
this.activity = activity;
}
public void swapData(ArrayList<Album> list) {
dataSet = list;
notifyDataSetChanged();
}
@NonNull
@Override
public FullMetalViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View viewItem = LayoutInflater.from(parent.getContext())
.inflate(R.layout.pager_item, parent, false);
return new FullMetalViewHolder(viewItem);
}
private Bitmap combineImageIntoOne(ArrayList<Bitmap> bitmap) {
int w = 0, h = 0;
for (int i = 0; i < bitmap.size(); i++) {
if (i < bitmap.size() - 1) {
h = bitmap.get(i).getWidth() > bitmap.get(i + 1).getWidth() ? bitmap.get(i).getWidth()
: bitmap.get(i + 1).getWidth();
}
w += bitmap.get(i).getHeight();
}
Bitmap temp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(temp);
int top = 0, left = 0;
for (int i = 0; i < bitmap.size(); i++) {
Log.d("HTML", "Combine: " + i + "/" + bitmap.size() + 1);
top = (i == 0 ? 0 : top + bitmap.get(i).getHeight());
left = (i == 0 ? 0 : top + bitmap.get(i).getWidth());
canvas.drawBitmap(bitmap.get(i), left, 0f, null);
}
return temp;
}
@Override
public void onBindViewHolder(@NonNull FullMetalViewHolder holder, int position) {
// don't forget about calling supper.onBindViewHolder!
super.onBindViewHolder(holder, position);
final Album album = dataSet.get(position);
if (holder.title != null) {
holder.title.setText(getAlbumTitle(album));
}
if (holder.text != null) {
holder.text.setText(getAlbumText(album));
}
if (holder.playSongs != null) {
holder.playSongs.setOnClickListener(v -> MusicPlayerRemote.openQueue(album.songs, 0, true));
}
loadAlbumCover(album, holder);
}
private String getAlbumTitle(Album album) {
return album.getTitle();
}
private String getAlbumText(Album album) {
return album.getArtistName();
}
private void loadAlbumCover(Album album, FullMetalViewHolder holder) {
if (holder.image == null) {
return;
}
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
.into(new RetroMusicColoredTarget(holder.image) {
@Override
public void onColorReady(int color) {
}
});
}
@Override
public int getItemCount() {
return dataSet.size();
}
class FullMetalViewHolder extends MetalRecyclerViewPager.MetalViewHolder {
FullMetalViewHolder(View itemView) {
super(itemView);
}
@Override
public void onClick(View v) {
Pair[] albumPairs = new Pair[]{
Pair.create(image, activity.getResources().getString(R.string.transition_album_art))};
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).getId(), albumPairs);
}
}
}

View file

@ -0,0 +1,105 @@
/*
* Copyright (C) 2017. Alexander Bilchuk <a.bilchuk@sandrlab.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package code.name.monkey.retromusic.ui.adapter.album
import android.app.Activity
import android.graphics.Bitmap
import android.graphics.Canvas
import android.util.DisplayMetrics
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.core.util.Pair
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.views.MetalRecyclerViewPager
import com.bumptech.glide.Glide
import java.util.*
class AlbumFullWithAdapter(private val activity: Activity,
metrics: DisplayMetrics) : MetalRecyclerViewPager.MetalAdapter<AlbumFullWithAdapter.FullMetalViewHolder>(metrics) {
private var dataSet: List<Album> = ArrayList()
fun swapData(list: ArrayList<Album>) {
dataSet = list
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FullMetalViewHolder {
val viewItem = LayoutInflater.from(parent.context)
.inflate(R.layout.pager_item, parent, false)
return FullMetalViewHolder(viewItem)
}
override fun onBindViewHolder(holder: FullMetalViewHolder, position: Int) {
// don't forget about calling supper.onBindViewHolder!
super.onBindViewHolder(holder, position)
val album = dataSet[position]
if (holder.title != null) {
holder.title!!.text = getAlbumTitle(album)
}
if (holder.text != null) {
holder.text!!.text = getAlbumText(album)
}
if (holder.playSongs != null) {
holder.playSongs!!.setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) }
}
loadAlbumCover(album, holder)
}
private fun getAlbumTitle(album: Album): String? {
return album.title
}
private fun getAlbumText(album: Album): String? {
return album.artistName
}
private fun loadAlbumCover(album: Album, holder: FullMetalViewHolder) {
if (holder.image == null) {
return
}
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(color: Int) {
}
})
}
override fun getItemCount(): Int {
return dataSet.size
}
inner class FullMetalViewHolder(itemView: View) : MetalRecyclerViewPager.MetalViewHolder(itemView) {
override fun onClick(v: View?) {
val albumPairs = arrayOf<Pair<*, *>>(Pair.create<ImageView, String>(image, activity.resources.getString(R.string.transition_album_art)))
NavigationUtil.goToAlbum(activity, dataSet[adapterPosition].id, *albumPairs)
}
}
}

View file

@ -1,83 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.album;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.appthemehelper.util.MaterialValueHelper;
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget;
import code.name.monkey.retromusic.glide.SongGlideRequest;
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.model.Album;
import code.name.monkey.retromusic.util.MusicUtil;
public class HorizontalAlbumAdapter extends AlbumAdapter {
public static final String TAG = AlbumAdapter.class.getSimpleName();
public HorizontalAlbumAdapter(@NonNull AppCompatActivity activity, ArrayList<Album> dataSet, boolean usePalette, @Nullable CabHolder cabHolder) {
super(activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, usePalette, cabHolder);
}
@Override
protected ViewHolder createViewHolder(View view, int viewType) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
HorizontalAdapterHelper.applyMarginToLayoutParams(activity, params, viewType);
return new ViewHolder(view);
}
@Override
protected void setColors(int color, ViewHolder holder) {
if (holder.itemView != null) {
if (holder.title != null) {
holder.title.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)));
}
if (holder.text != null) {
holder.text.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color)));
}
}
}
@Override
protected void loadAlbumCover(Album album, final ViewHolder holder) {
if (holder.image == null) return;
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
.into(new RetroMusicColoredTarget(holder.image) {
@Override
public void onLoadCleared(Drawable placeholder) {
super.onLoadCleared(placeholder);
setColors(getAlbumArtistFooterColor(), holder);
}
@Override
public void onColorReady(int color) {
if (usePalette)
setColors(color, holder);
else
setColors(getAlbumArtistFooterColor(), holder);
}
});
}
@Override
protected String getAlbumText(Album album) {
return MusicUtil.getYearString(album.getYear());
}
@Override
public int getItemViewType(int position) {
return HorizontalAdapterHelper.getItemViewtype(position, getItemCount());
}
}

View file

@ -0,0 +1,68 @@
package code.name.monkey.retromusic.ui.adapter.album
import android.graphics.drawable.Drawable
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.util.MusicUtil
import com.bumptech.glide.Glide
import java.util.*
class HorizontalAlbumAdapter(activity: AppCompatActivity, dataSet: ArrayList<Album>, usePalette: Boolean, cabHolder: CabHolder?) : AlbumAdapter(activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, usePalette, cabHolder) {
override fun createViewHolder(view: View, viewType: Int): ViewHolder {
val params = view.layoutParams as ViewGroup.MarginLayoutParams
HorizontalAdapterHelper.applyMarginToLayoutParams(activity, params, viewType)
return ViewHolder(view)
}
override fun setColors(color: Int, holder: ViewHolder) {
if (holder.title != null) {
holder.title!!.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)))
}
if (holder.text != null) {
holder.text!!.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color)))
}
}
override fun loadAlbumCover(album: Album, holder: ViewHolder) {
if (holder.image == null) return
SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong())
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onLoadCleared(placeholder: Drawable?) {
super.onLoadCleared(placeholder)
setColors(albumArtistFooterColor, holder)
}
override fun onColorReady(color: Int) {
if (usePalette)
setColors(color, holder)
else
setColors(albumArtistFooterColor, holder)
}
})
}
override fun getAlbumText(album: Album): String? {
return MusicUtil.getYearString(album.year)
}
override fun getItemViewType(position: Int): Int {
return HorizontalAdapterHelper.getItemViewtype(position, itemCount)
}
companion object {
val TAG: String = AlbumAdapter::class.java.simpleName
}
}

View file

@ -1,201 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.artist;
import android.content.res.ColorStateList;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.bumptech.glide.Glide;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.util.Pair;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.appthemehelper.util.MaterialValueHelper;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.glide.ArtistGlideRequest;
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget;
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.model.Artist;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter;
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder;
import code.name.monkey.retromusic.util.MusicUtil;
import code.name.monkey.retromusic.util.NavigationUtil;
public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist> implements FastScrollRecyclerView.SectionedAdapter {
protected final AppCompatActivity activity;
protected ArrayList<Artist> dataSet;
protected int itemLayoutRes;
protected boolean usePalette = false;
public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList<Artist> dataSet,
@LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity;
this.dataSet = dataSet;
this.itemLayoutRes = itemLayoutRes;
this.usePalette = usePalette;
//setHasStableIds(true);
}
public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList<Artist> dataSet,
@LayoutRes int itemLayoutRes) {
super(activity, null, R.menu.menu_media_selection);
this.activity = activity;
this.dataSet = dataSet;
this.itemLayoutRes = itemLayoutRes;
}
public void swapDataSet(ArrayList<Artist> dataSet) {
this.dataSet = dataSet;
notifyDataSetChanged();
}
public ArrayList<Artist> getDataSet() {
return dataSet;
}
public void usePalette(boolean usePalette) {
this.usePalette = usePalette;
notifyDataSetChanged();
}
@Override
public long getItemId(int position) {
return dataSet.get(position).getId();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false);
return createViewHolder(view);
}
protected ViewHolder createViewHolder(View view) {
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Artist artist = dataSet.get(position);
boolean isChecked = isChecked(artist);
holder.itemView.setActivated(isChecked);
if (holder.title != null) {
holder.title.setText(artist.getName());
}
if (holder.text != null) {
holder.text.setVisibility(View.GONE);
}
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.VISIBLE);
}
loadArtistImage(artist, holder);
}
protected void setColors(int color, ViewHolder holder) {
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setBackgroundColor(color);
if (holder.title != null) {
holder.title.setTextColor(
MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)));
}
}
if (holder.mask != null) {
holder.mask.setBackgroundTintList(ColorStateList.valueOf(color));
}
}
private void loadArtistImage(Artist artist, final ViewHolder holder) {
if (holder.image == null) {
return;
}
ArtistGlideRequest.Builder.from(Glide.with(activity), artist)
.generatePalette(activity).build()
.into(new RetroMusicColoredTarget(holder.image) {
@Override
public void onColorReady(int color) {
setColors(color, holder);
}
});
}
@Override
public int getItemCount() {
return dataSet.size();
}
@Override
protected Artist getIdentifier(int position) {
return dataSet.get(position);
}
@Override
protected String getName(Artist artist) {
return artist.getName();
}
@Override
protected void onMultipleItemAction(@NonNull MenuItem menuItem,
@NonNull ArrayList<Artist> selection) {
SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.getItemId());
}
@NonNull
private ArrayList<Song> getSongList(@NonNull List<Artist> artists) {
final ArrayList<Song> songs = new ArrayList<>();
for (Artist artist : artists) {
songs.addAll(artist.getSongs()); // maybe async in future?
}
return songs;
}
@NonNull
@Override
public String getSectionName(int position) {
return MusicUtil.getSectionName(dataSet.get(position).getName());
}
public class ViewHolder extends MediaEntryViewHolder {
public ViewHolder(@NonNull View itemView) {
super(itemView);
setImageTransitionName(activity.getString(R.string.transition_artist_image));
if (menu != null) {
menu.setVisibility(View.GONE);
}
}
@Override
public void onClick(View v) {
if (isInQuickSelectMode()) {
toggleChecked(getAdapterPosition());
} else {
Pair[] artistPairs = new Pair[]{Pair.create(image,
activity.getResources().getString(R.string.transition_artist_image))};
NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).getId(), artistPairs);
}
}
@Override
public boolean onLongClick(View view) {
toggleChecked(getAdapterPosition());
return true;
}
}
}

View file

@ -0,0 +1,157 @@
package code.name.monkey.retromusic.ui.adapter.artist
import android.content.res.ColorStateList
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.util.Pair
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.glide.ArtistGlideRequest
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil
import com.bumptech.glide.Glide
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import java.util.*
class ArtistAdapter(val activity: AppCompatActivity,
var dataSet: ArrayList<Artist>,
@LayoutRes var itemLayoutRes: Int,
var usePalette: Boolean,
cabHolder: CabHolder?) : AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist>(activity, cabHolder, R.menu.menu_media_selection), FastScrollRecyclerView.SectionedAdapter {
fun swapDataSet(dataSet: ArrayList<Artist>) {
this.dataSet = dataSet
notifyDataSetChanged()
}
fun usePalette(usePalette: Boolean) {
this.usePalette = usePalette
notifyDataSetChanged()
}
override fun getItemId(position: Int): Long {
return dataSet[position].id.toLong()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)
return createViewHolder(view)
}
protected fun createViewHolder(view: View): ViewHolder {
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val artist = dataSet[position]
val isChecked = isChecked(artist)
holder.itemView.isActivated = isChecked
if (holder.title != null) {
holder.title!!.text = artist.name
}
if (holder.text != null) {
holder.text!!.visibility = View.GONE
}
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.VISIBLE
}
loadArtistImage(artist, holder)
}
fun setColors(color: Int, holder: ViewHolder) {
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer!!.setBackgroundColor(color)
if (holder.title != null) {
holder.title!!.setTextColor(
MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)))
}
}
if (holder.mask != null) {
holder.mask!!.backgroundTintList = ColorStateList.valueOf(color)
}
}
private fun loadArtistImage(artist: Artist, holder: ViewHolder) {
if (holder.image == null) {
return
}
ArtistGlideRequest.Builder.from(Glide.with(activity), artist)
.generatePalette(activity).build()
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onColorReady(color: Int) {
setColors(color, holder)
}
})
}
override fun getItemCount(): Int {
return dataSet.size
}
override fun getIdentifier(position: Int): Artist? {
return dataSet[position]
}
override fun getName(artist: Artist): String {
return artist.name
}
override fun onMultipleItemAction(menuItem: MenuItem,
selection: ArrayList<Artist>) {
SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId)
}
private fun getSongList(artists: List<Artist>): ArrayList<Song> {
val songs = ArrayList<Song>()
for (artist in artists) {
songs.addAll(artist.songs) // maybe async in future?
}
return songs
}
override fun getSectionName(position: Int): String {
return MusicUtil.getSectionName(dataSet[position].name)
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init {
setImageTransitionName(activity.getString(R.string.transition_artist_image))
if (menu != null) {
menu!!.visibility = View.GONE
}
}
override fun onClick(v: View?) {
super.onClick(v)
if (isInQuickSelectMode) {
toggleChecked(adapterPosition)
} else {
val artistPairs = arrayOf<Pair<*, *>>(Pair.create<ImageView, String>(image,
activity.resources.getString(R.string.transition_artist_image)))
NavigationUtil.goToArtist(activity, dataSet[adapterPosition].id, *artistPairs)
}
}
override fun onLongClick(v: View?): Boolean {
toggleChecked(adapterPosition)
return super.onLongClick(v)
}
}
}

View file

@ -1,101 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.base;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
public class MediaEntryViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@Nullable
@BindView(R.id.image)
public ImageView image;
@Nullable
@BindView(R.id.image_text)
public TextView imageText;
@Nullable
@BindView(R.id.title)
public TextView title;
@Nullable
@BindView(R.id.text)
public TextView text;
@Nullable
@BindView(R.id.image_container)
public ViewGroup imageContainer;
@Nullable
@BindView(R.id.image_container_card)
public CardView imageContainerCard;
@Nullable
@BindView(R.id.menu)
public View menu;
@Nullable
@BindView(R.id.separator)
public View separator;
@Nullable
@BindView(R.id.short_separator)
public View shortSeparator;
@Nullable
@BindView(R.id.drag_view)
public View dragView;
@Nullable
@BindView(R.id.palette_color_container)
public View paletteColorContainer;
@BindView(R.id.time)
@Nullable
public TextView time;
@BindView(R.id.recycler_view)
@Nullable
public RecyclerView recyclerView;
@BindView(R.id.play_songs)
@Nullable
public ImageButton playSongs;
@BindView(R.id.mask)
@Nullable
public View mask;
@BindView(R.id.image_text_container)
@Nullable
public CardView imageTextContainer;
public MediaEntryViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
if (imageTextContainer != null) {
imageTextContainer.setCardBackgroundColor(ThemeStore.primaryColor(itemView.getContext()));
}
if (imageContainerCard != null) {
imageContainerCard.setCardBackgroundColor(ThemeStore.primaryColor(itemView.getContext()));
}
}
protected void setImageTransitionName(@NonNull String transitionName) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && image != null) {
image.setTransitionName(transitionName);
}
}
@Override
public boolean onLongClick(View v) {
return false;
}
@Override
public void onClick(View v) {
}
}

View file

@ -0,0 +1,80 @@
package code.name.monkey.retromusic.ui.adapter.base
import android.os.Build
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
open class MediaEntryViewHolder(w: View) : RecyclerView.ViewHolder(w), View.OnClickListener, View.OnLongClickListener {
override fun onLongClick(v: View?): Boolean {
return false
}
override fun onClick(v: View?) {
}
var image: ImageView? = null
var imageText: TextView? = null
var title: TextView? = null
var text: TextView? = null
var imageContainer: ViewGroup? = null
var imageContainerCard: CardView? = null
var menu: View? = null
var separator: View? = null
var shortSeparator: View? = null
var dragView: View? = null
var paletteColorContainer: View? = null
var time: TextView? = null
var recyclerView: RecyclerView? = null
var playSongs: ImageButton? = null
var mask: View? = null
var imageTextContainer: CardView? = null
init {
title = w.findViewById(R.id.title)
text = w.findViewById(R.id.text)
image = w.findViewById(R.id.image)
imageContainer = w.findViewById(R.id.image_container)
imageTextContainer = w.findViewById(R.id.image_text_container)
imageContainerCard = w.findViewById(R.id.image_container_card)
imageText = w.findViewById(R.id.image_text)
menu = w.findViewById(R.id.menu)
dragView = w.findViewById(R.id.drag_view)
separator = w.findViewById(R.id.separator)
shortSeparator = w.findViewById(R.id.short_separator)
paletteColorContainer = w.findViewById(R.id.palette_color_container)
time = w.findViewById(R.id.time);
recyclerView = w.findViewById(R.id.recycler_view)
mask = w.findViewById(R.id.mask)
playSongs = w.findViewById(R.id.play_songs)
w.setOnClickListener(this)
w.setOnLongClickListener(this)
if (imageTextContainer != null) {
imageTextContainer!!.setCardBackgroundColor(ThemeStore.primaryColor(itemView.context))
}
if (imageContainerCard != null) {
imageContainerCard!!.setCardBackgroundColor(ThemeStore.primaryColor(itemView.context))
}
}
fun setImageTransitionName(transitionName: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && image != null) {
image!!.transitionName = transitionName
}
}
}

View file

@ -1,69 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.playlist;
import android.app.Activity;
import android.app.Dialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import code.name.monkey.retromusic.model.Playlist;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder;
import code.name.monkey.retromusic.ui.adapter.playlist.AddToPlaylist.ViewHolder;
import code.name.monkey.retromusic.util.PlaylistsUtil;
public class AddToPlaylist extends RecyclerView.Adapter<ViewHolder> {
private Activity activity;
private ArrayList<Playlist> playlists;
private int itemLayoutRes;
private ArrayList<Song> songs;
private Dialog dialog;
public AddToPlaylist(Activity activity,
ArrayList<Playlist> playlists, int itemLayoutRes,
ArrayList<Song> songs, Dialog dialog) {
this.activity = activity;
this.playlists = playlists;
this.itemLayoutRes = itemLayoutRes;
this.songs = songs;
this.dialog = dialog;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Playlist playlist = playlists.get(position);
if (holder.title != null) {
holder.title.setText(playlist.name);
}
}
@Override
public int getItemCount() {
return playlists.size();
}
public class ViewHolder extends MediaEntryViewHolder {
public ViewHolder(View itemView) {
super(itemView);
}
@Override
public void onClick(View v) {
super.onClick(v);
PlaylistsUtil.addToPlaylist(activity, songs, playlists.get(getAdapterPosition()).id, true);
dialog.dismiss();
}
}
}

View file

@ -0,0 +1,44 @@
package code.name.monkey.retromusic.ui.adapter.playlist
import android.app.Activity
import android.app.Dialog
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import java.util.ArrayList
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.model.Playlist
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.ui.adapter.playlist.AddToPlaylist.ViewHolder
import code.name.monkey.retromusic.util.PlaylistsUtil
class AddToPlaylist(private val activity: Activity,
private val playlists: ArrayList<Playlist>, private val itemLayoutRes: Int,
private val songs: ArrayList<Song>, private val dialog: Dialog) : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val playlist = playlists[position]
if (holder.title != null) {
holder.title!!.text = playlist.name
}
}
override fun getItemCount(): Int {
return playlists.size
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
override fun onClick(v: View?) {
super.onClick(v)
PlaylistsUtil.addToPlaylist(activity, songs, playlists[adapterPosition].id, true)
dialog.dismiss()
}
}
}

View file

@ -1,297 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.playlist;
import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.ExecutionException;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.PopupMenu;
import butterknife.ButterKnife;
import code.name.monkey.appthemehelper.util.ATHUtil;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.dialogs.ClearSmartPlaylistDialog;
import code.name.monkey.retromusic.dialogs.DeletePlaylistDialog;
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper;
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.loaders.PlaylistSongsLoader;
import code.name.monkey.retromusic.model.AbsCustomPlaylist;
import code.name.monkey.retromusic.model.Playlist;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist;
import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist;
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter;
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder;
import code.name.monkey.retromusic.util.MusicUtil;
import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.util.RetroUtil;
import io.reactivex.Observable;
public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewHolder, Playlist> {
public static final String TAG = PlaylistAdapter.class.getSimpleName();
private static final int SMART_PLAYLIST = 0;
private static final int DEFAULT_PLAYLIST = 1;
protected final AppCompatActivity activity;
protected ArrayList<Playlist> dataSet;
protected int itemLayoutRes;
private ArrayList<Song> mSongs = new ArrayList<>();
public PlaylistAdapter(AppCompatActivity activity, ArrayList<Playlist> dataSet,
@LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_playlists_selection);
this.activity = activity;
this.dataSet = dataSet;
this.itemLayoutRes = itemLayoutRes;
setHasStableIds(true);
}
public ArrayList<Playlist> getDataSet() {
return dataSet;
}
public void swapDataSet(ArrayList<Playlist> dataSet) {
this.dataSet = dataSet;
notifyDataSetChanged();
}
@Override
public long getItemId(int position) {
return dataSet.get(position).id;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity)
.inflate(itemLayoutRes, parent, false);
return createViewHolder(view, viewType);
}
protected ViewHolder createViewHolder(View view, int viewType) {
return new ViewHolder(view, viewType);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
/* if (getItemViewType(position) == SMART_PLAYLIST) {
if (holder.viewList != null) {
holder.viewList.get(0).setOnClickListener(
v -> NavigationUtil.goToPlaylistNew(activity, new HistoryPlaylist(activity)));
holder.viewList.get(1).setOnClickListener(
v -> NavigationUtil.goToPlaylistNew(activity, new LastAddedPlaylist(activity)));
holder.viewList.get(2).setOnClickListener(
v -> NavigationUtil.goToPlaylistNew(activity, new MyTopTracksPlaylist(activity)));
}
return;
}*/
final Playlist playlist = dataSet.get(position);
ArrayList<Song> songs = getSongs(playlist);
holder.itemView.setActivated(isChecked(playlist));
if (holder.title != null) {
holder.title.setText(playlist.name);
}
if (holder.text != null) {
holder.text.setText(String.format(Locale.getDefault(), "%d Songs", songs.size()));
}
if (holder.image != null) {
holder.image.setImageResource(getIconRes(playlist));
}
if (holder.getAdapterPosition() == getItemCount() - 1) {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.GONE);
}
} else {
if (holder.shortSeparator != null && !(dataSet.get(position) instanceof AbsSmartPlaylist)) {
holder.shortSeparator.setVisibility(View.VISIBLE);
}
}
}
private int getIconRes(Playlist playlist) {
if (playlist instanceof AbsSmartPlaylist) {
return ((AbsSmartPlaylist) playlist).iconRes;
}
return MusicUtil.isFavoritePlaylist(activity, playlist) ? R.drawable.ic_favorite_white_24dp
: R.drawable.ic_playlist_play_white_24dp;
}
@Override
public int getItemViewType(int position) {
return dataSet.get(position) instanceof AbsSmartPlaylist ? SMART_PLAYLIST : DEFAULT_PLAYLIST;
}
@Override
public int getItemCount() {
return dataSet.size();
}
@Override
protected Playlist getIdentifier(int position) {
return dataSet.get(position);
}
@Override
protected String getName(Playlist playlist) {
return playlist.name;
}
@Override
protected void onMultipleItemAction(@NonNull MenuItem menuItem,
@NonNull ArrayList<Playlist> selection) {
switch (menuItem.getItemId()) {
case R.id.action_delete_playlist:
for (int i = 0; i < selection.size(); i++) {
Playlist playlist = selection.get(i);
if (playlist instanceof AbsSmartPlaylist) {
AbsSmartPlaylist absSmartPlaylist = (AbsSmartPlaylist) playlist;
ClearSmartPlaylistDialog.create(absSmartPlaylist)
.show(activity.getSupportFragmentManager(),
"CLEAR_PLAYLIST_" + absSmartPlaylist.name);
selection.remove(playlist);
i--;
}
}
if (selection.size() > 0) {
DeletePlaylistDialog.create(selection)
.show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
}
break;
default:
SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.getItemId());
break;
}
}
public ArrayList<Song> getSongs() {
return mSongs;
}
public void setSongs(ArrayList<Song> songs) {
mSongs = songs;
}
@NonNull
private ArrayList<Song> getSongList(@NonNull List<Playlist> playlists) {
final ArrayList<Song> songs = new ArrayList<>();
for (Playlist playlist : playlists) {
if (playlist instanceof AbsCustomPlaylist) {
songs.addAll(((AbsCustomPlaylist) playlist).getSongs(activity).blockingFirst());
//((AbsCustomPlaylist) playlist).getSongs(activity).subscribe(this::setSongs);
} else {
songs
.addAll(PlaylistSongsLoader.getPlaylistSongList(activity, playlist.id).blockingFirst());
}
}
return songs;
}
@Nullable
private ArrayList<Song> getSongs(@NonNull Playlist playlist) {
final ArrayList<Song> songs = new ArrayList<>();
if (playlist instanceof AbsSmartPlaylist) {
songs.addAll(((AbsSmartPlaylist) playlist).getSongs(activity).blockingFirst());
} else {
songs.addAll(PlaylistSongsLoader.getPlaylistSongList(activity, playlist.id).blockingFirst());
}
return songs;
}
private Observable<ArrayList<Bitmap>> loadBitmaps(@NonNull ArrayList<Song> songs) {
return Observable.create(e -> {
ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();
for (Song song : songs) {
try {
Bitmap bitmap = Glide.with(activity)
.load(RetroUtil.getAlbumArtUri(song.albumId))
.asBitmap()
.into(500, 500)
.get();
if (bitmap != null) {
Log.i(TAG, "loadBitmaps: has");
bitmaps.add(bitmap);
}
if (bitmaps.size() == 4) {
break;
}
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
}
e.onNext(bitmaps);
e.onComplete();
});
}
public class ViewHolder extends MediaEntryViewHolder {
public ViewHolder(@NonNull View itemView, int itemViewType) {
super(itemView);
ButterKnife.bind(this, itemView);
if (image != null) {
int iconPadding = activity.getResources()
.getDimensionPixelSize(R.dimen.list_item_image_icon_padding);
image.setPadding(iconPadding, iconPadding, iconPadding, iconPadding);
image.setColorFilter(ATHUtil.resolveColor(activity, R.attr.iconColor),
PorterDuff.Mode.SRC_IN);
}
if (menu != null) {
menu.setOnClickListener(view -> {
final Playlist playlist = dataSet.get(getAdapterPosition());
final PopupMenu popupMenu = new PopupMenu(activity, view);
popupMenu.inflate(getItemViewType() == SMART_PLAYLIST ? R.menu.menu_item_smart_playlist
: R.menu.menu_item_playlist);
if (playlist instanceof LastAddedPlaylist) {
popupMenu.getMenu().findItem(R.id.action_clear_playlist).setVisible(false);
}
popupMenu.setOnMenuItemClickListener(item -> {
if (item.getItemId() == R.id.action_clear_playlist) {
if (playlist instanceof AbsSmartPlaylist) {
ClearSmartPlaylistDialog.create((AbsSmartPlaylist) playlist)
.show(activity.getSupportFragmentManager(),
"CLEAR_SMART_PLAYLIST_" + playlist.name);
return true;
}
}
return PlaylistMenuHelper.handleMenuClick(
activity, dataSet.get(getAdapterPosition()), item);
});
popupMenu.show();
});
}
}
@Override
public void onClick(View view) {
if (isInQuickSelectMode()) {
toggleChecked(getAdapterPosition());
} else {
Playlist playlist = dataSet.get(getAdapterPosition());
NavigationUtil.goToPlaylistNew(activity, playlist);
}
}
@Override
public boolean onLongClick(View view) {
toggleChecked(getAdapterPosition());
return true;
}
}
}

View file

@ -0,0 +1,268 @@
package code.name.monkey.retromusic.ui.adapter.playlist
import android.graphics.Bitmap
import android.graphics.PorterDuff
import android.util.Log
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.PopupMenu
import butterknife.ButterKnife
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.dialogs.ClearSmartPlaylistDialog
import code.name.monkey.retromusic.dialogs.DeletePlaylistDialog
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.loaders.PlaylistSongsLoader
import code.name.monkey.retromusic.model.AbsCustomPlaylist
import code.name.monkey.retromusic.model.Playlist
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist
import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.RetroUtil
import com.bumptech.glide.Glide
import io.reactivex.Observable
import java.util.*
import java.util.concurrent.ExecutionException
class PlaylistAdapter(protected val activity: AppCompatActivity, dataSet: ArrayList<Playlist>,
@param:LayoutRes protected var itemLayoutRes: Int, cabHolder: CabHolder?) : AbsMultiSelectAdapter<PlaylistAdapter.ViewHolder, Playlist>(activity, cabHolder, R.menu.menu_playlists_selection) {
var dataSet: ArrayList<Playlist>
protected set
var songs = ArrayList<Song>()
init {
this.dataSet = dataSet
setHasStableIds(true)
}
fun swapDataSet(dataSet: ArrayList<Playlist>) {
this.dataSet = dataSet
notifyDataSetChanged()
}
override fun getItemId(position: Int): Long {
return dataSet[position].id.toLong()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(activity)
.inflate(itemLayoutRes, parent, false)
return createViewHolder(view)
}
protected fun createViewHolder(view: View): ViewHolder {
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
/* if (getItemViewType(position) == SMART_PLAYLIST) {
if (holder.viewList != null) {
holder.viewList.get(0).setOnClickListener(
v -> NavigationUtil.goToPlaylistNew(activity, new HistoryPlaylist(activity)));
holder.viewList.get(1).setOnClickListener(
v -> NavigationUtil.goToPlaylistNew(activity, new LastAddedPlaylist(activity)));
holder.viewList.get(2).setOnClickListener(
v -> NavigationUtil.goToPlaylistNew(activity, new MyTopTracksPlaylist(activity)));
}
return;
}*/
val playlist = dataSet[position]
val songs = getSongs(playlist)
holder.itemView.isActivated = isChecked(playlist)
if (holder.title != null) {
holder.title!!.text = playlist.name
}
if (holder.text != null) {
holder.text!!.text = String.format(Locale.getDefault(), "%d Songs", songs!!.size)
}
if (holder.image != null) {
holder.image!!.setImageResource(getIconRes(playlist))
}
if (holder.adapterPosition == itemCount - 1) {
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.GONE
}
} else {
if (holder.shortSeparator != null && dataSet[position] !is AbsSmartPlaylist) {
holder.shortSeparator!!.visibility = View.VISIBLE
}
}
}
private fun getIconRes(playlist: Playlist): Int {
if (playlist is AbsSmartPlaylist) {
return playlist.iconRes
}
return if (MusicUtil.isFavoritePlaylist(activity, playlist))
R.drawable.ic_favorite_white_24dp
else
R.drawable.ic_playlist_play_white_24dp
}
override fun getItemViewType(position: Int): Int {
return if (dataSet[position] is AbsSmartPlaylist) SMART_PLAYLIST else DEFAULT_PLAYLIST
}
override fun getItemCount(): Int {
return dataSet.size
}
override fun getIdentifier(position: Int): Playlist? {
return dataSet[position]
}
override fun getName(playlist: Playlist): String {
return playlist.name
}
override fun onMultipleItemAction(menuItem: MenuItem,
selection: ArrayList<Playlist>) {
when (menuItem.itemId) {
R.id.action_delete_playlist -> {
var i = 0
while (i < selection.size) {
val playlist = selection[i]
if (playlist is AbsSmartPlaylist) {
ClearSmartPlaylistDialog.create(playlist)
.show(activity.supportFragmentManager,
"CLEAR_PLAYLIST_" + playlist.name)
selection.remove(playlist)
i--
}
i++
}
if (selection.size > 0) {
DeletePlaylistDialog.create(selection)
.show(activity.supportFragmentManager, "DELETE_PLAYLIST")
}
}
else -> SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId)
}
}
private fun getSongList(playlists: List<Playlist>): ArrayList<Song> {
val songs = ArrayList<Song>()
for (playlist in playlists) {
if (playlist is AbsCustomPlaylist) {
songs.addAll(playlist.getSongs(activity).blockingFirst())
//((AbsCustomPlaylist) playlist).getSongs(activity).subscribe(this::setSongs);
} else {
songs
.addAll(PlaylistSongsLoader.getPlaylistSongList(activity, playlist.id).blockingFirst())
}
}
return songs
}
private fun getSongs(playlist: Playlist): ArrayList<Song>? {
val songs = ArrayList<Song>()
if (playlist is AbsSmartPlaylist) {
songs.addAll(playlist.getSongs(activity).blockingFirst())
} else {
songs.addAll(PlaylistSongsLoader.getPlaylistSongList(activity, playlist.id).blockingFirst())
}
return songs
}
private fun loadBitmaps(songs: ArrayList<Song>): Observable<ArrayList<Bitmap>> {
return Observable.create { e ->
val bitmaps = ArrayList<Bitmap>()
for (song in songs) {
try {
val bitmap = Glide.with(activity)
.load(RetroUtil.getAlbumArtUri(song.albumId.toLong()))
.asBitmap()
.into(500, 500)
.get()
if (bitmap != null) {
Log.i(TAG, "loadBitmaps: has")
bitmaps.add(bitmap)
}
if (bitmaps.size == 4) {
break
}
} catch (ex: InterruptedException) {
ex.printStackTrace()
} catch (ex: ExecutionException) {
ex.printStackTrace()
}
}
e.onNext(bitmaps)
e.onComplete()
}
}
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init {
ButterKnife.bind(this, itemView)
if (image != null) {
val iconPadding = activity.resources
.getDimensionPixelSize(R.dimen.list_item_image_icon_padding)
image!!.setPadding(iconPadding, iconPadding, iconPadding, iconPadding)
image!!.setColorFilter(ATHUtil.resolveColor(activity, R.attr.iconColor),
PorterDuff.Mode.SRC_IN)
}
if (menu != null) {
menu!!.setOnClickListener { view ->
val playlist = dataSet[adapterPosition]
val popupMenu = PopupMenu(activity, view)
popupMenu.inflate(if (getItemViewType() == SMART_PLAYLIST)
R.menu.menu_item_smart_playlist
else
R.menu.menu_item_playlist)
if (playlist is LastAddedPlaylist) {
popupMenu.menu.findItem(R.id.action_clear_playlist).isVisible = false
}
popupMenu.setOnMenuItemClickListener { item ->
if (item.itemId == R.id.action_clear_playlist) {
if (playlist is AbsSmartPlaylist) {
ClearSmartPlaylistDialog.create(playlist)
.show(activity.supportFragmentManager,
"CLEAR_SMART_PLAYLIST_" + playlist.name)
return@setOnMenuItemClickListener true
}
}
PlaylistMenuHelper.handleMenuClick(
activity, dataSet[adapterPosition], item)
}
popupMenu.show()
}
}
}
override fun onClick(v: View?) {
if (isInQuickSelectMode) {
toggleChecked(adapterPosition)
} else {
val playlist = dataSet[adapterPosition]
NavigationUtil.goToPlaylistNew(activity, playlist)
}
}
override fun onLongClick(v: View?): Boolean {
toggleChecked(adapterPosition)
return true
}
}
companion object {
val TAG: String = PlaylistAdapter::class.java.simpleName
private const val SMART_PLAYLIST = 0
private const val DEFAULT_PLAYLIST = 1
}
}

View file

@ -1,110 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.song;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.model.Song;
public abstract class AbsOffsetSongAdapter extends SongAdapter {
protected static final int OFFSET_ITEM = 0;
protected static final int SONG = 1;
public AbsOffsetSongAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
super(activity, dataSet, itemLayoutRes, usePalette, cabHolder);
}
public AbsOffsetSongAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder, boolean showSectionName) {
super(activity, dataSet, itemLayoutRes, usePalette, cabHolder, showSectionName);
}
@NonNull
@Override
public SongAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == OFFSET_ITEM) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_single_row, parent, false);
return createViewHolder(view);
}
return super.onCreateViewHolder(parent, viewType);
}
@Override
protected SongAdapter.ViewHolder createViewHolder(View view) {
return new AbsOffsetSongAdapter.ViewHolder(view);
}
@Override
public long getItemId(int position) {
position--;
if (position < 0) return -2;
return super.getItemId(position);
}
@Nullable
@Override
protected Song getIdentifier(int position) {
position--;
if (position < 0) return null;
return super.getIdentifier(position);
}
@Override
public int getItemCount() {
int superItemCount = super.getItemCount();
return superItemCount == 0 ? 0 : superItemCount + 1;
}
@Override
public int getItemViewType(int position) {
return position == 0 ? OFFSET_ITEM : SONG;
}
@NonNull
@Override
public String getSectionName(int position) {
position--;
if (position < 0) return "";
return super.getSectionName(position);
}
public class ViewHolder extends SongAdapter.ViewHolder {
public ViewHolder(@NonNull View itemView) {
super(itemView);
}
@Override
protected Song getSong() {
if (getItemViewType() == OFFSET_ITEM)
return Song.EMPTY_SONG; // could also return null, just to be safe return empty song
return dataSet.get(getAdapterPosition() - 1);
}
@Override
public void onClick(View v) {
if (isInQuickSelectMode() && getItemViewType() != OFFSET_ITEM) {
toggleChecked(getAdapterPosition());
} else {
MusicPlayerRemote.openQueue(dataSet, getAdapterPosition() - 1, true);
}
}
@Override
public boolean onLongClick(View view) {
if (getItemViewType() == OFFSET_ITEM) return false;
toggleChecked(getAdapterPosition());
return true;
}
}
}

View file

@ -0,0 +1,85 @@
package code.name.monkey.retromusic.ui.adapter.song
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.model.Song
import java.util.*
abstract class AbsOffsetSongAdapter : SongAdapter {
constructor(activity: AppCompatActivity, dataSet: ArrayList<Song>, @LayoutRes itemLayoutRes: Int, usePalette: Boolean, cabHolder: CabHolder?) : super(activity, dataSet, itemLayoutRes, usePalette, cabHolder)
constructor(activity: AppCompatActivity, dataSet: ArrayList<Song>, @LayoutRes itemLayoutRes: Int, usePalette: Boolean, cabHolder: CabHolder?, showSectionName: Boolean) : super(activity, dataSet, itemLayoutRes, usePalette, cabHolder, showSectionName) {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder {
if (viewType == OFFSET_ITEM) {
val view = LayoutInflater.from(activity).inflate(R.layout.item_list_single_row, parent, false)
return createViewHolder(view)
}
return super.onCreateViewHolder(parent, viewType)
}
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
return ViewHolder(view)
}
override fun getItemId(position: Int): Long {
var positionFinal = position
positionFinal--
return if (positionFinal < 0) -2 else super.getItemId(positionFinal)
}
override fun getIdentifier(position: Int): Song? {
var positionFinal = position
positionFinal--
return if (positionFinal < 0) null else super.getIdentifier(positionFinal)
}
override fun getItemCount(): Int {
val superItemCount = super.getItemCount()
return if (superItemCount == 0) 0 else superItemCount + 1
}
override fun getItemViewType(position: Int): Int {
return if (position == 0) OFFSET_ITEM else SONG
}
override fun getSectionName(position: Int): String {
var positionFinal = position
positionFinal--
return if (position < 0) "" else super.getSectionName(positionFinal)
}
open inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView) {
override// could also return null, just to be safe return empty song
val song: Song
get() = if (itemViewType == OFFSET_ITEM) Song.EMPTY_SONG else dataSet[adapterPosition - 1]
override fun onClick(v: View?) {
if (isInQuickSelectMode && itemViewType != OFFSET_ITEM) {
toggleChecked(adapterPosition)
} else {
MusicPlayerRemote.openQueue(dataSet, adapterPosition - 1, true)
}
}
override fun onLongClick(v: View?): Boolean {
if (itemViewType == OFFSET_ITEM) return false
toggleChecked(adapterPosition)
return true
}
}
companion object {
const val OFFSET_ITEM = 0
const val SONG = 1
}
}

View file

@ -1,145 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.song;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter;
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemViewHolder;
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange;
import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags;
import java.util.ArrayList;
import java.util.List;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.dialogs.RemoveFromPlaylistDialog;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.model.PlaylistSong;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.util.ViewUtil;
@SuppressWarnings("unchecked")
public class OrderablePlaylistSongAdapter extends PlaylistSongAdapter
implements DraggableItemAdapter<OrderablePlaylistSongAdapter.ViewHolder> {
public static final String TAG = OrderablePlaylistSongAdapter.class.getSimpleName();
private OnMoveItemListener onMoveItemListener;
public OrderablePlaylistSongAdapter(@NonNull AppCompatActivity activity,
@NonNull ArrayList<PlaylistSong> dataSet,
@LayoutRes int itemLayoutRes,
boolean usePalette,
@Nullable CabHolder cabHolder,
@Nullable OnMoveItemListener onMoveItemListener) {
super(activity, (ArrayList<Song>) (List) dataSet, itemLayoutRes, usePalette, cabHolder);
setMultiSelectMenuRes(R.menu.menu_playlists_songs_selection);
this.onMoveItemListener = onMoveItemListener;
}
@Override
protected SongAdapter.ViewHolder createViewHolder(View view) {
return new ViewHolder(view);
}
@Override
public long getItemId(int position) {
position--;
if (position < 0) return -2;
return ((ArrayList<PlaylistSong>) (List) dataSet).get(position).idInPlayList; // important!
}
@Override
protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList<Song> selection) {
switch (menuItem.getItemId()) {
case R.id.action_remove_from_playlist:
RemoveFromPlaylistDialog.create((ArrayList<PlaylistSong>) (List) selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
return;
}
super.onMultipleItemAction(menuItem, selection);
}
@Override
public boolean onCheckCanStartDrag(ViewHolder holder, int position, int x, int y) {
return onMoveItemListener != null && position > 0 &&
(ViewUtil.hitTest(holder.dragView, x, y) || ViewUtil.hitTest(holder.image, x, y));
}
@Override
public ItemDraggableRange onGetItemDraggableRange(ViewHolder holder, int position) {
return new ItemDraggableRange(1, dataSet.size());
}
@Override
public void onMoveItem(int fromPosition, int toPosition) {
if (onMoveItemListener != null && fromPosition != toPosition) {
onMoveItemListener.onMoveItem(fromPosition - 1, toPosition - 1);
}
}
@Override
public boolean onCheckCanDrop(int draggingPosition, int dropPosition) {
return dropPosition > 0;
}
@Override
public void onItemDragStarted(int position) {
notifyDataSetChanged();
}
@Override
public void onItemDragFinished(int fromPosition, int toPosition, boolean result) {
notifyDataSetChanged();
}
public interface OnMoveItemListener {
void onMoveItem(int fromPosition, int toPosition);
}
public class ViewHolder extends PlaylistSongAdapter.ViewHolder implements DraggableItemViewHolder {
@DraggableItemStateFlags
private int mDragStateFlags;
public ViewHolder(@NonNull View itemView) {
super(itemView);
if (dragView != null) {
if (onMoveItemListener != null) {
dragView.setVisibility(View.VISIBLE);
} else {
dragView.setVisibility(View.GONE);
}
}
}
@Override
protected int getSongMenuRes() {
return R.menu.menu_item_playlist_song;
}
@Override
protected boolean onSongMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_remove_from_playlist:
RemoveFromPlaylistDialog.create((PlaylistSong) getSong()).show(activity.getSupportFragmentManager(), "REMOVE_FROM_PLAYLIST");
return true;
}
return super.onSongMenuItemClick(item);
}
@Override
@DraggableItemStateFlags
public int getDragStateFlags() {
return mDragStateFlags;
}
@Override
public void setDragStateFlags(@DraggableItemStateFlags int flags) {
mDragStateFlags = flags;
}
}
}

View file

@ -0,0 +1,136 @@
package code.name.monkey.retromusic.ui.adapter.song
import android.view.MenuItem
import android.view.View
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.dialogs.RemoveFromPlaylistDialog
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.model.PlaylistSong
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.ViewUtil
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemViewHolder
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags
class OrderablePlaylistSongAdapter(activity: AppCompatActivity,
dataSet: ArrayList<Song>,
@LayoutRes itemLayoutRes: Int,
usePalette: Boolean,
cabHolder: CabHolder?,
private val onMoveItemListener: OnMoveItemListener?) : PlaylistSongAdapter(activity, dataSet, itemLayoutRes, usePalette, cabHolder), DraggableItemAdapter<OrderablePlaylistSongAdapter.ViewHolder> {
init {
setMultiSelectMenuRes(R.menu.menu_playlists_songs_selection)
}
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
return ViewHolder(view)
}
override fun getItemId(position: Int): Long {
var positionFinal = position
positionFinal--
var long: Long = 0
if (position < 0) {
long = -2
} else {
if (dataSet[positionFinal] is PlaylistSong) {
long = (dataSet[positionFinal] as PlaylistSong).idInPlayList.toLong()
}
}
return long
}
override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList<Song>) {
when (menuItem.itemId) {
R.id.action_remove_from_playlist -> {
val songs = ArrayList<PlaylistSong>()
songs.addAll(songs)
RemoveFromPlaylistDialog.create(songs).show(activity.supportFragmentManager, "ADD_PLAYLIST")
return
}
}
super.onMultipleItemAction(menuItem, selection)
}
override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean {
return onMoveItemListener != null && position > 0 &&
(ViewUtil.hitTest(holder.dragView, x, y) || ViewUtil.hitTest(holder.image, x, y))
}
override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange {
return ItemDraggableRange(1, dataSet.size)
}
override fun onMoveItem(fromPosition: Int, toPosition: Int) {
if (onMoveItemListener != null && fromPosition != toPosition) {
onMoveItemListener.onMoveItem(fromPosition - 1, toPosition - 1)
}
}
override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean {
return dropPosition > 0
}
override fun onItemDragStarted(position: Int) {
notifyDataSetChanged()
}
override fun onItemDragFinished(fromPosition: Int, toPosition: Int, result: Boolean) {
notifyDataSetChanged()
}
interface OnMoveItemListener {
fun onMoveItem(fromPosition: Int, toPosition: Int)
}
inner class ViewHolder(itemView: View) : PlaylistSongAdapter.ViewHolder(itemView), DraggableItemViewHolder {
@DraggableItemStateFlags
private var mDragStateFlags: Int = 0
override var songMenuRes: Int
get() = R.menu.menu_item_playlist_song
set(value: Int) {
super.songMenuRes = value
}
init {
if (dragView != null) {
if (onMoveItemListener != null) {
dragView!!.visibility = View.VISIBLE
} else {
dragView!!.visibility = View.GONE
}
}
}
override fun onSongMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_remove_from_playlist -> {
RemoveFromPlaylistDialog.create(song as PlaylistSong).show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST")
return true
}
}
return super.onSongMenuItemClick(item)
}
@DraggableItemStateFlags
override fun getDragStateFlags(): Int {
return mDragStateFlags
}
override fun setDragStateFlags(@DraggableItemStateFlags flags: Int) {
mDragStateFlags = flags
}
}
companion object {
val TAG = OrderablePlaylistSongAdapter::class.java.simpleName
}
}

View file

@ -1,215 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.song;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter;
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemViewHolder;
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange;
import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags;
import java.util.ArrayList;
import androidx.annotation.ColorInt;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.util.MusicUtil;
import code.name.monkey.retromusic.util.ViewUtil;
public class PlayingQueueAdapter extends SongAdapter implements DraggableItemAdapter<PlayingQueueAdapter.ViewHolder> {
private static final int HISTORY = 0;
private static final int CURRENT = 1;
private static final int UP_NEXT = 2;
private int current;
private int color = -1;
public PlayingQueueAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, int current,
@LayoutRes int itemLayoutRes) {
super(activity, dataSet, itemLayoutRes, false, null);
this.current = current;
}
public PlayingQueueAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, int current,
@LayoutRes int itemLayoutRes, @ColorInt int color) {
super(activity, dataSet, itemLayoutRes, false, null);
this.current = current;
this.color = color;
}
@Override
protected SongAdapter.ViewHolder createViewHolder(View view) {
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SongAdapter.ViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
if (holder.imageText != null) {
holder.imageText.setText(String.valueOf(position - current));
}
if (holder.time != null) {
holder.time.setText(MusicUtil.getReadableDurationString(getDataSet().get(position).duration));
}
if (holder.getItemViewType() == HISTORY || holder.getItemViewType() == CURRENT) {
setAlpha(holder, 0.5f);
}
if (usePalette) {
setColor(holder, Color.WHITE);
}
}
private void setColor(SongAdapter.ViewHolder holder, int white) {
if (holder.title != null) {
holder.title.setTextColor(white);
if (color != -1) {
holder.title.setTextColor(color);
}
}
if (holder.text != null) {
holder.text.setTextColor(white);
}
if (holder.time != null) {
holder.time.setTextColor(white);
}
if (holder.imageText != null) {
holder.imageText.setTextColor(white);
}
if (holder.menu != null) {
((ImageView) holder.menu).setColorFilter(white, PorterDuff.Mode.SRC_IN);
}
}
@Override
public void usePalette(boolean color) {
super.usePalette(color);
usePalette = color;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if (position < current) {
return HISTORY;
} else if (position > current) {
return UP_NEXT;
}
return CURRENT;
}
@Override
protected void loadAlbumCover(Song song, SongAdapter.ViewHolder holder) {
// We don't want to load it in this adapter
}
public void swapDataSet(ArrayList<Song> dataSet, int position) {
this.dataSet = dataSet;
current = position;
notifyDataSetChanged();
}
public void setCurrent(int current) {
this.current = current;
notifyDataSetChanged();
}
private void setAlpha(SongAdapter.ViewHolder holder, float alpha) {
if (holder.image != null) {
holder.image.setAlpha(alpha);
}
if (holder.title != null) {
holder.title.setAlpha(alpha);
}
if (holder.text != null) {
holder.text.setAlpha(alpha);
}
if (holder.imageText != null) {
holder.imageText.setAlpha(alpha);
}
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setAlpha(alpha);
}
}
@Override
public boolean onCheckCanStartDrag(ViewHolder holder, int position, int x, int y) {
return ViewUtil.hitTest(holder.imageText, x, y) || (ViewUtil.hitTest(holder.dragView, x, y));
}
@Override
public ItemDraggableRange onGetItemDraggableRange(ViewHolder holder, int position) {
return null;
}
@Override
public void onMoveItem(int fromPosition, int toPosition) {
MusicPlayerRemote.moveSong(fromPosition, toPosition);
}
@Override
public boolean onCheckCanDrop(int draggingPosition, int dropPosition) {
return true;
}
@Override
public void onItemDragStarted(int position) {
notifyDataSetChanged();
}
@Override
public void onItemDragFinished(int fromPosition, int toPosition, boolean result) {
notifyDataSetChanged();
}
public class ViewHolder extends SongAdapter.ViewHolder implements DraggableItemViewHolder {
@DraggableItemStateFlags
private int mDragStateFlags;
public ViewHolder(@NonNull View itemView) {
super(itemView);
if (imageText != null) {
imageText.setVisibility(View.VISIBLE);
}
if (dragView != null) {
dragView.setVisibility(View.VISIBLE);
}
}
@Override
protected int getSongMenuRes() {
return R.menu.menu_item_playing_queue_song;
}
@Override
protected boolean onSongMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_remove_from_playing_queue:
MusicPlayerRemote.removeFromQueue(getAdapterPosition());
return true;
}
return super.onSongMenuItemClick(item);
}
@Override
@DraggableItemStateFlags
public int getDragStateFlags() {
return mDragStateFlags;
}
@Override
public void setDragStateFlags(@DraggableItemStateFlags int flags) {
mDragStateFlags = flags;
}
}
}

View file

@ -0,0 +1,199 @@
package code.name.monkey.retromusic.ui.adapter.song
import android.graphics.Color
import android.graphics.PorterDuff
import android.view.MenuItem
import android.view.View
import android.widget.ImageView
import androidx.annotation.ColorInt
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.ViewUtil
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemViewHolder
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange
import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags
import java.util.*
class PlayingQueueAdapter : SongAdapter, DraggableItemAdapter<PlayingQueueAdapter.ViewHolder> {
private var current: Int = 0
private var color = -1
constructor(activity: AppCompatActivity, dataSet: ArrayList<Song>, current: Int,
@LayoutRes itemLayoutRes: Int) : super(activity, dataSet, itemLayoutRes, false, null) {
this.current = current
}
constructor(activity: AppCompatActivity, dataSet: ArrayList<Song>, current: Int,
@LayoutRes itemLayoutRes: Int, @ColorInt color: Int) : super(activity, dataSet, itemLayoutRes, false, null) {
this.current = current
this.color = color
}
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
return ViewHolder(view)
}
override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) {
super.onBindViewHolder(holder, position)
if (holder.imageText != null) {
holder.imageText!!.text = (position - current).toString()
}
if (holder.time != null) {
holder.time!!.text = MusicUtil.getReadableDurationString(dataSet[position].duration)
}
if (holder.itemViewType == HISTORY || holder.itemViewType == CURRENT) {
setAlpha(holder, 0.5f)
}
if (usePalette) {
setColor(holder, Color.WHITE)
}
}
private fun setColor(holder: SongAdapter.ViewHolder, white: Int) {
if (holder.title != null) {
holder.title!!.setTextColor(white)
if (color != -1) {
holder.title!!.setTextColor(color)
}
}
if (holder.text != null) {
holder.text!!.setTextColor(white)
}
if (holder.time != null) {
holder.time!!.setTextColor(white)
}
if (holder.imageText != null) {
holder.imageText!!.setTextColor(white)
}
if (holder.menu != null) {
(holder.menu as ImageView).setColorFilter(white, PorterDuff.Mode.SRC_IN)
}
}
override fun usePalette(usePalette: Boolean) {
super.usePalette(usePalette)
this.usePalette = usePalette
notifyDataSetChanged()
}
override fun getItemViewType(position: Int): Int {
if (position < current) {
return HISTORY
} else if (position > current) {
return UP_NEXT
}
return CURRENT
}
override fun loadAlbumCover(song: Song, holder: SongAdapter.ViewHolder) {
// We don't want to load it in this adapter
}
fun swapDataSet(dataSet: ArrayList<Song>, position: Int) {
this.dataSet = dataSet
current = position
notifyDataSetChanged()
}
fun setCurrent(current: Int) {
this.current = current
notifyDataSetChanged()
}
private fun setAlpha(holder: SongAdapter.ViewHolder, alpha: Float) {
if (holder.image != null) {
holder.image!!.alpha = alpha
}
if (holder.title != null) {
holder.title!!.alpha = alpha
}
if (holder.text != null) {
holder.text!!.alpha = alpha
}
if (holder.imageText != null) {
holder.imageText!!.alpha = alpha
}
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer!!.alpha = alpha
}
}
override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean {
return ViewUtil.hitTest(holder.imageText, x, y) || ViewUtil.hitTest(holder.dragView, x, y)
}
override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange? {
return null
}
override fun onMoveItem(fromPosition: Int, toPosition: Int) {
MusicPlayerRemote.moveSong(fromPosition, toPosition)
}
override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean {
return true
}
override fun onItemDragStarted(position: Int) {
notifyDataSetChanged()
}
override fun onItemDragFinished(fromPosition: Int, toPosition: Int, result: Boolean) {
notifyDataSetChanged()
}
inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView), DraggableItemViewHolder {
@DraggableItemStateFlags
private var mDragStateFlags: Int = 0
override var songMenuRes: Int
get() = R.menu.menu_item_playing_queue_song
set(value: Int) {
super.songMenuRes = value
}
init {
if (imageText != null) {
imageText!!.visibility = View.VISIBLE
}
if (dragView != null) {
dragView!!.visibility = View.VISIBLE
}
}
override fun onSongMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_remove_from_playing_queue -> {
MusicPlayerRemote.removeFromQueue(adapterPosition)
return true
}
}
return super.onSongMenuItemClick(item)
}
@DraggableItemStateFlags
override fun getDragStateFlags(): Int {
return mDragStateFlags
}
override fun setDragStateFlags(@DraggableItemStateFlags flags: Int) {
mDragStateFlags = flags
}
}
companion object {
private const val HISTORY = 0
private const val CURRENT = 1
private const val UP_NEXT = 2
}
}

View file

@ -1,93 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.song;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.util.Pair;
import androidx.appcompat.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import java.util.ArrayList;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.util.MusicUtil;
import code.name.monkey.retromusic.util.NavigationUtil;
public class PlaylistSongAdapter extends AbsOffsetSongAdapter {
public static final String TAG = PlaylistSongAdapter.class.getSimpleName();
public PlaylistSongAdapter(AppCompatActivity activity, @NonNull ArrayList<Song> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
super(activity, dataSet, itemLayoutRes, usePalette, cabHolder, false);
setMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection);
}
@Override
protected SongAdapter.ViewHolder createViewHolder(View view) {
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final SongAdapter.ViewHolder holder, int position) {
if (holder.getItemViewType() == OFFSET_ITEM) {
int textColor = ThemeStore.textColorSecondary(activity);
if (holder.title != null) {
holder.title.setText(MusicUtil.getPlaylistInfoString(activity, dataSet));
holder.title.setTextColor(textColor);
}
if (holder.text != null) {
holder.text.setVisibility(View.GONE);
}
if (holder.menu != null) {
holder.menu.setVisibility(View.GONE);
}
if (holder.image != null) {
final int padding = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin) / 2;
holder.image.setPadding(padding, padding, padding, padding);
holder.image.setColorFilter(textColor);
holder.image.setImageResource(R.drawable.ic_timer_white_24dp);
}
if (holder.dragView != null) {
holder.dragView.setVisibility(View.GONE);
}
if (holder.separator != null) {
holder.separator.setVisibility(View.VISIBLE);
}
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.GONE);
}
} else {
super.onBindViewHolder(holder, position - 1);
}
}
public class ViewHolder extends AbsOffsetSongAdapter.ViewHolder {
public ViewHolder(@NonNull View itemView) {
super(itemView);
}
@Override
protected int getSongMenuRes() {
return R.menu.menu_item_cannot_delete_single_songs_playlist_song;
}
@Override
protected boolean onSongMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.action_go_to_album) {
Pair[] albumPairs = new Pair[]{
Pair.create(image, activity.getString(R.string.transition_album_art))};
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition() - 1).albumId, albumPairs);
return true;
}
return super.onSongMenuItemClick(item);
}
}
}

View file

@ -0,0 +1,86 @@
package code.name.monkey.retromusic.ui.adapter.song
import android.view.MenuItem
import android.view.View
import android.widget.ImageView
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.util.Pair
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.model.PlaylistSong
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil
import java.util.*
open class PlaylistSongAdapter(activity: AppCompatActivity, dataSet: ArrayList<Song>, @LayoutRes itemLayoutRes: Int, usePalette: Boolean, cabHolder: CabHolder?) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, usePalette, cabHolder, false) {
init {
this.setMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection)
}
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
return ViewHolder(view)
}
override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) {
if (holder.itemViewType == AbsOffsetSongAdapter.OFFSET_ITEM) {
val textColor = ThemeStore.textColorSecondary(activity)
if (holder.title != null) {
holder.title!!.text = MusicUtil.getPlaylistInfoString(activity, dataSet)
holder.title!!.setTextColor(textColor)
}
if (holder.text != null) {
holder.text!!.visibility = View.GONE
}
if (holder.menu != null) {
holder.menu!!.visibility = View.GONE
}
if (holder.image != null) {
val padding = activity.resources.getDimensionPixelSize(R.dimen.default_item_margin) / 2
holder.image!!.setPadding(padding, padding, padding, padding)
holder.image!!.setColorFilter(textColor)
holder.image!!.setImageResource(R.drawable.ic_timer_white_24dp)
}
if (holder.dragView != null) {
holder.dragView!!.visibility = View.GONE
}
if (holder.separator != null) {
holder.separator!!.visibility = View.VISIBLE
}
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.GONE
}
} else {
super.onBindViewHolder(holder, position - 1)
}
}
open inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) {
override var songMenuRes: Int
get() = R.menu.menu_item_cannot_delete_single_songs_playlist_song
set(value) {
super.songMenuRes = value
}
override fun onSongMenuItemClick(item: MenuItem): Boolean {
if (item.itemId == R.id.action_go_to_album) {
val albumPairs = arrayOf<Pair<*, *>>(Pair.create(image, activity.getString(R.string.transition_album_art)))
NavigationUtil.goToAlbum(activity, dataSet[adapterPosition - 1].albumId, *albumPairs)
return true
}
return super.onSongMenuItemClick(item)
}
}
companion object {
val TAG = PlaylistSongAdapter::class.java.simpleName
}
}

View file

@ -1,80 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.song;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import java.util.ArrayList;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.model.Song;
public class ShuffleButtonSongAdapter extends AbsOffsetSongAdapter {
public ShuffleButtonSongAdapter(AppCompatActivity activity, ArrayList<Song> dataSet,
@LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
super(activity, dataSet, itemLayoutRes, usePalette, cabHolder);
}
@Override
protected SongAdapter.ViewHolder createViewHolder(View view) {
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final SongAdapter.ViewHolder holder, int position) {
if (holder.getItemViewType() == OFFSET_ITEM) {
int accentColor = ThemeStore.accentColor(activity);
if (holder.title != null) {
holder.title.setText(activity.getResources().getString(R.string.action_shuffle_all));
holder.title.setTextColor(accentColor);
/*((GradientTextView) holder.title).setLinearGradient(ThemeStore.accentColor(activity),
PhonographColorUtil.getMatColor(activity, "A400"), GradientTextView.LG_VERTICAL);
*/
}
if (holder.text != null) {
holder.text.setVisibility(View.GONE);
}
if (holder.menu != null) {
holder.menu.setVisibility(View.GONE);
}
if (holder.image != null) {
final int padding =
activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin) / 2;
holder.image.setPadding(padding, padding, padding, padding);
holder.image.setColorFilter(accentColor);
holder.image.setImageResource(R.drawable.ic_shuffle_white_24dp);
}
if (holder.separator != null) {
holder.separator.setVisibility(View.VISIBLE);
}
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.GONE);
}
} else {
super.onBindViewHolder(holder, position - 1);
}
}
public class ViewHolder extends AbsOffsetSongAdapter.ViewHolder {
public ViewHolder(@NonNull View itemView) {
super(itemView);
}
@Override
public void onClick(View v) {
if (getItemViewType() == OFFSET_ITEM) {
MusicPlayerRemote.openAndShuffleQueue(dataSet, true);
return;
}
super.onClick(v);
}
}
}

View file

@ -0,0 +1,64 @@
package code.name.monkey.retromusic.ui.adapter.song
import android.view.View
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.model.Song
import java.util.*
class ShuffleButtonSongAdapter(activity: AppCompatActivity,
dataSet: ArrayList<Song>,
@LayoutRes itemLayoutRes: Int,
usePalette: Boolean,
cabHolder: CabHolder?) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, usePalette, cabHolder) {
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
return ViewHolder(view)
}
override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) {
if (holder.itemViewType == AbsOffsetSongAdapter.OFFSET_ITEM) {
val accentColor = ThemeStore.accentColor(activity.applicationContext)
if (holder.title != null) {
holder.title!!.text = activity.resources.getString(R.string.action_shuffle_all)
holder.title!!.setTextColor(accentColor)
}
if (holder.text != null) {
holder.text!!.visibility = View.GONE
}
if (holder.menu != null) {
holder.menu!!.visibility = View.GONE
}
if (holder.image != null) {
val padding = activity.resources.getDimensionPixelSize(R.dimen.default_item_margin) / 2
holder.image!!.setPadding(padding, padding, padding, padding)
holder.image!!.setColorFilter(accentColor)
holder.image!!.setImageResource(R.drawable.ic_shuffle_white_24dp)
}
if (holder.separator != null) {
holder.separator!!.visibility = View.VISIBLE
}
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.GONE
}
} else {
super.onBindViewHolder(holder, position - 1)
}
}
inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) {
override fun onClick(v: View?) {
if (itemViewType == AbsOffsetSongAdapter.OFFSET_ITEM) {
MusicPlayerRemote.openAndShuffleQueue(dataSet, true)
return
}
super.onClick(v)
}
}
}

View file

@ -1,69 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.song;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import java.util.ArrayList;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.TintHelper;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.util.MusicUtil;
/**
* Created by Monkey D Luffy on 3/31/2016.
*/
public class SimpleSongAdapter extends SongAdapter {
private int textColor;
public SimpleSongAdapter(AppCompatActivity context, ArrayList<Song> songs, @LayoutRes int i) {
super(context, songs, i, false, null);
textColor = ThemeStore.textColorPrimary(context);
}
public void swapDataSet(ArrayList<Song> arrayList) {
this.dataSet.clear();
this.dataSet = arrayList;
notifyDataSetChanged();
}
@NonNull
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
int fixedTrackNumber = MusicUtil.getFixedTrackNumber(dataSet.get(position).trackNumber);
if (holder.imageText != null) {
holder.imageText.setText(fixedTrackNumber > 0 ? String.valueOf(fixedTrackNumber) : "-");
holder.imageText.setTextColor(textColor);
}
if (holder.time != null) {
holder.time.setText(MusicUtil.getReadableDurationString(dataSet.get(position).duration));
holder.time.setTextColor(textColor);
}
if (holder.title != null) {
holder.title.setTextColor(textColor);
}
if (holder.menu != null) {
TintHelper.setTintAuto(holder.menu, textColor, false);
}
}
public int getItemCount() {
return dataSet.size();
}
public void setTextColor(int textColor) {
this.textColor = textColor;
notifyDataSetChanged();
}
}

View file

@ -0,0 +1,63 @@
package code.name.monkey.retromusic.ui.adapter.song
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import java.util.*
class SimpleSongAdapter(context: AppCompatActivity,
songs: ArrayList<Song>,
@LayoutRes i: Int) : SongAdapter(context, songs, i, false, null) {
private var textColor: Int = 0
init {
textColor = ThemeStore.textColorPrimary(context)
}
override fun swapDataSet(dataSet: ArrayList<Song>) {
this.dataSet.clear()
this.dataSet = dataSet
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
super.onBindViewHolder(holder, position)
val fixedTrackNumber = MusicUtil.getFixedTrackNumber(dataSet[position].trackNumber)
if (holder.imageText != null) {
holder.imageText!!.text = if (fixedTrackNumber > 0) fixedTrackNumber.toString() else "-"
holder.imageText!!.setTextColor(textColor)
}
if (holder.time != null) {
holder.time!!.text = MusicUtil.getReadableDurationString(dataSet[position].duration)
holder.time!!.setTextColor(textColor)
}
if (holder.title != null) {
holder.title!!.setTextColor(textColor)
}
if (holder.menu != null) {
TintHelper.setTintAuto(holder.menu!!, textColor, false)
}
}
override fun getItemCount(): Int {
return dataSet.size
}
fun setTextColor(textColor: Int) {
this.textColor = textColor
notifyDataSetChanged()
}
}

View file

@ -1,295 +0,0 @@
package code.name.monkey.retromusic.ui.adapter.song;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.afollestad.materialcab.MaterialCab;
import com.bumptech.glide.Glide;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
import java.util.ArrayList;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.util.Pair;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.appthemehelper.util.MaterialValueHelper;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget;
import code.name.monkey.retromusic.glide.SongGlideRequest;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.helper.SortOrder;
import code.name.monkey.retromusic.helper.menu.SongMenuHelper;
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter;
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder;
import code.name.monkey.retromusic.util.MusicUtil;
import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.util.PreferenceUtil;
/**
* Created by hemanths on 13/08/17.
*/
public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song>
implements MaterialCab.Callback, FastScrollRecyclerView.SectionedAdapter {
public static final String TAG = SongAdapter.class.getSimpleName();
protected final AppCompatActivity activity;
protected ArrayList<Song> dataSet;
protected int itemLayoutRes;
protected boolean usePalette = false;
private boolean showSectionName = true;
public SongAdapter(AppCompatActivity activity, ArrayList<Song> dataSet,
@LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
this(activity, dataSet, itemLayoutRes, usePalette, cabHolder, true);
}
public SongAdapter(AppCompatActivity activity, ArrayList<Song> dataSet,
@LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder,
boolean showSectionName) {
super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity;
this.dataSet = dataSet;
this.itemLayoutRes = itemLayoutRes;
this.usePalette = usePalette;
this.showSectionName = showSectionName;
setHasStableIds(true);
}
public void swapDataSet(ArrayList<Song> dataSet) {
this.dataSet = dataSet;
notifyDataSetChanged();
}
public void usePalette(boolean usePalette) {
this.usePalette = usePalette;
notifyDataSetChanged();
}
public ArrayList<Song> getDataSet() {
return dataSet;
}
@Override
public long getItemId(int position) {
return dataSet.get(position).id;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false);
return createViewHolder(view);
}
protected ViewHolder createViewHolder(View view) {
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Song song = dataSet.get(position);
boolean isChecked = isChecked(song);
holder.itemView.setActivated(isChecked);
if (holder.getAdapterPosition() == getItemCount() - 1) {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.GONE);
}
} else {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.VISIBLE);
}
}
if (holder.title != null) {
holder.title.setText(getSongTitle(song));
}
if (holder.text != null) {
holder.text.setText(getSongText(song));
}
loadAlbumCover(song, holder);
}
private void setColors(int color, ViewHolder holder) {
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setBackgroundColor(color);
if (holder.title != null) {
holder.title.setTextColor(
MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)));
}
if (holder.text != null) {
holder.text.setTextColor(
MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color)));
}
}
}
protected void loadAlbumCover(Song song, final ViewHolder holder) {
if (holder.image == null) {
return;
}
SongGlideRequest.Builder.from(Glide.with(activity), song)
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
.into(new RetroMusicColoredTarget(holder.image) {
@Override
public void onLoadCleared(Drawable placeholder) {
super.onLoadCleared(placeholder);
setColors(getDefaultFooterColor(), holder);
}
@Override
public void onColorReady(int color) {
setColors(color, holder);
}
});
}
private String getSongTitle(Song song) {
return song.title;
}
private String getSongText(Song song) {
return song.artistName;
}
@Override
public int getItemCount() {
return dataSet.size();
}
@Override
protected Song getIdentifier(int position) {
return dataSet.get(position);
}
@Override
protected String getName(Song song) {
return song.title;
}
@Override
protected void onMultipleItemAction(@NonNull MenuItem menuItem,
@NonNull ArrayList<Song> selection) {
SongsMenuHelper.handleMenuClick(activity, selection, menuItem.getItemId());
}
@NonNull
@Override
public String getSectionName(int position) {
if (!showSectionName) {
return "";
}
@Nullable String sectionName = null;
switch (PreferenceUtil.getInstance().getSongSortOrder()) {
case SortOrder.SongSortOrder.SONG_A_Z:
case SortOrder.SongSortOrder.SONG_Z_A:
sectionName = dataSet.get(position).title;
break;
case SortOrder.SongSortOrder.SONG_ALBUM:
sectionName = dataSet.get(position).albumName;
break;
case SortOrder.SongSortOrder.SONG_ARTIST:
sectionName = dataSet.get(position).artistName;
break;
case SortOrder.SongSortOrder.SONG_YEAR:
return MusicUtil.getYearString(dataSet.get(position).year);
}
return MusicUtil.getSectionName(sectionName);
}
public class ViewHolder extends MediaEntryViewHolder {
int DEFAULT_MENU_RES = SongMenuHelper.MENU_RES;
public ViewHolder(@NonNull View itemView) {
super(itemView);
setImageTransitionName(activity.getString(R.string.transition_album_art));
/*if (mItemView != null) {
mItemView.setOnMenuItemClickListener(new ListItemView.OnMenuItemClickListener() {
@Override
public void onActionMenuItemSelected(MenuItem item) {
SongMenuHelper.handleMenuClick(activity, dataSet.get(getAdapterPosition()), item.getItemId());
}
});
}*/
if (menu == null) {
return;
}
menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override
public Song getSong() {
return ViewHolder.this.getSong();
}
@Override
public int getMenuRes() {
return getSongMenuRes();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
return onSongMenuItemClick(item) || super.onMenuItemClick(item);
}
});
}
protected Song getSong() {
return dataSet.get(getAdapterPosition());
}
protected int getSongMenuRes() {
return DEFAULT_MENU_RES;
}
protected boolean onSongMenuItemClick(MenuItem item) {
if (image != null && image.getVisibility() == View.VISIBLE) {
switch (item.getItemId()) {
case R.id.action_go_to_album:
Pair[] albumPairs = new Pair[]{
Pair.create(imageContainer,
activity.getResources().getString(R.string.transition_album_art))
};
NavigationUtil.goToAlbum(activity, getSong().albumId, albumPairs);
return true;
}
}
return false;
}
@Override
public void onClick(View v) {
if (isInQuickSelectMode()) {
toggleChecked(getAdapterPosition());
} else {
MusicPlayerRemote.openQueue(dataSet, getAdapterPosition(), true);
}
}
@Override
public boolean onLongClick(View view) {
return toggleChecked(getAdapterPosition());
}
}
}

View file

@ -0,0 +1,224 @@
package code.name.monkey.retromusic.ui.adapter.song
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.util.Pair
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.glide.SongGlideRequest
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.ui.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.ui.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import com.afollestad.materialcab.MaterialCab
import com.bumptech.glide.Glide
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import java.util.*
/**
* Created by hemanths on 13/08/17.
*/
open class SongAdapter @JvmOverloads constructor(protected val activity: AppCompatActivity, dataSet: ArrayList<Song>,
@param:LayoutRes protected var itemLayoutRes: Int, usePalette: Boolean, cabHolder: CabHolder?,
showSectionName: Boolean = true) : AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song>(activity, cabHolder, R.menu.menu_media_selection), MaterialCab.Callback, FastScrollRecyclerView.SectionedAdapter {
var dataSet: ArrayList<Song>
protected set
protected var usePalette = false
private var showSectionName = true
init {
this.dataSet = dataSet
this.usePalette = usePalette
this.showSectionName = showSectionName
this.setHasStableIds(true)
}
open fun swapDataSet(dataSet: ArrayList<Song>) {
this.dataSet = dataSet
notifyDataSetChanged()
}
open fun usePalette(usePalette: Boolean) {
this.usePalette = usePalette
notifyDataSetChanged()
}
override fun getItemId(position: Int): Long {
return dataSet[position].id.toLong()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)
return createViewHolder(view)
}
protected open fun createViewHolder(view: View): ViewHolder {
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val song = dataSet[position]
val isChecked = isChecked(song)
holder.itemView.isActivated = isChecked
if (holder.adapterPosition == itemCount - 1) {
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.GONE
}
} else {
if (holder.shortSeparator != null) {
holder.shortSeparator!!.visibility = View.VISIBLE
}
}
if (holder.title != null) {
holder.title!!.text = getSongTitle(song)
}
if (holder.text != null) {
holder.text!!.text = getSongText(song)
}
loadAlbumCover(song, holder)
}
private fun setColors(color: Int, holder: ViewHolder) {
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer!!.setBackgroundColor(color)
if (holder.title != null) {
holder.title!!.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)))
}
if (holder.text != null) {
holder.text!!.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color)))
}
}
}
protected open fun loadAlbumCover(song: Song, holder: ViewHolder) {
if (holder.image == null) {
return
}
SongGlideRequest.Builder.from(Glide.with(activity), song)
.checkIgnoreMediaStore(activity)
.generatePalette(activity).build()
.into(object : RetroMusicColoredTarget(holder.image!!) {
override fun onLoadCleared(placeholder: Drawable?) {
super.onLoadCleared(placeholder)
setColors(defaultFooterColor, holder)
}
override fun onColorReady(color: Int) {
setColors(color, holder)
}
})
}
private fun getSongTitle(song: Song): String? {
return song.title
}
private fun getSongText(song: Song): String? {
return song.artistName
}
override fun getItemCount(): Int {
return dataSet.size
}
override fun getIdentifier(position: Int): Song? {
return dataSet[position]
}
override fun getName(song: Song): String {
return song.title!!
}
override fun onMultipleItemAction(menuItem: MenuItem,
selection: ArrayList<Song>) {
SongsMenuHelper.handleMenuClick(activity, selection, menuItem.itemId)
}
override fun getSectionName(position: Int): String {
var sectionName: String? = null
when (PreferenceUtil.getInstance().songSortOrder) {
SortOrder.SongSortOrder.SONG_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> sectionName = dataSet[position].title
SortOrder.SongSortOrder.SONG_ALBUM -> sectionName = dataSet[position].albumName
SortOrder.SongSortOrder.SONG_ARTIST -> sectionName = dataSet[position].artistName
SortOrder.SongSortOrder.SONG_YEAR -> return MusicUtil.getYearString(dataSet[position].year)
}
return MusicUtil.getSectionName(sectionName)
}
open inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
protected open var songMenuRes = SongMenuHelper.MENU_RES
protected open val song: Song
get() = dataSet[adapterPosition]
init {
setImageTransitionName(activity.getString(R.string.transition_album_art))
menu!!.setOnClickListener(object : SongMenuHelper.OnClickSongMenu(activity) {
override val song: Song
get() = this@ViewHolder.song
override val menuRes: Int
get() = songMenuRes
override fun onMenuItemClick(item: MenuItem): Boolean {
return onSongMenuItemClick(item) || super.onMenuItemClick(item)
}
})
}
protected open fun onSongMenuItemClick(item: MenuItem): Boolean {
if (image != null && image!!.visibility == View.VISIBLE) {
when (item.itemId) {
R.id.action_go_to_album -> {
val albumPairs = arrayOf<Pair<*, *>>(Pair.create(imageContainer,
activity.resources.getString(R.string.transition_album_art)))
NavigationUtil.goToAlbum(activity, song.albumId, *albumPairs)
return true
}
}
}
return false
}
override fun onClick(v: View?) {
if (isInQuickSelectMode) {
toggleChecked(adapterPosition)
} else {
MusicPlayerRemote.openQueue(dataSet, adapterPosition, true)
}
}
override fun onLongClick(v: View?): Boolean {
return toggleChecked(adapterPosition)
}
}
companion object {
val TAG = SongAdapter::class.java.simpleName
}
}

View file

@ -1,228 +0,0 @@
package code.name.monkey.retromusic.ui.fragments;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.util.Pair;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper;
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.ui.fragments.base.AbsMusicServiceFragment;
import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.util.PreferenceUtil;
import code.name.monkey.retromusic.util.RetroUtil;
import me.zhanghai.android.materialprogressbar.MaterialProgressBar;
public class MiniPlayerFragment extends AbsMusicServiceFragment implements MusicProgressViewUpdateHelper.Callback {
@BindView(R.id.mini_player_title)
TextView miniPlayerTitle;
@BindView(R.id.mini_player_play_pause_button)
ImageView miniPlayerPlayPauseButton;
@BindView(R.id.action_next)
View next;
@BindView(R.id.action_prev)
View previous;
@BindView(R.id.action_playing_queue)
View playingQueue;
@BindView(R.id.progress_bar)
MaterialProgressBar progressBar;
private Unbinder unbinder;
private MusicProgressViewUpdateHelper progressViewUpdateHelper;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
progressViewUpdateHelper = new MusicProgressViewUpdateHelper(this);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragment_mini_player, container, false);
unbinder = ButterKnife.bind(this, layout);
return layout;
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//noinspection ConstantConditions
view.setBackgroundColor(ThemeStore.primaryColor(getContext()));
view.setOnTouchListener(new FlingPlayBackController(getActivity()));
//view.setOnClickListener(v -> NavigationUtil.gotoNowPlayingActivity(getContext()));
setUpMiniPlayer();
if (RetroUtil.isTablet()) {
next.setVisibility(View.VISIBLE);
previous.setVisibility(View.VISIBLE);
playingQueue.setVisibility(View.VISIBLE);
} else{
next.setVisibility(PreferenceUtil.getInstance().isExtraMiniExtraControls() ? View.VISIBLE : View.GONE);
playingQueue.setVisibility(PreferenceUtil.getInstance().isExtraMiniExtraControls() ? View.GONE : View.VISIBLE);
previous.setVisibility(PreferenceUtil.getInstance().isExtraMiniExtraControls() ? View.VISIBLE : View.GONE);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
@SuppressWarnings({"ConstantConditions"})
private void setUpMiniPlayer() {
setUpPlayPauseButton();
progressBar.setProgressTintList(ColorStateList.valueOf(ThemeStore.accentColor(getActivity())));
}
private void setUpPlayPauseButton() {
//noinspection ConstantConditions
miniPlayerPlayPauseButton.setOnClickListener(new PlayPauseButtonOnClickHandler());
}
private void updateSongTitle() {
SpannableStringBuilder builder = new SpannableStringBuilder();
Song song = MusicPlayerRemote.getCurrentSong();
if (song == null) {
return;
}
SpannableString title = new SpannableString(song.title);
title.setSpan(new ForegroundColorSpan(ThemeStore.textColorPrimary(getContext())), 0, title.length(), 0);
SpannableString text = new SpannableString(song.artistName);
text.setSpan(new ForegroundColorSpan(ThemeStore.textColorSecondary(getContext())), 0, text.length(), 0);
builder.append(title).append("").append(text);
miniPlayerTitle.setSelected(true);
miniPlayerTitle.setText(builder);
}
@Override
public void onServiceConnected() {
updateSongTitle();
updatePlayPauseDrawableState();
}
@Override
public void onPlayingMetaChanged() {
updateSongTitle();
}
@Override
public void onPlayStateChanged() {
updatePlayPauseDrawableState();
}
@Override
public void onUpdateProgressViews(int progress, int total) {
progressBar.setMax(total);
ObjectAnimator animator = ObjectAnimator.ofInt(progressBar, "progress", progress);
animator.setDuration(1000);
animator.setInterpolator(new DecelerateInterpolator());
animator.start();
}
@Override
public void onResume() {
super.onResume();
progressViewUpdateHelper.start();
}
@Override
public void onPause() {
super.onPause();
progressViewUpdateHelper.stop();
}
protected void updatePlayPauseDrawableState() {
if (MusicPlayerRemote.isPlaying()) {
miniPlayerPlayPauseButton.setImageResource(R.drawable.ic_pause_white_24dp);
} else {
miniPlayerPlayPauseButton.setImageResource(R.drawable.ic_play_arrow_white_24dp);
}
}
public void setColor(int playerFragmentColor) {
//noinspection ConstantConditions
getView().setBackgroundColor(playerFragmentColor);
}
@OnClick({R.id.action_prev, R.id.action_playing_queue, R.id.action_next})
void onClicks(View view) {
switch (view.getId()) {
case R.id.action_playing_queue:
NavigationUtil.goToPlayingQueue(getActivity());
break;
case R.id.action_next:
MusicPlayerRemote.playNextSong();
break;
case R.id.action_prev:
MusicPlayerRemote.back();
break;
}
}
public static class FlingPlayBackController implements View.OnTouchListener {
GestureDetector flingPlayBackController;
public FlingPlayBackController(Context context) {
flingPlayBackController = new GestureDetector(context,
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (Math.abs(velocityX) > Math.abs(velocityY)) {
if (velocityX < 0) {
MusicPlayerRemote.playNextSong();
return true;
} else if (velocityX > 0) {
MusicPlayerRemote.playPreviousSong();
return true;
}
}
return false;
}
});
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
return flingPlayBackController.onTouchEvent(event);
}
}
}

View file

@ -0,0 +1,165 @@
package code.name.monkey.retromusic.ui.fragments
import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.ColorStateList
import android.os.Bundle
import android.text.SpannableString
import android.text.SpannableStringBuilder
import android.text.style.ForegroundColorSpan
import android.view.*
import android.view.animation.DecelerateInterpolator
import butterknife.OnClick
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.ui.fragments.base.AbsMusicServiceFragment
import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import kotlinx.android.synthetic.main.fragment_mini_player.*
open class MiniPlayerFragment : AbsMusicServiceFragment(), MusicProgressViewUpdateHelper.Callback, View.OnClickListener {
private var progressViewUpdateHelper: MusicProgressViewUpdateHelper? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
progressViewUpdateHelper = MusicProgressViewUpdateHelper(this)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_mini_player, container, false)
}
override fun onClick(view: View) {
when (view.id) {
R.id.actionPlayingQueue -> NavigationUtil.goToPlayingQueue(activity!!)
R.id.actionNext -> MusicPlayerRemote.playNextSong()
R.id.actionPrevious -> MusicPlayerRemote.back()
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.setBackgroundColor(ThemeStore.primaryColor(context!!))
view.setOnTouchListener(FlingPlayBackController(context!!))
//view.setOnClickListener(v -> NavigationUtil.gotoNowPlayingActivity(getContext()));
setUpMiniPlayer()
if (RetroUtil.isTablet()) {
actionNext!!.visibility = View.VISIBLE
actionPrevious!!.visibility = View.VISIBLE
actionPlayingQueue!!.visibility = View.VISIBLE
} else {
actionNext!!.visibility = if (PreferenceUtil.getInstance().isExtraMiniExtraControls) View.VISIBLE else View.GONE
actionPlayingQueue!!.visibility = if (PreferenceUtil.getInstance().isExtraMiniExtraControls) View.GONE else View.VISIBLE
actionPrevious!!.visibility = if (PreferenceUtil.getInstance().isExtraMiniExtraControls) View.VISIBLE else View.GONE
}
actionPlayingQueue.setOnClickListener(this)
actionNext.setOnClickListener(this)
actionPrevious.setOnClickListener(this)
}
private fun setUpMiniPlayer() {
setUpPlayPauseButton()
progressBar!!.progressTintList = ColorStateList.valueOf(ThemeStore.accentColor(activity!!))
}
private fun setUpPlayPauseButton() {
miniPlayerPlayPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler())
}
private fun updateSongTitle() {
val builder = SpannableStringBuilder()
val song = MusicPlayerRemote.currentSong ?: return
val title = SpannableString(song.title)
title.setSpan(ForegroundColorSpan(ThemeStore.textColorPrimary(context!!)), 0, title.length, 0)
val text = SpannableString(song.artistName)
text.setSpan(ForegroundColorSpan(ThemeStore.textColorSecondary(context!!)), 0, text.length, 0)
builder.append(title).append("").append(text)
miniPlayerTitle.isSelected = true
miniPlayerTitle.text = builder
}
override fun onServiceConnected() {
updateSongTitle()
updatePlayPauseDrawableState()
}
override fun onPlayingMetaChanged() {
updateSongTitle()
}
override fun onPlayStateChanged() {
updatePlayPauseDrawableState()
}
override fun onUpdateProgressViews(progress: Int, total: Int) {
progressBar.max = total
val animator = ObjectAnimator.ofInt(progressBar, "progress", progress)
animator.duration = 1000
animator.interpolator = DecelerateInterpolator()
animator.start()
}
override fun onResume() {
super.onResume()
progressViewUpdateHelper!!.start()
}
override fun onPause() {
super.onPause()
progressViewUpdateHelper!!.stop()
}
protected fun updatePlayPauseDrawableState() {
if (MusicPlayerRemote.isPlaying) {
miniPlayerPlayPauseButton!!.setImageResource(R.drawable.ic_pause_white_24dp)
} else {
miniPlayerPlayPauseButton!!.setImageResource(R.drawable.ic_play_arrow_white_24dp)
}
}
fun setColor(playerFragmentColor: Int) {
view!!.setBackgroundColor(playerFragmentColor)
}
class FlingPlayBackController(context: Context) : View.OnTouchListener {
internal var flingPlayBackController: GestureDetector
init {
flingPlayBackController = GestureDetector(context,
object : GestureDetector.SimpleOnGestureListener() {
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float,
velocityY: Float): Boolean {
if (Math.abs(velocityX) > Math.abs(velocityY)) {
if (velocityX < 0) {
MusicPlayerRemote.playNextSong()
return true
} else if (velocityX > 0) {
MusicPlayerRemote.playPreviousSong()
return true
}
}
return false
}
})
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(v: View, event: MotionEvent): Boolean {
return flingPlayBackController.onTouchEvent(event)
}
}
}

View file

@ -8,18 +8,7 @@ import code.name.monkey.retromusic.R;
public enum NowPlayingScreen {
ADAPTIVE(R.string.adaptive, R.drawable.np_adaptive, 10),
BLUR(R.string.blur, R.drawable.np_blur, 4),
CARD(R.string.card, R.drawable.np_card, 6),
COLOR(R.string.color, R.drawable.np_color, 5),
BLUR_CARD(R.string.blur_card, R.drawable.np_blur_card, 9),
FIT(R.string.fit, R.drawable.np_adaptive, 12),
FLAT(R.string.flat, R.drawable.np_flat, 1),
FULL(R.string.full, R.drawable.np_full, 2),
TINY(R.string.tiny, R.drawable.np_tiny, 7),
MATERIAL(R.string.material, R.drawable.np_material, 11),
NORMAL(R.string.normal, R.drawable.np_normal, 0),
PLAIN(R.string.plain, R.drawable.np_plain, 3),
SIMPLE(R.string.simple, R.drawable.np_simple, 8);
BLUR(R.string.blur, R.drawable.np_blur, 4);
@StringRes
public final int titleRes;

View file

@ -58,8 +58,8 @@ public class PlayingQueueFragment extends AbsMusicServiceFragment {
mPlayingQueueAdapter = new PlayingQueueAdapter(
(AppCompatActivity) getActivity(),
MusicPlayerRemote.getPlayingQueue(),
MusicPlayerRemote.getPosition(),
MusicPlayerRemote.INSTANCE.getPlayingQueue(),
MusicPlayerRemote.INSTANCE.getPosition(),
R.layout.item_queue);
mWrappedAdapter = mRecyclerViewDragDropManager.createWrappedAdapter(mPlayingQueueAdapter);
@ -69,7 +69,7 @@ public class PlayingQueueFragment extends AbsMusicServiceFragment {
mRecyclerView.setAdapter(mWrappedAdapter);
mRecyclerView.setItemAnimator(animator);
mRecyclerViewDragDropManager.attachRecyclerView(mRecyclerView);
mLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.getPosition() + 1, 0);
mLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.INSTANCE.getPosition() + 1, 0);
}
@ -98,7 +98,7 @@ public class PlayingQueueFragment extends AbsMusicServiceFragment {
}
private void updateQueuePosition() {
mPlayingQueueAdapter.setCurrent(MusicPlayerRemote.getPosition());
mPlayingQueueAdapter.setCurrent(MusicPlayerRemote.INSTANCE.getPosition());
// if (slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
resetToCurrentPosition();
//}
@ -106,13 +106,13 @@ public class PlayingQueueFragment extends AbsMusicServiceFragment {
private void updateQueue() {
mPlayingQueueAdapter
.swapDataSet(MusicPlayerRemote.getPlayingQueue(), MusicPlayerRemote.getPosition());
.swapDataSet(MusicPlayerRemote.INSTANCE.getPlayingQueue(), MusicPlayerRemote.INSTANCE.getPosition());
resetToCurrentPosition();
}
private void resetToCurrentPosition() {
mRecyclerView.stopScroll();
mLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.getPosition() + 1, 0);
mLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.INSTANCE.getPosition() + 1, 0);
}
@Override

View file

@ -1,172 +0,0 @@
package code.name.monkey.retromusic.ui.fragments;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.SeekBar;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;
import code.name.monkey.appthemehelper.util.ATHUtil;
import code.name.monkey.appthemehelper.util.TintHelper;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.util.PreferenceUtil;
import code.name.monkey.retromusic.volume.AudioVolumeObserver;
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener;
public class VolumeFragment extends Fragment implements SeekBar.OnSeekBarChangeListener,
OnAudioVolumeChangedListener {
@BindView(R.id.volume_seekbar)
SeekBar volumeSeekbar;
@BindView(R.id.volume_down)
ImageView volumeDown;
@BindView(R.id.container)
ViewGroup viewGroup;
@BindView(R.id.volume_up)
ImageView volumeUp;
private Unbinder unbinder;
private AudioVolumeObserver mAudioVolumeObserver;
public static VolumeFragment newInstance() {
return new VolumeFragment();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_volume, container, false);
unbinder = ButterKnife.bind(this, view);
return view;
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//noinspection ConstantConditions
setTintable(ATHUtil.resolveColor(getContext(), R.attr.iconColor));
}
@Override
public void onResume() {
super.onResume();
if (mAudioVolumeObserver == null) {
//noinspection ConstantConditions
mAudioVolumeObserver = new AudioVolumeObserver(getActivity());
}
mAudioVolumeObserver.register(AudioManager.STREAM_MUSIC, this);
AudioManager audioManager = getAudioManager();
if (audioManager != null) {
volumeSeekbar.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
volumeSeekbar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
}
volumeSeekbar.setOnSeekBarChangeListener(this);
}
@Override
public void onAudioVolumeChanged(int currentVolume, int maxVolume) {
if (volumeSeekbar == null) {
return;
}
volumeSeekbar.setMax(maxVolume);
volumeSeekbar.setProgress(currentVolume);
volumeDown.setImageResource(currentVolume == 0 ? R.drawable.ic_volume_off_white_24dp : R.drawable.ic_volume_down_white_24dp);
}
private AudioManager getAudioManager() {
//noinspection ConstantConditions
return (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
if (mAudioVolumeObserver != null) {
mAudioVolumeObserver.unregister();
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
AudioManager audioManager = getAudioManager();
if (audioManager != null) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0);
}
setPauseWhenZeroVolume(i < 1);
volumeDown.setImageResource(i == 0 ? R.drawable.ic_volume_off_white_24dp : R.drawable.ic_volume_down_white_24dp);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@OnClick({R.id.volume_down, R.id.volume_up})
public void onViewClicked(View view) {
AudioManager audioManager = getAudioManager();
switch (view.getId()) {
case R.id.volume_down:
if (audioManager != null) {
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0);
}
break;
case R.id.volume_up:
if (audioManager != null) {
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
}
break;
}
}
public void tintWhiteColor() {
setProgressBarColor(Color.WHITE);
}
private void setProgressBarColor(int newColor) {
TintHelper.setTintAuto(volumeSeekbar, newColor, false);
volumeDown.setColorFilter(newColor, PorterDuff.Mode.SRC_IN);
volumeUp.setColorFilter(newColor, PorterDuff.Mode.SRC_IN);
}
public void setTintable(int color) {
setProgressBarColor(color);
}
public void removeThumb() {
volumeSeekbar.setThumb(null);
}
private void setPauseWhenZeroVolume(boolean pauseWhenZeroVolume) {
if (PreferenceUtil.getInstance().pauseOnZeroVolume() && pauseWhenZeroVolume)
if (MusicPlayerRemote.isPlaying()) {
MusicPlayerRemote.pauseSong();
} else {
MusicPlayerRemote.resumePlaying();
}
}
}

View file

@ -0,0 +1,129 @@
package code.name.monkey.retromusic.ui.fragments
import android.content.Context
import android.graphics.Color
import android.graphics.PorterDuff
import android.media.AudioManager
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.SeekBar
import androidx.fragment.app.Fragment
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.volume.AudioVolumeObserver
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
import kotlinx.android.synthetic.main.fragment_volume.*
class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolumeChangedListener, View.OnClickListener {
private var audioVolumeObserver: AudioVolumeObserver? = null
private val audioManager: AudioManager?
get() = context!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_volume, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setTintable(ATHUtil.resolveColor(context, R.attr.iconColor))
volumeDown.setOnClickListener(this)
volumeUp.setOnClickListener(this)
}
override fun onResume() {
super.onResume()
if (audioVolumeObserver == null) {
audioVolumeObserver = AudioVolumeObserver(activity!!)
}
audioVolumeObserver!!.register(AudioManager.STREAM_MUSIC, this)
val audioManager = audioManager
if (audioManager != null) {
volumeSeekBar!!.max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
volumeSeekBar!!.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
}
volumeSeekBar!!.setOnSeekBarChangeListener(this)
}
override fun onAudioVolumeChanged(currentVolume: Int, maxVolume: Int) {
if (volumeSeekBar == null) {
return
}
volumeSeekBar!!.max = maxVolume
volumeSeekBar!!.progress = currentVolume
volumeDown!!.setImageResource(if (currentVolume == 0) R.drawable.ic_volume_off_white_24dp else R.drawable.ic_volume_down_white_24dp)
}
override fun onDestroyView() {
super.onDestroyView()
if (audioVolumeObserver != null) {
audioVolumeObserver!!.unregister()
}
}
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
val audioManager = audioManager
audioManager?.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0)
setPauseWhenZeroVolume(i < 1)
volumeDown!!.setImageResource(if (i == 0) R.drawable.ic_volume_off_white_24dp else R.drawable.ic_volume_down_white_24dp)
}
override fun onStartTrackingTouch(seekBar: SeekBar) {
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
}
override fun onClick(view: View) {
val audioManager = audioManager
when (view.id) {
R.id.volumeDown -> audioManager?.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0)
R.id.volumeUp -> audioManager?.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0)
}
}
fun tintWhiteColor() {
setProgressBarColor(Color.WHITE)
}
private fun setProgressBarColor(newColor: Int) {
TintHelper.setTintAuto(volumeSeekBar!!, newColor, false)
volumeDown!!.setColorFilter(newColor, PorterDuff.Mode.SRC_IN)
volumeUp!!.setColorFilter(newColor, PorterDuff.Mode.SRC_IN)
}
private fun setTintable(color: Int) {
setProgressBarColor(color)
}
fun removeThumb() {
volumeSeekBar!!.thumb = null
}
private fun setPauseWhenZeroVolume(pauseWhenZeroVolume: Boolean) {
if (PreferenceUtil.getInstance().pauseOnZeroVolume() && pauseWhenZeroVolume)
if (MusicPlayerRemote.isPlaying) {
MusicPlayerRemote.pauseSong()
} else {
MusicPlayerRemote.resumePlaying()
}
}
companion object {
fun newInstance(): VolumeFragment {
return VolumeFragment()
}
}
}

View file

@ -1,19 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.base;
import android.os.Bundle;
import code.name.monkey.retromusic.ui.fragments.mainactivity.LibraryFragment;
public class AbsLibraryPagerFragment extends AbsMusicServiceFragment {
public LibraryFragment getLibraryFragment() {
return (LibraryFragment) getParentFragment();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
}

View file

@ -0,0 +1,17 @@
package code.name.monkey.retromusic.ui.fragments.base
import android.os.Bundle
import code.name.monkey.retromusic.ui.fragments.mainactivity.LibraryFragment
open class AbsLibraryPagerFragment : AbsMusicServiceFragment() {
val libraryFragment: LibraryFragment
get() = parentFragment as LibraryFragment
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
}
}

View file

@ -1,169 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.base;
import android.os.Bundle;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.util.RetroUtil;
public abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends
AbsLibraryPagerRecyclerViewFragment<A, LM> {
private int gridSize;
private String sortOrder;
private boolean usePaletteInitialized;
private boolean usePalette;
private int currentLayoutRes;
public final int getGridSize() {
if (gridSize == 0) {
if (isLandscape()) {
gridSize = loadGridSizeLand();
} else {
gridSize = loadGridSize();
}
}
return gridSize;
}
protected abstract void setGridSize(int gridSize);
public final String getSortOrder() {
if (sortOrder == null) {
sortOrder = loadSortOrder();
}
return sortOrder;
}
protected abstract void setSortOrder(String sortOrder);
public void setAndSaveSortOrder(final String sortOrder) {
this.sortOrder = sortOrder;
saveSortOrder(sortOrder);
setSortOrder(sortOrder);
}
public int getMaxGridSize() {
if (isLandscape()) {
return getResources().getInteger(R.integer.max_columns_land);
} else {
return getResources().getInteger(R.integer.max_columns);
}
}
/**
* @return whether the palette should be used at all or not
*/
public final boolean usePalette() {
if (!usePaletteInitialized) {
usePalette = loadUsePalette();
usePaletteInitialized = true;
}
return usePalette;
}
public void setAndSaveGridSize(final int gridSize) {
int oldLayoutRes = getItemLayoutRes();
this.gridSize = gridSize;
if (isLandscape()) {
saveGridSizeLand(gridSize);
} else {
saveGridSize(gridSize);
}
// only recreate the adapter and layout manager if the layout currentLayoutRes has changed
if (oldLayoutRes != getItemLayoutRes()) {
invalidateLayoutManager();
invalidateAdapter();
} else {
setGridSize(gridSize);
}
}
public void setAndSaveUsePalette(final boolean usePalette) {
this.usePalette = usePalette;
saveUsePalette(usePalette);
setUsePalette(usePalette);
}
/**
* @return whether the palette option should be available for the current item layout or not
*/
public boolean canUsePalette() {
return getItemLayoutRes() == R.layout.item_color;
}
/**
* Override to customize which item layout currentLayoutRes should be used. You might also want to
* override {@link #canUsePalette()} then.
*
* @see #getGridSize()
*/
@LayoutRes
protected int getItemLayoutRes() {
if (getGridSize() > getMaxGridSizeForList()) {
return R.layout.item_grid;
}
return R.layout.item_list;
}
protected final void notifyLayoutResChanged(@LayoutRes int res) {
this.currentLayoutRes = res;
RecyclerView recyclerView = getRecyclerView();
if (recyclerView != null) {
applyRecyclerViewPaddingForLayoutRes(recyclerView, currentLayoutRes);
}
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
applyRecyclerViewPaddingForLayoutRes(getRecyclerView(), currentLayoutRes);
}
protected void applyRecyclerViewPaddingForLayoutRes(@NonNull RecyclerView recyclerView,
@LayoutRes int res) {
int padding;
if (res == R.layout.item_grid) {
padding = (int) (getResources().getDisplayMetrics().density * 2);
} else {
padding = 0;
}
recyclerView.setPadding(padding, padding, padding, padding);
}
protected abstract String loadSortOrder();
protected abstract void saveSortOrder(String sortOrder);
protected abstract int loadGridSize();
protected abstract void saveGridSize(int gridColumns);
protected abstract int loadGridSizeLand();
protected abstract void saveGridSizeLand(int gridColumns);
protected abstract void saveUsePalette(boolean usePalette);
protected abstract boolean loadUsePalette();
protected abstract void setUsePalette(boolean usePalette);
protected int getMaxGridSizeForList() {
if (isLandscape()) {
return getActivity().getResources().getInteger(R.integer.default_list_columns_land);
}
return getActivity().getResources().getInteger(R.integer.default_list_columns);
}
protected final boolean isLandscape() {
return RetroUtil.isLandscape( );
}
}

View file

@ -0,0 +1,157 @@
package code.name.monkey.retromusic.ui.fragments.base
import android.os.Bundle
import android.view.View
import androidx.annotation.LayoutRes
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.util.RetroUtil
abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment<A : RecyclerView.Adapter<*>, LM : RecyclerView.LayoutManager> : AbsLibraryPagerRecyclerViewFragment<A, LM>() {
private var gridSize: Int = 0
private var sortOrder: String? = null
private var usePaletteInitialized: Boolean = false
private var usePalette: Boolean = false
private var currentLayoutRes: Int = 0
val maxGridSize: Int
get() = if (isLandscape) {
resources.getInteger(R.integer.max_columns_land)
} else {
resources.getInteger(R.integer.max_columns)
}
/**
* Override to customize which item layout currentLayoutRes should be used. You might also want to
* override [.canUsePalette] then.
*
* @see .getGridSize
*/
protected val itemLayoutRes: Int
@LayoutRes
get() = if (getGridSize() > maxGridSizeForList) {
R.layout.item_grid
} else R.layout.item_list
protected val maxGridSizeForList: Int
get() = if (isLandscape) {
activity!!.resources.getInteger(R.integer.default_list_columns_land)
} else activity!!.resources.getInteger(R.integer.default_list_columns)
protected val isLandscape: Boolean
get() = RetroUtil.isLandscape()
fun getGridSize(): Int {
if (gridSize == 0) {
if (isLandscape) {
gridSize = loadGridSizeLand()
} else {
gridSize = loadGridSize()
}
}
return gridSize
}
protected abstract fun setGridSize(gridSize: Int)
fun getSortOrder(): String? {
if (sortOrder == null) {
sortOrder = loadSortOrder()
}
return sortOrder
}
protected abstract fun setSortOrder(sortOrder: String)
fun setAndSaveSortOrder(sortOrder: String) {
this.sortOrder = sortOrder
saveSortOrder(sortOrder)
setSortOrder(sortOrder)
}
/**
* @return whether the palette should be used at all or not
*/
fun usePalette(): Boolean {
if (!usePaletteInitialized) {
usePalette = loadUsePalette()
usePaletteInitialized = true
}
return usePalette
}
fun setAndSaveGridSize(gridSize: Int) {
val oldLayoutRes = itemLayoutRes
this.gridSize = gridSize
if (isLandscape) {
saveGridSizeLand(gridSize)
} else {
saveGridSize(gridSize)
}
// only recreate the adapter and layout manager if the layout currentLayoutRes has changed
if (oldLayoutRes != itemLayoutRes) {
invalidateLayoutManager()
invalidateAdapter()
} else {
setGridSize(gridSize)
}
}
fun setAndSaveUsePalette(usePalette: Boolean) {
this.usePalette = usePalette
saveUsePalette(usePalette)
setUsePalette(usePalette)
}
/**
* @return whether the palette option should be available for the current item layout or not
*/
fun canUsePalette(): Boolean {
return itemLayoutRes == R.layout.item_color
}
protected fun notifyLayoutResChanged(@LayoutRes res: Int) {
this.currentLayoutRes = res
val recyclerView = recyclerView()
applyRecyclerViewPaddingForLayoutRes(recyclerView, currentLayoutRes)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
applyRecyclerViewPaddingForLayoutRes(recyclerView(), currentLayoutRes)
}
private fun applyRecyclerViewPaddingForLayoutRes(recyclerView: RecyclerView,
@LayoutRes res: Int) {
val padding: Int
if (res == R.layout.item_grid) {
padding = (resources.displayMetrics.density * 2).toInt()
} else {
padding = 0
}
recyclerView.setPadding(padding, padding, padding, padding)
}
protected abstract fun loadSortOrder(): String
protected abstract fun saveSortOrder(sortOrder: String)
protected abstract fun loadGridSize(): Int
protected abstract fun saveGridSize(gridColumns: Int)
protected abstract fun loadGridSizeLand(): Int
protected abstract fun saveGridSizeLand(gridColumns: Int)
protected abstract fun saveUsePalette(usePalette: Boolean)
protected abstract fun loadUsePalette(): Boolean
protected abstract fun setUsePalette(usePalette: Boolean)
}

View file

@ -1,162 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.base;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.util.ViewUtil;
public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends
AbsLibraryPagerFragment implements OnOffsetChangedListener {
public static final String TAG = AbsLibraryPagerRecyclerViewFragment.class.getSimpleName();
@BindView(R.id.container)
ViewGroup container;
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
@BindView(android.R.id.empty)
TextView empty;
private Unbinder unbinder;
private A adapter;
private LM layoutManager;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getLayoutRes(), container, false);
unbinder = ButterKnife.bind(this, view);
return view;
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getLibraryFragment().addOnAppBarOffsetChangedListener(this);
initLayoutManager();
initAdapter();
setUpRecyclerView();
}
private void setUpRecyclerView() {
if (recyclerView instanceof FastScrollRecyclerView) {
//noinspection ConstantConditions
ViewUtil.setUpFastScrollRecyclerViewColor(getActivity(),
((FastScrollRecyclerView) recyclerView), ThemeStore.accentColor(getActivity()));
}
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
}
@Override
public void onQueueChanged() {
super.onQueueChanged();
checkForPadding();
}
@Override
public void onServiceConnected() {
super.onServiceConnected();
checkForPadding();
}
private void checkForPadding() {
int height = (MusicPlayerRemote.getPlayingQueue().isEmpty() ? getResources()
.getDimensionPixelSize(R.dimen.mini_player_height) : 0);
recyclerView.setPadding(0, 0, 0, height);
}
protected void invalidateLayoutManager() {
initLayoutManager();
recyclerView.setLayoutManager(layoutManager);
}
protected void invalidateAdapter() {
initAdapter();
checkIsEmpty();
recyclerView.setAdapter(adapter);
}
private void initAdapter() {
adapter = createAdapter();
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
checkIsEmpty();
checkForPadding();
}
});
}
private void initLayoutManager() {
layoutManager = createLayoutManager();
}
protected A getAdapter() {
return adapter;
}
protected LM getLayoutManager() {
return layoutManager;
}
protected RecyclerView getRecyclerView() {
return recyclerView;
}
public ViewGroup getContainer() {
return container;
}
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int i) {
container.setPadding(container.getPaddingLeft(), container.getPaddingTop(),
container.getPaddingRight(), getLibraryFragment().getTotalAppBarScrollingRange() + i);
}
private void checkIsEmpty() {
empty.setText(getEmptyMessage());
empty.setVisibility(adapter == null || adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
}
@StringRes
protected int getEmptyMessage() {
return R.string.empty;
}
@LayoutRes
protected int getLayoutRes() {
return R.layout.fragment_main_activity_recycler_view;
}
protected abstract LM createLayoutManager();
@NonNull
protected abstract A createAdapter();
@Override
public void onDestroyView() {
super.onDestroyView();
getLibraryFragment().removeOnAppBarOffsetChangedListener(this);
unbinder.unbind();
}
}

View file

@ -0,0 +1,116 @@
package code.name.monkey.retromusic.ui.fragments.base
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.NonNull
import androidx.annotation.StringRes
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.ViewUtil
import com.google.android.material.appbar.AppBarLayout
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import kotlinx.android.synthetic.main.fragment_main_activity_recycler_view.*
abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : RecyclerView.LayoutManager> : AbsLibraryPagerFragment(), AppBarLayout.OnOffsetChangedListener {
protected var adapter: A? = null
protected var layoutManager: LM? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_main_activity_recycler_view, container, false);
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
libraryFragment.addOnAppBarOffsetChangedListener(this)
initLayoutManager()
initAdapter()
setUpRecyclerView()
}
private fun setUpRecyclerView() {
if (recyclerView is FastScrollRecyclerView) {
ViewUtil.setUpFastScrollRecyclerViewColor(activity, recyclerView as FastScrollRecyclerView, ThemeStore.accentColor(activity!!))
}
recyclerView.layoutManager = layoutManager
recyclerView.adapter = adapter
}
private fun initAdapter() {
adapter = createAdapter()
adapter!!.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
checkIsEmpty()
checkForPadding()
}
})
}
protected open val emptyMessage: Int
@StringRes
get() = R.string.empty
private fun checkIsEmpty() {
empty.setText(emptyMessage)
empty.visibility = if (adapter!!.itemCount == 0) View.VISIBLE else View.GONE
}
private fun checkForPadding() {
val height = if (MusicPlayerRemote.playingQueue.isEmpty())
resources.getDimensionPixelSize(R.dimen.mini_player_height)
else
0
recyclerView.setPadding(0, 0, 0, height)
}
private fun initLayoutManager() {
layoutManager = createLayoutManager()
}
protected abstract fun createLayoutManager(): LM
@NonNull
protected abstract fun createAdapter(): A
override fun onOffsetChanged(p0: AppBarLayout?, i: Int) {
container.setPadding(container.paddingLeft, container.paddingTop,
container.paddingRight, libraryFragment.totalAppBarScrollingRange + i)
}
override fun onQueueChanged() {
super.onQueueChanged()
checkForPadding()
}
override fun onServiceConnected() {
super.onServiceConnected()
checkForPadding()
}
protected fun invalidateLayoutManager() {
initLayoutManager()
recyclerView.layoutManager = layoutManager
}
protected fun invalidateAdapter() {
initAdapter()
checkIsEmpty()
recyclerView.adapter = adapter
}
override fun onDestroyView() {
super.onDestroyView()
libraryFragment.removeOnAppBarOffsetChangedListener(this)
}
fun recyclerView(): RecyclerView {
return recyclerView
}
}

View file

@ -1,58 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.base;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ColorUtil;
import code.name.monkey.appthemehelper.util.VersionUtils;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.dialogs.MainOptionsBottomSheetDialogFragment;
import code.name.monkey.retromusic.ui.activities.MainActivity;
public abstract class AbsMainActivityFragment extends AbsMusicServiceFragment {
public MainActivity getMainActivity() {
return (MainActivity) getActivity();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
getMainActivity().setNavigationbarColorAuto();
getMainActivity().setLightNavigationBar(true);
getMainActivity().setTaskDescriptionColorAuto();
getMainActivity().hideStatusBar();
getMainActivity().setBottomBarVisibility(View.VISIBLE);
}
private void setStatusbarColor(View view, int color) {
final View statusBar = view.findViewById(R.id.status_bar);
if (statusBar != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
statusBar.setBackgroundColor(color);
getMainActivity().setLightStatusbarAuto(color);
} else {
statusBar.setBackgroundColor(color);
}
}
}
public void setStatusbarColorAuto(View view) {
// we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat
//noinspection ConstantConditions
if (VersionUtils.hasMarshmallow()) {
setStatusbarColor(view, ThemeStore.primaryColor(getContext()));
} else {
setStatusbarColor(view, ColorUtil.darkenColor(ThemeStore.primaryColor(getContext())));
}
}
protected void showMainMenu() {
MainOptionsBottomSheetDialogFragment.newInstance().show(getChildFragmentManager(), "Main Menu");
}
}

View file

@ -0,0 +1,56 @@
package code.name.monkey.retromusic.ui.fragments.base
import android.os.Build
import android.os.Bundle
import android.view.View
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.dialogs.MainOptionsBottomSheetDialogFragment
import code.name.monkey.retromusic.ui.activities.MainActivity
abstract class AbsMainActivityFragment : AbsMusicServiceFragment() {
val mainActivity: MainActivity
get() = activity as MainActivity
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
mainActivity.setNavigationbarColorAuto()
mainActivity.setLightNavigationBar(true)
mainActivity.setTaskDescriptionColorAuto()
mainActivity.hideStatusBar()
mainActivity.setBottomBarVisibility(View.VISIBLE)
}
private fun setStatusbarColor(view: View, color: Int) {
val statusBar = view.findViewById<View>(R.id.status_bar)
if (statusBar != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
statusBar.setBackgroundColor(color)
mainActivity.setLightStatusbarAuto(color)
} else {
statusBar.setBackgroundColor(color)
}
}
}
fun setStatusbarColorAuto(view: View) {
// we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat
if (VersionUtils.hasMarshmallow()) {
setStatusbarColor(view, ThemeStore.primaryColor(context!!))
} else {
setStatusbarColor(view, ColorUtil.darkenColor(ThemeStore.primaryColor(context!!)))
}
}
protected fun showMainMenu() {
MainOptionsBottomSheetDialogFragment.newInstance().show(childFragmentManager, "Main Menu")
}
}

View file

@ -1,93 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.base;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import code.name.monkey.retromusic.interfaces.MusicServiceEventListener;
import code.name.monkey.retromusic.ui.activities.base.AbsMusicServiceActivity;
/**
* Created by hemanths on 18/08/17.
*/
public class AbsMusicServiceFragment extends Fragment implements MusicServiceEventListener {
private AbsMusicServiceActivity activity;
@Nullable
public AbsMusicServiceActivity getPlayerActivity() {
return activity;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
activity = (AbsMusicServiceActivity) context;
} catch (ClassCastException e) {
throw new RuntimeException(context.getClass().getSimpleName() + " must be an instance of " + AbsMusicServiceActivity.class.getSimpleName());
}
}
@Override
public void onDetach() {
super.onDetach();
activity = null;
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
activity.addMusicServiceEventListener(this);
}
@Override
public void onDestroyView() {
super.onDestroyView();
activity.removeMusicServiceEventListener(this);
}
@Override
public void onPlayingMetaChanged() {
}
@Override
public void onServiceConnected() {
}
@Override
public void onServiceDisconnected() {
}
@Override
public void onQueueChanged() {
}
@Override
public void onPlayStateChanged() {
}
@Override
public void onRepeatModeChanged() {
}
@Override
public void onShuffleModeChanged() {
}
@Override
public void onMediaStoreChanged() {
}
}

View file

@ -0,0 +1,75 @@
package code.name.monkey.retromusic.ui.fragments.base
import android.content.Context
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
import code.name.monkey.retromusic.ui.activities.base.AbsMusicServiceActivity
/**
* Created by hemanths on 18/08/17.
*/
open class AbsMusicServiceFragment : Fragment(), MusicServiceEventListener {
var playerActivity: AbsMusicServiceActivity? = null
private set
override fun onAttach(context: Context?) {
super.onAttach(context)
try {
playerActivity = context as AbsMusicServiceActivity?
} catch (e: ClassCastException) {
throw RuntimeException(context!!.javaClass.simpleName + " must be an instance of " + AbsMusicServiceActivity::class.java.simpleName)
}
}
override fun onDetach() {
super.onDetach()
playerActivity = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
playerActivity!!.addMusicServiceEventListener(this)
}
override fun onDestroyView() {
super.onDestroyView()
playerActivity!!.removeMusicServiceEventListener(this)
}
override fun onPlayingMetaChanged() {
}
override fun onServiceConnected() {
}
override fun onServiceDisconnected() {
}
override fun onQueueChanged() {
}
override fun onPlayStateChanged() {
}
override fun onRepeatModeChanged() {
}
override fun onShuffleModeChanged() {
}
override fun onMediaStoreChanged() {
}
}

View file

@ -1,52 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.base;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper;
/**
* Created by hemanths on 24/09/17.
*/
public abstract class AbsPlayerControlsFragment extends AbsMusicServiceFragment
implements MusicProgressViewUpdateHelper.Callback {
protected abstract void show();
protected abstract void hide();
protected abstract void updateShuffleState();
protected abstract void updateRepeatState();
protected abstract void setUpProgressSlider();
public abstract void setDark(int color);
public void showBouceAnimation(View view) {
view.clearAnimation();
view.setScaleX(0.9f);
view.setScaleY(0.9f);
view.setVisibility(View.VISIBLE);
view.setPivotX(view.getWidth() / 2);
view.setPivotY(view.getHeight() / 2);
view.animate()
.setDuration(200)
.setInterpolator(new DecelerateInterpolator())
.scaleX(1.1f)
.scaleY(1.1f)
.withEndAction(() -> view.animate()
.setDuration(200)
.setInterpolator(new AccelerateInterpolator())
.scaleX(1f)
.scaleY(1f)
.alpha(1f)
.start())
.start();
}
}

View file

@ -0,0 +1,80 @@
package code.name.monkey.retromusic.ui.fragments.base
import android.os.Bundle
import android.view.View
import android.view.animation.AccelerateInterpolator
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.TextView
import androidx.appcompat.widget.AppCompatSeekBar
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
/**
* Created by hemanths on 24/09/17.
*/
abstract class AbsPlayerControlsFragment : AbsMusicServiceFragment(), MusicProgressViewUpdateHelper.Callback {
protected abstract fun show()
protected abstract fun hide()
protected abstract fun updateShuffleState()
protected abstract fun updateRepeatState()
protected abstract fun setUpProgressSlider()
abstract fun setDark(color: Int)
fun showBouceAnimation(view: View) {
view.clearAnimation()
view.scaleX = 0.9f
view.scaleY = 0.9f
view.visibility = View.VISIBLE
view.pivotX = (view.width / 2).toFloat()
view.pivotY = (view.height / 2).toFloat()
view.animate()
.setDuration(200)
.setInterpolator(DecelerateInterpolator())
.scaleX(1.1f)
.scaleY(1.1f)
.withEndAction {
view.animate()
.setDuration(200)
.setInterpolator(AccelerateInterpolator())
.scaleX(1f)
.scaleY(1f)
.alpha(1f)
.start()
}
.start()
}
var prevButton: ImageButton? = null
var nextButton: ImageButton? = null
var repeatButton: ImageButton? = null
var shuffleButton: ImageButton? = null
var progressSlider: AppCompatSeekBar? = null
var songTotalTime: TextView? = null
var songCurrentProgress: TextView? = null
var volumeContainer: View? = null
var playPauseFab: ImageButton? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
playPauseFab = view.findViewById(R.id.player_play_pause_button)
prevButton = view.findViewById(R.id.player_prev_button)
nextButton = view.findViewById(R.id.player_next_button)
repeatButton = view.findViewById(R.id.player_repeat_button)
shuffleButton = view.findViewById(R.id.player_shuffle_button)
progressSlider = view.findViewById(R.id.player_progress_slider)
songTotalTime = view.findViewById(R.id.player_song_total_time)
songCurrentProgress = view.findViewById(R.id.player_song_current_progress)
volumeContainer = view.findViewById(R.id.volume_fragment_container)
}
}

View file

@ -1,231 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.base;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog;
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog;
import code.name.monkey.retromusic.dialogs.DeleteSongsDialog;
import code.name.monkey.retromusic.dialogs.SleepTimerDialog;
import code.name.monkey.retromusic.dialogs.SongDetailDialog;
import code.name.monkey.retromusic.dialogs.SongShareDialog;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.interfaces.PaletteColorHolder;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.ui.activities.tageditor.AbsTagEditorActivity;
import code.name.monkey.retromusic.ui.activities.tageditor.SongTagEditorActivity;
import code.name.monkey.retromusic.util.MusicUtil;
import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.util.PreferenceUtil;
import code.name.monkey.retromusic.util.RetroUtil;
import code.name.monkey.retromusic.views.FitSystemWindowsLayout;
public abstract class AbsPlayerFragment extends AbsMusicServiceFragment implements Toolbar.OnMenuItemClickListener, PaletteColorHolder {
public static final String TAG = AbsPlayerFragment.class.getSimpleName();
private Callbacks callbacks;
private AsyncTask updateIsFavoriteTask;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
callbacks = (Callbacks) context;
} catch (ClassCastException e) {
throw new RuntimeException(context.getClass().getSimpleName() + " must implement " + Callbacks.class.getSimpleName());
}
}
@Override
public void onDetach() {
super.onDetach();
callbacks = null;
}
@SuppressWarnings("ConstantConditions")
@Override
public boolean onMenuItemClick(MenuItem item) {
final Song song = MusicPlayerRemote.getCurrentSong();
switch (item.getItemId()) {
case R.id.action_toggle_favorite:
toggleFavorite(song);
return true;
case R.id.action_share:
if (getFragmentManager() != null) {
SongShareDialog.create(song).show(getFragmentManager(), "SHARE_SONG");
}
return true;
case R.id.action_delete_from_device:
DeleteSongsDialog.create(song)
.show(getActivity().getSupportFragmentManager(), "DELETE_SONGS");
return true;
case R.id.action_add_to_playlist:
if (getFragmentManager() != null) {
AddToPlaylistDialog.create(song).show(getFragmentManager(), "ADD_PLAYLIST");
}
return true;
case R.id.action_clear_playing_queue:
MusicPlayerRemote.clearQueue();
return true;
case R.id.action_save_playing_queue:
CreatePlaylistDialog.create(MusicPlayerRemote.getPlayingQueue())
.show(getActivity().getSupportFragmentManager(), "ADD_TO_PLAYLIST");
return true;
case R.id.action_tag_editor:
Intent intent = new Intent(getActivity(), SongTagEditorActivity.class);
intent.putExtra(AbsTagEditorActivity.EXTRA_ID, song.id);
startActivity(intent);
return true;
case R.id.action_details:
if (getFragmentManager() != null) {
SongDetailDialog.create(song).show(getFragmentManager(), "SONG_DETAIL");
}
return true;
case R.id.action_go_to_album:
NavigationUtil.goToAlbum(getActivity(), song.albumId);
return true;
case R.id.action_go_to_artist:
NavigationUtil.goToArtist(getActivity(), song.artistId);
return true;
case R.id.now_playing:
NavigationUtil.goToPlayingQueue(getActivity());
return true;
case R.id.action_show_lyrics:
NavigationUtil.goToLyrics(getActivity());
return true;
case R.id.action_equalizer:
NavigationUtil.openEqualizer(getActivity());
return true;
case R.id.action_sleep_timer:
new SleepTimerDialog().show(getFragmentManager(), TAG);
return true;
case R.id.action_set_as_ringtone:
MusicUtil.setRingtone(getActivity(), song.id);
return true;
case R.id.action_settings:
NavigationUtil.goToSettings(getActivity());
return true;
case R.id.action_go_to_genre:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
Uri trackUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, song.id);
retriever.setDataSource(getActivity(), trackUri);
String genre = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);
if (genre == null) {
genre = "Not Specified";
}
Toast.makeText(getContext(), genre, Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
protected void toggleFavorite(Song song) {
MusicUtil.toggleFavorite(getActivity(), song);
}
public abstract void onShow();
public abstract void onHide();
public abstract boolean onBackPressed();
public abstract Toolbar getToolbar();
public abstract int toolbarIconColor();
@Override
public void onServiceConnected() {
updateIsFavorite();
}
@Override
public void onPlayingMetaChanged() {
updateIsFavorite();
}
@Override
public void onDestroyView() {
if (updateIsFavoriteTask != null && !updateIsFavoriteTask.isCancelled()) {
updateIsFavoriteTask.cancel(true);
}
super.onDestroyView();
}
@SuppressLint("StaticFieldLeak")
public void updateIsFavorite() {
if (updateIsFavoriteTask != null) {
updateIsFavoriteTask.cancel(false);
}
updateIsFavoriteTask = new AsyncTask<Song, Void, Boolean>() {
@Override
protected Boolean doInBackground(Song... params) {
Activity activity = getActivity();
if (activity != null) {
return MusicUtil.isFavorite(getActivity(), params[0]);
} else {
cancel(false);
return null;
}
}
@Override
protected void onPostExecute(Boolean isFavorite) {
Activity activity = getActivity();
if (activity != null) {
int res = isFavorite ? R.drawable.ic_favorite_white_24dp
: R.drawable.ic_favorite_border_white_24dp;
Drawable drawable = RetroUtil.getTintedVectorDrawable(activity, res, toolbarIconColor());
getToolbar().getMenu().findItem(R.id.action_toggle_favorite)
.setIcon(drawable)
.setTitle(isFavorite ? getString(R.string.action_remove_from_favorites) : getString(R.string.action_add_to_favorites));
}
}
}.execute(MusicPlayerRemote.getCurrentSong());
}
public Callbacks getCallbacks() {
return callbacks;
}
@SuppressWarnings("ConstantConditions")
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.setBackgroundColor(ThemeStore.primaryColor(getActivity()));
if (PreferenceUtil.getInstance().getFullScreenMode()) {
if (view.findViewById(R.id.status_bar) != null)
view.findViewById(R.id.status_bar).setVisibility(View.GONE);
}
}
public void setSafeArea(View safeArea) {
FitSystemWindowsLayout layout = safeArea.findViewById(R.id.safeArea);
if (layout != null) {
layout.setFit(!PreferenceUtil.getInstance().getFullScreenMode());
}
}
public interface Callbacks {
void onPaletteColorChanged();
}
}

View file

@ -0,0 +1,227 @@
package code.name.monkey.retromusic.ui.fragments.base
import android.annotation.SuppressLint
import android.content.ContentUris
import android.content.Context
import android.content.Intent
import android.media.MediaMetadataRetriever
import android.os.AsyncTask
import android.os.Bundle
import android.provider.MediaStore
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.appcompat.widget.Toolbar
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.dialogs.*
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.PaletteColorHolder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.ui.activities.tageditor.AbsTagEditorActivity
import code.name.monkey.retromusic.ui.activities.tageditor.SongTagEditorActivity
import code.name.monkey.retromusic.ui.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import code.name.monkey.retromusic.views.FitSystemWindowsLayout
abstract class AbsPlayerFragment : AbsMusicServiceFragment(), Toolbar.OnMenuItemClickListener, PaletteColorHolder, PlayerAlbumCoverFragment.Callbacks {
var callbacks: Callbacks? = null
private set
private var updateIsFavoriteTask: AsyncTask<*, *, *>? = null
protected var toolbar: Toolbar? = null
override fun onAttach(context: Context?) {
super.onAttach(context)
try {
callbacks = context as Callbacks?
} catch (e: ClassCastException) {
throw RuntimeException(context!!.javaClass.simpleName + " must implement " + Callbacks::class.java.simpleName)
}
}
override fun onDetach() {
super.onDetach()
callbacks = null
}
override fun onMenuItemClick(item: MenuItem): Boolean {
val song = MusicPlayerRemote.currentSong
when (item.itemId) {
R.id.action_toggle_favorite -> {
toggleFavorite(song)
return true
}
R.id.action_share -> {
if (fragmentManager != null) {
SongShareDialog.create(song).show(fragmentManager!!, "SHARE_SONG")
}
return true
}
R.id.action_delete_from_device -> {
DeleteSongsDialog.create(song)
.show(activity!!.supportFragmentManager, "DELETE_SONGS")
return true
}
R.id.action_add_to_playlist -> {
if (fragmentManager != null) {
AddToPlaylistDialog.create(song).show(fragmentManager!!, "ADD_PLAYLIST")
}
return true
}
R.id.action_clear_playing_queue -> {
MusicPlayerRemote.clearQueue()
return true
}
R.id.action_save_playing_queue -> {
CreatePlaylistDialog.create(MusicPlayerRemote.playingQueue)
.show(activity!!.supportFragmentManager, "ADD_TO_PLAYLIST")
return true
}
R.id.action_tag_editor -> {
val intent = Intent(activity, SongTagEditorActivity::class.java)
intent.putExtra(AbsTagEditorActivity.EXTRA_ID, song.id)
startActivity(intent)
return true
}
R.id.action_details -> {
if (fragmentManager != null) {
SongDetailDialog.create(song).show(fragmentManager!!, "SONG_DETAIL")
}
return true
}
R.id.action_go_to_album -> {
NavigationUtil.goToAlbum(activity!!, song.albumId)
return true
}
R.id.action_go_to_artist -> {
NavigationUtil.goToArtist(activity!!, song.artistId)
return true
}
R.id.now_playing -> {
NavigationUtil.goToPlayingQueue(activity!!)
return true
}
R.id.action_show_lyrics -> {
NavigationUtil.goToLyrics(activity!!)
return true
}
R.id.action_equalizer -> {
NavigationUtil.openEqualizer(activity!!)
return true
}
R.id.action_sleep_timer -> {
SleepTimerDialog().show(fragmentManager!!, TAG)
return true
}
R.id.action_set_as_ringtone -> {
MusicUtil.setRingtone(activity!!, song.id)
return true
}
R.id.action_settings -> {
NavigationUtil.goToSettings(activity!!)
return true
}
R.id.action_go_to_genre -> {
val retriever = MediaMetadataRetriever()
val trackUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, song.id.toLong())
retriever.setDataSource(activity, trackUri)
var genre: String? = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE)
if (genre == null) {
genre = "Not Specified"
}
Toast.makeText(context, genre, Toast.LENGTH_SHORT).show()
return true
}
}
return false
}
protected open fun toggleFavorite(song: Song) {
MusicUtil.toggleFavorite(activity!!, song)
}
abstract fun onShow()
abstract fun onHide()
abstract fun onBackPressed(): Boolean
abstract fun toolbarIconColor(): Int
override fun onServiceConnected() {
updateIsFavorite()
}
override fun onPlayingMetaChanged() {
updateIsFavorite()
}
override fun onDestroyView() {
if (updateIsFavoriteTask != null && !updateIsFavoriteTask!!.isCancelled) {
updateIsFavoriteTask!!.cancel(true)
}
super.onDestroyView()
}
@SuppressLint("StaticFieldLeak")
fun updateIsFavorite() {
if (updateIsFavoriteTask != null) {
updateIsFavoriteTask!!.cancel(false)
}
updateIsFavoriteTask = object : AsyncTask<Song, Void, Boolean>() {
override fun doInBackground(vararg params: Song): Boolean? {
val activity = activity
if (activity != null) {
return MusicUtil.isFavorite(getActivity()!!, params[0])
} else {
cancel(false)
return null
}
}
override fun onPostExecute(isFavorite: Boolean?) {
val activity = activity
if (activity != null) {
val res = if (isFavorite!!)
R.drawable.ic_favorite_white_24dp
else
R.drawable.ic_favorite_border_white_24dp
val drawable = RetroUtil.getTintedVectorDrawable(activity, res, toolbarIconColor())
//toolbar!!.menu.findItem(R.id.action_toggle_favorite).setIcon(drawable).title = if (isFavorite) getString(R.string.action_remove_from_favorites) else getString(R.string.action_add_to_favorites)
}
}
}.execute(MusicPlayerRemote.currentSong)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.setBackgroundColor(ThemeStore.primaryColor(activity!!))
if (PreferenceUtil.getInstance().fullScreenMode) {
if (view.findViewById<View>(R.id.status_bar) != null)
view.findViewById<View>(R.id.status_bar).visibility = View.GONE
}
}
fun setSafeArea(safeArea: View) {
val layout = safeArea.findViewById<FitSystemWindowsLayout>(R.id.safeArea)
if (layout != null) {
layout.isFit = !PreferenceUtil.getInstance().fullScreenMode
}
}
interface Callbacks {
fun onPaletteColorChanged()
}
companion object {
val TAG: String = AbsPlayerFragment::class.java.simpleName
}
}

View file

@ -1,175 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity;
import android.os.Bundle;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.model.Album;
import code.name.monkey.retromusic.mvp.contract.AlbumContract;
import code.name.monkey.retromusic.mvp.presenter.AlbumPresenter;
import code.name.monkey.retromusic.ui.adapter.album.AlbumAdapter;
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment;
import code.name.monkey.retromusic.util.PreferenceUtil;
public class AlbumsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager> implements AlbumContract.AlbumView {
public static final String TAG = AlbumsFragment.class.getSimpleName();
private AlbumPresenter presenter;
public static AlbumsFragment newInstance() {
Bundle args = new Bundle();
AlbumsFragment fragment = new AlbumsFragment();
fragment.setArguments(args);
return fragment;
}
@Override
protected GridLayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), getGridSize());
}
@NonNull
@Override
protected AlbumAdapter createAdapter() {
int itemLayoutRes = getItemLayoutRes();
notifyLayoutResChanged(itemLayoutRes);
if (itemLayoutRes != R.layout.item_list) {
//noinspection ConstantConditions
itemLayoutRes = PreferenceUtil.getInstance().getAlbumGridStyle(getContext());
}
ArrayList<Album> dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet();
return new AlbumAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment());
}
@Override
protected int getEmptyMessage() {
return R.string.no_albums;
}
@Override
public boolean loadUsePalette() {
//noinspection ConstantConditions
return PreferenceUtil.getInstance().albumColoredFooters();
}
@Override
protected void setUsePalette(boolean usePalette) {
getAdapter().usePalette(usePalette);
}
@Override
protected void setGridSize(int gridSize) {
getLayoutManager().setSpanCount(gridSize);
getAdapter().notifyDataSetChanged();
}
@Override
protected void setSortOrder(String sortOrder) {
presenter.loadAlbums();
}
@Override
protected String loadSortOrder() {
//noinspection ConstantConditions
return PreferenceUtil.getInstance().getAlbumSortOrder();
}
@Override
protected void saveSortOrder(String sortOrder) {
//noinspection ConstantConditions
PreferenceUtil.getInstance().setAlbumSortOrder(sortOrder);
}
@Override
protected int loadGridSize() {
//noinspection ConstantConditions
return PreferenceUtil.getInstance().getAlbumGridSize(getActivity());
}
@Override
protected void saveGridSize(int gridSize) {
//noinspection ConstantConditions
PreferenceUtil.getInstance().setAlbumGridSize(gridSize);
}
@Override
protected int loadGridSizeLand() {
//noinspection ConstantConditions
return PreferenceUtil.getInstance().getAlbumGridSizeLand(getActivity());
}
@Override
protected void saveGridSizeLand(int gridSize) {
//noinspection ConstantConditions
PreferenceUtil.getInstance().setAlbumGridSizeLand(gridSize);
}
@Override
protected void saveUsePalette(boolean usePalette) {
//noinspection ConstantConditions
PreferenceUtil.getInstance().setAlbumColoredFooters(usePalette);
}
@Override
public void onMediaStoreChanged() {
presenter.loadAlbums();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter = new AlbumPresenter(this);
}
@Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
if (menuVisible) {
//noinspection ConstantConditions
getLibraryFragment().setTitle(
PreferenceUtil.getInstance().tabTitles() ? R.string.library
: R.string.albums);
}
}
@Override
public void onResume() {
super.onResume();
//noinspection ConstantConditions
getLibraryFragment().setTitle(
PreferenceUtil.getInstance().tabTitles() ? R.string.library : R.string.albums);
if (getAdapter().getDataSet().isEmpty()) {
presenter.subscribe();
}
}
@Override
public void onDestroy() {
super.onDestroy();
presenter.unsubscribe();
}
@Override
public void loading() {
}
@Override
public void showEmptyView() {
getAdapter().swapDataSet(new ArrayList<>());
}
@Override
public void completed() {
}
@Override
public void showData(ArrayList<Album> albums) {
getAdapter().swapDataSet(albums);
}
}

View file

@ -0,0 +1,149 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity
import android.os.Bundle
import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.mvp.contract.AlbumContract
import code.name.monkey.retromusic.mvp.presenter.AlbumPresenter
import code.name.monkey.retromusic.ui.adapter.album.AlbumAdapter
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment
import code.name.monkey.retromusic.util.PreferenceUtil
open class AlbumsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager>(), AlbumContract.AlbumView {
private var presenter: AlbumPresenter? = null
override val emptyMessage: Int
get() = R.string.no_albums
override fun createLayoutManager(): GridLayoutManager {
return GridLayoutManager(activity, getGridSize())
}
override fun createAdapter(): AlbumAdapter {
var itemLayoutRes = itemLayoutRes
notifyLayoutResChanged(itemLayoutRes)
if (itemLayoutRes != R.layout.item_list) {
itemLayoutRes = PreferenceUtil.getInstance().getAlbumGridStyle(context!!)
}
val dataSet = if (adapter == null) ArrayList() else adapter!!.dataSet
return AlbumAdapter(libraryFragment.mainActivity, dataSet, itemLayoutRes, loadUsePalette(), libraryFragment)
}
public override fun loadUsePalette(): Boolean {
return PreferenceUtil.getInstance().albumColoredFooters()
}
override fun setUsePalette(usePalette: Boolean) {
adapter!!.usePalette(usePalette)
}
override fun setGridSize(gridSize: Int) {
layoutManager!!.spanCount = gridSize
adapter!!.notifyDataSetChanged()
}
override fun setSortOrder(sortOrder: String) {
presenter!!.loadAlbums()
}
override fun loadSortOrder(): String {
return PreferenceUtil.getInstance().albumSortOrder
}
override fun saveSortOrder(sortOrder: String) {
PreferenceUtil.getInstance().albumSortOrder = sortOrder
}
override fun loadGridSize(): Int {
return PreferenceUtil.getInstance().getAlbumGridSize(activity!!)
}
override fun saveGridSize(gridColumns: Int) {
PreferenceUtil.getInstance().setAlbumGridSize(gridColumns)
}
override fun loadGridSizeLand(): Int {
return PreferenceUtil.getInstance().getAlbumGridSizeLand(activity!!)
}
override fun saveGridSizeLand(gridColumns: Int) {
PreferenceUtil.getInstance().setAlbumGridSizeLand(gridColumns)
}
override fun saveUsePalette(usePalette: Boolean) {
PreferenceUtil.getInstance().setAlbumColoredFooters(usePalette)
}
override fun onMediaStoreChanged() {
presenter!!.loadAlbums()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
presenter = AlbumPresenter(this)
}
override fun setMenuVisibility(menuVisible: Boolean) {
super.setMenuVisibility(menuVisible)
if (menuVisible) {
libraryFragment.setTitle(
if (PreferenceUtil.getInstance().tabTitles())
R.string.library
else
R.string.albums)
}
}
override fun onResume() {
super.onResume()
libraryFragment.setTitle(
if (PreferenceUtil.getInstance().tabTitles()) R.string.library else R.string.albums)
if (adapter!!.dataSet.isEmpty()) {
presenter!!.subscribe()
}
}
override fun onDestroy() {
super.onDestroy()
presenter!!.unsubscribe()
}
override fun loading() {}
override fun showEmptyView() {
adapter!!.swapDataSet(ArrayList())
}
override fun completed() {}
override fun showData(albums: ArrayList<Album>) {
adapter!!.swapDataSet(albums)
}
companion object {
val TAG = AlbumsFragment::class.java.simpleName
fun newInstance(): AlbumsFragment {
val args = Bundle()
val fragment = AlbumsFragment()
fragment.arguments = args
return fragment
}
}
}

View file

@ -1,173 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import java.util.ArrayList;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.model.Artist;
import code.name.monkey.retromusic.mvp.contract.ArtistContract;
import code.name.monkey.retromusic.mvp.presenter.ArtistPresenter;
import code.name.monkey.retromusic.ui.adapter.artist.ArtistAdapter;
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment;
import code.name.monkey.retromusic.util.PreferenceUtil;
public class ArtistsFragment extends
AbsLibraryPagerRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager> implements
ArtistContract.ArtistView {
public static final String TAG = ArtistsFragment.class.getSimpleName();
private ArtistPresenter presenter;
public static ArtistsFragment newInstance() {
Bundle args = new Bundle();
ArtistsFragment fragment = new ArtistsFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter = new ArtistPresenter(this);
}
@NonNull
@Override
protected GridLayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), getGridSize());
}
@NonNull
@Override
protected ArtistAdapter createAdapter() {
int itemLayoutRes = getItemLayoutRes();
notifyLayoutResChanged(itemLayoutRes);
if (itemLayoutRes != R.layout.item_list) {
itemLayoutRes = PreferenceUtil.getInstance().getArtistGridStyle(getContext());
}
ArrayList<Artist> dataSet =
getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet();
return new ArtistAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes,
loadUsePalette(), getLibraryFragment());
}
@Override
protected int getEmptyMessage() {
return R.string.no_artists;
}
@Override
public void onMediaStoreChanged() {
presenter.loadArtists();
}
@Override
protected int loadGridSize() {
return PreferenceUtil.getInstance().getArtistGridSize(getActivity());
}
@Override
protected void saveGridSize(int gridSize) {
PreferenceUtil.getInstance().setArtistGridSize(gridSize);
}
@Override
protected int loadGridSizeLand() {
return PreferenceUtil.getInstance().getArtistGridSizeLand(getActivity());
}
@Override
protected void saveGridSizeLand(int gridSize) {
PreferenceUtil.getInstance().setArtistGridSizeLand(gridSize);
}
@Override
protected void saveUsePalette(boolean usePalette) {
PreferenceUtil.getInstance().setArtistColoredFooters(usePalette);
}
@Override
public boolean loadUsePalette() {
return PreferenceUtil.getInstance().artistColoredFooters();
}
@Override
protected void setUsePalette(boolean usePalette) {
getAdapter().usePalette(usePalette);
}
@Override
protected void setGridSize(int gridSize) {
getLayoutManager().setSpanCount(gridSize);
getAdapter().notifyDataSetChanged();
}
@Override
protected String loadSortOrder() {
return PreferenceUtil.getInstance().getArtistSortOrder();
}
@Override
protected void saveSortOrder(String sortOrder) {
PreferenceUtil.getInstance().setArtistSortOrder(sortOrder);
}
@Override
protected void setSortOrder(String sortOrder) {
presenter.loadArtists();
}
@Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
if (menuVisible) {
getLibraryFragment().setTitle(
PreferenceUtil.getInstance().tabTitles() ? R.string.library
: R.string.artists);
}
}
@Override
public void onResume() {
super.onResume();
getLibraryFragment().setTitle(
PreferenceUtil.getInstance().tabTitles() ? R.string.library : R.string.artists);
if (getAdapter().getDataSet().isEmpty()) {
presenter.subscribe();
}
}
@Override
public void onDestroy() {
super.onDestroy();
presenter.unsubscribe();
}
@Override
public void loading() {
}
@Override
public void showEmptyView() {
getAdapter().swapDataSet(new ArrayList<>());
}
@Override
public void completed() {
}
@Override
public void showData(ArrayList<Artist> artists) {
getAdapter().swapDataSet(artists);
}
}

View file

@ -0,0 +1,143 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity
import android.os.Bundle
import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.mvp.contract.ArtistContract
import code.name.monkey.retromusic.mvp.presenter.ArtistPresenter
import code.name.monkey.retromusic.ui.adapter.artist.ArtistAdapter
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment
import code.name.monkey.retromusic.util.PreferenceUtil
import java.util.*
class ArtistsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager>(), ArtistContract.ArtistView {
private var presenter: ArtistPresenter? = null
override val emptyMessage: Int
get() = R.string.no_artists
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
presenter = ArtistPresenter(this)
}
override fun createLayoutManager(): GridLayoutManager {
return GridLayoutManager(activity, getGridSize())
}
override fun createAdapter(): ArtistAdapter {
var itemLayoutRes = itemLayoutRes
notifyLayoutResChanged(itemLayoutRes)
if (itemLayoutRes != R.layout.item_list) {
itemLayoutRes = PreferenceUtil.getInstance().getArtistGridStyle(context!!)
}
val dataSet = if (adapter == null) ArrayList() else adapter!!.dataSet
return ArtistAdapter(libraryFragment.mainActivity, dataSet, itemLayoutRes, loadUsePalette(), libraryFragment)
}
override fun onMediaStoreChanged() {
presenter!!.loadArtists()
}
override fun loadGridSize(): Int {
return PreferenceUtil.getInstance().getArtistGridSize(activity!!)
}
override fun saveGridSize(gridColumns: Int) {
PreferenceUtil.getInstance().setArtistGridSize(gridColumns)
}
override fun loadGridSizeLand(): Int {
return PreferenceUtil.getInstance().getArtistGridSizeLand(activity!!)
}
override fun saveGridSizeLand(gridColumns: Int) {
PreferenceUtil.getInstance().setArtistGridSizeLand(gridColumns)
}
override fun saveUsePalette(usePalette: Boolean) {
PreferenceUtil.getInstance().setArtistColoredFooters(usePalette)
}
public override fun loadUsePalette(): Boolean {
return PreferenceUtil.getInstance().artistColoredFooters()
}
override fun setUsePalette(usePalette: Boolean) {
adapter!!.usePalette(usePalette)
}
override fun setGridSize(gridSize: Int) {
layoutManager!!.spanCount = gridSize
adapter!!.notifyDataSetChanged()
}
override fun loadSortOrder(): String {
return PreferenceUtil.getInstance().artistSortOrder
}
override fun saveSortOrder(sortOrder: String) {
PreferenceUtil.getInstance().artistSortOrder = sortOrder
}
override fun setSortOrder(sortOrder: String) {
presenter!!.loadArtists()
}
override fun setMenuVisibility(menuVisible: Boolean) {
super.setMenuVisibility(menuVisible)
if (menuVisible) {
libraryFragment.setTitle(
if (PreferenceUtil.getInstance().tabTitles())
R.string.library
else
R.string.artists)
}
}
override fun onResume() {
super.onResume()
libraryFragment.setTitle(
if (PreferenceUtil.getInstance().tabTitles()) R.string.library else R.string.artists)
if (adapter!!.dataSet.isEmpty()) {
presenter!!.subscribe()
}
}
override fun onDestroy() {
super.onDestroy()
presenter!!.unsubscribe()
}
override fun loading() {}
override fun showEmptyView() {
adapter!!.swapDataSet(ArrayList())
}
override fun completed() {
}
override fun showData(artists: ArrayList<Artist>) {
adapter!!.swapDataSet(artists)
}
companion object {
val TAG = ArtistsFragment::class.java.simpleName
fun newInstance(): ArtistsFragment {
val args = Bundle()
val fragment = ArtistsFragment()
fragment.arguments = args
return fragment
}
}
}

View file

@ -1,110 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.view.Menu;
import android.view.MenuInflater;
import java.util.ArrayList;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.model.Genre;
import code.name.monkey.retromusic.mvp.contract.GenreContract;
import code.name.monkey.retromusic.mvp.presenter.GenrePresenter;
import code.name.monkey.retromusic.ui.adapter.GenreAdapter;
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewFragment;
import code.name.monkey.retromusic.util.PreferenceUtil;
public class GenreFragment extends
AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearLayoutManager> implements
GenreContract.GenreView {
private GenrePresenter mPresenter;
public static GenreFragment newInstance() {
Bundle args = new Bundle();
GenreFragment fragment = new GenreFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mPresenter = new GenrePresenter(this);
}
@Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
if (menuVisible) {
getLibraryFragment().setTitle(PreferenceUtil.getInstance().tabTitles() ? R.string.library : R.string.genres);
}
}
@Override
public void onResume() {
super.onResume();
getLibraryFragment().setTitle(PreferenceUtil.getInstance().tabTitles() ? R.string.library : R.string.genres);
if (getAdapter().getDataSet().isEmpty()) {
mPresenter.subscribe();
}
}
@Override
public void onDestroy() {
super.onDestroy();
mPresenter.unsubscribe();
}
@NonNull
@Override
protected LinearLayoutManager createLayoutManager() {
return new LinearLayoutManager(getActivity());
}
@NonNull
@Override
protected GenreAdapter createAdapter() {
ArrayList<Genre> dataSet = getAdapter() == null ? new ArrayList<Genre>() : getAdapter().getDataSet();
return new GenreAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list);
}
@Override
public void loading() {
}
@Override
public void showData(ArrayList<Genre> songs) {
getAdapter().swapDataSet(songs);
}
@Override
public void showEmptyView() {
getAdapter().swapDataSet(new ArrayList<Genre>());
}
@Override
public void completed() {
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.removeItem(R.id.action_sort_order);
menu.removeItem(R.id.action_grid_size);
menu.removeItem(R.id.action_new_playlist);
}
@Override
protected int getEmptyMessage() {
return R.string.no_genres;
}
}

View file

@ -0,0 +1,94 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import android.view.Menu
import android.view.MenuInflater
import java.util.ArrayList
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.mvp.contract.GenreContract
import code.name.monkey.retromusic.mvp.presenter.GenrePresenter
import code.name.monkey.retromusic.ui.adapter.GenreAdapter
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewFragment
import code.name.monkey.retromusic.util.PreferenceUtil
class GenreFragment : AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearLayoutManager>(), GenreContract.GenreView {
private var mPresenter: GenrePresenter? = null
override val emptyMessage: Int
get() = R.string.no_genres
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
mPresenter = GenrePresenter(this)
}
override fun setMenuVisibility(menuVisible: Boolean) {
super.setMenuVisibility(menuVisible)
if (menuVisible) {
libraryFragment.setTitle(if (PreferenceUtil.getInstance().tabTitles()) R.string.library else R.string.genres)
}
}
override fun onResume() {
super.onResume()
libraryFragment.setTitle(if (PreferenceUtil.getInstance().tabTitles()) R.string.library else R.string.genres)
if (adapter!!.dataSet.isEmpty()) {
mPresenter!!.subscribe()
}
}
override fun onDestroy() {
super.onDestroy()
mPresenter!!.unsubscribe()
}
override fun createLayoutManager(): LinearLayoutManager {
return LinearLayoutManager(activity)
}
override fun createAdapter(): GenreAdapter {
val dataSet = adapter!!.dataSet
return GenreAdapter(libraryFragment.mainActivity, dataSet, R.layout.item_list)
}
override fun loading() {
}
override fun showData(songs: ArrayList<Genre>) {
adapter!!.swapDataSet(songs)
}
override fun showEmptyView() {
adapter!!.swapDataSet(ArrayList())
}
override fun completed() {
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
super.onCreateOptionsMenu(menu, inflater)
menu!!.removeItem(R.id.action_sort_order)
menu.removeItem(R.id.action_grid_size)
menu.removeItem(R.id.action_new_playlist)
}
companion object {
fun newInstance(): GenreFragment {
val args = Bundle()
val fragment = GenreFragment()
fragment.arguments = args
return fragment
}
}
}

View file

@ -1,476 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.afollestad.materialcab.MaterialCab;
import com.google.android.material.appbar.AppBarLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.common.ATHToolbarActivity;
import code.name.monkey.appthemehelper.util.ATHUtil;
import code.name.monkey.appthemehelper.util.TintHelper;
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog;
import code.name.monkey.retromusic.dialogs.SleepTimerDialog;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.helper.SortOrder;
import code.name.monkey.retromusic.interfaces.CabHolder;
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks;
import code.name.monkey.retromusic.loaders.SongLoader;
import code.name.monkey.retromusic.ui.activities.SettingsActivity;
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment;
import code.name.monkey.retromusic.ui.fragments.base.AbsMainActivityFragment;
import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.util.RetroColorUtil;
import code.name.monkey.retromusic.util.RetroUtil;
public class LibraryFragment extends AbsMainActivityFragment implements CabHolder, MainActivityFragmentCallbacks {
public static final String TAG = "LibraryFragment";
private static final String CURRENT_TAB_ID = "current_tab_id";
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.app_bar)
AppBarLayout appbar;
@BindView(R.id.title)
TextView title;
@BindView(R.id.fragment_container)
View contentContainer;
private Unbinder unBinder;
private MaterialCab cab;
private FragmentManager fragmentManager;
public static Fragment newInstance(int tab) {
Bundle args = new Bundle();
args.putInt(CURRENT_TAB_ID, tab);
LibraryFragment fragment = new LibraryFragment();
fragment.setArguments(args);
return fragment;
}
public static Fragment newInstance() {
return new LibraryFragment();
}
public void setTitle(@StringRes int name) {
title.setText(getString(name));
}
public void addOnAppBarOffsetChangedListener(AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) {
appbar.addOnOffsetChangedListener(onOffsetChangedListener);
}
public void removeOnAppBarOffsetChangedListener(AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) {
appbar.removeOnOffsetChangedListener(onOffsetChangedListener);
}
public int getTotalAppBarScrollingRange() {
return appbar.getTotalScrollRange();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_library, container, false);
unBinder = ButterKnife.bind(this, view);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setStatusbarColorAuto(view);
setupToolbar();
inflateFragment();
}
private void inflateFragment() {
if (getArguments() == null) {
selectedFragment(SongsFragment.newInstance());
return;
}
switch (getArguments().getInt(CURRENT_TAB_ID)) {
default:
case R.id.action_song:
selectedFragment(SongsFragment.newInstance());
break;
case R.id.action_album:
selectedFragment(AlbumsFragment.newInstance());
break;
case R.id.action_artist:
selectedFragment(ArtistsFragment.newInstance());
break;
case R.id.action_playlist:
selectedFragment(PlaylistsFragment.newInstance());
break;
}
}
@SuppressWarnings("ConstantConditions")
private void setupToolbar() {
title.setTextColor(ThemeStore.textColorPrimary(getContext()));
int primaryColor = ThemeStore.primaryColor(getContext());
TintHelper.setTintAuto(contentContainer, primaryColor, true);
toolbar.setBackgroundColor(primaryColor);
appbar.setBackgroundColor(primaryColor);
appbar.addOnOffsetChangedListener((appBarLayout, verticalOffset) ->
getMainActivity().setLightStatusbar(!ATHUtil.isWindowBackgroundDark(getContext())));
getMainActivity().setTitle(null);
getMainActivity().setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(v -> NavigationUtil.goToSearch(getMainActivity()));
toolbar.setOnClickListener(v -> showMainMenu());
toolbar.setNavigationIcon(RetroUtil.getTintedDrawable(getMainActivity(), R.drawable.ic_search_white_24dp, ThemeStore.textColorPrimary(getMainActivity())));
}
private Fragment getCurrentFragment() {
if (fragmentManager == null) {
return SongsFragment.newInstance();
}
return fragmentManager.findFragmentByTag(LibraryFragment.TAG);
}
@Override
public void onDestroyView() {
super.onDestroyView();
unBinder.unbind();
}
@Override
public boolean handleBackPress() {
if (cab != null && cab.isActive()) {
cab.finish();
return true;
}
return false;
}
private void selectedFragment(Fragment fragment) {
fragmentManager = getChildFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
.replace(R.id.fragment_container, fragment, TAG)
.commit();
}
@NonNull
@Override
public MaterialCab openCab(int menuRes, MaterialCab.Callback callback) {
if (cab != null && cab.isActive()) {
cab.finish();
}
//noinspection ConstantConditions
cab = new MaterialCab(getMainActivity(), R.id.cab_stub)
.setMenu(menuRes)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(
RetroColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(getActivity())))
.start(callback);
return cab;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_main, menu);
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment
&& currentFragment.isAdded()) {
AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment = (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) currentFragment;
MenuItem gridSizeItem = menu.findItem(R.id.action_grid_size);
if (RetroUtil.isLandscape()) {
gridSizeItem.setTitle(R.string.action_grid_size_land);
}
setUpGridSizeMenu(fragment, gridSizeItem.getSubMenu());
setUpSortOrderMenu(fragment, menu.findItem(R.id.action_sort_order).getSubMenu());
} else {
menu.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title);
menu.removeItem(R.id.action_grid_size);
}
Activity activity = getActivity();
if (activity == null) {
return;
}
ToolbarContentTintHelper.handleOnCreateOptionsMenu(getActivity(), toolbar, menu, ATHToolbarActivity.getToolbarBackgroundColor(toolbar));
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
Activity activity = getActivity();
if (activity == null) {
return;
}
ToolbarContentTintHelper.handleOnPrepareOptionsMenu(activity, toolbar);
}
private void setUpSortOrderMenu(
@NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment,
@NonNull SubMenu sortOrderMenu) {
String currentSortOrder = fragment.getSortOrder();
sortOrderMenu.clear();
if (fragment instanceof AlbumsFragment) {
sortOrderMenu.add(0, R.id.action_album_sort_order_asc, 0, R.string.sort_order_a_z)
.setChecked(currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_A_Z));
sortOrderMenu.add(0, R.id.action_album_sort_order_desc, 1, R.string.sort_order_z_a)
.setChecked(currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_Z_A));
sortOrderMenu.add(0, R.id.action_album_sort_order_artist, 2, R.string.sort_order_artist)
.setChecked(currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_ARTIST));
sortOrderMenu.add(0, R.id.action_album_sort_order_year, 3, R.string.sort_order_year)
.setChecked(currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_YEAR));
} else if (fragment instanceof ArtistsFragment) {
sortOrderMenu.add(0, R.id.action_artist_sort_order_asc, 0, R.string.sort_order_a_z)
.setChecked(currentSortOrder.equals(SortOrder.ArtistSortOrder.ARTIST_A_Z));
sortOrderMenu.add(0, R.id.action_artist_sort_order_desc, 1, R.string.sort_order_z_a)
.setChecked(currentSortOrder.equals(SortOrder.ArtistSortOrder.ARTIST_Z_A));
} else if (fragment instanceof SongsFragment) {
sortOrderMenu.add(0, R.id.action_song_sort_order_asc, 0, R.string.sort_order_a_z)
.setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_A_Z));
sortOrderMenu.add(0, R.id.action_song_sort_order_desc, 1, R.string.sort_order_z_a)
.setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_Z_A));
sortOrderMenu.add(0, R.id.action_song_sort_order_artist, 2, R.string.sort_order_artist)
.setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_ARTIST));
sortOrderMenu.add(0, R.id.action_song_sort_order_album, 3, R.string.sort_order_album)
.setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_ALBUM));
sortOrderMenu.add(0, R.id.action_song_sort_order_year, 4, R.string.sort_order_year)
.setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_YEAR));
sortOrderMenu.add(0, R.id.action_song_sort_order_date, 4, R.string.sort_order_date)
.setChecked(currentSortOrder.equals(SortOrder.SongSortOrder.SONG_DATE));
}
sortOrderMenu.setGroupCheckable(0, true, true);
}
private boolean handleSortOrderMenuItem(
@NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment
fragment, @NonNull MenuItem item) {
String sortOrder = null;
if (fragment instanceof AlbumsFragment) {
switch (item.getItemId()) {
case R.id.action_album_sort_order_asc:
sortOrder = SortOrder.AlbumSortOrder.ALBUM_A_Z;
break;
case R.id.action_album_sort_order_desc:
sortOrder = SortOrder.AlbumSortOrder.ALBUM_Z_A;
break;
case R.id.action_album_sort_order_artist:
sortOrder = SortOrder.AlbumSortOrder.ALBUM_ARTIST;
break;
case R.id.action_album_sort_order_year:
sortOrder = SortOrder.AlbumSortOrder.ALBUM_YEAR;
break;
}
} else if (fragment instanceof ArtistsFragment) {
switch (item.getItemId()) {
case R.id.action_artist_sort_order_asc:
sortOrder = SortOrder.ArtistSortOrder.ARTIST_A_Z;
break;
case R.id.action_artist_sort_order_desc:
sortOrder = SortOrder.ArtistSortOrder.ARTIST_Z_A;
break;
}
} else if (fragment instanceof SongsFragment) {
switch (item.getItemId()) {
case R.id.action_song_sort_order_asc:
sortOrder = SortOrder.SongSortOrder.SONG_A_Z;
break;
case R.id.action_song_sort_order_desc:
sortOrder = SortOrder.SongSortOrder.SONG_Z_A;
break;
case R.id.action_song_sort_order_artist:
sortOrder = SortOrder.SongSortOrder.SONG_ARTIST;
break;
case R.id.action_song_sort_order_album:
sortOrder = SortOrder.SongSortOrder.SONG_ALBUM;
break;
case R.id.action_song_sort_order_year:
sortOrder = SortOrder.SongSortOrder.SONG_YEAR;
break;
case R.id.action_song_sort_order_date:
sortOrder = SortOrder.SongSortOrder.SONG_DATE;
break;
}
}
if (sortOrder != null) {
item.setChecked(true);
fragment.setAndSaveSortOrder(sortOrder);
return true;
}
return false;
}
@SuppressWarnings("ConstantConditions")
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
//if (pager == null) return false;
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment) {
AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment = (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) currentFragment;
if (handleGridSizeMenuItem(fragment, item)) {
return true;
}
if (handleSortOrderMenuItem(fragment, item)) {
return true;
}
}
int id = item.getItemId();
switch (id) {
case R.id.action_new_playlist:
CreatePlaylistDialog.create().show(getChildFragmentManager(), "CREATE_PLAYLIST");
return true;
case R.id.action_shuffle_all:
MusicPlayerRemote.openAndShuffleQueue(SongLoader.Companion.getAllSongs(getContext())
.blockingFirst(), true);
return true;
case R.id.action_equalizer:
NavigationUtil.openEqualizer(getActivity());
return true;
case R.id.action_sleep_timer:
if (getFragmentManager() != null) {
new SleepTimerDialog().show(getFragmentManager(), TAG);
}
return true;
case R.id.action_settings:
startActivity(new Intent(getContext(), SettingsActivity.class));
break;
}
return super.onOptionsItemSelected(item);
}
private void setUpGridSizeMenu(
@NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment,
@NonNull SubMenu gridSizeMenu) {
switch (fragment.getGridSize()) {
case 1:
gridSizeMenu.findItem(R.id.action_grid_size_1).setChecked(true);
break;
case 2:
gridSizeMenu.findItem(R.id.action_grid_size_2).setChecked(true);
break;
case 3:
gridSizeMenu.findItem(R.id.action_grid_size_3).setChecked(true);
break;
case 4:
gridSizeMenu.findItem(R.id.action_grid_size_4).setChecked(true);
break;
case 5:
gridSizeMenu.findItem(R.id.action_grid_size_5).setChecked(true);
break;
case 6:
gridSizeMenu.findItem(R.id.action_grid_size_6).setChecked(true);
break;
case 7:
gridSizeMenu.findItem(R.id.action_grid_size_7).setChecked(true);
break;
case 8:
gridSizeMenu.findItem(R.id.action_grid_size_8).setChecked(true);
break;
}
int maxGridSize = fragment.getMaxGridSize();
if (maxGridSize < 8) {
gridSizeMenu.findItem(R.id.action_grid_size_8).setVisible(false);
}
if (maxGridSize < 7) {
gridSizeMenu.findItem(R.id.action_grid_size_7).setVisible(false);
}
if (maxGridSize < 6) {
gridSizeMenu.findItem(R.id.action_grid_size_6).setVisible(false);
}
if (maxGridSize < 5) {
gridSizeMenu.findItem(R.id.action_grid_size_5).setVisible(false);
}
if (maxGridSize < 4) {
gridSizeMenu.findItem(R.id.action_grid_size_4).setVisible(false);
}
if (maxGridSize < 3) {
gridSizeMenu.findItem(R.id.action_grid_size_3).setVisible(false);
}
}
private boolean handleGridSizeMenuItem(
@NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment
fragment, @NonNull MenuItem item) {
int gridSize = 0;
switch (item.getItemId()) {
case R.id.action_grid_size_1:
gridSize = 1;
break;
case R.id.action_grid_size_2:
gridSize = 2;
break;
case R.id.action_grid_size_3:
gridSize = 3;
break;
case R.id.action_grid_size_4:
gridSize = 4;
break;
case R.id.action_grid_size_5:
gridSize = 5;
break;
case R.id.action_grid_size_6:
gridSize = 6;
break;
case R.id.action_grid_size_7:
gridSize = 7;
break;
case R.id.action_grid_size_8:
gridSize = 8;
break;
}
if (gridSize > 0) {
item.setChecked(true);
fragment.setAndSaveGridSize(gridSize);
return true;
}
return false;
}
}

View file

@ -0,0 +1,360 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity
import android.content.Intent
import android.os.Bundle
import android.view.*
import android.widget.TextView
import androidx.annotation.StringRes
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import butterknife.Unbinder
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
import code.name.monkey.retromusic.dialogs.SleepTimerDialog
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.interfaces.CabHolder
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
import code.name.monkey.retromusic.loaders.SongLoader
import code.name.monkey.retromusic.ui.activities.SettingsActivity
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment
import code.name.monkey.retromusic.ui.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.RetroColorUtil
import code.name.monkey.retromusic.util.RetroUtil
import com.afollestad.materialcab.MaterialCab
import com.google.android.material.appbar.AppBarLayout
class LibraryFragment : AbsMainActivityFragment(), CabHolder, MainActivityFragmentCallbacks, AppBarLayout.OnOffsetChangedListener {
override fun onOffsetChanged(p0: AppBarLayout?, p1: Int) {
mainActivity.setLightStatusbar(!ATHUtil.isWindowBackgroundDark(context))
}
lateinit var toolbar: Toolbar
lateinit var appbar: AppBarLayout
lateinit var title: TextView
lateinit var contentContainer: View
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_library, container, false)
toolbar = view.findViewById(R.id.toolbar)
appbar = view.findViewById(R.id.app_bar)
title = view.findViewById(R.id.title)
contentContainer = view.findViewById(R.id.fragment_container)
return view
}
private var cab: MaterialCab? = null
val totalAppBarScrollingRange: Int
get() = appbar.totalScrollRange
private val currentFragment: Fragment?
get() = if (fragmentManager == null) {
SongsFragment.newInstance()
} else fragmentManager!!.findFragmentByTag(LibraryFragment.TAG)
fun setTitle(@StringRes name: Int) {
title.text = getString(name)
}
fun addOnAppBarOffsetChangedListener(onOffsetChangedListener: AppBarLayout.OnOffsetChangedListener) {
appbar.addOnOffsetChangedListener(onOffsetChangedListener)
}
fun removeOnAppBarOffsetChangedListener(onOffsetChangedListener: AppBarLayout.OnOffsetChangedListener) {
appbar.removeOnOffsetChangedListener(onOffsetChangedListener)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setStatusbarColorAuto(view)
setupToolbar()
inflateFragment()
}
private fun inflateFragment() {
if (arguments == null) {
selectedFragment(SongsFragment.newInstance())
return
}
when (arguments!!.getInt(CURRENT_TAB_ID)) {
R.id.action_song -> selectedFragment(SongsFragment.newInstance())
R.id.action_album -> selectedFragment(AlbumsFragment.newInstance())
R.id.action_artist -> selectedFragment(ArtistsFragment.newInstance())
R.id.action_playlist -> selectedFragment(PlaylistsFragment.newInstance())
else -> selectedFragment(SongsFragment.newInstance())
}
}
private fun setupToolbar() {
title.setTextColor(ThemeStore.textColorPrimary(context!!))
val primaryColor = ThemeStore.primaryColor(context!!)
TintHelper.setTintAuto(contentContainer, primaryColor, true)
toolbar.setBackgroundColor(primaryColor)
appbar.setBackgroundColor(primaryColor)
appbar.addOnOffsetChangedListener(this)
mainActivity.title = null
mainActivity.setSupportActionBar(toolbar)
toolbar.setNavigationOnClickListener { NavigationUtil.goToSearch(mainActivity) }
toolbar.setOnClickListener { showMainMenu() }
toolbar.navigationIcon = RetroUtil.getTintedDrawable(mainActivity, R.drawable.ic_search_white_24dp, ThemeStore.textColorPrimary(mainActivity))
}
override fun handleBackPress(): Boolean {
if (cab != null && cab!!.isActive) {
cab!!.finish()
return true
}
return false
}
private fun selectedFragment(fragment: Fragment) {
val fragmentManager = childFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction
.replace(R.id.fragment_container, fragment, TAG)
.commit()
}
override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab {
if (cab != null && cab!!.isActive) {
cab!!.finish()
}
cab = MaterialCab(mainActivity, R.id.cab_stub)
.setMenu(menuRes)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(
RetroColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(activity!!)))
.start(callback)
return cab as MaterialCab
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
super.onCreateOptionsMenu(menu, inflater)
inflater!!.inflate(R.menu.menu_main, menu)
val currentFragment = currentFragment
if (currentFragment is AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *> && currentFragment.isAdded) {
val fragment = currentFragment as AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>?
val gridSizeItem = menu!!.findItem(R.id.action_grid_size)
if (RetroUtil.isLandscape()) {
gridSizeItem.setTitle(R.string.action_grid_size_land)
}
setUpGridSizeMenu(fragment!!, gridSizeItem.subMenu)
setUpSortOrderMenu(fragment, menu.findItem(R.id.action_sort_order).subMenu)
} else {
menu!!.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title)
menu.removeItem(R.id.action_grid_size)
}
activity ?: return
ToolbarContentTintHelper.handleOnCreateOptionsMenu(getActivity(), toolbar, menu, ATHToolbarActivity.getToolbarBackgroundColor(toolbar))
}
override fun onPrepareOptionsMenu(menu: Menu?) {
super.onPrepareOptionsMenu(menu)
val activity = activity ?: return
ToolbarContentTintHelper.handleOnPrepareOptionsMenu(activity, toolbar)
}
private fun setUpSortOrderMenu(
fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>,
sortOrderMenu: SubMenu) {
val currentSortOrder = fragment.getSortOrder()
sortOrderMenu.clear()
if (fragment is AlbumsFragment) {
sortOrderMenu.add(0, R.id.action_album_sort_order_asc, 0, R.string.sort_order_a_z).isChecked = currentSortOrder == SortOrder.AlbumSortOrder.ALBUM_A_Z
sortOrderMenu.add(0, R.id.action_album_sort_order_desc, 1, R.string.sort_order_z_a).isChecked = currentSortOrder == SortOrder.AlbumSortOrder.ALBUM_Z_A
sortOrderMenu.add(0, R.id.action_album_sort_order_artist, 2, R.string.sort_order_artist).isChecked = currentSortOrder == SortOrder.AlbumSortOrder.ALBUM_ARTIST
sortOrderMenu.add(0, R.id.action_album_sort_order_year, 3, R.string.sort_order_year).isChecked = currentSortOrder == SortOrder.AlbumSortOrder.ALBUM_YEAR
} else if (fragment is ArtistsFragment) {
sortOrderMenu.add(0, R.id.action_artist_sort_order_asc, 0, R.string.sort_order_a_z).isChecked = currentSortOrder == SortOrder.ArtistSortOrder.ARTIST_A_Z
sortOrderMenu.add(0, R.id.action_artist_sort_order_desc, 1, R.string.sort_order_z_a).isChecked = currentSortOrder == SortOrder.ArtistSortOrder.ARTIST_Z_A
} else if (fragment is SongsFragment) {
sortOrderMenu.add(0, R.id.action_song_sort_order_asc, 0, R.string.sort_order_a_z).isChecked = currentSortOrder == SortOrder.SongSortOrder.SONG_A_Z
sortOrderMenu.add(0, R.id.action_song_sort_order_desc, 1, R.string.sort_order_z_a).isChecked = currentSortOrder == SortOrder.SongSortOrder.SONG_Z_A
sortOrderMenu.add(0, R.id.action_song_sort_order_artist, 2, R.string.sort_order_artist).isChecked = currentSortOrder == SortOrder.SongSortOrder.SONG_ARTIST
sortOrderMenu.add(0, R.id.action_song_sort_order_album, 3, R.string.sort_order_album).isChecked = currentSortOrder == SortOrder.SongSortOrder.SONG_ALBUM
sortOrderMenu.add(0, R.id.action_song_sort_order_year, 4, R.string.sort_order_year).isChecked = currentSortOrder == SortOrder.SongSortOrder.SONG_YEAR
sortOrderMenu.add(0, R.id.action_song_sort_order_date, 4, R.string.sort_order_date).isChecked = currentSortOrder == SortOrder.SongSortOrder.SONG_DATE
}
sortOrderMenu.setGroupCheckable(0, true, true)
}
private fun handleSortOrderMenuItem(
fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>, item: MenuItem): Boolean {
var sortOrder: String? = null
if (fragment is AlbumsFragment) {
when (item.itemId) {
R.id.action_album_sort_order_asc -> sortOrder = SortOrder.AlbumSortOrder.ALBUM_A_Z
R.id.action_album_sort_order_desc -> sortOrder = SortOrder.AlbumSortOrder.ALBUM_Z_A
R.id.action_album_sort_order_artist -> sortOrder = SortOrder.AlbumSortOrder.ALBUM_ARTIST
R.id.action_album_sort_order_year -> sortOrder = SortOrder.AlbumSortOrder.ALBUM_YEAR
}
} else if (fragment is ArtistsFragment) {
when (item.itemId) {
R.id.action_artist_sort_order_asc -> sortOrder = SortOrder.ArtistSortOrder.ARTIST_A_Z
R.id.action_artist_sort_order_desc -> sortOrder = SortOrder.ArtistSortOrder.ARTIST_Z_A
}
} else if (fragment is SongsFragment) {
when (item.itemId) {
R.id.action_song_sort_order_asc -> sortOrder = SortOrder.SongSortOrder.SONG_A_Z
R.id.action_song_sort_order_desc -> sortOrder = SortOrder.SongSortOrder.SONG_Z_A
R.id.action_song_sort_order_artist -> sortOrder = SortOrder.SongSortOrder.SONG_ARTIST
R.id.action_song_sort_order_album -> sortOrder = SortOrder.SongSortOrder.SONG_ALBUM
R.id.action_song_sort_order_year -> sortOrder = SortOrder.SongSortOrder.SONG_YEAR
R.id.action_song_sort_order_date -> sortOrder = SortOrder.SongSortOrder.SONG_DATE
}
}
if (sortOrder != null) {
item.isChecked = true
fragment.setAndSaveSortOrder(sortOrder)
return true
}
return false
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
//if (pager == null) return false;
val currentFragment = currentFragment
if (currentFragment is AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>) {
val fragment = currentFragment as AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>?
if (handleGridSizeMenuItem(fragment!!, item)) {
return true
}
if (handleSortOrderMenuItem(fragment, item)) {
return true
}
}
val id = item.itemId
when (id) {
R.id.action_new_playlist -> {
CreatePlaylistDialog.create().show(childFragmentManager, "CREATE_PLAYLIST")
return true
}
R.id.action_shuffle_all -> {
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(context!!).blockingFirst(), true)
return true
}
R.id.action_equalizer -> {
NavigationUtil.openEqualizer(activity!!)
return true
}
R.id.action_sleep_timer -> {
if (fragmentManager != null) {
SleepTimerDialog().show(fragmentManager!!, TAG)
}
return true
}
R.id.action_settings -> startActivity(Intent(context, SettingsActivity::class.java))
}
return super.onOptionsItemSelected(item)
}
private fun setUpGridSizeMenu(
fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>,
gridSizeMenu: SubMenu) {
when (fragment.getGridSize()) {
1 -> gridSizeMenu.findItem(R.id.action_grid_size_1).isChecked = true
2 -> gridSizeMenu.findItem(R.id.action_grid_size_2).isChecked = true
3 -> gridSizeMenu.findItem(R.id.action_grid_size_3).isChecked = true
4 -> gridSizeMenu.findItem(R.id.action_grid_size_4).isChecked = true
5 -> gridSizeMenu.findItem(R.id.action_grid_size_5).isChecked = true
6 -> gridSizeMenu.findItem(R.id.action_grid_size_6).isChecked = true
7 -> gridSizeMenu.findItem(R.id.action_grid_size_7).isChecked = true
8 -> gridSizeMenu.findItem(R.id.action_grid_size_8).isChecked = true
}
val maxGridSize = fragment.maxGridSize
if (maxGridSize < 8) {
gridSizeMenu.findItem(R.id.action_grid_size_8).isVisible = false
}
if (maxGridSize < 7) {
gridSizeMenu.findItem(R.id.action_grid_size_7).isVisible = false
}
if (maxGridSize < 6) {
gridSizeMenu.findItem(R.id.action_grid_size_6).isVisible = false
}
if (maxGridSize < 5) {
gridSizeMenu.findItem(R.id.action_grid_size_5).isVisible = false
}
if (maxGridSize < 4) {
gridSizeMenu.findItem(R.id.action_grid_size_4).isVisible = false
}
if (maxGridSize < 3) {
gridSizeMenu.findItem(R.id.action_grid_size_3).isVisible = false
}
}
private fun handleGridSizeMenuItem(
fragment: AbsLibraryPagerRecyclerViewCustomGridSizeFragment<*, *>, item: MenuItem): Boolean {
var gridSize = 0
when (item.itemId) {
R.id.action_grid_size_1 -> gridSize = 1
R.id.action_grid_size_2 -> gridSize = 2
R.id.action_grid_size_3 -> gridSize = 3
R.id.action_grid_size_4 -> gridSize = 4
R.id.action_grid_size_5 -> gridSize = 5
R.id.action_grid_size_6 -> gridSize = 6
R.id.action_grid_size_7 -> gridSize = 7
R.id.action_grid_size_8 -> gridSize = 8
}
if (gridSize > 0) {
item.isChecked = true
fragment.setAndSaveGridSize(gridSize)
return true
}
return false
}
companion object {
const val TAG: String = "LibraryFragment"
private const val CURRENT_TAB_ID = "current_tab_id"
fun newInstance(tab: Int): Fragment {
val args = Bundle()
args.putInt(CURRENT_TAB_ID, tab)
val fragment = LibraryFragment()
fragment.arguments = args
return fragment
}
fun newInstance(): Fragment {
return LibraryFragment()
}
}
}

View file

@ -1,120 +0,0 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import java.util.ArrayList;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.model.Playlist;
import code.name.monkey.retromusic.mvp.contract.PlaylistContract;
import code.name.monkey.retromusic.mvp.presenter.PlaylistPresenter;
import code.name.monkey.retromusic.ui.adapter.playlist.PlaylistAdapter;
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewFragment;
import code.name.monkey.retromusic.util.PreferenceUtil;
public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragment<PlaylistAdapter, LinearLayoutManager> implements
PlaylistContract.PlaylistView {
private PlaylistPresenter presenter;
public static PlaylistsFragment newInstance() {
Bundle args = new Bundle();
PlaylistsFragment fragment = new PlaylistsFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
presenter = new PlaylistPresenter(this);
}
@Override
protected LinearLayoutManager createLayoutManager() {
return new LinearLayoutManager(getActivity());
}
@NonNull
@Override
protected PlaylistAdapter createAdapter() {
return new PlaylistAdapter(getLibraryFragment().getMainActivity(), new ArrayList<>(),
R.layout.item_list, getLibraryFragment());
}
@Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
if (menuVisible) {
getLibraryFragment().setTitle(PreferenceUtil.getInstance().tabTitles() ? R.string.library : R.string.playlists);
}
}
@Override
public void onResume() {
super.onResume();
getLibraryFragment().setTitle(PreferenceUtil.getInstance().tabTitles() ? R.string.library : R.string.playlists);
if (getAdapter().getDataSet().isEmpty()) {
presenter.subscribe();
}
}
@Override
public void onDestroy() {
presenter.unsubscribe();
super.onDestroy();
}
@Override
public void onMediaStoreChanged() {
super.onMediaStoreChanged();
presenter.loadPlaylists();
}
@Override
public void loading() {
}
@Override
public void showEmptyView() {
getAdapter().swapDataSet(new ArrayList<>());
}
@Override
public void completed() {
}
@Override
public void showData(ArrayList<Playlist> playlists) {
getAdapter().swapDataSet(playlists);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.removeItem(R.id.action_shuffle_all);
menu.removeItem(R.id.action_sort_order);
menu.removeItem(R.id.action_grid_size);
}
@Override
protected int getEmptyMessage() {
return R.string.no_playlists;
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}

View file

@ -0,0 +1,99 @@
package code.name.monkey.retromusic.ui.fragments.mainactivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import android.view.Menu
import android.view.MenuInflater
import android.view.View
import java.util.ArrayList
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.model.Playlist
import code.name.monkey.retromusic.mvp.contract.PlaylistContract
import code.name.monkey.retromusic.mvp.presenter.PlaylistPresenter
import code.name.monkey.retromusic.ui.adapter.playlist.PlaylistAdapter
import code.name.monkey.retromusic.ui.fragments.base.AbsLibraryPagerRecyclerViewFragment
import code.name.monkey.retromusic.util.PreferenceUtil
class PlaylistsFragment : AbsLibraryPagerRecyclerViewFragment<PlaylistAdapter, LinearLayoutManager>(), PlaylistContract.PlaylistView {
private var presenter: PlaylistPresenter? = null
override val emptyMessage: Int
get() = R.string.no_playlists
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
presenter = PlaylistPresenter(this)
}
override fun createLayoutManager(): LinearLayoutManager {
return LinearLayoutManager(activity)
}
override fun createAdapter(): PlaylistAdapter {
return PlaylistAdapter(libraryFragment.mainActivity, ArrayList(),
R.layout.item_list, libraryFragment)
}
override fun setMenuVisibility(menuVisible: Boolean) {
super.setMenuVisibility(menuVisible)
if (menuVisible) {
libraryFragment.setTitle(if (PreferenceUtil.getInstance().tabTitles()) R.string.library else R.string.playlists)
}
}
override fun onResume() {
super.onResume()
libraryFragment.setTitle(if (PreferenceUtil.getInstance().tabTitles()) R.string.library else R.string.playlists)
if (adapter!!.dataSet.isEmpty()) {
presenter!!.subscribe()
}
}
override fun onDestroy() {
presenter!!.unsubscribe()
super.onDestroy()
}
override fun onMediaStoreChanged() {
super.onMediaStoreChanged()
presenter!!.loadPlaylists()
}
override fun loading() {
}
override fun showEmptyView() {
adapter!!.swapDataSet(ArrayList())
}
override fun completed() {
}
override fun showData(playlists: ArrayList<Playlist>) {
adapter!!.swapDataSet(playlists)
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
super.onCreateOptionsMenu(menu, inflater)
menu!!.removeItem(R.id.action_shuffle_all)
menu.removeItem(R.id.action_sort_order)
menu.removeItem(R.id.action_grid_size)
}
companion object {
fun newInstance(): PlaylistsFragment {
val args = Bundle()
val fragment = PlaylistsFragment()
fragment.arguments = args
return fragment
}
}
}

Some files were not shown because too many files have changed in this diff Show more