Skip to content

Commit 0db0ff8

Browse files
committed
Add support for History (un)registerDataUpdateListener.
1 parent c37a935 commit 0db0ff8

14 files changed

+309
-34
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66
.DS_Store
77
/build
88
/captures
9+
.idea

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Version 1.3.0
4+
5+
* Updated to Play Services 9.2.0.
6+
* Updated RxJava.
7+
* Added support for History API `un/registerDataUpdateListener()`.
8+
39
## Version 1.2.1
410

511
* BREAKING CHANGE: RxFit.OnExceptionResumeNext now exposes a static `.with()` method, which returns a Single or Observable Transformer.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ A basic sample app is available in the `sample` project. You need to create an O
5353
The lib is available on jCenter. Add the following to your `build.gradle`:
5454

5555
dependencies {
56-
compile 'com.patloew.rxfit:rxfit:1.2.1'
56+
compile 'com.patloew.rxfit:rxfit:1.3.0'
5757
}
5858

5959
# Credits

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
jcenter()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:2.0.0'
8+
classpath 'com.android.tools.build:gradle:2.1.2'
99

1010
classpath 'me.tatarka:gradle-retrolambda:3.3.0-beta4'
1111
classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'

gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# The setting is particularly useful for tweaking memory settings.
1212
# Default value: -Xmx10248m -XX:MaxPermSize=256m
1313
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14+
org.gradle.jvmargs=-Xmx2048m
1415

1516
# When configured, Gradle will run in incubating parallel mode.
1617
# This option should only be used with decoupled projects. More details, visit

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-2.12-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-all.zip

library/build.gradle

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@ apply plugin: 'com.jfrog.bintray'
33
apply plugin: 'com.github.dcendents.android-maven'
44

55
group = 'com.patloew.rxfit'
6-
version = '1.2.1'
6+
version = '1.3.0'
77
project.archivesBaseName = 'rxfit'
88

99
android {
10-
compileSdkVersion 23
11-
buildToolsVersion "23.0.2"
10+
compileSdkVersion 24
11+
buildToolsVersion "24.0.0"
1212

1313
defaultConfig {
1414
minSdkVersion 9
15-
targetSdkVersion 23
16-
versionCode 5
17-
versionName "1.2.1"
15+
targetSdkVersion 24
16+
versionCode 6
17+
versionName "1.3.0"
1818
}
1919
buildTypes {
2020
release {
@@ -29,8 +29,8 @@ android {
2929

3030
dependencies {
3131
compile fileTree(dir: 'libs', include: ['*.jar'])
32-
compile 'io.reactivex:rxjava:1.1.3'
33-
compile 'com.google.android.gms:play-services-fitness:8.4.0'
32+
compile 'io.reactivex:rxjava:1.1.6'
33+
compile 'com.google.android.gms:play-services-fitness:9.2.0'
3434

3535
testCompile 'junit:junit:4.12'
3636
testCompile 'org.mockito:mockito-core:1.10.19'

library/src/main/java/com/patloew/rxfit/BaseObservable.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import com.google.android.gms.common.api.GoogleApiClient;
1212
import com.google.android.gms.common.api.Scope;
1313

14-
import java.util.HashMap;
1514
import java.util.Map;
15+
import java.util.concurrent.ConcurrentHashMap;
1616
import java.util.concurrent.TimeUnit;
1717

1818
import rx.Observable;
@@ -42,7 +42,7 @@
4242
public abstract class BaseObservable<T> extends BaseRx<T> implements Observable.OnSubscribe<T> {
4343
private final boolean handleResolution;
4444

45-
private final HashMap<GoogleApiClient, Subscriber<? super T>> subscriptionInfoHashMap = new HashMap<>();
45+
private final Map<GoogleApiClient, Subscriber<? super T>> subscriptionInfoMap = new ConcurrentHashMap<>();
4646

4747
protected BaseObservable(@NonNull RxFit rxFit, Long timeout, TimeUnit timeUnit) {
4848
super(rxFit, timeout, timeUnit);
@@ -57,7 +57,7 @@ protected BaseObservable(@NonNull Context ctx, @NonNull Api<? extends Api.ApiOpt
5757
@Override
5858
public final void call(Subscriber<? super T> subscriber) {
5959
final GoogleApiClient apiClient = createApiClient(new ApiClientConnectionCallbacks(subscriber));
60-
subscriptionInfoHashMap.put(apiClient, subscriber);
60+
subscriptionInfoMap.put(apiClient, subscriber);
6161

6262
try {
6363
apiClient.connect();
@@ -73,15 +73,15 @@ public void call() {
7373
apiClient.disconnect();
7474
}
7575

76-
subscriptionInfoHashMap.remove(apiClient);
76+
subscriptionInfoMap.remove(apiClient);
7777
}
7878
}));
7979
}
8080

8181
protected abstract void onGoogleApiClientReady(GoogleApiClient apiClient, Subscriber<? super T> subscriber);
8282

8383
protected final void handleResolutionResult(int resultCode, ConnectionResult connectionResult) {
84-
for (Map.Entry<GoogleApiClient, Subscriber<? super T>> entry : subscriptionInfoHashMap.entrySet()) {
84+
for (Map.Entry<GoogleApiClient, Subscriber<? super T>> entry : subscriptionInfoMap.entrySet()) {
8585
if (!entry.getValue().isUnsubscribed()) {
8686
if (resultCode == Activity.RESULT_OK) {
8787
try {

library/src/main/java/com/patloew/rxfit/BaseSingle.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import com.google.android.gms.common.api.GoogleApiClient;
1212
import com.google.android.gms.common.api.Scope;
1313

14-
import java.util.HashMap;
1514
import java.util.Map;
15+
import java.util.concurrent.ConcurrentHashMap;
1616
import java.util.concurrent.TimeUnit;
1717

1818
import rx.Single;
@@ -42,7 +42,7 @@
4242
public abstract class BaseSingle<T> extends BaseRx<T> implements Single.OnSubscribe<T> {
4343
private final boolean handleResolution;
4444

45-
private final HashMap<GoogleApiClient, SingleSubscriber<? super T>> subscriptionInfoHashMap = new HashMap<>();
45+
private final Map<GoogleApiClient, SingleSubscriber<? super T>> subscriptionInfoMap = new ConcurrentHashMap<>();
4646

4747
protected BaseSingle(@NonNull RxFit rxFit, Long timeout, TimeUnit timeUnit) {
4848
super(rxFit, timeout, timeUnit);
@@ -57,7 +57,7 @@ protected BaseSingle(@NonNull Context ctx, @NonNull Api<? extends Api.ApiOptions
5757
@Override
5858
public final void call(SingleSubscriber<? super T> subscriber) {
5959
final GoogleApiClient apiClient = createApiClient(new ApiClientConnectionCallbacks(subscriber));
60-
subscriptionInfoHashMap.put(apiClient, subscriber);
60+
subscriptionInfoMap.put(apiClient, subscriber);
6161

6262
try {
6363
apiClient.connect();
@@ -73,15 +73,15 @@ public void call() {
7373
apiClient.disconnect();
7474
}
7575

76-
subscriptionInfoHashMap.remove(apiClient);
76+
subscriptionInfoMap.remove(apiClient);
7777
}
7878
}));
7979
}
8080

8181
protected abstract void onGoogleApiClientReady(GoogleApiClient apiClient, SingleSubscriber<? super T> subscriber);
8282

8383
protected final void handleResolutionResult(int resultCode, ConnectionResult connectionResult) {
84-
for (Map.Entry<GoogleApiClient, SingleSubscriber<? super T>> entry : subscriptionInfoHashMap.entrySet()) {
84+
for (Map.Entry<GoogleApiClient, SingleSubscriber<? super T>> entry : subscriptionInfoMap.entrySet()) {
8585
if (!entry.getValue().isUnsubscribed()) {
8686
if (resultCode == Activity.RESULT_OK) {
8787
try {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.patloew.rxfit;
2+
3+
import android.app.PendingIntent;
4+
5+
import com.google.android.gms.common.api.GoogleApiClient;
6+
import com.google.android.gms.common.api.ResultCallback;
7+
import com.google.android.gms.common.api.Status;
8+
import com.google.android.gms.fitness.Fitness;
9+
import com.google.android.gms.fitness.data.DataSource;
10+
import com.google.android.gms.fitness.data.DataType;
11+
import com.google.android.gms.fitness.request.DataUpdateListenerRegistrationRequest;
12+
13+
import java.util.concurrent.TimeUnit;
14+
15+
import rx.SingleSubscriber;
16+
17+
/* Copyright 2016 Patrick Löwenstein
18+
*
19+
* Licensed under the Apache License, Version 2.0 (the "License");
20+
* you may not use this file except in compliance with the License.
21+
* You may obtain a copy of the License at
22+
*
23+
* http://www.apache.org/licenses/LICENSE-2.0
24+
*
25+
* Unless required by applicable law or agreed to in writing, software
26+
* distributed under the License is distributed on an "AS IS" BASIS,
27+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28+
* See the License for the specific language governing permissions and
29+
* limitations under the License. */
30+
public class HistoryRegisterDataUpdateListenerSingle extends BaseSingle<Status> {
31+
32+
private final DataUpdateListenerRegistrationRequest request;
33+
34+
HistoryRegisterDataUpdateListenerSingle(RxFit rxFit, PendingIntent pendingIntent, DataSource dataSource, DataType dataType, Long timeout, TimeUnit timeUnit) {
35+
super(rxFit, timeout, timeUnit);
36+
37+
DataUpdateListenerRegistrationRequest.Builder builder = new DataUpdateListenerRegistrationRequest.Builder();
38+
builder.setPendingIntent(pendingIntent);
39+
if(dataSource != null) { builder.setDataSource(dataSource); }
40+
if(dataType != null) { builder.setDataType(dataType); }
41+
42+
request = builder.build();
43+
}
44+
45+
@Override
46+
protected void onGoogleApiClientReady(GoogleApiClient apiClient, final SingleSubscriber<? super Status> subscriber) {
47+
ResultCallback<Status> resultCallback = new StatusResultCallBack(subscriber);
48+
49+
setupFitnessPendingResult(Fitness.HistoryApi.registerDataUpdateListener(apiClient, request), resultCallback);
50+
}
51+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.patloew.rxfit;
2+
3+
import android.app.PendingIntent;
4+
5+
import com.google.android.gms.common.api.GoogleApiClient;
6+
import com.google.android.gms.common.api.ResultCallback;
7+
import com.google.android.gms.common.api.Status;
8+
import com.google.android.gms.fitness.Fitness;
9+
import com.google.android.gms.fitness.request.DataUpdateListenerRegistrationRequest;
10+
import com.google.android.gms.fitness.request.DataUpdateListenerUnregistrationRequest;
11+
12+
import java.util.concurrent.TimeUnit;
13+
14+
import rx.SingleSubscriber;
15+
16+
/* Copyright 2016 Patrick Löwenstein
17+
*
18+
* Licensed under the Apache License, Version 2.0 (the "License");
19+
* you may not use this file except in compliance with the License.
20+
* You may obtain a copy of the License at
21+
*
22+
* http://www.apache.org/licenses/LICENSE-2.0
23+
*
24+
* Unless required by applicable law or agreed to in writing, software
25+
* distributed under the License is distributed on an "AS IS" BASIS,
26+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
27+
* See the License for the specific language governing permissions and
28+
* limitations under the License. */
29+
public class HistoryUnregisterDataUpdateListenerSingle extends BaseSingle<Status> {
30+
31+
private final PendingIntent pendingIntent;
32+
33+
HistoryUnregisterDataUpdateListenerSingle(RxFit rxFit, PendingIntent pendingIntent, Long timeout, TimeUnit timeUnit) {
34+
super(rxFit, timeout, timeUnit);
35+
this.pendingIntent = pendingIntent;
36+
}
37+
38+
@Override
39+
protected void onGoogleApiClientReady(GoogleApiClient apiClient, final SingleSubscriber<? super Status> subscriber) {
40+
ResultCallback<Status> resultCallback = new StatusResultCallBack(subscriber);
41+
42+
setupFitnessPendingResult(Fitness.HistoryApi.unregisterDataUpdateListener(apiClient, pendingIntent), resultCallback);
43+
}
44+
}

library/src/main/java/com/patloew/rxfit/RxFit.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.android.gms.fitness.request.DataReadRequest;
2020
import com.google.android.gms.fitness.request.DataSourcesRequest;
2121
import com.google.android.gms.fitness.request.DataTypeCreateRequest;
22+
import com.google.android.gms.fitness.request.DataUpdateListenerRegistrationRequest;
2223
import com.google.android.gms.fitness.request.DataUpdateRequest;
2324
import com.google.android.gms.fitness.request.SensorRequest;
2425
import com.google.android.gms.fitness.request.SessionInsertRequest;
@@ -393,6 +394,50 @@ private static Single<Status> updateInternal(DataUpdateRequest dataUpdateRequest
393394
return Single.create(new HistoryUpdateDataSingle(RxFit.get(), dataUpdateRequest, timeout, timeUnit));
394395
}
395396

397+
// register data update listener
398+
399+
public static Single<Status> registerDataUpdateListener(@NonNull PendingIntent pendingIntent, @NonNull DataSource dataSource) {
400+
return registerDataUpdateListenerInternal(pendingIntent, dataSource, null, null, null);
401+
}
402+
403+
public static Single<Status> registerDataUpdateListener(@NonNull PendingIntent pendingIntent, @NonNull DataSource dataSource, long timeout, @NonNull TimeUnit timeUnit) {
404+
return registerDataUpdateListenerInternal(pendingIntent, dataSource, null, timeout, timeUnit);
405+
}
406+
407+
public static Single<Status> registerDataUpdateListener(@NonNull PendingIntent pendingIntent, @NonNull DataType dataType) {
408+
return registerDataUpdateListenerInternal(pendingIntent, null, dataType, null, null);
409+
}
410+
411+
public static Single<Status> registerDataUpdateListener(@NonNull PendingIntent pendingIntent, @NonNull DataType dataType, long timeout, @NonNull TimeUnit timeUnit) {
412+
return registerDataUpdateListenerInternal(pendingIntent, null, dataType, timeout, timeUnit);
413+
}
414+
415+
public static Single<Status> registerDataUpdateListener(@NonNull PendingIntent pendingIntent, @NonNull DataSource dataSource, @NonNull DataType dataType) {
416+
return registerDataUpdateListenerInternal(pendingIntent, dataSource, dataType, null, null);
417+
}
418+
419+
public static Single<Status> registerDataUpdateListener(@NonNull PendingIntent pendingIntent, @NonNull DataSource dataSource, @NonNull DataType dataType, long timeout, @NonNull TimeUnit timeUnit) {
420+
return registerDataUpdateListenerInternal(pendingIntent, dataSource, dataType, timeout, timeUnit);
421+
}
422+
423+
private static Single<Status> registerDataUpdateListenerInternal(PendingIntent pendingIntent, DataSource dataSource, DataType dataType, Long timeout, TimeUnit timeUnit) {
424+
return Single.create(new HistoryRegisterDataUpdateListenerSingle(RxFit.get(), pendingIntent, dataSource, dataType, timeout, timeUnit));
425+
}
426+
427+
// unregister data update listener
428+
429+
public static Single<Status> unregisterDataUpdateListener(@NonNull PendingIntent pendingIntent) {
430+
return unregisterDataUpdateListenerInternal(pendingIntent, null, null);
431+
}
432+
433+
public static Single<Status> unregisterDataUpdateListener(@NonNull PendingIntent pendingIntent, long timeout, @NonNull TimeUnit timeUnit) {
434+
return unregisterDataUpdateListenerInternal(pendingIntent, timeout, timeUnit);
435+
}
436+
437+
private static Single<Status> unregisterDataUpdateListenerInternal(PendingIntent pendingIntent, Long timeout, TimeUnit timeUnit) {
438+
return Single.create(new HistoryUnregisterDataUpdateListenerSingle(RxFit.get(), pendingIntent, timeout, timeUnit));
439+
}
440+
396441
}
397442

398443

0 commit comments

Comments
 (0)