package com.ved.musicmapapp.adapters;
import java.util.ArrayList;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.ved.musicmapapp.MainActivity;
import com.ved.musicmapapp.R;
import com.ved.musicmapapp.Objects.Artist;
import com.ved.musicmapapp.Objects.Playlist;
import com.ved.musicmapapp.Objects.PlaylistArSong;
import com.ved.musicmapapp.Objects.PlaylistArtist;
import com.ved.musicmapapp.Objects.Song;
import com.ved.musicmapapp.Objects.User;
import com.ved.musicmapapp.providers.AddSongToUserPlaylistTask;
import com.ved.musicmapapp.providers.AddUserPlaylistsListTask;
import com.ved.musicmapapp.providers.LikeSongTask;
import com.ved.musicmapapp.utils.Statics;
public class SongAdapter extends BaseAdapter {
private Activity cxt;
private ArrayList<Song> songs;
private LayoutInflater inflat;
private OnClickSong oCS;
private OnBuySong oBS;
private int curSelected = -1;
private boolean loading = false, hasData = false;
private boolean isPlayAll;
private User user;
private int positionClicked = -1;
String artistName;
private Artist artist;
ListView listView;
// private int count = Statics.EXPAND_VIEW_COUNT;
private boolean fromPlaylists;
private ImageLoader imageLoader;
private DisplayImageOptions options;
private boolean isCurrentUser;
private ArrayList<PlaylistArtist> playlistArtists;
public boolean isPlayAll() {
return isPlayAll;
}
public void setPlayAll(boolean isPlayAll) {
this.isPlayAll = isPlayAll;
}
public SongAdapter(Activity cxt, ArrayList<Song> songs,
User mUser, String artistName, Artist artist, ListView listView){
this.cxt = cxt;
this.songs = songs;
this.user = mUser;
this.artistName = artistName;
this.artist = artist;
this.listView = listView;
inflat = (LayoutInflater) cxt
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public SongAdapter(Activity cxt, ArrayList<Song> songs,
User mUser, String artistName, Artist artist, ListView listView,
boolean fromPlaylists, ArrayList<PlaylistArtist> artists) {
this.cxt = cxt;
this.songs = songs;
this.user = mUser;
this.artistName = artistName;
this.artist = artist;
this.fromPlaylists = fromPlaylists;
this.playlistArtists = artists;
this.listView = listView;
inflat = (LayoutInflater) cxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
isCurrentUser = mUser.getID() == Statics.curUser.getID() ? true : false;
imageLoader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.img_no_image)
.showImageForEmptyUri(R.drawable.img_no_image)
.showImageOnFail(R.drawable.img_no_image).cacheInMemory(true)
.cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565).build();
}
public SongAdapter(Activity cxt, ArrayList<Song> songs, User mUser) {
this.cxt = cxt;
this.songs = songs;
this.user = mUser;
inflat = (LayoutInflater) cxt
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// count = songs.size();
// count = (count > Statics.EXPAND_VIEW_COUNT) ?
// Statics.EXPAND_VIEW_COUNT
// : count;
return /* count */songs.size();
}
@Override
public long getItemId(int position) {
return -1;
}
// public void expandData() {
// count += Statics.EXPAND_VIEW_COUNT;
// count = (count > songs.size()) ? songs.size() : count;
// notifyDataSetChanged();
// }
@Override
public View getView(final int pos, View v, ViewGroup parent) {
final Song songDataModel = getItem(pos);
if (v == null) {
v = inflat.inflate(R.layout.item_song, null);
}
View headerView = v.findViewById(R.id.layout_section);
if(this.fromPlaylists && this.playlistArtists != null && this.playlistArtists.size() > 0) {
if(songDataModel.getHeaderText().equals("")) {
headerView.setVisibility(View.GONE);
}else {
headerView.setVisibility(View.VISIBLE);
TextView artistNameTv = (TextView) v.findViewById(R.id.artistName);
artistNameTv.setText(songDataModel.getHeaderText());
songDataModel.getAristitId();
final ImageView avatar = (ImageView) v.findViewById(R.id.ivThumb);
imageLoader.displayImage(songDataModel.getArtistAvatar(), avatar, options,
new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
// TODO Auto-generated method stub
}
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
// TODO Auto-generated method stub
}
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
avatar.setImageBitmap(loadedImage);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
// TODO Auto-generated method stub
}
});
}
}else {
headerView.setVisibility(View.GONE);
}
View imv_like = v.findViewById(R.id.imv_like);
if(isCurrentUser || this.fromPlaylists) {
imv_like.setVisibility(View.INVISIBLE);
}
final TextView tv_name = (TextView) v.findViewById(R.id.tv_songName);
Typeface tf = Typeface.createFromAsset(cxt.getAssets(), "open_sans_regular.ttf");
tv_name.setTypeface(tf);
tv_name.setText(songDataModel.getTitle());
imv_like.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
choosePlaylistDialog(pos);
}
});
ImageView imv_play = (ImageView) v.findViewById(R.id.imv_play);
ImageView imv_buy = (ImageView) v.findViewById(R.id.imv_buy);
ProgressBar progLoading = (ProgressBar) v.findViewById(R.id.progLoading);
if (Song.ListStauts.LOADING == songDataModel.getListStatus() ) {
progLoading.setVisibility(View.VISIBLE);
imv_buy.setVisibility(View.GONE);
imv_play.setVisibility(View.GONE);
}
else if (Song.ListStauts.PLAYING == songDataModel.getListStatus()) {
progLoading.setVisibility(View.GONE);
imv_buy.setVisibility(View.VISIBLE);
imv_play.setVisibility(View.GONE);
positionClicked = -1;
}
else if (Song.ListStauts.NORMAL == songDataModel.getListStatus()) {
progLoading.setVisibility(View.GONE);
imv_buy.setVisibility(View.GONE);
imv_play.setVisibility(View.VISIBLE);
}
imv_buy.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (null != oBS)
oBS.onBuyClick(getItem(pos),pos);
}
});
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (null != oCS) {
resetSongStatusOfOthers(pos);
setSelected(pos);
oCS.onClick(songDataModel, pos, true);
}
}
});
return v;
}
private PlaylistArSong addSongToPlaylistDB(int playlistId, int playlistDbId, Song song, Playlist playlist) {
DBAdapter adapter = new DBAdapter(cxt);
PlaylistArSong plSong = new PlaylistArSong();
plSong.setID(song.getID());
plSong.setTitle(song.getTitle());
plSong.setAlbum(song.getAlbum());
plSong.setBuyLink(song.getBuyLink("us"),"us");
plSong.set7DigigtalTrackId(song.get7DigigtalTrackId("us"),"us");
plSong.setBuyLink(song.getBuyLink("gb"),"gb");
plSong.set7DigigtalTrackId(song.get7DigigtalTrackId("gb"),"gb");
plSong.setHasSong(song.isHasSong());
plSong.setLiked(song.isLiked());
plSong.setStartLike(song.getStartLike());
plSong.setEndLike(song.getEndLike());
plSong.setAristitId(artist.getID());
plSong.setUserId(Statics.curUser.getID());
plSong.setIsSynch(-1);
plSong.setPlaylistId(playlistId);
//Adding song to songs table
String output = adapter.addSongToPlaylist(plSong);
if(output.equals("")) {
//Adding artist to artist table
adapter.addPlaylistArtist(artist, Statics.curUser, playlistId);
//Upating track count in playlist table
int trackCount = playlist.getNumberOfTracks();
playlist.setNumberOfTracks(trackCount + 1);
adapter.updatePlaylist(playlist, Statics.curUser);
return plSong;
} else {
Toast.makeText(
cxt.getApplicationContext(),
output,
Toast.LENGTH_SHORT).show();
return null;
}
}
public void choosePlaylistDialog(final int pos){
final Dialog dialog = new Dialog(this.cxt);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.choose_playlist_dialog);
dialog.setCanceledOnTouchOutside(false);
// TextView existing_playlists_header = (TextView) dialog.findViewById(R.id.existing_playlists_header);
LinearLayout playListContainer = (LinearLayout) dialog.findViewById(R.id.existing_playlists_container);
View no_data = dialog.findViewById(R.id.no_data);
final ArrayList <Playlist> playlists = Statics.curUser.getPlaylists();
if(playlists != null){
no_data.setVisibility(View.GONE);
if(playlists.size() > 0){
for(int i = 0; i < playlists.size();i++){
final int finalIndex = i;
View childLayout = inflat.inflate(R.layout.custom_textview, null);
TextView customText = (TextView)childLayout.findViewById(R.id.customText);
final Playlist currentIterationPlaylist = playlists.get(i);
customText.setText(currentIterationPlaylist.getPlaylistName());
childLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int playlistId = currentIterationPlaylist.getID();
int playlistDbId = currentIterationPlaylist.getDB_id();
PlaylistArSong song = addSongToPlaylistDB(playlistId, playlistDbId, songs.get(pos), currentIterationPlaylist);
if(song != null) {
dialog.dismiss();
playlists.remove(currentIterationPlaylist);
currentIterationPlaylist.addTrack(song, artist);
playlists.add(finalIndex, currentIterationPlaylist);
Statics.curUser.setPlaylists(playlists);
Toast.makeText(
cxt.getApplicationContext(),
"Song Added Successfully..",
Toast.LENGTH_SHORT).show();
((MainActivity)cxt).pullDB();
}
if(Statics.isNetworkConnected(cxt)){
new AddSongToUserPlaylistTask(cxt, Statics.curUser, currentIterationPlaylist) {
protected void onPostExecute(String result) {
super.onPostExecute(result);
if(!result.equals("")) {
Toast.makeText(
cxt.getApplicationContext(),
result,
Toast.LENGTH_SHORT).show();
}
};
}.execute();
new LikeSongTask(cxt).execute(Statics.curUser.getID(),
songs.get(pos).getID(), Statics.LIKE);
}else {
Toast.makeText(
cxt.getApplicationContext(),
"Network not available, Information saved locally..",
Toast.LENGTH_SHORT).show();
}
}
});
playListContainer.addView(childLayout);
}
}
else
no_data.setVisibility(View.VISIBLE);
}
else{
// existing_playlists_header.setVisibility(View.GONE);
// playListContainer.setVisibility(View.GONE);
}
View create_playlist = dialog.findViewById(R.id.create_playlist);
create_playlist.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
dialog.dismiss();
addPlaylistDialog();
}
});
dialog.show();
}
public void addPlaylistDialog(){
final Dialog dialog = new Dialog(this.cxt);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.create_playlist_dialog);
dialog.setCanceledOnTouchOutside(false);
final EditText playlistName = (EditText) dialog.findViewById(R.id.et_playlist_name);
Button add = (Button)dialog.findViewById(R.id.btn_addplaylist);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String text = playlistName.getText().toString();
if(!text.equals("")){
dialog.dismiss();
addPlaylistToDB(text);
if(Statics.isNetworkConnected(cxt)) {
//Post those which are not yet posted to server
new AddUserPlaylistsListTask(cxt, Statics.curUser) {
protected void onPostExecute(User result) {
super.onPostExecute(result);
};
}.execute();
}else {
Toast.makeText(
cxt.getApplicationContext(),
"Network not available, Information saved locally..",
Toast.LENGTH_SHORT).show();
}
}
}
});
dialog.show();
}
private void addPlaylistToDB(String name) {
DBAdapter adapter = new DBAdapter(cxt);
Playlist pl = new Playlist();
pl.setID(-1);
pl.setUserId(Statics.curUser.getID()+"");
pl.setPlaylistName(name);
pl.setDateAdded(System.currentTimeMillis());
pl.setLastUpdated(0L);
pl.setArtistAvatar("");
pl.setNumberOfTracks(0);
boolean success = adapter.addUserPlaylistIfNotExists(pl, Statics.curUser);
if(success) {
// Adding list to memory model, if its added to database
ArrayList <Playlist> playlists = Statics.curUser.getPlaylists();
if(playlists == null) {
playlists = new ArrayList<Playlist>();
}
playlists.add(pl);
Statics.curUser.setPlaylists(playlists);
Toast.makeText(
cxt.getApplicationContext(),
"Playlist Successfully Created..",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(
cxt.getApplicationContext(),
"Playlist with same name already exists.",
Toast.LENGTH_SHORT).show();
}
}
public void dismissLoading(boolean hasData) {
this.hasData = hasData;
loading = false;
notifyDataSetChanged();
}
public void setSelected(int pos) {
loading = true;
curSelected = pos;
notifyDataSetChanged();
}
public void setSelectedSongPosition(int pos) {
positionClicked = pos;
notifyDataSetChanged();
}
@Override
public Song getItem(int arg0) {
// TODO Auto-generated method stub
return songs.get(arg0);
}
public void setOnClickSong(OnClickSong oCS) {
this.oCS = oCS;
}
public void setOnClickBuySong(OnBuySong oBS) {
this.oBS = oBS;
}
public interface OnClickSong {
public void onClick(Song song, int position, boolean play);
}
public interface OnBuySong {
public void onBuyClick(Song song,int position);
}
public void clickItem(int position) {
if (null != oCS) {
setSelected(position);
oCS.onClick(songs.get(position), position, true);
}
}
public void resetSongStatusOfOthers(int pos) {
int i = 0;
for(Song song: songs) {
if(i != pos)
song.setListStatus(Song.ListStauts.NORMAL);
else
song.setListStatus(Song.ListStauts.LOADING);
i++;
}
notifyDataSetChanged();
}
public void resetSongStatus() {
for(Song song: songs) {
song.setListStatus(Song.ListStauts.NORMAL);
}
notifyDataSetChanged();
}
public void setSongStateInList(Song.ListStauts status, int position) {
if(songs.size() > position) {
Song song = songs.get(position);
song.setListStatus(status);
notifyDataSetChanged();
}
}
public void setCurrentSongState() {
if(songs.size() > curSelected) {
Song selectedSong = songs.get(curSelected);
selectedSong.setListStatus(Song.ListStauts.NORMAL);
notifyDataSetChanged();
}
}
public String getArtistName(int pos){
Song songDataModel = getItem(pos);
return songDataModel.getHeaderText();
}
}