package de.vanmar.android.yarrn.stashes;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.view.View;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.TextView;
import com.meetme.android.horizontallistview.HorizontalListView;
import com.octo.android.robospice.SpiceManager;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.FragmentArg;
import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.OptionsMenu;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.annotations.sharedpreferences.Pref;
import de.vanmar.android.yarrn.R;
import de.vanmar.android.yarrn.YarrnPrefs_;
import de.vanmar.android.yarrn.YarrnSpiceService;
import de.vanmar.android.yarrn.components.ImageDialog;
import de.vanmar.android.yarrn.projects.PhotoAdapter;
import de.vanmar.android.yarrn.ravelry.IRavelryActivity;
import de.vanmar.android.yarrn.ravelry.RavelryResultListener;
import de.vanmar.android.yarrn.ravelry.dts.Stash;
import de.vanmar.android.yarrn.ravelry.dts.StashResult;
import de.vanmar.android.yarrn.ravelry.dts.YarnFiber;
import de.vanmar.android.yarrn.requests.AbstractRavelryGetRequest;
import de.vanmar.android.yarrn.requests.GetStashRequest;
@EFragment(R.layout.fragment_stash_detail)
@OptionsMenu(R.menu.fragment_menu)
public class StashFragment extends Fragment {
public static final String ARG_STASH_ID = "stashId";
public static final String ARG_USERNAME = "username";
protected SpiceManager spiceManager;
private ImageDialog dialog;
public interface StashFragmentListener extends IRavelryActivity {
}
@ViewById(R.id.gallery)
HorizontalListView gallery;
@ViewById(R.id.name)
TextView name;
@ViewById(R.id.location)
TextView location;
@ViewById(R.id.details)
TextView details;
@ViewById(R.id.color_title)
TextView colorTitle;
@ViewById(R.id.color)
TextView color;
@ViewById(R.id.notes)
WebView notes;
@FragmentArg(ARG_STASH_ID)
int stashId;
@FragmentArg(ARG_USERNAME)
String username;
private StashFragmentListener listener;
private PhotoAdapter adapter;
@Pref
YarrnPrefs_ prefs;
@AfterViews
public void afterViews() {
if (spiceManager == null) {
spiceManager = new SpiceManager(YarrnSpiceService.class);
}
adapter = new PhotoAdapter(getActivity());
gallery.setAdapter(adapter);
gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
dialog = new ImageDialog(getActivity(), adapter.getItem(position).mediumUrl);
dialog.show();
}
});
}
@Override
public void onAttach(final Activity activity) {
super.onAttach(activity);
if (activity instanceof StashFragmentListener) {
listener = (StashFragmentListener) activity;
} else {
throw new ClassCastException(activity.toString()
+ " must implement StashFragmentListener");
}
}
@Override
public void onDetach() {
super.onDetach();
listener = null;
}
public void onStashSelected(final int stashId) {
clearStash();
if (stashId != 0) {
GetStashRequest request = new GetStashRequest(this.getActivity().getApplication(), prefs, stashId, username);
spiceManager.execute(request, request.getCacheKey(), AbstractRavelryGetRequest.CACHE_DURATION, new StashListener(listener));
}
}
@Override
public void onStart() {
super.onStart();
spiceManager.start(this.getActivity());
onStashSelected(stashId);
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onStop() {
if (spiceManager.isStarted()) {
spiceManager.shouldStop();
}
super.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
dialog = null;
}
}
@UiThread
protected void clearStash() {
View view = getView();
if (view != null) {
view.setVisibility(View.GONE);
}
}
protected void displayStash(final StashResult stashResult) {
Stash stash = stashResult.stash;
getActivity().setTitle(stash.name);
name.setText(stash.name);
location.setText(stash.location);
hideIfEmpty(location, stash.location);
String detailString = getDetailString(stash);
details.setText(detailString);
hideIfEmpty(details, detailString);
color.setText(stash.color);
hideIfEmpty(color, stash.color);
hideIfEmpty(colorTitle, stash.color);
notes.loadDataWithBaseURL("", stash.notes_html, "text/html", "UTF-8", "");
adapter.setItems(stash.photos);
getView().setVisibility(View.VISIBLE);
}
private String getDetailString(Stash stash) {
StringBuilder details = new StringBuilder();
if (stash.yarn != null && stash.yarn.yarnWeight != null) {
if (stash.yarn.yarnWeight.name != null)
details.append(stash.yarn.yarnWeight.name);
if (stash.yarn.yarnWeight.ply != null)
details.append(' ').append(stash.yarn.yarnWeight.ply).append(getString(R.string.ply));
}
if (stash.yarn != null && stash.yarn.yarnFibers != null) {
for (YarnFiber fiber : stash.yarn.yarnFibers) {
if (fiber.fiberType != null) {
details.append(' ');
if (fiber.percentage > 0)
details.append(fiber.percentage).append("% ");
details.append(fiber.fiberType.name);
}
}
}
return details.toString();
}
private void hideIfEmpty(View view, String value) {
view.setVisibility(value != null && !"".equals(value) ? View.VISIBLE : View.GONE);
}
/*
private void hideIfEmpty(View view, Collection values) {
view.setVisibility(values != null && !values.isEmpty() ? View.VISIBLE : View.GONE);
}*/
@OptionsItem(R.id.menu_refresh)
public void menuRefresh() {
onStashSelected(stashId);
}
class StashListener extends RavelryResultListener<StashResult> {
protected StashListener(IRavelryActivity activity) {
super(activity);
}
@Override
public void onRequestSuccess(StashResult result) {
displayStash(result);
}
}
}