/*
* Copyright (C) 2015 Naman Dwivedi
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*/
package com.naman14.timber.activities;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.StyleRes;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.transition.Transition;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.appthemeengine.Config;
import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer;
import com.afollestad.appthemeengine.customizers.ATEToolbarCustomizer;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.naman14.timber.R;
import com.naman14.timber.adapters.SongsListAdapter;
import com.naman14.timber.dataloaders.LastAddedLoader;
import com.naman14.timber.dataloaders.PlaylistLoader;
import com.naman14.timber.dataloaders.PlaylistSongLoader;
import com.naman14.timber.dataloaders.SongLoader;
import com.naman14.timber.dataloaders.TopTracksLoader;
import com.naman14.timber.listeners.SimplelTransitionListener;
import com.naman14.timber.models.Song;
import com.naman14.timber.utils.Constants;
import com.naman14.timber.utils.PreferencesUtility;
import com.naman14.timber.utils.TimberUtils;
import com.naman14.timber.widgets.DividerItemDecoration;
import com.naman14.timber.widgets.DragSortRecycler;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.HashMap;
import java.util.List;
public class PlaylistDetailActivity extends BaseActivity implements ATEActivityThemeCustomizer, ATEToolbarCustomizer {
String action;
long playlistID;
HashMap<String, Runnable> playlistsMap = new HashMap<>();
Runnable playlistLastAdded = new Runnable() {
public void run() {
new loadLastAdded().execute("");
}
};
Runnable playlistRecents = new Runnable() {
@Override
public void run() {
new loadRecentlyPlayed().execute("");
}
};
Runnable playlistToptracks = new Runnable() {
@Override
public void run() {
new loadTopTracks().execute("");
}
};
Runnable playlistUsercreated = new Runnable() {
@Override
public void run() {
new loadUserCreatedPlaylist().execute("");
}
};
private AppCompatActivity mContext = PlaylistDetailActivity.this;
private SongsListAdapter mAdapter;
private RecyclerView recyclerView;
private ImageView blurFrame;
private TextView playlistname;
private View foreground;
private boolean animate;
@TargetApi(21)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_playlist_detail);
action = getIntent().getAction();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("");
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_LASTADDED, playlistLastAdded);
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_RECENT, playlistRecents);
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_TOPTRACKS, playlistToptracks);
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_USERCREATED, playlistUsercreated);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
blurFrame = (ImageView) findViewById(R.id.blurFrame);
playlistname = (TextView) findViewById(R.id.name);
foreground = findViewById(R.id.foreground);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
setAlbumart();
animate = getIntent().getBooleanExtra(Constants.ACTIVITY_TRANSITION, false);
if (animate && TimberUtils.isLollipop() && PreferencesUtility.getInstance(this).getAnimations()) {
getWindow().getEnterTransition().addListener(new EnterTransitionListener());
} else {
setUpSongs();
}
}
private void setAlbumart() {
playlistname.setText(getIntent().getExtras().getString(Constants.PLAYLIST_NAME));
foreground.setBackgroundColor(getIntent().getExtras().getInt(Constants.PLAYLIST_FOREGROUND_COLOR));
loadBitmap(TimberUtils.getAlbumArtUri(getIntent().getExtras().getLong(Constants.ALBUM_ID)).toString());
}
private void setUpSongs() {
Runnable navigation = playlistsMap.get(action);
if (navigation != null) {
navigation.run();
DragSortRecycler dragSortRecycler = new DragSortRecycler();
dragSortRecycler.setViewHandleId(R.id.reorder);
dragSortRecycler.setOnItemMovedListener(new DragSortRecycler.OnItemMovedListener() {
@Override
public void onItemMoved(int from, int to) {
Log.d("playlist", "onItemMoved " + from + " to " + to);
Song song = mAdapter.getSongAt(from);
mAdapter.removeSongAt(from);
mAdapter.addSongTo(to, song);
mAdapter.notifyDataSetChanged();
MediaStore.Audio.Playlists.Members.moveItem(getContentResolver(),
playlistID, from, to);
}
});
recyclerView.addItemDecoration(dragSortRecycler);
recyclerView.addOnItemTouchListener(dragSortRecycler);
recyclerView.addOnScrollListener(dragSortRecycler.getScrollListener());
} else {
Log.d("PlaylistDetail", "mo action specified");
}
}
private void loadBitmap(String uri) {
ImageLoader.getInstance().displayImage(uri, blurFrame,
new DisplayImageOptions.Builder().cacheInMemory(true)
.showImageOnFail(R.drawable.ic_empty_music2)
.resetViewBeforeLoading(true)
.build());
}
private void setRecyclerViewAapter() {
recyclerView.setAdapter(mAdapter);
if (animate && TimberUtils.isLollipop() && PreferencesUtility.getInstance(mContext).getAnimations()) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
recyclerView.addItemDecoration(new DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL_LIST, R.drawable.item_divider_white));
}
}, 250);
} else
recyclerView.addItemDecoration(new DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL_LIST, R.drawable.item_divider_white));
}
@StyleRes
@Override
public int getActivityTheme() {
return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", false) ? R.style.AppTheme_FullScreen_Dark : R.style.AppTheme_FullScreen_Light;
}
private class loadLastAdded extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
List<Song> lastadded = LastAddedLoader.getLastAddedSongs(mContext);
mAdapter = new SongsListAdapter(mContext, lastadded, true, animate);
mAdapter.setPlaylistId(playlistID);
return "Executed";
}
@Override
protected void onPostExecute(String result) {
setRecyclerViewAapter();
}
@Override
protected void onPreExecute() {
}
}
private class loadRecentlyPlayed extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
TopTracksLoader loader = new TopTracksLoader(mContext, TopTracksLoader.QueryType.RecentSongs);
List<Song> recentsongs = SongLoader.getSongsForCursor(TopTracksLoader.getCursor());
mAdapter = new SongsListAdapter(mContext, recentsongs, true, animate);
mAdapter.setPlaylistId(playlistID);
return "Executed";
}
@Override
protected void onPostExecute(String result) {
setRecyclerViewAapter();
}
@Override
protected void onPreExecute() {
}
}
private class loadTopTracks extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
TopTracksLoader loader = new TopTracksLoader(mContext, TopTracksLoader.QueryType.TopTracks);
List<Song> toptracks = SongLoader.getSongsForCursor(TopTracksLoader.getCursor());
mAdapter = new SongsListAdapter(mContext, toptracks, true, animate);
mAdapter.setPlaylistId(playlistID);
return "Executed";
}
@Override
protected void onPostExecute(String result) {
setRecyclerViewAapter();
}
@Override
protected void onPreExecute() {
}
}
private class loadUserCreatedPlaylist extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
playlistID = getIntent().getExtras().getLong(Constants.PLAYLIST_ID);
List<Song> playlistsongs = PlaylistSongLoader.getSongsInPlaylist(mContext, playlistID);
mAdapter = new SongsListAdapter(mContext, playlistsongs, true, animate);
mAdapter.setPlaylistId(playlistID);
return "Executed";
}
@Override
protected void onPostExecute(String result) {
setRecyclerViewAapter();
}
@Override
protected void onPreExecute() {
}
}
private class EnterTransitionListener extends SimplelTransitionListener {
@TargetApi(21)
public void onTransitionEnd(Transition paramTransition) {
setUpSongs();
}
public void onTransitionStart(Transition paramTransition) {
}
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.menu_playlist_detail, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (action.equals(Constants.NAVIGATE_PLAYLIST_USERCREATED)) {
menu.findItem(R.id.action_delete_playlist).setVisible(true);
menu.findItem(R.id.action_clear_auto_playlist).setVisible(false);
} else {
menu.findItem(R.id.action_delete_playlist).setVisible(false);
menu.findItem(R.id.action_clear_auto_playlist).setTitle("Clear " + playlistname.getText().toString());
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
super.onBackPressed();
return true;
case R.id.action_delete_playlist:
showDeletePlaylistDialog();
break;
case R.id.action_clear_auto_playlist:
clearAutoPlaylists();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
private void showDeletePlaylistDialog() {
new MaterialDialog.Builder(this)
.title("Delete playlist?")
.content("Are you sure you want to delete playlist " + playlistname.getText().toString() + " ?")
.positiveText("Delete")
.negativeText("Cancel")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
PlaylistLoader.deletePlaylists(PlaylistDetailActivity.this, playlistID);
Intent returnIntent = new Intent();
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
dialog.dismiss();
}
})
.show();
}
private void clearAutoPlaylists() {
switch (action) {
case Constants.NAVIGATE_PLAYLIST_LASTADDED:
TimberUtils.clearLastAdded(this);
break;
case Constants.NAVIGATE_PLAYLIST_RECENT:
TimberUtils.clearRecent(this);
break;
case Constants.NAVIGATE_PLAYLIST_TOPTRACKS:
TimberUtils.clearTopTracks(this);
break;
}
Intent returnIntent = new Intent();
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
@Override
public int getToolbarColor() {
return Color.TRANSPARENT;
}
@Override
public int getLightToolbarMode() {
return Config.LIGHT_TOOLBAR_AUTO;
}
}