package com.boardgamegeek.ui;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.boardgamegeek.R;
import com.boardgamegeek.events.UpdateCompleteEvent;
import com.boardgamegeek.events.UpdateEvent;
import com.boardgamegeek.provider.BggContract.Artists;
import com.boardgamegeek.provider.BggContract.Designers;
import com.boardgamegeek.provider.BggContract.Publishers;
import com.boardgamegeek.service.UpdateService;
import com.boardgamegeek.ui.widget.TimestampView;
import com.boardgamegeek.util.DateTimeUtils;
import com.boardgamegeek.util.PresentationUtils;
import com.boardgamegeek.util.UIUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import hugo.weaving.DebugLog;
public class ProducerFragment extends Fragment implements LoaderCallbacks<Cursor>, OnRefreshListener {
private static final int AGE_IN_DAYS_TO_REFRESH = 30;
private Uri uri;
private int token;
private int id;
private boolean isSyncing;
private Unbinder unbinder;
@BindView(R.id.swipe_refresh) SwipeRefreshLayout swipeRefreshLayout;
@BindView(R.id.id) TextView idView;
@BindView(R.id.name) TextView nameView;
@BindView(R.id.description) TextView descriptionView;
@BindView(R.id.updated) TimestampView updatedView;
@Override
@DebugLog
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Intent intent = UIUtils.fragmentArgumentsToIntent(getArguments());
uri = intent.getData();
if (Designers.isDesignerUri(uri)) {
token = DesignerQuery._TOKEN;
} else if (Artists.isArtistUri(uri)) {
token = ArtistQuery._TOKEN;
} else if (Publishers.isPublisherUri(uri)) {
token = PublisherQuery._TOKEN;
}
}
@Override
@DebugLog
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_producer, container, false);
unbinder = ButterKnife.bind(this, rootView);
swipeRefreshLayout.setOnRefreshListener(this);
swipeRefreshLayout.setColorSchemeResources(PresentationUtils.getColorSchemeResources());
getLoaderManager().restartLoader(token, null, this);
return rootView;
}
@DebugLog
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@DebugLog
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
@DebugLog
@Override
public void onDestroyView() {
super.onDestroyView();
if (unbinder != null) unbinder.unbind();
}
@Override
@DebugLog
public Loader<Cursor> onCreateLoader(int id, Bundle data) {
CursorLoader loader = null;
switch (id) {
case DesignerQuery._TOKEN:
loader = new CursorLoader(getActivity(), uri, DesignerQuery.PROJECTION, null, null, null);
break;
case ArtistQuery._TOKEN:
loader = new CursorLoader(getActivity(), uri, ArtistQuery.PROJECTION, null, null, null);
break;
case PublisherQuery._TOKEN:
loader = new CursorLoader(getActivity(), uri, PublisherQuery.PROJECTION, null, null, null);
break;
}
return loader;
}
@DebugLog
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (getActivity() == null) {
return;
}
if (loader.getId() == token) {
if (cursor == null || !cursor.moveToFirst()) {
return;
}
id = cursor.getInt(Query.ID);
String name = cursor.getString(Query.NAME);
String description = cursor.getString(Query.DESCRIPTION);
long updated = cursor.getLong(Query.UPDATED);
idView.setText(String.format(getString(R.string.id_list_text), String.valueOf(id)));
nameView.setText(name);
UIUtils.setTextMaybeHtml(descriptionView, description);
updatedView.setTimestamp(updated);
if (updated == 0 || DateTimeUtils.howManyDaysOld(updated) > AGE_IN_DAYS_TO_REFRESH) {
triggerRefresh();
}
} else {
if (cursor != null) cursor.close();
}
}
@DebugLog
private void triggerRefresh() {
UpdateService.start(getActivity(), token, id);
}
@Override
@DebugLog
public void onLoaderReset(Loader<Cursor> loader) {
}
@Override
public void onRefresh() {
triggerRefresh();
}
@DebugLog
@SuppressWarnings("unused")
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onEvent(UpdateEvent event) {
isSyncing = event.getType() == token;
updateRefreshStatus();
}
@DebugLog
@SuppressWarnings({ "unused", "UnusedParameters" })
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onEvent(UpdateCompleteEvent event) {
isSyncing = false;
updateRefreshStatus();
}
@DebugLog
private void updateRefreshStatus() {
if (swipeRefreshLayout != null) {
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
if (swipeRefreshLayout != null) swipeRefreshLayout.setRefreshing(isSyncing);
}
});
}
}
private interface Query {
int ID = 0;
int NAME = 1;
int DESCRIPTION = 2;
int UPDATED = 3;
}
private interface DesignerQuery extends Query {
int _TOKEN = UpdateService.SYNC_TYPE_DESIGNER;
String[] PROJECTION = { Designers.DESIGNER_ID, Designers.DESIGNER_NAME, Designers.DESIGNER_DESCRIPTION,
Designers.UPDATED };
}
private interface ArtistQuery extends Query {
int _TOKEN = UpdateService.SYNC_TYPE_ARTIST;
String[] PROJECTION = { Artists.ARTIST_ID, Artists.ARTIST_NAME, Artists.ARTIST_DESCRIPTION, Artists.UPDATED };
}
private interface PublisherQuery extends Query {
int _TOKEN = UpdateService.SYNC_TYPE_PUBLISHER;
String[] PROJECTION = { Publishers.PUBLISHER_ID, Publishers.PUBLISHER_NAME, Publishers.PUBLISHER_DESCRIPTION,
Publishers.UPDATED };
}
}