Skip to content

Commit c33e569

Browse files
committed
added google fit recording api demo
1 parent 27278b7 commit c33e569

File tree

17 files changed

+288
-0
lines changed

17 files changed

+288
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
apply plugin: 'com.android.application'
2+
3+
android {
4+
compileSdkVersion 'Google Inc.:Google APIs:23'
5+
buildToolsVersion "23.0.2"
6+
7+
defaultConfig {
8+
applicationId "com.tutsplus.googlefitrecordingapi"
9+
minSdkVersion 14
10+
targetSdkVersion 23
11+
versionCode 1
12+
versionName "1.0"
13+
}
14+
buildTypes {
15+
release {
16+
minifyEnabled false
17+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18+
}
19+
}
20+
}
21+
22+
dependencies {
23+
compile fileTree(dir: 'libs', include: ['*.jar'])
24+
testCompile 'junit:junit:4.12'
25+
compile 'com.android.support:appcompat-v7:23.+'
26+
27+
compile 'com.google.android.gms:play-services-fitness:8.4.0'
28+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.tutsplus.googlefitrecordingapi;
2+
3+
import android.app.Application;
4+
import android.test.ApplicationTestCase;
5+
6+
/**
7+
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
8+
*/
9+
public class ApplicationTest extends ApplicationTestCase<Application> {
10+
public ApplicationTest() {
11+
super(Application.class);
12+
}
13+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
package="com.tutsplus.googlefitrecordingapi">
4+
5+
<application
6+
android:allowBackup="true"
7+
android:icon="@mipmap/ic_launcher"
8+
android:label="@string/app_name"
9+
android:supportsRtl="true"
10+
android:theme="@style/AppTheme">
11+
<activity android:name=".MainActivity">
12+
<intent-filter>
13+
<action android:name="android.intent.action.MAIN" />
14+
15+
<category android:name="android.intent.category.LAUNCHER" />
16+
</intent-filter>
17+
</activity>
18+
</application>
19+
20+
</manifest>
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package com.tutsplus.googlefitrecordingapi;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.NonNull;
5+
import android.support.annotation.Nullable;
6+
import android.support.v7.app.AppCompatActivity;
7+
import android.util.Log;
8+
import android.view.View;
9+
import android.widget.Button;
10+
11+
import com.google.android.gms.common.ConnectionResult;
12+
import com.google.android.gms.common.Scopes;
13+
import com.google.android.gms.common.api.GoogleApiClient;
14+
import com.google.android.gms.common.api.ResultCallback;
15+
import com.google.android.gms.common.api.Scope;
16+
import com.google.android.gms.common.api.Status;
17+
import com.google.android.gms.fitness.Fitness;
18+
import com.google.android.gms.fitness.FitnessStatusCodes;
19+
import com.google.android.gms.fitness.data.DataType;
20+
import com.google.android.gms.fitness.data.Field;
21+
import com.google.android.gms.fitness.data.Subscription;
22+
import com.google.android.gms.fitness.result.ListSubscriptionsResult;
23+
24+
public class MainActivity extends AppCompatActivity implements
25+
GoogleApiClient.ConnectionCallbacks,
26+
GoogleApiClient.OnConnectionFailedListener,
27+
View.OnClickListener {
28+
29+
private Button mCancelSubscriptionsBtn;
30+
private Button mShowSubscriptionsBtn;
31+
32+
private ResultCallback<Status> mSubscribeResultCallback;
33+
private ResultCallback<Status> mCancelSubscriptionResultCallback;
34+
private ResultCallback<ListSubscriptionsResult> mListSubscriptionsResultCallback;
35+
36+
private GoogleApiClient mGoogleApiClient;
37+
38+
@Override
39+
protected void onCreate(Bundle savedInstanceState) {
40+
super.onCreate(savedInstanceState);
41+
setContentView(R.layout.activity_main);
42+
43+
initViews();
44+
initCallbacks();
45+
46+
mGoogleApiClient = new GoogleApiClient.Builder(this)
47+
.addApi(Fitness.RECORDING_API)
48+
.addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
49+
.addConnectionCallbacks(this)
50+
.enableAutoManage(this, 0, this)
51+
.build();
52+
}
53+
54+
private void initViews() {
55+
mCancelSubscriptionsBtn = (Button) findViewById(R.id.btn_cancel_subscriptions);
56+
mShowSubscriptionsBtn = (Button) findViewById(R.id.btn_show_subscriptions);
57+
58+
mCancelSubscriptionsBtn.setOnClickListener(this);
59+
mShowSubscriptionsBtn.setOnClickListener(this);
60+
}
61+
62+
private void initCallbacks() {
63+
mSubscribeResultCallback = new ResultCallback<Status>() {
64+
@Override
65+
public void onResult(@NonNull Status status) {
66+
if (status.isSuccess()) {
67+
if (status.getStatusCode() == FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED) {
68+
Log.e( "RecordingAPI", "Already subscribed to the Recording API");
69+
} else {
70+
Log.e("RecordingAPI", "Subscribed to the Recording API");
71+
}
72+
}
73+
}
74+
};
75+
76+
mCancelSubscriptionResultCallback = new ResultCallback<Status>() {
77+
@Override
78+
public void onResult(@NonNull Status status) {
79+
if (status.isSuccess()) {
80+
Log.e( "RecordingAPI", "Canceled subscriptions!");
81+
} else {
82+
// Subscription not removed
83+
Log.e("RecordingAPI", "Failed to cancel subscriptions");
84+
}
85+
}
86+
};
87+
88+
mListSubscriptionsResultCallback = new ResultCallback<ListSubscriptionsResult>() {
89+
@Override
90+
public void onResult(@NonNull ListSubscriptionsResult listSubscriptionsResult) {
91+
for (Subscription subscription : listSubscriptionsResult.getSubscriptions()) {
92+
DataType dataType = subscription.getDataType();
93+
Log.e( "RecordingAPI", dataType.getName() );
94+
for (Field field : dataType.getFields() ) {
95+
Log.e( "RecordingAPI", field.toString() );
96+
}
97+
}
98+
}
99+
};
100+
}
101+
102+
private void cancelSubscriptions() {
103+
Fitness.RecordingApi.unsubscribe(mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA)
104+
.setResultCallback(mCancelSubscriptionResultCallback);
105+
}
106+
107+
private void showSubscriptions() {
108+
Fitness.RecordingApi.listSubscriptions(mGoogleApiClient)
109+
.setResultCallback(mListSubscriptionsResultCallback);
110+
}
111+
112+
@Override
113+
public void onConnected(@Nullable Bundle bundle) {
114+
Fitness.RecordingApi.subscribe(mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA)
115+
.setResultCallback(mSubscribeResultCallback);
116+
}
117+
118+
@Override
119+
public void onConnectionSuspended(int i) {
120+
Log.e("RecordingAPI", "onConnectionSuspended");
121+
}
122+
123+
@Override
124+
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
125+
Log.e("RecordingAPI", "onConnectionFailed");
126+
}
127+
128+
@Override
129+
public void onClick(View v) {
130+
switch(v.getId()) {
131+
case R.id.btn_cancel_subscriptions: {
132+
cancelSubscriptions();
133+
break;
134+
}
135+
case R.id.btn_show_subscriptions: {
136+
showSubscriptions();
137+
break;
138+
}
139+
}
140+
}
141+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="match_parent"
5+
android:orientation="vertical">
6+
7+
<Button
8+
android:id="@+id/btn_show_subscriptions"
9+
android:layout_width="match_parent"
10+
android:layout_height="wrap_content"
11+
android:text="Show Subscriptions"/>
12+
<Button
13+
android:id="@+id/btn_cancel_subscriptions"
14+
android:layout_width="match_parent"
15+
android:layout_height="wrap_content"
16+
android:text="Cancel Subscriptions"/>
17+
</LinearLayout>
Loading
Loading
Loading
Loading
Loading
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<resources>
2+
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
3+
(such as screen margins) for screens with more than 820dp of available width. This
4+
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
5+
<dimen name="activity_horizontal_margin">64dp</dimen>
6+
</resources>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<color name="colorPrimary">#3F51B5</color>
4+
<color name="colorPrimaryDark">#303F9F</color>
5+
<color name="colorAccent">#FF4081</color>
6+
</resources>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<resources>
2+
<!-- Default screen margins, per the Android Design guidelines. -->
3+
<dimen name="activity_horizontal_margin">16dp</dimen>
4+
<dimen name="activity_vertical_margin">16dp</dimen>
5+
</resources>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<resources>
2+
<string name="app_name">GoogleFitRecordingAPI</string>
3+
</resources>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<resources>
2+
3+
<!-- Base application theme. -->
4+
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
5+
<!-- Customize your theme here. -->
6+
<item name="colorPrimary">@color/colorPrimary</item>
7+
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
8+
<item name="colorAccent">@color/colorAccent</item>
9+
</style>
10+
11+
</resources>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.tutsplus.googlefitrecordingapi;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.*;
6+
7+
/**
8+
* To work on unit tests, switch the Test Artifact in the Build Variants view.
9+
*/
10+
public class ExampleUnitTest {
11+
@Test
12+
public void addition_isCorrect() throws Exception {
13+
assertEquals(4, 2 + 2);
14+
}
15+
}

GoogleFitRecordingAPI/build.gradle

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Top-level build file where you can add configuration options common to all sub-projects/modules.
2+
3+
buildscript {
4+
repositories {
5+
jcenter()
6+
}
7+
dependencies {
8+
classpath 'com.android.tools.build:gradle:2.0.0-alpha6'
9+
10+
// NOTE: Do not place your application dependencies here; they belong
11+
// in the individual module build.gradle files
12+
}
13+
}
14+
15+
allprojects {
16+
repositories {
17+
jcenter()
18+
}
19+
}
20+
21+
task clean(type: Delete) {
22+
delete rootProject.buildDir
23+
}

0 commit comments

Comments
 (0)