package com.naman14.timber.adapters;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.naman14.timber.MusicPlayer;
import com.naman14.timber.R;
import com.naman14.timber.dataloaders.FolderLoader;
import com.naman14.timber.dataloaders.SongLoader;
import com.naman14.timber.models.Song;
import com.naman14.timber.utils.PreferencesUtility;
import com.naman14.timber.utils.TimberUtils;
import com.naman14.timber.widgets.BubbleTextGetter;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Created by nv95 on 10.11.16.
*/
public class FolderAdapter extends RecyclerView.Adapter<FolderAdapter.ItemHolder> implements BubbleTextGetter {
@NonNull
private List<File> mFileSet;
private List<Song> mSongs;
private File mRoot;
private Activity mContext;
private final Drawable[] mIcons;
private boolean mBusy = false;
public FolderAdapter(Activity context, File root) {
mContext = context;
mIcons = new Drawable[]{
ContextCompat.getDrawable(context, R.drawable.ic_folder_open_black_24dp),
ContextCompat.getDrawable(context, R.drawable.ic_folder_parent_dark),
ContextCompat.getDrawable(context, R.drawable.ic_file_music_dark),
ContextCompat.getDrawable(context, R.drawable.ic_timer_wait)
};
mSongs = new ArrayList<>();
updateDataSet(root);
}
public void applyTheme(boolean dark) {
ColorFilter cf = new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
for (Drawable d : mIcons) {
if (dark) {
d.setColorFilter(cf);
} else {
d.clearColorFilter();
}
}
}
@Override
public FolderAdapter.ItemHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_folder_list, viewGroup, false);
return new ItemHolder(v);
}
@Override
public void onBindViewHolder(final FolderAdapter.ItemHolder itemHolder, int i) {
File localItem = mFileSet.get(i);
Song song = mSongs.get(i);
itemHolder.title.setText(localItem.getName());
if (localItem.isDirectory()) {
itemHolder.albumArt.setImageDrawable("..".equals(localItem.getName()) ? mIcons[1] : mIcons[0]);
} else {
ImageLoader.getInstance().displayImage(TimberUtils.getAlbumArtUri(song.albumId).toString(),
itemHolder.albumArt,
new DisplayImageOptions.Builder().
cacheInMemory(true).showImageOnFail(mIcons[2])
.resetViewBeforeLoading(true).build());
}
}
@Override
public int getItemCount() {
return mFileSet.size();
}
@Deprecated
public void updateDataSet(File newRoot) {
if (mBusy) {
return;
}
if ("..".equals(newRoot.getName())) {
goUp();
return;
}
mRoot = newRoot;
mFileSet = FolderLoader.getMediaFiles(newRoot, true);
getSongsForFiles(mFileSet);
}
@Deprecated
public boolean goUp() {
if (mRoot == null || mBusy) {
return false;
}
File parent = mRoot.getParentFile();
if (parent != null && parent.canRead()) {
updateDataSet(parent);
return true;
} else {
return false;
}
}
public boolean goUpAsync() {
if (mRoot == null || mBusy) {
return false;
}
File parent = mRoot.getParentFile();
if (parent != null && parent.canRead()) {
updateDataSetAsync(parent);
return true;
} else {
return false;
}
}
public void updateDataSetAsync(File newRoot) {
if (mBusy) {
return;
}
if ("..".equals(newRoot.getName())) {
goUpAsync();
return;
}
mRoot = newRoot;
new NavigateTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mRoot);
}
@Override
public String getTextToShowInBubble(int pos) {
if (mBusy || mFileSet.size() == 0)
return "";
try {
File f = mFileSet.get(pos);
if (f.isDirectory()) {
return String.valueOf(f.getName().charAt(0));
} else {
return Character.toString(f.getName().charAt(0));
}
} catch (Exception e) {
return "";
}
}
private void getSongsForFiles(List<File> files) {
mSongs.clear();
for (File file : files) {
mSongs.add(SongLoader.getSongFromPath(file.getAbsolutePath(), mContext));
}
}
private class NavigateTask extends AsyncTask<File, Void, List<File>> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mBusy = true;
}
@Override
protected List<File> doInBackground(File... params) {
List<File> files = FolderLoader.getMediaFiles(params[0], true);
getSongsForFiles(files);
return files;
}
@Override
protected void onPostExecute(List<File> files) {
super.onPostExecute(files);
mFileSet = files;
notifyDataSetChanged();
mBusy = false;
PreferencesUtility.getInstance(mContext).storeLastFolder(mRoot.getPath());
}
}
public class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
protected TextView title;
protected ImageView albumArt;
public ItemHolder(View view) {
super(view);
this.title = (TextView) view.findViewById(R.id.folder_title);
this.albumArt = (ImageView) view.findViewById(R.id.album_art);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (mBusy) {
return;
}
final File f = mFileSet.get(getAdapterPosition());
if (f.isDirectory()) {
albumArt.setImageDrawable(mIcons[3]);
updateDataSetAsync(f);
} else if (f.isFile()) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
int current =-1;
long songId = SongLoader.getSongFromPath(mFileSet.get(getAdapterPosition()).getAbsolutePath(),mContext).id;
int count = 0;
for (Song song : mSongs) {
if (song.id != -1) {
count++;
}
}
long[] ret = new long[count];
int j = 0;
for (int i = 0; i < getItemCount(); i++) {
if (mSongs.get(i).id != -1) {
ret[j] = mSongs.get(i).id;
if (mSongs.get(i).id == songId) {
current = j;
}
j++;
}
}
MusicPlayer.playAll(mContext, ret, current, -1, TimberUtils.IdType.NA, false);
}
}, 100);
}
}
}
}