Skip to content

Commit

Permalink
feat(crashlytics): add new APIs checkForUnsentReports, `deleteUnsen…
Browse files Browse the repository at this point in the history
…tReports`,`didCrashOnPreviousExecution`,`sendUnsentReports` (#4009)

Adds the following additional Crashlytics APIs:

- checkForUnsentReports()
- deleteUnsentReports()
- didCrashOnPreviousExecution()
- sendUnsentReports()

[publish]

Co-authored-by: Mike Hardy <[email protected]>
Co-authored-by: Mike Diarmid <[email protected]>
  • Loading branch information
3 people authored Aug 3, 2020
1 parent 07895be commit 52eeed3
Show file tree
Hide file tree
Showing 8 changed files with 3,883 additions and 3,828 deletions.
7,517 changes: 3,699 additions & 3,818 deletions docs/typedoc.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion docs/typedoc.min.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
* limitations under the License.
*
*/

import android.os.Handler;

import com.google.firebase.crashlytics.FirebaseCrashlytics;
Expand All @@ -35,6 +35,23 @@ public class ReactNativeFirebaseCrashlyticsModule extends ReactNativeFirebaseMod
super(reactContext, TAG);
}

@ReactMethod
public void checkForUnsentReports(Promise promise){
FirebaseCrashlytics.getInstance().checkForUnsentReports().addOnCompleteListener(task -> {
if(task.isSuccessful()) {
if(task.getResult() != null){
promise.resolve(task.getResult());
} else {
rejectPromiseWithCodeAndMessage(promise, "unknown","Unknown result of check for unsent reports");
}

} else {
String message = task.getException() != null ? task.getException().getMessage() : "checkForUnsentReports() request error";
rejectPromiseWithCodeAndMessage(promise, "unknown", message);
}
});
}

@ReactMethod
public void crash() {
if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) {
Expand All @@ -48,6 +65,16 @@ public void run() {
}
}

@ReactMethod
public void deleteUnsentReports() {
FirebaseCrashlytics.getInstance().deleteUnsentReports();
}

@ReactMethod
public void didCrashOnPreviousExecution(Promise promise) {
promise.resolve(FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution());
}

@ReactMethod
public void log(String message) {
if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) {
Expand Down Expand Up @@ -88,6 +115,11 @@ public void setAttributes(ReadableMap keyValuesMap, Promise promise) {
promise.resolve(null);
}

@ReactMethod
public void sendUnsentReports() {
FirebaseCrashlytics.getInstance().sendUnsentReports();
}


@ReactMethod
public void setUserId(String userId, Promise promise) {
Expand Down
38 changes: 38 additions & 0 deletions packages/crashlytics/e2e/crashlytics.e2e.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,44 @@ describe('crashlytics()', () => {
});
});

describe('sendUnsentReports()', () => {
it("sends unsent reports to the crashlytic's server", () => {
firebase.crashlytics().sendUnsentReports();
});
});

describe('checkForUnsentReports()', () => {
it('errors if automatic crash report collection is enabled', async () => {
await firebase.crashlytics().setCrashlyticsCollectionEnabled(true);
try {
await firebase.crashlytics().checkForUnsentReports();
return Promise.reject('Error did not throw');
} catch (e) {
e.message.should.containEql("has been set to 'true', all reports are automatically sent");
}
});
it("checks device cache for unsent crashlytic's reports", async () => {
await firebase.crashlytics().setCrashlyticsCollectionEnabled(false);
const anyUnsentReports = await firebase.crashlytics().checkForUnsentReports();

should(anyUnsentReports).equal(false);
});
});

describe('deleteUnsentReports()', () => {
it('deletes unsent crashlytics reports', async () => {
await firebase.crashlytics().deleteUnsentReports();
});
});

describe('didCrashOnPreviousExecution()', () => {
it('checks if app crached on previous execution', async () => {
const didCrash = await firebase.crashlytics().didCrashOnPreviousExecution();

should(didCrash).equal(false);
});
});

describe('setCrashlyticsCollectionEnabled()', () => {
it('true', async () => {
await firebase.crashlytics().setCrashlyticsCollectionEnabled(true);
Expand Down
25 changes: 25 additions & 0 deletions packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.m
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,33 @@ + (BOOL)requiresMainQueueSetup {
#pragma mark -
#pragma mark Firebase Crashlytics Methods

RCT_EXPORT_METHOD(checkForUnsentReports:
(RCTPromiseResolveBlock) resolve
rejecter:
(RCTPromiseRejectBlock) reject) {
[[FIRCrashlytics crashlytics] checkForUnsentReportsWithCompletion:^(BOOL unsentReports){
resolve([NSNumber numberWithBool:unsentReports]);
}];
}

RCT_EXPORT_METHOD(crash) {
if ([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled]) {
assert(NO);
}
}

RCT_EXPORT_METHOD(deleteUnsentReports) {
[[FIRCrashlytics crashlytics] deleteUnsentReports];
}

RCT_EXPORT_METHOD(didCrashOnPreviousExecution:
(RCTPromiseResolveBlock) resolve
rejecter:
(RCTPromiseRejectBlock) reject) {
BOOL didCrash = [[FIRCrashlytics crashlytics] didCrashDuringPreviousExecution];
resolve([NSNumber numberWithBool:didCrash]);
}

RCT_EXPORT_METHOD(log:
(NSString *) message) {
[[FIRCrashlytics crashlytics] log:message];
Expand All @@ -63,6 +84,10 @@ + (BOOL)requiresMainQueueSetup {
resolve([NSNull null]);
}

RCT_EXPORT_METHOD(sendUnsentReports) {
[[FIRCrashlytics crashlytics] sendUnsentReports];
}

RCT_EXPORT_METHOD(setAttribute:
(NSString *) key
value:
Expand Down
56 changes: 56 additions & 0 deletions packages/crashlytics/lib/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,51 @@ export namespace FirebaseCrashlyticsTypes {
*
*/
isCrashlyticsCollectionEnabled: true;
/**
* Determines whether there are any unsent crash reports cached on the device. The callback only executes
* if automatic data collection is disabled.
*
* #### Example
*
* ```js
* async checkReports() {
* // returns boolean value
* const unsentReports = await firebase.crashlytics().checkForUnsentReports();
* }
*
* checkReports();
* ```
*
*/
checkForUnsentReports(): Promise<boolean>;
/**
* Deletes any unsent reports on the device. This method only applies if automatic data collection is
* disabled.
*
* #### Example
*
* ```js
* firebase.crashlytics().deleteUnsentReports();
* ```
*
*/
deleteUnsentReports(): Promise<void>;
/**
* Returns a boolean value indicating whether the app crashed during the previous execution.
*
* #### Example
*
* ```js
* async didCrashPreviously() {
* // returns boolean value
* const didCrash = await firebase.crashlytics().didCrashOnPreviousExecution();
* }
*
* didCrashPreviously();
* ```
*
*/
didCrashOnPreviousExecution(): Promise<boolean>;

/**
* Cause your app to crash for testing purposes. This is a native crash and will not contain a javascript stack trace.
Expand Down Expand Up @@ -123,6 +168,17 @@ export namespace FirebaseCrashlyticsTypes {
* @param error Expects an instance of Error; e.g. classes that extend Error will also be supported.
*/
recordError(error: Error): void;
/**
* Enqueues any unsent reports on the device to upload to Crashlytics. This method only applies if
* automatic data collection is disabled.
*
* #### Example
*
* ```js
* firebase.crashlytics().sendUnsentReports();
* ```
*/
sendUnsentReports(): void;

/**
* Specify a user identifier which will be visible in the Firebase Crashlytics console.
Expand Down
23 changes: 23 additions & 0 deletions packages/crashlytics/lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,27 @@ class FirebaseCrashlyticsModule extends FirebaseModule {
return this._isCrashlyticsCollectionEnabled;
}

checkForUnsentReports() {
if (this.isCrashlyticsCollectionEnabled) {
throw new Error(
"firebase.crashlytics().setCrashlyticsCollectionEnabled(*) has been set to 'true', all reports are automatically sent.",
);
}
return this.native.checkForUnsentReports();
}

crash() {
this.native.crash();
}

async deleteUnsentReports() {
await this.native.deleteUnsentReports();
}

didCrashOnPreviousExecution() {
return this.native.didCrashOnPreviousExecution();
}

log(message) {
this.native.log(`${message}`);
}
Expand Down Expand Up @@ -104,6 +121,12 @@ class FirebaseCrashlyticsModule extends FirebaseModule {
}
}

sendUnsentReports() {
if (this.isCrashlyticsCollectionEnabled) {
this.native.sendUnsentReports();
}
}

setCrashlyticsCollectionEnabled(enabled) {
if (!isBoolean(enabled)) {
throw new Error(
Expand Down
16 changes: 8 additions & 8 deletions tests/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@ PODS:
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- ReactCommon/callinvoker (= 0.62.2)
- RNFBAdMob (7.3.2):
- RNFBAdMob (7.3.3):
- Firebase/AdMob (= 6.28.1)
- PersonalizedAdConsent (~> 1.0.4)
- React
Expand Down Expand Up @@ -549,7 +549,7 @@ PODS:
- Firebase/InAppMessaging (= 6.28.1)
- React
- RNFBApp
- RNFBMessaging (7.4.2):
- RNFBMessaging (7.5.0):
- Firebase/Analytics (= 6.28.1)
- Firebase/Messaging (= 6.28.1)
- React
Expand All @@ -569,11 +569,11 @@ PODS:
- Firebase/MLVisionTextModel (= 6.28.1)
- React
- RNFBApp
- RNFBPerf (7.2.2):
- RNFBPerf (7.2.3):
- Firebase/Performance (= 6.28.1)
- React
- RNFBApp
- RNFBRemoteConfig (7.2.2):
- RNFBRemoteConfig (8.0.0):
- Firebase/Analytics (= 6.28.1)
- Firebase/RemoteConfig (= 6.28.1)
- React
Expand Down Expand Up @@ -837,7 +837,7 @@ SPEC CHECKSUMS:
React-RCTText: fae545b10cfdb3d247c36c56f61a94cfd6dba41d
React-RCTVibration: 4356114dbcba4ce66991096e51a66e61eda51256
ReactCommon: ed4e11d27609d571e7eee8b65548efc191116eb3
RNFBAdMob: 2a4ce34f33b184b305e84d5596a96bb3abff419f
RNFBAdMob: d04fe1a087a7bed659e871aced36b7d6ed76d166
RNFBAnalytics: b60cf02f43ff3547cb1a642be7a8786524109c38
RNFBApp: ce217f932091295ed048451326817a29fb4cb48f
RNFBAuth: 732feaeae0604a3df9c2351a0d2b52cfadd34148
Expand All @@ -848,11 +848,11 @@ SPEC CHECKSUMS:
RNFBFunctions: 325b8be36afad5a424d43b8f39e379eaee0b86be
RNFBIid: bb061f08b96880eb5fd599c06a92cfe2c164a5e7
RNFBInAppMessaging: bb5ac95b411f46755ffbc425566822afc0bff78f
RNFBMessaging: 6bdab64e89a79afb36f58d75807166e574c489e8
RNFBMessaging: e06217e17539a3328e5f06ca34a83010a73af384
RNFBMLNaturalLanguage: 901aa0ecffbaeca9a26cc38d6dda3a6a2f2dd8ec
RNFBMLVision: 46a088cab0f986f3359d9340d416e998f0458379
RNFBPerf: 20a0ab92075834bb4c88537677b2fffcb023b04c
RNFBRemoteConfig: fb46148a3b985697f3538b8c4d3e586a14bb4570
RNFBPerf: 3d185f43c89d4159649c6a35813c337857a2e941
RNFBRemoteConfig: 96917b7defbb474ffc774f43454686de7df09a9b
RNFBStorage: ee1bafd9e83d30feaa4af266f2782f109284be9a
Yoga: 3ebccbdd559724312790e7742142d062476b698e

Expand Down

0 comments on commit 52eeed3

Please sign in to comment.