package de.avalax.fitbuddy.presentation.edit.workout;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.SpinnerAdapter;
import android.widget.Toast;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import java.util.List;
import javax.inject.Inject;
import de.avalax.fitbuddy.R;
import de.avalax.fitbuddy.application.edit.workout.EditWorkoutApplicationService;
import de.avalax.fitbuddy.application.workout.WorkoutApplicationService;
import de.avalax.fitbuddy.domain.model.ResourceException;
import de.avalax.fitbuddy.domain.model.workout.Workout;
import de.avalax.fitbuddy.domain.model.workout.WorkoutException;
import de.avalax.fitbuddy.domain.model.workout.WorkoutId;
import de.avalax.fitbuddy.domain.model.workout.WorkoutListEntry;
import de.avalax.fitbuddy.domain.model.workout.WorkoutParseException;
import de.avalax.fitbuddy.domain.model.workout.WorkoutParserService;
import de.avalax.fitbuddy.presentation.FitbuddyApplication;
import de.avalax.fitbuddy.presentation.dialog.EditNameDialogFragment;
import static com.google.zxing.integration.android.IntentIntegrator.parseActivityResult;
import static de.avalax.fitbuddy.presentation.dialog.EditNameDialogFragment.DialogListener;
import static de.avalax.fitbuddy.presentation.dialog.EditNameDialogFragment.newInstance;
public class EditWorkoutActivity extends FragmentActivity
implements ActionBar.OnNavigationListener, DialogListener {
public static final int EDIT_EXERCISE = 2;
private static final String WORKOUT_POSITION = "WORKOUT_POSITION";
private boolean initializing;
@Inject
protected EditWorkoutApplicationService editEditWorkoutApplicationService;
@Inject
protected WorkoutParserService workoutParserService;
@Inject
WorkoutApplicationService workoutApplicationService;
private ExerciseListFragment exerciseListFragment;
private List<WorkoutListEntry> workoutList;
private Workout workout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_workout);
((FitbuddyApplication) getApplication()).getComponent().inject(this);
init(savedInstanceState);
}
private void init(Bundle savedInstanceState) {
WorkoutId workoutId = null;
if (savedInstanceState != null) {
workoutId = new WorkoutId(savedInstanceState.getString(WORKOUT_POSITION));
}
try {
if (workoutId == null) {
workoutId = workoutApplicationService.currentWorkoutId();
}
workout = editEditWorkoutApplicationService.loadWorkout(workoutId);
} catch (ResourceException e) {
Log.d("create a new workout", e.getMessage(), e);
workout = editEditWorkoutApplicationService.createWorkout();
}
exerciseListFragment = new ExerciseListFragment();
Bundle args = new Bundle();
args.putSerializable("workoutId", workoutId);
exerciseListFragment.setArguments(args);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, exerciseListFragment).commit();
initActionBar();
initActionNavigationBar();
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
String workoutId = workout.getWorkoutId().getId();
savedInstanceState.putString(WORKOUT_POSITION, workoutId);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.edit_workout_actions, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
if (initializing) {
initializing = false;
} else {
WorkoutId workoutId = workoutList.get(itemPosition).getWorkoutId();
try {
switchWorkout(workoutId);
} catch (WorkoutException e) {
Log.d("Can't load workout", e.getMessage(), e);
}
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
if (R.id.action_save_workout == itemId) {
saveWorkout();
} else if (R.id.action_add_workout == itemId) {
showNewWorkoutAlertDialog();
} else if (R.id.action_change_workout_name == itemId) {
editWorkoutName();
} else if (R.id.action_delete_workout == itemId) {
try {
deleteWorkout();
} catch (WorkoutException e) {
Log.d("Can't load new workout", e.getMessage(), e);
}
} else if (R.id.action_add_exercise == itemId) {
try {
addExercise();
} catch (WorkoutException e) {
Log.d("Can't add exercise", e.getMessage(), e);
}
} else if (R.id.action_share_workout == itemId) {
displayQrCode();
}
return true;
}
private void addExercise() throws WorkoutException {
editEditWorkoutApplicationService.createExercise(workout);
exerciseListFragment.initListView(workout.getWorkoutId());
}
private void deleteWorkout() throws WorkoutException {
editEditWorkoutApplicationService.deleteWorkout(workout);
List<WorkoutListEntry> workouts = editEditWorkoutApplicationService.getWorkoutList();
if (!workouts.isEmpty()) {
WorkoutId workoutId = workouts.get(0).getWorkoutId();
try {
workout = editEditWorkoutApplicationService.loadWorkout(workoutId);
} catch (WorkoutException e) {
workout = editEditWorkoutApplicationService.createWorkout();
}
}
initActionNavigationBar();
exerciseListFragment.initListView(workout.getWorkoutId());
}
private void saveWorkout() {
try {
editEditWorkoutApplicationService.switchWorkout(workout);
} catch (WorkoutException e) {
Log.d("Can't switch workout", e.getMessage(), e);
}
setResult(RESULT_OK);
finish();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == EDIT_EXERCISE && resultCode == RESULT_OK) {
try {
exerciseListFragment.initListView(workout.getWorkoutId());
workout = editEditWorkoutApplicationService.loadWorkout(workout.getWorkoutId());
} catch (WorkoutException e) {
Log.d("Failed to init fragment", e.getMessage(), e);
}
}
IntentResult scanResult = parseActivityResult(requestCode, resultCode, intent);
if (scanResult != null && scanResult.getContents() != null) {
try {
createWorkoutFromJson(scanResult.getContents());
} catch (WorkoutException e) {
Log.d("Create from JSON failed", e.getMessage(), e);
}
}
}
private void initActionBar() {
initializing = true;
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
}
protected void initActionNavigationBar() {
ActionBar actionBar = getActionBar();
initializing = true;
workoutList = editEditWorkoutApplicationService.getWorkoutList();
SpinnerAdapter spinnerAdapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_dropdown_item, workoutList);
actionBar.setListNavigationCallbacks(spinnerAdapter, this);
selectNavigationItem();
}
private void selectNavigationItem() {
ActionBar actionBar = getActionBar();
WorkoutId selectedWorkoutId = workout.getWorkoutId();
for (int i = 0; i < workoutList.size(); i++) {
if (workoutList.get(i).getWorkoutId().equals(selectedWorkoutId)) {
actionBar.setSelectedNavigationItem(i);
}
}
}
private void switchWorkout(WorkoutId workoutId) throws WorkoutException {
workout = editEditWorkoutApplicationService.loadWorkout(workoutId);
exerciseListFragment.initListView(workoutId);
}
private void showNewWorkoutAlertDialog() {
final CharSequence[] items = {"Create a new workout", "Scan from QR-Code"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Add a workout");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0) {
editEditWorkoutApplicationService.createWorkout();
initActionNavigationBar();
try {
exerciseListFragment.initListView(workout.getWorkoutId());
} catch (WorkoutException e) {
Log.d("Failed to init fragment", e.getMessage(), e);
}
} else if (item == 1) {
IntentIntegrator integrator = new IntentIntegrator(EditWorkoutActivity.this);
integrator.initiateScan();
}
}
});
AlertDialog alert = builder.create();
alert.show();
}
private void createWorkoutFromJson(String jsonString) throws WorkoutException {
try {
editEditWorkoutApplicationService.createWorkoutFromJson(jsonString);
initActionNavigationBar();
exerciseListFragment.initListView(workout.getWorkoutId());
} catch (WorkoutParseException wpe) {
CharSequence text = getText(R.string.action_read_qrcode_failed);
Toast toast = Toast.makeText(this, text, Toast.LENGTH_LONG);
Log.d("failed reading qrcode", wpe.getMessage(), wpe);
toast.show();
}
}
private void displayQrCode() {
IntentIntegrator integrator = new IntentIntegrator(this);
integrator.addExtra("ENCODE_SHOW_CONTENTS", false);
integrator.shareText(workoutParserService.jsonFromWorkout(workout));
}
private void editWorkoutName() {
FragmentManager fm = getSupportFragmentManager();
String name = workout.getName();
String hint = getResources().getString(R.string.new_workout_name);
newInstance(name, hint).show(fm, "fragment_edit_name");
}
@Override
public void onDialogPositiveClick(EditNameDialogFragment editNameDialogFragment) {
String name = editNameDialogFragment.getName();
if (!workout.getName().equals(name)) {
editEditWorkoutApplicationService.changeName(workout, name);
initActionNavigationBar();
}
}
}