Last week, a fairly major update to Google Fit came with a fresh coat of paint for the interface and a few important feature enhancements. It now supports multiple goals with more options, weight tracking, new metrics, and quite a bit more. It wasn't a complete overhaul, but it certainly looks and feels like a whole new app. But that's not the whole story, there's actually quite a bit more in this update that hasn't emerged yet. A teardown reveals some other features that will either activate soon or turn up with the rollout of future updates. But before we get to that, there were actually a couple more things that popped up since the first post.

What's New

A few days after the new version appeared, Google posted the official changelog with most of the same details covered in our previous post. However, there are a couple of things to point out. First, Google emphasized that multiple goals are supported rather than just one and weight tracking now shows trends over time. Both are certainly great steps forward. The interesting note is the final feature on the list which mentions you can compare your results against other Fit users in your area. This doesn't appear to be live for me, but maybe it will be for others, especially users in certain major cities. Since many people probably don't have it, I'll still cover this in the teardown.

Official Changelog:

  • More goal options and support for multiple goals. Set daily, weekly and monthly goals and goals for specific activities like "run three times a week".
  • A new look that shows all of your daily stats at once.
  • See how your weight is trending after logging a new measurement.
  • See how your activity compares against other Fit users in your area.
  • Bug fixes

The original Fit update was v1.57.49, but that was quickly followed by minor updates to .50 and .51. These individual versions don't appear to bring anything new, but at least a couple of features have been enabled either from server-side or as more data is collected and analyzed. I'll cover these quickly before getting to the teardown. There's also a download link pointing to the latest minor revision down at the bottom.

Personal Records

2016-07-01 22.52.21

It didn't seem to show up right away, but personal records for certain types of exercise can now show up as a card in your home view. The recorded metrics focus on running and riding a bike, and show both the farthest distance you've gone in a single session and the longest amount of time spent. A little message at the bottom of the card points out that it will also let you know each time you set a new personal record. The messages will read like "Farthest run yet!"

Weight Trends

2016-07-01 22.52.27

(yep, teardowns lead to weight gain.)

Also pointed out in the changelog is a card that covers the trend line of your weight. The previous version included a graph, but it was inexplicably hidden in the Settings screen and only showed the direct lines, not a steady trend line over time.

Teardown

Disclaimer: Teardowns are based on evidence found inside of apks (Android's application package) and are necessarily speculative and usually based on incomplete information. It's possible that the guesses made here are totally and completely wrong. Even when predictions are correct, there is always a chance that plans could change or may be canceled entirely. Much like rumors, nothing is certain until it's officially announced and released.

The features discussed below are probably not live yet, or may only be live for a small percentage of users. Unless stated otherwise, don't expect to see these features if you install the apk.

Challenges

illo_introduction_teams

Getting motivated to work out can be one of the hardest things to do. Some people need metrics to track and push further, others need to create routines that aren't easily broken. But for many of us, the most powerful driver is competition with other people. It's such a common thing that there are dozens (hundreds?) of apps and a handful of social networks dedicated to helping people set up challenges between themselves and their friends. Google Fit is going to join the fray, too.

The evidence for this one is absolutely spilling over the sides. There are 5 activities (think of these as screens in the app), 40 layouts, and 95 strings dedicated to challenges and some of the related features. There are plenty of details, so I'll try to keep everything pretty short.

To begin with, the navigation drawer will get a new link called "Challenges" that will lead to a whole new interface.

<string name="nav_groups">Challenges</string>

The next set are the main welcome text. The first couple will either appear in a card on the main screen or in an onboarding screen that appears on the first run after the feature is enabled. The second pair will probably show up at the top of the Challenges screen. It's plenty obvious the focus is on competition with friends.

<string name="introducing_teams_title">Challenge a friend!</string>
<string name="introducing_teams_subtitle">Having an exercise buddy is a great way to stay motivated. Invite a friend to take on a fitness challenge with you.</string>
<string name="create_team_title">Challenge your friends!</string>
<string name="create_team_intro">Start a step, running, or biking challenge with some friends.</string>

Most of the screens and interface elements are dedicated to creating challenges and sending out invites to the participants. The person creating a challenge is responsible for giving it a name and choosing participants. Invites can be sent out to people in your contact list or with manually entered phone numbers and email addresses. It should go without saying that this particular feature explains the addition of the READ_CONTACTS permission. Naturally, invitees aren't automatically added to a challenge, they have the option to accept or decline.

Challenge creation, management, and invites

<uses-permission android:name="android.permission.READ_CONTACTS"/>

<string name="add_group_title">Start a new challenge</string>
<string name="add_group">Add challenge</string>
<string name="email_already_exists">Already invited this person</string>
<string name="email_is_current_user">"That's you! Invite someone else"</string>
<string name="invite_teammates">Invite friends</string>
<string name="delete_invitee_a11y">Delete invited person</string>
<string name="edit_group">Edit challenge</string>

<string name="name_your_challenge">Name your challenge</string>
<string name="team_created">Challenge invites sent</string>

<string name="teammates_title">Friends</string>
<string name="start_challenge">Start challenge</string>
<string name="status_invited">Invited</string>

<string name="remove">Remove</string>
<string name="remove_teammate">Remove teammate?</string>
<string name="remove_teammate_message">{GENDER, select, male {{PERSON} will be removed from your team} female {{PERSON} will be removed from your team} other {{PERSON} will be removed from your team}}</string>

<string name="chips_permission_text">Allow contacts suggestions</string>
<string name="add_invitee_hint_text">Contact or email</string>
<string name="bad_email">Invalid email address</string>
<string name="copy_email">Copy email address</string>
<string name="copy_number">Copy phone number</string>
<string name="dropdown_delete_button_desc">Remove <g id="contact">%s</g> from recipients</string>

<string name="discard_team_warning">If you go back now, your draft team will be discarded</string>
<string name="missing_group_name">Please enter a team name</string>

<string name="challenge_invite_title">{count, plural, =1 {New challenge invite} other {# challenge invites}}</string>
<string name="accepted_invitation">Accepted challenge</string>
<string name="accept_invite">Join</string>
<string name="deny_invite">No thanks</string>
<string name="invite_accepted_for_different_email">"You're accepting "<g example="John's challenge" id="name">%1$s</g> with this account</string>
<string name="leave_group">Leave challenge</string>
<string name="leave_group_dialog_confirm">Leave</string>
<string name="leave_group_dialog_message">"You won't be part of this challenge anymore."</string>
<string name="leave_group_dialog_title">Leave challenge?</string>
<string name="rejected_invitation">Declined challenge</string>

<activity android:exported="false" android:label="@string/nav_groups" android:name="com.google.android.apps.fitness.groups.creation.GroupCreationActivity" android:parentActivityName="com.google.android.apps.fitness.fitnessactivity.FitnessActivity" android:theme="@style/GroupEditTheme" android:windowSoftInputMode="adjustResize">
<activity android:exported="false" android:label="@string/edit_group" android:name="com.google.android.apps.fitness.groups.edit.GroupEditActivity" android:parentActivityName="com.google.android.apps.fitness.fitnessactivity.FitnessActivity" android:theme="@style/GroupEditTheme" android:windowSoftInputMode="adjustResize">
<activity android:exported="false" android:name="com.google.android.apps.fitness.groups.GroupDetailsActivity" android:parentActivityName="com.google.android.apps.fitness.fitnessactivity.FitnessActivity" android:theme="@style/GroupOneUpTheme" android:windowSoftInputMode="adjustResize">
<activity android:exported="false" android:name="com.google.android.apps.fitness.groups.GroupRecapActivity" android:parentActivityName="com.google.android.apps.fitness.fitnessactivity.FitnessActivity" android:theme="@style/GroupOneUpTheme" android:windowSoftInputMode="adjustResize">
<activity android:exported="false" android:name="com.google.android.apps.fitness.groups.invite.InviteeEditActivity" android:parentActivityName="com.google.android.apps.fitness.fitnessactivity.FitnessActivity" android:theme="@style/GroupEditTheme" android:windowSoftInputMode="adjustResize">
<receiver android:exported="false" android:name="com.google.android.apps.fitness.groups.invite.InviteDeclinedReceiver"/>
<receiver android:exported="false" android:name="com.google.android.apps.fitness.groups.invite.InviteDismissedReceiver"/>

New layouts:

team_creation_demo.xml
team_invite_member.xml
self_member_item.xml
start_team.xml
pending_member_item.xml
place_autocomplete_item_prediction.xml
place_autocomplete_item_powered_by_google.xml
invite_card.xml
invite_row_buttons.xml
invite_row.xml
invitee_dropdown_item.xml
invitee_edit_activity.xml
invitee_edit_fragment.xml
invitee_list_footer.xml
invitee_list_item.xml
group_challenge_title.xml
group_common_activity_fragment_non_sentence.xml
group_common_activity_fragment.xml
group_creation_activity.xml
group_details_fragment.xml
group_edit_activity.xml
group_edit_fragment.xml
group_face_pile.xml
group_header.xml
group_intermediate_state.xml
group_member_item.xml
group_name_edit_fragment.xml
chips_autocomplete_recipient_dropdown_item.xml
chips_recipient_dropdown_item.xml

There's an interesting trend where the word "team" appears in quite a few strings, but I see no sign that any of these challenges actually support a group-on-group competition. It's possible the Fit developers intend to add this sort of thing in the future, but I think it's more likely that they prefer to think of the participants as a team collaborating to motivate each other rather than a bunch of individuals trying to beat each other.

Aside from sending out invites, there are only two other choices that have to be made during setup: the type of activity and a duration. The activities are currently limited to who can run, walk, or bike the farthest, or take the most steps. Basically, the things Fit is reasonably good at measuring automatically. The duration can be set to record at the end of a day, week, or month. It's not really clear if challenges can be set to run continuously or if they are always a one-off, but some strings in the next batch suggest that challenges can be started again after they have finished.

Challenge type and duration

<string name="set_challenge">Choose your team challenge</string>
<string name="bike_challenge_description">Bike the farthest</string>
<string name="bike_challenge_question">Who can bike the farthest</string>
<string name="run_challenge_description">Run the farthest</string>
<string name="run_challenge_question">Who can run the farthest</string>
<string name="step_challenge_description">Walk the farthest</string>
<string name="step_challenge_question">Who can take the most steps</string>
<string name="suggested_bike_challenge"><g example="John" id="name">%1$s</g>"'s biking challenge"</string>
<string name="suggested_run_challenge"><g example="John" id="name">%1$s</g>"'s running challenge"</string>
<string name="suggested_step_challenge"><g example="John" id="name">%1$s</g>"'s step challenge"</string>

<string name="team_invite_title">"You've been invited to"</string>
<string name="team_title_bike_day">Daily biking challenge</string>
<string name="team_title_bike_month">Monthly biking challenge</string>
<string name="team_title_bike_week">Weekly biking challenge</string>
<string name="team_title_run_day">Daily running challenge</string>
<string name="team_title_run_month">Monthly running challenge</string>
<string name="team_title_run_week">Weekly running challenge</string>
<string name="team_title_steps_day">Daily step challenge</string>
<string name="team_title_steps_month">Monthly step challenge</string>
<string name="team_title_steps_week">Weekly step challenge</string>

Of course, in any competition, there must be a winner. The next batch of text is mostly dedicated to people coming in at first and second place, or acknowledging a tie if it occurs. The person coming in second is given polite prodding with the phrase "almost had it" followed by a tip about how close they had actually come to taking the lead. And once the results come in, everybody but the winner is prompted to launch a rematch. Oh, and it seems like the plural is used to describe challenges, so we can probably assume it's possible to be involved in more than one at a time. It might be a little weird if that wasn't allowed.

Winners and not winners

<string name="multiple_challenge_results_title">Results are in!</string>
<string name="multiple_challenge_summary">Tap to see the results of your challenges.</string>
<string name="challenge_summary">Tap to see the results of <g example="Shannon's challenge" id="name">%1$s</g>.</string>
<string name="pending_results_subtitle"><g example="Jack's step challenge" id="challenge_name">%1$s</g> is not over yet for some of your teammates. Check back later.</string>

<string name="pending_results_title">Who will win?</string>

<string name="single_challenge_win">You won <g example="Shannon's challenge" id="name">%1$s</g>. Tap to see the results.</string>
<string name="single_challenge_win_title">Victory!</string>
<string name="winner">Winner!</string>
<string name="winner_subtitle">You won <g example="Jack's step challenge" id="challenge_name">%1$s</g></string>

<string name="tie_title">"It's a tie!"</string>
<string name="tie_subtitle_winner">You tied with {PERSON}{count, plural, =0 {} =1 { and # other person} other { and # other people}}</string>

<string name="second_winner">Almost had it!</string>
<string name="second_winner_subtitle">Just <g example="5 miles" id="progress">%1$s</g> away from winning <g example="Ye's Big Adventure" id="challenge_name">%2$s</g></string>
<string name="not_a_winner_subtitle">Take on <g example="Jack's step challenge" id="challenge_name">%1$s</g> again <g example="next week" id="challenge_next_recurrence">%2$s</g></string>

<string name="tie_subtitle_non_winner">{FIRST_PERSON} tied with {SECOND_PERSON}{count, plural, =0 {} =1 { and # other person} other { and # other people}}</string>
<string name="not_a_winner">{GENDER, select, male {{PERSON} won this round} female {{PERSON} won this round} other {{PERSON} won this round}}</string>

New layouts:

row_of_tied_members.xml
group_recap_fragment.xml
group_recap.xml
group_summary_body.xml
group_summary_card.xml
group_summary.xml
groups_fragment.xml
challenge_complete_card.xml

People may get some motivation from simply watching the progress of their competitors, but that's pretty dull by itself. The best way to really get people moving is to keep people involved. This is a social thing, after all, and that means we need to have comments. You might want to post plans for a group run, comments with positive messages of encouragement, or go for broke and trash-talk like there's no tomorrow. There's really nothing special to take away from the strings related to comments other than they will obviously be a feature of challenges.

Comments

<string name="add_comment_hint">Add a comment</string>
<string name="send_comment_accessibility">Send comment</string>
<string name="loading_comments">Loading comments…</string>
<string name="show_previous_comments">Show previous comments</string>
<string name="discard_comment_title">Discard comment?</string>
<string name="n_new_comments">{count, plural, =1 {1 comment} other {# comments}}</string>
<string name="n_new_comments_and_updates">{commentcount, plural, =1 {1 comment} other {# comments}}, {updatecount, plural, =1 {1 update} other {# updates}}</string>
<string name="n_new_updates">{count, plural, =1 {1 update} other {# updates}}</string>

new layouts:
comment_editor.xml
comment_header.xml
comment_item.xml

Finally, a few of the previous strings have belonged to notifications, and some users may want to be involved with challenges without necessarily getting notifications about every new comment or as new invites come rolling in. Don't worry, there will be a toggle in Settings to mute these notifications so they won't become a problem.

<string name="settings_group_challenge_notifications_description">Invites and updates about the results of your challenges</string>
<string name="settings_groups_challenge_notifications">Challenge notifications</string>

I haven't noticed any clear reason challenges can't go live at any time, but some of the text is possibly incomplete, so I suspect it may not launch until the next update... But that's absolutely a guess.

Local Ranking

For some people, knowing how healthy and active they are in relation to others can play a big part in getting them out of their chairs and working out. According to the official changelog, Google Fit will show how we compare with other people in our area. The data will appear as a card in the main page.

<string name="population_of_city">{count, plural, =1 {1 Fit user in your city} other {# Fit users in your city}}</string>
<string name="city_card_title">You were more active than <g example="56" id="percentile">%1$s</g>%% of <g example="Mountain View" id="city">%2$s</g>" "</string>

New layout
city_rank.xml

There are about a dozen images dedicated to cities around the world, plus one generic image. There's no obvious reason these images are here, but they are probably just featured due to particularly active populations or some similar guideline.

ic_city_bangaloreic_city_berlinic_city_chicago

Bangalore, Berlin, Chicago

ic_city_laic_city_milanic_city_moscow

Los Angeles, Milan, Moscow

ic_city_nycic_city_parisic_city_sanfrancisco

New York City, Paris, San Francisco

ic_city_saopauloic_city_torontoic_city_generic

Sao Paulo, Toronto, "generic"

So far, this isn't active for me, but given that there are a lot of images for specific major cities, it's possible this card will only show up in certain areas or after data for enough people is collected.

Nutrition Data

One of the common complaints about Fit has been that a lot of the information stored by third-party apps has no way to show up in the actual app. It looks like Google is finally planning to address this issue with another new card dedicated to nutritional information. It's currently limited to just a few fields that display your daily intake of fat, carbs, protein, and either calories or kilojoules.

strings

<string name="nutrition_card_header">Nutrition</string>
<string name="nutrition_card_carbs">Carbs (<g example="1" id="grams">%1$s</g>g)</string>
<string name="nutrition_card_fat">Fat (<g example="2" id="grams">%1$s</g>g)</string>
<string name="nutrition_card_protein">Protein (<g example="3" id="grams">%1$s</g>g)</string>
<string name="nutrition_card_calories">{count, plural, =1 {1 calorie} other {# calories}} consumed today.</string>
<string name="nutrition_card_kilojoules">{count, plural, =1 {1 kilojoule} other {# kilojoules}} consumed today.</string>

new layouts:

nutrition_card_text_content.xml
nutrition_card.xml

Update: It looks like this card is live after all. It may just require enough nutritional information to be stored, or might not be enabled for everybody yet. Thanks, Markus Birth.

Correct Detected Activities

If you've had a problem with Google Fit making some bad automatic guesses about your activities, you're not alone. At least that's how it sounds from the comment section of our last post. No pattern-based algorithm is perfect, and sometimes that means you've got to put in a little effort correcting the mistakes. Google Fit is going to soon have options to quickly change incorrectly detected exercises. Four new menu options have been created to allow an activity to be turned into walking, running, or driving, or the activity can be marked as inactive.

<string name="menu_mark_as_drive">Mark as driving</string>
<string name="menu_mark_as_invalid">Mark as inactive</string>
<string name="menu_mark_as_run">Mark as run</string>
<string name="menu_mark_as_walk">Mark as walk</string>

<

Since these are identified as menu options, they will probably appear in the overflow menus on each exercise.

Target Weight

Finally, it looks like one more goal will eventually land in Google Fit, and it's the one that probably inspires more people to start exercising and eating better than anything else: weight. Yes, you'll be able to set a target weight to reach. There are no strings to act as evidence, only the presence of a layout named weight_target_fragment, but that's all it takes. The layout only has a single input for a target weight, so it seems that it will not include deadlines to meet a goal.

Given that Google Fit already allows for tracking weight, and now even shows trend lines, it's no surprise that a target weight would eventually appear as a feature. Unlike the other goals, which act as targets to hit on a regular basis, this is a long-term goal that generally goes away (or is maintained) once you get there.

Why it's not already in there isn't clear, but it's likely the interface isn't ready yet. An image used in the layout is actually missing from the resources and one of the labels is hardcoded with the text: "What's your target weight?" Hardcoded text is very uncommon outside of test interfaces because it can't be replaced with different localized strings when used on a device with different selected languages. This feature definitely won't be available until a future release.

Download

The APK is signed by Google and upgrades your existing app. The cryptographic signature guarantees that the file is safe to install and was not tampered with in any way. Rather than wait for Google to push this download to your devices, which can take days, download and install it just like any other APK.

Version: 1.57.51