package com.boardgamegeek.ui;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.boardgamegeek.R;
import com.boardgamegeek.auth.Authenticator;
import com.boardgamegeek.events.BuddiesCountChangedEvent;
import com.boardgamegeek.events.BuddySelectedEvent;
import com.boardgamegeek.provider.BggContract.Buddies;
import com.boardgamegeek.service.SyncService;
import com.boardgamegeek.ui.model.Buddy;
import com.boardgamegeek.util.CursorUtils;
import com.boardgamegeek.util.PreferencesUtils;
import com.boardgamegeek.util.UIUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import butterknife.BindView;
import butterknife.ButterKnife;
import hugo.weaving.DebugLog;
import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
import timber.log.Timber;
public class BuddiesFragment extends StickyHeaderListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private static final int TOKEN = 0;
private static final String SORT_COLUMN = Buddies.BUDDY_LASTNAME;
private BuddiesAdapter adapter;
private int selectedBuddyId;
@DebugLog
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (PreferencesUtils.getSyncBuddies(getActivity())) {
setEmptyText(getString(R.string.empty_buddies));
} else {
setEmptyText(getString(R.string.empty_buddies_sync_off));
}
getLoaderManager().restartLoader(TOKEN, getArguments(), this);
}
@DebugLog
@Override
public void onListItemClick(View v, int position, long id) {
final int buddyId = (int) v.getTag(R.id.id);
final String name = String.valueOf(v.getTag(R.id.name));
final String fullName = String.valueOf(v.getTag(R.id.full_name));
EventBus.getDefault().postSticky(new BuddySelectedEvent(buddyId, name, fullName));
}
@SuppressWarnings("unused")
@DebugLog
@Subscribe
public void onEvent(BuddySelectedEvent event) {
selectedBuddyId = event.getBuddyId();
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
@DebugLog
@Override
protected void triggerRefresh() {
SyncService.sync(getActivity(), SyncService.FLAG_SYNC_BUDDIES);
}
@DebugLog
@Override
protected int getSyncType() {
return SyncService.FLAG_SYNC_BUDDIES;
}
@DebugLog
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle data) {
Uri buddiesUri = UIUtils.fragmentArgumentsToIntent(data).getData();
if (buddiesUri == null) {
buddiesUri = Buddies.CONTENT_URI;
}
CursorLoader loader = new CursorLoader(getActivity(), buddiesUri,
Buddy.PROJECTION,
Buddies.BUDDY_ID + "!=? AND " + Buddies.BUDDY_FLAG + "=1",
new String[] { Authenticator.getUserId(getActivity()) },
null);
loader.setUpdateThrottle(2000);
return loader;
}
@DebugLog
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (getActivity() == null) {
return;
}
int token = loader.getId();
if (token == TOKEN) {
if (adapter == null) {
adapter = new BuddiesAdapter(getActivity());
setListAdapter(adapter);
}
adapter.changeCursor(cursor);
EventBus.getDefault().postSticky(new BuddiesCountChangedEvent(cursor.getCount()));
restoreScrollState();
} else {
Timber.d("Query complete, Not Actionable: %s", token);
cursor.close();
}
}
@DebugLog
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.changeCursor(null);
}
public class BuddiesAdapter extends CursorAdapter implements StickyListHeadersAdapter {
private final LayoutInflater inflater;
public BuddiesAdapter(Context context) {
super(context, null, false);
inflater = LayoutInflater.from(context);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View row = inflater.inflate(R.layout.row_buddy, parent, false);
ViewHolder holder = new ViewHolder(row);
row.setTag(holder);
return row;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
Buddy buddy = Buddy.fromCursor(cursor);
UIUtils.setActivatedCompat(view, buddy.getId() == selectedBuddyId);
loadThumbnail(buddy.getAvatarUrl(), holder.avatar, R.drawable.person_image_empty);
if (TextUtils.isEmpty(buddy.getFullName())) {
holder.fullName.setText(buddy.getUserName());
holder.name.setVisibility(View.GONE);
} else {
holder.fullName.setText(buddy.getFullName());
holder.name.setVisibility(View.VISIBLE);
holder.name.setText(buddy.getUserName());
}
view.setTag(R.id.id, buddy.getId());
view.setTag(R.id.name, buddy.getUserName());
view.setTag(R.id.full_name, buddy.getFullName());
}
@Override
public long getHeaderId(int position) {
if (position < 0) {
return 0;
}
return CursorUtils.getFirstCharacter(getCursor(), position, SORT_COLUMN, "-").charAt(0);
}
@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) {
HeaderViewHolder holder;
if (convertView == null) {
holder = new HeaderViewHolder();
convertView = inflater.inflate(R.layout.row_header, parent, false);
holder.text = (TextView) convertView.findViewById(android.R.id.title);
convertView.setTag(holder);
} else {
holder = (HeaderViewHolder) convertView.getTag();
}
holder.text.setText(CursorUtils.getFirstCharacter(getCursor(), position, SORT_COLUMN, "-"));
return convertView;
}
class ViewHolder {
@BindView(R.id.full_name) TextView fullName;
@BindView(R.id.name) TextView name;
@BindView(R.id.avatar) ImageView avatar;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
class HeaderViewHolder {
TextView text;
}
}
}