package de.avalax.fitbuddy.presentation.edit.workout;
import android.content.res.Resources;
import android.util.Log;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AbsListView;
import de.avalax.fitbuddy.R;
import de.avalax.fitbuddy.application.edit.workout.EditWorkoutApplicationService;
import de.avalax.fitbuddy.domain.model.ResourceException;
import de.avalax.fitbuddy.domain.model.workout.Workout;
import de.avalax.fitbuddy.domain.model.workout.WorkoutException;
class ExerciseModeListener implements AbsListView.MultiChoiceModeListener {
private ItemsWithCheckedState itemsChecked;
private Workout workout;
private ExerciseListFragment exerciseListFragment;
private EditWorkoutApplicationService editWorkoutApplicationService;
private MenuItem moveExerciseUpMenuItem;
private MenuItem moveExerciseDownMenuItem;
private MenuItem deleteExerciseMenuItem;
ExerciseModeListener(Workout workout, ExerciseListFragment exerciseListFragment,
EditWorkoutApplicationService editWorkoutApplicationService) {
this.workout = workout;
this.exerciseListFragment = exerciseListFragment;
this.editWorkoutApplicationService = editWorkoutApplicationService;
this.itemsChecked = new ItemsWithCheckedState();
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
if (checked) {
itemsChecked.addCheckedItem(position);
} else {
itemsChecked.removeCheckedItem(position);
}
updateMenuItems();
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
Resources resources = exerciseListFragment.getResources();
CharSequence title = resources.getText(R.string.cab_title_manage_exercises);
mode.getMenuInflater().inflate(R.menu.edit_exerciselist_actions, mode.getMenu());
mode.setTitle(title);
moveExerciseUpMenuItem = menu.findItem(R.id.action_move_exercise_up);
moveExerciseDownMenuItem = menu.findItem(R.id.action_move_exercise_down);
deleteExerciseMenuItem = menu.findItem(R.id.action_delete_exercise);
updateMenuItems();
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getItemId() == R.id.action_add_exercise) {
editWorkoutApplicationService.createExercise(workout);
}
if (item.getItemId() == R.id.action_move_exercise_up) {
for (int position : itemsChecked.list()) {
moveExerciseUp(position);
}
}
if (item.getItemId() == R.id.action_move_exercise_down) {
for (int position : itemsChecked.list()) {
moveExerciseDown(position);
}
}
if (item.getItemId() == R.id.action_delete_exercise) {
deleteExercises();
try {
exerciseListFragment.initListView(workout.getWorkoutId());
} catch (WorkoutException e) {
Log.d("Failed to init fragment", e.getMessage(), e);
}
mode.finish();
return false;
}
try {
exerciseListFragment.initListView(workout.getWorkoutId());
} catch (WorkoutException e) {
Log.d("Failed to init fragment", e.getMessage(), e);
}
itemsChecked.clear();
updateMenuItems();
return false;
}
private void deleteExercises() {
try {
editWorkoutApplicationService.deleteExercises(workout, itemsChecked.list());
} catch (ResourceException e) {
Log.d("Can't remove exercises", e.getMessage(), e);
}
}
private void moveExerciseUp(int position) {
try {
editWorkoutApplicationService.moveExerciseAtPositionUp(workout, position);
} catch (ResourceException e) {
Log.d("Can't move exercise up", e.getMessage(), e);
}
}
private void moveExerciseDown(int position) {
try {
editWorkoutApplicationService.moveExerciseAtPositionDown(workout, position);
} catch (ResourceException e) {
Log.d("Can't move exercise", e.getMessage(), e);
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
this.itemsChecked.clear();
}
private void updateMenuItems() {
int checkedItemCount = itemsChecked.list().size();
boolean isOneItemSelected = checkedItemCount == 1;
boolean isMoreItemsSelected = checkedItemCount >= 1;
moveExerciseUpMenuItem.setVisible(isOneItemSelected);
moveExerciseDownMenuItem.setVisible(isOneItemSelected);
deleteExerciseMenuItem.setVisible(isMoreItemsSelected);
}
}