Skip to content

Commit

Permalink
#47 added FinisheWorkoutRepository and added new a option to save cur…
Browse files Browse the repository at this point in the history
…rent workout
  • Loading branch information
avalax committed Oct 12, 2014
1 parent 0f7dbe6 commit 2302477
Show file tree
Hide file tree
Showing 11 changed files with 165 additions and 37 deletions.
4 changes: 4 additions & 0 deletions res/menu/workout_actions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,8 @@
android:id="@+id/action_switch_workout"
android:title="@string/action_switch_workout"
android:showAsAction="never" />
<item
android:id="@+id/action_finish_workout"
android:title="@string/action_finish_workout"
android:showAsAction="never" />
</menu>
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

public class EditWorkoutApplicationService {

private FinishedWorkoutRepository finishedWorkoutRepository;

private WorkoutRepository workoutRepository;

private ExerciseRepository exerciseRepository;
Expand All @@ -37,8 +39,9 @@ public class EditWorkoutApplicationService {

private Map<Integer, Exercise> deletedExercises;

public EditWorkoutApplicationService(WorkoutSession workoutSession, WorkoutRepository workoutRepository, ExerciseRepository exerciseRepository, SetRepository setRepository, WorkoutService workoutService) {
public EditWorkoutApplicationService(WorkoutSession workoutSession, FinishedWorkoutRepository finishedWorkoutRepository, WorkoutRepository workoutRepository, ExerciseRepository exerciseRepository, SetRepository setRepository, WorkoutService workoutService) {
this.workoutSession = workoutSession;
this.finishedWorkoutRepository = finishedWorkoutRepository;
this.workoutRepository = workoutRepository;
this.exerciseRepository = exerciseRepository;
this.setRepository = setRepository;
Expand All @@ -63,6 +66,11 @@ public void setWorkout(WorkoutId id) throws WorkoutNotFoundException {
}

public void switchWorkout() throws IOException {
try {
Workout workoutToSave = workoutSession.getWorkout();
finishedWorkoutRepository.save(workoutToSave);
} catch (RessourceNotFoundException ignored) {
}
workoutSession.switchWorkout(workout);
setUnsavedChanges(false);
}
Expand All @@ -80,11 +88,9 @@ public Workout createWorkout() {

public void createWorkoutFromJson(String json) throws WorkoutParseException {
Workout workoutFromJson = workoutService.workoutFromJson(json);
if (workoutFromJson != null) {
workout = workoutFromJson;
workoutRepository.save(workoutFromJson);
setUnsavedChanges(false);
}
workout = workoutFromJson;
workoutRepository.save(workoutFromJson);
setUnsavedChanges(false);
}

public void deleteWorkout() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,19 @@
import de.avalax.fitbuddy.domain.model.exercise.Exercise;
import de.avalax.fitbuddy.domain.model.exercise.ExerciseNotFoundException;
import de.avalax.fitbuddy.domain.model.set.Set;
import de.avalax.fitbuddy.domain.model.workout.Workout;
import de.avalax.fitbuddy.domain.model.workout.WorkoutId;
import de.avalax.fitbuddy.domain.model.workout.WorkoutNotFoundException;
import de.avalax.fitbuddy.domain.model.workout.*;

import java.io.IOException;

public class WorkoutApplicationService {
private WorkoutSession workoutSession;
private WorkoutRepository workoutRepository;
private FinishedWorkoutRepository finishedWorkoutRepository;

public WorkoutApplicationService(WorkoutSession workoutSession) {
public WorkoutApplicationService(WorkoutSession workoutSession, WorkoutRepository workoutRepository, FinishedWorkoutRepository finishedWorkoutRepository) {
this.workoutSession = workoutSession;
this.workoutRepository = workoutRepository;
this.finishedWorkoutRepository = finishedWorkoutRepository;
}

public int countOfExercises() throws RessourceNotFoundException {
Expand Down Expand Up @@ -56,7 +58,7 @@ public void updateWeightOfCurrentSet(int index, double weight) throws RessourceN
workoutSession.saveCurrentWorkout();
}

public double weightOfCurrentSet(int index) throws RessourceNotFoundException{
public double weightOfCurrentSet(int index) throws RessourceNotFoundException {
Exercise exercise = requestExercise(index);
int indexOfCurrentSet = exercise.indexOfCurrentSet();
Set set = exercise.setAtPosition(indexOfCurrentSet);
Expand All @@ -71,6 +73,13 @@ public WorkoutId currentWorkoutId() throws RessourceNotFoundException {
return workoutSession.getWorkout().getWorkoutId();
}

public void finishCurrentWorkout() throws RessourceNotFoundException, IOException {
Workout workout = workoutSession.getWorkout();
finishedWorkoutRepository.save(workout);
Workout newWorkout = workoutRepository.load(workout.getWorkoutId());
workoutSession.switchWorkout(newWorkout);
}

public int workoutProgress(int exerciseIndex) throws RessourceNotFoundException {
return progressInPercent(getWorkout().getProgress(exerciseIndex));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ public class WorkoutSession {
private Workout workout;
private Context context;


public WorkoutSession(Context context) {
this.context = context;
this.workout = readCurrentWorkoutFromFile();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package de.avalax.fitbuddy.domain.model.workout;

public interface FinishedWorkoutRepository {
void save(Workout workout);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package de.avalax.fitbuddy.port.adapter.persistence;

import android.database.sqlite.SQLiteOpenHelper;
import de.avalax.fitbuddy.domain.model.set.SetRepository;
import de.avalax.fitbuddy.domain.model.workout.FinishedWorkoutRepository;
import de.avalax.fitbuddy.domain.model.workout.Workout;

public class SQLiteFinishedWorkoutRepository implements FinishedWorkoutRepository {
public SQLiteFinishedWorkoutRepository(SQLiteOpenHelper sqLiteOpenHelper) {
//TODO: init
}

@Override
public void save(Workout workout) {
//TODO: persist workout with exercises and sets
}
}
20 changes: 12 additions & 8 deletions src/main/java/de/avalax/fitbuddy/presentation/FitbuddyModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,10 @@
import de.avalax.fitbuddy.application.workout.WorkoutSession;
import de.avalax.fitbuddy.domain.model.exercise.ExerciseRepository;
import de.avalax.fitbuddy.domain.model.set.SetRepository;
import de.avalax.fitbuddy.domain.model.workout.FinishedWorkoutRepository;
import de.avalax.fitbuddy.domain.model.workout.WorkoutRepository;
import de.avalax.fitbuddy.domain.model.workout.WorkoutService;
import de.avalax.fitbuddy.port.adapter.persistence.FitbuddySQLiteOpenHelper;
import de.avalax.fitbuddy.port.adapter.persistence.SQLiteExerciseRepository;
import de.avalax.fitbuddy.port.adapter.persistence.SQLiteSetRepository;
import de.avalax.fitbuddy.port.adapter.persistence.SQLiteWorkoutRepository;
import de.avalax.fitbuddy.port.adapter.persistence.*;
import de.avalax.fitbuddy.port.adapter.service.JsonInWorkoutAdapter;
import de.avalax.fitbuddy.port.adapter.service.TranslatingWorkoutService;
import de.avalax.fitbuddy.port.adapter.service.WorkoutInJsonAdapter;
Expand Down Expand Up @@ -79,8 +77,14 @@ SetRepository provideSetRepository(SQLiteOpenHelper sqLiteOpenHelper) {

@Provides
@Singleton
WorkoutApplicationService provideWorkoutApplicationService(WorkoutSession workoutSession) {
return new WorkoutApplicationService(workoutSession);
FinishedWorkoutRepository provideFinishWorkoutRepository(SQLiteOpenHelper sqLiteOpenHelper) {
return new SQLiteFinishedWorkoutRepository(sqLiteOpenHelper);
}

@Provides
@Singleton
WorkoutApplicationService provideWorkoutApplicationService(WorkoutSession workoutSession, WorkoutRepository workoutRepository, FinishedWorkoutRepository finishedWorkoutRepository) {
return new WorkoutApplicationService(workoutSession, workoutRepository, finishedWorkoutRepository);
}

@Provides
Expand All @@ -100,7 +104,7 @@ WorkoutService provideWorkoutService() {

@Provides
@Singleton
EditWorkoutApplicationService provideManageWorkout(WorkoutSession workoutSession, WorkoutRepository workoutRepository, ExerciseRepository exerciseRepository, SetRepository setRepository, WorkoutService workoutService) {
return new EditWorkoutApplicationService(workoutSession, workoutRepository, exerciseRepository, setRepository, workoutService);
EditWorkoutApplicationService provideManageWorkout(WorkoutSession workoutSession, FinishedWorkoutRepository finishedWorkoutRepository, WorkoutRepository workoutRepository, ExerciseRepository exerciseRepository, SetRepository setRepository, WorkoutService workoutService) {
return new EditWorkoutApplicationService(workoutSession, finishedWorkoutRepository, workoutRepository, exerciseRepository, setRepository, workoutService);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,26 +48,30 @@ public void onCreate(Bundle savedInstanceState) {
init();
}

private void init() {
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setBackgroundDrawable(null);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.workout_actions, menu);
this.menuItem = menu.findItem(R.id.action_change_weight);
try {
viewPager.setAdapter(new ExercisePagerAdapter(getSupportFragmentManager(), workoutApplicationService.countOfExercises()));
viewPager.setCurrentItem(workoutApplicationService.indexOfCurrentExercise());
updatePage(workoutApplicationService.indexOfCurrentExercise());
initWorkoutActivity();
} catch (RessourceNotFoundException e) {
Log.d("Can't update viewPager", e.getMessage(), e);
Log.d("workout not found", e.getMessage(), e);
startManageWorkoutActivity();
}
return super.onCreateOptionsMenu(menu);
}

private void init() {
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setBackgroundDrawable(null);
private void initWorkoutActivity() throws RessourceNotFoundException {
viewPager.setAdapter(new ExercisePagerAdapter(getSupportFragmentManager(), workoutApplicationService.countOfExercises()));
viewPager.setCurrentItem(workoutApplicationService.indexOfCurrentExercise());
updatePage(workoutApplicationService.indexOfCurrentExercise());
}

@OnPageChange(R.id.pager)
Expand All @@ -93,6 +97,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_change_weight) {
showEditDialog();
}
if (item.getItemId() == R.id.action_finish_workout) {
finishActiveWorkout();
}
return super.onOptionsItemSelected(item);
}

Expand All @@ -101,8 +108,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == MANAGE_WORKOUT && resultCode == Activity.RESULT_OK) {
try {
viewPager.setAdapter(new ExercisePagerAdapter(getSupportFragmentManager(), workoutApplicationService.countOfExercises()));
updatePage(0);
initWorkoutActivity();
} catch (RessourceNotFoundException e) {
Log.d("workout not found", e.getMessage(), e);
}
Expand Down Expand Up @@ -144,4 +150,13 @@ private void startManageWorkoutActivity() {
Intent intent = new Intent(this, EditWorkoutActivity.class);
startActivityForResult(intent, MANAGE_WORKOUT);
}

private void finishActiveWorkout() {
try {
workoutApplicationService.finishCurrentWorkout();
initWorkoutActivity();
} catch (RessourceNotFoundException | IOException e) {
Log.d("Can not finish workout", e.getMessage(), e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ public class EditWorkoutApplicationServiceTest {
@Mock
private WorkoutSession workoutSession;

@Mock
private FinishedWorkoutRepository finishedWorkoutRepository;

@InjectMocks
private EditWorkoutApplicationService editWorkoutApplicationService;

Expand Down Expand Up @@ -175,12 +178,24 @@ public void saveExercise_shouldSaveExerciseInRepository() throws Exception {

@Test
public void switchWorkout_shouldSetWorkout() throws Exception {
when(workoutSession.getWorkout()).thenThrow(new WorkoutNotFoundException());
editWorkoutApplicationService.switchWorkout();

verify(workoutSession).switchWorkout(workout);
assertThat(editWorkoutApplicationService.unsavedChangesVisibility(), equalTo(View.GONE));
}

@Test
public void switchWorkout_shouldPersistCurrentWorkout() throws Exception {
BasicWorkout currentWorkoutToPersist = new BasicWorkout();
currentWorkoutToPersist.setName("currentWorkoutToPersist");
when(workoutSession.getWorkout()).thenReturn(currentWorkoutToPersist);

editWorkoutApplicationService.switchWorkout();

verify(finishedWorkoutRepository).save(currentWorkoutToPersist);
}

public class moveExercises {
@Test
public void moveFirstExerciseAtPositionUp_shouldDoNothing() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,15 @@
import de.avalax.fitbuddy.domain.model.RessourceNotFoundException;
import de.avalax.fitbuddy.domain.model.exercise.Exercise;
import de.avalax.fitbuddy.domain.model.set.Set;
import de.avalax.fitbuddy.domain.model.workout.BasicWorkout;
import de.avalax.fitbuddy.domain.model.workout.Workout;
import de.avalax.fitbuddy.domain.model.workout.WorkoutId;
import de.avalax.fitbuddy.domain.model.workout.WorkoutNotFoundException;
import de.avalax.fitbuddy.domain.model.workout.*;
import de.bechte.junit.runners.context.HierarchicalContextRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.*;

@RunWith(HierarchicalContextRunner.class)
public class WorkoutApplicationServiceTest {
Expand All @@ -24,10 +20,16 @@ public class WorkoutApplicationServiceTest {

private WorkoutApplicationService workoutApplicationService;

private FinishedWorkoutRepository finishedWorkoutRepository;

private WorkoutRepository workoutRepository;

@Before
public void setUp() throws Exception {
workoutSession = mock(WorkoutSession.class);
workoutApplicationService = new WorkoutApplicationService(workoutSession);
finishedWorkoutRepository = mock(FinishedWorkoutRepository.class);
workoutRepository = mock(WorkoutRepository.class);
workoutApplicationService = new WorkoutApplicationService(workoutSession, workoutRepository, finishedWorkoutRepository);
}

public class noWorkoutGiven {
Expand Down Expand Up @@ -85,6 +87,11 @@ public void addRepsToSet_shouldThrowRessourceNotFoundExeption() throws Exception
public void updateWeightOfCurrentSet_shouldThrowRessourceNotFoundExeption() throws Exception {
workoutApplicationService.updateWeightOfCurrentSet(0, 0);
}

@Test(expected = RessourceNotFoundException.class)
public void finishWorkout_shouldThrowRessourceNotFoundExeption() throws Exception {
workoutApplicationService.finishCurrentWorkout();
}
}

public class aWorkoutGiven {
Expand Down Expand Up @@ -141,6 +148,25 @@ public void updateWeightOfCurrentSetWithoutExercise_shouldThrowRessourceNotFound
workoutApplicationService.updateWeightOfCurrentSet(0, 0);
}

@Test
public void finishWorkout_shouldPersistCurrentWorkout() throws Exception {
workoutApplicationService.finishCurrentWorkout();

verify(finishedWorkoutRepository).save(workout);
}

@Test
public void finishWorkout_shouldResetCurrentWorkout() throws Exception {
WorkoutId workoutId = workout.getWorkoutId();
BasicWorkout newWorkoutFromRepository = new BasicWorkout();
newWorkoutFromRepository.setName("newWorkoutFromRepository");
when(workoutRepository.load(workoutId)).thenReturn(newWorkoutFromRepository);

workoutApplicationService.finishCurrentWorkout();

verify(workoutSession).switchWorkout(newWorkoutFromRepository);
}

public class anExerciseGiven {
private Exercise exercise;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package de.avalax.fitbuddy.port.adapter.persistence;

import android.content.Context;
import de.avalax.fitbuddy.presentation.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

@Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class SQLiteFinishedWorkoutRepositoryTest {
private SQLiteFinishedWorkoutRepository sqLiteFinishedWorkoutRepository;

@Before
public void setUp() throws Exception {
Context context = Robolectric.application.getApplicationContext();
FitbuddySQLiteOpenHelper sqLiteOpenHelper = new FitbuddySQLiteOpenHelper("SQLiteSetRepositoryTest", 1, context, R.raw.fitbuddy_db);
sqLiteFinishedWorkoutRepository = new SQLiteFinishedWorkoutRepository(sqLiteOpenHelper);
}

@Test
public void nothing() throws Exception {
sqLiteFinishedWorkoutRepository.save(null);
}
}

0 comments on commit 2302477

Please sign in to comment.