Josh Miller
This week, our team moved out of pre-production and began developing our app. After setting up the initial project in our repository, the team decided on tasks for the week and began working. My tasks included adjusting the app's color scheme, adding bottom navigation, and beginning on the core weightlifting algorithm.
To set up the project, I created a new project from Android Studio's tab navigation template. I then added the project's libraries dependencies and committed my local project to the team's repository so we could begin development.
To set up the project, I created a new project from Android Studio's tab navigation template. I then added the project's libraries dependencies and committed my local project to the team's repository so we could begin development.
![]() |
Initial project |
My first task was to fix the app's color scheme. I did this by editing the 'colors', 'styles', and 'themes' xml resource files. This allowed the rest of the project's files to pull on the correct color information.
The second task was to add the main tab navigation. At the bottom of the screen, we needed an easy way for the user to switch between multiple screens. Since the template we chose to start with was based off of a fragment-based tab navigation activity already, I was able to update the generated activity and 'mobile_navigation' xml files to navigate to the desired fragments.
<fragment
android:id="@+id/navigation_logs"
android:name="com.example.repadvisor.ui.logs.Logs"
android:label="@string/title_logs"
tools:layout="@layout/fragment_logs" />
<fragment
android:id="@+id/navigation_routines"
android:name="com.example.repadvisor.ui.routines.Routines"
android:label="@string/title_routines"
tools:layout="@layout/fragment_routines" />
<fragment
android:id="@+id/navigation_goals"
android:name="com.example.repadvisor.ui.goals.Goals"
android:label="@string/title_goals"
tools:layout="@layout/fragment_goals" />
<fragment
android:id="@+id/navigation_exercises"
android:name="com.example.repadvisor.ui.exercises.Exercises"
android:label="@string/title_exercises"
tools:layout="@layout/fragment_routines" />
<fragment
android:id="@+id/navigation_stats"
android:name="com.example.repadvisor.ui.stats.Stats"
android:label="@string/title_stats"
tools:layout="@layout/fragment_stats" />
![]() |
App theme and tabs added |
The next section I worked on was the weightlifting recommendation algorithm. This comprises of several classes that work together and rely on each other to evaluate the user's current capabilities and generate a set of routines to follow to meet their desired goal. I followed the class layout and structure we defined in our app's technical design document to construct a functional algorithm.
public double CalcNext()
{
double nextOneRM = m_dLastOneRM * (1 + m_dIndivPerc);
double nextWeight = Utils.RoundToInc((m_dTargetLiftPerc * m_dLastOneRM), m_dWeightInc);
double nextReps = Utils.RepsCalc(m_nCalcMethod, nextWeight, nextOneRM);
m_dLastOneRM = nextOneRM;
m_dLastWeight = nextWeight;
m_dLastReps = nextReps;
m_cWorkoutProgram.AddRoutine(new CRoutine(m_dLastWeight, m_dLastReps, m_dWeightInc, m_nCalcMethod, m_cExercise, 60));
return nextOneRM;
}
![]() |
Some classes in the recommendation algorithm |
![]() |
Splash screen as designed by Quincy |
The navigation drawer took exceedingly long to develop for a few reasons. My fellow team member, Kyle, explained this process very well on his Blog. After hours of troubleshooting, we were able to combine the navigation drawer with our existing tab navigation and finally resolved the only remaining task for our first week of development.
![]() |
Fixed navigation drawer |