Skip to content

Commit

Permalink
display executions and creation date in summary detail view
Browse files Browse the repository at this point in the history
  • Loading branch information
avalax committed Dec 31, 2017
1 parent 9c03ae0 commit a49e258
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ public void doWorkout_shouldFinishAfterLastExercise() throws Exception {
application.switchToNextExercise();
application.hasShownFinishExerciseHint();
application.finishWorkout();
application.showsFinishedWorkout("a workout");
application.showsFinishedWorkout("a workout", "Today", "Executed 1 time");
}

@Test
Expand All @@ -314,7 +314,7 @@ public void aFinishedWorkout_shouldSeeDetailOverSummary() throws Exception {
application.switchToSummary();
application.selectFinishedWorkout(0);

application.showsFinishedWorkout("a workout");
application.showsFinishedWorkout("a workout", "Today", "Executed 1 time");
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -379,8 +379,10 @@ public void finishWorkout() {
onView(withId(android.R.id.button1)).perform(click());
}

public void showsFinishedWorkout(String name) {
public void showsFinishedWorkout(String name, String created, String executed) {
onView(withId(R.id.finished_workout_name)).check(matches(withText(name)));
onView(withId(R.id.finished_workout_created)).check(matches(withText(created)));
onView(withId(R.id.finished_workout_executed)).check(matches(withText(executed)));
}

private static ViewAction setNumberPicker(final int value) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ WorkoutViewHelper provideWorkoutViewHelper() {

@Provides
@Singleton
FinishedWorkoutViewHelper provideFinishedWorkoutViewHelper() {
return new FinishedWorkoutViewHelper(context);
FinishedWorkoutViewHelper provideFinishedWorkoutViewHelper(WorkoutViewHelper workoutViewHelper) {
return new FinishedWorkoutViewHelper(context, workoutViewHelper, workoutRepository);
}

@Provides
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
public void onBindViewHolder(ViewHolder holder, int position) {
FinishedWorkout workout = finishedWorkouts.get(position);
holder.getTitleTextView().setText(workout.getName());
holder.getSubtitleTextView().setText(finishedWorkoutViewHelper.executionDate(workout));
holder.getSubtitleTextView().setText(finishedWorkoutViewHelper.creationDate(workout));
holder.getView().setOnClickListener(view -> {
FinishedWorkoutDetailFragment fragment
= FinishedWorkoutDetailFragment.newInstance(workout.getFinishedWorkoutId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,17 @@

public class FinishedWorkoutDetailFragment extends Fragment {
private static final String ARGS_WORKOUT_ID = "finished_workout_id";
private TextView nameTextView;

@Inject
FinishedWorkoutApplicationService finishedWorkoutApplicationService;

@Inject
FinishedWorkoutViewHelper finishedWorkoutViewHelper;

private TextView nameTextView;
private TextView createdTextView;
private TextView executedTextView;

public static FinishedWorkoutDetailFragment newInstance(FinishedWorkoutId finishedWorkoutId) {
FinishedWorkoutDetailFragment fragment = new FinishedWorkoutDetailFragment();
Bundle args = new Bundle();
Expand All @@ -39,6 +45,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
((FitbuddyApplication) getActivity().getApplication()).getComponent().inject(this);
View view = inflater.inflate(R.layout.fragment_finished_workout, container, false);
nameTextView = view.findViewById(R.id.finished_workout_name);
createdTextView = view.findViewById(R.id.finished_workout_created);
executedTextView = view.findViewById(R.id.finished_workout_executed);
return view;
}

Expand All @@ -50,6 +58,8 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
try {
FinishedWorkout finishedWorkout = finishedWorkoutApplicationService.load(finishedWorkoutId);
nameTextView.setText(finishedWorkout.getName());
createdTextView.setText(finishedWorkoutViewHelper.creationDate(finishedWorkout));
executedTextView.setText(finishedWorkoutViewHelper.executions(finishedWorkout));
} catch (FinishedWorkoutException e) {
Log.d("Can't load workout", e.getMessage(), e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,50 @@

import de.avalax.fitbuddy.R;
import de.avalax.fitbuddy.domain.model.finished_workout.FinishedWorkout;
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.WorkoutRepository;
import de.avalax.fitbuddy.presentation.welcome_screen.WorkoutViewHelper;

import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.text.format.DateUtils.getRelativeTimeSpanString;

public class FinishedWorkoutViewHelper {
private final String noExecutionDate;

public FinishedWorkoutViewHelper(Context context) {
noExecutionDate = context.getResources().getString(R.string.workout_never_executed);
private final String creationDatePlaceholder;
private final String executionsPlural;
private final WorkoutViewHelper workoutViewHelper;
private final WorkoutRepository workoutRepository;

public FinishedWorkoutViewHelper(Context context, WorkoutViewHelper workoutViewHelper, WorkoutRepository workoutRepository) {
creationDatePlaceholder = context.getResources().getString(R.string.placeholder_title);
executionsPlural = context.getResources().getString(R.string.workout_executions);
this.workoutViewHelper = workoutViewHelper;
this.workoutRepository = workoutRepository;
}

public String executionDate(FinishedWorkout workout) {
Long lastExecution = workout.getCreated();
if (null == lastExecution) {
return noExecutionDate;
public String creationDate(FinishedWorkout workout) {
Long created = workout.getCreated();
if (null == created) {
return creationDatePlaceholder;
}
return getRelativeTimeSpanString(lastExecution, getDate(), DAY_IN_MILLIS)
return getRelativeTimeSpanString(created, getDate(), DAY_IN_MILLIS)
.toString();
}

public String executions(FinishedWorkout finishedWorkout) {
WorkoutId workoutId = finishedWorkout.getWorkoutId();
if (workoutId == null) {
return String.format(executionsPlural, 0);
}
try {
Workout workout = workoutRepository.load(workoutId);
return workoutViewHelper.executions(workout);
} catch (WorkoutException e) {
return String.format(executionsPlural, 0);
}
}

protected long getDate() {
return new Date().getTime();
}
Expand Down
10 changes: 10 additions & 0 deletions src/main/res/layout/fragment_finished_workout.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,14 @@
android:id="@+id/finished_workout_name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/finished_workout_created"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/finished_workout_executed"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
package de.avalax.fitbuddy.domain.model.finished_workout;

import de.avalax.fitbuddy.domain.model.workout.WorkoutException;
import de.avalax.fitbuddy.domain.model.workout.WorkoutId;
import de.avalax.fitbuddy.domain.model.workout.WorkoutRepository;

import static de.avalax.fitbuddy.domain.model.workout.BasicWorkoutBuilder.aWorkout;
import static java.lang.String.valueOf;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;

public class BasicFinishedWorkoutBuilder {
private FinishedWorkoutId finishedWorkoutId;
private Long creation;
private WorkoutId workoutId;

public static BasicFinishedWorkoutBuilder aFinishedWorkout() {
return new BasicFinishedWorkoutBuilder();
Expand All @@ -18,7 +28,20 @@ public BasicFinishedWorkoutBuilder withCreationDate(long creation) {
return this;
}

public BasicFinishedWorkoutBuilder withInvalidWorkoutId(String workoutId, WorkoutRepository workoutRepository) throws WorkoutException {
this.workoutId = new WorkoutId(workoutId);
doThrow(new WorkoutException()).when(workoutRepository).load(this.workoutId);
return this;
}

public BasicFinishedWorkoutBuilder withFinishedCount(int executions, WorkoutRepository workoutRepository) throws WorkoutException {
workoutId = new WorkoutId(valueOf(executions));
doReturn(aWorkout().withFinishedCount(executions).build())
.when(workoutRepository).load(workoutId);
return this;
}

public FinishedWorkout build() {
return new BasicFinishedWorkout(finishedWorkoutId, null, null, creation, null);
return new BasicFinishedWorkout(finishedWorkoutId, workoutId, null, creation, null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,28 @@
import java.util.Locale;

import de.avalax.fitbuddy.BuildConfig;
import de.avalax.fitbuddy.domain.model.workout.WorkoutRepository;
import de.avalax.fitbuddy.presentation.welcome_screen.WorkoutViewHelper;

import static de.avalax.fitbuddy.domain.model.finished_workout.BasicFinishedWorkoutBuilder.aFinishedWorkout;
import static java.util.Locale.ENGLISH;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class FinishedWorkoutViewHelperTest {
private FinishedWorkoutViewHelper viewHelper;
private long today;
private WorkoutRepository workoutRepository;

@Before
public void setUp() throws Exception {
today = DateUtil.parse("2017-12-31").getTime();
Locale.setDefault(ENGLISH);
Context context = RuntimeEnvironment.application.getApplicationContext();
viewHelper = new FinishedWorkoutViewHelper(context) {
workoutRepository = mock(WorkoutRepository.class);
viewHelper = new FinishedWorkoutViewHelper(context, new WorkoutViewHelper(context), workoutRepository) {
@Override
protected long getDate() {
return today;
Expand All @@ -38,10 +43,18 @@ protected long getDate() {
}

@Test
public void shouldReturnExecutedDateFormatted() throws Exception {
assertThat(viewHelper.executionDate(aFinishedWorkout().build())).isEqualTo("Never");
assertThat(viewHelper.executionDate(aFinishedWorkout().withCreationDate(today).build())).isEqualTo("Today");
assertThat(viewHelper.executionDate(aFinishedWorkout().withCreationDate(DateUtil.parse("2017-12-30").getTime()).build())).isEqualTo("Yesterday");
assertThat(viewHelper.executionDate(aFinishedWorkout().withCreationDate(DateUtil.parse("2017-12-20").getTime()).build())).isEqualTo("Dec 20, 2017");
public void shouldReturnCreationDateFormatted() throws Exception {
assertThat(viewHelper.creationDate(aFinishedWorkout().build())).isEqualTo("Unknown");
assertThat(viewHelper.creationDate(aFinishedWorkout().withCreationDate(today).build())).isEqualTo("Today");
assertThat(viewHelper.creationDate(aFinishedWorkout().withCreationDate(DateUtil.parse("2017-12-30").getTime()).build())).isEqualTo("Yesterday");
assertThat(viewHelper.creationDate(aFinishedWorkout().withCreationDate(DateUtil.parse("2017-12-20").getTime()).build())).isEqualTo("Dec 20, 2017");
}

@Test
public void shouldReturnExecutionCountFormatted() throws Exception {
assertThat(viewHelper.executions(aFinishedWorkout().build())).isEqualTo("Executed 0 times");
assertThat(viewHelper.executions(aFinishedWorkout().withInvalidWorkoutId("42", workoutRepository).build())).isEqualTo("Executed 0 times");
assertThat(viewHelper.executions(aFinishedWorkout().withFinishedCount(1, workoutRepository).build())).isEqualTo("Executed 1 time");
assertThat(viewHelper.executions(aFinishedWorkout().withFinishedCount(2, workoutRepository).build())).isEqualTo("Executed 2 times");
}
}

0 comments on commit a49e258

Please sign in to comment.