package com.dozuki.ifixit.ui.guide.create;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.dozuki.ifixit.R;
import com.dozuki.ifixit.model.guide.Guide;
import com.dozuki.ifixit.model.guide.GuideStep;
import com.dozuki.ifixit.model.guide.StepLine;
import com.dozuki.ifixit.ui.BaseFragment;
import com.dozuki.ifixit.ui.guide.view.GuideViewActivity;
import com.dozuki.ifixit.util.api.ApiCall;
import com.dozuki.ifixit.util.api.ApiError;
import com.dozuki.ifixit.util.api.ApiEvent;
import com.dozuki.ifixit.util.api.Api;
import com.squareup.otto.Subscribe;
public class StepPortalFragment extends BaseFragment implements
StepReorderFragment.StepRearrangeListener {
public static int STEP_ID = 0;
private static final String SHOWING_DELETE = "SHOWING_DELETE";
private static final String STEP_FOR_DELETE = "STEP_FOR_DELETE";
private static final int NO_ID = -1;
private ListView mStepList;
private StepAdapter mStepAdapter;
private Guide mGuide;
private GuideStep mStepForDelete;
private StepPortalFragment mSelf;
private boolean mShowingDelete;
private ActionBar mActionBar;
/////////////////////////////////////////////////////
// LIFECYCLE
/////////////////////////////////////////////////////
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int guideid = getArguments().getInt(StepsActivity.GUIDE_ID_KEY);
mActionBar = getSherlockActivity().getSupportActionBar();
setHasOptionsMenu(true);
mSelf = this;
mStepAdapter = new StepAdapter();
if (savedInstanceState != null) {
mShowingDelete = savedInstanceState.getBoolean(SHOWING_DELETE);
mStepForDelete = (GuideStep) savedInstanceState.getSerializable(STEP_FOR_DELETE);
mGuide = (Guide) savedInstanceState.getSerializable(StepsActivity.GUIDE_KEY);
}
if (mGuide == null) {
((StepsActivity) getActivity()).showLoading();
Api.call(getActivity(), ApiCall.unpatrolledGuide(guideid));
} else {
mActionBar.setTitle(mGuide.getTitle());
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.guide_create_steps_portal, container, false);
mStepList = (ListView) view.findViewById(R.id.steps_portal_list);
mStepList.setEmptyView(view.findViewById(R.id.no_steps_text));
mStepList.setAdapter(mStepAdapter);
if (mShowingDelete) {
createDeleteDialog(mStepForDelete).show();
}
return view;
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putSerializable(STEP_FOR_DELETE, mStepForDelete);
savedInstanceState.putBoolean(SHOWING_DELETE, mShowingDelete);
savedInstanceState.putSerializable(StepsActivity.GUIDE_KEY, mGuide);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == StepsActivity.GUIDE_EDIT_STEP_REQUEST && resultCode == Activity.RESULT_OK) {
Guide guide = (Guide) data.getSerializableExtra(GuideCreateActivity.GUIDE_KEY);
if (guide != null) {
mGuide = guide;
mStepAdapter = new StepAdapter();
mStepList.setAdapter(mStepAdapter);
mStepList.invalidateViews();
}
}
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
if (mGuide != null) {
menu.findItem(R.id.reorder_steps).setVisible(mGuide.getSteps().size() >= 2);
}
super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
getActivity().finish();
return true;
case R.id.edit_guide_details:
launchGuideIntroEdit();
return true;
case R.id.reorder_steps:
launchStepReorderFragment();
return true;
case R.id.add_step:
GuideStep newStep = new GuideStep(mGuide.getSteps().size() + 1);
newStep.addLine(new StepLine());
mGuide.addStep(newStep);
launchStepEdit(mGuide.getSteps().size());
return true;
case R.id.view_guide:
Intent intent = new Intent(getActivity(), GuideViewActivity.class);
intent.putExtra(GuideViewActivity.GUIDEID, mGuide.getGuideid());
intent.putExtra(GuideViewActivity.CURRENT_PAGE, 0);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/////////////////////////////////////////////////////
// NOTIFICATION LISTENERS
/////////////////////////////////////////////////////
@Subscribe
public void onGuideForEdit(ApiEvent.GuideForEdit event) {
if (!event.hasError()) {
mGuide = event.getResult();
// Set the page title to the guide name
mActionBar.setTitle(mGuide.getTitle());
mStepAdapter.notifyDataSetChanged();
((StepsActivity) getActivity()).hideLoading();
} else {
Api.getErrorDialog(getActivity(), event).show();
}
}
@Subscribe
public void onGuideIntroSaved(ApiEvent.EditGuide event) {
if (!event.hasError()) {
mGuide = event.getResult();
// Update the page title if the title changed
if (!mActionBar.getTitle().equals(mGuide.getTitle())) {
mActionBar.setTitle(mGuide.getTitle());
}
} else {
Api.getErrorDialog(getActivity(), event).show();
}
}
@Subscribe
public void onGuideStepDeleted(ApiEvent.StepRemove event) {
if (!event.hasError()) {
mGuide.deleteStep(mStepForDelete);
for (int i = 0; i < mGuide.getSteps().size(); i++) {
mGuide.getSteps().get(i).setStepNum(i);
}
mStepForDelete = null;
mGuide.setRevisionid(event.getResult().getRevisionid());
invalidateViews();
((StepsActivity) getActivity()).hideLoading();
} else {
Api.getErrorDialog(getActivity(), event).show();
}
}
@Subscribe
public void onStepReorder(ApiEvent.StepReorder event) {
((StepsActivity)getActivity()).hideLoading();
if (!event.hasError() || event.getError().mType == ApiError.Type.CONFLICT) {
mGuide = event.getResult();
mStepAdapter.notifyDataSetChanged();
invalidateViews();
}
if (event.hasError()) {
Api.getErrorDialog(getActivity(), event).show();
}
}
/////////////////////////////////////////////////////
// EVENT LISTENERS
/////////////////////////////////////////////////////
@Override
public void onReorderComplete(boolean reodered) {
if (reodered) {
mStepAdapter.notifyDataSetChanged();
((StepsActivity) getActivity()).showLoading();
Api.call(getActivity(), ApiCall.reorderSteps(mGuide));
}
}
/////////////////////////////////////////////////////
// NAVIGATION
/////////////////////////////////////////////////////
protected void launchStepEdit(int curStep) {
Intent intent = new Intent(getActivity(), StepEditActivity.class);
intent.putExtra(GuideCreateActivity.GUIDE_KEY, mGuide);
intent.putExtra(StepEditActivity.GUIDE_STEP_NUM_KEY, curStep);
startActivityForResult(intent, StepsActivity.GUIDE_EDIT_STEP_REQUEST);
}
private void launchGuideIntroEdit() {
Intent intent = new Intent(getActivity(), GuideIntroActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.putExtra(GuideIntroActivity.STATE_KEY, true);
intent.putExtra(StepsActivity.GUIDE_KEY, mGuide);
startActivityForResult(intent, GuideCreateActivity.GUIDE_STEP_EDIT_REQUEST);
}
private void launchStepReorderFragment() {
// Launch the Step reorder fragment
StepReorderFragment mGuideCreateReOrder = new StepReorderFragment();
mGuideCreateReOrder.setGuide(mGuide);
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.add(R.id.guide_create_fragment_steps_container, mGuideCreateReOrder);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/////////////////////////////////////////////////////
// ADAPTERS
/////////////////////////////////////////////////////
private class StepAdapter extends BaseAdapter {
@Override
public int getCount() {
if (mGuide == null) {
return 0;
}
return mGuide.getSteps().size();
}
@Override
public Object getItem(int position) {
return mGuide.getSteps().get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
StepListItem itemView;
GuideStep step = (GuideStep) getItem(position);
if (convertView != null) {
itemView = (StepListItem) convertView;
} else {
itemView = new StepListItem(getActivity(), mSelf);
}
itemView.setRowData(step, position);
itemView.setTag(step.getStepid());
return itemView;
}
}
/////////////////////////////////////////////////////
// DIALOGS
/////////////////////////////////////////////////////
protected AlertDialog createDeleteDialog(GuideStep item) {
mStepForDelete = item;
mShowingDelete = true;
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(getString(R.string.confirm_delete_title))
.setMessage(getString(R.string.step_edit_confirm_delete_message, mStepForDelete.getStepNum()))
.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mShowingDelete = false;
((StepsActivity) getActivity()).showLoading();
Api.call(getActivity(),
ApiCall.deleteStep(mGuide.getGuideid(), mStepForDelete));
dialog.cancel();
}
}).setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mShowingDelete = false;
mStepForDelete = null;
}
}).setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
mShowingDelete = false;
}
});
return builder.create();
}
/////////////////////////////////////////////////////
// HELPERS
/////////////////////////////////////////////////////
protected void invalidateViews() {
mStepList.invalidateViews();
}
}