Skip to content

Commit 85d40a5

Browse files
evantk91evangreer91Brad Umbaugh“AkshayAyyanchira
authored
Merge master into embedded (#623)
* sets custom sound at notification channel * updates notification channel builder to set sound * minor edits * sets sound at notification channel * minor edits * sets up channel id and channel name for each unique sound * adds conditionals for default channel creation * investigating edge cases * debugging * adds default sounds for edge cases * adds default channel id and channel name for edge cases * minor edits * minor edits * cleans up conditionals * adds import for IterableNotificationTest * reorganizes and checks resources folder for matching sound file * minor edits * minor edits * minor edits * updates channel names to sound names * resolves null pointer exception for soundName * removes unneccessary package from build.gradle * README updates * [MOB-5532] - Adding remote notification sound Also removing some checks which seem removable. Still WIP * ChannelId was getting set to null when no sound * Remove all other channels which are not active Remove all the other channels which are not actively showing notification on the notification tray. Warning: Have to check if it only removes the notification created by iterable package? or the entire app's other channels as well. We might have to add iterable_ or some kind of identifier to delete only Iterable ones. * Checkstyle fix * adds resource check for existing local sound and updates soundName checks * adds soundId and soundUrl checks for channel id and channel name * passes soundId down to getSoundUri * Revert "passes soundId down to getSoundUri" This reverts commit 0d2e825. * adds null check to getSoundUri * checkstyle fix * puts sound uri check in createNotificationChannel * reorganizes to do the Uri logic in getSoundUri * checkstyle fixes * addresses comments * reverts back to not deleting inactive channels * Update iterableapi/src/main/java/com/iterable/iterableapi/IterableNotificationHelper.java Co-authored-by: Akshay Ayyanchira <[email protected]> * addresses code climate fixes * [MOB-5664] - Revert channel name implementation Revert the code where the channel name was derived by reading value from Android Manifest. If not value is found, a default name "iterable channel" is provided. Now, with custom sound, if a soundURI exists from a provided custom sound, only then soundName is treated as a channel name. Otherwise, old way of handling the name still persists. * [MOB - 5694] - Add try catch around animation Adding try catch around show and hide webview animation * Log warn instead of error checkSDKInitialization logs error message. Log warning message instead * Add firetv/ott support to getmessages call * For firetv call update user with device details upon initialization * Set DEVICE_NOTIFICATIONS_ENABLED key only when registering for push * Fix firetv object structure * Review fixes * [MOB - 5873] - Public getters for Email UserID and Auth _email, _userID and _authToken to accessible by developers. :) * [MOB - 5874] - Schedule auth refresh when auth null Schedule a 10 second auto refresh for auth handler if auth token is found null when initializing. Also, when authHandler receives a authToken from handler in its handler, a similar null check will schedule 10 second refresh throwing a onTokenRegistrationFailure. This callback should allow them to refresh authToken. * create issue in jira when github issue opened * update secret names * add private constructor to prevent instance creation * update unit test * Added import for DeviceInfoUtils * Merge pull request #474 from Iterable/jay/MOB-4666-in-apps-config-memory [MOB-4666] in apps config memory * CI fix Attempt to fix this error * What went wrong: Execution failed for task ':app:processDebugAndroidTestManifest'. > Could not resolve all files for configuration ':app:debugAndroidTestRuntimeClasspath'. > Could not download kappuccino-1.2.1.aar (br.com.concretesolutions:kappuccino:1.2.1) > Could not get resource 'https://jcenter.bintray.com/br/com/concretesolutions/kappuccino/1.2.1/kappuccino-1.2.1.aar'. > Could not GET 'https://jcenter.bintray.com/br/com/concretesolutions/kappuccino/1.2.1/kappuccino-1.2.1.aar'. > Connection reset * [MOB-6055] - [OMNI CG] - Add callbacks to setting email/user id (#570) * Change for supporting callback feature on setEmail/setUserId * fixed failuire callback * add tests for setEmail and setUserId callbacks * changed to iterablehelper callbacks * update test with iterablehelper callbacks * Update IterableApi.java * Retaining the previous method signatures --------- Co-authored-by: Hardik Mashru <[email protected]> Co-authored-by: “Akshay <“[email protected]”> * [MOB 5730] Add callbacks to reading/removing in-app messages (#557) (#583) * [MOB 5730] Add callbacks to reading/removing in-app messages (#557) * add callback for setRead/removeMessage * modify test for setRead and added test for removeMessage * fixes * Update build.gradle * removed resultcallbackhandler * Update IterableInAppManager.java * fixes --------- Co-authored-by: Akshay Ayyanchira <[email protected]> Co-authored-by: Hardik Mashru <[email protected]> * Fixing and adding test method --------- Co-authored-by: devcsomnicg <[email protected]> Co-authored-by: Hardik Mashru <[email protected]> Co-authored-by: “Akshay <“[email protected]”> * [MOB - 6493] - Message read and remove bug fix (#592) Co-authored-by: “Akshay <“[email protected]”> * MOB-5132: Fix deep link issue after app is opened from notification (#546) (#593) Co-authored-by: devcsomnicg <[email protected]> * [MOB-6309] prepares EUDC updates for release (#572) * stashed changes * adds data center to config and associated unit tests * adds excluding kotlin files to javadoc check * moves IterableDataRegion to IterableConstants.java * gets rid of extra lines * removes jacoco.exe * adds endpoint override to IterableApi * removes logging statement * sets up base url at IterableRequestTask * minor edits * refactors to pull endpoint directly from config value * removes unfinished unit test * removes jacoco.exec * removes white space --------- Co-authored-by: [email protected] <[email protected]> * removes extra dependency (#609) Co-authored-by: [email protected] <[email protected]> * MOB-5132 (#613) * MOB-5132: Fix deep link issue after app is opened from notification * Fix deep link for buttons It fixes the issue of deep link on buttons --------- Co-authored-by: Akshay Ayyanchira <[email protected]> * Ensure IterableTrampolineActivity always launched (#553) (#618) - Ensure IterableTrampolineActivity always launched to handle all notifications - Reverts back to launchMode="singleInstance" to ensure that the activity is always launched - Use excludeFromRecents="true" to ensure that the activity is not shown in the recent apps list Co-authored-by: Tim Nortman <[email protected]> --------- Co-authored-by: evangreer <[email protected]> Co-authored-by: Brad Umbaugh <[email protected]> Co-authored-by: “Akshay <“[email protected]”> Co-authored-by: Akshay Ayyanchira <[email protected]> Co-authored-by: amanforindia <[email protected]> Co-authored-by: Ilya Brin <[email protected]> Co-authored-by: Hardik Mashru <[email protected]> Co-authored-by: Ilya Brin <[email protected]> Co-authored-by: devcsomnicg <[email protected]> Co-authored-by: Hardik Mashru <[email protected]> Co-authored-by: [email protected] <[email protected]> Co-authored-by: Tim Nortman <[email protected]>
1 parent 7a9a853 commit 85d40a5

23 files changed

+583
-108
lines changed

.github/workflows/jira.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
on:
2+
issues:
3+
types: [opened]
4+
5+
name: Create Jira Issue
6+
7+
jobs:
8+
build:
9+
runs-on: ubuntu-latest
10+
name: Create Jira Issue
11+
steps:
12+
- name: Login
13+
uses: atlassian/gajira-login@v3
14+
env:
15+
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
16+
JIRA_USER_EMAIL: ${{ secrets.JIRA_ILYA_USER_EMAIL }}
17+
JIRA_API_TOKEN: ${{ secrets.JIRA_ILYA_API_TOKEN }}
18+
19+
- name: Create
20+
id: create
21+
uses: atlassian/gajira-create@v3
22+
with:
23+
project: MOB
24+
issuetype: Bug
25+
summary: "${{ github.repository }}: #${{ github.event.issue.number }} by ${{ github.event.issue.user.login }}: ${{ github.event.issue.title }}"
26+
description: ${{ github.event.issue.body }}
27+
fields: '{"customfield_11268": {"id": "10668"} }'

README.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,29 +45,30 @@ For sample code, take a look at:
4545

4646
Release notes:
4747

48-
- [Android SDK Release Notes](https://support.iterable.com/hc/articles/360027543332) (major releases)
49-
- [Releases page](https://github.com/Iterable/iterable-android-sdk/releases) on GitHub (minor releases)
48+
- [Release Notes - Iterable's Android SDK](https://support.iterable.com/hc/articles/360027543332) -
49+
Release notes for significant updates to the SDK. Also, information about
50+
deprecation dates and support windows.
51+
- [GitHub — Releases](https://github.com/Iterable/iterable-android-sdk/releases) -
52+
This repository's **Releases** page. Release notes for all versions of the SDK.
5053

5154
Support policies:
5255

53-
- Iterable's [Mobile SDK Support Policy](https://support.iterable.com/hc/articles/360046136171)
54-
- Iterable's [Android SDK Deprecation and End-of-Life Schedule](https://support.iterable.com/hc/articles/360027543332#deprecation-and-end-of-life-schedule)
55-
- Iterable's [Beta Mobile SDK Disclaimer](https://support.iterable.com/hc/articles/360034753412)
56+
- Iterable's [SDK Support Policy](https://support.iterable.com/hc/articles/360046136171)
57+
- Iterable's [Beta SDK Disclaimer](https://support.iterable.com/hc/articles/360034753412)
5658

5759
Troubleshooting:
5860

5961
- [Testing and Troubleshooting Iterable's Mobile SDKs](https://support.iterable.com/hc/articles/360035392251)
6062
- [Frequently Asked Questions](https://support.iterable.com/hc/articles/360035624191)
6163
for mobile developers integrating with Iterable
6264

63-
Please contact your customer success manager with any questions.
65+
Questions? Contact your Iterable customer success manager.
6466

6567
## License
6668

67-
This SDK is released under the MIT License. See [LICENSE](https://github.com/Iterable/iterable-android-sdk/blob/master/LICENSE?raw=true)
68-
for more information.
69+
This SDK is released under the MIT License. For more information, read [LICENSE](LICENSE.md).
6970

7071
## Want to contribute?
7172

7273
This library is open source, and we will look at issue reports and pull requests.
73-
See [CONTRIBUTING](CONTRIBUTING.md) for more information.
74+
For more information, read [CONTRIBUTING](CONTRIBUTING.md).

app/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ apply plugin: 'kotlin-android'
33
apply plugin: 'kotlin-android-extensions'
44
apply plugin: 'jacoco'
55

6+
repositories {
7+
mavenCentral()
8+
}
9+
610
android {
711
compileSdkVersion 29
812
buildToolsVersion '29.0.3'

iterableapi-ui/src/main/java/com/iterable/iterableapi/ui/inbox/IterableInboxFragment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public void onInboxUpdated() {
244244

245245
@Override
246246
public void onListItemTapped(@NonNull IterableInAppMessage message) {
247-
IterableApi.getInstance().getInAppManager().setRead(message, true);
247+
IterableApi.getInstance().getInAppManager().setRead(message, true, null, null);
248248

249249
if (inboxMode == InboxMode.ACTIVITY) {
250250
startActivity(new Intent(getContext(), IterableInboxMessageActivity.class).putExtra(IterableInboxMessageActivity.ARG_MESSAGE_ID, message.getMessageId()));

iterableapi/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ dependencies {
5252
testImplementation 'org.khronos:opengl-api:gl1.1-android-2.1_r1'
5353
testImplementation 'com.squareup.okhttp3:mockwebserver:4.2.2'
5454
testImplementation 'org.skyscreamer:jsonassert:1.5.0'
55-
testImplementation project(path: ':iterableapi')
55+
5656
androidTestImplementation 'androidx.test:runner:1.3.0'
5757
androidTestImplementation 'androidx.test:rules:1.3.0'
5858
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

iterableapi/src/main/AndroidManifest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
<activity
2626
android:name=".IterableTrampolineActivity"
2727
android:exported="false"
28-
android:launchMode="singleTop"
28+
android:launchMode="singleInstance"
29+
android:excludeFromRecents="true"
2930
android:theme="@style/TrampolineActivity.Transparent"/>
3031
</application>
3132

iterableapi/src/main/java/com/iterable/iterableapi/IterableActivityMonitor.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
import android.app.Activity;
44
import android.app.Application;
55
import android.content.Context;
6-
import android.os.Build;
76
import android.os.Bundle;
87
import android.os.Handler;
98
import android.os.Looper;
109
import androidx.annotation.NonNull;
1110
import androidx.annotation.Nullable;
1211

12+
import com.iterable.iterableapi.util.DeviceInfoUtils;
13+
1314
import java.lang.ref.WeakReference;
1415
import java.util.ArrayList;
1516
import java.util.Iterator;
@@ -57,10 +58,8 @@ public void onActivityStarted(Activity activity) {
5758
@Override
5859
public void onActivityResumed(Activity activity) {
5960
currentActivity = new WeakReference<>(activity);
60-
String amazonFireTvHardware = "amazon.hardware.fire_tv";
61-
String amazonModel = Build.MODEL;
6261

63-
if (!inForeground || amazonModel.matches("AFTN") || activity.getPackageManager().hasSystemFeature(amazonFireTvHardware)) {
62+
if (!inForeground || DeviceInfoUtils.isFireTV(activity.getPackageManager())) {
6463
inForeground = true;
6564
for (WeakReference<AppStateCallback> callback : callbacks) {
6665
if (callback.get() != null) {

iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java

Lines changed: 94 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import androidx.annotation.RestrictTo;
1212
import androidx.annotation.VisibleForTesting;
1313

14+
import com.iterable.iterableapi.util.DeviceInfoUtils;
15+
1416
import org.json.JSONException;
1517
import org.json.JSONObject;
1618

@@ -38,6 +40,8 @@ public class IterableApi {
3840
private IterableNotificationData _notificationData;
3941
private String _deviceId;
4042
private boolean _firstForegroundHandled;
43+
private IterableHelper.SuccessHandler _setUserSuccessCallbackHandler;
44+
private IterableHelper.FailureHandler _setUserFailureCallbackHandler;
4145

4246
IterableApiClient apiClient = new IterableApiClient(new IterableApiAuthProvider());
4347
private @Nullable IterableInAppManager inAppManager;
@@ -69,15 +73,15 @@ public void execute(@Nullable String data) {
6973
});
7074
}
7175

72-
String getEmail() {
76+
public String getEmail() {
7377
return _email;
7478
}
7579

76-
String getUserId() {
80+
public String getUserId() {
7781
return _userId;
7882
}
7983

80-
String getAuthToken() {
84+
public String getAuthToken() {
8185
return _authToken;
8286
}
8387

@@ -315,6 +319,8 @@ private void completeUserLogin() {
315319

316320
if (config.autoPushRegistration) {
317321
registerForPush();
322+
} else if (_setUserSuccessCallbackHandler != null) {
323+
_setUserSuccessCallbackHandler.onSuccess(new JSONObject()); // passing blank json object here as onSuccess is @Nonnull
318324
}
319325

320326
getInAppManager().syncInApp();
@@ -347,7 +353,7 @@ private boolean isInitialized() {
347353

348354
private boolean checkSDKInitialization() {
349355
if (!isInitialized()) {
350-
IterableLogger.e(TAG, "Iterable SDK must be initialized with an API key and user email/userId before calling SDK methods");
356+
IterableLogger.w(TAG, "Iterable SDK must be initialized with an API key and user email/userId before calling SDK methods");
351357
return false;
352358
}
353359
return true;
@@ -386,8 +392,13 @@ private void retrieveEmailAndUserId() {
386392
_email = prefs.getString(IterableConstants.SHARED_PREFS_EMAIL_KEY, null);
387393
_userId = prefs.getString(IterableConstants.SHARED_PREFS_USERID_KEY, null);
388394
_authToken = prefs.getString(IterableConstants.SHARED_PREFS_AUTH_TOKEN_KEY, null);
389-
if (_authToken != null) {
390-
getAuthManager().queueExpirationRefresh(_authToken);
395+
if (config.authHandler != null) {
396+
if (_authToken != null) {
397+
getAuthManager().queueExpirationRefresh(_authToken);
398+
} else {
399+
IterableLogger.d(TAG, "Auth token found as null. Scheduling token refresh in 10 seconds...");
400+
getAuthManager().scheduleAuthTokenRefresh(10000);
401+
}
391402
}
392403
} catch (Exception e) {
393404
IterableLogger.e(TAG, "Error while retrieving email/userId/authToken", e);
@@ -503,7 +514,7 @@ protected void registerDeviceToken(@Nullable String email, @Nullable String user
503514
IterableLogger.e(TAG, "registerDeviceToken: applicationName is null, check that pushIntegrationName is set in IterableConfig");
504515
}
505516

506-
apiClient.registerDeviceToken(email, userId, authToken, applicationName, deviceToken, dataFields, deviceAttributes);
517+
apiClient.registerDeviceToken(email, userId, authToken, applicationName, deviceToken, dataFields, deviceAttributes, _setUserSuccessCallbackHandler, _setUserFailureCallbackHandler);
507518
}
508519
//endregion
509520

@@ -533,8 +544,11 @@ public static void initialize(@NonNull Context context, @NonNull String apiKey,
533544
IterableActivityMonitor.getInstance().addCallback(sharedInstance.activityMonitorListener);
534545

535546
if (sharedInstance.inAppManager == null) {
536-
sharedInstance.inAppManager = new IterableInAppManager(sharedInstance, sharedInstance.config.inAppHandler,
537-
sharedInstance.config.inAppDisplayInterval);
547+
sharedInstance.inAppManager = new IterableInAppManager(
548+
sharedInstance,
549+
sharedInstance.config.inAppHandler,
550+
sharedInstance.config.inAppDisplayInterval,
551+
sharedInstance.config.useInMemoryStorageForInApps);
538552
}
539553

540554
if (sharedInstance.embeddedManager == null) {
@@ -543,6 +557,17 @@ public static void initialize(@NonNull Context context, @NonNull String apiKey,
543557

544558
loadLastSavedConfiguration(context);
545559
IterablePushNotificationUtil.processPendingAction(context);
560+
if (DeviceInfoUtils.isFireTV(context.getPackageManager())) {
561+
try {
562+
JSONObject dataFields = new JSONObject();
563+
JSONObject deviceDetails = new JSONObject();
564+
DeviceInfoUtils.populateDeviceDetails(deviceDetails, context, sharedInstance.getDeviceId());
565+
dataFields.put(IterableConstants.KEY_FIRETV, deviceDetails);
566+
sharedInstance.apiClient.updateUser(dataFields, false);
567+
} catch (JSONException e) {
568+
IterableLogger.e(TAG, "initialize: exception", e);
569+
}
570+
}
546571
}
547572

548573
public static void setContext(Context context) {
@@ -612,10 +637,18 @@ public IterableAttributionInfo getAttributionInfo() {
612637
}
613638

614639
public void setEmail(@Nullable String email) {
615-
setEmail(email, null);
640+
setEmail(email, null, null, null);
641+
}
642+
643+
public void setEmail(@Nullable String email, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
644+
setEmail(email, null, successHandler, failureHandler);
616645
}
617646

618647
public void setEmail(@Nullable String email, @Nullable String authToken) {
648+
setEmail(email, authToken, null, null);
649+
}
650+
651+
public void setEmail(@Nullable String email, @Nullable String authToken, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
619652
//Only if passed in same non-null email
620653
if (_email != null && _email.equals(email)) {
621654
checkAndUpdateAuthToken(authToken);
@@ -630,16 +663,26 @@ public void setEmail(@Nullable String email, @Nullable String authToken) {
630663

631664
_email = email;
632665
_userId = null;
666+
_setUserSuccessCallbackHandler = successHandler;
667+
_setUserFailureCallbackHandler = failureHandler;
633668
storeAuthData();
634669

635670
onLogin(authToken);
636671
}
637672

638673
public void setUserId(@Nullable String userId) {
639-
setUserId(userId, null);
674+
setUserId(userId, null, null, null);
675+
}
676+
677+
public void setUserId(@Nullable String userId, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
678+
setUserId(userId, null, successHandler, failureHandler);
640679
}
641680

642681
public void setUserId(@Nullable String userId, @Nullable String authToken) {
682+
setUserId(userId, authToken, null, null);
683+
}
684+
685+
public void setUserId(@Nullable String userId, @Nullable String authToken, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
643686
//If same non null userId is passed
644687
if (_userId != null && _userId.equals(userId)) {
645688
checkAndUpdateAuthToken(authToken);
@@ -654,6 +697,8 @@ public void setUserId(@Nullable String userId, @Nullable String authToken) {
654697

655698
_email = null;
656699
_userId = userId;
700+
_setUserSuccessCallbackHandler = successHandler;
701+
_setUserFailureCallbackHandler = failureHandler;
657702
storeAuthData();
658703

659704
onLogin(authToken);
@@ -740,7 +785,26 @@ public void inAppConsume(@NonNull String messageId) {
740785
IterableLogger.e(TAG, "inAppConsume: message is null");
741786
return;
742787
}
743-
inAppConsume(message, null, null);
788+
inAppConsume(message, null, null, null, null);
789+
IterableLogger.printInfo();
790+
}
791+
792+
/**
793+
* Consumes an InApp message.
794+
* @param messageId
795+
* @param successHandler The callback which returns `success`.
796+
* @param failureHandler The callback which returns `failure`.
797+
*/
798+
public void inAppConsume(@NonNull String messageId, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
799+
IterableInAppMessage message = getInAppManager().getMessageById(messageId);
800+
if (message == null) {
801+
IterableLogger.e(TAG, "inAppConsume: message is null");
802+
if (failureHandler != null) {
803+
failureHandler.onFailure("inAppConsume: message is null", null);
804+
}
805+
return;
806+
}
807+
inAppConsume(message, null, null, successHandler, failureHandler);
744808
IterableLogger.printInfo();
745809
}
746810

@@ -757,8 +821,25 @@ public void inAppConsume(@NonNull IterableInAppMessage message, @Nullable Iterab
757821
if (!checkSDKInitialization()) {
758822
return;
759823
}
824+
apiClient.inAppConsume(message, source, clickLocation, inboxSessionId, null, null);
825+
}
760826

761-
apiClient.inAppConsume(message, source, clickLocation, inboxSessionId);
827+
/**
828+
* Tracks InApp delete.
829+
* This method from informs Iterable about inApp messages deleted with additional paramters.
830+
* Call this method from places where inApp deletion are invoked by user. The messages can be swiped to delete or can be deleted using the link to delete button.
831+
*
832+
* @param message message object
833+
* @param source An enum describing how the in App delete was triggered
834+
* @param clickLocation The module in which the action happened
835+
* @param successHandler The callback which returns `success`.
836+
* @param failureHandler The callback which returns `failure`.
837+
*/
838+
public void inAppConsume(@NonNull IterableInAppMessage message, @Nullable IterableInAppDeleteActionType source, @Nullable IterableInAppLocation clickLocation, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
839+
if (!checkSDKInitialization()) {
840+
return;
841+
}
842+
apiClient.inAppConsume(message, source, clickLocation, inboxSessionId, successHandler, failureHandler);
762843
}
763844

764845
/**

0 commit comments

Comments
 (0)