Skip to content

Commit c82bae7

Browse files
authored
Merge pull request #27 from FrangSierra/development
Fix issues and update dependencies
2 parents 8b6536c + 660154f commit c82bae7

File tree

8 files changed

+138
-30
lines changed

8 files changed

+138
-30
lines changed

app/build.gradle

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ buildscript {
22
ext {
33
rx_version = "2.1.0"
44
rx_android_version = "2.0.1"
5-
firebase_version = "10.2.6"
6-
support_version = "25.3.1"
5+
firebase_version = "11.2.0"
6+
support_version = "26.0.1"
77
}
88
}
99
apply plugin: 'com.android.library'
@@ -16,12 +16,12 @@ android {
1616
exclude 'META-INF/NOTICE'
1717
}
1818

19-
compileSdkVersion 25
20-
buildToolsVersion "25.0.2"
19+
compileSdkVersion 26
20+
buildToolsVersion "26.0.1"
2121

2222
defaultConfig {
23-
minSdkVersion 9
24-
targetSdkVersion 25
23+
minSdkVersion 14
24+
targetSdkVersion 26
2525
versionCode 4
2626
versionName "1.0"
2727
}

app/src/main/java/durdinapps/rxfirebase2/DataSnapshotMapper.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,7 @@ public TypedDataSnapshotMapper(final Class<U> clazz) {
5959

6060
@Override
6161
public U apply(final DataSnapshot dataSnapshot) {
62-
if (dataSnapshot.exists()) {
6362
return getDataSnapshotTypedValue(dataSnapshot, clazz);
64-
} else {
65-
return null;
66-
}
6763
}
6864
}
6965

@@ -121,16 +117,12 @@ public GenericTypedDataSnapshotMapper(GenericTypeIndicator<U> genericTypeIndicat
121117

122118
@Override
123119
public U apply(DataSnapshot dataSnapshot) {
124-
if (dataSnapshot.exists()) {
125120
U value = dataSnapshot.getValue(genericTypeIndicator);
126121
if (value == null) {
127122
throw Exceptions.propagate(new RxFirebaseDataCastException(
128123
"unable to cast firebase data response to generic type"));
129124
}
130125
return value;
131-
} else {
132-
return null;
133-
}
134126
}
135127
}
136128

app/src/main/java/durdinapps/rxfirebase2/RxFirebaseAuth.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,53 @@ public void subscribe(MaybeEmitter<String> emitter) throws Exception {
287287
}
288288
});
289289
}
290+
291+
/**
292+
* Registers a listener to changes in the ID token state.
293+
* There can be more than one listener registered at the same time. The listeners are called asynchronously, possibly on a different thread.
294+
*
295+
* Authentication state changes are:
296+
*
297+
* -When a user signs in
298+
* -When the current user signs out
299+
* -When the current user changes
300+
* -When there is a change in the current user's token
301+
*
302+
* Use RemoveIdTokenListener to unregister a listener.
303+
*
304+
* @param firebaseAuth firebaseAuth instance.
305+
* @param idTokenListener given token listener.
306+
* @return a {@link Completable} which emits when the action is completed.
307+
*/
308+
@NonNull
309+
public static Completable addIdTokenListener(@NonNull final FirebaseAuth firebaseAuth,
310+
@NonNull final FirebaseAuth.IdTokenListener idTokenListener) {
311+
return Completable.create(new CompletableOnSubscribe() {
312+
@Override
313+
public void subscribe(CompletableEmitter emitter) throws Exception {
314+
firebaseAuth.addIdTokenListener(idTokenListener);
315+
emitter.onComplete();
316+
}
317+
});
318+
}
319+
320+
/**
321+
* Unregisters a listener of ID token changes.
322+
* Listener must previously been added with AddIdTokenListener.
323+
*
324+
* @param firebaseAuth firebaseAuth instance.
325+
* @param idTokenListener given token listener.
326+
* @return a {@link Completable} which emits when the action is completed.
327+
*/
328+
@NonNull
329+
public static Completable removeIdTokenListener(@NonNull final FirebaseAuth firebaseAuth,
330+
@NonNull final FirebaseAuth.IdTokenListener idTokenListener) {
331+
return Completable.create(new CompletableOnSubscribe() {
332+
@Override
333+
public void subscribe(CompletableEmitter emitter) throws Exception {
334+
firebaseAuth.removeIdTokenListener(idTokenListener);
335+
emitter.onComplete();
336+
}
337+
});
338+
}
290339
}

app/src/main/java/durdinapps/rxfirebase2/RxFirebaseDatabase.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ public void subscribe(final FlowableEmitter<DataSnapshot> emitter) throws Except
5858
final ValueEventListener valueEventListener = new ValueEventListener() {
5959
@Override
6060
public void onDataChange(DataSnapshot dataSnapshot) {
61-
emitter.onNext(dataSnapshot);
61+
if (dataSnapshot.exists())
62+
emitter.onNext(dataSnapshot);
6263
}
6364

6465
@Override
@@ -81,7 +82,8 @@ public void cancel() throws Exception {
8182
* Listener for a single change in te data at the given query location.
8283
*
8384
* @param query reference represents a particular location in your Database and can be used for reading or writing data to that Database location.
84-
* @return a {@link Maybe} which emits the actual state of the database for the given query.
85+
* @return a {@link Maybe} which emits the actual state of the database for the given query. onSuccess will be only call when
86+
* the given {@link DataSnapshot} exists.
8587
*/
8688
@NonNull
8789
public static Single<DataSnapshot> observeSingleValueEvent(@NonNull final Query query) {
@@ -91,7 +93,9 @@ public void subscribe(final SingleEmitter<DataSnapshot> emitter) throws Exceptio
9193
query.addListenerForSingleValueEvent(new ValueEventListener() {
9294
@Override
9395
public void onDataChange(DataSnapshot dataSnapshot) {
94-
emitter.onSuccess(dataSnapshot);
96+
if (dataSnapshot.exists())
97+
emitter.onSuccess(dataSnapshot);
98+
emitter.onComplete();
9599
}
96100

97101
@Override
@@ -146,7 +150,7 @@ public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot data
146150
/**
147151
* Set the given value on the specified {@link DatabaseReference}.
148152
*
149-
* @param ref reference represents a particular location in your database.
153+
* @param ref reference represents a particular location in your database.
150154
* @param value value to update.
151155
* @return a {@link Completable} which is complete when the set value call finish successfully.
152156
*/

app/src/main/java/durdinapps/rxfirebase2/RxFirebaseUser.java

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.google.firebase.auth.AuthResult;
77
import com.google.firebase.auth.FirebaseUser;
88
import com.google.firebase.auth.GetTokenResult;
9+
import com.google.firebase.auth.PhoneAuthCredential;
910
import com.google.firebase.auth.UserProfileChangeRequest;
1011

1112
import io.reactivex.Completable;
@@ -25,12 +26,12 @@ public class RxFirebaseUser {
2526
* @return a {@link Maybe} which emits an {@link GetTokenResult} if success.
2627
*/
2728
@NonNull
28-
public static Maybe<GetTokenResult> getToken(@NonNull final FirebaseUser firebaseUser,
29-
final boolean forceRefresh) {
29+
public static Maybe<GetTokenResult> getIdToken(@NonNull final FirebaseUser firebaseUser,
30+
final boolean forceRefresh) {
3031
return Maybe.create(new MaybeOnSubscribe<GetTokenResult>() {
3132
@Override
3233
public void subscribe(MaybeEmitter<GetTokenResult> emitter) throws Exception {
33-
RxHandler.assignOnTask(emitter, firebaseUser.getToken(forceRefresh));
34+
RxHandler.assignOnTask(emitter, firebaseUser.getIdToken(forceRefresh));
3435
}
3536
});
3637
}
@@ -188,4 +189,39 @@ public static Maybe<AuthResult> unlink(@NonNull final FirebaseUser firebaseUser,
188189
}
189190
});
190191
}
192+
193+
/**
194+
* updates the current phone number for the given user.
195+
*
196+
* @param firebaseUser current firebaseUser instance.
197+
* @param phoneAuthCredential new phone credential.
198+
* @return a {@link Completable} if the task is complete successfully.
199+
*/
200+
@NonNull
201+
public static Completable updatePhoneNumber(@NonNull final FirebaseUser firebaseUser,
202+
@NonNull final PhoneAuthCredential phoneAuthCredential) {
203+
return Completable.create(new CompletableOnSubscribe() {
204+
@Override public void subscribe(CompletableEmitter emitter) throws Exception {
205+
RxCompletableHandler.assignOnTask(emitter, firebaseUser.updatePhoneNumber(phoneAuthCredential));
206+
}
207+
});
208+
}
209+
210+
/**
211+
* Reauthenticates the user with the given credential, and returns the profile data for that account.
212+
* This is useful for operations that require a recent sign-in, to prevent or resolve a {@link com.google.firebase.auth.FirebaseAuthRecentLoginRequiredException}
213+
*
214+
* @param firebaseUser current firebaseUser instance.
215+
* @param credential Authcredential used for reauthenticate.
216+
* @return a {@link Maybe} which emits an {@link AuthResult} if success.
217+
*/
218+
@NonNull
219+
public static Maybe<AuthResult> reauthenticateAndRetrieveData(@NonNull final FirebaseUser firebaseUser,
220+
@NonNull final AuthCredential credential) {
221+
return Maybe.create(new MaybeOnSubscribe<AuthResult>() {
222+
@Override public void subscribe(MaybeEmitter<AuthResult> emitter) throws Exception {
223+
RxHandler.assignOnTask(emitter, firebaseUser.reauthenticateAndRetrieveData(credential));
224+
}
225+
});
226+
}
191227
}

app/src/test/java/durdinapps/rxfirebase2/RxFirebaseDatabaseTest.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ public void setup() {
8181
when(dataSnapshot.getValue(ChildData.class)).thenReturn(childData);
8282
when(dataSnapshot.getKey()).thenReturn(ANY_KEY);
8383
when(dataSnapshot.getChildren()).thenReturn(Arrays.asList(dataSnapshot));
84+
85+
when(dataSnapshotTwo.exists()).thenReturn(true);
86+
when(dataSnapshotTwo.getValue(ChildData.class)).thenReturn(childData);
87+
when(dataSnapshotTwo.getKey()).thenReturn(ANY_KEY);
88+
when(dataSnapshotTwo.getChildren()).thenReturn(Arrays.asList(dataSnapshotTwo));
89+
8490
when(databaseReference.updateChildren(updatedData)).thenReturn(voidTask);
8591
}
8692

@@ -116,7 +122,7 @@ public void testObserveSingleNoData() throws InterruptedException {
116122
argument.getValue().onDataChange(mockFirebaseDataSnapshotNoData);
117123

118124
testObserver.assertValueCount(0)
119-
.assertNoErrors()
125+
.assertComplete()
120126
.dispose();
121127
}
122128

@@ -145,7 +151,7 @@ public void testObserveSingleValue_Disconnected() throws InterruptedException {
145151

146152
ArgumentCaptor<ValueEventListener> argument = ArgumentCaptor.forClass(ValueEventListener.class);
147153
verify(databaseReference).addListenerForSingleValueEvent(argument.capture());
148-
argument.getValue().onCancelled(DatabaseError.zzqv(DatabaseError.DISCONNECTED));
154+
argument.getValue().onCancelled(DatabaseError.zzfr(DatabaseError.DISCONNECTED));
149155

150156
testObserver.assertError(RxFirebaseDataException.class)
151157
.assertNotComplete()
@@ -161,7 +167,7 @@ public void testObserveSingleValueEventFailed() throws InterruptedException {
161167

162168
ArgumentCaptor<ValueEventListener> argument = ArgumentCaptor.forClass(ValueEventListener.class);
163169
verify(databaseReference).addListenerForSingleValueEvent(argument.capture());
164-
argument.getValue().onCancelled(DatabaseError.zzqv(DatabaseError.OPERATION_FAILED));
170+
argument.getValue().onCancelled(DatabaseError.zzfr(DatabaseError.OPERATION_FAILED));
165171

166172
testObserver.assertError(RxFirebaseDataException.class)
167173
.assertNotComplete()
@@ -345,7 +351,7 @@ public void testObserveChildEventCancelled() throws InterruptedException {
345351

346352
ArgumentCaptor<ChildEventListener> argument = ArgumentCaptor.forClass(ChildEventListener.class);
347353
verify(databaseReference).addChildEventListener(argument.capture());
348-
argument.getValue().onCancelled(DatabaseError.zzqv(DatabaseError.DISCONNECTED));
354+
argument.getValue().onCancelled(DatabaseError.zzfr(DatabaseError.DISCONNECTED));
349355

350356
testObserver.assertError(RxFirebaseDataException.class)
351357
.assertNotComplete()

app/src/test/java/durdinapps/rxfirebase2/RxFirebaseUserTest.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,23 +67,24 @@ public void setUp() throws Exception {
6767
setupTask(authResultTask);
6868
setupTask(authCredentialTask);
6969

70-
when(firebaseUser.getToken(ANY_FORCE_REFRESH_VALUE)).thenReturn(getTokenResultTask);
70+
when(firebaseUser.getIdToken(ANY_FORCE_REFRESH_VALUE)).thenReturn(getTokenResultTask);
7171
when(firebaseUser.updateEmail(ANY_EMAIL)).thenReturn(voidTask);
7272
when(firebaseUser.updatePassword(ANY_PASSWORD)).thenReturn(voidTask);
7373
when(firebaseUser.updateProfile(userProfileChangeRequest)).thenReturn(voidTask);
7474
when(firebaseUser.delete()).thenReturn(voidTask);
7575
when(firebaseUser.reauthenticate(authCredential)).thenReturn(voidTask);
76+
when(firebaseUser.reauthenticateAndRetrieveData(authCredential)).thenReturn(authResultTask);
7677
when(firebaseUser.linkWithCredential(authCredential)).thenReturn(authResultTask);
7778
}
7879

7980
@Test
8081
public void getToken() throws Exception {
81-
TestObserver<GetTokenResult> userTestObserver = RxFirebaseUser.getToken(firebaseUser, ANY_FORCE_REFRESH_VALUE).test();
82+
TestObserver<GetTokenResult> userTestObserver = RxFirebaseUser.getIdToken(firebaseUser, ANY_FORCE_REFRESH_VALUE).test();
8283

8384
testOnSuccessListener.getValue().onSuccess(getTokenResult);
8485
testOnCompleteListener.getValue().onComplete(getTokenResultTask);
8586

86-
verify(firebaseUser).getToken(ANY_FORCE_REFRESH_VALUE);
87+
verify(firebaseUser).getIdToken(ANY_FORCE_REFRESH_VALUE);
8788

8889
userTestObserver.assertComplete()
8990
.assertNoErrors()
@@ -93,9 +94,9 @@ public void getToken() throws Exception {
9394

9495
@Test
9596
public void getTokenError() throws Exception {
96-
TestObserver<GetTokenResult> userTestObserver = RxFirebaseUser.getToken(firebaseUser, ANY_FORCE_REFRESH_VALUE).test();
97+
TestObserver<GetTokenResult> userTestObserver = RxFirebaseUser.getIdToken(firebaseUser, ANY_FORCE_REFRESH_VALUE).test();
9798
testOnFailureListener.getValue().onFailure(EXCEPTION);
98-
verify(firebaseUser).getToken(ANY_FORCE_REFRESH_VALUE);
99+
verify(firebaseUser).getIdToken(ANY_FORCE_REFRESH_VALUE);
99100

100101
userTestObserver.assertError(EXCEPTION)
101102
.dispose();
@@ -218,6 +219,23 @@ public void reAuthenticate() throws Exception {
218219

219220
}
220221

222+
@Test
223+
public void reauthenticateAndRetrieveData() throws Exception {
224+
TestObserver<AuthResult> userTestObserver = RxFirebaseUser.reauthenticateAndRetrieveData(firebaseUser, authCredential).test();
225+
226+
testOnSuccessListener.getValue().onSuccess(authResult);
227+
testOnCompleteListener.getValue().onComplete(authResultTask);
228+
229+
verify(firebaseUser).reauthenticateAndRetrieveData(authCredential);
230+
231+
userTestObserver.assertNoErrors()
232+
.assertValueCount(1)
233+
.assertComplete()
234+
.assertValueSet(Collections.singletonList(authResult))
235+
.dispose();
236+
237+
}
238+
221239
@Test
222240
public void reAuthenticateError() throws Exception {
223241
TestObserver<Void> userTestObserver = RxFirebaseUser.reAuthenticate(firebaseUser, authCredential).test();

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ buildscript {
1515
allprojects {
1616
repositories {
1717
jcenter()
18+
maven {
19+
url "https://maven.google.com"
20+
}
1821
}
1922
}
2023

0 commit comments

Comments
 (0)