package com.docd.purefm.adapters;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import com.docd.purefm.R;
import com.docd.purefm.settings.Settings;
import com.docd.purefm.ui.activities.BrowserPagerActivity;
import com.docd.purefm.file.FileFactory;
import com.docd.purefm.file.GenericFile;
import com.docd.purefm.utils.BookmarksHelper;
import android.database.DataSetObservable;
import android.database.DataSetObserver;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;
import android.widget.Toast;
/**
* ListAdapter of Bookmarks (Sliding drawer content)
* @author Doctoror
*/
public final class BookmarksAdapter implements ListAdapter {
@NonNull
private final List<BookmarksHelper.BookmarkItem> mBookmarks;
@NonNull
private final DataSetObservable mDataSetObservable = new DataSetObservable();
@NonNull
private final LayoutInflater mLayoutInflater;
@NonNull
private final BrowserPagerActivity mActivity;
@NonNull
private final Settings mSettings;
private boolean modified;
private final int mUserBookmarksStart;
public BookmarksAdapter(@NonNull final BrowserPagerActivity activity) {
mActivity = activity;
mSettings = Settings.getInstance(activity);
mLayoutInflater = activity.getLayoutInflater();
mUserBookmarksStart = BookmarksHelper.getUserBookmarkOffset();
mBookmarks = BookmarksHelper.getAllBookmarks(activity);
}
public void addItem(@NonNull final String path) {
if (bookmarksContainPath(path)) {
Toast.makeText(mActivity, R.string.bookmark_exists, Toast.LENGTH_SHORT).show();
return;
}
final BookmarksHelper.BookmarkItem item = BookmarksHelper
.createUserBookmarkItem(mActivity, path);
if (!mBookmarks.add(item)) {
Toast.makeText(mActivity, R.string.bookmark_not_added, Toast.LENGTH_SHORT).show();
return;
}
this.modified = true;
this.notifyDataSetChanged();
}
private boolean bookmarksContainPath(@NonNull final String path) {
for (final BookmarksHelper.BookmarkItem item : mBookmarks) {
if (item.getDisplayPath().toString().equals(path)) {
return true;
}
}
return false;
}
@Override
public int getCount() {
return this.mBookmarks.size();
}
@Override
public BookmarksHelper.BookmarkItem getItem(final int pos) {
return this.mBookmarks.get(pos);
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public int getItemViewType(int arg0) {
return arg0 < mUserBookmarksStart ? 0 : 1;
}
@Override
public View getView(int pos, View v, ViewGroup arg2) {
final int viewType = this.getItemViewType(pos);
Holder h;
if (v == null) {
v = mLayoutInflater.inflate(viewType == 0 ? R.layout.list_item_bookmark :
R.layout.list_item_bookmark_user, arg2, false);
if (v == null) {
throw new RuntimeException("Inflated View is null");
}
h = new Holder();
h.icon = (ImageView) v.findViewById(android.R.id.icon);
h.title = (TextView) v.findViewById(android.R.id.title);
h.summary = (TextView) v.findViewById(android.R.id.summary);
h.remove = v.findViewById(android.R.id.button1);
v.setTag(h);
} else {
h = (Holder) v.getTag();
}
final BookmarksHelper.BookmarkItem cur = this.getItem(pos);
final String currentPath = cur.getDisplayPath().toString();
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final GenericFile file = FileFactory.newFile(mSettings, currentPath);
mActivity.setCurrentPath(file);
}
});
h.title.setText(cur.getDisplayName());
h.summary.setText(currentPath);
if (viewType == 1) {
h.remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mBookmarks.remove(cur);
modified = true;
notifyDataSetChanged();
}
});
}
h.icon.setImageDrawable(cur.getIcon());
return v;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isEmpty() {
return this.mBookmarks.isEmpty();
}
@Override
public void registerDataSetObserver(DataSetObserver arg0) {
this.mDataSetObservable.registerObserver(arg0);
}
@Override
public void unregisterDataSetObserver(DataSetObserver arg0) {
this.mDataSetObservable.unregisterObserver(arg0);
}
/**
* Notifies the attached observers that the underlying data has been changed
* and any View reflecting the data set should refresh itself.
*/
private void notifyDataSetChanged() {
this.mDataSetObservable.notifyChanged();
}
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int arg0) {
return true;
}
public boolean isModified() {
return this.modified;
}
@NonNull
public Set<String> getData() {
final Set<String> user = new LinkedHashSet<>();
int i = 0;
for (final BookmarksHelper.BookmarkItem bookmark : mBookmarks) {
if (i++ >= mUserBookmarksStart) {
user.add(bookmark.getDisplayPath().toString());
}
}
return user;
}
private static final class Holder {
ImageView icon;
TextView title;
TextView summary;
View remove;
}
}